Discusión sobre el artículo "Comparando MQL5 y QLUA - ¿Por qué las operaciones comerciales en MQL5 son hasta 28 veces más rápidas?" - página 2

 
Rashid Umarov:
Se facilitan los códigos, cualquiera puede comprobarlo por sí mismo y ver si las conclusiones son válidas. Aquí no hay ningún problema.

Mi código

sinput int Interval = 30; // Intervalo en segundos

class BENCH
{
protected:
  MqlTick FirstTick;
  int Count;
  ulong StartTime;

  int GetAmountTicks( const ulong From = 0, const int Amount = 10000 ) const
  {
    MqlTick Ticks[];

    return(::CopyTicks(this.symbol, Ticks, COPY_TICKS_ALL, From, Amount));
  }
  void Init( void )
  {
    this.Count = 0;

    this.GetAmountTicks(); // calentando
    ::SymbolInfoTick(this.symbol, this.FirstTick);

    this.StartTime = ::GetMicrosecondCount();

    return;
  }

public:
  const string symbol;
  const int TimerInterval;

  BENCH( const int iTimerInterval, const string Symb = NULL ) :
         symbol((Symb == NULL) ? ::Symbol() : Symb), TimerInterval(iTimerInterval * (int)1 e6)
  {
    this.Init();

    this.StartTime = 0;
  }

  ~BENCH( void )
  {
    ::Comment("");
  }

  void Refresh( const string Symb )
  {
    if (Symb == this.symbol)
    {
      if (this.GetBenchTime() >= this.TimerInterval)
      {
        if (Count > 0)
          ::Alert(this.ToString());

        this.Init();
      }

      Count++;
    }

    return;
  }
  int GetBenchTime( void ) const
  {
    return((int)(::GetMicrosecondCount() - this.StartTime));
  }

  string ToString( void ) const
  {
    const ulong BenchTime = this.GetBenchTime();
    const int Amount = this.GetAmountTicks(this.FirstTick.time_msc);

    if ((BenchTime == 0) || (Amount == 0))
     return(NULL);

    const double Velocity1 = 1 e6 * this.Count / BenchTime;
    const double Velocity2 = 1 e6 * Amount / BenchTime;

    return((string)this.Count + "/" + (string)Amount + " = " + ::DoubleToString(100.0 * Count / Amount, 2) + "%, ExChange_History = " +
           ::DoubleToString(Velocity2, 1) + " ticks/sec, MT5_RealTime = " + ::DoubleToString(Velocity1, 1) + " units/sec, Interval = " +
           ::DoubleToString(BenchTime / 1 e6, 1) + " sec.");
  }
};

class BENCH_BOOK : public BENCH
{
public:
  BENCH_BOOK( const int iTimerInterval, const string Symb = NULL ) : BENCH(iTimerInterval, Symb)
  {
    ::MarketBookAdd(this.symbol);
  }

  ~BENCH_BOOK( void )
  {
    ::MarketBookRelease(this.symbol);
  }
};

/*
BENCH Bench(Interval);

void OnTick( void )
{
 Bench.Refresh(_Symbol);

 return;
}
*/

BENCH_BOOK BenchBook(Interval);

void OnBookEvent(const string &symbol )
{
  BenchBook.Refresh(symbol);

  return;
}

Resultado

2016.09.13 17:18:35.667 Bench (Si-9.16,M1)      851/754 = 112.86%, ExChange_History = 25.1 ticks/sec, MT5_RealTime = 28.3 units/sec, Interval = 30.1 sec.
2016.09.13 17:18:05.524 Bench (Si-9.16,M1)      662/506 = 130.83%, ExChange_History = 16.9 ticks/sec, MT5_RealTime = 22.1 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:35.424 Bench (Si-9.16,M1)      883/1610 = 54.84%, ExChange_History = 53.6 ticks/sec, MT5_RealTime = 29.4 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:05.319 Bench (Si-9.16,M1)      834/2707 = 30.81%, ExChange_History = 90.1 ticks/sec, MT5_RealTime = 27.8 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:35.196 Bench (Si-9.16,M1)      789/627 = 125.84%, ExChange_History = 20.9 ticks/sec, MT5_RealTime = 26.3 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:05.110 Bench (Si-9.16,M1)      900/822 = 109.49%, ExChange_History = 27.4 ticks/sec, MT5_RealTime = 30.0 units/sec, Interval = 30.0 sec.
2016.09.13 17:15:34.993 Bench (Si-9.16,M1)      772/747 = 103.35%, ExChange_History = 24.8 ticks/sec, MT5_RealTime = 25.7 units/sec, Interval = 30.1 sec.

