Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 231

 

Sorry für die Anfänger Fragen ... so, welche sollte ich auf, um Code zu entwickeln konzentrieren? 4 oder 5? vielleicht nicht verstehen - sollte ich nur 5 für die Handelsfunktionalität wählen? ist es besser als MQL4s?

 
@rrb1002 #: sorry für die Anfänger Fragen ... so, welche sollte ich auf, um Code zu entwickeln konzentrieren? 4 oder 5? vielleicht nicht verstehen - sollte ich nur 5 für die Handelsfunktionalität wählen? ist es besser als MQL4s?

Nun, die Entscheidung liegt bei Ihnen, aber wenn mir jemand sagen würde, dass die ältere Software nicht mehr weiterentwickelt wird und alle aktuellen Entwicklungen auf der neueren basieren, würde ich denken, dass meine Wahl offensichtlich wäre (es sei denn, es gibt andere Umstände, die die Entscheidung beeinflussen).

EDIT: Da Ihr Profil jedoch angibt, dass Sie in den USA leben, kann es auch davon abhängen, welche Broker Sie nutzen wollen und welche Plattformen sie anbieten.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Besonderheiten der Sprache mql5, Feinheiten und Techniken der Arbeit

fxsaber, 2023.01.07 23:01

Es gibt zwei Arten von Brokern, die die Zeit in den USA/Europa übersetzen. Dadurch wird insbesondere der Rollover-Zeitpunkt verschoben.

Der Brokertyp kann automatisch ermittelt werden.

// Вычисление типа брокера (USA/Europe).

bool IsEuropeBroker()
{
  MqlCalendarValue Value[1];
  
  CalendarValueHistoryByEvent(840030016, Value, D'2022.11.03', D'2022.11.05');
  
  return(Value[0].time == ChartNewsTime(Value[0].time)); // https://www.mql5.com/ru/forum/357793/page5#comment_44225999
}

void OnStart()
{
  Print(AccountInfoString(ACCOUNT_SERVER) + " - " + (IsEuropeBroker() ? "Europe" : "USA"));
}


Die Ergebnisse der Ausführung bei einigen Brokern.

RannForex-Server - Europe
MetaQuotes-Demo - Europe
FXOpen-MT5 - USA
Alpari-MT5 - Europe
Tickmill-Live - USA
ICMarketsSC-MT5-2 - USA
Darwinex-Live - USA

Momentan liefert das Skript recht unterschiedliche Ergebnisse. Ich empfehle nicht, den MT5-Kalender zu verwenden, bis Sie seine Besonderheiten vollständig verstanden haben.

 

Eine sehr einfache Technik in MQL5 ermöglicht es Ihnen, Backtests kostenlos zu beschleunigen - die Speicherung von Positions-/Auftragsindizes nach Typ.


Ein Beispiel für die Beschleunigung des zuvor veröffentlichten Quick Codes.

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

input int inAmountMagics = 50; // Сколько ТС эмулировать

// Для каждой ТС открываем позицию и отложку. MT4-код для лаконичности.
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

#define  MAX_ORDERS 100

// Индексы позиций/ордеров по типам.
struct TYPE_INDEXES
{
  int Index[OP_SELLSTOP + 1][MAX_ORDERS];
  int Amount[OP_SELLSTOP + 1];
  
  // Заполнение индексов.
  void Fill( void )
  {
    ::ArrayInitialize(this.Amount, 0);
    
    for (int i = ::PositionsTotal() - 1; i >= 0; i--)
      if (::PositionGetTicket(i))
      {
        const int Type = (int)PositionGetInteger(POSITION_TYPE);
        
        this.Index[Type][this.Amount[Type]++] = i;
      }

    for (int i = ::OrdersTotal(true) - 1; i >= 0; i--)
      if (::OrderGetTicket(i))
      {
        const int Type = (int)OrderGetInteger(ORDER_TYPE);
        
        this.Index[Type][this.Amount[Type]++] = i;
      }
      
    return;          
  }
};

#undef  MAX_ORDERS

// Сбор информации с нужных позиций/ордеров. Максимально быстрый MT5-код.
double CountOrders( const int Type, const int Magic, const TYPE_INDEXES &TypeIndexes )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = TypeIndexes.Amount[Type] - 1; i >= 0; i--)
      if (PositionGetTicket(TypeIndexes.Index[Type][i]) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = TypeIndexes.Amount[Type] - 1; i >= 0; i--)
      if (OrderGetTicket(TypeIndexes.Index[Type][i]) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// Число для контроля корректности альтернативных реализаций.
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  TYPE_INDEXES TypeIndexes; // Индексы позиций/ордеров по типам.
  
  TypeIndexes.Fill(); // Заполнение индексов.
  
  // Симулируем работу по всем ТС.
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i, TypeIndexes) + 
                     CountOrders(POSITION_TYPE_SELL, i, TypeIndexes) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i, TypeIndexes) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i, TypeIndexes);  
}

Es ist sinnvoll, Positionen/Aufträge nach Typen aufzuteilen.

 
Wie konvertiert man MQL4 EA in MQL5?
 
Wenn Sie eine imaginäre Null für eine beliebige Verdopplung benötigen.
void OnStart()
{
  double d = 1;
  
  Print(d + d * 1 e-17 == d); // true
  Print(d * 1 e-17);
}
 
fxsaber #:
Wenn Sie eine imaginäre Null für ein Double benötigen.

DBL_EPSILON

Die kleinste Zahl, für die die Bedingung 1,0+DBL_EPSILON != 1,0 gilt.

2.2204460492503131e-016

 
Slava #:

DBL_EPSILON

Die kleinste Zahl, für die die Bedingung 1,0+DBL_EPSILON != 1,0 erfüllt ist.

2.2204460492503131e-016

Dankeschön!

 

DBL_EPSILON

Die kleinste Zahl, die die Bedingung 1.0+DBL_EPSILON != 1.0 erfüllt

2.2204460492503131e-016


Bitte entschuldigen Sie, dass ich auf Englisch kommentiere, ich spreche kein Russisch.

Dies bedeutet:

d * (1 + DBL_EPSILON) != d
d * (1 + 0.5 * DBL_EPSILON) == d

weil die DBL_EPSILON die relative Fehlerquote ist. relativ bedeutet relativ zur Größe der Zahl.

bei 1,0 ist die Fehlerquote = 1 * 2 ,2204460492503131e-016 (DBL_EPSILON)

bei d ist die Fehlerquote = d * DBL_EPSILON .

Der Computer kann nicht zwischen d und d * (1 + 0,5*DBL_EPSILON) unterscheiden, also kodiert er beide in denselben Binärwert.
Man erhält also true für den exakten (binären) Vergleich ==
 
Slava #:

DBL_EPSILON

Die kleinste Zahl, für die die Bedingung 1,0+DBL_EPSILON != 1,0 erfüllt ist.

2.2204460492503131e-016

Dies ist eine schlechte Erklärung, denn.

void OnStart()
{
  double d = 1 e5;
  
  Print(d + d * 0.1 == d * (1 + 0.1)); // false
}