programovanie
Teraz čítaš
MQL prakticky. Časť Algo Trader. I [kurz programovania]
0

MQL prakticky. Časť Algo Trader. I [kurz programovania]

vytvorené Radek SzafronJúla 4 2019

V dnešnej epizóde začneme pracovať na softvéri, ktorý vám umožní využiť príležitosti, ktoré ponúka algoritmické obchodovanie, a zároveň zachovať maximálnu kontrolu nad priebehom udalostí. Zameriame sa na nápady, ktoré vám umožnia zapojiť sa do skutočného obchodovania maximalizáciou intuitívnosti používania a flexibility funkcií. V softvéri budeme používať rozhranie, ktorého forma je mnohými považovaná za štandard v odvetví denného obchodovania a často sa nazýva cenový rebríček

algotrader

Algo Trader – rozhranie

Plán projektu

Prácu rozdelíme do niekoľkých etáp, pretože okrem rozsiahleho vybavovania objednávok vám Algo Trader umožní spúšťať algoritmy, ktoré budú automaticky riadiť pozíciu podľa rôznych kombinácií, ktoré si budete môcť vytvárať v závislosti od situácie, s ktorou sa stretnete. na trhu.

V dnešnej časti urobíme prvý krok do sveta objektovo orientovaného programovania a spustíme základnú časť nášho projektu týkajúcu sa rozhrania a podpory základných operácií.

V nasledujúcich epizódach začneme pracovať na prvých algoritmoch. Na začiatok vytvoríme GTP algoritmus, ktorý zabezpečí uzavretie pozície s očakávaným ziskom bez ohľadu na to, z koľkých objednávok pozostáva. Ďalej vytvoríme algoritmus OOO (One Open the Other, presne tak, ešte tu nebol) a nakoniec algoritmus, ktorý umožňuje skalpovanie pri prezentácii dôležitých makro údajov. Spolu s algoritmami sem-tam pridáme nejaký pekný gadget.

Technické zázemie

Balíček so súbormi, ktoré dnes potrebujete, nájdete na tomto odkaze:

Používaním softvéru súhlasíte s licenciou, ktorá je priložená k sade súborov.

Pre správne fungovanie softvéru je potrebné prostredie Microsoft NET Framework, min. 4.6.1 Runtime, ktoré si môžete stiahnuť tu:

Objektovo orientované programovanie

Náš softvér vytvoríme pomocou objektovo orientované programovaniet.j. programovacia metóda, ktorá umožňuje logické usporiadanie fragmentov algoritmu v tzv. objekty, ktorých úlohou je vykonávať samostatné funkcie a komunikovať s inými objektmi, aby bolo možné vykonávať úlohu programu ako celku. Aby sme išli ďalej, musíme pochopiť, aké objekty sú v praxi a ako sa vytvárajú. Na tento účel si pozrite nižšie uvedený článok Wikibooks, ktorý používa príklad jazyka C ++, na ktorom je založený MQL4, aby vám pomohol pochopiť základy.

PREČÍTAJTE SI ČLÁNOK

Prvá trieda

Ako vidíte, všetko sa točí okolo kľúčového slova trieda. Umožňuje definovať objekt, ktorý následne vytvoríme pomocou kľúčového slova nový. Otvorte súbor obsahujúci definíciu jednej z tried, ktoré dnes použijeme, file ChartOperations.mqhktoré nájdete v katalógu MQL4 \ Include \ AlgoTrader_v10.

