Merkmale der Sprache mql5, Feinheiten und Techniken

 
In diesem Thema werden undokumentierte Möglichkeiten der Arbeit mit der Sprache mql5 und Beispiele für die Lösung bestimmter Probleme behandelt. Ich möchte, dass dieser Zweig näher am Inhalt der FAQ ist als an der Diskussion. Ich lade alle erfahrenen Programmierer ein, ihre Lösungen und Programmiertechniken mitzuteilen. Die Abdeckung von Funktionen, die nicht in der Hilfe beschrieben sind, ist besonders willkommen.
 
fxsaber:

wenn einePosition erfolgreich durch einen Marktauftrageröffnet wird, jedes Mal ein Null-Ergebnis erzielt wird?

Vom BSB
Es ist nicht garantiert, dass das Result-Deal-Ticket besetzt wird. Ob sie gefüllt ist oder nicht, hängt vom Ausführungsmodus des Instruments und den Einstellungen eines bestimmten Servers ab.
Wer ein Nicht-Null-Ergebnis gebucht hat, muss handeln.
 
Sobald ein OrderSend ausgeführt wurde, ist die Adressierung des betreffenden Auftrags, der betreffenden Position oder des betreffenden Geschäfts nicht immer erfolgreich. Es gibt Situationen, in denen es notwendig ist, mehrere Dutzend Millisekunden zu warten, bis historische oder aktuelle Handelsinformationen korrekt sind.
 
fxsaber:
Sobald OrderSend ausgeführt wurde, ist die Adressierung des betreffenden Auftrags, der betreffenden Position oder des betreffenden Geschäfts nicht immer erfolgreich. Es gibt Situationen, in denen Sie ein paar Dutzend Millisekunden warten müssen, bis historische oder aktuelle Handelsinformationen korrekt sind.
dasselbe in MT4, es hängt vom jeweiligen Server ab
 
Es ist nicht immer möglich, den Preis des Auftrags zu kennen, der den Handel ausgelöst hat.
 
Es ist nicht immer möglich, die SL/TP-Niveaus einer geschlossenen Position zu ermitteln.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

TakeProfit (und StopLoss) einer geschlossenen Position

fxsaber, 2016.07.17 20:19

Vor der Einführung von Hedge TakeProfit wurden offene Positionen nicht an der Börse in Form von Limit-Orders gespeichert, sondern auf dem MT5-Handelsserver. Zum Zeitpunkt der Annahme wurden sie nicht als Limitaufträge zum angegebenen Preis, sondern als Marktaufträge zum angegebenen Preis an die Börse übermittelt.

Diese Funktion ist im Tester sehr gut sichtbar, wenn TP ausgelöst wird: die entsprechende Marktorder (und nicht Limit) erscheint. Da die Gewinnmitnahme eine nicht existierende Art von Börsenaufträgen ist (es gibt nur Markt- und Limit-Aufträge), lag dieser Sachverhalt durchaus im Bereich der "Marktfähigkeit".

Mit dem Auftauchen des Hedge änderte sich die Situation nicht - der Gewinn blieb virtuell. Bei MT4 ist die Situation anders: Über die Jahre der MT4-Brücken hat es sich eingebürgert, dass MT4 Take-Profit-Orders Limit-Orders sind.

Aufgrund dieser Virtualität ziehen sich einige der Funktionen von MT5 wie ein roter Faden durch. Es ist nicht nur besser, Takeprofit nicht in MT5 zu platzieren, sondern wenn Sie ein Limit-Gegenstück wollen, gibt es keine Möglichkeit, durch MQL5 seine Takeprofit- und Stoploss-Werte zu kennen, nachdem Sie die Position geschlossen haben.

Dies ist kein willkürlicher Vorwurf, sondern das Ergebnis stundenlanger Versuche, herauszufinden (kein HistorySelectByPosition und anderes Zeug hilft), wie alles funktioniert. Und ich entschuldige mich gerne, wenn ich mich irre. Um nicht unbegründet zu sein, zeige ich einen Expert Advisor für den Tester (er ist leichter zu verstehen) auf dem RoboForexEU-MetaTrader 5-Server, der eine Position eröffnet und dann SL- und TP-Level setzt.

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 diesem EA können SL und TP einer einzelnen geschlossenen Position nicht definiert werden (in OnDeinit). Soll das so sein?


Aus dem Zitat geht auch hervor, dass der TP einer Position im MT5 immer eine Marktorder ist. Setzen Sie kein Lesezeichen für das Grenzwert-Gegenstück - siehe oben.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Slawa, 2017.02.14 13:46

Warum? Eine einzige Aktion ist ausreichend.

Solange das Symbol in der Marktübersicht ausgewählt ist und die Historie des Symbols im Expert Advisor gespeichert ist, wird es synchronisiert. Das Halten durch den Expert Advisor bedeutet, dass Sie mindestens einmal alle 2 Minuten auf diese Historie zugreifen, indem Sie zum Beispiel einen Balken kopieren. Wenn die Historie synchronisiert ist, wird für das Kopieren eines Taktes keine Zeit aufgewendet - nur ein paar Prozessorzyklen. Oder, wie es hier gerade gesagt wurde, fragen Sie nach der Anzahl der Takte, auch ein paar Taktzyklen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Alexey Kozitsyn, 2017.02.14 13:47

Enthalten die Indikatoren ein 2-Minuten-Intervall?

Ja, und wird bei der Überprüfung der Synchronisierung auch die Synchronisierung beibehalten?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Slawa, 2017.02.14 13:50

Dies gilt auch für Indikatoren. Erstellen Sie einen 1-Minuten-Timer und fragen Sie nach der Anzahl der Balken aller interessierenden Zeitreihen.

Die Überprüfung der Zeitmessung hält die Zeit nicht ein.

 
fxsaber:
Sobald OrderSend ausgeführt wurde, ist der Verweis auf den entsprechenden Auftrag, die Position oder den Handel nicht immer erfolgreich. Es gibt Situationen, in denen Sie ein paar Dutzend Millisekunden warten müssen, bis die historischen oder aktuellen Handelsinformationen korrekt sind.

Sie müssen nicht ein paar Millisekunden warten.

Die Nachricht wird in OnTradeTransaction erscheinen

siehe Code

Dateien:
 
Prostotrader:

Sie müssen nicht ein paar Millisekunden warten.

Die Nachricht wird in OnTradeTransaction erscheinen

siehe Code.

In den Skripten gibt es das nicht. Es ist dumm, EA+ExpertRemove anstelle des Skripts zu verwenden.

Außerdem stürzt OrderSend durch Timeout ab, wenn 180 Sekunden lang keine Antwort vom Server kommt. Dies deutet darauf hin, dass die OnTradeTransaction ewig auf Tickets warten kann. Und die Option von nur einem order_ticket für OnTradeTransaction, wie in Ihrem Skript, ist schlecht. Nach dem asynchronen Senden wird mit Auftragslisten gearbeitet. Deshalb ist es asynchron - um mit Stapeln zu arbeiten. Und wenn es keine Arbeit mit Batch gibt, dann wird async nie benötigt.

 
Der MT4-OrderClosePrice-Trick funktioniert auch im MT5 -PositionGetDouble(POSITION_PRICE_CURRENT).
Grund der Beschwerde: