Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXVI): Arbeiten mit schwebenden Handelsanfragen - Positionseröffnung"
Aufträge werden geöffnet, aber alle schwebenden Aufträge sind nicht.
Exchange Symbole, Broker Otkritie, Version 5.00 build 2190.
Aufträge sind geöffnet, aber alle schwebenden Aufträge sind nicht.
Exchange Symbole, Broker Otkritie, Version 5.00 build 2190.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Artyom Trishkin, 2019.11.28 09:39 AM
In dieser Version der Bibliothek, sowie in der nächsten, habe ich es versäumt, die Order-Fill-Typen und Order-Expiry-Typen zu überprüfen. Das wird im nächsten (27) Artikel korrigiert werden.
Für den Moment kann ich vorschlagen, den Verfallstyp explizit anzugeben, wenn eine Handelsanfrage gesendet wird. Wenn Sie zum Beispiel eine schwebende Sell Limit-Order platzieren möchten, müssen Sie diese im Test-Expert Advisor hinzufügen:
//--- Wenn die Taste BUTT_SELL_LIMIT gedrückt wird: SellLimit setzen else if(button==EnumToString(BUTT_SELL_LIMIT)) { //--- SellLimit-Auftrag einstellen engine.PlaceSellLimit(lot,Symbol(),distance_pending,stoploss,takeprofit,magic,TextByLanguage("Schwebendes Verkaufslimit","Pending order SellLimit"),0,ORDER_TIME_DAY); }
Und tun Sie dasselbe in allen Zeilen, die den Aufruf von Methoden zum Setzen von Pending Orders enthalten.
//--- Datenposition in der magischen Zahlber int-Wert //----------------------------------------------------------- // Bit 32|31 24|2316|15 8|7 0| //----------------------------------------------------------- // Byte | 3 | 2| 1 | 0 | //----------------------------------------------------------- // data | uchar | uchar | ushort | //----------------------------------------------------------- // descr |pend req id| id2 | id1 | magic | //----------------------------------------------------------- //--- Rückgabe (1) des angegebenen magischen Zahlers, der ID der (2) ersten Gruppe, (3) zweiten Gruppe, (4) ausstehenden Anfrage vom Wert des magischen Zahlers ushort GetMagicID(void) const { return ushort(this.Magic() & 0xFFFF); } uchar GetGroupID1(void) const { return uchar(this.Magic()>>16) & 0x0F; } uchar GetGroupID2(void) const { return uchar((this.Magic()>>16) & 0xF0)>>4; } uchar GetPendReqID(void) const { return uchar(this.Magic()>>24) & 0xFF; }
Es gibt eine praktische Funktion zum Extrahieren von Bits aus einer Zahl.
//--- Extrahieren von cnt Bits an der k-ten Bitposition uint _getBits(const uint number,uint pos,uint cnt=1) const { return (number >> pos) & ((1 << cnt) - 1); } ushort GetMagicID(void) const { return ushort(_getBits(this.Magic(),0,16)); } uchar GetGroupID1(void) const { return uchar(_getBits(this.Magic(),16,4)); } uchar GetGroupID2(void) const { return uchar(_getBits(this.Magic(),20,4)); } uchar GetPendReqID(void) const { return uchar(_getBits(this.Magic(),24,8)); }
Gibt es eine Implementierung in der Bibliothek, um eine sofortige Marktausführung zu eröffnen?
Könnten Sie mir bitte sagen, wo genau, in welcher Methode, Sie die verschlüsselte Magie in der ausstehenden Anforderung entschlüsseln?
Nach einem Fehler bei der Eröffnung einer Position(unzureichendes Guthaben) und dem Auslösen eines Pending Request habe ich eine Position mit einer völlig anderen Magie erstellt (offenbar die verschlüsselte).
Wo kann man sie entschlüsseln? Ich möchte eine native Majik, keine neue.
void CTradingControl::OnPReqByErrCodeHandler()
Hier sollten Sie die Methode aufrufen, die die ursprüngliche Magie zurückgibt. Und welche Methode ist das? GetMagicID()?
//+------------------------------------------------------------------+ //| Gibt den Gewinn der Order in Pips zurück| //+------------------------------------------------------------------+ int COrder::ProfitInPoints(void) const { MqlTick tick={0}; string symbol=this.Symbol(); if(!::SymbolInfoTick(symbol,tick)) return 0; ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)this.TypeOrder(); double point=::SymbolInfoDouble(symbol,SYMBOL_POINT); if(type==ORDER_TYPE_CLOSE_BY || point==0) return 0; if(this.Status()==ORDER_STATUS_HISTORY_ORDER) return int(type==ORDER_TYPE_BUY ? (this.PriceClose()-this.PriceOpen())/point : type==ORDER_TYPE_SELL ? (this.PriceOpen()-this.PriceClose())/point : 0); else if(this.Status()==ORDER_STATUS_MARKET_POSITION) { if(type==ORDER_TYPE_BUY) return int((tick.bid-this.PriceOpen())/point); else if(type==ORDER_TYPE_SELL) return int((this.PriceOpen()-tick.ask)/point); } else if(this.Status()==ORDER_STATUS_MARKET_PENDING) { if(type==ORDER_TYPE_BUY_LIMIT || type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_BUY_STOP_LIMIT) return (int)fabs((tick.bid-this.PriceOpen())/point); else if(type==ORDER_TYPE_SELL_LIMIT || type==ORDER_TYPE_SELL_STOP || type==ORDER_TYPE_SELL_STOP_LIMIT) return (int)fabs((this.PriceOpen()-tick.ask)/point); } return 0; }
Warum gibt es hier keine Berechnung für den Typ ORDER_STATUS_DEAL?
Im Allgemeinen ist es nicht klar, wie man den Gewinn in Punkten eines geschlossenen Handels oder einer Position erhält...
Und er ist immer 0:
deal_profit_pts=(int)deal.GetProperty(ORDER_PROP_PROFIT_PT)

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXVI): Arbeiten mit schwebenden Handelsanfragen - erste Implementation (Positionseröffnung) :
In diesem Artikel werden wir einige Daten im Wert der Magicnummer der Aufträge und Positionen speichern und mit der Umsetzung der schwebenden Anträge beginnen. Um das Konzept zu überprüfen, erstellen wir die erste Testanforderung zur Eröffnung von Marktpositionen, wenn ein Serverfehler auftritt, der ein Warten und das Senden einer wiederholten Anfrage erfordert.
Kompilieren und starten wir den EA. Trennen wir die Internetverbindung und warten, bis das folgende Bild in der unteren rechten Ecke des Terminals erscheint:
Nachdem dem Unterbrechen der Internetverbindung klicken wir auf "Verkaufen", gibt es die folgenden Einträge werden im Journal:
Nach Erhalt des Fehlers erstellt die Bibliothek eine schwebende Anfrage mit den Parametern, die während des erfolglosen Versuchs, eine Short-Position zu eröffnen, festgelegt wurden.
Die schwebende Anfrage enthält auch die Anzahl der Versuche und die Wartezeit von 20 Sekunden.
Stellen wir nun die Internetverbindung und die Verbindung zum Handelsserver wieder her:
Sobald die Verbindung wiederhergestellt ist, beginnt die Bibliothek mit der Bearbeitung einer schwebenden Anfrage, die an den Server gesendet wird. Infolgedessen haben wir eine offene Position und folgende Journaleinträge:
Wie wir sehen können, wurde nach der Wiederherstellung der Verbindung zum Handelsserver der Handel für das Girokonto mit einer Verzögerung aktiviert.
Aber die schwebende Anfrage hat es trotzdem geschafft ...
Außerdem sehen wir die wirkliche Magicnummer 17629307 im Journal, gefolgt von der in den EA-Einstellungen definierten Magicnummer in Klammern (123) sowie einen weiteren Eintrag G1: 13, der darüber informiert, dass die erste Gruppen-ID gleich 13 ist, während die zweite Gruppen-ID fehlt — ihr Wert ist Null, daher gab es keinen zweiten Eintrag mit der G2: XX zweite Gruppen-ID.
Autor: Artyom Trishkin