Se puede ver claramente cuánto difieren los resultados incluso en medios minutos vecinos. ¡La comparación de vasos debe hacerse SOLO al mismo tiempo!

[Eliminado]  
Тестирование синхронных операций - una serie de 10operaciones de compra consecutivas síncronascon confirmación del éxito de cada transacción en la bolsa. La operación subsiguiente no se realiza hasta que se recibe una confirmación del servidor de operaciones de que la transacción ha sido aprobada/fracasada en la bolsa. La velocidad de ejecución depende de toda la cadena terminal - servidor de operaciones - bolsa - servidor de operaciones - terminal. Cuanto menor sea el tiempo medio de una operación comercial sincrónica, mejor.
//--- ejecuta el bucle de operación
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- acción
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

¿Dónde está la confirmación de la que hablas? No la he visto en el código. Si te refieres a la respuesta de OrderSend(), entonces en la ayuda:

Valor de retorno

En caso de comprobación exitosa de la estructura básica (comprobación de punteros), se devuelve true - no indica ejecución exitosa de la operación comercial. Para obtener una descripción más detallada del resultado de la ejecución de la función, debe analizar los campos de la estructura de resultados.

Por favor, explíquelo.
 
fxsaber:

El vídeo muestra el comienzo de la sesión. Y el vídeo del artículo es el zumo. Y

el número no es suficiente para iniciar la sesión. Por favor, explique lo que es una "cola" y "calentamiento".

Mira la hora en las pruebas - es la mitad de un día tranquilo, no el comienzo de la sesión. Así que saltarse un pequeño número de ticks es razonable y es suficiente para evitar posibles residuos de ticks no seleccionados.

No es que seamos niños de foro que no saben hacer mediciones de prueba y luego salen perdiendo por culpa de pruebas deficientes. Las pruebas se realizaron docenas de veces para asegurarse de que no había errores. Sólo después de eso fue la publicación.

 
Alexey Kozitsyn:

¿Dónde está la confirmación de la que hablas? No la he visto en el código. Si te refieres a la respuesta de OrderSend(), entonces en la ayuda:

Por favor, explique.

OrderSend es una operación 100% sincrónica que espera los resultados de la colocación de una orden completa en el servidor.

Es decir, en caso de ejecución de bolsa externa, es un ciclo completo de procesamiento con confirmación de bolsa de la colocación de la orden.

 
Renat Fatkhullin:

Fíjate en la hora de las pruebas: es la mitad de un día tranquilo, no el comienzo de una sesión.

Su colega dijo sobre la sesión

sesión de trading hay varias actualizaciones únicas de la pila. Por lo tanto, el script se salta los primeros N ticks para asegurarse de que hay una verdadera balsa de órdenes en la pila. Y sólo después empieza a contar los ticks.


Si el código no se ha modificado desde el vídeo anterior, la cosa cambia.
 
fxsaber:

Mi código

Resultado

Puede ver claramente lo mucho que difieren los resultados incluso en medios minutos vecinos. ¡La comparación de vasos debe hacerse SOLO al mismo tiempo!

Simultánea es cuando usted tiene una diferencia en las mediciones flotando alrededor como 10%.

Pero cuando por los resultados de docenas de pruebas tienes una diferencia estable de 4-5 veces, no hay nada que discutir.

 
Alexey Kozitsyn:

¿Dónde está la confirmación de la que hablas? No la he visto en el código. Si te refieres a la respuesta de OrderSend(), entonces en la ayuda:

