Caratteristiche del linguaggio mql5, sottigliezze e tecniche

 
In questo argomento si parlerà di modi non documentati di lavorare con il linguaggio mql5, esempi di risoluzione di certi problemi. Vorrei che il contenuto di questo ramo fosse più vicino alle FAQ che alla discussione. Invito tutti i programmatori esperti a condividere le loro soluzioni e tecniche di programmazione. La copertura di caratteristiche non descritte nella guida è particolarmente gradita.
 
fxsaber:

quando unaposizione viene aperta con successo da un ordine a mercato, si ottiene ogni volta uno zero Result.deal?

Dal consiglio di amministrazione
Non è garantito che il biglietto dell'affare Result venga riempito. Il riempimento o meno dipende dalla modalità di esecuzione dello strumento e dalle impostazioni di un particolare server.
Chi ha prenotato un Result.deal non nullo - agisca.
 
Una volta che un OrderSend è stato eseguito, l'indirizzamento dell'ordine, della posizione o della transazione in questione non ha sempre successo. Ci sono situazioni in cui è necessario aspettare diverse decine di millisecondi perché le informazioni storiche o attuali sul commercio diventino corrette.
 
fxsaber:
Una volta che OrderSend è stato eseguito, l'indirizzamento dell'ordine, della posizione o della transazione in questione non ha sempre successo. Ci sono situazioni in cui è necessario aspettare qualche decina di millisecondi perché le informazioni storiche o attuali sul commercio diventino corrette.
lo stesso in MT4, dipende dal server specifico
 
Non è sempre possibile conoscere il prezzo dell'ordine che ha generato il trade
 
Non è sempre possibile scoprire i livelli SL/TP di una posizione chiusa.

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

TakeProfit (e StopLoss) di una posizione chiusa

fxsaber, 2016.07.17 20:19

Prima dell'introduzione dell'hedge TakeProfit le posizioni aperte non erano memorizzate sulla borsa sotto forma di ordini limite, ma sul server di trading MT5. Al momento dell'accettazione sono stati inviati alla borsa non come ordini limite al prezzo dichiarato ma come ordini di mercato al prezzo dichiarato.

Questa caratteristica è molto ben visibile nel tester quando viene attivato il TP: appare l'ordine a mercato appropriato (piuttosto che il limite). Dato che il takeprofit è un tipo di ordine di scambio inesistente (ci sono solo ordini di mercato e ordini limite), questo stato di cose era ben all'interno della "commerciabilità".

Con l'apparizione dell'hedge la situazione non è cambiata - il takeprofit è rimasto virtuale. La situazione è diversa in MT4: nel corso degli anni di ponti MT4 è diventato standard piazzare ordini limite sul takeprofit MT4.

È a causa di questa virtualità che alcune delle caratteristiche di MT5 si trascinano come una scia. Non solo è meglio che il takeprofit non sia collocato in MT5, ma se volete una controparte limite, non c'è modo di conoscere i suoi valori di takeprofit e stoploss attraverso MQL5 dopo aver chiuso una posizione.

Questa non è un'accusa indiscriminata, ma il risultato di ore di tentativi di scoprire (nessuna HistorySelectByPosition e altre cose aiutano) come funziona tutto. E sono felice di scusarmi se mi sbaglio. Per non essere infondato, sto mostrando un Expert Advisor per il tester (è più facile da capire) sul server RoboForexEU-MetaTrader 5, che apre una posizione, poi mette livelli SL e TP.

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

In questo EA, SL e TP di una singola posizione chiusa non possono essere definiti (in OnDeinit). Si suppone che sia così?


Dalla citazione segue anche che il TP di una posizione in MT5 è sempre un ordine a mercato. Non mettere nei preferiti la controparte del limite - vedi sopra.
 

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

Bug, bug, domande

Slawa, 2017.02.14 13:46

Perché? Una sola azione è sufficiente.

Finché il simbolo è selezionato nella revisione del mercato e la cronologia sul simbolo è tenuta dall'Expert Advisor, è mantenuta in sincronia. Il mantenimento da parte dell'Expert Advisor significa che accederai a questa storia almeno una volta ogni 2 minuti, per esempio copiando una barra. Se la storia è sincronizzata, non si spende tempo per copiare una barra - solo alcuni cicli del processore. Oppure, come è stato appena detto qui, chiedere il numero di barre, anche alcuni cicli di clock

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

Bug, bug, domande

Alexey Kozitsyn, 2017.02.14 13:47

Gli indicatori includono un intervallo di 2 minuti?

Sì, e controllando il fatto della sincronizzazione si terrà anche la sincronizzazione?

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

Bug, bug, domande

Slawa, 2017.02.14 13:50

Questo vale anche per gli indicatori. Creare un timer di 1 minuto e chiedere il numero di barre di tutte le serie temporali di interesse.

Il controllo del fatto della temporizzazione non tiene la temporizzazione.

 
fxsaber:
Una volta che OrderSend viene eseguito, il riferimento all'ordine, alla posizione o al commercio appropriato non sempre ha successo. Ci sono situazioni in cui è necessario aspettare qualche decina di millisecondi perché l'informazione storica o corrente del commercio diventi corretta.

Non è necessario aspettare qualche millisecondo.

Il messaggio arriverà in OnTradeTransaction

vedere il codice

File:
 
prostotrader:

Non è necessario aspettare qualche millisecondo.

Il messaggio arriverà in OnTradeTransaction

vedere il codice.

Gli script non ce l'hanno. È stupido usare EA+ExpertRemove invece dello script.

Inoltre, OrderSend va in crash per timeout se non c'è risposta dal server per 180 secondi. Questo suggerisce che l'OnTradeTransaction può accumulare per sempre biglietti in attesa. E l'opzione di un solo order_ticket per OnTradeTransaction, come nel tuo script, non va bene. Dopo l'invio asincrono c'è un lavoro con liste di ordini. Ecco perché è asincrono - per lavorare con i lotti. E se non c'è lavoro con il batch, allora l'async non è mai necessario.

 
Il trucco di MT4-OrderClosePrice funziona anche in MT5 -PositionGetDouble(POSITION_PRICE_CURRENT).
Motivazione: