实时的提基 - 页 14 1...789101112131415161718192021...26 新评论 prostotrader 2020.02.02 10:45 #131 Roman: 我不使用交易外汇。 在CopyTick 的例子中, 你只得到结构的最后一个元素,事实上只有最好的价格。 你为什么认为这只是一个项目? 这就是问题所在,我得到的绝对是所有的虱子(不仅仅是虱子,还有杯子里的变化)。 检查 //+------------------------------------------------------------------+ //| 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!"); //Изменения стакана (добавлен/удален отложенный ордер) } } } //+------------------------------------------------------------------+ Andrey Khatimlianskii 2020.02.03 08:53 #132 你有了它,这很好。 我答应告诉你,与OnBook相比,OnTick的另一个优势。这是因为OnBook是保证交付的,如果它有哪怕一点点繁重的计算(或者,上帝保佑,交易),它可以积累一个相当大的事件队列,这些 事件没有任何意义(它们不包含与事件相关的信息)。这就是优势转为劣势的地方,因为它经常如此。 在这种情况下,OnTick将简单地跳过计算时出现的事件,而在第一个新的、相关的事件上触发。在OnBook变体中,为了释放队列(跳过无用的事件),你必须自己制作拐杖。 prostotrader 2020.02.03 11:12 #133 Andrey Khatimlianskii: 你有了它,这很好。 我答应告诉你,与OnBook相比,OnTick的另一个优势。这是因为OnBook是保证交付的,如果它有哪怕一点点繁重的计算(或者,上帝保佑,交易),它可以积累一个相当大的事件队列,这些 事件没有任何意义(它们不包含与事件相关的信息)。这就是优势转为劣势的地方,因为它经常如此。 在这种情况下,OnTick将简单地跳过计算时出现的事件,而在第一个新的、相关的事件上触发。在OnBook的变体中,为了释放队列(跳过无用的事件),你必须自己制作拐杖。 就个人而言,我在交易操作中使用异步 订单。 问题是(如果你认真地在交易所交易),你需要市场的所有 变化。 而且这一事件越早到来越好。 此外,你还需要询问和出价量... 我自己认为,除了OnBook,没有 其他选择。 prostotrader 2020.02.03 16:21 #134 Roman:我不使用交易外汇。 在CopyTick 的例子中,你只得到结构的最后一个元素,事实上只有最好的价格。 运行上述代码,结果发现 if(SymbolInfoTick(Symbol(), s_tick) == true) { Print("SymbolInfoTick: ",GetTickDescription(s_tick)); } s_tick.flags = 0 :) 2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1) OnTick: 2020.02.03 19:28:13.160 Bid=1581.9 2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 19:28:13.160 2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 19:28:13.160 2020.02.03 19:28:14.656 Ticks_test (GOLD-3.20,M1) OnBookEvent: 2020.02.03 19:28:13.160 Bid=1581.9 同样的刻度线,在调用SymbolInfoTick 时--没有标志:) 添加 if(tick.flags == 0) { res = res + " ask = " + string(tick.ask) + "; bid = " + string(tick.bid); } 我们得到了一个虱子,但我们不知道谁 "创造 "了它。 2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1) OnTick: 2020.02.03 19:36:54.735 Bid=1583 2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 19:36:55.61 ask = 1583.3; bid = 1583.0 2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 19:36:55.61 ask = 1583.3; bid = 1583.0 2020.02.03 19:36:56.576 Ticks_test (GOLD-3.20,M1) OnBookEvent: 2020.02.03 19:36:54.735 Bid=1583 滴答时间是怎么回事? 这看起来很荒谬。我 们从时间为19:36:54.735 的新数据包中收到刻度线,但SymbolInfoTick得到的刻度线 "领先 "900ms。 来自SymbolInfoTick 的帮助 [out] Ссылка на структуру типа MqlTick, в которую будут помещены текущие цены и время последнего обновления цен. Roman Shiredchenko 2020.02.03 18:38 #135 美丽的主题,很多有趣的东西,谢谢大家。 不开玩笑,不戏谑... 只要不拆解代码,我就会考虑...... Roman 2020.02.03 18:47 #136 prostotrader:滴答的时间到底是怎么回事?这很荒唐。我们从时间为19:36:54.735 的新数据包中提取刻度线,但通过调用SymbolInfoTick,我们得到了一个 "提前 "900ms的刻度线。来自参考资料 真的很奇怪,Bid值都是一样的,但SymbolInfoTick 时间却不同。 prostotrader 2020.02.03 19:05 #137 Roman:真的很奇怪,所有的Bid值都是一样的,但SymbolInfoTick的时间却不同。 看上去终端机 "随心所欲 "地安排时间 :) 2020.02.03 21:56:44.409 Ticks_test (GOLD-3.20,M1) OnTick: 2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9 2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9 2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1) OnBookEvent: 2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 当地时间 过去了将近4秒!这是个好兆头。 这肯定是不可能的! 而在这里,一切都很正常。 2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1) OnTick: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 2020.02.03 21:57:02.294 Ticks_test (GOLD-3.20,M1) OnBookEvent: 2020.02.03 21:57:00.671 Sell Tick: Last=1582.9 Volume=5 Yuriy Zaytsev 2020.02.03 23:15 #138 prostotrader: 看起来,终端正在 "随心所欲 "地安排时间 :) 当地时间已经过去了将近4秒! 这不可能是正确的! 日志显示,OnTick 比OnBookEvent 快4秒捕捉到相同的滴答。 1 2020.02.03 21:56:44.409 Ticks_test (GOLD-3.20,M1) OnTick: 2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9 2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1) SymbolInfoTick: 2020.02.03 21:56:42.780 ask = 1583.1; bid = 1582.9 2 2020.02.03 21:56:48.122 Ticks_test (GOLD-3.20,M1) OnBookEvent: 2020.02.03 21:56:42.776 Sell Tick: Last=1582.9 Volume=2 prostotrader 2020.02.04 09:20 #139 Yuriy Zaytsev: 根据日志显示,OnTick 比OnBookEvent 快了4秒。 现实中绝对不可能是这样的。 因为蜱虫已经进入终端(即新的蜱虫包已经到达)。 Yuriy Zaytsev 2020.02.04 09:37 #140 prostotrader: 现实中绝对不可能是这样的。 因为蜱虫已经进入终端(即新的蜱虫包已经到达)。 但我看了看日志,日志中一个和一个相差4秒的刻度线来了。 p.s. 我真的不喜欢 "不可能 "这句话,我已经习惯了一切都可能发生的事实。 顺便说一句,也许这离主题很远,但有一次对地球是圆的论断,也是这样说的--"不可能。 一般来说,我总是有疑问,直到我检查,然后再重复检查,最好是别人重复检查几次。 你确定你的代码没有搞砸--形成日志,处理数据? 这个代码创造了奇迹,有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!"); //Изменения стакана (добавлен/удален отложенный ордер) } } } //+------------------------------------------------------------------+ 1...789101112131415161718192021...26 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不使用交易外汇。
在CopyTick 的例子中, 你只得到结构的最后一个元素,事实上只有最好的价格。
你为什么认为这只是一个项目?
这就是问题所在,我得到的绝对是所有的虱子(不仅仅是虱子,还有杯子里的变化)。
检查
你有了它,这很好。
我答应告诉你,与OnBook相比,OnTick的另一个优势。这是因为OnBook是保证交付的,如果它有哪怕一点点繁重的计算(或者,上帝保佑,交易),它可以积累一个相当大的事件队列,这些 事件没有任何意义(它们不包含与事件相关的信息)。这就是优势转为劣势的地方,因为它经常如此。
在这种情况下,OnTick将简单地跳过计算时出现的事件,而在第一个新的、相关的事件上触发。在OnBook变体中,为了释放队列(跳过无用的事件),你必须自己制作拐杖。
你有了它,这很好。
我答应告诉你,与OnBook相比,OnTick的另一个优势。这是因为OnBook是保证交付的,如果它有哪怕一点点繁重的计算(或者,上帝保佑,交易),它可以积累一个相当大的事件队列,这些 事件没有任何意义(它们不包含与事件相关的信息)。这就是优势转为劣势的地方,因为它经常如此。
在这种情况下,OnTick将简单地跳过计算时出现的事件,而在第一个新的、相关的事件上触发。在OnBook的变体中,为了释放队列(跳过无用的事件),你必须自己制作拐杖。
就个人而言,我在交易操作中使用异步 订单。
问题是(如果你认真地在交易所交易),你需要市场的所有 变化。
而且这一事件越早到来越好。
此外,你还需要询问和出价量...
我自己认为,除了OnBook,没有 其他选择。
我不使用交易外汇。
在CopyTick 的例子中,你只得到结构的最后一个元素,事实上只有最好的价格。
运行上述代码,结果发现
s_tick.flags = 0
:)
同样的刻度线,在调用SymbolInfoTick 时--没有标志:)
添加
我们得到了一个虱子,但我们不知道谁 "创造 "了它。
滴答时间是怎么回事?
这看起来很荒谬。我 们从时间为19:36:54.735 的新数据包中收到刻度线,但SymbolInfoTick得到的刻度线 "领先 "900ms。
来自SymbolInfoTick 的帮助
美丽的主题,很多有趣的东西,谢谢大家。
不开玩笑,不戏谑...
只要不拆解代码,我就会考虑......
滴答的时间到底是怎么回事?
这很荒唐。我们从时间为19:36:54.735 的新数据包中提取刻度线,但通过调用SymbolInfoTick,我们得到了一个 "提前 "900ms的刻度线。
来自参考资料
真的很奇怪,Bid值都是一样的,但SymbolInfoTick 时间却不同。
真的很奇怪,所有的Bid值都是一样的,但SymbolInfoTick的时间却不同。
看上去终端机 "随心所欲 "地安排时间 :)
当地时间 过去了将近4秒!这是个好兆头。
这肯定是不可能的!
而在这里,一切都很正常。
看起来,终端正在 "随心所欲 "地安排时间 :)
当地时间已经过去了将近4秒!
这不可能是正确的!
日志显示,OnTick 比OnBookEvent 快4秒捕捉到相同的滴答。
根据日志显示,OnTick 比OnBookEvent 快了4秒。
现实中绝对不可能是这样的。
因为蜱虫已经进入终端(即新的蜱虫包已经到达)。
现实中绝对不可能是这样的。
因为蜱虫已经进入终端(即新的蜱虫包已经到达)。
但我看了看日志,日志中一个和一个相差4秒的刻度线来了。
p.s.
我真的不喜欢 "不可能 "这句话,我已经习惯了一切都可能发生的事实。
顺便说一句,也许这离主题很远,但有一次对地球是圆的论断,也是这样说的--"不可能。
一般来说,我总是有疑问,直到我检查,然后再重复检查,最好是别人重复检查几次。
你确定你的代码没有搞砸--形成日志,处理数据?
这个代码创造了奇迹,有4秒的差异?