实时的提基 - 页 3

 
Aleksey Mavrin:

老实说,我不明白你想让我在这个链接中读到什么关于ECN的内容,尤其是一些以前不知道的东西)

我有吗?是你想要的东西。)))

你不了解外汇市场和交易所之间的区别,所以我给了你链接。

请不要在交流部分乱放外汇。

 
Sergey Chalyshev:

我想这样做吗?你是那个想要什么的人。)))

你不明白外汇和交易所的区别,所以我给了你链接。

请不要在交流部分乱放外汇。

是的,我真的希望人们能够清楚地交流,但这是无法实现的,所以我们必须满足于我们所拥有的。

而且你可能也不明白一些事情,你想过吗?以你发布的链接为例)

还有一件事--我不是那个一开始就提到外汇的人,我正在介入已经开始的讨论。首先。

B 2 - 有人禁止在交流部分进行讨论,将不同的市场与股票市场进行比较?

还有3--让我们停止标点符号的使用,就像滑雪者与滑雪板运动员一样,或者你反对这样做?

 

一个小总结,有关于抽搐分析的实验。

1.OnTick处理程序跳过了大量的ticks。
所以,如果你想通过传入的tick来分析一条条的交易,那就没有意义了。
采用这种方法,在测试器中的算法结果和真实的交易结果将是不同的。

作为一种选择,你可以通过使用CopyTicks()或CopyTicksRange()函数来获取历史上的ticks,从而分析选定时期或一定数量的最后一次交易的条形。
在这种情况下,在测试器中测试算法的结果和真实交易结果是一样的。
其缺点是算法的性能较低。

2.OnBookEvent的事件数量远远大于历史上的ticks数量,这是可以理解的,因为除了ticks之外,这个事件还处理ticks的变化。
因此,似乎所有传入的ticks都可以用这个事件进行分析。
然而,情况并非如此,并不是所有的交易都会通过滴答。
市场订单可能不会通过滑块,但它们会反映在交易反馈中。
其原因是,市场滑块实际上是一个订单簿,如果所需条件得到满足,这些订单就会等待执行。

例子 - 一个交易没有通过OnEventBook处理程序(这多达5个点)。

MT5

与第一种变体一样,解决方案也是对历史数据的分析。
这种解决方案的缺点是不可能在测试器中进行测试。测试器中的刻度线变化的事件没有产生。

3.嘀嗒标志中没有记录的8位从未得到答复。我在另一个论坛主题中也问了同样的问题。

我已经决定了分析各行业的进货方式--通过历史,尽管生产力下降。
这使我在测试器中测试算法时能够得到可靠的结果。

谢谢大家的想法和讨论。

 
Vladimir Mikhailov:

一个小总结,有关于抽搐分析的实验。

1.OnTick处理程序跳过了大量的ticks。
所以,如果你想通过传入的tick来分析一条条的交易,那就没有意义了。
采用这种方法,在测试器中的算法结果和真实的交易结果将是不同的。

作为一种选择,你可以通过使用CopyTicks()或CopyTicksRange()函数来获取历史上的ticks,从而分析选定时期或一定数量的最后一次交易的条形。
在这种情况下,在测试器中测试算法的结果和真实交易结果是一样的。
其缺点是算法的性能较低。

2.OnBookEvent的事件是显著的.....
但事实并非如此,并不是所有的交易都要经过这本书。

例子 - 一个交易没有经过OnEventBook处理程序(而且是5个点那么多)。

3.嘀嗒标志中没有记录的8位从未得到答复。我在另一个论坛主题中也问了同样的问题。


2.请公布你的tick builder的代码(我肯定你做错了什么)。

3.在打印机中,做EnumToString(flags)的动作

 
prostotrader:

2.发布你的打钩器代码(我肯定你做错了什么)。

3.在打印机中做EnumToString(flags)

代码是通常的、最小的。OnBookEvent获得最后一个已知的勾选,并将其打印出来

//+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link      "mikh.vl@gmail.com"
#property version   "1.00"
MqlTick tick[1];
int counter=0;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MarketBookAdd(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string&  symbol)
  {
   CopyTicks(_Symbol,tick,COPY_TICKS_ALL,0,1);
   counter++;
   if((tick[0].flags&TICK_FLAG_BID)==TICK_FLAG_BID || (tick[0].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      {
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, DoubleToString(tick[0].ask,_Digits), DoubleToString(tick[0].bid,_Digits));
      }
   else if((tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY || (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      {
       type=(tick[0].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY? "Buy": (tick[0].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL? "Sell": "";
       printf("Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s", _Symbol, counter, tick[0].flags, TimeToString(tick[0].time,TIME_MINUTES|TIME_SECONDS),tick[0].time_msc%1000, tick[0].volume_real, type, DoubleToString(tick[0].last,_Digits));
      }  
  }
//+------------------------------------------------------------------+

关于第三点--刻度线不是一个枚举,所以EnumToString函数对它们不适用。

 
Vladimir Mikhailov:

代码是朴素的,最小的。OnBookEvent事件获得最后一个已知的勾选,并将其打印出来。

关于第三点--刻度线不是一个枚举,所以EnumToString函数对它们不适用。

你复制1个勾,并希望没有跳过:)

OnBookEvent()是由tick中的任何变化触发的,但在一个时间点上

可能会有几个虱子。终端收到的不是一个tick,而是一包tick。

我推荐的指标(所有交易的胶带)有一个描述

在俄罗斯。不要偷懒,读一读吧。

 
prostotrader:

你复制了1个勾,并希望没有跳过:)

OnBookEvent()是由玻璃的任何变化触发的,但在一个时间点上

可以有几个小点。终端收到的不是一个tick,而是一包tick。

我推荐的指标(所有交易的胶带)有一个描述

在俄罗斯。不要偷懒去读它。

观看不止一次的打勾,是对历史的颠覆。

 
Vladimir Mikhailov:

观看不止一次的嘀嗒声是对历史的一种呼吁。

你根本不了解终端的工作原理。

阅读指标中的评论!!!。

//+------------------------------------------------------------------+
//|                                                   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;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
    }  
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
       int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
       if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         last_time = ticks[0].time_msc + 1;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_ASK
2020.01.29 10:51:42.077 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.121 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:42.194 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:50.903 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.235 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:51:52.399 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:05.174 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_BID
2020.01.29 10:52:24.630 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST
2020.01.29 10:52:28.027 Ticks_test (GOLD-3.20,M1)       Tick is TICK_FLAG_LAST

添加

在上面的例子中,并不是所有的蜱虫都被 "捕获",因为新到的蜱虫包

可能包含有以前的时间的蜱虫。

仔细研究代码 "Ribbon of all trades"(它有注释)。

 

如果你觉得理解指标代码很困难(或懒惰),那么

请看更简单的代码,一个适当的实时收集器的所有刻度 的代码

//+------------------------------------------------------------------+
//|                                                   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_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         for(int i= 0; i<result; i++)
         {
           if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
           if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
           if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
           if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
           if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
           if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
           Print("Unknown flag is ", ticks[i].flags);
         }
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          for(int i= 0; i<result; i++)
          {
            if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
            if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
            if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
            if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
            if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
            if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
            Print("Unknown flag is ", ticks[i].flags);
          }
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader:

请看更简单的代码,以获得一个 适当的实时收集器来收集所有刻度

如果无论如何都要使用CopyTicks,为什么要 "实时 "收集它们?

你可以在任何时候把刻度线复制到正确的深度。