programování
Teď čteš
MQL Prakticky. Panic Button, část II [Programovací kurz]
0

MQL Prakticky. Panic Button, část II [Programovací kurz]

vytvořil Radek SzafronMarch 29 2019

Vítejte ve druhé části Panic Button! Tento týden se podíváme znovu na kód našeho panického tlačítka. Naším dnešním úkolem je doplnit to, co je nejdůležitější, to znamená funkci osvobodit nás od váhy otevřených pozic a osvobodit nás od omezení neustálého pohledu na monitor.

Základní funkcionalitu budeme rozvíjet s něčím jiným. Zajistíme, že nástroj, který navrhujeme, je bezpečný a náhodné kliknutí bude neotřesitelný a stoicky klidný. Jako každý vážný knoflík na naší planetě a naše bude mít jistý druh pojistky, která vám umožní zavřít polohu pouze v případě, že kliknutí je doprovázeno stiskem klávesy [Shift] na klávesnici.


Přečtěte si: MQL Prakticky. Panic Button, část I


Otvíráme továrnu na algoritmy

Zapneme tedy MetaEditor.

Pojďme si upravit kód naší aplikace z minulého týdne. Otevřete soubor Panic Button.mq4 z katalogu Odborníci a podívejme se na tuto funkci Oninit (), Vaše funkce by měla vypadat téměř identicky s funkcí umístěnou níže s malým rozdílem. Dnes se objevil nový prvek kódu // komentář .

int Oninit ()
{
if(IsDemo () == nepravdivý)
{
 
zpáteční INIT_FAILED;
 
}
bool modrá = nepravdivý;
if(Tylko_ten_instrument == pravdivý)
{
 
modrá = pravdivý;
 
}
Przycisku_utworz_sie (5, 15, modrá);
// <- [Takto komentujeme] EventSetMillisecondTimer(250); // Konec novosti
zpáteční INIT_SUCCEEDED;
}
Kód MQL4

Do funkce přidejte chybějící kód Oninit ().

Začneme hodiny

K výše uvedenému kódu byla přidána funkce MQL API bool EventSetMillisecondTimer(int ms)umožňuje konfigurovat časovač. Časovač je metoda, která umožňuje volat jinou funkci API - OnTimer () každý specifický počet milisekund. Toto řešení nám umožňuje pravidelně spouštět určité části kódu jejich umístěním do funkce OnTimer (), V našem případě, 4 krát za sekundu, nebo co 250 milisekund.

Hodiny tikají, takže si píšeme novou funkci.

zrušit OnTimer()
{
 
Przycisku_badz_czujny ();
 
}
Kód MQL4

Dobrá práce. Právě jste vytvořili algoritmus zodpovědný za zabezpečení našeho tlačítka proti náhodným kliknutím. Byla to tato obtížná část. Chcete-li kliknout na tlačítko, musíte nyní stisknout klávesu [Shift] na klávesnici. Spiny na elektronech jsou odšroubovány ve funkci Przycisku_badz_czujny ()které jsme importovali z knihovny Biblioteka_panic_button.ex4 minulý týden.

Platforma vyžaduje, aby byl časovač vypnut, když ho nepotřebujeme. Můžeme to udělat přidáním funkce API EventKillTimer () fungovat OnDeinit ()které jsme vytvořili v předcházející části a které jako připomínku bude platforma vyzvána při zavírání naší aplikace. Upravme funkci OnDeinit ()aby to vypadalo jako funkce níže.

zrušit OnDeinit(const int důvodem)
{
 
Przycisku_bye_bye ();
 
EventKillTimer ();
}
Kód MQL4

Aplikaci můžete spustit zde a zjistit, jak algoritmus reaguje stisknutím klávesy [Shift].

Sledujeme každý pohyb

Přišel čas začít přemýšlet o funkci uzavření pozice. K tomu musíme rozpoznat okamžik, kdy je tlačítko stisknuto. Funkce API nám pomáhá zrušit OnChartEvent(const int id const long & lParam const double & dparam, const řetězec & SPAR).

funkce OnChartEvent (...) je volána platformou, když nastane událost na grafu, která může být relevantní pro provoz programu, například uživatel klikne na objekt nebo přesune myš. Pojďme napsat odpovídající funkci.

zrušit OnChartEvent(const int id const long & lParam const double & dparam, const řetězec & SPAR)
{
 
}
Kód MQL4

Platforma, volání funkce OnChartEvent (...) poskytuje k němu další informace pomocí parametrů id, lParam, dparamoraz živec, To nám umožňuje určit, co se stalo a typ události je uložen v proměnné idcož je typ intje to celé číslo. slovo const když typ proměnné znamená, že daná proměnná nemůže být změněna a používá se pouze ke čtení informací.

Rozšiřme svou funkci o další prvek.

zrušit OnChartEvent(const int id const long & lParam const double & dparam, const řetězec & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
}
 
}
Kód MQL4

Použití obsluhy if výše kontrolujeme, zda proměnná id je rovno == hodnota definovaná v proměnné generované automaticky jménem CHARTEVENT_OBJECT_CLICK, Pokud ano, jsme si jisti, že uživatel klikl na nespecifikovaný objekt v grafu, na kterém náš algoritmus pracuje.

Už to víme, když operátor podmíněný výraz if bude logicky pravdivé, že kód mezi závorkami bude proveden {} tohoto operátora. Přidejte k našemu kódu, co by se mělo stát, když graf klikne na libovolný objekt.

zrušit OnChartEvent(const int id const long & lParam const double & dparam, const řetězec & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == pravdivý)
{
 
}
 
}
 
}
Kód MQL4

Výše uvedený kód kontroluje, zda bylo na tlačítko kliknuto pomocí funkce bool Przycisku_czy_jestes_klikniety (šňůra object_name)pochází z importované knihovny. Funkce jako parametr předpokládá proměnnou s datovým typem šňůra, což je textová proměnná, která by měla obsahovat název objektu, na který uživatel kliknul. Funkce porovnává přijatou hodnotu s názvem grafického prvku tlačítka a odpověď na otázku, zda bylo tlačítko stisknuto, odpoví hodnotou typu boolnebo hodnotu pravdivý lub nepravdivý.

Jak známe název objektu, na který jste klikli? funkce OnChartEvent (...) přijímá z platformy název posledního objektu, na který byl parametr kliknut šňůra pojmenovaný živecže můžeme přímo předat jako parametr naší funkce, ach ano Przycisku_czy_jestes_klikniety (SPAR).

Provádíme svěřený úkol [Konkrety]

FunkceButton_or_jestes_klikniety (...) vrátí hodnotu pravdivý budeme vědět, že neexistují žádné vtipy, musíte situaci zachránit.

Přidejme k našemu kódu funkci, která splní hlavní úkol našeho algoritmu, to znamená zavřít pozici na účtu. Funkce má následující prohlášení:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument),

V praxi jej vkládáme do kódu jako v rámečku níže.

zrušit OnChartEvent(const int id const long & lParam const double & dparam, const řetězec & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == pravdivý)
{
 
Zamknij_pozycje_i_zlecenia (Tylko_ten_instrument);
 
}
 
}
 
}
Kód MQL4

funkce Zavřít_pozice_a_ objednávky (...) bere argument typu jako argument boolkteré by měly nést informace, \ t pravdivý lub nepravdivýměli bychom zavřít pozice pouze nástroje, na kterém algoritmus pracuje. Parametr si pamatujete Tylko_ten_instrument z podokna nastavení v první části? Právě jsme šli vhod. V závislosti na naší volbě v nastavení program uzavře položky, které jsou kompatibilní s vybraným grafem nebo se všemi položkami v účtu.


odborní poradci


Vytváříme hlavní funkci

Začneme editovat soubor "Useful_functions.mqh" z adresáře MQL4 Zahrnout tlačítko Panic

