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

 

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

OrderModify() en MQL5?

Edward Munroe, 2021.05.27 00:51

¿Preguntas sencillas, respuestas sencillas? ¿Por qué casi todo en mql5 tiene que ser tan desordenado?

Buena pregunta.

 

Tradicionalmente una tarea sencilla antes del fin de semana.

Una posición abierta es 1 lote. Después de ejecutar el script tenemos que hacer que la posición se convierta en 0,9 lotes.

Está claro que el script puede ser lanzado en cualquier momento. Por eso hay muchas situaciones que pueden darse.


Como de costumbre, he tratado de resolver el problema de la manera clásica.

// Частичное закрытие позиции.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  if (Trade.Buy(1)) // Пытаемся открыть позицию на 1 лот.
  {
    const ulong Ticket = Trade.ResultOrder();
    
    // Ждем, пока не появится.
    while (!IsStopped() && !PositionSelectByTicket(Ticket))
      Sleep(0);
      
    // А теперь просто закрываем 0.1 лота в случае, если объем позиции равен 1.
    // Цикл - для эмуляции запуска скрипта в любой момент.
    while (!IsStopped() && PositionSelectByTicket(Ticket) && (PositionGetDouble(POSITION_VOLUME) == 1))
      Trade.PositionClosePartial(Ticket, 0.1);
  }
}


Esta secuencia de comandos muestra una posición en 0,8 lotes. Necesitamos 0,9.

 
fxsaber:

La ejecución de este script da una posición de 0,8 lotes. Necesito 0,9.

Probado un par de veces en 2 servidores, sólo conseguí 0,9


La lógica de las pruebas es clara - estamos tratando de deshacernos de la ejecución asíncrona en un tick, el esquema general de este proceso (cómo sincronizar en un tick) es importante saberlo

 
fxsaber:

Tradicionalmente una tarea sencilla antes del fin de semana.


¡Santo cielo! Y tengo 0.8 (en MQDemo -0.9). ¿Cuántos más de estos rastrillos habrá?

 
 
 
fxsaber:
Resuelto.

Esta es probablemente la tarea más difícil de todas las que se formulan fácilmente en este hilo en este momento.

Una prueba muy fuerte de dominio de la parte comercial de MQL5.

 

abrir una orden de compra con SL y TP cero, y luego establecer un SL y TP de 30 pips (si la memoria no me falla, esto se llama tipo de cuenta de ejecución de mercado - SL y TP no se pueden establecer a la vez)

Para MT4 este código funciona:

void OnStart()
{
   int ticket;
   if((ticket = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 30, 0.0, 0.0)) < 0 ||
         !OrderSelect(ticket, SELECT_BY_TICKET) ||
         !OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - 300 * _Point, _Digits), NormalizeDouble(OrderOpenPrice() + 300 * _Point, _Digits), OrderExpiration()))
   {
      Print("Error Open order # ", GetLastError());
   }
}
 
Igor Makanu:

abrir una orden de compra con SL y TP cero, y luego establecer un SL y TP de 30 pips (si la memoria no me falla, esto se llama tipo de cuenta de ejecución de mercado - SL y TP no se pueden establecer a la vez)

Para MT4 este código funciona:

Hace unos dos o tres años se introdujo el reconocimiento del tipo de ejecución a nivel de terminal. Ahora, incluso con la Ejecución de Mercado, puedes establecer el SL y el TP y el propio terminal dividirá la orden en dos órdenes comerciales.

 
Igor Makanu:

Abrir una orden de compra con SL y TP cero, luego colocar un SL y TP de 30 pips (si la memoria no me falla, esto se llama tipo de cuenta de ejecución de mercado - SL y TP no pueden ser colocados simultáneamente)

Una tarea común.

Razón de la queja: