Errores, fallos, preguntas - página 2220

 
1861 - imposible abrir una demo en Alpari. La elección de un corredor no funciona.
 
fxsaber:

En mi opinión, se trata de un error cuando una orden está en el servidor de comercio, pero después del OrderSend sincrónico en el terminal no hay rastro de ella.

He decidido comprobar cuánto duran estas órdenes fantasma cuando la orden está presente en el sistema pero no en el terminal.

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


El resultado es

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


¡Una orden está presente en el sistema pero no en el Terminal durante 32 milisegundos! Imagínese las consecuencias si la lógica comercial se ejecutara en este intervalo...


Es interesante que las órdenes fantasma se presentan con mayor frecuencia sólo en los tipos de transacciónTRADE_TRANSACTION_ORDER_DELETE y en TRADE_TRANSACTION_DEAL_ADD (mucho más raro).


Muy mal el matiz de la plataforma.


ZZY La velocidad de las transacciones comerciales en el 5 es cuestionable, por desgracia.

Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
  • 2016.09.13
  • MetaQuotes Software Corp.
  • www.mql5.com
Многие трейдеры зачастую не задумываются над тем, как быстро доходит их заявка до биржи, как долго она там исполняется и когда торговый терминал трейдера узнает о результате. В результате они не знают, что легко могут улучшить качество исполнения своих сделок за счет более быстрой реакции и скорости проведения транзакций. 12 сентября 2016 года...
 
fxsaber:

He decidido comprobar cuánto duran estas situaciones de órdenes fantasma, cuando una orden está en el sistema pero no en el terminal.


El resultado es


Durante 32 milisegundos, hay una orden pero no está en la Terminal. Imagínese las consecuencias si la lógica comercial se ejecutara durante este intervalo.

Sí, eso no es bueno. Como puedes ver, estos resultados de la transacción se envían en diferentes paquetes. Deberían estar en uno solo.

 
Alexey Navoykov:

Como puede ver, los resultados de estas transacciones se envían en diferentes paquetes, mientras que deberían estar en uno solo.

Resulta que la orden puede ser fantasma justo después de OrderSend y el Asesor Experto paralelo con OnTradeTransaction no siempre puede captar este estado. Es decir, el propio OnTradeTransaction a veces se ralentiza.


En general, en la arquitectura de MT5 hay retrasos en diferentes lugares que apenas se eliminan. Se trata de retrasos en las llegadas de garrapatas y, ahora, en las transacciones comerciales. Hay que tener claro de qué es capaz la plataforma si se confía en la velocidad de ejecución. Por ejemplo, los ticks que llegan con un retraso decente, luego las transacciones... y eventualmente alguien más en MT5 u otra plataforma puede adelantarse, incluso si usted mismo está sentado justo al lado de la bolsa.

 
Lastransacciones comerciales van en paquetes prioritarios, superando al resto. Esto reduce considerablemente la latencia.
 
Renat Fatkhullin:
Las transacciones comerciales van en paquetes prioritarios, superando a las demás. Esto reduce considerablemente la latencia.

¿Cómo es posible que el script detecte una situación de orden fantasma después de OrderSend, pero OnTradeTransaction en un EA paralelo no lo haga (no siempre, pero sucede)?

 
Renat Fatkhullin:
Las transacciones comerciales vienen en paquetes prioritarios, superando a los demás. Esto reduce considerablemente la latencia.

El problema es que las transaccionesTRADE_TRANSACTION_ORDER_DELETE yTRADE_TRANSACTION_HISTORY_ADD vienen en paquetes diferentes y por eso no importa la prioridad que tengan, la latencia de la red lo hará igualmente.Y estas transacciones deben ejecutarse de forma sincrónica, una tras otra, sin ningún estado intermedio. Es decir, es una operación atómica en esencia, porque poner una orden eliminada en la lista del historial no tiene nada que ver con un intercambio.

Es decir, aquí hay dos opciones: o bien estas dos transacciones vienen juntas en un solo paquete, o bien la primera transacción no se ejecuta en el terminal hasta que llega la segunda.

 
Alexey Navoykov:

Es decir, hay dos opciones: o bien estas dos transacciones vienen juntas en un solo paquete, o bien la primera transacción no se ejecuta en el terminal hasta que llega la segunda.

Hay situaciones en las que TRADE_TRANSACTION_DEAL_ADD es anterior a la transacción TRADE_TRANSACTION_ORDER_DELETE. En este caso, incluso antes de TRADE_TRANSACTION_ORDER_DELETE la orden sigue siendo fantasma.

 

Los agentes remotos han dejado de optimizar

2018.06.22 14:05:24.901 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000
2018.06.22 14:05:27.387 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000

Supongo que es por el nuevo compilador, ¿cómo se pueden actualizar para que funcione?

Además, sólo una parte del optimizador pasa 13 de 28 debido a este error.
 

Mirando el código del paquete Alglib. Está lleno de estas construcciones, lo que hace que el código sea más difícil de leer:

         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=xy[i][i_];
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=tmp[i_]-ct[xyc[i]][i_];
         //--- calculation
         v=0.0;
         for(i_=0;i_<=nvars-1;i_++)
            v+=tmp[i_]*tmp[i_];

¿No es más sencillo así?

v=0.0;
for(i_=0;i_<=nvars-1;i_++){
   tmp=xy[i][i_]-ct[xyc[i]][i_];
   v+=tmp*tmp;
}

Me parece que la velocidad de ejecución sería aún más rápida.

¿Por qué han complicado tanto el código? ¿O simplemente se ha portado de otro idioma, sin ningún ajuste? Pero sigo preguntándome por qué tanta complicación en el original.