Bibliotheken: MT4Orders - Seite 68

 
fxsaber #:
Die neueste Version ist immer hier.

Einer der beliebtesten Broker hat einen Teil der Handelshistorie aus allen Handelskonten seiner Kunden entfernt. Daher sind viele Benutzer darauf gestoßen, dass die Bibliothek Warnungen aufgrund einer falschen Historie auf dem Handelsserver ausgibt.


Dieses Problem wurde in der neuesten Version behoben.

Laden Sie die neueste Version der Bibliothek von der russischsprachigen Seite herunter.

 
'DEAL_SL' - undeclared identifier       MT4Orders.mqh   1186    89
'DEAL_TP' - undeclared identifier       MT4Orders.mqh   1187    91
'MQL_HANDLES_USED' - undeclared identifier      MT4Orders.mqh   1345    104
'MQL_HANDLES_USED' - undeclared identifier      MT4Orders.mqh   1726    124

MT5 baut nicht auf alten Versionen auf.

Und die letzte Release-Version ist fehlerhaft https://www.mql5.com/ru/forum/380278/page31#comment_26286913

Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе
Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе
  • 2021.12.04
  • www.mql5.com
В пятницу 22 октября 2021 года будет выпущена обновленная версия платформы MetaTrader 5...
 
traveller00 #:

Es kann nicht auf ältere Versionen von MT5 aufgebaut werden.

Ich kompiliere auf neuen Versionen und verwende es auf b2958. Ich behandle Release-Builds auf die gleiche Weise wie Betas.

 

Ich habe eine kurze Frage zu Teilschließungen.

In MT4 führt das Schließen von 0,01 Lots einer 0,1-Lot-Order dazu, dass das ursprüngliche Ticket mit einer Größe von 0,01 Lots geschlossen wird und der Orderkommentar dieser teilweise geschlossenen Order sich in "to: xxxxxx" ändert. Gleichzeitig wird ein neuer Auftrag mit 0,09 Lots eröffnet, dessen Kommentar auf "von: xxxxxx" gesetzt wird.

Das scheint in MT5 nicht zu passieren (zumindest listet OrdersToString() keinen Orderkommentar für die offenen oder geschlossenen Teile auf), so dass ich die Kette der teilweisen Schließungen nicht verfolgen kann, wie ich es normalerweise tun würde.

Haben Sie einen Schnipsel von MT4Orders-kompatiblen Code, den Sie teilen können, oder können Sie erklären, wie ich es zuverlässig tun kann?

 

Wie kann man die teilweise Ausführung von offenen Positionenanzeigen.

#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  // Position öffnen.
  const TICKET_TYPE Ticket  = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0, "Hello!");
  
  // Teilweise Schließungen.
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
  {
    OrderClose(OrderTicket(), 0.01, OrderClosePrice(), 0);
    OrderClose(OrderTicket(), 0.02, OrderClosePrice(), 0);
  }
    
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      PrintFullOrder();
      
      Print("");
    }
}

#include <fxsaber\TradesID\TradesID.mqh> // https://www.mql5.com/de/code/34173

void PrintFullOrder()
{
  static TRADESID TradesID;
  
  long Deals[];  
  const int Size = TradesID.GetDealsByID(OrderTicketID(), Deals);
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Deals[i], SELECT_BY_TICKET))
      OrderPrint();  
}


Ergebnis.

#50005051444 2021.12.20 21:22:29.566 buy 0.07 GBPUSD 1.32174 0.00000 0.00000 1.32169 0.00 0.00 -0.31 Hello! 0
#50004982892 2021.12.20 21:22:29.566 buy 0.01 GBPUSD 1.32174 0.00000 0.00000 2021.12.20 21:22:29.631 1.32169 0.00 0.00 -0.04 Hello! 0
#50004982893 2021.12.20 21:22:29.566 buy 0.02 GBPUSD 1.32174 0.00000 0.00000 2021.12.20 21:22:29.694 1.32169 0.00 0.00 -0.09 Hello! 0

#50005051217 2021.12.20 21:22:05.921 buy 0.09 USDCHF 0.92179 0.00000 0.00000 0.92179 0.00 0.00 0.00 Hello! 0
#50004982634 2021.12.20 21:22:05.921 buy 0.01 USDCHF 0.92179 0.00000 0.00000 2021.12.20 21:22:05.984 0.92174 0.00 0.00 -0.05 Hello! 0
 
SysFX Orderkommentar dieser teilweise geschlossenen Order sich in "to: xxxxxx" ändert. Gleichzeitig wird ein neuer Auftrag mit einer Größe von 0,09 Lots eröffnet, dessen Kommentar auf "von: xxxxxx" gesetzt wird.

Das scheint in MT5 nicht zu passieren (zumindest listet OrdersToString() keinen Orderkommentar für die offenen oder geschlossenen Teile auf), so dass ich die Kette der Teilschließungen nicht verfolgen kann, wie ich es normalerweise tun würde.

Haben Sie einen Schnipsel von MT4Orders-kompatiblen Code, den Sie teilen können, oder können Sie erklären, wie ich es zuverlässig tun kann?

Beispiel.

 
fxsaber #:

Beispiel.

Das ist perfekt! ...danke für die schnelle Antwort :)

 
// Liste ändern:
// 28.12.2021
// Fix: OrderSelect(Index, SELECT_BY_POS, MODE_TRADES) berücksichtigt eine weitere Unsynchronisation auf der MT5-Seite.
// Fix: OrderLots(true) berücksichtigt eine weitere MT5-seitige Fehlsynchronisation. 


Vor allem die erste Änderung in der Liste der Änderungen ermöglichte es, die beiden Logiken identisch zu machen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2021.05.12 18:24

Auf den ersten Blick sollten diese beiden Codes das gleiche Ergebnis liefern.

while (OrdersTotal() <= 1)
  if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
  else
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    


while (OrdersTotal() <= 1)
  if (!OrdersTotal())
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    
  else if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);


Tatsächlich ist das aber nicht so. Versuchen Sie, den Grund zu erkennen.

Im Allgemeinen hat sich herausgestellt, dass es sogar besser ist, sich gegen die Besonderheiten der Orderhindernisse im MT5 zu schützen.

 
// Liste ändern:
// 29.12.2021
// Korrektur: Verbesserte Synchronisierung im ByPass-Modus.
 

In MT4 ist beim Abrufen von Aufträgen ein Backtracking (Doppelzählung) möglich, da die Auftragstabelle wackelt.


In MT4Orders ändert sich die Indizierung der Ordertabelle in einer bestimmten Situation. Dies geschieht, wenn eine MT5-Moret-Order zu einer MT5-Position wird. Wenn Sie versuchen, diese Situation auf einigen Servern anzutreffen, können Sie einen Buchungsfehler erhalten. Ich habe dazu eine Demonstration geschrieben.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Maximale Wartezeit (in µs) für die Synchronisierung der Handelsumgebung
#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  MinLot SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)

double GetLots()
{
  double Lots = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) // Führen Sie alle Aufträge aus - hier kann es zu einer Störung kommen.
    if (OrderSelect(i, SELECT_BY_POS))
      Lots += OrderLots();
      
  return(NormalizeDouble(Lots, 2));
}

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Ablehnung der eingebauten MT5-OrderSend-Ergebniskorrektur.

  const double NewLots = 0.11;
  
  while (!IsStopped())
  {
    const double Lots = NormalizeDouble(GetLots() + NewLots, 2); // Wie viele Lose sollen nach einer Bestellung insgesamt vorhanden sein.
    const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, NewLots, Ask, 0, 0 ,0); // Es wurde ein Marktauftrag erteilt.
    
    if (Ticket != -1)
    {
      while (!PositionSelectByTicket(Ticket)) // Warten Sie darauf, dass der Marktauftrag in eine Position umgewandelt wird.
      {
        const double Lots2 = GetLots(); // Berechnen Sie das Gesamtvolumen.
        
        if (Lots2 != Lots) // Gesamtvolumen stimmt nicht mit der vorläufigen Berechnung überein - Ausgabe.
          Alert((string)Lots + " " + (string)Lots2);                        
      }
    }
          
    if (OrderSelect(Ticket, SELECT_BY_TICKET) &&
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)) // Senden Sie einen Marktauftrag, um die Position zu schließen.
      while (PositionSelectByTicket(Ticket))                          // Warten auf die Schließung der Position.
        ;      
  }
    
  Print(MT4ORDERS::ByPass.ToString()); // Drucken Sie die Synchronisationsstatistiken.
}


Solch ein EA wird auf einigen Konfigurationen funktionieren. Der ByPass-Modus macht die Alert-Werte stabil, beseitigt sie aber immer noch nicht.


Ich selbst handele nicht ohne ByPass-Modus, weil es eine sehr starke Sache ist, MT5-Überraschungen zu umgehen. Ich handele auch nicht ohne Snapshots. Es ist der Snapshot-Mechanismus, der es Ihnen ermöglicht, sich von Überindizierungen zu befreien.


So sieht es bei demselben Beispiel aus.

#define  VIRTUAL_SNAPSHOT_REFRESHTIME 1000 // Snapshot-Lebensdauer für die Aktualisierung. In MT5 erfordert verbunden MT4Orders.mqh
#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Verwerfen des historischen Schnappschusses für bessere Leistung
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/de/code/22577

double GetLots()
{
  double Lots = 0;

  VIRTUAL::Snapshot(0, -1, false, ""); // Zasnepsholy realen Handelsumgebung.
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) // Aufgrund des Snapshot-Mechanismus alle Aufträge sicher ausführen.
    if (OrderSelect(i, SELECT_BY_POS))
      Lots += OrderLots();

  VIRTUAL::SnapshotDelete(); // Entfernter Schnappschuss.
      
  return(NormalizeDouble(Lots, 2));
}


Ich empfehle das ByPass+Snapshot-Paket. Es hilft nicht nur, Fallstricke zu umgehen, sondern reduziert auch den Verbrauch von Rechenressourcen erheblich. Vor allem, wenn es viele Aufträge/Berater in mehreren Währungen gibt.