实时的提基 - 页 5

 
Aleksey Mavrin:

蜱虫不能同时拥有一个以上的标志吗?

你是对的,我做到了。

//+------------------------------------------------------------------+
//|                                                   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;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  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);
  }   
  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.ask):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
     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 OnTick()
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    if(is_first == true)
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        Print("First packet of ticks:");
        t_cnt = 0;
        for(int i= 0; i<result; i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
          Print(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(GetTickDescription(ticks[i]));
          } 
          if(last_time == ulong(ticks[0].time_msc))
          {
            t_cnt += int(mem_cnt);
          }
          else last_time = ulong(ticks[0].time_msc + 1);
        }
        else
        {
          t_cnt = 0;
          last_time++;
        }
      }
      else
      {
        t_cnt = 0;
        last_time++;
      }
    }
  }
}
//+------------------------------------------------------------------+
我已经展示了所有标记收集器的原理,你可以随意使用这段代码(提取所有标记)。
 
Aleksey Mavrin:

但这是否意味着可以保证你能处理所有的OnBookEvent事件?

手段

 
prostotrader:

重复进行

OnBookEvent()恰恰是 一批蜱虫到来的保证!

你有一个股票代号。

OnTick确切地说是指一个tick的到来,而你可以通过CopyTicks获得整个包。

此外,你可以从任何地方(甚至从图表事件)获得它们。OnBookEvent有自己的目的,你不必把它捅到你想或不想的地方。


娼者。

从参考资料来看。

发放。 终端在缓存中为每个字符存储了4096个最后的刻度,以便快速访问(对于堆栈运行字符,65536个刻度),对这些数据的查询最快的

结束语:----

如果你不能得到足够的4K最后的刻度,那么通过各种方式订阅堆栈。但我无法想象哪里会需要这样做(除了第一次运行)。

 
prostotrader:

手段

是的,如果你只想得到一个勾选历史,你根本不必收集这些事件的队列并处理它们。

 
Andrey Khatimlianskii:

你有一个股票代号。

OnTick确切地说是指一个tick的到来,你可以通过CopyTicks获得整个包。

更重要的是,你可以从任何地方(甚至从图表事件)获得它们。OnBookEvent有自己的用途,你不必把它捅到你想或不想的地方。


如果你没有足够的4K最后一击,那么当然要订阅tumblr。但我无法想象哪里可能需要它(除了第一次运行外)。

安德鲁!

该主题被称为"实时蜱虫"

没有必要100次指出,可以通过计时器或其他东西上的OnTick()事件来接收ticks。

 
prostotrader:

安德烈!

该主题被称为"实时蜱虫"

没有必要指出100次,你可以通过定时器上的OnTick()事件或其他什么东西来获得ticks。

正是如此!而OnBookEvent与OnTimer的主题有相同的相关性

 
Andrey Khatimlianskii:

正是如此!而OnBookEvent和OnTimer一样,与主题有很大关系。

今年在一个股票工具上运行

//+------------------------------------------------------------------+
//|                                                   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;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    Print(__FUNCTION__ + " Tick is done!");
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      Print(__FUNCTION__ + " Tick is done!");
    }
   
  }
//+------------------------------------------------------------------+
 
prostotrader:

今年在股票工具上推出

谢谢,我知道它是如何工作的。

试想一下,可能有一种与你不同的交易方法。

 
Andrey Khatimlianskii:

谢谢你,我知道它是如何工作的。

试想一下,可能有一种与你不同的交易方法。

安德烈(恕我直言)。

你为什么要 "乱来"?

或者说,你不知道实时获取和从历史中获取的区别 吗?

而这与另一种交易方式有什么关系呢?

每个人都 按照自己的想法进行交易和编写机器人!

由以下人员添加

不喜欢我的 实时获取蜱虫的版本?

然后发布你 版本!

那么让我们来看看不同的方法...

 
prostotrader:

安德烈(恕 我直言)

你为什么要 "乱来"?

或者说,你不知道实时获取和从历史中获取的区别 吗?

而这与另一种交易方式有什么关系呢?

每个人都 按照自己的想法进行交易和编写机器人!

由以下人员添加

不喜欢我的 实时获取蜱虫的版本?

然后发布你 版本!

那么让我们来看看不同的方法...

在你的代码中用 OnTick替换OnBookEvent,并比较结果。