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

 
fxsaber:

Los términos MT4 y MT5 son los mismos.

Durante muchos años todo el mundo ha conocido el remanso, llegando a... Dormir. Porque es MUY complicado. Muchas de las características de la API de comercio que se han planteado en el foro, los desarrolladores no las conocen o no las han comentado.


Nadie critica a MT5. Te he mostrado con ejemplos algunos problemas que se producen al resolver las tareas básicas.

¿Por qué son iguales? Todavía no has respondido a mi pregunta.

Nadie critica a MT5. Mostré algunos problemas en la resolución de problemas elementales con ejemplos.

Sólo hay que procesar correctamente el resultado de la función OrderSend() y no hay que alejarse de la simplicidad de mql4. Tienes tu propio objetivo, atrapar microsegundos, no comerciar... Un DT tiene problemas y tú haces pasar estos problemas como errores de MT. Muestre la inversión de la posición en la cuenta MQ y entonces los desarrolladores le prestarán atención. He ejecutado tu código en la demo de Robo y no he visto ningún retroceso.

Algunos de sus informes de errores son realmente dignos de respeto, pero otros... lo siento, semejante tontería, me deja sin palabras.

Eso es todo... Feliz Día de la Victoria. La paz. El trabajo. Mayo.

 
Alexey Viktorov:

¿Por qué son iguales? Todavía no has respondido a la pregunta.

Una vez más, las condiciones son las mismas para MT4/5. Es necesario tener 100 posiciones abiertas en una cuenta vacía al final de la ejecución del script. Se permite cerrar algunas posiciones en cualquier terminal durante la ejecución del script. Esta "intervención" es necesaria sólo para evitar decisiones tontas.

for (int i = 0; i < 100; i += OrderSend(Request, Result))
  ;

El resultado de la función OrderSend() debe ser procesado correctamente, pero no se puede escapar de la simplicidad de mql4. Tu tienes tu propio objetivo, atrapar microsegundos, no comerciar... Un dtz tiene problemas y tu haces pasar estos problemas como bugs de MT. Muestre la inversión de la posición en la cuenta MQ y entonces los desarrolladores le prestarán atención. He ejecutado tu código en la demo de Robo y no he visto ningún retroceso.

Algunos de sus informes de errores son realmente dignos de respeto, pero otros... lo siento, semejante tontería, carece de palabras decentes.

El hecho de que no notes problemas no significa que no los haya. La demo de MQ es un lugar asqueroso, en términos de depuración. Hay un tipo de ejecución en el que OrderSend devuelve true para las órdenes de mercado sólo cuando se abre una posición. En realidad, no hay nada de eso en las cuentas ECN. cierto - se acepta la orden de mercado. Es importante vigilar lo que ocurre a continuación. Sólo los DC de cocina utilizan un esquema de ejecución diferente (como en MQ-Demo).

Eso es todo... Feliz Día de la Victoria. La paz. El trabajo. Mayo.

Igualmente.

 
fxsaber:

Necesito escribir un script en una MT5 que abra 100 posiciones en una cuenta vacía.


En MT4 lo resolví de esta manera.

void OnStart()
{
  while (OrdersTotal() < 100)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
    
  Print(OrdersTotal());
}

¿Quién tiene una solución en MT5?

He recibido el código más corto que he escrito en MT5:

MqlTradeRequest BuyRequest = {0};
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   static bool run = false;
   if(run) return;
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   BuyRequest.type_filling = GetFilling();
   MqlTradeResult result;
   run = OrderSend(BuyRequest, result);
}
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
{
   MqlTradeResult result;
   while(PositionsTotal() < 10 &&
         SymbolInfoDouble(_Symbol, SYMBOL_ASK, BuyRequest.price) &&
         OrderSend(BuyRequest, result))
   {}
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

sinGetFilling() - no funciona en crypto (((

Pero incluso con este código se abrieron 11 puestos:


 
Igor Makanu:

el código más corto que pude escribir en MT5:

Podría hacer SB para ser más breve.

Pero incluso en este código tengo 11 posiciones abiertas:

Porque la lógica del código es esta.

 
fxsaber:

Puede usar SB para ser más breve

Porque la lógica del código es esta.

el problema no se resuelve con PositionsTotal() ni siquiera así:

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

se abre cuando hay 10 puestos, cuando hay incluso 13

la única forma de solucionarlo es memorizar la orden de entrada a partir del resultado de MqlTradeResult y esperar a que aparezca una posición abierta; entonces se abrirá el número de posiciones especificado

 
Igor Makanu:

PositionsTotal() no se resuelve ni siquiera de esta manera:

se abre cuando hay 10 puestos, cuando hay incluso 13

no hay mucha opción, sino recordar la orden de entrada del resultado de MqlTradeResult y esperar a que aparezca una posición abierta. Entonces se abrirá con seguridad el número de posiciones especificado

Así que ¡¡¡espera!!! Porque mql4 está esperando, y no se resiente. Y en MQL5 ha decidido que puede enviar una solicitud y asumir que tiene que ser ejecutada............

 
Igor Makanu:

PositionsTotal() no se resuelve ni siquiera de esta manera:

se abre cuando hay 10 puestos, cuando hay incluso 13

no hay mucho que hacer excepto memorizar la orden de entrada del resultado de MqlTradeResult y esperar a que se abran las posiciones; entonces se abrirá con seguridad el número de posiciones especificado

Tenga en cuenta que esto no es un script/servicio sino un EA. Pero incluso con un EA se necesitaría mucho esfuerzo para resolver una tarea tan sencilla de dos líneas.

 
Alexey Viktorov:

¡¡¡Así que espera!!! Después de todo, mql4 espera y no se resiente. Y en MQL5 ha decidido que puede enviar una solicitud y asumir que tiene que ser ejecutada............

Varias personas han afirmado aquí que no hay dificultades. Sin embargo, no han aportado ninguna solución.

 
fxsaber:

Varias personas han expresado aquí que no hay dificultades. Sin embargo, no han aportado ninguna solución.

Tampoco voy a proporcionar una, por la razón más simple. No quiero enseñar a ...codificadores (no a ti), pero si es necesario resolveré el problema sin pensar demasiado. Y todo por la misma razón, desde hace tiempo aparecen en CodeBase códigos exclusivamente de Tumblr. Todos los demás están en silencio...

 
Alexey Viktorov:

No voy a proporcionar ninguna de las dos cosas, por la razón más simple. No quiero enseñar a ...codificadores (no le concierne), pero si es necesario resolveré el problema sin pensar demasiado. Y todo por la misma razón por la que durante mucho tiempo los códigos han llegado a CodeBase exclusivamente desde Tumblr. Todos los demás están en silencio...

Hablar con la lengua no es como hablar con un saco. 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 (ese es otro tema), sino en que mientras se ejecuta la orden, ésta desaparece de todas las listas (abiertas, cerradas, operaciones, posiciones) durante un tiempo.

Podríamos usar otra muleta, por supuesto. Pero queremos encontrar una solución humana. Y en eso está trabajando fxsaber públicamente, escuchando los ladridos de los bienpensantes que pasan por allí.