Ebben a posztban igyekszem egy kis ízelőt adni a MetaTrader 4 kereskedési platform programnyelvébe, mely az MQL4. Mivel a téma nagyon nagy, ezért ennek a bejegyzésnek csupán az a célja, hogy egy kis bepillantást nyerjetek az MQL4 nyelv alapjaiba, az indikátor-szkript-expert advisor készítésbe. Semmiképpen sem célom alapvető programozási tudás átadása, azonban a kommentekben esetlegesen feltett általános kérdésekre – amennyiben tudok – szívesen válaszolok.

Nem célom továbbá az sem, hogy kitérjek az újabb MQL5 programnyelv új képességeire, ezt majd egy másik bejegyzésben teszem meg. Megjegyzem, hogy az ebben a cikkben tárgyalt alapfogalmak egy része MQL5-ben is megállja a helyét, hiszen a két nyelv alapja nagyrészt közös.

Útközben minden észrevételt, véleményt szívesen fogadok – akár a bejegyzések stílusaival, akár a témákkal kapcsolatban.

A bejegyzéseknél alapvető forrásként a MQL4 Docs és MQL4 Book oldalakat használtam, ezért aki hasonlóságot vél felfedezni az eredeti angol szövegek és az általam írtak között, az nem véletlen :) Ha érdekel, olvasd el bejegyzésemet arról, hogy milyen szempontokat érdemes figyelembe venni az MQL4 / MQL5 programozás során, ha pedig úgy döntesz, hogy inkább egy programozót bíznál meg egy feladattal, olvasd el a MetaTrader programozás kapcsán létrehozott útmutatómat.

Mi a MetaTrader programozás?

Azt jelenti, hogy a programozás során egyedi programokat hozunk létre, amelyeket a MetaTrader platform 4-es, vagy 5-ös verziójában használhatunk fel. A két szoftver között jelentős különbségek vannak, bővebben erről a MetaTrader útmutatómban olvashatsz. Egyedi program lehet egy forex kereskedőrobot, vagy indikátor is.

A programozási nyelv az MQL4, vagy az MQL5 lehet, a fejlesztés eszköze pedig a MetaEditor nevű szerkesztőfelület, ez fordítja le a kódot, és teszi az MT terminál számára olvashatóvá EX4/EX5 fájlok formájában.

A platform alapja: a terminál

Ha érdekel az MQL4 programozás, akkor mindenekelőtt érdemes megbarátkoznod a kereskedési szoftver (továbbiakban: terminál) alapvető felépítésével. A terminál az online kereskedés szerves része – kliensként viselkedik, és egy szerverhez kapcsolódik amely a brókeren keresztül az élő piac részesévé tesz bennünket.

Maga a terminál egy olyan információkkal teli környezetet biztosít a futtatható szkripteknek, indikátoroknak, experteknek (továbbiakban: programok) amelyben:

  • egyértelműen behatárolható a kereskedni kívánt instrumentum összes paramétere,
  • lekérdezhetők az instrumentumra és a piacra érvényes korlátozások,
  • lekérdezhetők a stop szintek, nyitható kötésegységek stb.

E környezet alapvető kihasználására egy egyszerű példa a korábban írt cikkemben lévő, instrumentum információit lekérdező szkript.

A terminál felépítésével és működésével kapcsolatban érdemes tisztában lenni, mivel a cikkekben csak feltétlen szükséges esetekben fogok kitérni a használatára.

Program típusok

A terminál három típusú programot képes futtatni, ezek: expert advisorok, indikátorok és szkriptek. Alapvető különbség köztük, hogy mindegyikük más célra szolgál és más feltételekkel futtatható. Nézzük, melyikük mire való!

  • Expert advisorok („robotok”)

    Egyéni – technikai, fundamentális, matematikai vagy akár ezek keveréke alapján kialakított – stratégiák „gépiesített”, programozott változata. Ebből a programtípusból – akárcsak a szkriptekből – képesek vagyunk pozíciókat menedzselni, objektumokat rajzolni.

    Az expertek minden új tick beérkezésekor futnak le újra és újra.

  • Indikátorok

    Piaci szabályosságok és ismétlődések grafikai ábrázolására, azoknak kiemelésére szolgáló program. Nagyon fontos, hogy a másik két programtípussal ellentétben nem lehet belőle pozíciót nyitni, zárni vagy bármilyen pozícióval kapcsolatos tevékenységet végrehajtani.

    Az indikátorok minden új tick beérkezésekor futnak le újra és újra.

  • Szkriptek

    Apró segédprogramok, amelyekkel például számunkra szükséges, de a terminálból hiányzó funkciók pótlásaként értelmezhetőek.

    A szkriptek csak felhasználói indításra, a tickek beérkeztétől függetlenül futnak le, egyszer. Szükség esetén megoldható végtelenítésük is, futtatásuk ebben az esetben leállítási parancsig, vagy a MetaTrader platformból történő kilépésig tart.

Mi a tick?

A tick legegyszerűbb megfogalmazása: piaci árváltozás, amely az interneten keresztül a bróker szerveréről a mi terminálunkhoz is eljut. Mértékét a ticksize határozza meg, forex (devizapiaci) instrumentumok esetén a leggyakrabban 0,00001. Amennyiben az ár valamely irányba elmozdul valamekkora távolsággal, a terminál árszintje megmozdul és ekkor minden éppen aktív, instrumentumra helyezett indikátor és expert advisor lefut.

Ez a futás általában a tized- vagy századmásodpercekig tart. Ha ez az idő egy általunk készített program esetében jóval több (figyelem: 1 másodperc már rengeteg időnek számít!), akkor valószínűleg rosszul van felépítve, vagyis ily módon helytelenül gazdálkodtunk a rendelkezésre álló idővel. Ez akkor válik különösen érzékelhető problémává, amikor például egy beérkező tick miatt automatikusan lefutó program még be sem fejezte futási „körét”, már másik kör kellene hogy induljon, mivel például gyors árváltozás történt. A legrosszabb eshetőség, ha a terminál lelassul, „kifagy” vagy extrém esetben akár össze is omlik – ezeknek a helyzeteknek az eredője szinte kivétel nélkül egy végtelen ciklus.

Képzeljük el „csúcsidőben” (amikor rengeteg kötés van a piacon akár másodpercen belül) az EURUSD ármozgását! 1 perc alatt az ár extrém esetben akár közel 100 alkalommal is változhat, ami számunkra 100 darab beérkező ticket, így ugyanennyi futási kört eredményez. Érdemes tehát tervezni, és nem a véletlenre bízni azt, hogy leendő programunk mennyire működik „könyv szerint”, kevés erőforrást használva.

Az erőforrások megfelelő használata és a teljesítmény optimalizálása azért is fontos, mert a programoknak a terminál adja oda a futás lehetőségét (másként vezérlést), de vissza már csak a program tudja adni a vezérlést a terminálnak. Más szavakkal: ha a programunk rosszul vagy egyáltalán nem adja vissza a vezérlést a terminálnak, hibák történhetnek – a terminál ugyanis nem tudja elvenni a vezérlést a programoktól futás közben.

Megjegyzés: a vezérlés megadása-elvétele ebben az esetben nem a felhasználó, hanem a program általi közbelépést jelenti!

A terminálban elérhető konstansok és változók, azaz a környezet

Elöljáróban pár mondatban összefoglalom, hogy mit jelent a konstans és a változó szó.

  • Konstans: egy olyan adattípus, melynek az értéke mindig állandó, tehát nem változhat meg.
  • Változó: olyan adattípus, amely folyamatosan változhat és akár mi is meg tudjuk változtatni az értékét.

Adattípusok

A változóknak különböző típusai lehetnek. Ilyen adattípusból a következőkkel találkozhatunk az MQL4 nyelvben (nagy részük ismert lehet más programnyelvekből is):

Adattípusok

  • int – egész szám; például: 1, 5, 18956, 983332

    A nyelvben többféle egész típus létezik, méretük alapján sorrendben: char, short, int, long, uchar, ushort, uint, ulong. Attól függően használhatod őket, hogy mekkora számot szeretnél tárolni velük.

  • double – lebegőponttal ábrázolt számok; például: 1.34, 456.23, 9833.3

    A nyelvben többféle törtszám típus létezik, méretük alapján sorrendben: float, double. Attól függően használhatod őket, hogy mekkora pontossággal szeretnéd tárolni őket. A double típus 8, míg a float csupán 4 byte pontossággal tud törtszámokat tárolni.

  • bool – logikai érték; true vagy false

  • string – szöveg;

  • color – szín hexadecimális, decimális, vagy szövegalapon tárolva; például: C’128,128,128′ (szürke), C’0x00,0x00,0xFF’ (kék), green (zöld)

  • datetime – dátum és időpont; például: D’2004.01.01 00:00′, D’2010.12.20 15:34:55′

  • enum – enumerációk, vagyis felsorolások; például:

    enum Napok
      {
      Hetfo,
      Kedd,
      Szerda,
      Csutortok,
      Pentek,
      Szombat,
      Vasarnap
      };

    A felsorolások legördülő listaként jelennek meg a MetaTrader felhasználói felületén.

A programban definiált változók típusa a program későbbi részében nem változtatható meg.

Néha szükséges lehet az adattípusok közti konvertálás, amelyben a nyelv által előre megadott szabályok szerint kell eljárni, például: szeretnénk egy dátumot tartalmazó változót szövegként formázni. Erre hozták létre a konverziós függvényeket, amelyeket külön nem (esetleg útközben) részletezek.

Előre definiált konstansok

Minden programozási környezetben léteznek ún. előre definiált konstansok, amelyek értékeit a környezet definiálja és menet közben nem változtathatóak. Az MQL4 esetében ez közvetlenül kapcsolódik a kereskedési fogalmakhoz, időperiódusokhoz, stb. Részletezni nem fogom őket, de a dokumentáció ide vonatkozó fontosabb részeinek magyar összefoglalóját megpróbálom érthetően megfogalmazni.

Ezen konstansokkal tudunk hivatkozni bizonyos beépített funkciók esetében adatok lekérése során.

Series arrays (Sorozat tömbök)

Folyamatos adatok (például gyertyák visszamenőleges adatai) esetén különböző adatrészek megnevezése.

Konstans Érték Leírás
MODE_OPEN 0 Nyitóár
MODE_LOW 1 Legalacsonyabb ár
MODE_HIGH 2 Legmagasabb ár
MODE_CLOSE 3 Záróár
MODE_VOLUME 4 Volume, az iLowest() és iHighest() függvényeknél.
MODE_TIME 5 A gyertya nyitóára, az ArrayCopySeries() függvényben.

Timeframes (Idősíkok)

Időperiódusok. A chartok paramétereinek lekérdezésénél, indikátorok használatánál fontosak.

Konstans Érték Leírás
PERIOD_M1 1 1 perc
PERIOD_M5 5 5 perc
PERIOD_M15 15 15 perc
PERIOD_M30 30 30 perc
PERIOD_H1 60 1 óra.
PERIOD_H4 240 4 óra
PERIOD_D1 1440 Napi
PERIOD_W1 10080 Heti
PERIOD_MN1 43200 Havi
0 (zero) 0 Az éppen charton használt időperiódus

Trade operations (Tranzakció típusok)

A tranzakciók típusai. Segítségükkel lehet pozíciót nyitni, de használatukkal könnyen azonosítani tudod akár a saját funkcióidban is, hogy milyen típusú ügyleteket kezelsz éppen.

Konstans Érték Leírás
OP_BUY 0 Buy pozíció
OP_SELL 1 Sell pozíció
OP_BUYLIMIT 2 Buy limit függő megbízás
OP_SELLLIMIT 3 Sell limit függő megbízás
OP_BUYSTOP 4 Buy stop függő megbízás
OP_SELLSTOP 5 Sell stop függő megbízás

Price constants (Ár konstansok)

Az alkalmazott ár meghatározása. Indikátorok paraméterezésénél rendkívül fontos paraméter, ezeket a lehetőségeket találod meg a MetaTrader felhasználói felületén is a gyári indikátorok legördülő listájában.

Konstans Érték Leírás
PRICE_CLOSE 0 Záróár
PRICE_OPEN 1 Nyitóár
PRICE_HIGH 2 Legmagasabb ár
PRICE_LOW 3 Legalacsonyabb ár
PRICE_MEDIAN 4 Középár, (legmagasabb+legalacsonyabb)/2.
PRICE_TYPICAL 5 Jellegzetes ár, (legmagasabb+legalacsonyabb+záró)/3.
PRICE_WEIGHTED 6 Súlyozott záróár, (legmagasabb+legalacsonyabb+záró+záró)/4.

MarketInfo (Piac információk)

Piaci környezet adatainak lekérdezése. Nem sorolom fel őket, mivel nagy részük célja kitalálható az előző cikkemben közölt szkript működése alapján.

Drawing styles (Rajzstílusok)

A MetaTraderben ezeket a rajzolási stílusokat használhatod egy indikátorban. Ezek kifejezetten a puffervonalak stílusai, kerülőútként grafikus objektumokat is használhatunk.

Arrow codes (Nyíl kódok)

Az indikátor nyíl típusú rajzolási puffereiben, illetve a nyíl objektumoknál ezeket a nyíl típusokat használhatod.

Wingdings

A Wingdings betűtípus szimbólumai.

Web colors (Webes színek)

A szövegesen hivatkozható színek listája. Használatukkal elkerülhető, hogy az RGB színkódokkal kelljen meghatározni.

Indicator lines (Indikátor vonalak)

Néhány technikai indikátor vonalainak meghatározása.

Moving Average methods (Mozgóátlag módszerek)

A gyári indikátoroknál a simítási módszerének paraméterezése során az alábbi konstansok közül választhatsz. A leggyakrabban a mozgóátlag indikátorhoz használjuk őket.

Konstans Érték Leírás
MODE_SMA 0 Egyszerű mozgóátlag
MODE_EMA 1 Exponenciális mozgóátlag
MODE_SMMA 2 Simított mozgóátlag
MODE_LWMA 3 Lineáris súlyozott mozgóátlag

Object types (Objektum típusok)

Rajzolható objektumok típusai (csak a leggyakrabban használtakat sorolom fel) az ObjectCreate funkcióhoz.

Konstans Érték Leírás
OBJ_VLINE 0 Függőleges vonal. Az első időkoordinátát használja
OBJ_HLINE 1 Vízszintes vonal. Az első árkoordinátát használja.
OBJ_TREND 2 Trendvonal. Két koordinátát használ.
OBJ_TEXT 21 Szöveg. 1 koordinátát használ.
OBJ_ARROW 22 Nyilak. 1 koordinátát használ.
OBJ_LABEL 23 Szövegcímke. 1 koordinátát használ, pixelben megadva.

Object properties (Objektum tulajdonságok)

Objektum paramétereinek lekérdezéséhez (ObjectGet* függvények) és beállításához (ObjectSet* függvények) szükséges.

Object visibility (Objektum láthatóság)

Ezekkel a konstansokkal adható meg, hogy az objektum mely idősíkon (vagy idősíkokon) látszódjon.

Konstans Érték Leírás
OBJ_PERIOD_M1 0x0001 Az objektum csak M1 periódusban jelenik meg.
OBJ_PERIOD_M5 0x0002 Az objektum csak M5 periódusban jelenik meg.
OBJ_PERIOD_M15 0x0004 Az objektum csak M15 periódusban jelenik meg.
OBJ_PERIOD_M30 0x0008 Az objektum csak M30 periódusban jelenik meg.
OBJ_PERIOD_H1 0x0010 Az objektum csak H1 periódusban jelenik meg.
OBJ_PERIOD_H4 0x0020 Az objektum csak H4 periódusban jelenik meg.
OBJ_PERIOD_D1 0x0040 Az objektum csak D1 periódusban jelenik meg.
OBJ_PERIOD_W1 0x0080 Az objektum csak W1 periódusban jelenik meg.
OBJ_PERIOD_MN1 0x0100 Az objektum csak MN periódusban jelenik meg.
OBJ_ALL_PERIODS 0x01FF Az objektum minden idősíkon megjelenik.
OBJ_NO_PERIODS, EMPTY -1 Az objektum minden idősíkon rejtett.

MessageBox (Üzenetablakok és kérdező párbeszédablakok paraméterezéséhez)

Időnként előfordul, hogy szeretnél megjeleníteni egy felugró jóváhagyási, vagy kérdező ablakot. Ez a lehetőség csak valós idejű futtatás esetén áll rendelkezésedre, és ezekkel a konstansokkal tudod befolyásolni, hogyan jelenjen meg a párbeszédpanel, milyen választási lehetőségeket tartalmazzon, milyen ikonja legyen stb.

Uninitialize reason codes (Eltávolítási kód)

A robot, indikátor, vagy szkript futása befejeződésének oka. Az UninitializeReason() függvénynél használható.

