Bibliotheken: MT4Orders - Seite 52

 
traveller00:
Nur für den Fall, dass ich erwähnen möchte, dass ZIP-Archive repariert wurden, soweit ich mich erinnere. Aber jetzt ist es wieder durcheinander und es gibt eine alte Version, die man per Datei aktualisieren muss.
 
// Liste ändern:
// 29.08.2020
// Fix: Die Arbeit mit der Handelshistorie wurde beschleunigt.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2020.08.29 00:03

2020.08.29 00:57:38.561 HistoryDealsTotal() = 9435
2020.08.29 00:57:38.813 2046.04.30 00:13:20
2020.08.29 00:57:38.813 Time[Bench(LastTimeMQL4)] = 252274
2020.08.29 00:57:38.820 2046.04.30 00:13:20
2020.08.29 00:57:38.820 Time[Bench(LastTimeMQL5)] = 7162

Reines MQL5 war bei dieser Aufgabe 40 Mal schneller. Lernen Sie MQL5!

Nach dem Update.

        HistoryDealsTotal() = 9435
        2046.04.30 00:13:20
        Time[Bench(LastTimeMQL4)] = 16984
        2046.04.30 00:13:20
        Time[Bench(LastTimeMQL5)] = 4194

hat sich die Geschwindigkeit bei dieser Aufgabe um das 15-fache erhöht. Nach dem Studium der Eigenheiten der HistorySelect-Funktionen wurde kein offensichtliches Manöver durchgeführt.

 
Beschämender Verlust von MT4Orders an MQL5+SB.
// Das Skript berechnet die Gesamtdauer aller geschlossenen Positionen.

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

// Gibt die Gesamtdauer aller geschlossenen Positionen zurück.
int SumPositionsLengthMQL4( void )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
      Res += (int)(OrderCloseTime() - OrderOpenTime());
      
  return(Res);
}

#include <Generic\HashMap.mqh>

// Gibt die Gesamtdauer aller geschlossenen Positionen zurück.
int SumPositionsLengthMQL5( void )
{
  int Res = 0;
  
  if (HistorySelect(0, INT_MAX))
  {
    CHashMap<ulong, ulong> DealsIn;  // Nach PositionID gibt DealIn.
    const int TotalDeals = HistoryDealsTotal();
    
    for (int i = 0; i < TotalDeals; i++)
    {
      const ulong TicketDeal = HistoryDealGetTicket(i);
      
      if (HistoryDealGetInteger(TicketDeal, DEAL_ENTRY) == DEAL_ENTRY_IN)
        DealsIn.Add(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDeal);
      else if (HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL)
      {
        ulong TicketDealIn;
        
        if (DealsIn.TryGetValue(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDealIn))
          Res += (int)(HistoryDealGetInteger(TicketDeal, DEAL_TIME) - HistoryDealGetInteger(TicketDealIn, DEAL_TIME));        
      }        
    }
  }
      
  return(Res);
}

typedef int (*SumPositionsLength)( void );

void Bench( SumPositionsLength GetSumPositionsLength, const int Amount = 100 )
{
  long Tmp = 0;

  for (int i = 0; !IsStopped() && (i < Amount); i++)
    Tmp += GetSumPositionsLength();
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(SumPositionsLengthMQL4))
  BENCH(Bench(SumPositionsLengthMQL5))
}


Ergebnis.

        HistoryDealsTotal() = 9435
        3132754100
        Time[Bench(SumPositionsLengthMQL4)] = 871406
        3132754100
        Time[Bench(SumPositionsLengthMQL5)] = 109411


9-facher Unterschied in der Leistung. Lernen Sie MQL5.

 
fxsaber:

Ergebnis.

wenn es nicht zu viel Mühe ist, zeigen Sie den Unterschied zwischen 4k und MT5 ( Terminals ) Zeit der Ausführung dieses Tests

fxsaber:
Beschämender Verlust von MT4Orders vor MQL5+SB.

alles ist relativ.... 5 Zeilen Code und ein Dutzend Zeilen für MT5 - wenn Sie die Idee testen, dann ist 5-stock vorzuziehen, wenn Sie zu optimieren, dann definitiv die 2.

 
Igor Makanu:

wenn es nicht schwierig ist, die Differenz zwischen 4 und MT5 (Terminals) zeigen die Zeit der Ausführung dieses Tests

MT4:

OrdersHistoryTotal() = 10291
Time[Bench(SumPositionsLengthMQL4)] = 56548

OrdersHistoryTotal() = 32020
Time[Bench(SumPositionsLengthMQL4)] = 186761

OrdersHistoryTotal() = 41815
Time[Bench(SumPositionsLengthMQL4)] = 249371


