programovanie
Teraz čítaš
MQL prakticky. Panic Button, časť II [kurz programovania]
0

MQL prakticky. Panic Button, časť II [kurz programovania]

vytvorené Radek SzafronMarch 29 2019

Vitajte pri druhej časti Panic Button! Tento týždeň máme ďalší pohľad na náš kód tlačidla paniky. Našou dnešnou úlohou bude doplniť to najdôležitejšie, teda funkciu oslobodiť nás od bremena otvorených pozícií a oslobodiť nás od väzov neustáleho pozerania do monitora.

Základnú funkcionalitu rozvinieme niečím iným. Zabezpečíme, aby bol nástroj, ktorý navrhujeme, bezpečný a aby náhodné kliknutia zaznamenali neotrasiteľné a stoické kliknutia. Ako každé seriózne tlačidlo na našej planéte, aj to naše bude mať akúsi poistku, ktorá vám umožní zatvoriť polohu iba vtedy, keď je kliknutie sprevádzané stlačením klávesu [Shift] na klávesnici.


Nezabudnite si prečítať: MQL prakticky. Panic Button, časť I.


Otvárame továreň na algoritmy

Zapneme teda MetaEditor.

Prejdime k úprave kódu našej aplikácie z minulého týždňa. Otvorme súbor Panic Button.mq4 z adresára Odborníci a poďme sa pozrieť na funkciu OnInit (). Vaša funkcia by mala vyzerať takmer identicky s funkciou nižšie s malým rozdielom. Dnes je tu nová položka kódu označená // s komentárom .

int OnInit ()
{
if(IsDemo () == nepravdivý)
{
 
návrat INIT_FAILED;
 
}
bool modrá = nepravdivý;
if(Iba_tento_nástroj == pravdivý)
{
 
modrá = pravdivý;
 
}
Button_utworz_sie (5, 15, Modrá);
// <- [Takto robíme komentáre] EventSetMillisecondTimer(250); // Koniec správ
návrat INIT_SUCCEEDED;
}
kód MQL4

Pridajme chýbajúci kód do funkcie OnInit ().

Spustíme hodiny

Funkcia MQL API pridaná do kódu vyššie bool EventSetMillisecondTimer(int milisekúnd)umožňuje nakonfigurovať časovač. Časovač je metóda, ktorá vám umožňuje volať ďalšiu funkciu API - Časovač zapnutia () každý zadaný počet milisekúnd. Toto riešenie nám umožňuje cyklicky spúšťať špecifické časti kódu ich umiestnením do funkcie Časovač zapnutia (). V našom prípade 4-krát za sekundu, čo je presne to 250 milisekúnd.

Hodiny tikajú, tak si napíšme novú funkciu.

zrušiť Časovač zapnutia()
{
 
Button_badz_czujny ();
 
}
kód MQL4

Dobrá práca. Práve ste vytvorili algoritmus zodpovedný za zabezpečenie nášho tlačidla proti náhodnému kliknutiu. To bola tá ťažšia časť. Odteraz, ak chcete kliknúť na tlačidlo, budete musieť podržať kláves [Shift] na klávesnici. Rotácie na elektrónoch sú odskrutkované Button_badz_czujny ()ktoré sme doviezli z knižnice Library_panic_button.ex4 minulý týždeň.

Platforma vyžaduje, aby bol časovač chodu vypnutý, keď ho už nepotrebujeme. Môžeme to urobiť pridaním funkcie API EventKillTimer () do funkcie OnDeinit ()ktorý sme vytvorili v predchádzajúcej časti a ktorý, pre pripomenutie, spustí platforma, keď zatvoríme našu aplikáciu. Upravme funkciu OnDeinit ()aby to vyzeralo ako funkcia nižšie.

zrušiť onDeinit(const int dôvod)
{
 
Button_bye_bye ();
 
EventKillTimer ();
}
kód MQL4

Tu môžete spustiť aplikáciu a zistiť, ako algoritmus reaguje na stlačenie klávesu [Shift].

Sledujeme každý pohyb

Teraz je čas začať premýšľať o funkcii uzatvárania pozícií. Na tento účel musíme rozpoznať moment kliknutia na tlačidlo. Funkcia API príde vhod zrušiť OnChartEvent(const int id, konštantne dlhé & lparam, const double & dparam, const string & spam).