Konstans Érték Leírás
REASON_PROGRAM 0 A program az ExpertRemove() függvény hívása miatt fejezte be a futást.
REASON_REMOVE 1 Az expertet eltávolították a chartról.
REASON_RECOMPILE 2 Az expertet újra lett fordítva.
REASON_CHARTCHANGE 3 Az instrumentum vagy a periódus változott a charton.
REASON_CHARTCLOSE 4 A chart bezárult
REASON_PARAMETERS 5 A felhasználó megváltoztatta a paramétereket
REASON_ACCOUNT 6 A terminálbann másik számlára lépett át a felhasználó, vagy megszakadt a kapcsolat és újracsatlakozás történt
REASON_TEMPLATE 7 Új sablon alkalmazva
REASON_INITFAILED 8 Azt jelzi, hogy az OnInit() handler nullától eltérő értéket adott vissza, vagyis hiba történt az inicializálás során
REASON_CLOSE 9 A terminálprogramot bezárták

Special constants (Speciális konstansok)

Olyan univerzális konstansok, amelyekkel egy-egy speciális állapotot, vagy célt írunk le, például NULL, EMPTY, EMPTY_VALUE stb.

Error codes (Hibakódok)

A GetLastError() fügvénnyel lekérdezhető az utolsó művelet hibakódja, amely után a hibakódok, valamint a futásidejű hibakódok listájában lehet keresgélni.

Célszerű ezeket a konstansokat használni az általunk létrehozott programkódban is. Egyedi felhasználói hibakódok létrehozására is van mód.

Előre definiált változók

A konstansokon kívül előre definiált változókat is használhatunk programjainkban. Ezen változók értékei gyakran változnak, de mindig az aktuális (bróker által utoljára ismert és számunkra elküldött) piaci helyzetet jelölik.

  • Ask: Az utolsó ismert eladási ár.

  • Bars: az aktuális chart gyertyáinak száma.

  • Bid: az utolsó ismert vételi ár.

  • Close: tömb, melyben a gyertyák záróára található*

  • Digits: az aktuális instrumentum árának tizedesjegyeinek száma.

  • High: tömb, melyben a gyertyák legmagasabb ára található*

  • Low: tömb, melyben a gyertyák legalacsonyabb ára található*

  • Open: tömb, melyben a gyertyák nyitóára található*

  • Point: egy pont számértéke (pl. 1 pont = 0.00001). Figyelem, ez nem a pip értéke!

  • Time: tömb, melyben a gyertyák nyitási időpontja található*

  • Volume: tömb, melyben a gyertyákban bekövetkezett árváltozások száma található*

A folyamatosság elve a tömbökben

A csillaggal (*) jelölt tömbök esetében egy-egy értéket a megfelelő kulccsal hívhatunk elő. Azt, hogy az aktuális idősíkban hány darab gyertya van, a Bars értékéből tudjuk lekérni. A számsorozat nullától indul, és a nullával jelölt kulcshoz tartozó érték a legutolsó (jobb oldalról az első) gyertyához tartozó érték. Azaz ha a Bars értéke 3980, akkor 3980 értékből válogathatunk és jobbról balra haladva a legfrissebb gyertyához tartozó adott érték kulcsa nulla, a legrégebbi gyertya kulcsa pedig 3979.

A tömbök kulcsainak számsorozata folyamatos, azaz soha nem marad ki egyetlenegy szám sem. A legjobb példa a napi gyertya, ahol is a chart nulladik gyertyája a mai napot szimbolizálja, kulcsa a 0. Ez a gyertya még lezáratlan, azaz mozog – egyes értékei (legmagasabb, legalacsonyabb ár, záróár, volume) változhatnak. Az előtte lévő gyertya az 1-es számú kulcs alatt található, és az előző kereskedési (nem feltétlen naptári!) napot jelenti, és így tovább.

Másik példa: 5 perces felbontásban az utolsó 5 perces gyertya kulcsa 0, az előtte lévő pedig 1. Amennyiben ez a gyertya befejeződik (azaz az 5 perces taktus lezárul), azonnal ő válik az „előző” gyertyává, és megkapja az 1-es kulcsot – a legfrisebb gyertya kulcsa pedig újra 0-át kap.

Ezen értékek természetesen az idősík felbontásától függően folyamatosan balra haladnak, azaz a legfrisebb gyertya kulcsa mindig 0.

Most pedig nézzünk egy konkrét példát egy érték lekérdezésére! Szeretném megtudni az éppen aktuális nap illetve a tegnapi nap záróárát! Most induljunk ki abból, hogy a chart aktuális időfelbontása napi. Nyilván ha más időfelbontásban vagy, akkor állítsd át, vagy az eredményeid az adott idősík gyertyáira fognak vonatkozni!

  • mai nap nyitóára: Open[0]
  • tegnapi nap záróára: Close[1]

