Прежде чем ценовые данные будут доступны в терминале MetaTrader 4, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 4. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
#property version"1.00"#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _m15OpenTime=0;
//--- Вести лог журналаconstbool inpFileLog=true;
//--- Количество секунд в одном днеconstint SEC_PER_DAY=86400;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Запускаем таймерif(!EventSetMillisecondTimer(20))
{
Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
return( INIT_FAILED );
}
//--- Сбрасываем время открытия текущего бара м15, часа, дня
_m15OpenTime = 0;
//---return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
return( rates_total );
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
//--- Проверяем, записано ли время открытия текущего бара М15if(!CheckCurrentM15OpenTime()) // Если время не записаноreturn; // Выходим // Выходим
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего бара М15 |//+------------------------------------------------------------------+bool CheckCurrentM15OpenTime()
{
//--- Проверяем, записано ли времяif(_m15OpenTime==0) // Если время не записано
{
//---ResetLastError();
iTime(NULL,PERIOD_M15,1);
//---if(GetLastError()==ERR_NO_ERROR)
{
ResetLastError();
//--- Запоминаем время открытия бара
_m15OpenTime=iTime(NULL,PERIOD_M15,0);
//---Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
//--- Возвращаем истинуreturn( true );
}
elsereturn( false );
}
//--- Время открытия М15 ранее записано. Возвращаем истинуreturn( true );
}
结果。
2018.09.2114:25:02.793 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: removed
2018.09.2114:30:44.120 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: loaded successfully
2018.09.2114:30:44.149 test_isNewDayInTimer_iTime() EURGBP.e,M1: initialized
2018.09.2114:30:44.262 test_isNewDayInTimer_iTime() EURGBP.e,M1: test_isNewDayInTimer_iTime().mq4: Актуальное время открытия бара М15 = 2018.09.2112:15. Ошибка #0
#property version"1.00"#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _m15OpenTime=0;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Запускаем таймерif(!EventSetMillisecondTimer(20))
{
Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
return( INIT_FAILED );
}
//--- Сбрасываем время открытия текущего бара м15
_m15OpenTime=0;
//---return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
return( rates_total );
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
//--- Проверяем, записано ли время открытия текущего бара М15if(!CheckCurrentM15OpenTime()) // Если время не записаноreturn; // Выходим
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего бара М15 |//+------------------------------------------------------------------+bool CheckCurrentM15OpenTime()
{
//--- Проверяем, записано ли времяif(_m15OpenTime==0) // Если время не записано
{
//---ResetLastError();
if(iBarShift(Symbol(),PERIOD_M15,TimeCurrent(),true)==-1)
{
Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
return( false );
}
//---if(GetLastError()==ERR_NO_ERROR)
{
ResetLastError();
//--- Запоминаем время открытия бара
_m15OpenTime=iTime(NULL,PERIOD_M15,0);
//---Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
//--- Возвращаем истинуreturn( true );
}
elsereturn( false );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+
结果。
2018.09.2114:48:46.485 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: removed
2018.09.2115:01:23.158 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: loaded successfully
2018.09.2115:01:23.175 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: initialized
2018.09.2115:01:23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.2112:45. Ошибка #0
if(iBarShift(Symbol(),PERIOD_M15,TimeLocal(),true)==-1)
{
Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
return( false );
}
再一次。它没有在任何地方这样说。这首先是。其次,为什么会出现先显示错误代码 4066,然后又不显示的误导?
数据被分批抽出,然后由终端处理,由于你是在定时器上工作,所以你被暂停了。我没有在任何地方看到它的明确规定,但许多编写MTF应用程序的程序员通常都知道它,而且我已经在第一时间告诉你了。
https://docs.mql4.com/ru/series/timeseries_access,彻底读懂它。
嗯,上面你已经给了我们一个检查历史可及性的变体。它不是完美的,但它是简单和明显的。
如果这个变体不工作,请按以下方法检查。
数据被分批抽出,然后由终端处理,由于你是在一个定时器上,你会被暂停。是的,它没有在任何地方明确提到,但许多编写MTF应用程序的程序员通常知道它,我马上就告诉你了。
https://docs.mql4.com/ru/series/timeseries_access,彻底读懂它。
嗯,上面你已经给了我们一个检查历史可及性的变体。它不是完美的,但它是简单和明显的。
关于进入 "停顿期",证据在哪里?
我仔细阅读了它(以前也读过)。我知道,数据(尤其是较早的TF)并不总是可以立即获得。没问题。但为什么后来SeriesInfoInteger()函数没有返回错误呢!?问题来了!
假设请求落在某个暂停/交换/更新/中断等,那么就让它返回错误代码!=0。而且不会有任何问题!
而在上面,你已经给出了检查故事可及性的选项。它不是完美的,但它是简单和直接的。
上面回答了@Ihor Herasko 关于这点的问题。
上面已经回答了@Ihor Herasko 关于这点的问题。
我给出了我的上述测试版本。为什么如此质疑开发商,但这一点已经知道了很久了!
我一定会尝试你的测试版本并报告结果。
我一定会尝试你的测试版本,并向你报告结果。
首先是@Ihor Herasko的 回复。播放的代码。
结果。
根据日志条目。该航站楼于14:25关闭。接下来,在14:30开启了。我们检查M15酒吧的时间。我们从TF M1开始。指标(上面的代码)显示实际开放时间为12:15(终端时间,比我的本地时间滞后2小时)。结果应该是12:30!结论--错误是存在的。而@Ihor Herasko 建议的这种方法并不奏效。
请务必报告情况!这对我来说很有效!但可能会有各种隐患,如果不成功,我们会想还能做什么。
我就不说了。代码。
结果。
下午2:48关闭了终端,下午3:01又打开了它。应该在下午1点得到时间。我得到了12:45。还有什么问题吗?
我把TF从M1改为M5,得到了正确的结果。
我想我已经得到了它!指示器是否立即与终端一起启动?如果是这样,在检查等待连接到服务器的IsConnected()之前,你有一个非常快的计时器,它没有时间去同步
或者这样做
但你必须考虑到服务器时间和当地时间的差异。请将结果回信!