Bibliotheken: MT4Orders - Seite 16

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenschaften der mql4 Sprache, Feinheiten und Techniken der Arbeit

fxsaber, 2017.09.11 20:29

Im Folgenden wird auf das Thema, das nicht nur MT4, sondern auch MT5 mit anderen Plattformen betrifft, eingegangen. Aber für die einfache Wahrnehmung, wird die Logik in MQL4 geschrieben werden, so in diesem Thread.

Diskussion direkt auf die Bibliothek bezogen.

 

offenen Position vom Handelsserver akzeptiert werden, der entsprechende Marktauftrag generiert wird, der in der MT5-Tabelle der offenen Aufträge steht, bis er ausgeführt wird.


Daher ist im MT5, selbst bei reinem MQL5, die Änderung/Löschung solcher Orders nicht möglich, und die MT5-Handelslogik erfordert die Überprüfung, ob eine offene Order tatsächlich eingefroren ist oder nicht.


Im Folgenden wird die Bedingung für die Identifizierung solcher Aufträge beim Schreiben der Handelslogik auf MT4Orders und ein Beispiel für deren Auslösung dargestellt

// Auslöser SL/TP/SO
void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{ 
  if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD) && OrderSelect(Trans.order))
  {
    const ENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderGetInteger(ORDER_REASON);
    
    if (Reason == ORDER_REASON_TP)
      Print("Position #" + (string)Trans.position + " - triggered TP.");    
    else if (Reason == ORDER_REASON_SL)
      Print("Position #" + (string)Trans.position + " - triggered SL.");    
    else if (Reason == ORDER_REASON_SO)
      Print("Position #" + (string)Trans.position + " - triggered StopOut.");    
  }
}

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnInit()
{
  EventSetMillisecondTimer(1);
  
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, Bid - _Point, Ask + _Point);    
}

// Zeigt, dass SL/TP/SO-Aufträge in der aktuellen Tabelle der offenen MT5-Aufträge vorhanden sind
void OnTimer()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) &&
        (OrderCloseReason() >= (int)ORDER_REASON_SL)) // Wenn diese Bedingung ausgelöst wird, können Sie den Auftrag nicht ändern/löschen!
    {
      OrderPrint();
      
      const long Position = OrderGetInteger(ORDER_POSITION_ID); // Möglicherweise, da MT4Orders so konfiguriert ist, dass es parallel mit der MQL5-Handels-API arbeitet
      
      const ENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderCloseReason();
      
      if (Reason == ORDER_REASON_TP)
        Print("Position #" + (string)Position + " - in the process of execution TP.");    
      else if (Reason == ORDER_REASON_SL)
        Print("Position #" + (string)Position + " - in the process of execution SL.");    
      else if (Reason == ORDER_REASON_SO)
        Print("Position #" + (string)Position + " - in the process of execution StopOut.");
    }
}


Ergebnis

2017.09.14 09:35:11.565 Position #1060283 - triggered TP.
2017.09.14 09:35:11.575 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.575 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.595 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.595 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.607 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.607 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.617 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.617 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.637 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.637 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.657 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.657 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.667 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.667 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.680 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.680 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.700 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.700 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.710 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.710 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.730 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.730 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.757 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.757 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.760 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.760 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.780 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.780 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.790 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.790 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.810 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.810 Position #1060283 - in the process of execution TP.
2017.09.14 09:35:11.820 #1060284 2017.09.14 09:36:14 sell 1.00 EURUSD 1.18838 0.00000 0.00000 1.18838 0.00 0.00 0.00 [tp 1.18838] 0
2017.09.14 09:35:11.820 Position #1060283 - in the process of execution TP.


Sie sehen, dass die TP-Order mehr als eine Viertelsekunde lang unter den offenen Aufträgen hing. Jeder Versuch, sie zu ändern/löschen, würde zu Fehlern führen.

Beachten Sie diese Funktion von MT5 (nicht nur bei der Arbeit mit MT4Orders).

 
fxsaber:

offenen Position vom Handelsserver akzeptiert werden, der entsprechende Marktauftrag generiert wird, der in der MT5-Tabelle der offenen Aufträge steht, bis er ausgeführt wird.


