Il grande e terribile MT4 per sempre (o come strategizzare una transizione) - pagina 27

 

Forum sul trading, sistemi di trading automatico e strategie di trading di prova

OrderModify() in MQL5?

Edward Munroe, 2021.05.27 00:51

Fai una domanda semplice, ottieni una risposta semplice? Perché quasi tutto in mql5 deve essere così incasinato?

Bella domanda.

 

Tradizionalmente un compito semplice prima del fine settimana.

Una posizione aperta è 1 lotto. Dopo aver eseguito lo script abbiamo bisogno di far diventare la posizione 0,9 lotti.

È chiaro che lo script può essere lanciato in qualsiasi momento. Per questo ci sono molte situazioni che possono verificarsi.


Come al solito, ho cercato di risolvere il problema nel modo classico.

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

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


Questo script mostra una posizione a 0,8 lotti. Abbiamo bisogno di 0,9.

 
fxsaber:

L'esecuzione di questo script dà una posizione di 0,8 lotti. Ho bisogno di 0,9.

Testato un paio di volte su 2 server, ho ottenuto solo 0,9


La logica dei test è chiara - stiamo cercando di sbarazzarci dell'esecuzione asincrona su un tick, lo schema generale di questo processo (come sincronizzare su un tick) è importante da conoscere

 
fxsaber:

Tradizionalmente un compito semplice prima del fine settimana.


Porca miseria! E io ho 0.8 (su MQDemo -0.9). Quanti altri rastrellamenti ci saranno?

 
 
 
fxsaber:
Risolto.

Questo è probabilmente il compito più difficile di tutti i compiti facilmente formulabili in questo thread al momento.

Una prova molto forte di padronanza della parte commerciale di MQL5.

 

aprire un ordine di acquisto con SL e TP nulli, poi impostare uno SL e TP di 30 pip (se la memoria non mi inganna, questo si chiama tipo di conto Market Execution - SL e TP non possono essere impostati contemporaneamente)

Per MT4 questo codice funziona:

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:

aprire un ordine di acquisto con SL e TP nulli, poi impostare uno SL e TP di 30 pip (se la memoria non mi inganna, questo si chiama tipo di conto Market Execution - SL e TP non possono essere impostati contemporaneamente)

Per MT4 questo codice funziona:

Circa due o tre anni fa è stato introdotto il riconoscimento del tipo di esecuzione a livello di terminale. Ora anche con Market Execution puoi impostare SL e TP e il terminale stesso dividerà l'ordine in due ordini di compravendita.

 
Igor Makanu:

Aprire un ordine di acquisto con SL e TP nulli, poi piazzare un SL e TP di 30 pips (se la memoria non mi inganna, questo si chiama tipo di conto Market Execution - SL e TP non possono essere piazzati contemporaneamente)

Un compito comune.