Как запустить этот код один раз в день в mql5?

У меня есть цикл с Print(). Эта строка должна быть напечатана только один раз в день. Есть код:

int Hour = 20;
int Minute = 20;

int OnInit()
{
Hour = timeTemp.hour;
Minute = timeTemp.min;

EventSetTimer(60);
}

void OnTimer()
{

MqlDateTime ActivationTime;
TimeToStruct(TimeCurrent(), ActivationTime);

if (ActivationTime.hour == hour && ActivationTime.min == minute)
{
Print("This code should be printed once per day");
}
}

void OnDeinit(const int reason)
{ 
}

Есть 2 вопроса:

1) Когда график получает много тиков, он выполняет более одной операции Print().

2) Когда происходит отключение или когда на текущем инструменте заканчивается торговая сессия, время в терминале останавливается, и этот цикл продолжается до тех пор, пока не произойдет тик, а время не замерзнет.

Так как мне запускать этот код один раз в день, даже если происходит отключение?

1 ответ

Есть несколько способов сделать это, я предпочитаю этот для "один раз в день" означает

string lastRunDate = null;
int Hour = 20;
int Minute = 20;

int OnInit()
{
  Hour = timeTemp.hour;
  Minute = timeTemp.min;

  EventSetTimer(60);
}

void OnTimer()
{

  MqlDateTime ActivationTime;
  TimeToStruct(TimeLocal(), ActivationTime);

  if (lastRunDate!=TimeToString(TimeCurrent(), TIME_DATE) && ActivationTime.hour == hour && ActivationTime.min == minute)
  {
    Print("This code should be printed once per day");
    // ... after your codes, `remember today` !
    lastRunDate = TimeToString(TimeCurrent(), TIME_DATE);
  }
}

void OnDeinit(const int reason) {
  EventKillTimer();
}
  • использование TimeLocal(), если вы знаете только время на вашем сервере, рассчитайте смещение времени на OnInit функция между TimeLocal а также TimeCurrent (если рынок не закрыт во время инициализации.*)

  • ты можешь использовать TimeGMT() если вы можете определить свои условия с временем по Гринвичу.

  • чтобы обнаружить закрытый рынок, вы можете проверить время последнего входящего тика. для валютных пар вы получаете много тиков в каждую минуту. поэтому, если последний тик старше одной минуты, рынок закрывается. чтобы проверить временные сбои в работе интернета, вы можете проверить время последнего тика с помощью более одной минуты триггера.

Другие вопросы по тегам