Daher ist es im MT5, selbst bei reinem MQL5, unmöglich, solche Aufträge zu ändern oder zu löschen, und die MT5-Handelslogik erfordert eine Überprüfung, ob ein offener Auftrag tatsächlich eingefroren ist oder nicht.

Unten sehen Sie die Bedingung für die Identifizierung solcher Aufträge beim Schreiben der Handelslogik auf MT4Orders und ein Beispiel für ihre Auslösung

Sie sehen, dass der TP-Auftrag mehr als eine Viertelsekunde lang unter den offenen Aufträgen hing. Jeder Versuch, sie zu ändern oder zu löschen, würde zu Fehlern führen.

Beachten Sie diese Funktion von MT5 (nicht nur bei der Arbeit mit MT4Orders).

Die Überprüfung dieser Bedingung ist jetzt in die Bibliothek eingebaut, Sie können wie in MT4 arbeiten

// Liste ändern:
// 14.09.2017:
// Fix: Jetzt sieht die Bibliothek keine aktuellen MT5-Aufträge, die nicht den Status ORDER_STATE_PLACED haben..
// Damit die Bibliothek alle offenen MT5-Aufträge sehen kann, muss die folgende Zeile VOR der Bibliothek geschrieben werden
//
// #define MT4ORDERS_SELECTFILTER_OFF // MT4Orders.mqh soll alle aktuellen MT5-Aufträge sehen
 
Es war notwendig, so viel mit diesen Positionen / Aufträge in mt5 zu schaffen, in keiner anderen Plattform habe ich nicht eine solche Vielfalt erfüllt )
 
Maxim Dmitrievsky:
Eine solche Vielfalt habe ich noch bei keiner anderen Plattform gesehen).

Der Parameter ORDER_STATE spielt eine noch größere Rolle. Für SL/TP-Aufträge ist es ORDER_STATE_STARTED. Aber Sie sollten niemals alle ORDER_STATE_STARTED ignorieren (es dauert lange, das zu erklären). Deshalb ist es falsch, sich auf ORDER_STATE zu verlassen, sondern ORDER_REASON wird benötigt.

ORDER_STATE ist eine andere Geschichte. Angenommen, eine Position wird teilweise aus einem schwebenden Auftrag heraus eröffnet, und der Rest des Auftrags hängt noch. Dann gibt es ein Geschäft in der History, aber die Order selbst ist noch nicht da. Wenn sich die Order dann vollständig füllt, können Sie sich den ORDER_STATE der Order, aus der sie hervorgegangen ist, nicht ansehen, um zu verstehen, dass das erste von ihr generierte Geschäft nur teilweise geöffnet wurde.


Wie auch immer, es gibt so viele Situationen, in denen dieser STATE tatsächlich..... Es ist notwendig, menschliche OrderOpenState() und OrderCloseSate() einzuführen, aber es ist ein Kopfzerbrechen (und nur ein paar Leute werden es benutzen). Und natürlich ist es immer noch ein einfaches Rätsel. Es gibt viele von ihnen, und einige von ihnen werden nicht einmal vermutet. Alles in allem ist es gut, dass man es teilweise in einen funktionierenden Zustand und eine menschliche Form auflösen kann, und das fast ohne Produktivitätsverlust. Mehr als die Hälfte der Bedürfnisse, denke ich, erfüllt die Bibliothek.

 
fxsaber:

Der Parameter ORDER_STATE spielt eine noch größere Rolle. Bei SL/TP-Aufträgen ist es ORDER_STATE_STARTED. Aber man sollte niemals alle ORDER_STATE_STARTED ignorieren (es dauert lange, das zu erklären). Deshalb ist es falsch, sich auf ORDER_STATE zu verlassen, sondern ORDER_REASON wird benötigt.

ORDER_STATE ist eine andere Geschichte. Angenommen, eine Position wird teilweise aus einem schwebenden Auftrag heraus eröffnet, und der Rest des Auftrags hängt noch. Dann gibt es ein Geschäft in der History, aber die Order selbst ist noch nicht da. Wenn sich die Order dann vollständig füllt, können Sie sich den ORDER_STATE der Order, aus der sie hervorgegangen ist, nicht ansehen, um zu verstehen, dass das erste von ihr generierte Geschäft nur teilweise geöffnet wurde.


Wie auch immer, es gibt so viele Situationen, in denen dieser STATE tatsächlich..... Es ist notwendig, menschliche OrderOpenState() und OrderCloseSate() einzuführen, aber es ist ein Kopfzerbrechen (und nur ein paar Leute werden es benutzen). Und natürlich ist es immer noch ein einfaches Rätsel. Es gibt viele von ihnen, und einige von ihnen werden nicht einmal vermutet. Alles in allem ist es gut, dass man es teilweise in einen funktionierenden Zustand und eine menschliche Form auflösen kann, und das fast ohne Produktivitätsverlust. Ich denke, die Bibliothek erfüllt mehr als die Hälfte meiner Bedürfnisse.

Ich benutze es in Bots, weder im Tester noch auf der realen, keine Fehler sind noch nicht aufgetreten, wie es scheint, auf Forts in der Eröffnung und Forex. Es gab ein Problem, wenn die dts plötzlich begann, Aufträge langsam auszuführen (Plugin gegen Arbitrage), ich erinnere mich nicht, ich erinnere mich nicht, ich denke, die liba hatte keine Zeit zu berechnen, ob die Position bereits im Markt oder nicht, (ein Problem mit der Geschichte Synchronisation, soweit ich mich erinnere) und stempelte eine Menge von Aufträgen in einer Reihe, aber dann haben Sie ein Update und es wurde wie ein Uhrwerk. Also mehr als die Hälfte zumindest :)
 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Expert Advisors: Quantum 103

fxsaber, 26.09.2017 09:55 Uhr.

Plattformübergreifende Variante des Expert Advisors
// MQL4&5-Code

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define   MT4_TICKET_TYPE // OrderSend und OrderTicket müssen einen Wert desselben Typs wie in MT4 zurückgeben - int.
#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

// Erforderlich für Grafiken in Berichten
// #include <TypeToBytes.mqh> // https://www.mql5.com/de/code/16280

#define  REPORT_TESTER // Das Prüfgerät zeichnet automatisch Berichte auf
#include <Report.mqh> // https://www.mql5.com/de/code/18801

#endif // __MQL5__

#include "Quantum 103.mq4" // https://www.mql5.com/de/code/19133

Backtest-Ergebnis mit echten Ticks auf MT5

Standard MT5-Bericht

Benutzerdefinierter Bericht (MT4-Stil)


Ich habe den MT4-Stil MT5-Backtest-Bericht angehängt, weil der Standardbericht schwer zu lesen ist - siehe beide im Trailer.

Sie können die Auswirkungen von Slippages und Kommissionen auf das MT5-Backtest-Ergebnis dieses EAs deutlich erkennen.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: Quantum 103

fxsaber, 2017.09.26 09:55

Plattformübergreifende Version des Expert Advisors
// MQL4&5-Code

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

