MQL prakticky. Panic Button, časť II [kurz programovania]
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 .
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.
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.
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.
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.
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.
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.
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.
Vytvárame hlavnú funkciu
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:
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.
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.
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.
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ň! 🙂