タイムフレーム切替時にVerticalLineの位置まで自動的に移動する
チャートを複数並べて表示させるのは、あまり好きではない。
チャートの時間足を切り替えると、どの場所が表示されるのかというのがたまに問題になる。
例えば、日足を見ている時に5分足に切り替えると、どこが表示されるか。
チャートの自動スクロールをオンにしている場合は、常に最新バーの位置(チャートを最大限右にスクロールした位置)が表示される。
自動スクロールがオフの場合は、切り替え前のチャートの最も左に表示されていたバーの時間が、切り替え後のチャートでも最も左に位置するように表示される(その結果右側に余白がある場合は、右に最大限スクロールされた位置になる)。
この挙動は、マルチタイムフレーム分析を行うにあたって不都合な場合がある。
下の図は、EURUSDの日足。
赤の縦線の位置を5分足に落として確認したい場合、自動スクロールをオフの状態で切り替えると、図の一番左のバーの位置からの5分足チャートが表示されるため、目的の場所はずっと右の方になってしまう。
自動スクロールがオフの状態で切り替えても、5分足の最新バーが表示されるので、目的の場所はずっと左の方になってしまう。
スクロールするのは非常に面倒くさい。
MQLには、チャート操作のための関数が用意されている。
チャート操作 – MQL5 リファレンス – MetaTrader 5 のためのアルゴリズムの/自動化されたトレーディング言語のリファレンス
これを用いて以下のようなインジケータが書ける。
#property copyright "nisai" #property link "https://nisaifx.com" #property version "1.00" #property indicator_chart_window string objectName=""; bool shiftDone=false; int OnInit(){ ChartSetInteger(0,CHART_AUTOSCROLL,false); long createTime=0; for(int i=0;i<ObjectsTotal(0,-1,-1);i++){ if(ObjectGetInteger(0,ObjectName(0,i),OBJPROP_TYPE)==OBJ_VLINE){ if(createTime<=ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CREATETIME)){ createTime=ObjectGetInteger(0,ObjectName(0,i),OBJPROP_CREATETIME); objectName=ObjectName(0,i); } } } shiftDone=false; return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]){ return(rates_total); } void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){ if(id==CHARTEVENT_CHART_CHANGE && !shiftDone){ if(objectName!=""){ int shift=-1*iBarShift(Symbol(),Period(),ObjectGetInteger(0,objectName,OBJPROP_TIME)); bool res=ChartNavigate(0,CHART_END,shift); shiftDone=res; } } }
このインジケータでは、先の図のように縦線を描画しておけば、タイムフレームを切り替えた際に、その縦線の位置まで自動的に移動するよう記述している。
下の図、EURUSDの日足チャートには上記のインジケータを適用済み。
2022.11.11 00:00に縦線を引いてある状態で、
5分足に切り替えると、
2022.11.11 00:00の縦線が画面内にある位置に移動する。
なお、複数の縦線が描画されている場合は、最も新しく描画された縦線の位置になる。
また、チャートの自動スクロールは邪魔になりそうなので勝手にオフにするようにしている。
チャートの読み込み時間の影響か、うまく移動してくれない場合があるかもしれないが、もう一度切り替えてもらえれば多分大丈夫。
一応上記インジケータを置いておくので、必要ならどうぞ。