English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
MQL5-Kochbuch: Verarbeitung des Ereignisses BookEvent

MQL5-Kochbuch: Verarbeitung des Ereignisses BookEvent

MetaTrader 5Beispiele | 13 Juni 2016, 10:52
5 647 0
Denis Kirichenko
Denis Kirichenko

Einleitung

Wie nur zu gut bekannt ist, handelt es sich beim MetaTrader-5-Handelsterminal um eine Multi-Marktplattform, die folgende Tradingoptionen unterstützt: Forex, die Börse sowie Termin- und Differenzgeschäfte. Entsprechend der Statistiksektion von Freelance kann inzwischen festgehalten werden, dass die Anzahl der Trader, die nicht nur mit dem Forex-Markt traden, mehr und mehr zunimmt

Diesen Artikel würde ich sehr gerne dazu nutzen, MQL-Neulinge ein wenig mit der Behandlung des Ereignisses BookEvent vertraut zu machen Das Ereignis steht dabei in einem direkten Zusammenhang mit der Markttiefe - einem Instrument zum Traden von Aktien und Derivaten. Allerdings könnten Forex-Trader die Markttiefe ebenso interessant finden. Was ECN-Konten betrifft, so sind Liquiditätsgeber dafür verantwortlich, Auftragsdaten zu liefern - im Rahmen des Modells ihres Aggregators versteht sich. Diese Konten werden immer beliebter.

1. BookEvent

Basierend auf der Dokumentation wird dieses Ereignis immer dann generiert, wenn sich der Markttiefestatus ändert. Lassen Sie uns also an dieser Stelle bitte festhalten, dass es sich bei BookEvent um ein Markttiefeereignis handelt.

Unter Markttiefe verstehen wir ein Array an Aufträgen, die sich in Richtung (Verkaufen und Kaufen), Preis und Volumen unterscheiden. Markttiefepreise kommen denen des Marktes sehr nahe und können daher als die besten Preise angesehen werden.

Die Markttiefe in MetaTrader 5

Die Markttiefe in MetaTrader 5

Nebenbei gesagt: In MetaTrader 5 gibt es ein „Auftragsbuch“, das den Titel „Markttiefe“ trägt (Abb. 1). Mehr Informationen zur Markttiefe finden Sie im Benutzerhandbuch des Kundenterminals.

Außerdem sollte hierbei noch die MqlBookInfo-Struktur genannt werden, die ebenfalls einige Informationen zur Markttiefe bereithält.

struct MqlBookInfo
  {
   ENUM_BOOK_TYPE   type;       // order type from the ENUM_BOOK_TYPE enumeration
   double           price;      // price
   long             volume;     // volume
  };

Diese Informationen lassen sich in drei Kategorien einteilen: Daten über den Auftragstyp, Preis und Volumen.

2. BookEvent und entsprechende Ereignisbehandler

Die Funktion zur Behandlung des Ereignisses OnBookEvent() beansprucht eine Konstante als Parameter. Ich verweise hierbei auf den String-Parameter.

void OnBookEvent (const string& symbol)

Der String-Parameter enthält den Namen des Symbols, das für das Entstehen eines Markttiefeereignisses ursächlich ist.

Der Ereignisbehandler selbst bedarf zunächst einer gewissen Vorbehandlung. Damit der Expert-Advisor ein Markttiefeereignis adäquat behandeln kann, muss dieses Ereignis mithilfe der eingebauten MarketBookAdd()-Funktion abonniert sein. Diese befindet sich normalerweise im Initialisierungsblock des EAs. Falls ein Markttiefeereignis nicht abonniert sein sollte, so wird der EA es schlicht und einfach ignorieren.

Das Bereitstellen einer Möglichkeit, bestimmte Ereignisse abzubestellen, spricht durchaus für eine gute Programmierarbeit. Während einer Deinitialisierung ist es notwendig, das Empfangen derartiger Daten zu unterbinden, indem man die MarketBookRelease()-Funktion aufruft.

Die Mechanismen zum Abonnieren bzw. zum Abbestellen des Empfangens von Daten sind identisch mit denen des Kreierens / Verarbeitens eines Timers, der vor der Verarbeitung aktiviert werden muss.

3. Templates zur Behandlung von BookEvent

Wir werden nun das simple Template eines EAs anlegen, das die Funktion OnBookEvent() aufruft, und werden es BookEventProcessor1.mq5 nennen.

Das Template besteht aus einem minimalen Set an Behandlern. Hierzu zählen Behandler, die für die Initialisierung und die Deinitialisierung des EAs zuständig sind, als auch ein Behandler für das Markttiefeereignis.

Der Markttiefebehandler selbst ist relativ simpel:

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   Print("Book event for: "+symbol);
//--- select the symbol
   if(symbol==_Symbol)
     {
      //--- array of the DOM structures
      MqlBookInfo last_bookArray[];

      //--- get the book
      if(MarketBookGet(_Symbol,last_bookArray))
        {
         //--- process book data
         for(int idx=0;idx<ArraySize(last_bookArray);idx++)
           {
            MqlBookInfo curr_info=last_bookArray[idx];
            //--- print
            PrintFormat("Type: %s",EnumToString(curr_info.type));
            PrintFormat("Price: %0."+IntegerToString(_Digits)+"f",curr_info.price);
            PrintFormat("Volume: %d",curr_info.volume);
           }
        }
     }
  }

Da dieses Markttiefeereignis ein Broadcastingereignis darstellt (nach dem Abschluss des Abos wird es für alle Symbole erscheinen), muss ein benötigtes Instrument spezifiziert werden.

Es sollte an dieser Stelle betont werden, dass die letzten Aktualisierungen einige Änderungen bzgl. der Markttiefe mit sich gebracht haben. In der aktuellen Version (v975) habe ich keinerlei Hinweise auf Broadcasting entdecken können. Der Behandler wurde nur für das zugewiesene Symbol aufgerufen. Um diesen Fakt zu beweisen, habe ich ganz einfach die Eingabe von Informationen ins „EA-Log“ arrangiert.

Um dies zu tun, können wir uns der eingebauten MarketBookGet()-Funktion bedienen. Diese wird alle Informationen über die Markttiefe zurückgeben, und zwar das MqlBookInfo-Array der Strukturen, das die Aufzeichnungen der Markttiefe für ein spezifisches Symbol enthält. Nehmen Sie bitte zur Kenntnis, dass die Größe dieses Arrays abhängig vom Broker variieren wird.

Die Templates erlauben im Log eine Darstellung der Werte der Struktur des Arrays.

Der EA wurde im Debugmodus für die SBRF-12.14-Termingeschäfte gestartet. Die Sequenz der Aufzeichnungen im EA-Log wird wie folgt aussehen:

EL      0       11:24:32.250    BookEventProcessor1 (SBRF-12.14,M1)     Book event for: SBRF-12.14
MF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
KP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7708
LJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 6
MP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
HF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7705
LP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 6
MJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
GL      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7704
ON      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 3
MD      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
FR      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7703
PD      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
MN      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
DH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7701
QQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 10
GH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
QM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7700
OK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 1011
ER      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
KS      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7698
EE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 50
OM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
KI      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7696
IO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 21
QG      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
LO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7695
MK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 1
QQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
KE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7694
QQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 5
QK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
PK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7691
LO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
QE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
HQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7688
OE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 106
MO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
RG      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7686
IP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 18
GI      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
FL      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7684
QI      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 3
GS      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
IR      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7681
LG      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 4
GM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
JH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7680
RM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
GG      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
DN      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7679
HH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 19
IQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
ED      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7678
EQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 1
IK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
OJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7676
DO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
IE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_SELL
RP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7675
EE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 1
QR      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
LF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7671
LP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 40
QD      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
KL      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7670
QJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 21
QN      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
CR      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7669
RD      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 20
QP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
DH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7668
NN      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 17
QJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
QN      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7667
RK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
OL      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
DE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7666
MQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 151
QF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
OJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7665
RO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
OH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
FQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7664
EF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 49
OR      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
GG      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7663
OS      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 3
ED      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
JM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7662
PI      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 4
CN      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
ES      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7661
LD      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 13
CP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
FI      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7660
LM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 2
IJ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
NO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7659
II      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 12
IL      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
ME      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7658
IP      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 3
GF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
NK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7657
FM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 15
GH      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
MQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7656
DD      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 6
MS      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
NG      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7655
KR      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 9
KE      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
OM      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7654
IK      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 14
KO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
NS      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7653
DF      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 534
MQ      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Type: BOOK_TYPE_BUY
OI      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Price: 7652
IO      0       11:24:33.812    BookEventProcessor1 (SBRF-12.14,M1)     Volume: 25

Dies ist der Zustand, den die Markttiefe während eines bestimmten Momentes besaß. Das erste Element der Struktur des Arrays ist ein Verkaufen-Auftrag zum höchsten Preis (7708 Rub). Das letzte Element des Arrays ist ein Kaufen-Auftrag zum niedrigsten Preis (7652 Rub). Die Daten der Marktiefe werden also dem Array von oben nach unten vorgelesen.

Aus Gründen der Bequemlichkeit habe ich die Daten in Tabelle 1 abgebildet.

Tabelle 1 Die Markttiefe in MetaTrader für SBRF-12.14

Tabelle 1 Die Markttiefe in MetaTrader für SBRF-12.14

