O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 27

 

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

OrderModify() em MQL5?

Edward Munroe, 2021.05.27 00:51

Faça uma pergunta simples, obtenha uma resposta simples!? Por que quase tudo em mql5 tem que ser tão confuso?

Boa pergunta.

 

Tradicionalmente, uma tarefa simples antes do fim de semana.

Uma posição aberta é 1 lote. Depois de executar o roteiro, precisamos fazer com que a posição se torne de 0,9 lotes.

É claro que o roteiro pode ser lançado a qualquer momento. É por isso que há muitas situações que podem ocorrer.


Como geralmente, tentei resolver o problema da maneira clássica.

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

#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);
  }
}


Este roteiro mostra uma posição a 0,8 lotes. Precisamos de 0,9.

 
fxsaber:

A execução deste roteiro dá uma posição de 0,8 lotes. Eu preciso de 0,9.

Testado algumas vezes em 2 servidores, eu só consegui 0,9


A lógica dos testes é clara - estamos tentando nos livrar da execução assíncrona em um tick, o esquema geral deste processo (como sincronizar em um tick) é importante saber

 
fxsaber:

Tradicionalmente, uma tarefa simples antes do fim de semana.


C'um caraças! E eu tenho 0,8 (no MQDemo -0,9). Quantos mais destes ancinhos existirão?

 
 
fxsaber:
Resolvido.

Esta é provavelmente a tarefa mais difícil de todas as tarefas facilmente formuladas neste tópico no momento.

Um teste muito forte de domínio da parte comercial da MQL5.

 

abrir uma ordem de compra com zero SL e TP, depois definir um SL e TP de 30 pips (se a memória me servir corretamente, isso é chamado de tipo de conta Execução de Mercado - SL e TP não podem ser definidos de uma só 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 uma ordem de compra com zero SL e TP, depois definir um SL e TP de 30 pips (se a memória me servir corretamente, isso é chamado de tipo de conta Execução de Mercado - SL e TP não podem ser definidos de uma só vez)

Para MT4, este código funciona:

Há cerca de dois ou três anos, o reconhecimento do tipo de execução foi introduzido a nível de terminal. Agora mesmo com o Market Execution você pode definir SL e TP e o próprio terminal irá dividir a ordem em duas ordens de operação.

 
Igor Makanu:

Abra uma ordem de compra com zero SL e TP, depois coloque um SL e TP de 30 pips (se a memória me servir corretamente, isto é chamado tipo de conta de Execução de Mercado - SL e TP não podem ser colocados simultaneamente)

Uma tarefa comum.