Doposud jsme používali pouze funkce, které pocházejí z MQL API nebo jsou importovány z knihovny Biblioteka_panic_button.ex4, V reálném světě však programování vyžaduje, abychom sami vytvořili většinu funkcí a zároveň podporovali celé spektrum hotových řešení. funkce Zavřít_pozice_a_ objednávky (...) , ze kterého používáme výše uvedené, najdete v souboru Przydatne_funkcje.mqh, které v předchozí části jsme umístili do katalogu MQL4 \ Include \ Panic Button \ a připojili jsme se ke kódu pomocí klíčového slova #include, Otevřete soubor v MetaEditoru, protože funkce, která tyto položky zavře, je již v souboru obsažena, ale my ji stále potřebujeme dát.

Definice funkce

Po otevření souboru Przydatne_funkcje.mqh uvidíte, že je v něm definice funkce zavírání pozice. Vypadá to jako funkce, které jsme dosud používali s tím rozdílem, že je to naše vlastní, a můžeme jí dát jaký druh duše bude název, typ a sada parametrů chtít. Vaše funkce by měla vypadat víceméně jako funkce níže:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
zpáteční pravdivý;
}
Kód MQL4

Tak, v hlavička definovali jsme pojmenovanou funkci Zamknij_pozycje_i_zlecenia vrácení datového typu bool a převzetí jednoho pojmenovaného parametru tylko_ten_instrument také o typu dat bool.

Obsah funkce

Všechno, co umístíme mezi rovnátka {} za hlavičkou funkce se skládá z jejího obsahu. Pojďme tedy obohatit náš obsah prvním kódem.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isconnected() == nepravdivý) zpáteční nepravdivý;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) zpáteční pravdivý;
bool výsledek = pravdivý;
zpáteční následek;
}
Kód MQL4

Nejdříve if, zkontrolujeme, zda jsme připojeni k serveru pomocí funkce API isconnected() a v případě problémů opouštíme funkci s pomocí operátora zpáteční při vrácení hodnoty nepravdivýabyste věděli, že něco není v pořádku. To je hned po if neexistují žádné složené závorky, protože používáme zkrácený záznam možný v situacích, kdy po podmíněném výrazu chceme provést pouze jednu operaci.

Když jsme online, algoritmus jde dále a vytváří dvě proměnné int o jménech i oraz liczba_pozycji_i_zlecen přiřazením první hodnoty 0a druhá hodnota z funkce API OrdersTotal(), který vás informuje o počtu otevřených pozic a objednávek ve vašem účtu.

Další operátor if kontroluje, zda někdy nejsou všechny položky již uzavřeny, a uživatel klikne na tlačítko pouze pro zábavu nebo náklonnost, což má za následek opuštění funkce s převodem hodnoty pravdivýprotože všechno je v pořádku.

Když funkce má stále něco, co dělá, vytvoří proměnnou bool pojmenovaný výsledek, který bude později sloužit k poskytnutí informací o tom, zda byly všechny položky řádně uzavřeny koncovým operátorem zpátečníkteré jsme v tomto kroku mírně upravili.

Pro smyčku

Operátor for, který v jeho popularitě pravděpodobně vydá cestu pouze operátorovi if, se používá k provedení určité sady operací specifikovaný počet opakování. Ideálně se hodí pro takové situace, jako je ta naše, protože pro každou zakázku musíme provést operaci uzavření zvlášť. Přidejme smyčku do naší funkce for.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isconnected() == nepravdivý) zpáteční nepravdivý;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) zpáteční pravdivý;
bool výsledek = pravdivý;
for(i = number_of_items_i_ objednávek - 1; i> = 0; Já--)
{
 
}
zpáteční následek;
}
Kód MQL4

W hlavičkaza operátorem for vidíme tajemný záznam: (i = number_of_items_i_ objednávek - 1; i> = 0; Já--) .

Záznam znamená, že smyčka začíná proměnnou, kterou jsme vytvořili dříve i rovna proměnné liczba_pozycji_i_zlecen mínus jedna a bude opakovat operaci mezi závorkami {} jako proměnná i je větší nebo rovna nule [i> = 0] a po skončení každého cyklu se proměnná sníží i po jednom [Já--] tak, aby smyčka mohla někdy skončit. Jednoduché, nekomplikované a pohodlné čtení.