int    ObjectFind( const string Name )   { return(ObjectFind(0, Name)); }
int    ObjectsTotal( void )              { return(ObjectsTotal(0)); }
bool   ObjectDelete( const string Name ) { return(ObjectDelete(0, Name)); }
string ObjectName( const int Pos )       { return(ObjectName(0, Pos)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_TRADE_STOPS_LEVEL
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_SPREAD    SYMBOL_SPREAD

#define StrToTime    StringToTime
#define StrToInteger StringToInteger
#define TimeToStr    TimeToString
#define DoubleToStr  DoubleToString

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define   MT4_TICKET_TYPE // Обязываем OrderSend и OrderTicket возвращать значение такого же типа, как в MT4 - int.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

// Нужно для графиков в отчетах
// #include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

#define  REPORT_TESTER // В тестере будут автоматически записываться отчеты
#include <Report.mqh> // https://www.mql5.com/ru/code/18801

#endif // __MQL5__

#include "Quantum 103.mq4" // https://www.mql5.com/ru/code/19133

Ergebnis des Backtests mit echten Ticks auf MT5

Standard MT5-Bericht

Benutzerdefinierter Bericht (MT4-Stil)


Angehängter Bericht im MT4-Stil MT5-Backtest, da der Standardbericht nur schwer lesbar ist - siehe beide im Anhang.

Sie können deutlich die Auswirkungen auf das Ergebnis des MT5-Backtests dieses Beraters Slippage und Provision sehen.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Expert Advisors: Aufträge anzeigen

fxsaber, 2017.10.09 13:22

Plattformübergreifende Variante
// MQL4&5-Code

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }

string AccountCurrency( void ) { return(AccountInfoString(ACCOUNT_CURRENCY)); }
double AccountProfit( void )   { return(AccountInfoDouble(ACCOUNT_PROFIT)); }
double AccountBalance( void )  { return(AccountInfoDouble(ACCOUNT_BALANCE)); }

bool ObjectSet( const string Name, const ENUM_OBJECT_PROPERTY_INTEGER Index, long Value ) { return(ObjectSetInteger(0, Name, Index, Value)); }
bool ObjectDelete( const string Name )   { return(ObjectDelete(0, Name)); }

bool ObjectCreate( const string Name, const ENUM_OBJECT Type, const int SubWindow, const datetime Time1, const double Price1 )
{
  return(ObjectCreate(0, Name, Type, SubWindow, Time1, Price1));
}

bool ObjectSetText( const string Name, const string Text, const int FontSize = 0, const string FontName = NULL, const color TextColor = clrNONE )
{
  return(ObjectSetString(0, Name, OBJPROP_TEXT, Text) && ObjectSetString(0, Name, OBJPROP_FONT, FontName) && ObjectSetInteger(0, Name, OBJPROP_COLOR, TextColor));
}

void OnInit( void ) { init(); }
void OnDeinit( const int Reason ) { deinit(); }

#define extern input

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_TICKVALUE SYMBOL_TRADE_TICK_VALUE

#define DoubleToStr DoubleToString

#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift)                                      \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                        \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  } NAME;                                                                                                     

DEFINE_TIMESERIE(Time,Time,datetime)

#define   MT4_TICKET_TYPE // OrderSend und OrderTicket müssen einen Wert desselben Typs wie in MT4 zurückgeben - int.
#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

#endif // __MQL5__

#include "Display orders.mq4"
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Expert Advisors: Xarax

fxsaber, 2017.10.11 13:44

Plattformübergreifende Variante

// MQL4&5-Code

#ifdef __MQL5__

bool RefreshRates( void ) { return(true); }

double MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_DOUBLE Property )  { return(SymbolInfoDouble(Symb, Property)); }
int    MarketInfo( const string Symb, const ENUM_SYMBOL_INFO_INTEGER Property ) { return((int)SymbolInfoInteger(Symb, Property)); }

bool IsTesting(void)            { return(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)); }
bool IsTradeContextBusy( void ) { return(false); }
bool IsTradeAllowed(void)       { return(MQLInfoInteger(MQL_TRADE_ALLOWED)); }
bool IsExpertEnabled(void)      { return(AccountInfoInteger(ACCOUNT_TRADE_EXPERT)); }

double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
{
 double Margin;

 return(OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
        SymbolInfoDouble(Symb, (Cmd == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID), Margin) ?
        AccountInfoDouble(ACCOUNT_MARGIN_FREE) - Margin : -1);
}

#define False false
#define True  true

#define Digits _Digits
#define Point  _Point

#define MODE_BID       SYMBOL_BID
#define MODE_ASK       SYMBOL_ASK
#define MODE_POINT     SYMBOL_POINT
#define MODE_DIGITS    SYMBOL_DIGITS
#define MODE_STOPLEVEL SYMBOL_TRADE_STOPS_LEVEL
#define MODE_LOTSTEP   SYMBOL_VOLUME_STEP

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define   MT4_TICKET_TYPE // OrderSend und OrderTicket müssen einen Wert desselben Typs wie in MT4 zurückgeben - int.
#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

#endif // __MQL5__

#include "Xarax.mq4"