市场关闭 - 页 5 123456789101112 新评论 prostotrader 2017.09.22 01:43 #41 亲爱的开发者们!我要求你认真阅读这个信息。我想我已经找到了出现时间差异的原因!!!。今天。终端23:49:58.148 Trades 'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310 23:49:58.154 Trades 'xxxxx': accepted buy limit 2.00 UCHF-3.18 at 0.9310 23:49:58.156 Trades 'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310 placed for execution in 8.040 ms专家2017.09.21 23:49:58.182 trader (UCHF-3.18,H1) StopTrading: Время сервера = 23:50:00; Статус ордера = BUY_ORDER; Билет = 77833993 Buy ордер отклонён. 2017.09.21 23:49:58.182 trader (UCHF-3.18,H1) Alert: Эксперт остановлен. Инструмент UCHF-3.18 2017.09.21 23:49:58.182 trader (UCHF-3.18,H1) OnTradeTransaction: Buy ордер отклонён брокером(биржей). Билет = 77833993 Причина: 0 0时间检查机制。当一个符号的市场深度发生变化时(我只使用市场深度)。//+------------------------------------------------------------------+ // Expert Book event function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { if(symbol == Symbol())) { if(CheckMarketTime(symbol) { //Выставление ордеров и т.д. } } }检查市场时间 函数被调用//+------------------------------------------------------------------+ //| Expert Check Market Time function | //+------------------------------------------------------------------+ bool CheckMarketTime(const string a_symbol) { if(SymbolInfoTick(a_symbol, cur_tick)) { sv_time.year = 0; TimeToStruct(cur_tick.time, sv_time); if(sv_time.year > 0) { if((sv_time.day_of_week == int(FirstDay)) || (sv_time.day_of_week == int(SecondDay))) return(false); tts_time.year = 0; TimeTradeServer(tts_time); if(tts_time.year > 0) { if((tts_time.day_of_week == sv_time.day_of_week) && (tts_time.hour == sv_time.hour) && (tts_time.min == sv_time.min)) { ulong cur_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec; if(((cur_time >= time_st_mon) && (cur_time < 50370)) || ((cur_time >= time_st_day) && (cur_time < 67470)) || ((cur_time >= time_st_evn) && (cur_time < 85770))) { return(true); } } } } } return(false); }在获得符号的最新tick的数据后if(SymbolInfoTick(a_symbol, cur_tick))我检查的是时间框架,但(非常重要)!!!!MqlTick(IMMEDIATELY)不包含最新的时间框架,如果在市场的深度已经改变了ONLY相同价格的体积。我做这个假设是因为没有TICK_FLAG_ASK_VOLUME和 TICK_FLAG_BID_VOLUME 标志OnBookEvent函数 起作用了(这样那样的价格的数量已经改变),但MqlTick没有登记这一变化的时间。请在MqlTick中加入这些标志,并分别更新时间。添加由于某些原因,我无法在CD中进行记录。 fxsaber 2017.09.22 09:17 #42 prostotrader:MqlTick(RIGHT HERE)不记录最新时间,如果在价格杯中,只有同一价格的数量发生了变化。完全正确。而这是正确的行为。MqlTick从填充tick历史的同一来源获取数据。在tick历史中不应该有重复,因为MT5中的tick历史即使在bestbands上也不存储量。长期以来,人们一直提出,没有直接的方法可以知道蜱虫历史所对应的时间。以另一种方式了解情况。 prostotrader 2017.09.22 09:40 #43 fxsaber:完全正确。而这是正确的行为。MqlTick从填充tick历史的同一来源获取数据。在tick历史中不应该有重复的内容,因为MT5的tick历史不存储成交量,即使是在bestbands上。长期以来,人们一直提出,没有直接的方法可以知道蜱虫历史所对应的时间。以另一种方式了解情况。你能不能建议一下哪一个?添加如果我收到通知说塔坎有什么变化,那么为什么不添加一个字段以方便使用("小血")?datetime book_change; ?或者更简单,向MqlBookInfo添加以下字段datetime book_change;特别是这次是通过交流来翻译的。 fxsaber 2017.09.22 09:45 #44 prostotrader: 你能告诉我是哪一个吗?// Время последнего тика символа long GetSymbolTime( const string Symb ) { MqlTick Tick; return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0); } // Время последнего тика Обзора рынка long GetMarketWatchTime( void ) { long Res = 0; for (int i = SymbolsTotal(true) - 1; i >= 0; i--) { const long TmpTime = GetSymbolTime(SymbolName(i, true)); if (TmpTime > Res) Res = TmpTime; } return(Res); } // Текущее время на торговом сервере без учета пинга long GetCurrenTime( void ) { static ulong StartTime = GetMicrosecondCount(); static long PrevTime = 0; const long TmpTime = GetMarketWatchTime(); if (TmpTime > PrevTime) { PrevTime = TmpTime; StartTime = GetMicrosecondCount(); } return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000)); } void OnInit() { MarketBookAdd(_Symbol); } void OnDeinit( const int ) { MarketBookRelease(_Symbol); } string TimeToString( const long Value ) { return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0')); } void OnBookEvent( const string& ) { Comment(TimeToString(GetCurrenTime())); } prostotrader 2017.09.22 09:50 #45 fxsaber: 别傻了...:) fxsaber 2017.09.22 09:50 #46 prostotrader:如果我已被通知takan有什么变化,那么为什么不增加一个方便的字段("小钱")?datetime book_change; ?或者简单地说,用MqlBookInfo结构添加datetime book_change;特别是,这个时间是由交换器翻译的。只不过不是日期时间,而是长时间--毫秒。而且 关于交易、自动交易系统和策略测试的论坛 市场关闭 fxsaber, 2017.09.22 09:17 这个问题已经提出了 很久,没有直接的方法可以知道投注窗口所对应的时间。有类似的建议。 prostotrader 2017.09.22 10:07 #47 也许在OnBookEvent被触发之后要求对这个角色进行CopyTicks?我可以试一试... fxsaber 2017.09.22 10:10 #48 prostotrader:也许在OnBookEvent被触发之后要求对这个角色进行CopyTicks?当然,不会有什么帮助。现在唯一的选择是找出翻车机的时间。 prostotrader 2017.09.22 10:20 #49 fxsaber:当然,这不会有什么帮助。现在唯一的选择是找出玻璃铅的时间。这很有趣 :)#property copyright "Copyright 2017 prostotrader" #property link "https://www.mql5.com" #property version "1.00" // MqlTick a_ticks[], b_ticks; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(!MarketBookAdd(Symbol())) { Print("Book not added!"); return(INIT_FAILED); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { MarketBookRelease(Symbol()); } //+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { if(symbol == Symbol()) { int res = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1); if(res > 0) { if(SymbolInfoTick(symbol, b_ticks)) { Print("CopyTicks time = ", TimeToString(a_ticks[0].time, TIME_SECONDS), "; SymbolInfoTick = ", TimeToString(b_ticks.time, TIME_SECONDS)); } } } }结果2017.09.22 11:18:36.029 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:35 2017.09.22 11:18:36.933 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:35 2017.09.22 11:18:37.577 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:37 2017.09.22 11:18:38.257 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:37 2017.09.22 11:18:38.317 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38 2017.09.22 11:18:38.511 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38 2017.09.22 11:18:38.871 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38 2017.09.22 11:18:39.071 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38 2017.09.22 11:18:39.545 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38 2017.09.22 11:18:39.655 Test_time (RTS-12.17,M1) CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:39 ???????我甚至不知道该说些什么.... fxsaber 2017.09.22 10:42 #50 prostotrader:我甚至不知道该说些什么....void OnInit() { MarketBookAdd(_Symbol); } void OnDeinit( const int ) { MarketBookRelease(_Symbol); } string GetTickFlag( uint tickflag ) { string flag = ""; #define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; TICKFLAG_MACRO(BID) TICKFLAG_MACRO(ASK) TICKFLAG_MACRO(LAST) TICKFLAG_MACRO(VOLUME) TICKFLAG_MACRO(BUY) TICKFLAG_MACRO(SELL) #undef TICKFLAG_MACRO if (flag == "") flag = " FLAG_UNKNOWN (" + (string)tickflag + ")"; return(flag); } #define TOSTRING(A) " " + #A + " = " + (string)Tick.A string TickToString( const MqlTick &Tick ) { return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc % 1000, 3, '0') + TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags)); } void OnBookEvent( const string &Symb ) { if (Symb == _Symbol) { MqlTick Tick1, Tick2[]; if (SymbolInfoTick(_Symbol, Tick1) && (CopyTicks(_Symbol, Tick2, COPY_TICKS_ALL, 0, 1) > 0)) Print("\nMqlTick: " + TickToString(Tick1) + "\nCopyTick: " + TickToString(Tick2[0])); } }你会看到,只有在这些情况下,时间才会有所不同Test3 (RTS-12.17,M1) MqlTick: time = 2017.09.22 11:21:50.668 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 FLAG_UNKNOWN (0) Test3 (RTS-12.17,M1) CopyTick: time = 2017.09.22 11:21:50.572 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL已经讨论过好几次了,MqlTick 并没有像现在这样返回一个tick。有两个刻度流--报价和交易。而在CopyTicks中,它们的合并有时是追溯性的,因为流是不同步的。而且,MqlTick和CopyTicks的时间可能不一致。 123456789101112 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
亲爱的开发者们!
我要求你认真阅读这个信息。
我想我已经找到了出现时间差异的原因!!!。
今天。
终端
专家
时间检查机制。
当一个符号的市场深度发生变化时(我只使用市场深度)。
检查市场时间 函数被调用
在获得符号的最新tick的数据后
我检查的是时间框架,但(非常重要)!!!!
MqlTick(IMMEDIATELY)不包含最新的时间框架,如果
在市场的深度已经改变了ONLY相同价格的体积。
我做这个假设是因为没有
TICK_FLAG_ASK_VOLUME和 TICK_FLAG_BID_VOLUME 标志
OnBookEvent函数 起作用了(这样那样的价格的数量已经改变),但
MqlTick没有登记这一变化的时间。
请在MqlTick中加入这些标志,并分别更新时间。
添加
由于某些原因,我无法在CD中进行记录。
MqlTick(RIGHT HERE)不记录最新时间,如果
在价格杯中,只有同一价格的数量发生了变化。
完全正确。而这是正确的行为。MqlTick从填充tick历史的同一来源获取数据。在tick历史中不应该有重复,因为MT5中的tick历史即使在bestbands上也不存储量。
长期以来,人们一直提出,没有直接的方法可以知道蜱虫历史所对应的时间。以另一种方式了解情况。
完全正确。而这是正确的行为。MqlTick从填充tick历史的同一来源获取数据。在tick历史中不应该有重复的内容,因为MT5的tick历史不存储成交量,即使是在bestbands上。
长期以来,人们一直提出,没有直接的方法可以知道蜱虫历史所对应的时间。以另一种方式了解情况。
你能不能建议一下哪一个?
添加
如果我收到通知说塔坎有什么变化,那么
为什么不添加一个字段以方便使用("小血")?
datetime book_change; ?
或者更简单,向MqlBookInfo添加以下字段
datetime book_change;
特别是这次是通过交流来翻译的。
你能告诉我是哪一个吗?
别傻了...:)
如果我已被通知takan有什么变化,那么
为什么不增加一个方便的字段("小钱")?
datetime book_change; ?
或者简单地说,用MqlBookInfo结构添加
datetime book_change;
特别是,这个时间是由交换器翻译的。
只不过不是日期时间,而是长时间--毫秒。而且
关于交易、自动交易系统和策略测试的论坛
市场关闭
fxsaber, 2017.09.22 09:17
这个问题已经提出了 很久,没有直接的方法可以知道投注窗口所对应的时间。
有类似的建议。
也许在OnBookEvent被触发之后
要求对这个角色进行CopyTicks?
我可以试一试...
也许在OnBookEvent被触发之后
要求对这个角色进行CopyTicks?
当然,不会有什么帮助。现在唯一的选择是找出翻车机的时间。
当然,这不会有什么帮助。现在唯一的选择是找出玻璃铅的时间。
这很有趣 :)
结果
???????
我甚至不知道该说些什么....
我甚至不知道该说些什么....
你会看到,只有在这些情况下,时间才会有所不同
已经讨论过好几次了,MqlTick 并没有像现在这样返回一个tick。有两个刻度流--报价和交易。而在CopyTicks中,它们的合并有时是追溯性的,因为流是不同步的。而且,MqlTick和CopyTicks的时间可能不一致。