Tiki en tiempo real - página 11

 

Andrey Khatimlianskii,fxsaber

Hagamos lo siguiente

Encontrar un error (si lo hay) en mi código

//+------------------------------------------------------------------+
//|                                                   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!");
      }
    }
  
}
//+------------------------------------------------------------------+
Andrey Khatimlianskii
Andrey Khatimlianskii
  • www.mql5.com
Добавил тему Быстрый TimeHour/TimeMinute? Попытался ускорить TimeHour/TimeMinute, ни фига не получилось: void OnStart() {         ulong s1 = GetMicrosecondCount();         for ( datetime t = D'1990.01.01'; t Добавил тему Больше агентов — меньше скорость! WTF!? Наткнулся на интересного советника, использующего кастумный индикатор, подключенный...
 
prostotrader:

Encontrar un error (si lo hay) en mi código

Ni siquiera voy a mirar esta hoja sin comentarios. He llegado a la conclusión a través de mi propio código. Creo que no es razonable resolver una discusión en Internet. Cada uno se queda en su casa.

 
fxsaber:

Ni siquiera miraré la hoja sin comentarios. He llegado a la conclusión a través de mi propio código. No creo que sea prudente resolver las cosas en Internet. Cada uno se queda con lo que tiene.

Entonces, ¿no te importa el resultado de las funciones?

Ah, sí, usted no es comerciante, sino escritor, lo siento, lo olvidé.

 
prostotrader:

¿Así que no te importan los resultados de las funciones?

Sí, lo sé. Por eso he escrito el Asesor Experto y he sacado conclusiones por mí mismo.

Oh, sí, no eres un comerciante, sino un escritor, lo siento, lo olvidé.

Sí, no soy un comerciante, sino un escritor.

 

Bueno, sólo queda un oponente (si es que queda alguno :) ) ...

Esperando el resultado...

 
prostotrader:

Bueno, sólo queda un oponente (si es que queda alguno :) ) ...

Esperando el resultado...

Los opositores se van no porque estén equivocados, sino porque usted apesta a arrogancia.
 
Artyom Trishkin:
Los opositores se van no porque estén equivocados, sino porque usted apesta a arrogancia.

¡Artem(sin ofender)!

¡Los de FOREX vienen al tema de la Bolsa, "ponen el pie" y luego se bajan sin pruebas!

Qué tiene que ver el orgullo, si me equivoco - ¡estoy dispuesto a admitirlo!

Pero desde el razonamiento lógico y mi propia experiencia

OnBookEvent() es más rápido y no se pierde ni un solo tick, ¡ni un solo cambio en el vaso!

Encontrar un error (si lo hay) en mi código.

¡De los registros de mi código - todo es muy claramente visible!

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!

Lo marcado en amarillo es la misma garrapata.

Añadido

¿Es realmente difícil para vosotros, alabados programadores, dar sentido a 15 líneas de código sin complicaciones?

Añadido

¿Quizás los comentarios ayuden?

//+------------------------------------------------------------------+
//|                                                   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[], l_tick;
ulong last_time, mem_cnt, tot_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()
{
  tot_cnt = 0;
  if(Mode == USE_BOOK) 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);
  } 
  ArraySetAsSeries(ticks, true);  
  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.bid):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.bid):""); 
     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(Mode == USE_BOOK)
  {
    Print("USE_BOOK ticks received: ", tot_cnt);
    if(is_book == true) MarketBookRelease(Symbol());
  }
  else
  {
    Print("USE_TICK ticks received: ", tot_cnt);
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if ( Mode != USE_BOOK || symbol != Symbol() ) return;
  tot_cnt++;
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      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]));
      }
      l_tick = ticks[0];
      is_first = false;
      last_time = ulong(ticks[0].time_msc);                             //Запоминаем время последнего тика
    } 
  }
  else
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //забираем тики из последнего (посчитанного пакета тикив и считываем тики из нового пакета)
    if(result > 0)
    {
      l_tick = ticks[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);
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
  if ( Mode != USE_TICK ) return;
  tot_cnt++;
  if(is_first == true)
  {
    result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0); //копируем все вновь пришедшие тики от последнего известного времени
    if(result > 0)
    {
      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);
      }
    }
    else
    {
      Print(__FUNCTION__, ": Pending order!");                          //Изменения стакана (добавлен/удален отложенный ордер)
    }
  }
}
//+------------------------------------------------------------------+
 
prostotrader:

¡Artem(sin ofender)!

¡Los de FOREX vienen al tema de la Bolsa, "ponen el pie" y luego se bajan sin pruebas!

Qué tiene que ver el orgullo, si me equivoco - ¡estoy dispuesto a admitirlo!

Pero desde el razonamiento lógico y mi propia experiencia

OnBookEvent() es más rápido y no se pierde ni un solo tick, ¡ni un solo cambio en el vaso!

Encontrar un error (si lo hay) en mi código.

De mis registros de código - ¡se puede ver todo muy claramente!

Añadido

¿Es realmente difícil para vosotros, alabados programadores, dar sentido a 15 líneas de código sin complicaciones?

Añadido

¿Quizás los comentarios ayuden?

No me interesa. Veo que no hay diferencia. Pero Andrei prometió mostrarte cómo hacerlo mejor. Pero puso una condición para mostrarte que es imposible que cumplas.
 
Artyom Trishkin:
No me importa. Veo que no hay diferencia. Pero Andrey ha prometido mostrarte la mejor manera. Sin embargo, puso una condición imposible de mostrar.

De acuerdo.

Pero sólo diré un pequeño comentario.

El hecho de que OnTick() no maneje órdenes pendientes

2020.01.31 17:02:01.492 Ticks_test (GOLD-3.20,H1)       OnBookEvent: Pending order!

es una buena razón para tirar esta función a la basura para el comercio de acciones.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 

Me gustaría recordar que OnTick recibe dos hilos independientes, información y comercio,COPY_TICKS_INFO y COPY_TICKS_ALL y se somete a un preprocesamiento .

Estos hilos no están sincronizados entre sí, por lo que si comparas OnBookEvent con OnTick, debes tomarTICKS_INFO.

Pordefinición, OnBookEvent debería ser más rápido ya que no pasa por el preprocesamiento.

Las pruebas no determinan de forma fiable quién es más rápido, porque no conocemos el tiempo de acción de una garrapata, a diferencia de las garrapatas.

¡Aunque, muchas veces hemos pedido a los desarrolladores que AÑADAN TIEMPO DE PARADA! ¡! ¡!


p.d. además de la velocidad, tumblr también tiene ventajas sobre OnTick,

como ya se ha dicho, no es posible obtener mejores precios de compra y venta en OnTick,

yOnTick no obtiene datos de otros símbolos, es inútil para los Asesores Expertos que analizan múltiples símbolos.


Razón de la queja: