Bibliotheken: MT4Orders - Seite 13

 
fxsaber:

Aktualisierung

// Liste ändern:
// 14.06.2017:
// Hinzufügen: Erste Implementierung der Erkennung von SL/TP-Schließpositionen ist aktiviert (закрытых через OrderClose).

Ein Beispiel, wie es funktioniert

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 versus MT4 Terminal Screens - Enttäuscht von den Änderungen in MT 5

fxsaber, 2017.07.07 08:46 AM

Führe zunächst dieses Skript aus.

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

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  SLIPPAGE 100
#define  OFFSET (SLIPPAGE * _Point)

void OnStart()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, SLIPPAGE, 0, 0), SELECT_BY_TICKET))
  {
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - OFFSET, OrderOpenPrice() + OFFSET, 0);
    
    if (OrderSelect(OrderTicket(), SELECT_BY_TICKET))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), SLIPPAGE);
  }
}

Ergebnis:

'6145767': instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': accepted instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': deal #140159795 buy 1.00 EURUSD at 1.14156 done (based on order #156755661)
'6145767': order #156755661 buy 1.00 / 1.00 EURUSD at 1.14156 done in 252.283 ms
'6145767': modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': accepted modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': modify #156755661 buy 1.00 EURUSD -> sl: 1.14056, tp: 1.14256 done in 109.586 ms
'6145767': instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': accepted instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': deal #140159796 sell 1.00 EURUSD at 1.14147 done (based on order #156755662)
'6145767': order #156755662 sell 1.00 / 1.00 EURUSD at 1.14147 done in 219.817 ms


Dann führen Sie dieses aus

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

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    OrderPrint();
}

Ergebnis:

#140159796 2017.07.07 09:38:31 buy 1.00 EURUSD 1.14156 1.14056 1.14256 2017.07.07 09:38:32 1.14147 0.00 0.00 -7.88 0


Auf diese Weise ist es möglich, den SL/TP von geschlossenen Positionen zu erfahren.

 

MT4 enthält weniger Informationen als MT5. Aber nichts hindert Sie daran, MT4/5 Handels-APIs gleichzeitig zu nutzen.

// Das Skript zeigt das Feld "Grund" aller geschlossenen Positionen an
#include <MT4Orders.mqh>

void OnStart()
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OrderPrint();
      
      Print(EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(OrderTicket(), DEAL_REASON)));
    }      
}


Ergebnis

#141705115 2017.07.18 15:02:37 sell 0.01 EURUSD 1.15508 0.00000 0.00000 2017.07.19 13:04:05 1.15309 0.00 -0.01 1.99 0
DEAL_REASON_CLIENT

#140517682 2017.07.11 12:06:48 buy 0.01 EURUSD 1.13941 1.13926 0.00000 2017.07.11 12:07:10 1.13926 0.00 0.00 -0.15 [sl 1.13926] 0 DEAL_REASON_SL

#137746488 2017.06.20 01:22:26 sell 2.00 EURUSD 1.11474 0.00000 0.00000 2017.06.20 01:22:41 1.11484 0.00 0.00 -20.00 0 DEAL_REASON_EXPERT
 

Als OrderSend noch nicht mit der Handelsumgebung des Terminals synchronisiert war, wurde die automatische Synchronisierung in MT4Orders eingebaut.

Nach einiger Zeit bauten die Entwickler die Synchronisation ein, und der alte Synchronisationscode wurde mit einer kleinen Ausnahme in der Bibliothek belassen - er begann nicht nur zu synchronisieren, sondern auch zu prüfen, ob die OrderSend-Synchronisation der Entwickler korrekt funktioniert. Im Falle eines Fehlers sollte ein Alert auftauchen

    if (MT4ORDERS::OrderSendBug)
    {
      Alert("BUG!!!!!!");


Es gibt Berichte, dass diese Warnung in seltenen Fällen ausgelöst wird (anscheinend, wenn die CPU ausgelastet ist) und signalisiert, dass das OrderSend der Entwickler bei der Synchronisierung mit der Handelsumgebung fehlerhaft ist. Ich weiß nicht, wie ich dies den Entwicklern in SD melden kann, da ich es nicht reproduzieren kann. Aber die Tatsache bleibt bestehen.


Daher gibt es zwei Möglichkeiten.

  1. Belassen Sie es so wie es ist - der Alert wird über den Fehler der Entwickler berichten.
  2. Verweigern Sie den Alert.
In beiden Fällen synchronisiert die Bibliothek OrderSend zwangsweise in kürzester Zeit.
 
// Liste ändern:
// 03.08.2016:
// Release - geschrieben und getestet nur auf Offline-Tester.
// ....
// 03.08.2017:
// Hinzufügen: OrderCloseBy hinzugefügt.
// Add: Die OrderSelect-Operation im MODE_TRADES-Modus wurde beschleunigt. Jetzt ist es möglich, die Daten der ausgewählten Bestellung über
// Die entsprechenden MT4-Order-Funktionen, auch wenn die MT5-Position/Order (nicht in der Historie) nicht über MT4Orders ausgewählt wird.
// Zum Beispiel über MT5-PositionSelect*-Funktionen oder MT5-OrderSelect.
// Hinzufügen: OrderOpenPriceRequest() und OrderClosePriceRequest() hinzugefügt - geben den Preis einer Handelsanfrage beim Öffnen/Schließen einer Position zurück.
// Mit Hilfe dieser Funktionen ist es möglich, die entsprechenden Slippages von Aufträgen zu berechnen.

Die Bibliothek ist ein Jahr alt...

 
fxsaber:

Die Bibliothek ist ein Jahr alt...

Herzlichen Glückwunsch! Das ist eine wunderbare Verpackung.

 
fxsaber:

Die Bibliothek ist ein Jahr alt...


Herzlichen Glückwunsch!

Es stimmt, ich habe zwei EAs ausprobiert und die Erfahrung war negativ, beim ersten Versuch hat die Kompilierung nicht geklappt - ich habe es nicht verstanden, weil ich die Handelsfunktionen nicht verstanden habe, bei der zweiten Variante wurde der EA furchtbar langsam - er nimmt alle Ressourcen des Kernels in Anspruch, aber die Kompilierung war erfolgreich.

Es ist schwer zu sagen, was der Grund für die zweite Variante ist, vielleicht nicht wegen der Klasse - es ist eine halbautomatische - Handel auf Ebene Breakout - Ebenen werden von Hand gebaut.

 

Danke für die Glückwünsche, ich schätze die Kommentare von allen! Sie werden immer berücksichtigt.

Aleksey Vyazmikin:

Der EA ist furchtbar langsam geworden - er nimmt alle Kernel-Ressourcen in Anspruch, aber die Kompilierung war erfolgreich.

Ich würde gerne den Code sehen. Sie können ihn mir per PM schicken.

 
fxsaber:

Danke für die Glückwünsche, ich schätze die Kommentare von allen! Sie werden immer in Betracht gezogen.

Ich würde gerne den Code sehen. Sie können mir eine PM schicken.


Ich habe den Code an Ihre PM geschickt.

 
Aleksey Vyazmikin:

Habe den Code an PM geschickt.

Leider war die Bibliothek ursprünglich nicht für alle MT4->MT5-Übersetzungen zuständig, bei denen nicht nur MQL4-Handelsfunktionen verwendet werden.

In Ihrem Fall wird die langsame Arbeit des Expert Advisors nicht durch diese Bibliothek verursacht, sondern durch eine private Implementierung der MT4->MT5-Übersetzung, die die Arbeit mit Zeitreihen, Indikatoren, etc. beeinträchtigt.

 
fxsaber:

Leider war die Bibliothek zunächst nicht für alle MT4->MT5-Übersetzungen zuständig, bei denen nicht nur MQL4-Handelsfunktionen verwendet werden.


Aber jetzt ist sie zuständig?

fxsaber:

In Ihrem Fall wird die langsame Arbeit des Expert Advisors nicht durch diese Bibliothek verursacht, sondern durch eine private Implementierung der MT4->MT5-Übersetzung, die die Arbeit mit Zeitreihen, Indikatoren usw. beeinträchtigt.

Privat - ist es meine Bibliothek oder eine andere Bibliothek?

Ich habe alles gemäß dem Artikel gemacht, der allen bekannt ist, und es gibt dort keine speziellen Indikatoren....

Ich bezweifle, dass dieser Code eine Überlastung des Kernels verursachen kann:

double iMAMQL4(string symbol,
               int tf,
               int period,
               int ma_shift,
               int method,
               int price,
               int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_MA_METHOD ma_method=MethodMigrate(method);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMA(symbol,timeframe,period,ma_shift,
                  ma_method,applied_price);
   if(handle<0)
     {
      Print("Объект iMA не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,shift));
  }

Oder ist das der Grund?