实时的提基 - 页 19 1...121314151617181920212223242526 新评论 Roman 2020.02.04 21:07 #181 Yuriy Zaytsev: 另外,为了避免担心Symbol()会占用时间,那么就让两个处理程序平等地 "喂"。 我们可以用一个预定义变量_Symbol来代替Symbol()函数 Andrey Khatimlianskii 2020.02.04 21:49 #182 Symbol() 与此毫无关系。日志中的时间是正确的。 延迟是在事件队列或SymbolInfo函数中。 这就是我所说的。 因此,如果你需要玻璃,请与OnBook合作。如果不需要,在OnTick中工作(没有队列和不必要的调用)。 剩下要弄清楚的是以最快的方式获得两种方法的实际勾股历史。 我认为,如果只需要最后一个刻度,SymbolInfo更好。如果我们需要没有间隙的历史,那么只有CopyTicks。 Aleksey Mavrin 2020.02.05 03:53 #183 Andrey Khatimlianskii: Symbol()与此毫无关系。日志中的时间是正确的。 延迟是在事件队列 或SymbolInfo函数中。 这就是我所说的。 我同意Symbol不能咀嚼很多,但可以做出一些贡献,当然为了测试的纯洁性,在 任何电话之前 都要花时间。 至于队列--我对这一点很好奇--在理想条件下,OnBook能落后于同样的OnTick多远。即:当只有这个Symbol被订阅时,终端不忙于其他事情,等等,是什么原因造成的。 到目前为止,我不能同意这只是队列的问题,因为如果处理程序不做任何事情,那么5-6个OnBooks的队列不应该比检查Symbol的操作消耗更多。 我们应该去掉所有的检查,看看在同一个tick中,OnTick和OnBook之间 有什么区别。 void OnBookEvent(const string &symbol) { ul=GetMicrosecondCount(); Print(__FUNCTION__, "; Time: ", ul, " mcs"); } void OnTick() { ul=GetMicrosecondCount(); Print(__FUNCTION__, "; Time: ", ul, " mcs"); } //+-- ap: 很明显,贪婪的Print不允许干净地检查,因为队列会因为Print而变长) 我必须把没有打印的时间放在数组ulong中,然后已经每5分钟一次,把所有的东西都输出到Prints中,我以后再编码。 Aleksey Mavrin 2020.02.05 05:40 #184 想先把代码测试一下 //--- bool is_book; enum ENUM_BOOK_OR_TICK { USE_BOOK, // Use OnBookEvent USE_TICK // Use OnTick }; input ENUM_BOOK_OR_TICK Mode = USE_BOOK; input int SecForPrint = 120; ulong TimeArrayBook[65536]; ulong TimeArrayTick[65536]; ushort curBook,curTick; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { curBook=0; curTick=0; ArrayInitialize(TimeArrayBook,INT_MAX); ArrayInitialize(TimeArrayTick,INT_MAX); if(Mode == USE_BOOK) is_book = MarketBookAdd(Symbol()); if (EventSetTimer(SecForPrint)) return(INIT_SUCCEEDED); else return (INIT_FAILED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(Mode == USE_BOOK) { if(is_book == true) MarketBookRelease(Symbol()); } } //+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { TimeArrayBook[curBook++]=GetMicrosecondCount(); } void OnTick() { TimeArrayTick[curTick++]=GetMicrosecondCount(); } //+------------------------------------------------------------------+ void OnTimer() { int total=MathMax(curBook,curTick); int i=0,k=0; while(i<total) { while(i<total && TimeArrayBook[i]<TimeArrayTick[k]) { Print("Book ",TimeArrayBook[i++]); } if(k<curTick-1) { Print("Tick ",TimeArrayTick[k++]); } i++; } if (curTick>0)Print("Tick ",TimeArrayTick[curTick-1], " last"); curBook=0; curTick=0; } //--- 但我因为一些事情不能打开模拟开账户。时间可能出了问题,还是有其他问题? 然后,用代码进行dopilize,以准确地从一个事件tick进行比较。 Artyom Trishkin 2020.02.05 07:45 #185 Aleksey Mavrin: 想先把代码测试一下 但我因为一些事情不能打开模拟开账户。时间可能出了问题,还是有其他问题? 然后,用代码进行dopilize,以准确地从一个事件tick进行比较。 你必须在他们的网站上打开它。然后他们向邮局发送一个代码。 prostotrader 2020.02.05 12:15 #186 Andrey Khatimlianskii: 我认为如果只需要最后一次打勾,SymbolInfo更好。如果你需要没有跳过的历史,那么只有CopyTicks。 问题是,即使在 "高流动性 "的工具上,紧急市场(FORTS)也非常薄弱。 这意味着在合适的价格下,你能买到的合同数量 非常有限,所以我们需要的不仅仅是价格。 这个价格的合同量是 非常重要的。 而SymbolInfo并没有给出这个价格的数量。 由于这个原因,我们需要使用MarketBookGet()来提供整本书的价格和数量。 你可以使用MarketBookGet() 只与MarketBookAdd配对,获得市场杯的变化。 在OnBookEvent中。你可以添加市场(MarketBookAdd)并使用OnTck()的MarketBookGet()。 但在这种情况下,我们会错过市场的一些其他变化( 不是在最佳价格的挂单)。 诚然,市场可能会利用这一点,从传入的点位中建立市场滑点,但真的有必要 吗? 由以下人员添加 而且我不同意当OnTck()被触发时,我们可以从历史中获得ticks。 通过记住最后的tick时间,当OnTck()被触发时,我们可以得到ticks 实时有新的tick(s)出现--触发OnTck()后,我们立即 读取,也就是说,它不是历史。 prostotrader 2020.02.05 12:18 #187 Andrey Khatimlianskii:现在要做的是找出最快的方法来获得这两种方法的实际蜱虫历史。 我的OnTick()与OnBook相同或稍快(但OnBook有巨大延迟)。 我在测试函数的速度(微秒)。 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 OnTick - имеется ввиду CopyTicks из OnTick 最快的是SymbolInfoTick,但这个函数并不把体积放在tick里!它是一个很好的例子。 请看帮助。 tick [out] Ссылка на структуру типа MqlTick, в которую будут помещены текущие цены и время последнего обновления цен. 也就是说,只有时间和价格,但没有数量。 prostotrader 2020.02.05 12:48 #188 对于交易所交易的工具(尤其是FORTS),重要的不仅仅是价格。 但也是该价格的合同量! prostotrader 2020.02.05 13:56 #189 试着用OnTick()取玻璃--巨大的延迟 "通过眼睛"可以清楚地看到! //+------------------------------------------------------------------+ //| 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; MqlBookInfo BookInfo[]; int book_cnt; struct MARKET_DATA { double ask; long ask_vol; double bid; long bid_vol; double prev_ask; long prev_ask_vol; double next_bid; long next_bid_vol; }; MARKET_DATA m_data; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { is_book = MarketBookAdd(Symbol()); if(is_book == false) { Alert("No add book!"); return(INIT_FAILED); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(is_book == true) MarketBookRelease(Symbol()); } //+------------------------------------------------------------------+ //| Expert OnTick function | //+------------------------------------------------------------------+ bool GetBook(const string a_symb, int &cnt) { cnt = 0; if(MarketBookGet(a_symb, BookInfo) == true)//getBook ) { m_data.ask = 0; m_data.ask_vol = 0; m_data.prev_ask = 0; m_data.prev_ask_vol = 0; m_data.bid = 0; m_data.bid_vol = 0; m_data.next_bid = 0; m_data.next_bid_vol = 0; cnt = ArraySize(BookInfo); if(cnt > 0) { for(int i = 0; i < cnt; i++) { if(BookInfo[i].type == BOOK_TYPE_BUY) //Стакан агрегирован, т.е от наибольшего Sell к наименьшему Buy { if((i + 1) <= (cnt- 1)) { m_data.ask = BookInfo[i-1].price; m_data.ask_vol = BookInfo[i-1].volume; m_data.prev_ask = BookInfo[i-2].price; m_data.prev_ask_vol = BookInfo[i-2].volume; m_data.bid = BookInfo[i].price; m_data.bid_vol = BookInfo[i].volume; m_data.next_bid = BookInfo[i+1].price; m_data.next_bid_vol = BookInfo[i+1].volume; break; } else break; } } return(true); } } return(false); } //+------------------------------------------------------------------+ //| Expert OnTick function | //+------------------------------------------------------------------+ void OnTick() { if(GetBook(Symbol(), book_cnt) == true) { if(book_cnt >= 4) { Print("Prev Sell: ask = ", m_data.prev_ask, " volume = ",m_data.prev_ask_vol); Print("Sell: ask = ", m_data.ask, " volume = ",m_data.ask_vol); Print("Buy: bid = ", m_data.bid, " volume = ",m_data.bid_vol); Print("Next Buy: bid = ", m_data.next_bid, " volume = ",m_data.next_bid_vol); } } } //+------------------------------------------------------------------+ Roman 2020.02.05 15:25 #190 你把一切都搞乱了。 我之前写过,交易和level2是不同的数据订阅,所以它们是不同的事件处理程序。这就是为什么交易应该从OnTick中调用,而成交量团伙从OnBook中调用。 你试图从OnBook事件中调用交易,从OnTick中调用帮派。认为OnBook的交易速度会更快。 它不会更快,我认为比较两个事件处理程序是一种错觉,每个事件处理程序都致力于自己的数据流。 我明白这都是实验,但如果不了解有两个数据流(交易和Level2)的逻辑,你会无休止地混淆这些OnTick和OnBook处理程序。 1...121314151617181920212223242526 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
另外,为了避免担心Symbol()会占用时间,那么就让两个处理程序平等地 "喂"。
我们可以用一个预定义变量_Symbol来代替Symbol()函数
Symbol() 与此毫无关系。日志中的时间是正确的。
延迟是在事件队列或SymbolInfo函数中。
这就是我所说的。
因此,如果你需要玻璃,请与OnBook合作。如果不需要,在OnTick中工作(没有队列和不必要的调用)。
剩下要弄清楚的是以最快的方式获得两种方法的实际勾股历史。
我认为,如果只需要最后一个刻度,SymbolInfo更好。如果我们需要没有间隙的历史,那么只有CopyTicks。
Symbol()与此毫无关系。日志中的时间是正确的。
延迟是在事件队列 或SymbolInfo函数中。
这就是我所说的。
我同意Symbol不能咀嚼很多,但可以做出一些贡献,当然为了测试的纯洁性,在 任何电话之前 都要花时间。
至于队列--我对这一点很好奇--在理想条件下,OnBook能落后于同样的OnTick多远。即:当只有这个Symbol被订阅时,终端不忙于其他事情,等等,是什么原因造成的。
到目前为止,我不能同意这只是队列的问题,因为如果处理程序不做任何事情,那么5-6个OnBooks的队列不应该比检查Symbol的操作消耗更多。
我们应该去掉所有的检查,看看在同一个tick中,OnTick和OnBook之间 有什么区别。
ap: 很明显,贪婪的Print不允许干净地检查,因为队列会因为Print而变长)
我必须把没有打印的时间放在数组ulong中,然后已经每5分钟一次,把所有的东西都输出到Prints中,我以后再编码。
想先把代码测试一下
但我因为一些事情不能打开模拟开账户。时间可能出了问题,还是有其他问题?
然后,用代码进行dopilize,以准确地从一个事件tick进行比较。
想先把代码测试一下
但我因为一些事情不能打开模拟开账户。时间可能出了问题,还是有其他问题?
然后,用代码进行dopilize,以准确地从一个事件tick进行比较。
你必须在他们的网站上打开它。然后他们向邮局发送一个代码。
我认为如果只需要最后一次打勾,SymbolInfo更好。如果你需要没有跳过的历史,那么只有CopyTicks。
问题是,即使在 "高流动性 "的工具上,紧急市场(FORTS)也非常薄弱。
这意味着在合适的价格下,你能买到的合同数量 非常有限,所以我们需要的不仅仅是价格。
这个价格的合同量是 非常重要的。
而SymbolInfo并没有给出这个价格的数量。
由于这个原因,我们需要使用MarketBookGet()来提供整本书的价格和数量。
你可以使用MarketBookGet() 只与MarketBookAdd配对,获得市场杯的变化。
在OnBookEvent中。你可以添加市场(MarketBookAdd)并使用OnTck()的MarketBookGet()。
但在这种情况下,我们会错过市场的一些其他变化( 不是在最佳价格的挂单)。
诚然,市场可能会利用这一点,从传入的点位中建立市场滑点,但真的有必要 吗?
由以下人员添加
而且我不同意当OnTck()被触发时,我们可以从历史中获得ticks。
通过记住最后的tick时间,当OnTck()被触发时,我们可以得到ticks
实时有新的tick(s)出现--触发OnTck()后,我们立即 读取,也就是说,它不是历史。
现在要做的是找出最快的方法来获得这两种方法的实际蜱虫历史。
我的OnTick()与OnBook相同或稍快(但OnBook有巨大延迟)。
我在测试函数的速度(微秒)。
OnTick - имеется ввиду CopyTicks из OnTick
最快的是SymbolInfoTick,但这个函数并不把体积放在tick里!它是一个很好的例子。
请看帮助。
tick [out] Ссылка на структуру типа MqlTick, в которую будут помещены текущие цены и время последнего обновления цен.
也就是说,只有时间和价格,但没有数量。
对于交易所交易的工具(尤其是FORTS),重要的不仅仅是价格。
但也是该价格的合同量!
试着用OnTick()取玻璃--巨大的延迟 "通过眼睛"可以清楚地看到!
你把一切都搞乱了。
我之前写过,交易和level2是不同的数据订阅,所以它们是不同的事件处理程序。
这就是为什么交易应该从OnTick中调用,而成交量团伙从OnBook中调用。
你试图从OnBook事件中调用交易,从OnTick中调用帮派。认为OnBook的交易速度会更快。
它不会更快,我认为比较两个事件处理程序是一种错觉,每个事件处理程序都致力于自己的数据流。
我明白这都是实验,但如果不了解有两个数据流(交易和Level2)的逻辑,你会无休止地混淆这些OnTick和OnBook处理程序。