Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Die hochproduktive Bibliothek iTimeSeries - Bibliothek für den MetaTrader 5

Ansichten:
988
Rating:
(34)
Veröffentlicht:
2017.07.12 17:38
\MQL5\Include\ \MQL5\Scripts\
MQL5 Freelance Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Eines der Hauptprobleme mit MQL5 war bisher die Entfernung der eingebauten Funktionen für die Arbeit mit Timeserien. Obwohl eine solche Methode für die Programmierer die Möglichkeit der Entwicklung verbreitet hätte, hat er auch die Arbeit wegen des obligatorischen Schrittes nach der Erstellung und der Entfernung der neuen Speichern-Zellen jedesmal verzögert, wenn der Zugang zu gegebenen Timeserien gefordert wird. 

...
   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
...

Wir betrachten einen populären Algorithmus iBarShift. Um den Index der Bar nach seinem Datum und der Zeit zurückzugeben, müssen wir zuerst:: CopyTime (...) aufzurufen, die das dynamische Array erstellt, ihre Größe ändert, die Daten kopiert, und dann entfernt diesen alle aus der Speicherplatte. Es ist kein Problem für einige Aufrufe, aber da sich die Funktionen für die Arbeit mit Timeserien normalerweise oftmals auf verschiedenen Timeserien aufgerufen werden, die erhöhten Verbrauche des Speichers führen zur bedeutenden Verzögerung der Arbeit des Programms. Stellen Sie sich kurz die Mehrausgabe der verbrauchten Ressourcen vor, die für die Auswahl der neuen Speicher-Zellen jedesmal entstehen, wenn das Programm diesen Typ der Methode unter Anwendung der Timeserie-Daten aufruft.

Um die Arbeit zu beschleunigen, realisiert die vorgestellte Bibliothek die Klassen der Standardbibliothek CObject und CArrayObj, um das Datenfeld einmal zu kopieren, und später wieder, den Zugang zu ihm aus allen Aufrufen der Timeserien nach dem gegebenen konkreten Symbol und der Periode zu bekommen. Klar, es ist ein zweischneidiges Schwert, weil die Phase der Initialization dauert länger, als gewöhnliche Implementation. Jedoch bekommen alle nachfolgenden Aufrufe den Zugang zu Daten etwa über 1/100 Zeit-Perioden. Im Beispiel mit iBarShift() arbeitet dieser neue Algorithmus schneller durch die Bildung des Arrays int[], das den Variabel — den Index der Bar gespeichert hat und dann ruft er ihn durch die Anwendung time (angepasst auf den Typ int) als eine Adresse des Arrays auf. Mit anderen Worten, Sie übergeben time als direkte Adresse für das Erhalten des Zuganges zu den Daten. 

Zwei wichtige Warnungen:

Der größte Teil der Zeit wird auf der Etappe des Initialization vergehen. Wenn Sie keine Pläne haben — mehr als einiger Tausend mal während der Bildung der Bar — den Zugang zu gegeben Timeserien zu haben, können Sie alternative Methoden betrachten. 

Die Objekte der Klasse CiTimeSeries wurden für die automatische Erneuerung der gespeicherten Daten eingestellt, wenn die neue Bar gebildet wird. Die Einstellung dieses Parameters im Modus "false" schaltet das Objekt im hochproduktiven Modus um, welcher ermöglicht, die Aufrufe von kritisch wichtigen "heissen Punkten" durchzuführen, aber für den Lauf des nachfolgenden Bedienung-Loops wird eine manuelle Erneuerung gefordert. 

Beispiel:

#include <itimeseries_nicholishen.mqh>
//--- die globale Erklärung des Objektes iTimeSeries 
CiTimeSeries iBar;
int OnInit()
{
//--- Die Phase der Initialization
   iBar.Init(  NULL,
               PERIOD_CURRENT,
               false  // Autoerneurung              
               );
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(hot_path_operations)
   {  // пример
      index = iBar.Shift(time);
   }
   else if(maintenance_path_operations)
   {
      iBar.Refresh();   
   }
}

