programovanie
Teraz čítaš
MQL prakticky. Ace of Intelligence alebo upozornenia v telefóne [kurz programovania]
0

MQL prakticky. Ace of Intelligence alebo upozornenia v telefóne [kurz programovania]

vytvorené Radek SzafronApríla 12 2019

Vitajte späť pri štvrtej časti nášho praktického kurzu programovania. Dnes sa budeme zaoberať záležitosťami značného významu, budeme tvoriť Eso inteligenciektorý sa v našej neprítomnosti bude zaoberať spravodajskou činnosťou zameranou na zmeny cien na burze. Keď sa veci dajú do poriadku, naše As okamžite nám pošle tajnú (nie naozaj) správu na náš mobilný telefón, čo nám umožní vziať veci do vlastných rúk.


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


Naša aplikácia vám umožní definovať cenové hladiny, pri ktorých dostaneme upozornenie tlačiť na našom telefóne. Úrovne nastavíme potiahnutím myšou za farebné čiary, ktoré sa vykreslia po kliknutí na obrázok nakreslený v grafe. Eso inteligencie. Začnime teda, aké sú tieto upozornenia a ako nakonfigurovať naše zariadenia, aby bolo všetko v poriadku.

oznámenia tlačiť

oznámenia tlačiť sú funkciou platformy Meta Trader, ktorá vám umožňuje odosielať správy z terminálu do zariadenia so systémom iOS alebo Android, ktoré má nainštalovanú mobilnú aplikáciu Meta Trader. Ak aplikáciu ešte nemáte vo svojom mobilnom telefóne, stiahnite si ju, pretože bez nej je naša As nebude sa mu dariť veľmi dobre.

obr_1 obr_2

Nastavenie zariadenia je veľmi rýchle. Prvým krokom je poznať tú svoju Identifikátor MetaQuotes, teda číslo, s ktorým budeme smerovať správy na príslušný telefón (alebo chladničku so systémom android). číslo Identifikátor MetaQuotes v mobilnej aplikácii v menu Nastavenia / Chat a Správypresne ako na obrázku nižšie.

Rys_3 forex programovanie

Prečítajte si číslo Identifikátor MetaQuotes musíte potom zadať v programe MetaTarder na vašom počítači v menu Nástroje / Možnosti / Upozornenia.

Rys_4 forex programovanie

Pripravte sa!

Technické zázemie

Najprv si stiahnite balíček nižšie a nainštalujte zdrojový kód dnešnej aplikácie, t.j Ace of Intelligence.mq4 V katalógu MQL4 \ Experti \ .

Náš program bude mať aj malé grafické rozhranie umiestnené v knižnici grafické_prvky.ex4ktorý skopírujete do adresára MQL4 \ Knižnice \ Ako Wywiadu \ .

STIAHNUŤ SÚBORY

Odlietame

Po otvorení súboru Ace of Intelligence.mq4v hornej časti uvidíte útržok kódu nižšie.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#nehnuteľnosť prísny
# Importovať "Ako Wywiadu \\ elements_graficzne.ex4"
zrušiť Agent začína misie (int x, int y);
zrušiť AgentByeBye ();
reťazec AgentIdentyfikujSie ();
# Importovať
vstupná farba farba = clrDodgerBlue;
vstupná farba Color_off = clrGold;
vstup ENUM_LINE_STYLE štýl = STYLE_SOLID;
vstup int Hrúbka = 2;
reťazec InstrumentName = "";
reťazec Line_ID = "INTERVIEW_LINES";
kód MQL4

Kód začneme importom knižnice a následne pomocou vstupných kľúčových slov vytvoríme parametre pre konfiguráciu v okne nastavení. Nastavenia nám umožnia definovať vzhľad riadkov, pomocou ktorých budeme nastavovať cenu za naše upozornenia.

Globálne premenné

Pod definíciami typov vstup vidíme niečo nové, deklarácie premenných InstrumentName oraz Line_IDktoré sú mimo obsahu akejkoľvek funkcie. Čo to znamená? Takto definujeme globálne premenné, ktoré budú dostupné všade v našom kóde, t.j. každá funkcia algoritmu ich bude vedieť prečítať a priradiť im hodnotu. Z premenných deklarovaných ako vstup jediný rozdiel je v tom, že používateľ k nim nemá prístup v okne nastavení.

Tabuľky

Pri písaní softvéru je veľmi často potrebné narábať s takým množstvom údajov, že vytvorenie samostatnej premennej pre každú z nich by bolo prinajmenšom problematické. Na pomoc prichádzajú polia, ktoré vám umožňujú vytvoriť usporiadanú množinu údajov daného typu, napr. zdvojnásobiť, dostupné pod jedným názvom, ktorý sme založili. Pre každé pole môžeme (nemusíme) definovať jeho veľkosť, teda koľko kusov dát daného typu v ňom bude. Pozrime sa na útržok kódu nižšie.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
reťazec Pole_názov_riadku [];
zdvojnásobiť Line_Data_Array [] [4];
# definovať ACTIVATION_TIME 0
# definovať SIGNAL_TYPE 1
# definovať STATUS_LINE 2
# definovať PRICE_LINE 3
# definovať SIGNAL_LONG 0
# definovať SIGNAL_SHORT 1
# definovať LINE_OFF 0
# definovať MODIFIED_LINE 1
# definovať LINE_ACTIVE 2
# definovať LINE_REMOUNT 3
kód MQL4

Jednorozmerné polia

Vo vyššie uvedenom kóde sme na riadkoch 1 a 2 vytvorili dve polia. Line_name_array použijeme ho na uloženie názvov objektov, ktoré budeme kresliť do grafu. Každý riadok bude predstavovať jednu, užívateľom nastavenú, notifikáciu, a keďže naša aplikácia umožní nastaviť ľubovoľný počet notifikácií, vznikla potreba použiť nástenky.

Line_name_array je jednorozmerné pole, ako je znázornené jedným párom hranatých zátvoriek []. V hranatých zátvorkách môžeme zadať počet kusov údajov, ktoré chceme dať do tabuľky, ale v našom prípade nevieme, koľko riadkov bude na grafe, pretože to závisí od používateľa, takže zátvorku necháme prázdnu , čo znamená, že tabuľu budeme dynamicky určovať a meniť jej veľkosť podľa potreby. Pozrime sa na obrázok nižšie, ktorý popisuje, ako fungujú jednorozmerné polia.

Rys_5 forex programovanie

Forex programovanie - polia

Viacrozmerné polia

Druhé pole s názvom Line_Data_Array použijeme ho na ukladanie ďalších údajov pre každé z upozornení, ktoré definujete. Do rovnakého poľa ako názvy objektov nemôžeme umiestniť ďalšie informácie, pretože názvy sú typu reťazeca dátový typ zdvojnásobiťa jedno pole môže obsahovať iba jeden typ údajov.

Line_Data_Array je pole dvoch rozmerov, ktoré je symbolizované dvoma hranatými zátvorkami [] [4]. Na identifikáciu sa použije prvý rozmer, ako je uvedené v tabuľke Line_name_arrayktorý riadok máme na mysli a druhý rozmer na uloženie 4 ďalších údajov pre každé z upozornení, ktoré nastavíte.

Aby nám uľahčili navigáciu v prvkoch dvojrozmerného poľa pomocou kľúčových slov # definovať vytvorili sme zoznam preddefinovaných hodnôt s názvami, ktoré sa dajú primerane zapamätať. Pod každým z mien uvedených za kľúčovým slovom # definovať existuje číslo, o ktorom sme si istí, že bude konštantné.

Ďalej budeme používať polia v praxi, zatiaľ sa pozrime na grafiku nižšie, ktorá vysvetľuje, ako funguje dvojrozmerné pole.

obr_6

Štruktúra aplikácie

Naša aplikácia bude využívať päť, nám väčšinou známych, MQL API funkcií na spracovanie udalostí.

OnInit () - príprava algoritmu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int OnInit ()
{
if(IsDemo() == nepravdivý) návrat INIT_FAILED;
// Napíšte! ZbadajTeren () je skrátená verzia
// ZbadajTeren () == nepravda
if(! ExamineTrain ()) EraseTraces ();
EventSetMillisecondTimer(250);
Agent začína misie (0, 0);
návrat INIT_SUCCEEDED;
}
kód MQL4

Vo funkcii onInit() začneme tým, že skontrolujeme, či hráme na správnom mieste, a potom, či sú údaje, ktoré aplikácia má, správne. Ako je to možné, od r onInit() je prvá funkcia volaná programom, ktorá má neplatné údaje pre algoritmus? To sa môže stať napríklad vtedy, keď spustíme algoritmus na grafe jedného nástroja a potom zmeníme symbol. V tomto prípade budú musieť byť predtým nakreslené čiary vymazané a všetky upozornenia zrušené. Toto robí funkcia Vymazať stopy ().

V ďalšom kroku začíname časomerač a zavolajte funkciu z knižnice AgentGet StartMissions (...)ktorých úlohou je nakresliť naše Asa na grafe.

V zdrojovom kóde nájdete niekoľko ďalších zaujímavých funkcií. Pre tých z vás, ktorí by chceli röntgenovať naše Asa od A po Z výklad doplnkových materiálov by mal byť dobrým tréningom orientácie v jazykovej dokumentácii MQL. Celý kód dnešnej aplikácie som sa snažil ponechať v rámci diskutovanej problematiky, aby jej interpretácia bola čo najjednoduchšia. Prajem vám úspešné učenie a keďže už ovládate mnohé prvky jazyka, bavte sa pri vytváraní vašich prvých samostatných riešení!

