datetime new_time=TimeCurrent()/period_seconds*period_seconds; // 현재 차트에서 막대 열기 시간
여기에 실수가 있습니다. 기간이 일주일 또는 한 달인 경우.
기간이 일주일인 경우 1970.01.01은 목요일이므로 주 시작일은 수요일입니다.
기간이 한 달이고 현재 달에 30일이 없는 경우에도 period_seconds가 30일에 해당하므로 잘못 계산됩니다.
여기에 실수가 있습니다. 기간이 일주일 또는 한 달인 경우.
기간이 일주일인 경우 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 함수를 추가하면 실행되지 않습니다. 온이니트 및 온카큘레이트 함수를 추가하면 내비게이터 창에 표시기가 표시되나요?
고마워요
인디케이터용 새 막대" 이벤트 핸들러:
OnCalculate()와 달리 인디케이터는 차트에 새 막대가 나타날 때만 계산됩니다.
Author: Konstantin Gruzdev