Características del lenguaje mql5, sutilezas y técnicas - página 185

 
Hay un error más en juego. Establecemos una orden de Límite al precio actual y observamos su llenado gradual. Comprobamos el lote total de todas las posiciones y órdenes en cada paso. No debe cambiar, y debe ser igual al que se envió a OrderSend.
// Демонстрация потери данных во время торговли.

template <typename T>
T MyPrint( const T Value, const string Str )
{
  Print(Str + " = " + (string)Value);

  return(Value);
}

#define _P(A) MyPrint(A, ": " + #A)

sinput double inLots = 100;

int OnInit()
{
  MqlTradeResult Result = {0};
  MqlTradeRequest Request = {0};
  
  Request.action = TRADE_ACTION_PENDING;
  Request.symbol = _Symbol;
  Request.volume = inLots;
  Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  Request.type = ORDER_TYPE_BUY_LIMIT;
  
  return(OrdersTotal() || PositionsTotal() || !OrderSend(Request, Result)); // Работаем, когда ничего не открыто.
}

// Возвращает сумму лотов всех позиций и ордеров.
double GetSumLots()
{
  double Lots = 0;
  
  for (int i = _P(OrdersTotal()) - 1; i >= 0; i--)
    if (_P(OrderGetTicket(_P(i))))
      Lots += _P(OrderGetDouble(ORDER_VOLUME_CURRENT));
    
  for (int i = _P(PositionsTotal()) - 1; i >= 0; i--)
    if (_P(PositionGetTicket(_P(i))))
      Lots += _P(PositionGetDouble(POSITION_VOLUME));

  return(Lots);
}

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  Print("---------");
    
  // Проверяем, что сумма лотов всех позиций и ордеров совпадает с заданной.
  if (NormalizeDouble(_P(GetSumLots()) - inLots, _Digits))
    Alert("BUG!");
}


Resultado.

2020.08.21 01:18:13.375 : OrdersTotal() = 1
2020.08.21 01:18:13.375 : i = 0
2020.08.21 01:18:13.375 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.375 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 68.59999999999999
2020.08.21 01:18:13.375 : PositionsTotal() = 1
2020.08.21 01:18:13.375 : i = 0
2020.08.21 01:18:13.375 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.375 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.375 : GetSumLots() = 100.0
2020.08.21 01:18:13.377 ---------
2020.08.21 01:18:13.377 : OrdersTotal() = 1
2020.08.21 01:18:13.377 : i = 0
2020.08.21 01:18:13.377 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.377 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 68.59999999999999
2020.08.21 01:18:13.377 : PositionsTotal() = 1
2020.08.21 01:18:13.377 : i = 0
2020.08.21 01:18:13.377 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.377 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.377 : GetSumLots() = 100.0
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.390 : PositionGetDouble(POSITION_VOLUME) = 58.6
2020.08.21 01:18:13.390 : GetSumLots() = 100.0

Se colocaron 100 lotes, pero en algún momento los lotes se convirtieron en 72,8. Obviamente, el algoritmo de negociación puede desorientarse en una situación así.

Cadena de búsqueda: Oshibka 011.
 

fxsaber:
Он должен быть неизменным - равным тому, что был отправлен в OrderSend.

En realidad, no, existe la posibilidad de un mal funcionamiento de la sincronización, que es lo que sucede, pero no hay una solución fácil en absoluto

 
Andrei Trukhanovich:

En realidad no, existe la posibilidad de que se produzca un desajuste de tiempos, que es lo que ocurre, no hay una solución fácil en absoluto

Ni siquiera tengo una solución sencilla. No está nada claro cómo asegurarse de que hay una desincronización en algún script en ejecución.

 
fxsaber:

Ni siquiera tengo una solución complicada. No está nada claro cómo asegurarse en cualquier script en ejecución de que hay una asincronía.

Si el lote total ha cambiado, siga contando hasta que los lotes de las órdenes y las posiciones sean iguales dos veces.

La probabilidad de que se desincronice es pequeña, incluso de un par de veces, por lo que no afectará en absoluto al rendimiento.

__________

He mirado tus impresiones, quizás sea un bug, si es un caso de async, la cantidad errónea no debería repetirse de la misma manera en varios cálculos

 
Andrei Trukhanovich:

Si el lote total ha cambiado, siga contando hasta que los lotes de las órdenes y las posiciones sean iguales dos veces.

La probabilidad de que se produzca un desajuste es mínima o nula, por lo que el rendimiento casi no se ve afectado.

En el registro anterior, tres cálculos consecutivos muestran un resultado erróneo. Necesitamos Sleep, pero esto puede provocar retrasos, ya que no tendremos tiempo de reaccionar a la orden comercial que se emita.

No es una situación agradable.

 
fxsaber:

En el registro anterior, tres cálculos consecutivos muestran un resultado erróneo.

Sí, lo he visto, lo he añadido a la parte superior

 
Los comentarios no relacionados con este tema han sido trasladados a "Cualquier pregunta de los novatos en MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos".
 
Alexey Viktorov:

No deberías ofenderte. La mayor probabilidad es un error en el código. En segundo lugar está el exorbitante diferencial. Pero quién sino tú puede descartar la primera opción y empezar a considerar la segunda sin ver el código. Espero que los moderadores muevan el tema al que no corresponde.

Gracias por la respuesta adecuada. No estoy ofendido, estoy molesto)). He escrito para tratar de encontrar una solución rápida, que puede ser alguien que ya se ha encontrado con esto. El código es absolutamente estándar, bucle total lucrativo sumando y comparando con un valor dado, además el código lleva funcionando un par de meses en dos cuentas diferentes sin fallar. Que tenga un buen día.

 
Evgeny Vlasov:

Gracias por la respuesta adecuada. No me ofende, me entristece)). He escrito para intentar encontrar una solución rápida, que quizás alguien que ya se haya encontrado con ello lo haya hecho. El código es absolutamente estándar, bucle total lucrativo sumando y comparando con un valor dado, además el código lleva funcionando un par de meses en dos cuentas diferentes sin fallar. Que tenga un buen día.

No se trata de un tema de características.
 
Artyom Trishkin:
No se trata de un tema de características.

Estoy de acuerdo.