实时的提基 - 页 19

 
Yuriy Zaytsev:

另外,为了避免担心Symbol()会占用时间,那么就让两个处理程序平等地 "喂"。

我们可以用一个预定义变量_Symbol来代替Symbol()函数

 

Symbol() 与此毫无关系。日志中的时间是正确的。

延迟是在事件队列或SymbolInfo函数中。

这就是我所说的。


因此,如果你需要玻璃,请与OnBook合作。如果不需要,在OnTick中工作(没有队列和不必要的调用)。

剩下要弄清楚的是以最快的方式获得两种方法的实际勾股历史。

我认为,如果只需要最后一个刻度,SymbolInfo更好。如果我们需要没有间隙的历史,那么只有CopyTicks。

 
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中,我以后再编码。

 

想先把代码测试一下

//---
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进行比较。

 
Aleksey Mavrin:

想先把代码测试一下

但我因为一些事情不能打开模拟开账户。时间可能出了问题,还是有其他问题?



然后,用代码进行dopilize,以准确地从一个事件tick进行比较。

你必须在他们的网站上打开它。然后他们向邮局发送一个代码。

 
Andrey Khatimlianskii:


我认为如果只需要最后一次打勾,SymbolInfo更好。如果你需要没有跳过的历史,那么只有CopyTicks。

问题是,即使在 "高流动性 "的工具上,紧急市场(FORTS)也非常薄弱。

这意味着在合适的价格下,你能买到的合同数量 非常有限,所以我们需要的不仅仅是价格。

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


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

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

你可以使用MarketBookGet() 只与MarketBookAdd配对,获得市场杯的变化。

在OnBookEvent中。你可以添加市场(MarketBookAdd)并使用OnTck()的MarketBookGet()

但在这种情况下,我们会错过市场的一些其他变化 不是在最佳价格的挂单)。

诚然,市场可能会利用这一点,从传入的点位中建立市场滑点,但真的有必要 吗?

由以下人员添加

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

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

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

 
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, в которую будут помещены текущие цены и время последнего обновления цен.

也就是说,只有时间和价格,但没有数量。

 

对于交易所交易的工具(尤其是FORTS),重要的不仅仅是价格。

但也是该价格的合同量!

 

试着用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);
    }  
  }
}
//+------------------------------------------------------------------+
 

你把一切都搞乱了。

我之前写过,交易和level2是不同的数据订阅,所以它们是不同的事件处理程序。
这就是为什么交易应该从OnTick中调用,而成交量团伙从OnBook中调用
你试图从OnBook事件中调用交易,从OnTick中调用帮派。认为OnBook的交易速度会更快。
它不会更快,我认为比较两个事件处理程序是一种错觉,每个事件处理程序都致力于自己的数据流。
我明白这都是实验,但如果不了解有两个数据流(交易和Level2)的逻辑,你会无休止地混淆这些OnTick和OnBook处理程序。