trieda cChartOperations { public: cChartOperations(int šírka, int výška) { // ... } zrušiť Po kliknutí(int x, int y) { // ... } zrušiť OnChartChange() { // ... } súkromné: int Šírka_grafu; int Výška_grafu; UINT last_click; int last_click_x, last_click_y; bool IsDoubleClick(int x, int y) { // ... } };

 

 

Každá trieda má konštruktor, čo je v praxi funkcia, ktorá sa automaticky volá pri vytvorení objektu. Konštruktor má rovnaký názov ako objekt a môže preberať parametre. V našom úryvku vyššie vytvoríme konštruktor takto:

cChartOperations(int šírka, int výška) { }

 

Po vytvorení konštruktora môžeme definovať komponenty triedy, teda funkcie a premenné. Sú definované presne ako bežné funkcie a premenné, s výnimkou toho, že v tele triedy. Venujte pozornosť kľúčovým slovám public: oraz súkromné:. Všetky funkcie a premenné za slovom public: budú dostupné pre funkcie, ktoré sú v iných častiach softvéru, ako je napríklad funkcia API OnTick () alebo iné predmety. Súkromný na druhej strane informuje zostavovateľa, že prvky definované v tejto časti sú prísne dôverné a pre akýkoľvek poklad k nim nikto okrem daného objektu nemôže mať prístup.

Aplikácie objektov

Prečo sú predmety také užitočné? Okrem iného aj to, že raz definovaný objekt môže byť vytvorený v ľubovoľnom počte kópií a v závislosti od parametrov, ktoré im budú odovzdané, sa budú správať primerane odlišne, ale spôsobom, ktorý dokážeme analyzovať a kontrolovať. Objekty navyše umožňujú jasnú organizáciu kódu rozkladom komponentov algoritmu na samostatné prvky a správne navrhnutý objekt možno použiť v úplne inom softvéri, čo umožňuje efektívnejšie vytvárať komplexné aplikácie.


odborní poradcovia


Začneme prvým objektom

Poďme k hlavnému súboru nášho softvéru, AlgoTrader_v10.mq4ktoré nájdete v katalógu MQL4 \ Experti \.

Pozrime sa na definíciu API nižšie OnInit ():

cChartOperations* ChartOperations = NULOVÝ; int onInit() { // (...) int šírka_grafu = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS); int výška_grafu = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS); ChartOperations = nový cChartOperations(chart_width, výška_grafu); návrat(INIT_SUCCEEDED); }

Ukazovateľ

V časti súboru zodpovednej za definíciu globálnych premenných pomocou fragmentu kódu ...

cChartOperations* ChartOperations = NULOVÝ;

 

... vytvárame tzv ukazovateľ teda ukazovateľ, ktorý bude obsahovať adresu na miesto v pamäti počítača, kde sa neskôr vytvorí náš objekt. Pomocou ukazovateľa budeme môcť odkazovať na objekt a volať jeho funkcie. Ukazovatele definujeme podobne ako premenné, prvým prvkom zápisu je typ objektu, potom dáme hviezdičku * za ktorým nasleduje jedinečný názov objektu, ktorý neskôr použijeme pre referencie. Do nášho ukazovateľ priradíme premennú NULOVÝktorý hovorí, že v tomto štádiu ešte neukazuje na žiadny predmet.

Konštruktér

Neskôr v kóde, v tele funkcie OnInit () pomocou kľúčového slova vytvoríme správny objekt nový.

ChartOperations = nový cChartOperations(chart_width, výška_grafu);

 

Po nový voláme konštruktor objektu, ktorý v našom prípade berie dve premenné hovoriace objektu o rozmeroch nášho grafu, pretože ho potrebujeme na správne umiestnenie nášho rozhrania. Volaný konštruktor odovzdá adresu novovytvoreného objektu v pamäti počítača našej ukazovateľ pomenovaný ChartOperations.

Ničiteľ

Objekty sú špeciálnym typom dát, ktoré ak ich vytvoríme, musíme zabezpečiť ich definitívne odstránenie z pamäte počítača. To všetko preto, aby ste vedľa notebooku nemuseli stáť veľký server zbierajúci predtým vytvorené dáta, ktoré už nikto nepotrebuje.

Na vymazanie objektov používame kľúčové slovo vymazať, za ktorý sme dali meno toho nášho ukazovateľ označujúci, ktorý objekt máme na mysli. Náš objekt odstránime iba vo funkcii API OnDeinit (...)pretože ho potrebujeme počas celého životného cyklu aplikácie, kým sa softvér nevypne.

zrušiť onDeinit(const int dôvod) { // (...) vymazať ChartOperations; }

Práca s predmetmi

Teraz sa pozrime, ako môžeme použiť náš vytvorený objekt pre potreby našej aplikácie. Za týmto účelom v tele triedy cChartOperations definovali sme niektoré funkcie. Pozrime sa na jeden z nich:

zrušiť Po kliknutí(int x, int y) { if(IsDoubleClick(x, y)) GoToPrice(x, y); }

 

funkcie Po kliknutí (...) musíme do nášho rozhrania komunikovať, aké cenové hladiny sú pre nás momentálne zaujímavé. Dvojitým kliknutím na graf algoritmus nastaví náš cenový rebríček na uvedené miesto. Aby naša funkcia fungovala, musíme detekovať moment, kedy klikneme na graf a práve tu sa nám hodí funkcia API OnChartEvent (...)

zrušiť OnChartEvent(const int id, const dlho & lparam, const zdvojnásobiť & dparam, const reťazec & spam) { // (...) if(id == CHARTEVENT_CLICK) ChartOperations.OnClick((int)lparam, (int)dparam); }

 

Vyššie uvedený úryvok kódu rozpozná moment, keď používateľ klikne na graf a potom zavolá funkciu, ktorá sa nachádza vo vnútri nášho predtým vytvoreného objektu. Volanie funkcie je vložiť bodku za naše meno ukazovateľ objektu a následne odovzdanie názvu funkcie, ktorá nás zaujíma, spolu s parametrami, ktoré potrebujeme, čo v našom prípade znamená súradnice x a y miesta na grafe, kde bolo kliknutie urobené.

Prvé efekty

Postupy, ktoré sme vytvorili, spustili prvú softvérovú funkcionalitu, ktorú môžeme otestovať zostavením nášho programu a klikaním na rôzne miesta v tabuľke. Nižšie nájdete grafiku, ktorá predstavuje niekoľko funkcií, ktoré vám umožňujú manipulovať s cenovými hladinami zobrazenými v našom grafickom rozhraní.

programovanie mql

Algo Trader - Myš a cenové hladiny

Druhá trieda

Keďže ste postúpili do druhej triedy a aby naše klikanie nebolo márne, navrhneme vám druhý objekt, ktorý vám umožní zadávať objednávky z úrovne nášho rebríčka. Na tento účel sme pripravili príslušnú triedu, ktorú nájdete v súbore MQL4 \ Include \ AlgoTrader_v10 \ OrderOperations.mqh

trieda cOrderOperations { public: cOrderOperations(int position_id) { position_id = position_id; } zrušiť Časovač zapnutia 200 ms() { ProcessOrderRequests(); } súkromné: int position_id; zrušiť ProcessOrderRequests() { sPožiadavka na objednávku požiadať = ReadOrderRequest(); if(request.Request_id <= 0) návrat; if(žiadosť.Symbol_objednávky != symbol() || request.Position_id != position_id) { request.Request_status = ORDER_REQUEST_STATUS_FAILED; request.Request_error = ORDER_REQUEST_ERROR_WRONG_POSITION; návrat; } if(ObjednávkaOdoslať(request.order_symbol, request.Order_type, request.order_volume, request.Order_price, 0, 0, 0, request.Order_comment, request.Position_id) > 0) { request.Request_status = ORDER_REQUEST_STATUS_COMPLETED; } inak { request.Request_status = ORDER_REQUEST_STATUS_FAILED; request.Request_error = _LastError; } UpdateOrderRequest(požiadať); } };

Vo vyššie uvedenom kóde môžete vidieť úplnú definíciu objektu cOrderOperationsktoré sa použijú na spracovanie objednávok, ktoré umiestnime na náš cenový rebríček. Všimnite si funkciu ProcessOrderRequests ()kde náš program komunikuje s knižnicou dll pomocou funkcie ReadOrderRequest ().

Štruktúry

funkcie ReadOrderRequest () vráti typovú štruktúru ako výsledok svojej činnosti sPožiadavka na objednávku, čo je nami definovaný súbor údajov o objednávke odoslanej pomocou rozhrania.

zrušiť ProcessOrderRequests() { sPožiadavka na objednávku požiadať = ReadOrderRequest(); // (...) }

Štruktúry sú malé sestry tried, ktoré vám umožňujú vytvoriť dátový blok obsahujúci veľa premenných. To umožňuje logické usporiadanie informácií súvisiacich s danou problematikou. V našom prípade štruktúra zhromažďuje údaje o objednávke odoslanej cez naše grafické rozhranie, ako je otváracia cena alebo objem. Štruktúra je definovaná pred jej názvom kľúčovým slovom štruktúra potom vytvoríme zoznam údajov, ktoré potrebujeme.

štruktúr sPožiadavka na objednávku { int Žiadosť_id; int position_id; int Typ_objednávky; zdvojnásobiť Objem_objednávky; zdvojnásobiť Objednávka_cena; zdvojnásobiť Rozsah_objednávok; reťazec Objednávka_symbol; reťazec Objednávka_komentár; int Stav_žiadosti; int Chyba_žiadosti; };

 

Vyššie uvedená definícia sa nachádza v súbore MQL4 \ Include \ AlgoTrader_v10 \ Definitions.mqh.

Štruktúry používame podobne ako premenné, t. j. v prvom kroku ju musíme vytvoriť zadaním typu štruktúry a potom jej dať jedinečný názov, na ktorý sa môžeme neskôr odvolávať. V nižšie uvedenom príklade vytvoríme štruktúru typu sPožiadavka na objednávku a dať mu jedinečný názov požiadaťa potom mu pomocou funkcie priradíme údaje z nášho rozhrania ReadOrderRequest ().

zrušiť ProcessOrderRequests() { sPožiadavka na objednávku požiadať = ReadOrderRequest(); // (...) }

 

Prístup k údajom uloženým v štruktúre je analogický s používaním premenných, pretože štruktúra je v praxi iba súborom premenných skrytých pod spoločným identifikátorom. Na čítanie alebo zápis údajov v štruktúre stačí dať bodku za názov, ktorý sme mu dali, a potom uviesť názov premennej, ktorá nás zaujíma. V úryvku kódu nižšie načítame údaje uložené v štruktúre na odoslanie objednávky a následne uložíme informáciu o výsledku operácie.

if(ObjednávkaOdoslať(request.order_symbol, request.Order_type, request.order_volume, request.Order_price, 0, 0, 0, request.Order_comment, request.Position_id) > 0) { request.Request_status = ORDER_REQUEST_STATUS_COMPLETED; }

Vykonávanie objednávok

Aby náš softvér mohol zadávať objednávky, musíme implementovať objekt vytvorený na základe triedy cOrderOperations. Keďže objekt budeme potrebovať my, vytvoríme ho vo funkcii API OnInit ().

vstup int position_id = 8821; // Jedinečný identifikátor položky cOrderOperations* OrderOperations = NULOVÝ; int onInit() { EventSetMillisecondTimer(200); // (...) OrderOperations = nový cOrderOperations(position_id); návrat(INIT_SUCCEEDED); }

 

V konštruktérovi cOrderOperations vložíme premennú position_idktorý je súčasťou nastavení našej aplikácie dostupnej v predvolenom okne MetaTrader. Identifikátor umožňuje nášmu softvéru rozpoznať vlastné objednávky, aby nedošlo k ich zámene s objednávkami z iných zdrojov.

V kóde vyššie sme tiež bežali Časovač s intervalom 200 ms, pretože naše zariadenie by malo pravidelne kontrolovať, či rozhranie odosiela informácie o pripravovanej objednávke.

zrušiť Časovač zapnutia() { // (...) OrderOperations.OnTimer200 ms(); }

 

Funkcia objektu Časovač zapnutia 200 ms () zavolá funkciu ProcessOrderRequests ()ktorá zadá objednávku, keď dostane relevantné údaje z rozhrania.

trieda cOrderOperations { public: cOrderOperations(int position_id) { position_id = position_id; } zrušiť Časovač zapnutia 200 ms() { ProcessOrderRequests(); } // (...) };

účinky

Náš softvér už vie komunikovať s grafickým rozhraním a môžeme robiť to, čo nás baví najviac, teda zostaviť algoritmus a zadať novú objednávku. Aby ste si uľahčili prvé kroky, nižšie nájdete niekoľko tipov, ktoré ilustrujú, aké funkcie sa skrývajú pod rôznymi klávesmi.

Nastavenie hlasitosti

forexový objem

Algo Trader - Manipulácia s objemom

Typy objednávok

obchodovanie s algami

Algo Trader - Spracovanie objednávok

Sčítanie

To je na dnes všetko, ale toto je len začiatok dobrodružstva s Algo Trader. V ďalšej epizóde prejdeme k implementácii pokročilých funkcií súvisiacich s podporou algoritmov. Algo Trader bude vytvorený spolu s vami a budeme vďační za akékoľvek nápady a pripomienky, ktoré by vám mohli pomôcť. Radi by sme od vás počuli na biuro@expertadvisors.pl .

Co si myslis?
Mám rád
70%
zaujímavé
20%
heh...
10%
Šokujúce!
0%
nemám rád
0%
Škoda
0%
O autorovi
Radek Szafron
Autorom publikácie je Radek Szafron, majiteľ spoločnosti Expert Advisors, ktorá už dlhé roky podporuje investorov poskytovaním technológií venovaných FOREX trhu. Autor je absolventom Varšavskej ekonomickej školy so špecializáciou „Finančné trhy“ a programátorom s takmer 20-ročnou praxou. Spoločnosť realizuje projekty algoritmov a aplikácií napísaných vo všetkých jazykoch z rodiny "C", vrátane pre populárne platformy Meta Trader 4 a 5. Odborných poradcov nájdete na www.expertadvisors.pl.
Komentarze

Zanechať odpoveď