Mluvení v jazyce lidí, smyčka for provede operaci v závorkách {} tolikrát, kolikrát máme otevřené pozice.

Přidejme obsah do naší smyčky.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isconnected() == nepravdivý) zpáteční nepravdivý;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) zpáteční pravdivý;
bool výsledek = pravdivý;
for(i = number_of_items_i_ objednávek - 1; i> = 0; Já--)
{
if(OrderSelect(A, SELECT_BY_POS) == nepravdivý)
{
výsledek = nepravdivý; pokračovat;
}
if(only_ten_instrument == pravdivý && OrderSymbol()! = Symbol()) pokračovat;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0) == nepravdivý)
{
výsledek = nepravdivý; pokračovat;
}
}
jinak pokud(OrderDelete(OrderTicket()) == nepravdivý) výsledek = nepravdivý;
}
zpáteční následek;
}
Kód MQL4

Raketová fyzika

Pojďme analyzovat krok za krokem, co se děje uvnitř naší smyčky forkteré jsme statečně psali v předchozí fázi.

V prvním kroku pomocí funkce API OrderSelect(...) objednávku vybereme z terminálu pomocí čísla pozice v seznamu objednávek (první pořadí v seznamu má číslo nula). Pro tento účel máme proměnnou ikterý mění hodnotu s každou smyčkou. V případě poruchy zapíšeme chybu do proměnné výsledek a informujte smyčku for pomocí operátora pokračovatže by se měla zastavit a začít nový cyklus s proměnnou i minus jedna [Já--].

Když všechno půjde dobře, jiný operátor if použije, novinka, logická operace “a" &&vrátí hodnotu pravdivý pouze pokud oba výrazy na každé ze svých stránek vrátí hodnotu pravdivý, Když tedy nástroj zvolené objednávky [OrderSymbol()] neodpovídá [!=] nástroj grafu [Symbol()] a proměnné tylko_ten_instrument má hodnotu pravdivý, ignorujeme danou objednávku a používáme operátor pokračovat jdeme do dalšího cyklu smyčky for, Ve všech ostatních případech algoritmus jde níže.

Pak náš program zkontroluje, v jakém pořadí máme to potěšení, a to pomocí funkce API OrderType() a logická operace"nebo" ||vrátí hodnotu pravdivýkdyž alespoň jeden z výrazů na každé ze stránek vrátí hodnotu pravdivý, Jinak při logickém vyjádření operátora if jako celek vrátí hodnotu nepravdivý obsluha bude provedena jinak pokud, který pracuje s první pokud a slouží mu jako plán B, když nemůže souhlasit s vlastním logickým vyjádřením.

V závislosti na typu objednávky jako první if při jednání s trhem koupit objednávku [OP_BUY] nebo prodat na trhu [OP_SELL] zavře pozici pomocí funkce API OrderClose(...)a druhou if, vlastně jinak pokud zruší nevyřízené příkazy pomocí funkce OrderDelete(...).

Poklonu se, program je připraven!

Uložíme změny do souboru Przydatne_funkcje.mqh, vrátíme se k hlavnímu aplikačnímu kódu Panic Button.mq4 a nadšení, plní energie a zvědavosti plynoucí z touhy otestovat nové dílo, tisknout ... sestavit! Pak opravíme chyby a uvidíme se příští týden! 🙂

DOWNLOAD SET SOUBORŮ MQL

Co si o tom myslíš?
95%
zajímavý
8%
Heh ...
0%
Šok!
0%
Nemám rád
0%
zranění
0%
O autorovi
Radek Szafron
Autorem publikace je Radek Szafron, majitel společnosti Expert Advisors, která již řadu let podporuje investory poskytováním technologií určených pro trh FOREX. Autor je absolventem Vysoké školy ekonomické ve Varšavě se specializací "Finanční trhy" a programátor s téměř letními zkušenostmi z 20. Společnost implementuje návrhy algoritmů a aplikací napsaných ve všech jazycích z rodiny "C", včetně oblíbených platforem Meta Trader 4 a 5. Expertní poradci naleznete na www.expertadvisors.pl.
Komentáře

Nechte odpověď