MQL5-Kochbuch: Verarbeitung des Ereignisses BookEvent
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
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
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
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
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.