Прежде чем ценовые данные будут доступны в терминале 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さんが 提案したこの方法はうまくいきません。
必ずご報告ください。私には効果あり!でも、うまくいかないといろいろな落とし穴があるかもしれない、他に何ができるかを考えよう。
サインオフします。コード
結果
14時48分に端末の電源を切り、15時1分に電源を入れ直しました。13:00の時間を取得 する必要がありました。12時45分になりました。他に質問はありますか?
TFをM1からM5に変更したところ、正しい結果が得られました。
やったぞ!端末ですぐにインジケーターが起動するか?もしそうなら、サーバーへの接続を待つチェックする前にIsConnected()は、それが同期する時間を持っていない非常に高速なタイマーを持っている!"と述べた。
または、こうする
ただし、サーバー時刻とローカル時刻の差を考慮する必要があります。結果を返信してください