Ha szeretnénk az eredményt felfokozott lelkiállapotban látni, akkor indítsuk el a MetaEditor kódszerkesztőt, indítsuk el a „New Expert Advisor” varázslót (első gomb fent az eszköztárban), és válasszuk a Script pontot. Ezután adjunk egy nevet életünk első szkriptjének (mondjuk legyen Teszt), és nyomjuk meg a Kész gombot! Ekkor megszületik egy szinte üres szkript, amibe már bátran belekonktárkodhatunk.

Másoljuk be a start() függvény kapcsos zárójelein belülre a következő kódot!

Print (Open[0]);
Print (Close[1]);

Ezek után mentsünk (CTRL-S), majd bökjünk a Compile gombra, vagy nyomjunk egy F5-öt! Ha az alsó Errors nevű ablakban vastagon szedve azt látjuk, hogy „Compiling ‘Teszt.mq4’… 0 error(s), 0 warning(s).”, akkor a közben futó vagy hirtelenjében elindított terminálunkban a Navigátorban a Szkripteket kibontva megtaláljuk Teszt nevű szkriptünket.

Nyissunk tehát egy új chartot, és klikkeljünk duplán szkriptünkre! Látszólag nem történik semmi, azonban ha megvizsgáljuk a „Terminál” panelt (ahol a nyitott pozíciókat is mutatja a program) és rákattintunk az „Expertek” fülre, csodát fogunk látni.

2010.10.29 16:18:08 Teszt EURUSD,H1: removed

2010.10.29 16:18:08 Teszt EURUSD,H1: uninit reason 0

2010.10.29 16:18:08 Teszt EURUSD,H1: 1.3897

2010.10.29 16:18:08 Teszt EURUSD,H1: 1.3898

2010.10.29 16:18:08 Teszt EURUSD,H1: loaded successfully

A legfrisebb adat a fenti, azaz először sorrendben a „loaded successfully”, azaz „sikeresen betöltve” üzenetet kaptuk meg és csak ezután a többit.

A számunkra fontos két érték pedig az első üzenet után látható. Először a mai nap nyitóára, utána pedig a tegnapi nap záróára látható. Ebben az esetben nem volt nagy a különbség, csak 1 pip.

Ez a példakód több szempontból is fontos az alapok megértésével kapcsolatban, én legalább kettőt mondok.

1) Folyamatosság elve

Komolyabb stratégiák, illetve indikátorok készítéséhez elengedhetetlen hogy átlássátok a fenti tömbök folytonosságát. Ugyanis a kulcs-érték párhuzam a beépített és később általunk megírt indikátorok értékeinek lekérdezésénél is teljesen ugyanígy működik. Amennyiben a szkriptet mondjuk napi nézetben indítjuk el, mi mégis az aktuális óra nyitóárára vagyunk kíváncsiak, akkor sincs nehéz dolgunk – a fenti előre definiált változóknak van egy megfelelő függvénye is. Azok segítségével pedig napi nézetben is le tudjuk kérdezni más időperiódus gyertyáinak, vagy indikátorának értékeit.

A fenti kód egy kicsit megváltoztatva:

 iOpen(Symbol(), PERIOD_M1, 0)

Azaz kíváncsiak vagyunk az aktuális instrumentum [ Symbol() ] egy perces adatai közül [ PERIOD_M1 ] a 0. gyertyájának nyitóárára.

2) RefreshRates() függvény

Nagyon fontos függvény, amit hosszabb – inkább komplexebb – kódoknál mindenképpen érdemes használni. A fent taglalt előre definiált változókat frissíti, mivel elképzelhető hogy a program futása közben azok értéke megváltozik.

A függvény használatával elkerülhető például az, hogy a kód elején megkapott Ask értéken próbálunk nyitni a program futásának közepén, miközben az az érték már a lekérdezés után azonnal (pl. egy századmásodperccel később) megváltozott. Ha ezt a függvényt nem használjuk, előbb-utóbb rejtélyes hibákat fogunk megélni.

Zárszó

A következő poszt is nemsokára érkezik. Addig is bízom benne, hogy a fenti – majdhogynem ömlesztett – információtömeget hasznosnak ítélitek. Várom a kommenteket és véleményeket a poszttal kapcsolatban!

További olvasnivalók

Figyelmedbe ajánlom korábbi bejegyzésemet a pozíciók zárásának folyamatáról, illetve remek forrás a tanuláshoz az MQL4 könyv magyar változata.