WindowsのローカルタイムをMT5サーバーと同期させる - ページ 7 1234567891011121314...17 新しいコメント fxsaber 2017.01.20 17:05 #61 prostotrader:2017.01.13 10:00:03.979 Trades 'xxxxx': failed sell limit 1.00 ED-6.17 at 1.0813 [Market closed]ブローカーからの回答2017.01.13 09:59:58.100 * reject (Market closed) for '*' (sell limit 1.00 ED-6.17 at 1.0813)(1.0641 / 1.0814 / 1.0695)どうやら、ローカルログとエクスチェンジログに同じ時刻を表示させたいようです。ローカルだけでなく、サーバーの時刻もログに書き込むべき時代になってきたのです。その場合、同期は必要ありません。ただし、ローカルタイムではなく、サーバータイムをリミットとして送信しています。そして、サーバーの時間はもう、10時になったかのように。そのため、サーバーの時刻が取引所の時刻と同期していなかったのです。 Sergey Chalyshev 2017.01.20 17:07 #62 prostotrader:唯一、今日、10時過ぎに(同期は市場前)現地時刻とMarket Watchの時刻が7秒違っていた。:( 私のコードを試してみてください、同期後の自己流動化を追加しました。 prostotrader 2017.01.20 17:12 #63 Sergey Chalyshev: 新しい見積もりが来た、市場が変わった、これらは別の出来事です。アスクまたはビッドより高いまたは低いビッドが追加(削除)されると、OnBookEvent()イベントを受け取りますが、それは新しい気配値ではなく、ティック履歴にも残らないため、最終既知のサーバー時刻は変更されません。他にどう説明したらいいのかわからない、冗談でしょう?))ゲッ!そうだった!失敗した!引用元はベストではないかもしれないそれなら、SymbolInfoTick()を使うべきですね。セルゲイさん、ありがとうございます。追加MqlTick curr_tick; if(SymbolInfoTick(symbol, curr_tick)) //if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1) Sergey Chalyshev 2017.01.20 17:12 #64 fxsaber:どうやら、ローカルログとエクスチェンジログに同じ時刻を表示させたいようです。ローカルだけでなく、サーバーの時刻もログに書き込むべき時代になっているのです。その場合、同期は必要ありません。ただし、ローカルタイムではなく、サーバータイムをリミットとして送信しています。そして、サーバーの時間はもう、10時になったかのように。そのため、サーバーの時刻と取引所の時刻が同期していなかったのです。時間の同期は、[マーケットクローズ] からあなたを 救うことはできません、 取引所は、後で取引を開始し、取引時間に取引を停止することができます。ここでは、別のアプローチをとる必要があります。 prostotrader 2017.01.20 17:15 #65 fxsaber:どうやら、ローカルログとエクスチェンジログに同じ時刻を表示させたいようです。ローカルだけでなく、サーバーの時刻もログに書き込むべき時代になっているのです。その場合、同期は必要ありません。ただし、ローカルタイムではなく、サーバータイムをリミットとして送信しています。そして、サーバーの時間はもう、10時になったかのように。そのため、サーバーの時刻と取引所の時刻が同期していなかったのです。また、サーバーの時刻を知るにはどうしたらよいのでしょうか?私はこのようにサーバーの時間をチェックしています。//+------------------------------------------------------------------+//| Expert Check traiding time function |//+------------------------------------------------------------------+bool CheckTradingTime(MqlDateTime &tick_time){ datetime lk_time = TimeTradeServer(tick_time); if ( ( tick_time.day_of_week == int(FirstDay)) || ( tick_time.day_of_week == int(SecondDay)))//выходные { return(false); }#ifdef DEBUG if ((tick_time.hour >= 0) && (tick_time.hour < 6)) // DEBUG 6-00 { return(false); }#else if ((tick_time.hour >= 0) && (tick_time.hour < 10)) { return(false); }#endif// 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30// 14 * 3600 = 50400 - 14:00:00// 14 * 3600 + 30 = 50430 - 14:00:30// 14 * 3600 + 60 = 50460 - 14:01:00// 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30// 18 * 3600 + 45 * 60 = 67500 - 18:45:00// 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30// 18 * 3600 + 46 * 60 = 67560 - 18:46:00// 19 * 3600 = 68400 - 19:00:00// 19 * 3600 + 60 = 68460 - 19:01:00 // 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30// 23 * 3600 + 50 * 60 = 85800 - 23:50:00// 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30// 23 * 3600 + 51 * 60 = 85860 - 23:51:00//--- ulong trade_time = tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec; //--- //10:00:02 if(((trade_time >= time_st_mon) && (trade_time < 50370)) || ((trade_time >= time_st_day) && (trade_time < 67470)) || ((trade_time >= time_st_evn) && (trade_time < 85770))) { return(true); }return(false); }そして、TimeTradeServer()はローカルタイム、TimeCurrent()は "古い "時刻を持つ可能性があります :( Synchronise Windows local time Market closed マーケットクローズ Sergey Chalyshev 2017.01.20 17:32 #66 prostotrader:しかし、私とあなたのアプローチの違いは大きいです。私の場合、低流動性商品(例えばUUAH)のEAを使用すると、すべての先物メガネを追加してターミナル内の他のExpert Advisorの動作を気にすることなく、プレマーケットでティックを取得することが保証されています。すなわち、すべての新しい見積もりは、別のEAに「行く」ことになります。によって追加されました。同期だけを "扱う "ので、他の人の作業を邪魔することはありません。また、他のシンボルからのティックを別のEAに受信することができます。 これは、カスタムイベントを通じて行わなければなりません。 でも、少なくとも私は不要だと思います。 prostotrader 2017.01.20 17:41 #67 Sergey Chalyshev: また、別のEAで他の楽器からティックを受信することも可能ですが、これはカスタムイベントを通じて行う必要があります。 でも、少なくとも私は不要だと思います。そして、私のを試してみてください(リキッド化されていません)。毎日、取引前に同期化//+------------------------------------------------------------------+//| Time_sync_forts.mq5 |//| Copyright 2017 prostotrader |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2017 prostotrader"#property link "https://www.mql5.com"#property version "1.01"//---struct _SYSTEMTIME { ushort wYear; ushort wMonth; ushort wDayOfWeek; ushort wDay; ushort wHour; ushort wMinute; ushort wSecond; ushort wMilliseconds; };_SYSTEMTIME loc_time;#import "kernel32.dll"void GetLocalTime(_SYSTEMTIME &sys_time);bool SetLocalTime(_SYSTEMTIME &sys_time);#import//---bool is_sync;string symb_rts;string symb_si;string symb_gold;string symb_br;string symb_gazr;string symb_sbrf;//input string BrInstr = "BR-2.17"; //Brentinput ENUM_DAY_OF_WEEK FirstDay = SATURDAY; //Первый выходнойinput ENUM_DAY_OF_WEEK SecondDay = SUNDAY; //Второй выходной//+------------------------------------------------------------------+//| Expert set second symbol function |//+------------------------------------------------------------------+string SetSecSymbol(const string a_symbol,const string prefix) { int str_tire=0; ushort let_symbol; int str_size=StringLen(a_symbol); for(int i=0; i<str_size; i++) { let_symbol=StringGetCharacter(a_symbol,i); if(let_symbol=='-') { str_tire=i; break; } } if(str_tire>0) { return(prefix + StringSubstr(a_symbol, str_tire, str_size - str_tire)); } return(""); }//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { is_sync=false; MarketBookAdd(Symbol());//--- symb_rts=SetSecSymbol(Symbol(),"RTS"); if(!SymbolSelect(symb_rts,true)) { MessageBox(symb_rts+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR); return(INIT_FAILED); } else MarketBookAdd(symb_rts);//--- symb_si=SetSecSymbol(Symbol(),"Si"); if(!SymbolSelect(symb_si,true)) { MessageBox(symb_si+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR); return(INIT_FAILED); } else MarketBookAdd(symb_si);//--- symb_gold=SetSecSymbol(Symbol(),"GOLD"); if(!SymbolSelect(symb_gold,true)) { MessageBox(symb_gold+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR); return(INIT_FAILED); } else MarketBookAdd(symb_gold);//--- symb_gazr=SetSecSymbol(Symbol(),"GAZR"); if(!SymbolSelect(symb_gazr,true)) { MessageBox(symb_gazr+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR); return(INIT_FAILED); } else MarketBookAdd(symb_gazr);//--- symb_sbrf=SetSecSymbol(Symbol(),"SBRF"); if(!SymbolSelect(symb_sbrf,true)) { MessageBox(symb_sbrf+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR); return(INIT_FAILED); } else MarketBookAdd(symb_sbrf);//--- symb_br=BrInstr; if(!SymbolSelect(symb_br,true)) { MessageBox(symb_br+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR); return(INIT_FAILED); } else MarketBookAdd(symb_br); return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { MarketBookRelease(Symbol()); MarketBookRelease(symb_rts); MarketBookRelease(symb_br); MarketBookRelease(symb_si); MarketBookRelease(symb_gold); MarketBookRelease(symb_gazr); MarketBookRelease(symb_sbrf); }//+------------------------------------------------------------------+//| Expert Convert To Time function |//+------------------------------------------------------------------+bool ConvertToTime(const long n_value,_SYSTEMTIME &a_time) { a_time.wMilliseconds=ushort(n_value%1000); ulong new_time=ulong(double(n_value)/1000); MqlDateTime cur_time = {0}; TimeToStruct(datetime(new_time),cur_time); if(cur_time.year>0) { a_time.wDay=ushort(cur_time.day); a_time.wDayOfWeek=ushort(cur_time.day_of_week); a_time.wHour=ushort(cur_time.hour); a_time.wMinute= ushort(cur_time.min); a_time.wMonth = ushort(cur_time.mon); a_time.wSecond= ushort(cur_time.sec); a_time.wYear=ushort(cur_time.year); return(true); } return(false); } //+------------------------------------------------------------------+//| Expert On book event function |//+------------------------------------------------------------------+void OnBookEvent(const string &symbol) { loc_time.wYear=0; GetLocalTime(loc_time); if(loc_time.wYear>0) { if((int(loc_time.wDayOfWeek) == int(FirstDay)) || (int(loc_time.wDayOfWeek) == int(SecondDay))) return; if((loc_time.wHour==9) && (loc_time.wMinute>=50) && (loc_time.wMinute<=59)) { MqlTick curr_tick; if(SymbolInfoTick(symbol, curr_tick)) //if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1) { MqlDateTime sv_time; TimeToStruct(curr_tick.time,sv_time); if(!is_sync) { if((loc_time.wDayOfWeek==ushort(sv_time.day_of_week)) && (loc_time.wHour==ushort(sv_time.hour))) { long last_ping=long(NormalizeDouble((double(TerminalInfoInteger(TERMINAL_PING_LAST))/1000)/2,0)); long mls_time=long(curr_tick.time_msc%1000); if((mls_time+last_ping)>999) { mls_time=long(curr_tick.time_msc)+last_ping; if(!ConvertToTime(mls_time, loc_time)) return; } else { loc_time.wMinute = ushort(sv_time.min); loc_time.wSecond = ushort(sv_time.sec); loc_time.wMilliseconds=ushort(mls_time); } if(SetLocalTime(loc_time)) { is_sync=true; Print("Local time sync is done. Symbol = ", symbol, " Sync min = ", loc_time.wMinute, " Sync sec = ", loc_time.wSecond, " Sync ms = ", loc_time.wMilliseconds); } } } } } else is_sync=false; } }//+------------------------------------------------------------------+ Synchronise Windows local time マーケットクローズ new mql4 providing millisecond fxsaber 2017.01.20 18:12 #68 prostotrader:私のを試してみてください(排除されません) 同じコードでも、何倍も簡潔になります。 prostotrader 2017.01.20 18:17 #69 fxsaber: 同じコードでも、もっと何倍も簡潔なものになるはずです。もちろん、人それぞれ能力も性能も違いますから。あなたのを見ると、面白いですね。 prostotrader 2017.01.20 21:11 #70 このコードをデモで実行MqlTick cur_tick, ct_tick[]; if(SymbolInfoTick(symb_gold, cur_tick)) { int result = CopyTicks(symb_gold, ct_tick, COPY_TICKS_INFO, 0, 10); if(result>0) { Print("SymbolInfoTick symbiol = ", symb_gold, " time = ", cur_tick.time, ".", cur_tick.time_msc%1000); for(int i = result-1; i >=0; i--) { Print("CopyTicks symbol = ", symb_gold, " time ", string(i), " = ", ct_tick[i].time, ".", ct_tick[i].time_msc%1000); } } }と、ちょっと戸惑うような結果でした。2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) SymbolInfoTick symbiol = GOLD-3.17 time = 2017.01.20 22:14:48.02017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 9 = 2017.01.20 22:13:36.7742017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 8 = 2017.01.20 22:13:36.7742017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 7 = 2017.01.20 22:13:36.7742017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 6 = 2017.01.20 22:11:14.3952017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 5 = 2017.01.20 22:09:47.4522017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 4 = 2017.01.20 22:09:47.4522017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 3 = 2017.01.20 22:08:34.2902017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 2 = 2017.01.20 22:07:29.7042017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 1 = 2017.01.20 22:07:29.7042017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 0 = 2017.01.20 22:06:35.3862017.01.21 00:08:28.961 Time_sync_forts (ED-3.17,M1) debugging terminated CopyTicks()が最後のティックを保存しないことが判明?追加MqlTick cur_tick, ct_tick[]; if(SymbolInfoTick(symb_gold, cur_tick)) { int result = CopyTicks(symb_gold, ct_tick, COPY_TICKS_TRADE, 0, 10); if(result>0) { Print("SymbolInfoTick symbiol = ", symb_gold, " time = ", cur_tick.time, ".", cur_tick.time_msc%1000); for(int i = result-1; i >=0; i--) { Print("CopyTicks symbol = ", symb_gold, " time ", string(i), " = ", ct_tick[i].time, ".", ct_tick[i].time_msc%1000); } } }結果2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) SymbolInfoTick symbiol = GOLD-3.17 time = 2017.01.20 22:14:48.02017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 9 = 2017.01.20 21:59:59.6582017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 8 = 2017.01.20 21:57:54.5122017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 7 = 2017.01.20 21:57:54.5122017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 6 = 2017.01.20 21:57:54.2452017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 5 = 2017.01.20 21:57:54.2452017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 4 = 2017.01.20 21:57:00.5622017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 3 = 2017.01.20 21:56:45.1592017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 2 = 2017.01.20 21:56:13.6012017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 1 = 2017.01.20 21:55:16.8522017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 0 = 2017.01.20 21:54:16.303MqlTick cur_tick, ct_tick[]; if(SymbolInfoTick(symb_gold, cur_tick)) { int result = CopyTicks(symb_gold, ct_tick, COPY_TICKS_ALL, 0, 10); if(result>0) { Print("SymbolInfoTick symbiol = ", symb_gold, " time = ", cur_tick.time, ".", cur_tick.time_msc%1000); for(int i = result-1; i >=0; i--) { Print("CopyTicks symbol = ", symb_gold, " time ", string(i), " = ", ct_tick[i].time, ".", ct_tick[i].time_msc%1000); } } }結果2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) SymbolInfoTick symbiol = GOLD-3.17 time = 2017.01.20 22:14:48.02017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 9 = 2017.01.20 22:13:36.7742017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 8 = 2017.01.20 22:13:36.7742017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 7 = 2017.01.20 22:13:36.7742017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 6 = 2017.01.20 22:11:14.3952017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 5 = 2017.01.20 22:09:47.4522017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 4 = 2017.01.20 22:09:47.4522017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 3 = 2017.01.20 22:08:34.2902017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 2 = 2017.01.20 22:07:29.7042017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 1 = 2017.01.20 22:07:29.7042017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 0 = 2017.01.20 22:06:35.386どなたか教えてください。追加RTSでも同じです。2017.01.21 00:20:42.464 Time_sync_forts (ED-3.17,M1) debugging terminated2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) SymbolInfoTick symbiol = RTS-3.17 time = 2017.01.20 22:14:55.02017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 9 = 2017.01.20 22:12:41.6192017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 8 = 2017.01.20 22:12:41.6192017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 7 = 2017.01.20 22:12:41.6192017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 6 = 2017.01.20 22:12:02.2022017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 5 = 2017.01.20 22:11:00.7542017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 4 = 2017.01.20 22:08:35.1532017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 3 = 2017.01.20 22:08:23.5482017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 2 = 2017.01.20 22:07:28.5122017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 1 = 2017.01.20 22:07:28.5122017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 0 = 2017.01.20 22:07:28.512 によって追加されました。そしてそれは、レフでも同じです。2017.01.21 00:44:21.893 Time_sync_forts (ALRS-3.17,H1) SymbolInfoTick symbiol = Si-3.17 time = 2017.01.20 23:59:56.9592017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 9 = 2017.01.20 23:54:35.9042017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 8 = 2017.01.20 23:53:04.8672017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 7 = 2017.01.20 23:51:55.8892017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 6 = 2017.01.20 23:50:55.7312017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 5 = 2017.01.20 23:49:59.2962017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 4 = 2017.01.20 23:49:59.592017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 3 = 2017.01.20 23:49:58.9372017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 2 = 2017.01.20 23:49:58.9342017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 1 = 2017.01.20 23:49:58.9332017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 0 = 2017.01.20 23:49:58.9332017.01.21 00:44:24.151 Time_sync_forts (ALRS-3.17,H1) debugging terminated Synchronise Windows local time BrainSystem: Trading System Development PREDICT time period 1234567891011121314...17 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ブローカーからの回答
どうやら、ローカルログとエクスチェンジログに同じ時刻を表示させたいようです。ローカルだけでなく、サーバーの時刻もログに書き込むべき時代になってきたのです。その場合、同期は必要ありません。
ただし、ローカルタイムではなく、サーバータイムをリミットとして送信しています。そして、サーバーの時間はもう、10時になったかのように。そのため、サーバーの時刻が取引所の時刻と同期していなかったのです。
唯一、今日、10時過ぎに(同期は市場前)
現地時刻とMarket Watchの時刻が7秒違っていた。:(
新しい見積もりが来た、市場が変わった、これらは別の出来事です。アスクまたはビッドより高いまたは低いビッドが追加(削除)されると、OnBookEvent()イベントを受け取りますが、それは新しい気配値ではなく、ティック履歴にも残らないため、最終既知のサーバー時刻は変更されません。
他にどう説明したらいいのかわからない、冗談でしょう?))
ゲッ!そうだった!失敗した!引用元はベストではないかもしれない
それなら、SymbolInfoTick()を使うべきですね。
セルゲイさん、ありがとうございます。
追加
if(SymbolInfoTick(symbol, curr_tick))
//if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1)
どうやら、ローカルログとエクスチェンジログに同じ時刻を表示させたいようです。ローカルだけでなく、サーバーの時刻もログに書き込むべき時代になっているのです。その場合、同期は必要ありません。
ただし、ローカルタイムではなく、サーバータイムをリミットとして送信しています。そして、サーバーの時間はもう、10時になったかのように。そのため、サーバーの時刻と取引所の時刻が同期していなかったのです。
時間の同期は、[マーケットクローズ] からあなたを 救うことはできません、 取引所は、後で取引を開始し、取引時間に取引を停止することができます。
ここでは、別のアプローチをとる必要があります。
どうやら、ローカルログとエクスチェンジログに同じ時刻を表示させたいようです。ローカルだけでなく、サーバーの時刻もログに書き込むべき時代になっているのです。その場合、同期は必要ありません。
ただし、ローカルタイムではなく、サーバータイムをリミットとして送信しています。そして、サーバーの時間はもう、10時になったかのように。そのため、サーバーの時刻と取引所の時刻が同期していなかったのです。
また、サーバーの時刻を知るにはどうしたらよいのでしょうか?
私はこのようにサーバーの時間をチェックしています。
//| Expert Check traiding time function |
//+------------------------------------------------------------------+
bool CheckTradingTime(MqlDateTime &tick_time)
{
datetime lk_time = TimeTradeServer(tick_time);
if ( ( tick_time.day_of_week == int(FirstDay)) ||
( tick_time.day_of_week == int(SecondDay)))//выходные
{
return(false);
}
#ifdef DEBUG
if ((tick_time.hour >= 0) && (tick_time.hour < 6)) // DEBUG 6-00
{
return(false);
}
#else
if ((tick_time.hour >= 0) && (tick_time.hour < 10))
{
return(false);
}
#endif
// 13 * 3600 + 59 * 60 + 30 = 50370 - 13:59:30
// 14 * 3600 = 50400 - 14:00:00
// 14 * 3600 + 30 = 50430 - 14:00:30
// 14 * 3600 + 60 = 50460 - 14:01:00
// 18 * 3600 + 44 * 60 + 30 = 67470 - 18:44:30
// 18 * 3600 + 45 * 60 = 67500 - 18:45:00
// 18 * 3600 + 45 * 60 + 30 = 67530 - 18:45:30
// 18 * 3600 + 46 * 60 = 67560 - 18:46:00
// 19 * 3600 = 68400 - 19:00:00
// 19 * 3600 + 60 = 68460 - 19:01:00
// 23 * 3600 + 49 * 60 + 30 = 85770 - 23:49:30
// 23 * 3600 + 50 * 60 = 85800 - 23:50:00
// 23 * 3600 + 50 * 60 + 30 = 85830 - 23:50:30
// 23 * 3600 + 51 * 60 = 85860 - 23:51:00
//---
ulong trade_time = tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec;
//--- //10:00:02
if(((trade_time >= time_st_mon) && (trade_time < 50370)) ||
((trade_time >= time_st_day) && (trade_time < 67470)) ||
((trade_time >= time_st_evn) && (trade_time < 85770)))
{
return(true);
}
return(false);
}
そして、TimeTradeServer()
はローカルタイム、TimeCurrent()は "古い "時刻を持つ可能性があります :(
しかし、私とあなたのアプローチの違いは大きいです。
私の場合、低流動性商品(例えばUUAH)のEAを使用すると、すべての先物メガネを追加して
ターミナル内の他のExpert Advisorの動作を気にすることなく、プレマーケットでティックを取得することが保証されています。
すなわち、すべての新しい見積もりは、別のEAに「行く」ことになります。
によって追加されました。
同期だけを "扱う "ので、他の人の作業を邪魔することはありません。
また、他のシンボルからのティックを別のEAに受信することができます。 これは、カスタムイベントを通じて行わなければなりません。
でも、少なくとも私は不要だと思います。
また、別のEAで他の楽器からティックを受信することも可能ですが、これはカスタムイベントを通じて行う必要があります。
でも、少なくとも私は不要だと思います。
そして、私のを試してみてください(リキッド化されていません)。
毎日、取引前に同期化
//| Time_sync_forts.mq5 |
//| Copyright 2017 prostotrader |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link "https://www.mql5.com"
#property version "1.01"
//---
struct _SYSTEMTIME
{
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
};
_SYSTEMTIME loc_time;
#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//---
bool is_sync;
string symb_rts;
string symb_si;
string symb_gold;
string symb_br;
string symb_gazr;
string symb_sbrf;
//
input string BrInstr = "BR-2.17"; //Brent
input ENUM_DAY_OF_WEEK FirstDay = SATURDAY; //Первый выходной
input ENUM_DAY_OF_WEEK SecondDay = SUNDAY; //Второй выходной
//+------------------------------------------------------------------+
//| Expert set second symbol function |
//+------------------------------------------------------------------+
string SetSecSymbol(const string a_symbol,const string prefix)
{
int str_tire=0;
ushort let_symbol;
int str_size=StringLen(a_symbol);
for(int i=0; i<str_size; i++)
{
let_symbol=StringGetCharacter(a_symbol,i);
if(let_symbol=='-')
{
str_tire=i;
break;
}
}
if(str_tire>0)
{
return(prefix + StringSubstr(a_symbol, str_tire, str_size - str_tire));
}
return("");
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
is_sync=false;
MarketBookAdd(Symbol());
//---
symb_rts=SetSecSymbol(Symbol(),"RTS");
if(!SymbolSelect(symb_rts,true))
{
MessageBox(symb_rts+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
return(INIT_FAILED);
}
else MarketBookAdd(symb_rts);
//---
symb_si=SetSecSymbol(Symbol(),"Si");
if(!SymbolSelect(symb_si,true))
{
MessageBox(symb_si+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
return(INIT_FAILED);
}
else MarketBookAdd(symb_si);
//---
symb_gold=SetSecSymbol(Symbol(),"GOLD");
if(!SymbolSelect(symb_gold,true))
{
MessageBox(symb_gold+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
return(INIT_FAILED);
}
else MarketBookAdd(symb_gold);
//---
symb_gazr=SetSecSymbol(Symbol(),"GAZR");
if(!SymbolSelect(symb_gazr,true))
{
MessageBox(symb_gazr+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
return(INIT_FAILED);
}
else MarketBookAdd(symb_gazr);
//---
symb_sbrf=SetSecSymbol(Symbol(),"SBRF");
if(!SymbolSelect(symb_sbrf,true))
{
MessageBox(symb_sbrf+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
return(INIT_FAILED);
}
else MarketBookAdd(symb_sbrf);
//---
symb_br=BrInstr;
if(!SymbolSelect(symb_br,true))
{
MessageBox(symb_br+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
return(INIT_FAILED);
}
else MarketBookAdd(symb_br);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MarketBookRelease(Symbol());
MarketBookRelease(symb_rts);
MarketBookRelease(symb_br);
MarketBookRelease(symb_si);
MarketBookRelease(symb_gold);
MarketBookRelease(symb_gazr);
MarketBookRelease(symb_sbrf);
}
//+------------------------------------------------------------------+
//| Expert Convert To Time function |
//+------------------------------------------------------------------+
bool ConvertToTime(const long n_value,_SYSTEMTIME &a_time)
{
a_time.wMilliseconds=ushort(n_value%1000);
ulong new_time=ulong(double(n_value)/1000);
MqlDateTime cur_time = {0};
TimeToStruct(datetime(new_time),cur_time);
if(cur_time.year>0)
{
a_time.wDay=ushort(cur_time.day);
a_time.wDayOfWeek=ushort(cur_time.day_of_week);
a_time.wHour=ushort(cur_time.hour);
a_time.wMinute= ushort(cur_time.min);
a_time.wMonth = ushort(cur_time.mon);
a_time.wSecond= ushort(cur_time.sec);
a_time.wYear=ushort(cur_time.year);
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
//| Expert On book event function |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
loc_time.wYear=0;
GetLocalTime(loc_time);
if(loc_time.wYear>0)
{
if((int(loc_time.wDayOfWeek) == int(FirstDay)) ||
(int(loc_time.wDayOfWeek) == int(SecondDay))) return;
if((loc_time.wHour==9) && (loc_time.wMinute>=50) && (loc_time.wMinute<=59))
{
MqlTick curr_tick;
if(SymbolInfoTick(symbol, curr_tick))
//if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1)
{
MqlDateTime sv_time;
TimeToStruct(curr_tick.time,sv_time);
if(!is_sync)
{
if((loc_time.wDayOfWeek==ushort(sv_time.day_of_week)) &&
(loc_time.wHour==ushort(sv_time.hour)))
{
long last_ping=long(NormalizeDouble((double(TerminalInfoInteger(TERMINAL_PING_LAST))/1000)/2,0));
long mls_time=long(curr_tick.time_msc%1000);
if((mls_time+last_ping)>999)
{
mls_time=long(curr_tick.time_msc)+last_ping;
if(!ConvertToTime(mls_time, loc_time)) return;
}
else
{
loc_time.wMinute = ushort(sv_time.min);
loc_time.wSecond = ushort(sv_time.sec);
loc_time.wMilliseconds=ushort(mls_time);
}
if(SetLocalTime(loc_time))
{
is_sync=true;
Print("Local time sync is done. Symbol = ", symbol, " Sync min = ", loc_time.wMinute,
" Sync sec = ", loc_time.wSecond, " Sync ms = ", loc_time.wMilliseconds);
}
}
}
}
}
else is_sync=false;
}
}
//+------------------------------------------------------------------+
私のを試してみてください(排除されません)
同じコードでも、もっと何倍も簡潔なものになるはずです。
もちろん、人それぞれ能力も性能も違いますから。
あなたのを見ると、面白いですね。
このコードをデモで実行
if(SymbolInfoTick(symb_gold, cur_tick))
{
int result = CopyTicks(symb_gold, ct_tick, COPY_TICKS_INFO, 0, 10);
if(result>0)
{
Print("SymbolInfoTick symbiol = ", symb_gold, " time = ", cur_tick.time, ".", cur_tick.time_msc%1000);
for(int i = result-1; i >=0; i--)
{
Print("CopyTicks symbol = ", symb_gold, " time ", string(i), " = ", ct_tick[i].time, ".", ct_tick[i].time_msc%1000);
}
}
}
と、ちょっと戸惑うような結果でした。
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 9 = 2017.01.20 22:13:36.774
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 8 = 2017.01.20 22:13:36.774
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 7 = 2017.01.20 22:13:36.774
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 6 = 2017.01.20 22:11:14.395
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 5 = 2017.01.20 22:09:47.452
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 4 = 2017.01.20 22:09:47.452
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 3 = 2017.01.20 22:08:34.290
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 2 = 2017.01.20 22:07:29.704
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 1 = 2017.01.20 22:07:29.704
2017.01.21 00:07:41.444 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 0 = 2017.01.20 22:06:35.386
2017.01.21 00:08:28.961 Time_sync_forts (ED-3.17,M1) debugging terminated
CopyTicks()が最後のティックを保存しないことが判明?
追加
if(SymbolInfoTick(symb_gold, cur_tick))
{
int result = CopyTicks(symb_gold, ct_tick, COPY_TICKS_TRADE, 0, 10);
if(result>0)
{
Print("SymbolInfoTick symbiol = ", symb_gold, " time = ", cur_tick.time, ".", cur_tick.time_msc%1000);
for(int i = result-1; i >=0; i--)
{
Print("CopyTicks symbol = ", symb_gold, " time ", string(i), " = ", ct_tick[i].time, ".", ct_tick[i].time_msc%1000);
}
}
}
結果
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 9 = 2017.01.20 21:59:59.658
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 8 = 2017.01.20 21:57:54.512
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 7 = 2017.01.20 21:57:54.512
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 6 = 2017.01.20 21:57:54.245
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 5 = 2017.01.20 21:57:54.245
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 4 = 2017.01.20 21:57:00.562
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 3 = 2017.01.20 21:56:45.159
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 2 = 2017.01.20 21:56:13.601
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 1 = 2017.01.20 21:55:16.852
2017.01.21 00:15:54.670 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 0 = 2017.01.20 21:54:16.303
if(SymbolInfoTick(symb_gold, cur_tick))
{
int result = CopyTicks(symb_gold, ct_tick, COPY_TICKS_ALL, 0, 10);
if(result>0)
{
Print("SymbolInfoTick symbiol = ", symb_gold, " time = ", cur_tick.time, ".", cur_tick.time_msc%1000);
for(int i = result-1; i >=0; i--)
{
Print("CopyTicks symbol = ", symb_gold, " time ", string(i), " = ", ct_tick[i].time, ".", ct_tick[i].time_msc%1000);
}
}
}
結果
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 9 = 2017.01.20 22:13:36.774
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 8 = 2017.01.20 22:13:36.774
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 7 = 2017.01.20 22:13:36.774
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 6 = 2017.01.20 22:11:14.395
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 5 = 2017.01.20 22:09:47.452
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 4 = 2017.01.20 22:09:47.452
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 3 = 2017.01.20 22:08:34.290
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 2 = 2017.01.20 22:07:29.704
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 1 = 2017.01.20 22:07:29.704
2017.01.21 00:17:55.966 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = GOLD-3.17 time 0 = 2017.01.20 22:06:35.386
どなたか教えてください。
追加
RTSでも同じです。
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) SymbolInfoTick symbiol = RTS-3.17 time = 2017.01.20 22:14:55.0
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 9 = 2017.01.20 22:12:41.619
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 8 = 2017.01.20 22:12:41.619
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 7 = 2017.01.20 22:12:41.619
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 6 = 2017.01.20 22:12:02.202
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 5 = 2017.01.20 22:11:00.754
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 4 = 2017.01.20 22:08:35.153
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 3 = 2017.01.20 22:08:23.548
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 2 = 2017.01.20 22:07:28.512
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 1 = 2017.01.20 22:07:28.512
2017.01.21 00:21:11.589 Time_sync_forts (ED-3.17,M1) CopyTicks symbol = RTS-3.17 time 0 = 2017.01.20 22:07:28.512
によって追加されました。
そしてそれは、レフでも同じです。
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 9 = 2017.01.20 23:54:35.904
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 8 = 2017.01.20 23:53:04.867
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 7 = 2017.01.20 23:51:55.889
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 6 = 2017.01.20 23:50:55.731
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 5 = 2017.01.20 23:49:59.296
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 4 = 2017.01.20 23:49:59.59
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 3 = 2017.01.20 23:49:58.937
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 2 = 2017.01.20 23:49:58.934
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 1 = 2017.01.20 23:49:58.933
2017.01.21 00:44:21.895 Time_sync_forts (ALRS-3.17,H1) CopyTicks symbol = Si-3.17 time 0 = 2017.01.20 23:49:58.933
2017.01.21 00:44:24.151 Time_sync_forts (ALRS-3.17,H1) debugging terminated