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"

 

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:

2019.11.26 15:34:48.661 CTrading::OpenPosition<uint,uint>: Invalid request:
2019.11.26 15:34:48.661 No connection with the trade server
2019.11.26 15:34:48.661 Correction of trade request parameters ...
2019.11.26 15:34:48.661 Trading attempt #1. Error: No connection with the trade server


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:

2019.11.26 15:35:00.853 CTrading::OpenPosition<double,double>: Invalid request:
2019.11.26 15:35:00.853 Trading is prohibited for the current account
2019.11.26 15:35:00.853 Correction of trade request parameters ...
2019.11.26 15:35:00.853 Trading operation aborted
2019.11.26 15:35:01.192 CTrading::OpenPosition<double,double>: Invalid request:
2019.11.26 15:35:01.192 Trading is prohibited for the current account
2019.11.26 15:35:01.192 Correction of trade request parameters ...
2019.11.26 15:35:01.192 Trading operation aborted
2019.11.26 15:35:01.942 - Position is open: 2019.11.26 10:35:01.660 -
2019.11.26 15:35:01.942 EURUSD Opened 0.10 Sell #486405595 [0.10 Market-order Sell #486405595] at price 1.10126, sl 1.10285, tp 1.09985, Magic number 17629307 (123), G1: 13
2019.11.26 15:35:01.942 OnDoEasyEvent: Position is open


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

 
Hallo! Ich habe die neueste Version der Bibliothek und Expert Part_26 heruntergeladen, den visuellen Modus auf dem Testgerät eingestellt und die Marktaufträge werden geöffnet, aber alle schwebenden Aufträge nicht.

Aufträge werden geöffnet, aber alle schwebenden Aufträge sind nicht.

Exchange Symbole, Broker Otkritie, Version 5.00 build 2190.

 
Alexander:
Hallo! Ich habe die neueste Version der Bibliothek und Expert Part_26 heruntergeladen, den visuellen Modus und den Marktmodus auf den Tester gelegt.

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

Diskussion über den Artikel "Bibliothek zur einfachen und schnellen Erstellung von Programmen für MetaTrader (Teil XXV): Behandlung von Fehlern, die vom Handelsserver zurückgegeben werden"

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.


 
Ja, danke, so funktioniert es.
 
//--- 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));                            }
 
amrali:

Es gibt eine praktische Funktion zum Extrahieren von Bits aus einer Zahl.

Danke
 
Gibt es eine Implementierung in der Bibliothek, um eine sofortige Marktausführung zu eröffnen?
 
iabbott:
Gibt es eine Implementierung in der Bibliothek, um eine sofortige Marktausführung zu eröffnen?
Ja
 

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)