实时的提基 - 页 20

 
Roman:

你把一切都搞得一团糟。

正如我之前写的,交易和level2是不同的数据订阅,所以它们是不同的事件处理程序。
这就是为什么交易需要从OnTick中调用,而交易量团伙需要从OnBook中调用
你试图从OnBook事件中调用交易,从OnTick中调用帮派。同时认为OnBook的交易速度会更快。
它不会更快,我认为比较为每个不同数据线程准备的两个事件处理程序是一种错觉。
我知道这都是实验,但如果不了解套接字的逻辑,你会无休止地混淆这些OnTick和OnBook处理程序。

我已经写过了,如果你没看到的话,"对我来说,OnBookEvent()没有替代品"。

还有所有的代码、结果、解释--让人明白为什么。

从你的帖子来看--你不了解...:)

也许你正在阅读这条信息

我可以通过OnBookEvent()快速而轻松地获得所有数据,而不需要使用OnTick()。

但我不能用OnTick()获得所有 数据。那么我为什么要使用OnTick()呢?

 
prostotrader:

我已经写过了,如果你没看到的话,"对我来说,OnBookEvent()没有替代品"。

还有所有的代码、结果、解释--让人明白为什么。

从你的帖子来看--你不清楚...:)

也许你正在阅读该主题

是的,我理解,在你的情况下,没有其他选择,这也是正确的。
我也明白你在说什么。我只是想强调这一点,交易和Level2是不同的数据流。
我们必须记住它,那些不知道它的人应该知道。
这就是为什么如果你需要交易,你应该从OnTick调用必要的函数。
如果你需要用体积或杯子的深度出价,那么必须从OnBook调用适当的函数。
从OnBook事件中获取交易,并试图从OnTick事件中获取交易量或深度,这是不正确的。
因此,我理解你只是在向别人解释,并沿途进行实验。

 
Roman:



于是我明白了,你只是在向别人解释,并沿途进行实验。

你说对了。

我7年前刚做过类似的实验,我选择了OnbookEvent()。

现在我决定检查一下是否有什么变化......。它没有。

 
prostotrader:

事实是,衍生品市场(FORTS),即使是 "高流动性 "的工具,也非常薄弱。

这意味着你可以以合适的价格 购买数量 非常有限的 合同,所以你需要的不仅仅是价格。

这个价格的合同量 非常重要的


而SymbolInfo并没有给出这个价格的数量。

因此,我们需要使用MarketBookGet()来提供整本书的价格和数量。

这与主题有什么关系?这是我被卡住的唯一原因。 我不需要OnBook来获取ticks,因为OnTick肯定不会慢。

还有,为什么对OnBook的不可或缺性各说了20遍?有人怀疑吗?


prostotrader:

而且我不同意当OnTck()被触发时,我们可以从历史中获得ticks。

通过记住最后的tick时间,当OnTck()被触发时,我们可以得到ticks

一个新的tick(s)实时出现 - OnTck()被触发,我们立即 读取它,也就是说,它不是历史

任何进入终端的蜱虫都已经成为历史。

但我说的不是这个,而是建立没有空隙的磁带(SymbolInfoTick 不会有帮助)。

 
Aleksey Mavrin:

想先把代码测试一下

但我因为一些事情不能打开模拟开账户。时间可能不对,还是有更多的复杂情况?

实时的提基

prostotrader, 2020.01.31 13:18

帐户: 1007932

投资者 :FfiR87ty(只读密码)
 
Andrey Khatimlianskii:

这与本主题有什么关系?这是我进入这个领域的唯一原因,你不需要OnBook来获得ticks,因为OnTick肯定不会更慢。

还有,为什么对OnBook的不可或缺性各说了20遍?有谁在怀疑吗?

任何进入终端的蜱虫都是历史。

但这不是我说的,我说的是建立一个没有跳转的磁带(SymbolInfoTick对此没有帮助)。

你们似乎误解了对方:)))
他告诉你有数量的最佳出价套装,而你告诉他交易和成交的情况 :))
好了,我想我们都搞清楚了。

好吧,这取决于你如何看待即将到来的勾当--这就是历史。
如果对Exchange服务器来说,那么是的,它是历史,对终端来说不是这样。
因为OnTick的终端将最后的4096条记录存储在缓存中,以便热访问,然后将它们转储到磁盘的历史记录中。
然后发现它还没有完全成为历史))),也就是说,紧急关机不会把缓存保存到磁盘。
而当终端 再次启动 时,缓存中丢失的数据将从服务器下载。但这只适用于OnTick数据。
OnBook可能不会加载数据。

 

我以为每个OnTick至少有一个OnBook,但我不明白这一点。


 

把这段代码放在Opening Demo上,计算OnTick和下一个OnBook之间的平均和最大延迟。

代码在手,可能是歪的,我看看结果。

//+------------------------------------------------------------------+
//|                                                   TestOnBook.mq5 |
//|                                           Copyright 2019, Allex@ |
//|                                                 alex-all@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Allex@"
#property link      "alex-all@mail.ru"
#property version   "1.00"
//---
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 =  300;
//---
ulong TimeArrayBook[65536];
ulong TimeArrayTick[65536];
ushort curBook,curTick;
ulong  DelaySum=0,DelayCount=0;
int delay,delayMax=0;
//+------------------------------------------------------------------+
//| 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()
  {
   string out=NULL;
   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)
        {
        if(i<total)
          {
           delay=TimeArrayBook[i]-TimeArrayTick[k];
           if (delay>delayMax) 
            delayMax=delay;
           if (delay>0)
              {
                 DelaySum+=delay;
                 DelayCount++;
              }
          }
         Print("Tick ",TimeArrayTick[k++]);
        }       
        i++;
     }
     if (curTick>0)
     {
     Print("Tick ",TimeArrayTick[curTick-1], " last");
     string out="Count Event Book after Tick "+DelayCount+". Delay Average "+DoubleToString(DelaySum/DelayCount,2)+". Max "+delayMax;
     Print (out);
     Comment(out);
     }
     curBook=0;
     curTick=0;
  }
//---  
 
Andrey Khatimlianskii:

任何进入终端的蜱虫都已经是一个故事。

但这不是我说的,我说的是建立一个没有跳转的磁带(SymbolInfoTick对此没有帮助)。

好的。你关于历史的观点很清楚。

但我仍然坚持我的观点,即获取虱子的方法 将取决于

他们的阅读(来自历史或实时的)。

而且我并没有反对你关于SymbolInfoTick 和没有跳过的磁带的意见。

 

这就是今天的照片。当然,我们没有检查OnBook是否与Tick匹配,而只是取了下一个,希望如果OnTick领先于OnBook,那么相应的就会是相同或稍晚的。

当然,在没有额外检查的情况下,最大值是没有指标的,或过冲或真正的OnBook地方慢。


但这是一个能解释的人?为什么这么多的OnTickers没有运行,而它们之间没有一个OnBook?