Por favor, explique.

OrderSend devuelve el mismo valor que OrderCheck. Pero en este caso, en caso de devolver true, OrderSend terminará su ejecución sólo cuando llegue la respuesta del servidor de comercio.

El servidor de comercio (gateway) es una tubería a la bolsa, donde sólo se comprueba el GO. Por lo tanto, si el GO es incorrecto, la orden no llegará a la bolsa. Y en este sentido tienes razón en que es bueno comprobar el MqlTradeResult. Pero en este caso el GO estaba en orden cada vez, por lo que todas las ordenes fueron enviadas a la bolsa. Y OrderSend terminó su trabajo después de recibir exactamente la respuesta del intercambio.

Así que el resultado es correcto.

 
fxsaber:
Su colega dijo sobre la sesión
Si el código no cambia respecto al vídeo anterior, es diferente.

Te confundes con otro video presentado para comparar visualmente el inicio de sesión en tres terminales. En este video https://www.youtube.com/watch?v=i5vvD66I3Ik es fácil ver la clara superioridad visual de MT5 en velocidad de actualización de datos.

En el artículo https://www.mql5.com/es/articles/2635 demostramos la diferencia de velocidad en las cifras y especialmente tomamos la mitad del día (2016.09.12 13:57 GMT+1), para que no hubiera reclamaciones sobre la posibilidad potencial de frenos de alguien en el inicio del mercado. El vídeo del artículo https://www.youtube.com/watch?v=J5nqWGQ1zh8 muestra una medición secuencial limpia durante tres minutos sin interrupciones.

3markets 25082016 blur
3markets 25082016 blur
  • 2016.08.25
  • www.youtube.com
Запись стаканов в терминалах MetaTrader 5, Quik и SmartX 25 августа 2016. Инструмент Si-9.16
 
Renat Fatkhullin:

Se confunde con otro vídeo presentado para la comparación visual del inicio de sesión en tres terminales. En este video https://www.youtube.com/watch?v=i5vvD66I3Ik es fácil notar una clara superioridad visual de MT5 en la velocidad de actualización de datos.

En el artículo https://www.mql5.com/es/articles/2635 demostramos la diferencia de velocidad en los números y tomamos el mediodía (13:57 GMT+1) a propósito, para que no hubiera reclamaciones sobre la posibilidad de que alguien se frenara al inicio del mercado. El vídeo del artículo https://www.youtube.com/watch?v=J5nqWGQ1zh8 muestra una medición secuencial limpia durante tres minutos.

Sólo tenía una pregunta sobre el comentario en la fuente al artículo actual

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Discusión del artículo "Comparación de MQL5 y QLUA - ¿por qué las operaciones de trading en MQL5 son hasta 28 veces más rápidas?".

fxsaber, 2016.09.13:25 pm

 //--- omite los primeros ticks para la limpieza inicial de la cola y el calentamiento
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;

Necesito aclaración sobre el impacto de las colas y el calentamiento en el rendimiento.

Si es un rudimento (del video anterior) - una cosa, si no - otra.
 
fxsaber:
Sólo tenía una pregunta sobre el comentario en la fuente al artículo actual.
Si se trata de un rudimento (del vídeo anterior) - una cosa, si no - otra.

Cualquier prueba debe contener la protección de arranque en frío.

Así que saltarse N ticks es una indicación de que somos conscientes y tenemos esto en cuenta. Sólo para evitar la obviamente esperada reclamación de "por qué no compensaste el arranque en frío".


El vídeo sobre el inicio de la sesión de tres terminales se preparó el 25 de agosto de 2016 para otra reclamación de un trader que afirmaba que MT5 se ralentiza al inicio de la sesión. Como resultó más tarde, este trader no utilizaba MT5 en absoluto, sino que difundía especulaciones del foro. También resultó que algunos operadores no eran conscientes de que para los instrumentos bursátiles los gráficos no se construyen por Bid, sino por los precios Last negociados. Percibían el cambio de ofertas en la pila y su no visualización en los gráficos como "frenos de MT5".

Por supuesto, no hay frenos.