Der obere Block (rot) enthält die Verkaufen-Aufträge (Sell-Limits). Der untere Block (grün) enthält die Kaufen-Aufträge (Buy-Limits).

Es ist offensichtlich, dass - im Vergleich zu allen Verkaufen-Aufträgen - der Auftrag #6 das größte Volumen besaß: 1011 Lots bei einem Preis von 7700 Rub. Der Auftrag #39 hatte wiederum das größte Volumen aller Kaufen-Aufträge: 7653 Rub bei einem Volumen von 534 Lots.

Der Quelldaten der Markttiefe sind Informationen, die ein Trader auswertet, um eine entsprechende Handelsstrategie aufzustellen. Die einfachste Tradingidee besteht darin, dass das Sammeln und Gruppieren von Aufträgen signifikanten Volumens bei benachbarten Preislevels letztendlich zur Entstehung von Support- bzw. Resistance-Zonen führt. Im folgenden Abschnitt werden wir einen Indikator generieren, der etwaige Markttiefeveränderungen aufspüren und verfolgen soll.

4. Markttiefe

Es gibt eine ganze Menge verschiedener Indikatoren, die auf Markttiefedaten zurückgreifen und damit interagieren. Einige der interessanteren finden Sie auf dem MetaTrader-5-Markt. Mir persönlich sagt IShift am meisten zu. Yury Kulikov, dem Entwickler des Indikators, ist es gelungen ein ebenso kompaktes wie informatives Tool zu kreieren.

Alle Programme, die mit Markttiefedaten arbeiten, besitzen entweder eine Form von EA oder Indikator, da nur diese beiden MQL5-Programme über einen BookEvent-Ereignisbehandler verfügen.

Lassen Sie uns ein kurzes, kompaktes Programm entwerfen, das die Live-Markttiefedaten anzeigt. Hierfür müssen wir zunächst die Daten spezifizieren, die angezeigt werden sollen. Wir wollen dabei ein Panel mit horizontalen Balken verwenden, die das Volumen der Aufträge angeben sollen. Die Größe der Balken wird jedoch - im vorliegenden Fall - egal sein. Das maximale Volumen der aktuellen Aufträge soll 100% betragen. Abbildung 2 zeigt, dass der Auftrag für den Preis von 7507 Rub das größte Volumen (519 Lots) aufweist.

Für eine korrekte Panelinitialisierung muss die exakte Markttiefe oder die exakte Zahl der Levels spezifiziert werden (der „DOM-Tiefe“-Parameter). Die Zahl unterscheidet sich von Broker zu Broker.

Abb. 2 Markttiefepanels

Abb. 2 Markttiefepanels

Der Programmcode für das Panel wird mithilfe eines Ansatzes geschrieben, der auf objektorientiertem Programmieren basiert. Die Klasse, die für die Paneloperationen verantwortlich ist, heißt CBookBarsPanel.

//+------------------------------------------------------------------+
//| Book bars class                                                  |
//+------------------------------------------------------------------+
class CBookBarsPanel
  {
private:
   //--- Data members
   CArrayObj         m_obj_arr;
   uint              m_arr_size;
   //---
   uint              m_width;
   uint              m_height;

   //--- Methods
public:
   void              CBookBarsPanel(const uint _arr_size);
   void             ~CBookBarsPanel(void){};
   //---
   bool              Init(const uint _width,const uint _height);
   void              Deinit(void){this.m_obj_arr.Clear();};
   void              Refresh(const MqlBookInfo &_bookArray[]);
  };

Diese Klasse enthält vier DataMember.

  • Das Attribut m_obj_arr fungiert als ein Container für Pointer für Objekte des Typs CObject. Er dient dazu Markttiefedaten zu speichern. Für Letztgenanntes wird eine separate Klasse generiert werden.
  • Das Attribut m_arr_size zeigt sich wiederum für die Zahl der Markttiefelevels verantwortlich.
  • Was schließlich die Attribute m_width und m_height betrifft, so dienen diese der Speicherung der Paneldimensionen (Breite und Höhe in Pixel).

Was die Methoden angeht, so umfasst deren Set neben Konstruktor und Destruktor das Folgende:

  • eine Initialisierungsmethode
  • eine Deinitialisierungsmethode
  • eine Aktualisierungsmethode

Wir werden nun eine separate CBookRecord-Klasse für jede Panelreihe (Markttiefelevel) anlegen, die jeweils den Preis, die horizontalen Balken und das Volumen spezifizieren.

Dabei sollen insgesamt drei Pointer hinzugefügt werden. Einer von ihnen soll in Richtung des Objekts des Typs CChartObjectRectLabel (rechteckiges Label zum Arbeiten mit einem horizontalen Balken) und die beiden anderen in Richtung des Typs CChartObjectLabel (Textlabels für den Preis und das Volumen) zeigen.

//+------------------------------------------------------------------+
//| Book record class                                                |
//+------------------------------------------------------------------+
class CBookRecord : public CObject
  {
private:
   //--- Data members
   CChartObjectRectLabel *m_rect;
   CChartObjectLabel *m_price;
   CChartObjectLabel *m_vol;
   //---
   color             m_color;

   //--- Methods
public:
   void              CBookRecord(void);
   void             ~CBookRecord(void);
   bool              Create(const string _name,const color _color,const int _X,
                            const int _Y,const int _X_size,const int _Y_size);
   //--- data
   bool              DataSet(const long _vol,const double _pr,const uint _len);
   bool              DataGet(long &_vol,double &_pr) const;

private:
   string            StringVolumeFormat(const long _vol);
  };

Zu diesen Methoden zählen:

  • eine Methode zum Erstellen von Aufzeichnungen;
  • eine Methode zum Einstellen von Daten;
  • eine Methode zum Empfangen von Daten;
  • eine Methode zum Formatieren großer Zahlen.

Der Behandler bzw. das Steuerprogramm für das Ereignis BookEvent des EAs und somit des Indikators sieht nun wie folgt aus:

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//--- select the symbol
   if(symbol==_Symbol)
     {
      //--- array of the DOM structures
      MqlBookInfo last_bookArray[];

      //--- get the book
      if(MarketBookGet(_Symbol,last_bookArray))
         //--- refresh panel
         myPanel.Refresh(last_bookArray);
     }
  }

Das heißt, jedes Mal, wenn ein BookEvent-Ereignis generiert wird, wird das Panel die entsprechenden Datenaktualisierung durchführen. Wir werden die aktualisierte Version des Programms auf den Namen BookEventProcessor2.mq5 taufen.

Im obigen Video können Sie sehen, wie der EA seine Arbeit tut.

Fazit

Dieser Artikel ist einer anderen Art von Ereignissen gewidmet - Markttiefeereignissen. Dieses Ereignis stellt nicht selten den Kern hochfrequenter Tradingalgorithmen (HFT) dar. Dieser Tradingtyp wird in letzter Zeit zusehends beliebter.

Ich hoffe, dass Trader, die gerade erst damit beginnen, mit MQL5 zu programmieren, die angehängten Beispiele zur Behandlung von Markttiefeereignissen einigermaßen lehrreich finden werden. Die Dateien, die diesem Artikel angehängt sind, sollten sinnvollerweise in den Projektordner kopiert werden. In meinem Fall wäre dies \MQL5\Projects\BookEvent.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/1179

Beigefügte Dateien |
BookEvent.zip (3.84 KB)
Warum Virtual-Hosting mit MetaTrader 4 und MetaTrader 5 herkömmlichen VPS (virtuellen, privaten Servern) überlegen ist Warum Virtual-Hosting mit MetaTrader 4 und MetaTrader 5 herkömmlichen VPS (virtuellen, privaten Servern) überlegen ist
Das Virtual-Hosting-Cloud-Netzwerk wurde speziell für MetaTrader 4 und MetaTrader 5 entwickelt und besitzt alle Vorteile einer nativen Lösung. Testen Sie jetzt einen unserer virtuellen Server, indem Sie unser 24-stündiges Gratisangebot in Anspruch nehmen.
Auf Fraktalen basiertes Zeichnen von Trendlinien mithilfe von MQL4 und MQL5 Auf Fraktalen basiertes Zeichnen von Trendlinien mithilfe von MQL4 und MQL5
Dieser Artikel widmet sich dem automatischen Zeichnen von Trendlinien via MQL4 und MQL5 basierend auf dem Fraktale-Indikator. Die Struktur des Artikels ist so angelegt, dass sie einen vergleichenden Blick auf zwei Sprachen werfen wird. Das Zeichnen von Trendlinien basiert dabei auf den beiden letzten bekannten Fraktalen.
Random-Forest-Vorhersage-Trends Random-Forest-Vorhersage-Trends
Dieser Artikel widmet sich der Verwendung des Rattle-Pakets zur automatischen Suche nach Mustern zur Vorhersage von Long- und Short-Positionen von Forex-basierten Währungspaaren. Dieser Artikel richtet sich an Neulinge ebenso wie an erfahrene Trader.
Liquid-Chart Liquid-Chart
Würden Sie auch sehr gerne einen stündlichen Chart sehen, der zwischen der zweiten und der fünfte Minute Balken öffnet? Wie sieht ein neu entworfener Chart aus, wenn sich die Balkenöffnungszeit jede Minute ändert? Welche Vorteile bietet solch ein Chart beim Trading? Antworten auf diese und einige weitere Fragen werden Sie im vorliegenden Artikel finden.