Außerdem können Sie direkt die globalen Funktionen (auch wie in MQL4) aufrufen, ohne Erstellung des Exemplars CiTimeSeries, aber zum ersten Mal wird die Zugriffszeit langsam, weil die erste Initialization des globalen Objektes "auf dem Hintergrund" der Programmsarbeit gefordert wird. Unter Verwendung der Bibliothek kann dieser Weg noch langsamer werden, wenn Sie nur eine Funktion der Timeserie mehrmals aufrufen. Jedoch gibt es einen bestimmten Vorteil in der Produktivität, wenn Ihr Algorithmus den Aufruf mehr als einiger Tausende Iterationen der Timeserie-Daten nach einem und derselben Satz des Symbols und der Periode fordert. 

Der Hersteller des heutzutage populärsten Algorithmus iBarShift hat den vergleichenden Test "iBarShift" durchgeführt, den Sie hier https://www.mql5.com/en/code/1864 finden können.

AV Benchmark

Da es im Moment die genauste und schnellste Methode ist, habe ich mich entschieden, sie als Etalon für den Test zu verwenden.

New Benchmark

Die allgemeine Zeit der Berechnung 100 000 direkten (globalen) Aufrufe der Funktionen hat sich um 50 Mal schneller herausgestellt, als für die schnellste der Methoden, die zur Zeit verfügbar sind. Der Aufruf der öffentlichen Methoden nach der Initialization im "produktivität Modus" ist um 100 Mal schneller. 

Die verfügbaren öffentlichen Methoden und die globalen Funktionen:

Die Bemerkung: die globalen Funktionen — sind gleichen, welcher in MetaTrader 4, d.h. iBarShift, iTime usw sind.

//--- Das initialisiert das Symbol und die Periode; stellt Auto-refresh in false für den  produktivität Modus ein
   bool              Init(string            symbol=NULL,
                          ENUM_TIMEFRAMES   period      = PERIOD_CURRENT,
                          const bool        autoRefresh = true   ); 
//--- Das initialisiert das Symbol und die alle Periodedes Arrays ENUM_TIMEFRAMES; stellt Auto-refresh in false für den produktivität Modus ein
   bool              Init(string            symbol,
                          ENUM_TIMEFRAMES   &period[],
                          const bool        autoRefresh = true   );


//--- Das initialisiert alle Perioden

   bool InitAllPeriods (  string            symbol      = NULL,
                        const bool        autoRefresh=true);


//--- Es stellt Auto-refresh in false ein, um die Erneuerung der Daten manuell zu führen
   void              AutoRefresh(const bool ref) { m_autoRefresh=ref;     }
   bool              AutoRefresh() const { return m_autoRefresh;          }


//--- Der manuelle Aufruf der Erneuerung: es erneuert die Daten auf allen initialisierten Perioden
   bool              Refresh();


   CRatesArray      *GetArrayObjPointer(string            symbol,
                                        ENUM_TIMEFRAMES   period);

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/18305

cheduecoglioni cheduecoglioni

Wir warten, wann TP oder SL ausgelöst werden, und danach öffnen wir die Position in der entgegengesetzten Richtung. Die Überprüfung, ob Mittel ausreichend sind, bevor eine Handelsoperation durchgeführt wird. OnTradeTransaction.

Size of candles (text) Size of candles (text)

Die Größe der Bar. Die Große der Kerze wird nach der folgenden Formel berechnet: "Minuend" - "Subtrahend".

CandleRange CandleRange

Zwei Histogramme in einem Fenster, die maximalen durchschnittlichen Abweichungen des Preises von dem ursprünglichen Wert zeigen, die in den Punkten gemessen werden.

TotalPowerIndicatorX_HTF TotalPowerIndicatorX_HTF

Der Indikator TotalPowerIndicatorX mit der Veränderungsmöglichkeit des Timeframes des Indikators in den Eingangsparametern.