インディケータ: インディケータのための「新規バー」イベント

 

インディケータのための「新規バー」イベント:

このインディケータを使用すると、チャート上の新しいバーが登場し他場合のみにインディケータのデータの計算を実行することができます。

作者: Konstantin Gruzdev

 
datetime new_time=TimeCurrent()/period_seconds*period_seconds; // 現在のチャートのバー開始時間

ここに間違いがある。期間が週か月か。

もし期間が週であれば、週の始まりは水曜日となり、1970.01.01は木曜日だからです。

期間が月であり、現在の月が30日でない場合、period_secondsが 30日に対応するため、これも間違ったカウントになります。

 
Maratori:

ここに間違いがある。もし、その期間が1週間や1カ月なら。

期間が週の場合、1970.01.01は木曜日なので、週の始まりは水曜日です。

期間が月であり、現在の月が30日でない場合、period_secondsが30日に対応するため、これも間違ったカウントになります。

同意する。OnNewBarCalculate.mqhでこれらの期間に対して使用できます:

//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数
//+------------------------------------------------------------------+
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[])
  {
//---
   // 新しいバーが表示されたら、NewBarイベントハンドラを実行する。
   if(current_chart.isNewBar()>0) 
      OnNewBarCalculate(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread);
   return(rates_total);
  }
 

少し他の目的もあるが、今のところこんな関数を使っている:

datetime getHTFTime(datetime time, ENUM_TIMEFRAMES highTimeFrame) {
  int periodSeconds = PeriodSeconds(highTimeFrame);
  if(periodSeconds <= 60*60*24) return datetime(time/periodSeconds*periodSeconds);
  
  MqlDateTime sTime;
  TimeToStruct(time, sTime);
  
  if(highTimeFrame == PERIOD_W1) {
    TimeToStruct(time - datetime(sTime.day_of_week * 24 * 60 * 60), sTime);
    sTime.hour = 0;
    sTime.min = 0;
    sTime.sec = 0;
  } else if(highTimeFrame == PERIOD_MN1) {
      sTime.day = 1;
      sTime.hour = 0;
      sTime.min = 0;
      sTime.sec = 0;
    }
  return StructToTime(sTime);
}

日時とタイムフレームが入力として与えられる。出力には、この時刻を含むタイムフレーム上のバーの開始時刻を得る。

コードを最適化する ための提案があれば、喜んで聞きます。

もちろん、この方法でもできます:

datetime timeOut[1];
CopyTime(_Symbol, highTimeFrame, timeIn, 1, timeOut);

しかしこの場合、同期の問題がありました。つまり、ヒストリーがロードされるのを待たなければならない。

 

カスタムインジケーターを ありがとうございました!助けてください!

この記事(https://www.mql5.com/ja/articles/159)のようにOnTickを代わりに使うと(OnInitとOnCaculate関数を削除すると)、うまく動作しますが、インジケータがナビゲータウィンドウに表示されません。また、OnInitとOnCaculate関数を追加しても実行されません。OnInit関数とOnCaculate関数を追加すると、インジケータはナビゲータウィンドウに表示されますか?

ありがとうございます。