funkcie OnChartEvent (...) je spúšťaný platformou vždy, keď sa v grafe vyskytne udalosť, ktorá môže byť dôležitá pre fungovanie programu, napríklad používateľ klikne na objekt alebo pohne myšou. Napíšeme si teda príslušnú funkciu.

zrušiť OnChartEvent(const int id, konštantne dlhé & lparam, const double & dparam, const string & spam)
{
 
}
kód MQL4

Funkcia volania z platformy OnChartEvent (...) pomocou parametrov mu odovzdá ďalšie informácie id, param, dparamoraz spar. To nám umožňuje identifikovať, ktorá udalosť sa stala, a typ udalosti je uložený v premennej idktorý je typ int, čo je celé číslo. Slovo const vedľa typu premennej to znamená, že danú premennú nie je možné modifikovať a slúži len na čítanie informácií.

Rozšírme našu funkciu o ďalší prvok.

zrušiť OnChartEvent(const int id, konštantne dlhé & lparam, const double & dparam, const string & spam)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
}
 
}
kód MQL4

S operátorom if vyššie, skontrolujeme, či premenná id je rovné == hodnota definovaná v automaticky vygenerovanej premennej s názvom CHARTEVENT_OBJECT_CLICK. Ak áno, sme si istí, že používateľ klikol na objekt v grafe, zatiaľ nešpecifikovaný, na ktorom náš algoritmus pracuje.

Už vieme, že keď operátor podmieneného výrazu if sa ukáže ako logicky pravdivý, vykoná sa kód medzi zloženými zátvorkami {} patriace tomuto operátorovi. Pridajme teda do nášho kódu, čo by sa malo stať, keď dôjde k kliknutiu na ľubovoľný objekt v grafe.

zrušiť OnChartEvent(const int id, konštantne dlhé & lparam, const double & dparam, const string & spam)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_ or_jestes_klikniety (sparam) == pravdivý)
{
 
}
 
}
 
}
kód MQL4

Vyššie uvedený kód skontroluje, či bolo pri použití funkcie kliknuté na naše tlačidlo bool Button_or_jestes_klikniety (reťazec názov_objektu)ktorý pochádza z importovanej knižnice. Funkcia berie ako parameter premennú dátového typu reťazec, čo je textová premenná, ktorá by mala obsahovať názov objektu, na ktorý používateľ klikol. Funkcia porovná získanú hodnotu s názvom grafického prvku tlačidla a na otázku, či bolo kliknuté na naše tlačidlo, odpovie hodnotou typu bool, teda hodnotu pravdivý lub nepravdivý.

Ako poznáme názov objektu, na ktorý sme klikli? Funkcia OnChartEvent (...) pomocou parametra dostane názov naposledy kliknutého objektu z platformy reťazec pomenovaný sparktorý môžeme odovzdať priamo ako parameter našej funkcii, ach áno Button_or_jestes_klikniety (sparam).

Vykonávame zverenú úlohu [Betón]

Keď funkciaButton_or_jestes_klikniety (...) vráti hodnotu pravdivý budeme vedieť, že neexistujú žarty, musíte situáciu zachrániť.

Pridajme do nášho kódu funkciu, ktorá bude vykonávať hlavnú úlohu nášho algoritmu, teda uzatváranie pozícií na účte. Funkcia má nasledujúcu deklaráciu:

bool Close_items_and_Orders (bool iba_desaťnástroj),

V praxi ho umiestňujeme do kódu ako v rámčeku nižšie.

zrušiť OnChartEvent(const int id, konštantne dlhé & lparam, const double & dparam, const string & spam)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_ or_jestes_klikniety (sparam) == pravdivý)
{
 
Close_items_and_Orders (Iba_tento_nástroj);
 
}
 
}
 
}
kód MQL4

funkcie Close_positions_and_ orders (...) berie ako argument premennú typu boolktorý by mal niesť informácie, pravdivý lub nepravdivýči by sme mali zatvárať pozície len pre nástroj, na ktorom algoritmus pracuje. Pamätáte si parameter Iba_tento_nástroj z panela nastavení v prvej časti? Jednoducho nám to prišlo vhod. V závislosti od našej voľby v nastaveniach program uzavrie pozície, ktoré zodpovedajú zvolenému grafu alebo všetky pozície na účte.


odborní poradcovia


Vytvárame hlavnú funkciu

Začneme upravovať súbor "Useful_functions.mqh" z adresára MQL4 \ Include \ Panic Button \

