Tiki en tiempo real - página 10

 
prostotrader:

Inversor : FfiR87ty (contraseña de sólo lectura)

Más número de cuenta

 
prostotrader:

¿Cómo que no lo has visto?

¿Qué es esto?

Se trata de garrapatas con los mismos precios que, de alguna manera, entraron en la revista (no deberían haberlo hecho). Por qué entraron - Voy a comprobar en Discover.

No hay saltos.

 
Andrey Khatimlianskii:

Sólo hay un fan, y ese eres tú.

Trabajo con información técnica.

La tarea de analizar el vidrio en este hilo no era en absoluto la tarea. Los ticks sin cambios de precio no son necesarios por las condiciones de la tarea.

Ya veo, considere que ha ganado (sólo una tontería para seguir por la obviedad de la situación), ¡pero no es nada convincente!

De nuevo, ¡cada uno elige qué hacer y cómo hacerlo!

Buena suerte.

 
Andrey Khatimlianskii:

También necesita un número de cuenta.

Practica


 
prostotrader:

Usted, no creo que a propósito, toma sólo una garrapata

Por lo tanto, ¡se pierde todo lo anterior a esa hora (0, es decir, la hora actual)!

En mi implementación, se tienen en cuenta TODOS los ticks.

Su código no es adecuado para este tipo de pruebas.

Usted, entre otras cosas, es desatento:

        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 );

Sin ella, el EA siempre obtendría un tick en cada manejador de eventos, lo cual no es el caso.

 
prostotrader:

¡Ya veo, considere que usted gana (sólo una tontería para seguir por la obviedad de la situación), pero no es convincente en absoluto!

De nuevo, ¡cada uno elige qué hacer y cómo hacerlo!

Buena suerte.

¡Genial!

Llegaste, no entendiste el problema, agitaste tu bandera de FORTS, engañaste sobre los manejadores de eventos, y en respuesta a que te demostraron que estabas equivocado, te deseaste suerte y te fuiste.

Y lo más importante, sigues sin entender en qué te equivocas.


¡Buena suerte para ti también!

 
prostotrader:

Practica

Gracias, conectado.

Los resultados son similares, OnBook se retrasa a menudo en comparación con OnTick.


Y en qué situación OnTick puede ser significativamente mejor (¡incluso EN FORTALEZAS! ¡incluso, para ti!), te lo mostraré cuando admitas que estabas equivocado.

 

Por cierto, hay un excelente artículo de Vasiliy Sokolov sobre la correcta recogida de garrapatas. Trata en detalle el proceso de sincronización (que no tengo, que a veces hace que se impriman ticks idénticos):

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

Fig. 5. Tabla de todas las transacciones con un ejemplo de transacciones idénticas.

Inmediatamente vemos dos grupos de garrapatas absolutamente idénticas. Están marcados con marcos rojos y tienen la misma hora, volumen, dirección y precio. Así, vemos que es imposible comparar las garrapatas individuales entre sí.

Pero es posible compararun grupo de garrapatas. Si dos grupos de ticks son iguales entre sí, podemos concluir que estos ticks y los siguientes ya fueron analizados durante la anterior actualización del precio.

Пишем скальперский стакан цен на основе графической библиотеки CGraphic
Пишем скальперский стакан цен на основе графической библиотеки CGraphic
  • www.mql5.com
Именно с этой, улучшенной и дополненной версией мы и начнем работать, чтобы постепенно превратить ее в скальперский стакан цен. Краткий обзор графической библиотеки CPanel Созданию пользовательских интерфейсов в MQL5 посвящено много статей. Среди них особенно выделяется серия Анатолия Кажарского "Графические интерфейсы", после которой сложно...
 
He escrito un Asesor Experto de prueba.
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__); // Распечатываем тики, полученные разными способами.
}


El resultado es malo: en OnTick/OnBookEvent, los ticks recibidos por diferentes métodos muy a menudo no coinciden justo dentro de una función On. En este caso, es imposible determinar en qué función es relevante el método de obtención del tick y cuál no. Una terrible vaguedad.


Parece que ocurre cuando el propio cristal se queda obsoleto.

 

Prueba esto:

//+------------------------------------------------------------------+
//|                                                   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!");
      }
    }
  
}
//+------------------------------------------------------------------+

Incluso sinGetTickCount64() se puede ver cómo funcionan las funciones

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 
Archivos adjuntos:
20200131.log  28 kb