实时的提基 - 页 10

 
prostotrader:

投资者 :FfiR87ty(只读密码)

更多账户号码

 
prostotrader:

你说你没看过是什么意思?

这些是什么?

这些是具有相同价格的蜱虫,不知何故进入了杂志(它们不应该这样)。他们为什么能进来--我去检查一下《发现》。

没有跳过。

 
Andrey Khatimlianskii:

只有一个粉丝,那就是你。

我的工作是处理技术信息。

在这个问题上,分析玻璃的任务根本就不是这个任务。根据任务条款,没有价格变化的刻度线是不需要的。

我明白了,认为 你已经赢了(只是傻乎乎地继续为显而易见的情况),但一点也 令人信服!

同样,每个人都会选择做什么和怎么做!

好运!

 
Andrey Khatimlianskii:

你还需要一个账户号码

实践


 
prostotrader:

你,我不认为是故意的,只打了一个勾。

因此,你会错过该时间(0,即当前时间)之前的所有内容

在我的实现中,所有的蜱虫都被考虑在内。

你的代码不适合这种测试!

你,除其他事项外,注意力不集中。

        if ( last_tick_time <= 0 )
        {
                if ( CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, 0, 1 ) > 0 )
...
        }
        if ( last_tick_time > 0 )
        {
                int new_ticks = CopyTicks( _Symbol, cur_ticks, COPY_TICKS_ALL, last_tick_time, 0 );

如果没有它,EA将总是在每个事件处理程序中获得一个刻度,而情况并非如此。

 
prostotrader:

我明白了,认为 你赢了(只是傻乎乎地继续说下去,因为情况很明显),但一点也 令人信服!

同样,每个人都会选择做什么和怎么做!

好运!

天才!

你进来了,不理解这个问题,挥舞着你的FORTS旗帜,对事件处理程序进行误导,在被证明是错误的情况下,祝你好运并离开。

而最重要的是,你仍然不明白自己错在哪里。


也祝您好运!

 
prostotrader:

实践

谢谢,连接。

结果是类似的,与OnTick相比,OnBOOK常常被延迟。


而在什么情况下,OnTick可以明显更好 (甚至在FORTS上!包括,对你来说!),当你承认错误时,我会告诉你。

 

顺便说一下,瓦西里-索科洛夫有一篇 关于正确收集蜱虫的优秀文章。它详细论述了同步过程(我没有这个过程,它有时会导致打印出相同的刻度线)。

Но функция CopyTiks не позволяет запрашивать N последних тиков. Вместо этого она предоставляет все тики, пришедшие с указанного момента времени. Это усложняет задачу. Мы должны выполнить запрос, получить массив тиков и сравнить его с массивом тиков, полученным на предыдущем обновлении. При этом мы выясним, какие из вновь пришедших тиков не входили в "прошлую поставку", то есть являются новыми. Но сравнивать тики между собой напрямую невозможно, просто потому что видимых различий между ними может вообще не быть. Например, обратимся к нижеприведенной таблице сделок:

图5.所有交易的表格,有一个相同交易的例子。

我们立即看到两组绝对相同的虱子。它们被标记为红色框架,具有相同的时间、数量、方向和价格。因此,我们看到,不可能将单个蜱虫相互比较。

但有可能对一组 蜱虫进行比较。如果两组刻度线彼此相等,我们可以得出结论,这些刻度线和后面的刻度线在上一次价格更新期间已经被分析过。

Пишем скальперский стакан цен на основе графической библиотеки CGraphic
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
  • www.mql5.com
Именно с этой, улучшенной и дополненной версией мы и начнем работать, чтобы постепенно превратить ее в скальперский стакан цен. Краткий обзор графической библиотеки CPanel Созданию пользовательских интерфейсов в MQL5 посвящено много статей. Среди них особенно выделяется серия Анатолия Кажарского "Графические интерфейсы", после которой сложно...
 
我已经写了一个测试的专家顾问。
int OnInit()
{
  return(!MarketBookAdd(_Symbol)); // Подписались на стакан.
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol); // Отписались от стакана.
}

// Получает BestBands
bool GetBidAsk( double &PriceBid, double &PriceAsk, const MqlBookInfo &MarketDepth[] )
{  
  PriceAsk = 0;
  
  const int Size = ArraySize(MarketDepth);
  int Pos = 0;
  
  while ((Pos < Size) && (MarketDepth[Pos].type == BOOK_TYPE_SELL))
  {
    PriceAsk = MarketDepth[Pos].price;
    
    Pos++;
  }
    
  PriceBid = (Pos < Size) ? MarketDepth[Pos].price : 0;
  
  return(true);
}