Doteraz sme používali iba funkcie, ktoré pochádzajú z MQL API alebo sú importované z knižnice Library_panic_button.ex4. V reálnom svete si však programovanie vyžaduje, aby sme si väčšinu funkcií vytvárali sami, pričom sa podporujeme celým spektrom hotových riešení. Funkcie Close_positions_and_ orders (...) , ktorý používame vyššie, nájdete v súbore Useful_Features.mqh, ktoré v predchádzajúcej časti zaradili sme do katalógu MQL4 \ Include \ Panic Button \ a pripojili kód pomocou kľúčového slova #include. Spomínaný súbor si otvoríme v MetaEditore, pretože, čuduj sa, funkcia uzatvárajúca položky už v súbore je, no musíme mu ešte dať obsah.

Definícia funkcie

Po otvorení súboru Useful_Features.mqh uvidíš, že to tam je definícia funkcia uzatvárania pozície. Vyzerá podobne ako funkcie, ktoré sme používali doteraz, s tým rozdielom, že je náš, vlastný a môžeme mu dať akýkoľvek názov, typ a sadu parametrov. Vaša funkcia by mala vyzerať približne ako funkcia nižšie:

bool Close_items_and_Orders (bool iba_desaťnástroj)
{
návrat pravdivý;
}
kód MQL4

Teda v hlavička , definovali sme funkciu s názvom Close_items_and_Orders vrátenie typu údajov bool a vziať jeden pomenovaný parameter iba_desiaty_nástroj aj o dátovom type bool.

Obsah funkcie

Všetko, čo vložíme medzi kučeravé zátvorky {} za hlavičkou funkcie sa skladá z jej obsahu. Obohaťme teda náš obsah o prvý kód.

bool Close_items_and_Orders (bool iba_desaťnástroj)
{
if(Je pripojený() == nepravdivý) návrat nepravdivý;
int a = 0; int počet_pozícií_i_ objednávok = Počet objednávok();
if(počet položiek_a objednávok == 0) návrat pravdivý;
bool výsledok = pravdivý;
návrat výsledok;
}
kód MQL4

Vyššie, prvý if, skontrolujeme, či sme pripojení k serveru pomocou funkcie API Je pripojený() a v prípade problémov prenecháme funkciu operátorovi návrat pri vrátení hodnoty nepravdivýaby ste vedeli, že niečo nie je v poriadku. Správne, po if neexistujú žiadne zložené zátvorky, pretože skrátenú notáciu používame v situáciách, keď chceme vykonať iba jednu operáciu po podmienenom výraze.

Keď sme online, algoritmus pokračuje a vytvára dve premenné int o menách i oraz počet položiek a objednávok priradenie hodnoty prvému 0a druhá je hodnota z API Počet objednávok()ktorý vás informuje o počte otvorených pozícií a príkazov na vašom účte.

Ďalší operátor if skontroluje, či už nie sú všetky položky zatvorené, a používateľ klikne na tlačidlo len zo zábavy alebo mimo afektu, čo má za následok opustenie funkcie s prenosom hodnôt pravdivýlebo vsetko je ok.

Zatiaľ čo funkcia má stále čo robiť, vytvára premennú bool pomenovaný výsledokktoré neskôr použijeme na to, aby sme Vás informovali, či všetky položky boli koncovým operátorom riadne uzatvorené návratktoré sme v tomto kroku mierne upravili.

Pre slučku

operátor prektorý je svojou obľúbenosťou asi na druhom mieste za operátorom if, sa používa na vykonanie určitého súboru operácií s určitým počtom opakovaní. Je to ideálne v situáciách, ako je naša, pretože musíme vykonať operáciu uzávierky pre každú objednávku samostatne. Pridajme k našej funkcii slučku pre.

bool Close_items_and_Orders (bool iba_desaťnástroj)
{
if(Je pripojený() == nepravdivý) návrat nepravdivý;
int a = 0; int počet_pozícií_i_ objednávok = Počet objednávok();
if(počet položiek_a objednávok == 0) návrat pravdivý;
bool výsledok = pravdivý;
pre(i = počet_položiek_i_ objednávok - 1; i> = 0; i--)
{
 
}
návrat výsledok;
}
kód MQL4

W hlavičkapo operátorovi pre vidíme tajomný záznam: (i = počet_položiek_i_ objednávok - 1; i> = 0; i--) .

