如何在mql5中每天运行一次此代码?

问题描述 投票:0回答:1

我有一个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)
{ 
}

它有两个问题:

1)当图表获得大量刻度时,它会执行多个Print()。

2)当发生断开连接或当前仪器上的交易时段结束时,终端中的时间冻结并且该循环在没有结束的情况下运行直到它得到抽动并且时间变得不被解冻。

那么,即使发生断开连接,如何每天运行一次此代码呢?

metatrader4 mql5 metatrader5
1个回答
0
投票

有多种方法可以做到这一点,我更喜欢这个“每天一次”的意思

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()。如果您只知道服务器上的时间,请计算OnInitTimeLocal之间的TimeCurrent函数的时间偏移量(如果市场未在初始时关闭。*)
  • 如果您可以使用GMT时间定义条件,则可以使用TimeGMT()
  • 要检测封闭市场,您可以检查最后一个进入的滴答时间。对于外汇对,您每分钟都会收到许多刻度。所以,如果最后一个刻度超过一分钟,市场就会关闭。要检查临时的互联网中断,您可以通过超过一分钟的触发来检查最后的滴答时间。
© www.soinside.com 2019 - 2024. All rights reserved.