La gran y terrible MT4 para siempre (o cómo hacer una estrategia de transición) - página 20

 
Andrey Khatimlianskii:

No se puede hablar con la lengua. Deberías enseñarme. A mí, por favor.

Hay un problema, y no es sólo en este corredor.
Y el problema no está en esperar la ejecución de una orden concreta (eso es otra cosa), sino en que en el momento de la ejecución de la orden desaparecen temporalmente de todas las listas (abiertas, cerradas, operaciones, posiciones).

Podríamos usar otra muleta, por supuesto. Pero queremos encontrar una solución humana. Y así, fxsaber trabaja en ello públicamente, escuchando los ladridos de los simpatizantes que pasan por allí.

Personalmente, espero que pueda entender la documentación

Mientras el Asesor Experto maneja las transacciones comerciales utilizando el manejador OnTradeTransaction(), el terminal continúa manejando las transacciones comerciales recién llegadas. Por lo tanto, el estado de una cuenta comercial puede cambiar ya mientras se ejecuta OnTradeTransaction(). Por ejemplo, mientras un programa MQL5 gestiona un evento de adición de una nueva orden, ésta puede ser ejecutada, eliminada de la lista de las abiertas y trasladada al historial. Más adelante, el programa será notificado de todos estos eventos.
y esto se aplica no sólo al manejador del evento OnTradeTransaction(), sino también a cualquier parte del código después de que se haya enviado OrderSend(). Espere a que se complete la transacción. No hay otras opciones y no las habrá. Piensa por qué todo es tan sencillo en mql4. Pues es porque estas expectativas están puestas lejos de tus ojos. Y en MQL5, de alguna manera piensas que todas las comprobaciones y expectativas son muletas. ¿Por qué?
 
Alexey Viktorov:

Personalmente, espero que tenga suficiente conocimiento de tales palabras de documentación

Y esto se refiere no sólo al manejador de eventos OnTradeTransaction(), sino también a cualquier parte del código después de que se envíe OrderSend(). Espere a que se complete la transacción. No hay otras opciones y no las habrá. Piensa por qué todo es tan sencillo en mql4. Pues es porque estas expectativas están puestas lejos de tus ojos. Y en MQL5, de alguna manera piensas que todas las comprobaciones y expectativas son muletas. ¿Por qué?

Alexey, estás fuera del tema. Lo siento, no tengo tiempo ni ganas de explicarlo todo de nuevo.

 

lo intentó de esta manera:

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

5 veces ejecuté mi código, hasta que se abrieron exactamente 10 posiciones

 
Igor Makanu:

lo intentó de esta manera:

Ejecuta mi código 5 veces, hasta que se abran exactamente 10 posiciones

Parece un error en la configuración de las entradas de HistorySelect.

 
fxsaber:

Parece un error en la configuración de las entradas de HistorySelect.

idea de llegar al servidor y sincronizar

lo reescribió como un guión:

//+------------------------------------------------------------------+
void OnStart()
{
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) return;
   }
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

lo ejecutó varias veces, también abre 10 posiciones, añadió la hora de inicio actual del script

 
Igor Makanu:

la idea de llegar al servidor y sincronizar

lo reescribió como un guión:

lo ejecutó unas cuantas veces, también abre 10 posiciones, añadió la hora de inicio actual del script

¿Qué mostrará este cambio?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

¿Qué mostrará este cambio?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh está activado.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

las posiciones siguen siendo de 10pc, no se duplican todavía
 
Igor Makanu:

Las posiciones siguen siendo de 10 piezas, aún no hay duplicación

Puede ver claramente por el tiempo de ejecución de HistorySelect que no está solicitando nada al servidor de comercio.


Varias versiones.

  1. Estás de suerte.
  2. Esta rama ha provocado un cambio silencioso en la nueva construcción del Terminal. Lo cual es fácil de confirmar si hay un retroceso en los antiguos.
  3. Comportamiento inusual de HistorySelect cuando From >= To.
  4. Servidor de comercio. ¿Nombre?


Intenta de la misma manera deshacerte de la duplicación aquí.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

La gran y poderosa MT4 para siempre (o cómo hacer una estrategia correcta para cambiar)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

Ejecute este código en una cuenta demo vacía y vea si se abren dos posiciones en pocos segundos.

 

Llegué por casualidad y lo leí, ¡es una pena!

No hay que confiar en nadie.
 
fxsaber:

Puede ver claramente en el tiempo de ejecución de HistorySelect que no solicita nada al servidor de comercio.


Varias versiones.

  1. Estás de suerte.
  2. Esta rama ha provocado un cambio silencioso en la nueva construcción del Terminal. Lo que es fácil de confirmar si hay un retroceso en los antiguos.
  3. Comportamiento inusual de HistorySelect cuando From >= To.
  4. Servidor de comercio. ¿Nombre?


Intenta de la misma manera deshacerte de la duplicación aquí.

1. por desgracia, no podemos sobrevivir en nuestro negocio sin ella ))

2. Pregunté hace unos días qué build (no beta) es relevante, silencio, decidí no actualizar, en un portátil y en un PC es difícil entender qué builds son relevantes - no he trabajado con los terminales desde hace un par de meses, no sigo. Ahora en el PC build 2903.

3. Paso, usted está a cargo de este banquete, los desarrolladores están en silencio, mi opinión... pulgar en el cielo, creo que el problema está en la latencia de la red, y múltiples sockets? terminal, sin sincronización, un socket precios, otro OrderSend, otro donde OnTrade()..... por lo que los paquetes están volando de dónde y dónde

4. tengo robotforex + 100 mbps óptico (ETTH), antes tenía un mal internet móvil y fhopin en mi portátil


Lo probé durante 2 minutos, el guión se agitó durante 2 minutos, siempre en una posición, sin inversiones, quité el guión a mano