OnChartEvent (...) - sledovanie udalostí

1
2
3
4
5
6
7
8
9
10
11
12
zrušiť OnChartEvent(const int id, konštantne dlhé & lparam, const double & dparam,
const string & spam)
{
if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE)
{
if(StringFind(sparam, Line_ID)> = 0) UpdateData (sparam);
}
ináč Ak(id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == AgentIdentyfikujSie ()) CreateLines ();
}
}
kód MQL4

Vďaka funkcii OnChartEvent(...) sledujeme interakciu používateľa s aplikáciou. V prvom, ak skontrolujeme, či používateľ pretiahol riadok našej notifikácie na graf (alebo zmenil jej parametre v okne nastavení) a ak áno, aktualizujeme údaje o našich notifikáciách vo funkcii Aktualizovať údaje (...)ktorý berie ako parameter názov užívateľom upravenej linky. Pomocou prijatého názvu riadku funkcia vyhľadá príslušný riadok v tabuľkách a aktualizuje príslušné údaje, napr. informácie o cene dohodnutej na oznámenie.

V druhej časti funkcie sledujeme udalosti klikania na objekty na grafe nášho algoritmu. Každé kliknutie na nami nakreslenú postavu Eso inteligencie vytvorí novú čiaru v grafe. Vytvorené čiary po presunutí spustia funkciu Aktualizovať údaje (...)ktorý naplánuje konkrétne upozornenie v závislosti od polohy linky vzhľadom na cenu v čase interakcie s používateľom.


odborní poradcovia


OnTimer () - opakujúce sa aktivity

1
2
3
4
zrušiť Časovač zapnutia ()
{
SynchronizeData ();
}
kód MQL4

Časovač, ktorý sa volá 4-krát za sekundu, ako je definované vo funkcii onInit(), synchronizuje údaje v rámci nášho algoritmu. K úlohe funkcie SyncData () vrátane kontroly, ktoré riadky už boli odstránené, a pridelenia im vhodnej farby v závislosti od toho, či je dané upozornenie povolené alebo nie.

OnTick () - pozorovanie cien

Všetky doteraz spomenuté funkcie MQL API nám boli známe. Čas na niečo nové. Funkcia onTick() volá ho platforma vždy, keď sa zmení cena nástroja, na ktorom algoritmus funguje. Toto je základná vlastnosť mnohých automatizovaných stratégií. Pozrime sa na kód nižšie.

1
2
3
4
zrušiť OnTick ()
{
Mierový rozhovor ();
}
kód MQL4

Vo funkcii onTick() náš As začne pracovať a skontroluje, či cena nástroja dosiahla hodnotu uvedenú používateľom. Prejdeme k funkciám rozhovor () trochu ďalej a teraz analyzujme ešte jednu, poslednú funkciu, ktorú potrebujeme na spracovanie udalostí, onDeinit(...).

OnDeinit (...) - ukončenie algoritmu

1
2
3
4
5
6
7
8
9
zrušiť onDeinit(const int dôvod)
{
eventKillTimer();
AgentByeBye ();
if(dôvod! = REASON_CHARTCHANGE && dôvod! = REASON_PARAMETERS)
EraseTraces ();
}
kód MQL4

Na začiatok sa zastavíme časomerač a vymažte nakreslený obrázok nášho agenta a potom pomocou operátora if skontrolujeme, aký je dôvod ukončenia aplikácie. V niektorých prípadoch po volaní funkcie onDeinit(...) program sa znova zapne a spustí svoj algoritmus od začiatku, teda od funkcie onInit(). Stáva sa to napríklad vtedy, keď používateľ zmení interval grafu. V takejto situácii, ak sa nástroj nezmenil, nechceme vymazať nami nastavené upozornenia. Skontrolovaním dôvodu volania funkcie onDeinit(...), čo je parameter dôvod, môžeme sa rozhodnúť, či vymažeme objekty a dáta alebo ponecháme nastavené upozornenia nezmenené.

Polia v praxi

Pozrime sa, ako naša aplikácia využíva predtým vytvorené polia na príklade funkcií Uložiť dáta (...)ktorého úlohou je vytvoriť nový riadok pre údaje v poliach pre novú notifikáciu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool Uložiť dáta (reťazec názov_riadku, zdvojnásobiť price_line)
{
int počet riadkov = Veľkosť poľa(názov_riadku_pole);
ArrayResize(Pole názov_riadku, číselné_riadky + 1);
ArrayResize(Line_Data_Array, číselné_riadky + 1);
// Zápis číselných_riadkov ++ je skrátenou verziou číselných_riadkov = číselných_riadkov + 1
počet riadkov ++;
Line_name_array [číslo_riadkov - 1] = názov_riadku;
Line_Data_array [počet_ riadkov - 1] [ACTIVATION_TIME] = 0;
Line_Data_array [počet_ riadkov - 1] [SIGNAL_TYPE] = SIGNAL_LONG;
Line_Data_array [počet_ riadkov - 1] [LINE_STATUS] = LINE_OFF;
Line_Data_array [počet_ riadkov - 1] [PRICE_LINE] = price_line;
návrat pravdivý;
}
kód MQL4

