我有一个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)当断开连接发生或当前工具的交易时段结束时,终端中的时间冻结,并且此循环一直运行到结束才结束,直到时间变为冻结。
那么,即使发生断开连接,我如何每天运行一次此代码?
答案 0 :(得分: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()
。如果您只知道服务器上的时间,请计算OnInit
和TimeLocal
之间的TimeCurrent
函数的时间偏移量(如果在开始时间未关闭市场。)
如果可以使用格林尼治标准时间定义条件,则可以使用TimeGMT()
。
要检测关闭的市场,您可以检查最后一个传入的报价时间。对于外汇交易对,您每分钟都会收到许多滴答声。因此,如果最后一个刻度超过1分钟,则市场关闭。要检查互联网的临时中断,您可以检查触发时间超过一分钟的时间。