Zápis znamená, že cyklus začína premennou, ktorú sme vytvorili predtým i rovná premennej počet položiek a objednávok mínus jedna a zopakuje operáciu uzavretú v zložených zátvorkách {} pokiaľ je premenná i je väčšie alebo rovné nule [i> = 0] a na konci každého cyklu zníži premennú i o jeden [a--], aby sa slučka mohla niekedy skončiť. Jednoduché, nekomplikované a príjemné na čítanie.

Slučka hovorí ľudskou rečou pre vykoná operáciu v zátvorkách {} toľkokrát, koľkokrát máme otvorených pozícií.

Pridajme obsah do našej slučky.

bool Close_items_and_Orders (bool iba_desaťnástroj)
{
if(Je pripojený() == nepravdivý) návrat nepravdivý;
int a = 0; int počet_pozícií_i_ objednávok = Počet objednávok();
if(počet položiek_a objednávok == 0) návrat pravdivý;
bool výsledok = pravdivý;
pre(i = počet_položiek_i_ objednávok - 1; i> = 0; i--)
{
if(OrderSelect(a, SELECT_BY_POS) == nepravdivý)
{
výsledok = nepravdivý; pokračovať;
}
if(iba_desaťnástroj == pravdivý && OrderSymbol()! = symbol()) pokračovať;
if(Typ objednávky() == OP_BUY || Typ objednávky() == OP_SELL)
{
if(OrderClose(Objednajte si lístok(), OrderLots(), OrderClosePrice(), 0) == nepravdivý)
{
výsledok = nepravdivý; pokračovať;
}
}
ináč Ak(OrderDelete(Objednajte si lístok()) == nepravdivý) výsledok = nepravdivý;
}
návrat výsledok;
}
kód MQL4

Raketová fyzika

Poďme analyzovať krok za krokom, čo sa deje v našej slučke prektoré sme statočne napísali v predchádzajúcej etape.

V prvom kroku pomocou funkcie API OrderSelect(...) objednávku vyberieme z terminálu pomocou čísla pozície v zozname objednávok (prvé poradie v zozname je nula). Na tento účel používame premennú iktorý mení hodnotu s každou slučkou. V prípade zlyhania uložíme chybu do premennej výsledok a informujeme slučku pre s operátorom pokračovaťže by sa mal v tomto bode zlomiť a začať nový cyklus s premennou i mínus jedna [a--].

Keď je všetko v poriadku, ďalší operátor if použije, novinka, logická operácia “a" &&ktorý vráti hodnotu pravdivý iba ak oba výrazy na oboch jeho stranách vrátia hodnotu pravdivý. Keď teda nástroj zvoleného príkazu [OrderSymbol()] neodpovedá [!=] grafový nástroj [symbol()] a premenná iba_desiaty_nástroj má hodnotu pravdivý, daný príkaz a pomocou operátora ignorujeme pokračovať prejdeme na ďalší cyklus slučky pre. Vo všetkých ostatných prípadoch je algoritmus nižší.

Potom náš program skontroluje, v akom poradí máme radosť, a urobí to pomocou funkcie API Typ objednávky() a logická operácia"alebo" ||ktorý vráti hodnotu pravdivýkeď aspoň jeden z výrazov na oboch jeho stranách vráti hodnotu pravdivý. V opačnom prípade, keď logický výraz operátora if ako celok vráti hodnotu nepravdivý bude vykonaný operátor ináč Akktorý pracuje s prvým ak ich a slúži mu ako plán B, keď sa nevie vyrovnať s vlastným logickým vyjadrením.

V závislosti od typu objednávky prvá if pri riešení trhového nákupného príkazu [OP_BUY] alebo predaj na trhu [OP_SELL] zatvorí pozíciu s funkciou API OrderClose(...), a ďalšie ifalebo vlastne ináč Ak zrušiť čakajúce objednávky pomocou funkcie OrderDelete(...).

Zdravím vás, program je pripravený!

Zmeny uložíme do súboru Useful_Features.mqh, vrátime sa späť do hlavného kódu aplikácie Panic Button.mq4 a nadšený, plný energie a zvedavosti vyplývajúcej z ochoty testovať nové dielo, stlačiť ... Zostavte! Potom opravíme chyby a uvidíme sa budúci týždeň! 🙂

STIAHNUŤ SÚBOR SÚBOROV MQL

Co si myslis?
Mám rád
95%
zaujímavé
8%
heh...
0%
Š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.