V riadku 3 skontrolujeme, koľko prvkov obsahuje Line_name_arraya preto Line_name_array je jednorozmerné pole, počet jeho prvkov by sa mal zhodovať s počtom riadkov v oboch poliach. Potom v riadkoch 5 a 6 zväčšíme počet riadkov našich tabuliek o 1 pomocou funkcie API ArrayResize(...). Na koniec každého poľa sa pridá nový riadok.

Zvyšujeme premennú počet riadkov o 1, pretože sme do tabuliek pridali jeden riadok a následne doplníme údaje o novom upozornení počnúc riadkom 11, kde k príslušnému riadku v tabuľke priradíme názov riadku. Line_name_array. Pamätajte, že riadky (a stĺpce) v tabuľkách sú číslované od nuly, takže ak chceme napríklad napísať informáciu pre piate oznámenie, musíme použiť riadok 4, teda v hranatých zátvorkách za názvom tabuľky pozri počet riadkov - 1 ako číslo riadku.

Na číslovanie stĺpcov v poli Line_name_array používame preddefinované hodnoty na začiatku nášho algoritmu pomocou kľúčových slov # definovať. Pod názvami hodnôt sú čísla od 0 do 3, pretože pole má 4 stĺpce. Vďaka použitiu dvojrozmerného poľa môžeme ku každej notifikácii uložiť 4 dodatočné informácie, napr. cena a typ signálu, v ktorom fungujú Uložiť dáta (...) uvádzame počiatočné hodnoty.

Eso v akcii

Ďalšou funkciou, ktorá v našom algoritme používa polia, je funkcia rozhovor ()kde čítame dáta pripravené v poliach a interpretujeme ich, aby sme sa rozhodli, či sa má používateľovi poslať správa. Pozrime sa na kód funkcie rozhovor ().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
zrušiť rozhovor ()
{
int a = 0;
int počet riadkov = Veľkosť poľa(názov_riadku_pole);
pre(a = 0; a <počet riadkov; ja ++)
{
if(Line_Data_array [i] [LINE_STATUS] == ACTIVE_LINE)
{
if(Line_Data_array [i] [SIGNAL_TYPE] == SIGNAL_LONG)
{
if(Ponuka > = Line_Data_Array [i] [PRICE_LINE])
{
SendMessage (s);
Line_Data_array [i] [LINE_STATUS] = LINE_OFF;
}
}
inak
{
if(Ponuka <= Line_Data_Array [i] [PRICE_LINE])
{
SendMessage (s);
Line_Data_array [i] [LINE_STATUS] = LINE_OFF;
}
}
}
}
}

Vo vyššie uvedenej funkcii pomocou slučky pre pristupujeme ku každému riadku v poli Line_Data_Array. To nám umožňuje skontrolovať stav upozornenia a typ signálu a na základe prijatých údajov overiť, či cena Ponuka spĺňa nami očakávanú podmienku. Keď náš As sa rozhodne, že by bolo nerozumné držať nás v tme, urýchlene nám poslať upozornenie pomocou tejto funkcie Poslať správu(…)ktorý šikovne udáva číslo riadku, kde je uložená informácia o potrebnej notifikácii. Po odoslaní správy sa notifikácia vypne a As, vytrvalý, pokračuje ďalej.

Pozrite sa na kód funkcie vo svojom počítači Poslať správu(…)aby ste videli, ako náš algoritmus používa funkciu MQL API SendNotification(…) Pri odosielaní upozornení tlačiť.

Sčítanie

Ak to platforma ešte neurobila za vás, skompilujte súbor Ace of Intelligence.mq4 a otestujte svoju novú aplikáciu! Ak chcete nakresliť novú čiaru, stačí kliknúť na pekný obrázok v grafe.

V zdrojovom kóde nájdete niekoľko ďalších zaujímavých funkcií. Pre tých z vás, ktorí by chceli röntgenovať naše Asa od A po Z výklad doplnkových materiálov by mal byť dobrým tréningom orientácie v jazykovej dokumentácii MQL. Celý kód dnešnej aplikácie som sa snažil ponechať v rámci diskutovanej problematiky, aby jej interpretácia bola čo najjednoduchšia. Prajem vám úspešné učenie a keďže už ovládate mnohé prvky jazyka, bavte sa pri vytváraní vašich prvých samostatných riešení!

Co si myslis?
Mám rád
33%
zaujímavé
67%
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.