지표: 인디케이터용 새 막대" 이벤트 핸들러

 

인디케이터용 새 막대" 이벤트 핸들러:

OnCalculate()와 달리 인디케이터는 차트에 새 막대가 나타날 때만 계산됩니다.

Author: Konstantin Gruzdev

 
datetime new_time=TimeCurrent()/period_seconds*period_seconds; // 현재 차트에서 막대 열기 시간

여기에 실수가 있습니다. 기간이 일주일 또는 한 달인 경우.

기간이 일주일인 경우 1970.01.01은 목요일이므로 주 시작일은 수요일입니다.

기간이 한 달이고 현재 달에 30일이 없는 경우에도 period_seconds가 30일에 해당하므로 잘못 계산됩니다.

 
Maratori:

여기에 실수가 있습니다. 기간이 일주일 또는 한 달인 경우.

기간이 일주일인 경우 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/ko/articles/159 와 같이 OnTick을 대신 사용하고 OnInit 및 OnCaculate 함수를 제거하면 잘 실행되지만 표시기가 탐색기 창에 표시되지 않습니다. 그리고 OnInit 및 OnCaculate 함수를 추가하면 실행되지 않습니다. 온이니트 및 온카큘레이트 함수를 추가하면 내비게이터 창에 표시기가 표시되나요?

고마워요