MT4x32 ist mehr als viermal schneller als MT5x64, mit der gleichen Anzahl von geschlossenen Positionen.


ZЫ Wahrscheinlich kann man MT4 auch schlagen, wenn man das Speichern in MT4Orders vergisst und die Historie in einem internen Array speichert. Vielleicht sollte es so gemacht werden.

 
fxsaber:

MT4x32 ist mehr als viermal so schnell wie MT5x64, und das bei gleicher Anzahl geschlossener Positionen.

Danke, imho ist dies ein Fehler von MK, aber sie haben ihre eigene Vorstellung davon, für welche Zwecke ein produktiver MT5 verwendet werden sollte.

fxsaber:

ZЫ Wahrscheinlich, wenn wir das Speichern in MT4Orders vergessen und die Historie in einem internen Array speichern, dann können wir MT4 schlagen. Vielleicht sollte es so gemacht werden.

Nun, man kann es auf jeden Fall mit einer Deaktivierungsoption machen, zumindest hatten Ihre Codes immer solche Funktionen.

SZY: Ich habe Stringgrößen getestet, um das Terminal abzuschalten, MT5 ist nicht abschaltbar - es schafft es immer, Speicher zuzuweisen, ich denke, dass es nur in einem Tester auf mehreren Kernen zu Störungen kommen kann, wenn große Mengen an Speicher zugewiesen werden..... Im Allgemeinen müssen Sie testen


SZYZY: haben Sie nie geprüft, wie viel Speicher ein Array von Strukturen mit Handelsverlaufsdaten belegen kann? Nun, lassen Sie die Struktur 200 Bytes wiegen, und Handelsverlauf 100K Datensätze - es stellt sich heraus, 20 Mb... imho ist das überhaupt kein Problem, wenn man das Terminal nicht mit anspruchsvollen Aufgaben überlastet... im Allgemeinen, testen Sie alle die gleiche - dann wird es klar sein

 
Igor Makanu:

ZYZY: Ich habe nie überprüft, wie viel Speicherplatz ein Array von Strukturen mit Handelsverlaufsdaten einnehmen kann.

        sizeof(MT4_ORDER) = 280
 

Ich scheine nach den Sommertagen nicht wieder in Form zu kommen...

fxsaber:

MT4:

MT4x32 ist mehr als viermal so schnell wie MT5x64, und das bei der gleichen Anzahl geschlossener Positionen.

@fxsaber könnten Sie diesen Test in einer virtuellen Umgebung überprüfen? ( Virtual.mqh Bibliothek )

 
Igor Makanu:

@fxsaber könnten Sie diesen Test in einer virtuellen Umgebung überprüfen? ( Virtual.mqh Bibliothek )

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

// Gibt die Gesamtdauer aller geschlossenen Positionen zurück.
int SumPositionsLengthMQL4( void )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
      Res += (int)(OrderCloseTime() - OrderOpenTime());
      
  return(Res);
}

typedef int (*SumPositionsLength)( void );

void Bench( SumPositionsLength GetSumPositionsLength, const int Amount = 100 )
{
  long Tmp = 0;

  for (int i = 0; !IsStopped() && (i < Amount); i++)
    Tmp += GetSumPositionsLength();
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

bool CreateHistory( const int Amount = 10000 )
{
  const bool Res = VIRTUAL::GetHandle();
  
  if (Res)
  {
    MqlTick Tick;
    
    _V(0, SymbolInfoTick(_Symbol, Tick));
    VIRTUAL::NewTick(Tick);
        
    for (int i = 0; i < Amount; i++)
    {      
      const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0);
      
      Tick.time_msc += 1000;
      VIRTUAL::NewTick(Tick);
      
      OrderClose(Ticket, 1, Tick.bid, 0);            
    }
  }
  
  return(Res);
}

void OnStart()
{    
  PRINT(OrdersHistoryTotal());
  BENCH(Bench(SumPositionsLengthMQL4))
  
  VIRTUAL::SelectByHandle(VIRTUAL::Create());

  if (CreateHistory())  
  {
    PRINT(OrdersHistoryTotal());
    BENCH(Bench(SumPositionsLengthMQL4))
  }    
}


Ergebnis

// MT4
// Real:
VIRTUAL::VirtualOrdersHistoryTotal() = 10291
Time[Bench(SumPositionsLengthMQL4)] = 63774

// Virtuell
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 158218

// MT5
// Virtuell
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 43343

Sie können deutlich sehen, dass die MT4-Historie dreimal schneller ist als die virtuelle Umgebung in MT4. Gleichzeitig ist die gleiche virtuelle Umgebung in MT5 viermal schneller als in MT4.

Das heißt, die virtuelle Umgebung im MT5 ist schneller als die reale Umgebung im MT4.