// Получает последний известный тик.
bool GetLastTick( const string &Symb, MqlTick &Tick )
{
  static MqlTick Ticks[1];
  
  const bool Res = SymbolInfoTick(Symb, Tick) && (CopyTicks(Symb, Ticks, COPY_TICKS_INFO, 0, 1) == 1);
  
  if (Res && (Ticks[0].time_msc > Tick.time_msc))
    Tick = Ticks[0];
  
  return(Res);
}

// Получает тики через стакан и стандартным методом.
bool GetLastTicks( const string &Symb, MqlTick &Tick, MqlTick &TickBook )
{
  MqlBookInfo MarketDepth[];

  return(MarketBookGet(Symb, MarketDepth) && GetLastTick(Symb, Tick) && GetBidAsk(TickBook.bid, TickBook.ask, MarketDepth));
}

// Сравнивает тики.
bool IsDiff( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.bid != Tick2.bid) || (Tick1.ask != Tick2.ask));
}

#define  TOSTRING(A) (FuncName + " " + #A + ": " + (string)A.bid + "/" + (string)A.ask + "\n")

// Распечатываем тики, полученные разными способами.
void TestFunc( const string FuncName )
{
  static MqlTick Tick = {0};
  static MqlTick Book = {0};

  if (GetLastTicks(_Symbol, Tick, Book))
    Print((IsDiff(Tick, Book) ? "* " : NULL) + TOSTRING(Tick) + TOSTRING(Book)); // Если тики отличаются, добавляем '*'.
}

void OnTick()
{
  TestFunc(__FUNCTION__); // Распечатываем тики, полученные разными способами.
}

void OnBookEvent( const string &Symb )
{  
  if (Symb == _Symbol)
    TestFunc(__FUNCTION__); // Распечатываем тики, полученные разными способами.
}


结果很糟糕:在OnTick/OnBookEvent中,不同的方法收到的ticks往往不在一个On-function中。在这种情况下,我们不可能确定在哪个函数中,哪种获取勾的方法是相关的,哪种是不相关的。可怕的含糊不清。


这似乎发生在玻璃本身已经过时的时候。

 

试试这个。

//+------------------------------------------------------------------+
//|                                                   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;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
//+------------------------------------------------------------------+
//| 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 ( Mode != USE_BOOK || symbol != Symbol() ) return;
  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(__FUNCTION__, ": ",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(__FUNCTION__, ": ",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++;
        Print(__FUNCTION__, ": Pending order!");
      }
    }
  }
}

void OnTick()
{
   if ( Mode != USE_TICK ) return;
   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(__FUNCTION__, ": ", 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(__FUNCTION__, ": ", 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++;
        Print(__FUNCTION__, ": Pending order!");
      }
    }
  
}
//+------------------------------------------------------------------+

即使没有任何GetTickCount64(),你也可以看到函数是如何工作的

2020.01.31 17:01:56.363 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.294 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:57.637 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.637 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:57.690 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.690 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:57.730 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:57.730 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:58.293 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:58.294 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:50.159 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.444 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.444 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.536 Bid=1585.4 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.107 Ask=1585.5 
2020.01.31 17:01:58.519 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.326 Ask=1585.4 
2020.01.31 17:01:59.674 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:51.536 Bid=1585.4 
2020.01.31 17:01:59.861 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.107 Ask=1585.5 
2020.01.31 17:02:00.530 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:52.326 Ask=1585.4 
2020.01.31 17:02:01.189 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.216 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.7 Ask=1585.5 
2020.01.31 17:02:01.492 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!
2020.01.31 17:02:01.707 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.707 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.530 Ask=1585.4 
2020.01.31 17:02:01.967 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!
2020.01.31 17:02:01.989 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:01.989 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:55.790 Bid=1585.4 
2020.01.31 17:02:02.287 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!
2020.01.31 17:02:02.641 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:02.641 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.104 Ask=1585.5 
2020.01.31 17:02:02.888 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.050 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.050 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.691 Ask=1585.6 
2020.01.31 17:02:03.050 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.869 Bid=1585.6 
2020.01.31 17:02:03.376 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:56.869 Bid=1585.6 
2020.01.31 17:02:03.468 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.708 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:03.708 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:57.286 Ask=1585.5  Bid=1585.5 
2020.01.31 17:02:03.708 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:57.440 Ask=1585.6  Bid=1585.6 
2020.01.31 17:02:04.860 Ticks_test (GOLD-3.20,H1)       OnTick: 2020.01.31 17:01:47.889 Ask=1585.4 
2020.01.31 17:02:04.860 Ticks_test (GOLD-3.20,H1)       OnBookEvent: 2020.01.31 17:01:57.440 Ask=1585.6  Bid=1585.6 
附加的文件:
20200131.log  28 kb