实时的提基 - 页 15 1...8910111213141516171819202122...26 新评论 prostotrader 2020.02.04 09:48 #141 Yuriy Zaytsev: 但我看了看日志,日志显示同样的勾选,相差4秒。 p.s. 我讨厌 "不可能 "这句话,我已经习惯了任何事情都可能发生的想法。 顺便说一句,也许这离主题很远,但曾经对地球是圆的说法也说过这样的话--"这不可能。 一般来说,我总是有疑问,直到我检查然后再重复检查,最好还有人重复检查几遍。 你确定你没有搞砸生成日志和处理数据的代码吗? 这只是4秒钟的差别。 蜱虫已经在终端,即它们已经通过网络发送。 把代码放在公共领域 if(SymbolInfoTick(Symbol(), s_tick) == true) { Print("SymbolInfoTick: ",GetTickDescription(s_tick)); } 自己看吧。 Yuriy Zaytsev 2020.02.04 09:50 #142 prostotrader: 抽搐已经在终端中,即它们已经通过网络传输。 把开放访问代码放在里面 自己看吧。 谢谢,我会试试的,我已经关注这个话题很久了,我作为一个研究者更感兴趣。 这个代码滞后了4秒? //+------------------------------------------------------------------+ //| Ticks_test.mq5 | //| Copyright 2019 prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019 prostotrader" #property link "https://www.mql5.com" #property version "1.00" //--- bool is_book; MqlTick ticks[], s_tick; ulong last_time, mem_cnt, tot_cnt; bool is_first; int t_cnt, result; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { tot_cnt = 0; is_book = MarketBookAdd(Symbol()); result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1); if(result > 0) { last_time = ulong(ticks[0].time_msc); //запоминаем время последнего известного тика is_first = true; } else { is_first = false; Alert("No start time!"); return(INIT_FAILED); } ArraySetAsSeries(ticks, true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| возвращает строковое описание тика | //+------------------------------------------------------------------+ string GetTickDescription(MqlTick &tick) { string res = string(tick.time) + "." + string(tick.time_msc%1000); // bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); // if((buy_tick== true) || (sell_tick == true)) { res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); } else { res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); } return res; } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(is_book == true) MarketBookRelease(Symbol()); } //+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { if(symbol != Symbol()) return; tot_cnt++; if(SymbolInfoTick(Symbol(), s_tick) == true) { Print("SymbolInfoTick: ",GetTickDescription(s_tick)); } if(is_first == true) { result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени if(result > 0) { t_cnt = 0; for(int i= 0; i<result; i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": ",GetTickDescription(ticks[i])); } // l_tick = ticks[0]; is_first = false; last_time = ulong(ticks[0].time_msc); //Запоминаем время последнего тика } } else { if(SymbolInfoTick(Symbol(), s_tick) == true) { Print("SymbolInfoTick: ",GetTickDescription(s_tick)); } result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета) if(result > 0) { // l_tick = ticks[0]; if(result > t_cnt) { mem_cnt = t_cnt; t_cnt = 0; for(int i= 0; i<(result - int(mem_cnt)); i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": ",GetTickDescription(ticks[i])); } if(last_time == ulong(ticks[0].time_msc)) { t_cnt += int(mem_cnt); } else last_time = ulong(ticks[0].time_msc); } else { Print(__FUNCTION__, ": Pending order!"); //Изменения стакана (добавлен/удален отложенный ордер) } } else { Print(__FUNCTION__, ": Pending order!"); //Изменения стакана (добавлен/удален отложенный ордер) } } } //+------------------------------------------------------------------+ Yuriy Zaytsev 2020.02.04 09:57 #143 似乎不是这个人。 没有看到代码中的OnTick Yuriy Zaytsev 2020.02.04 10:01 #144 显然,这就是问题的代码 //+------------------------------------------------------------------+ //| Ticks_test.mq5 | //| Copyright 2019 prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019 prostotrader" #property link "https://www.mql5.com" #property version "1.00" //--- bool is_book; MqlTick ticks[]; ulong last_time, mem_cnt, tot_cnt; bool is_first; int t_cnt, result; enum ENUM_BOOK_OR_TICK { USE_BOOK, // Use OnBookEvent USE_TICK // Use OnTick }; input ENUM_BOOK_OR_TICK Mode = USE_BOOK; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { tot_cnt = 0; if(Mode == USE_BOOK) is_book = MarketBookAdd(Symbol()); result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1); if(result > 0) { last_time = ulong(ticks[0].time_msc); //запоминаем время последнего известного тика is_first = true; } else { is_first = false; Alert("No start time!"); return(INIT_FAILED); } ArraySetAsSeries(ticks, true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| возвращает строковое описание тика | //+------------------------------------------------------------------+ string GetTickDescription(MqlTick &tick) { string res = string(tick.time) + "." + string(tick.time_msc%1000); // bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); // if((buy_tick== true) || (sell_tick == true)) { res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); } else { res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); } return res; } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(Mode == USE_BOOK) { Print("USE_BOOK ticks received: ", tot_cnt); if(is_book == true) MarketBookRelease(Symbol()); } else { Print("USE_TICK ticks received: ", tot_cnt); } } //+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { if ( Mode != USE_BOOK || symbol != Symbol() ) return; tot_cnt++; if(is_first == true) { result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени if(result > 0) { t_cnt = 0; for(int i= 0; i<result; i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": ",GetTickDescription(ticks[i])); } is_first = false; last_time = ulong(ticks[0].time_msc); //Запоминаем время последнего тика } } else { result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета) if(result > 0) { if(result > t_cnt) { mem_cnt = t_cnt; t_cnt = 0; for(int i= 0; i<(result - int(mem_cnt)); i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": ",GetTickDescription(ticks[i])); } if(last_time == ulong(ticks[0].time_msc)) { t_cnt += int(mem_cnt); } else last_time = ulong(ticks[0].time_msc); } else { Print(__FUNCTION__, ": Pending order!"); //Изменения стакана (добавлен/удален отложенный ордер) } } else { Print(__FUNCTION__, ": Pending order!"); //Изменения стакана (добавлен/удален отложенный ордер) } } } //+------------------------------------------------------------------+ //| OnTick function | //+------------------------------------------------------------------+ void OnTick() { if ( Mode != USE_TICK ) return; tot_cnt++; if(is_first == true) { result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени if(result > 0) { t_cnt = 0; for(int i= 0; i<result; i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": ",GetTickDescription(ticks[i])); } is_first = false; last_time = ulong(ticks[0].time_msc); //Запоминаем время последнего тика } } else { result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета) if(result > 0) { if(result > t_cnt) { mem_cnt = t_cnt; t_cnt = 0; for(int i= 0; i<(result - int(mem_cnt)); i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": ",GetTickDescription(ticks[i])); } if(last_time == ulong(ticks[0].time_msc)) { t_cnt += int(mem_cnt); } else last_time = ulong(ticks[0].time_msc); } else { Print(__FUNCTION__, ": Pending order!"); //Изменения стакана (добавлен/удален отложенный ордер) } } else { Print(__FUNCTION__, ": Pending order!"); //Изменения стакана (добавлен/удален отложенный ордер) } } } //+------------------------------------------------------------------+ prostotrader 2020.02.04 10:19 #145 在代码中添加了我的时间。 我记得OnTick()被触发的时间(t_time = GetMicrosecondCount();) 然后我花时间,当每个函数被执行时 t_time = GetMicrosecondCount(); // if(symbol != Symbol()) return; //tot_cnt++; if(SymbolInfoTick(Symbol(), s_tick) == true) { func_time = GetMicrosecondCount(); Print("SymbolInfoTick: time = ", string(func_time - t_time), " mcs ", GetTickDescription(s_tick)); } double a_ask, a_bid, a_last; if (SymbolInfoDouble(Symbol(), SYMBOL_ASK, a_ask) == true) { func_time = GetMicrosecondCount(); Print("SymbolInfoDouble: time = ", string(func_time - t_time), " mcs ", "ask = ", a_ask); } if (SymbolInfoDouble(Symbol(), SYMBOL_BID, a_bid) == true) { func_time = GetMicrosecondCount(); Print("SymbolInfoDouble: time = ", string(func_time - t_time), " mcs ", "bid = ", a_bid); } if (SymbolInfoDouble(Symbol(), SYMBOL_LAST, a_last) == true) { func_time = GetMicrosecondCount(); Print("SymbolInfoDouble: time = ", string(func_time - t_time), " mcs ", "last = ", a_last); } if(is_first == true) { result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени if(result > 0) { func_time = GetMicrosecondCount(); t_cnt = 0; for(int i= 0; i<result; i++) { if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++; //Считаем кол-во тиков с одинаковым временем Print(__FUNCTION__, ": time = ", string(func_time - t_time), " mcs ", GetTickDescription(ticks[i])); 其结果是 2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: time = 2 mcs 2020.02.04 13:09:10.720 Bid=1573.1 2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1) SymbolInfoDouble: time = 28 mcs ask = 1573.3 2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1) SymbolInfoDouble: time = 33 mcs bid = 1573.1 2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1) SymbolInfoDouble: time = 36 mcs last = 1573.4 2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1) OnTick: time = 41 mcs 2020.02.04 13:09:10.720 Bid=1573.1 2020.02.04 13:09:13.101 Ticks_test (GOLD-3.20,M1) OnTick: time = 41 mcs 2020.02.04 13:09:00.328 Ask=1573.3 也就是说,每个函数的运行时间小于50微秒! 4秒能从哪里来? 我认为两个EA在一个终端中运行,而终端根本没有时间来 它根本没有时间将所有信息 "合并 "到一个日志中,所以它在认为必要时设置本地时间。 Yuriy Zaytsev 2020.02.04 10:24 #146 prostotrader: 在交易中,我个人使用异步 订单。 问题是(如果你在交易所认真交易),你需要股市的所有 变化。 而且这一事件越早到来越好。 我自己认为,除了OnBook,没有 其他选择。 原则上,有可能从OnBook中解除对交易操作 的直接调用。在OnBook中,你需要做的就是形成一个标志来执行操作,并在其他地方处理这个标志本身。也就是说,操作本身应该在另一个程序中由形成的标志启动,这将创建一个事件,但在离开程序HeBook后,然后代码OnBook本身将摆脱沉重的操作。然而,如果订单是异步打开的,而且没有疯狂的大量处理条件,就不太可能造成重大延误。 Yuriy Zaytsev 2020.02.04 10:37 #147 prostotrader: 在代码中添加了我的时间。 我记得OnTick()被触发的时间(t_time = GetMicrosecondCount();) 然后我花时间,当每个函数被执行时 其结果是 也就是说,每个函数的运行时间小于50微秒! 4秒能从哪里来? 我认为两个EA在一个终端中运行,而终端根本没有时间来 终端根本没有时间将所有的信息 "转储 "到一个日志文件中,这就是为什么它在它认为必要时设置本地时间。 我想这是真的,这样的疯狂滞后是不现实的。 1 - 当MQ自己决定的时候,FLUSH已经成功了! 2 - 由于硬盘工作强度大,向磁盘写入的技术延迟 有可能你的本地机器上已经有了一个写队列--这是很真实的,我有过几TB的备份被倒在磁盘上的经历。 我只能假设以下情况。 我曾经有几TB的备份被取到磁盘上,例如,如果我运行微软的office,更新我的Windows并从互联网上录制电影,或者如果我同时在本地机器上使用MS SQL工作。 做几个备份,有一打4个torrents和两三打程序密集地写入磁盘。 也就是说,我的意思是,如果在磁盘上有密集的工作--这是有可能的,而且在将日志写入磁盘的过程中出现了延迟。 Aleksey Mavrin 2020.02.04 10:41 #148 Yuriy Zaytsev: 可能是真的,在如此疯狂的延迟下不现实。 1 - 当MQ自己决定这一点时,FLUSH就起作用了! 2 - 由于硬盘工作强度大,造成向磁盘写入的技术延迟。 有可能一些队列已经在你的本地机器上进行了记录--这是很真实的,我有过几TB的备份被倒入磁盘的经历 我只能假设以下情况。 我曾经有几TB的备份被取到磁盘上,例如,如果我运行Mac irosoft office,更新我的Windows并从互联网上录制电影,或者如果我同时在本地机器上使用MS SQL工作。 做几个备份,有一打4个torrents和两三打程序密集地写入磁盘。 我的意思是,如果在磁盘上有密集的工作--有可能在记录到磁盘时有延迟。 几乎与磁盘无关,MT在将日志写入其缓存时已经将时间放了进去。这就是我所想的,一般来说,4秒的终端可能与一般的系统负载有关,更可能是内存和CPU。 Yuriy Zaytsev 2020.02.04 10:43 #149 prostotrader: 在代码中添加了我的时间。 我记得OnTick()被触发的时间(t_time = GetMicrosecondCount();) 然后我花时间,当每个函数被执行时 其结果是 也就是说,每个函数的运行时间小于50微秒! 4秒能从哪里来? 我认为两个EA在一个终端中运行,而终端根本没有时间来 "因此,它按照它认为必要的方式设定当地时间。 顺便说一下--这样你就不会被记录时间所困扰--你可以把当地时间添加到数组中--你在代码中形成的数组--如下所示 那么,在终端将日志重置到磁盘的时间和OnBook的勾选或事件到达本地的时间 之间,日志中会有一个明显的区别。 而从研究的角度来看,这将是更正确的。 //+------------------------------------------------------------------+ //| возвращает строковое описание тика | //+------------------------------------------------------------------+ string GetTickDescription(MqlTick &tick) { string res = string(tick.time) + "." + string(tick.time_msc%1000); // bool buy_tick = ((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); bool sell_tick = ((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); bool ask_tick = ((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); bool bid_tick = ((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); bool last_tick = ((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); bool volume_tick = ((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); // if((buy_tick== true) || (sell_tick == true)) { res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); } else { res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); } return res; } Yuriy Zaytsev 2020.02.04 10:53 #150 Aleksey Mavrin: MT 几乎不与磁盘相连, 在将日志写入其缓存时就已经设定了时间。这就是我所想的,终端一般为4秒,可能与整个系统负载有关,而不是内存和CPU。 你确定这一点吗? 4秒????,不可能!你真的认为处理器冻结了4秒或内存被释放了4秒? 更有可能是磁盘上的写队列问题。 磁盘的速度比内存和处理器慢。 flush()命令是一个C命令,你可能知道它,它是在感觉舒服的时候执行的,由于磁盘启动,它可以被推迟更多时间。 当你想把缓冲区转储到磁盘时,他们就是这么叫的。 1...8910111213141516171819202122...26 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
但我看了看日志,日志显示同样的勾选,相差4秒。
p.s.
我讨厌 "不可能 "这句话,我已经习惯了任何事情都可能发生的想法。
顺便说一句,也许这离主题很远,但曾经对地球是圆的说法也说过这样的话--"这不可能。
一般来说,我总是有疑问,直到我检查然后再重复检查,最好还有人重复检查几遍。
你确定你没有搞砸生成日志和处理数据的代码吗? 这只是4秒钟的差别。
蜱虫已经在终端,即它们已经通过网络发送。
把代码放在公共领域
自己看吧。
抽搐已经在终端中,即它们已经通过网络传输。
把开放访问代码放在里面
自己看吧。
谢谢,我会试试的,我已经关注这个话题很久了,我作为一个研究者更感兴趣。
这个代码滞后了4秒?
似乎不是这个人。
没有看到代码中的OnTick
显然,这就是问题的代码
在代码中添加了我的时间。
我记得OnTick()被触发的时间(t_time = GetMicrosecondCount();)
然后我花时间,当每个函数被执行时
其结果是
也就是说,每个函数的运行时间小于50微秒!
4秒能从哪里来?
我认为两个EA在一个终端中运行,而终端根本没有时间来
它根本没有时间将所有信息 "合并 "到一个日志中,所以它在认为必要时设置本地时间。
在交易中,我个人使用异步 订单。
问题是(如果你在交易所认真交易),你需要股市的所有 变化。
而且这一事件越早到来越好。
我自己认为,除了OnBook,没有 其他选择。
原则上,有可能从OnBook中解除对交易操作 的直接调用。在OnBook中,你需要做的就是形成一个标志来执行操作,并在其他地方处理这个标志本身。也就是说,操作本身应该在另一个程序中由形成的标志启动,这将创建一个事件,但在离开程序HeBook后,然后代码OnBook本身将摆脱沉重的操作。然而,如果订单是异步打开的,而且没有疯狂的大量处理条件,就不太可能造成重大延误。
在代码中添加了我的时间。
我记得OnTick()被触发的时间(t_time = GetMicrosecondCount();)
然后我花时间,当每个函数被执行时
其结果是
也就是说,每个函数的运行时间小于50微秒!
4秒能从哪里来?
我认为两个EA在一个终端中运行,而终端根本没有时间来
终端根本没有时间将所有的信息 "转储 "到一个日志文件中,这就是为什么它在它认为必要时设置本地时间。
我想这是真的,这样的疯狂滞后是不现实的。
1 - 当MQ自己决定的时候,FLUSH已经成功了!
2 - 由于硬盘工作强度大,向磁盘写入的技术延迟
有可能你的本地机器上已经有了一个写队列--这是很真实的,我有过几TB的备份被倒在磁盘上的经历。
我只能假设以下情况。
我曾经有几TB的备份被取到磁盘上,例如,如果我运行微软的office,更新我的Windows并从互联网上录制电影,或者如果我同时在本地机器上使用MS SQL工作。
做几个备份,有一打4个torrents和两三打程序密集地写入磁盘。
也就是说,我的意思是,如果在磁盘上有密集的工作--这是有可能的,而且在将日志写入磁盘的过程中出现了延迟。
可能是真的,在如此疯狂的延迟下不现实。
1 - 当MQ自己决定这一点时,FLUSH就起作用了!
2 - 由于硬盘工作强度大,造成向磁盘写入的技术延迟。
有可能一些队列已经在你的本地机器上进行了记录--这是很真实的,我有过几TB的备份被倒入磁盘的经历
我只能假设以下情况。
我曾经有几TB的备份被取到磁盘上,例如,如果我运行Mac irosoft office,更新我的Windows并从互联网上录制电影,或者如果我同时在本地机器上使用MS SQL工作。
做几个备份,有一打4个torrents和两三打程序密集地写入磁盘。
我的意思是,如果在磁盘上有密集的工作--有可能在记录到磁盘时有延迟。
在代码中添加了我的时间。
我记得OnTick()被触发的时间(t_time = GetMicrosecondCount();)
然后我花时间,当每个函数被执行时
其结果是
也就是说,每个函数的运行时间小于50微秒!
4秒能从哪里来?
我认为两个EA在一个终端中运行,而终端根本没有时间来
"因此,它按照它认为必要的方式设定当地时间。
顺便说一下--这样你就不会被记录时间所困扰--你可以把当地时间添加到数组中--你在代码中形成的数组--如下所示
那么,在终端将日志重置到磁盘的时间和OnBook的勾选或事件到达本地的时间 之间,日志中会有一个明显的区别。
而从研究的角度来看,这将是更正确的。
MT 几乎不与磁盘相连, 在将日志写入其缓存时就已经设定了时间。这就是我所想的,终端一般为4秒,可能与整个系统负载有关,而不是内存和CPU。
你确定这一点吗?
4秒????,不可能!你真的认为处理器冻结了4秒或内存被释放了4秒?
更有可能是磁盘上的写队列问题。
磁盘的速度比内存和处理器慢。
flush()命令是一个C命令,你可能知道它,它是在感觉舒服的时候执行的,由于磁盘启动,它可以被推迟更多时间。
当你想把缓冲区转储到磁盘时,他们就是这么叫的。