Pontosabb adatok használata MetaTrader 4 backtesztek során

Mi az a MetaTrader 4 ?

A MetaTrader 4 a MetaQuotes Software által készített online kereskedőszoftver. Rengeteg online bróker használja platformként hosszú évek óta. A platformnak saját C alapú programozási nyelve van, mely – jómagam korábban PHP-val foglalkoztam – egy kis “előképzettséggel” könnyedén elsajátítható. A platformra megszámlálhatatlan szkript, indikátor, library és expert advisor érhető el. Az utóbbiak segítségével automatizált kereskedő programokat, ún. robotokat lehet használni a demó (vagy akár éles) piacon történő kereskedéshez.

Az eredeti cikk teljes egészében arról szól, hogy hogyan tudunk 4-es MetaTrader terminálunkba ropogós adatokat szerezni külső forrásból. Ebben a posztban félig-meddig lefordítom a cikket, és hozzáteszem a saját gondolataimat, ötleteimet. A fordítás során megpróbálok annyira hű maradni az eredeti leíráshoz, amennyire csak lehet.

Aki még egyáltalán nem (vagy nem ezen a platformon) kereskedett életében tőzsdén vagy devizapiacon, viszont érdekli a kereskedés és az automatizáció, az további érdekes cikkeket fog találni a témában a neten, és remélhetőleg szépen folyamatosan nemrégi indult blogomban is – az alapoktól az expert advisorokig :)

A letöltések a cikk alján, bejelentkezés után tölthetőek le!

Alapprobléma

Az alapprobléma ugye abból ered, hogy egy-egy stratégia tesztelésénél jó lenne minél pontosabb tickekkel dolgozni. Sok esetben még az is előfordul, hogy két ugyanannál a brókernél nyitott demó számla két különböző gépen, különböző terminálban ugyanolyan paraméterekkel más eredményt ad. A History Centerből letöltött adatok jobb esetben is csak az 1 perces gyertyák adatait tartalmazzák, amiből a terminál körülbelül megpróbálja megsaccolni a volume (árváltozások száma a gyertyában) alapján a tickek időpontját. Ez a legtöbb esetben biztos, hogy véletlenszerű. Sok robotnak ez nem okoz túl nagy gondot, de mondjuk egy scalper stratégia tesztelésénél felmerülhet az igény a még pontosabb adatokra.

Honnan szerzünk pontosabb adatokat?

Az eredeti cikk szerzője a Dukascopy nevű brókercég honlapján elérhető adatokból dolgozik. A Dukascopy egy ismert és népszerű brókercég, sokak szerint a piacon elérhető legjobb ECN típusú bróker. Fő hátrányuk (persze nem mindenki számára) abból ered, hogy nincs MT4 platformjuk (vagy csak nagyon trükközve), valamint a minimálisan elhelyezendő deposit magas.

A legtöbb céggel ellentétben a Dukascopy ingyenesen rendelkezésre bocsájtja áradatait. Az áradatok általában 2007-től érhetőek el a nagyobb devizapárokra. Annak ellenére, hogy az adatok ingyenesek, üzleti minőségűek és 99%-os backteszt pontosságot adnak. Fontos megjegyezni azonban, hogy ez a százalék gyakorlatilag csak egy szám az FXT fájlok headerjében – ennek ellenére minőségük és folytonosságuk összehasonlíthatatlan az átlagos brókeri adatokkal. Az adatok órás bontásban érhetőek el – a legfrissebb adatok is óránként elérhetőek. A forrás a közvetlenül a Dukascopy “feed” szervere.

Hogyan lesz a Dukascopy adataiból saját adatom?

A procedúra több lépésből áll, melyhez nem árt egy kevés számítechnikai jártasság. A lépések a következők:

  1. az adatok letöltése a Dukascopy szerveréről. Javallott rá scriptet használni (erről lesz szó ebben a leírásban), de weboldalon keresztül is letölthetőek a fájlok
  2. a Dukascopy .bin kiterjesztésű órás adatfájljaiból CSV fájlok generálása
  3. a CSV fájlok alapján egy MT4 szkript segítségével FXT és HST adatok generálása
  4. A terminál felkészítése az egyéni FXT adatok használatára a backtesztek során

Honnan tudok kész adatokat letölteni a terminálhoz?

A Dukascopy mindenki számára ingyen adja az adatokat, de nem nézi jó szemmel, ha valaki előre konvertált adatokat kínál letöltésre. Ez az oka annak, hogy a cikk eredeti szerzője is levette weboldaláról a torrent formájában elérhető, általa már legenerált adatokat – és éppen emiatt jómagam sem rakok fel előre generált adatokat a blogba.

Eszközök az adatok letöltéséhez

Az adatok letöltéséhez (1) és a CSV generálásához (2) PHP nyelven írt scriptek nyújtanak segítséget. A PHP futtatókörnyezet letöltésével és beállításával kapcsolatban ez a tutorial ugyan nem nyújt segítséget, de a Google használatával ez a probléma könnyen megoldható. A szkriptet jómagam is csak Linux környezetben használtam, azonban a szkriptek valószínűleg minden további nélkül működnek Windows vagy Mac környezetben is. Windows felhasználóknak kiindulópontnak ezt a linket javaslom. Fontos, hogy nincs szükség webszerverre, mert a php parancssori futtatást is lehetővé tesz – nekünk pedig csakis erre van szükségünk.

A PHP -n kívül egy PHP libraryra is szükség lesz, ez pedig a CURL.

Ha megvan a futtatókörnyezet, töltsd le a dukascopy_php_scripts_21.04.2010.zip fájlt és tömörítsd ki. Négy szkriptet találsz benne:

  • egy szkript (download_dukascopy_data.php), ami az adatok letöltését oldja meg a Dukascopy szerveréről
  • egy szkript (process_dukascopy_data.php), ami a Dukascopytól letöltött .bin fájlokból generál CSV fájlt
  • process.bat és process.sh – az előbbi Windows, az utóbbi pedig Linux rendszerekhez. Kvázi egy parancsfájl az adatok generáláshoz.

download_dukascopy_data.php

Kezdjük az első lépéssel, azaz szerezzünk adatokat a Dukascopytól! A download_dukascopy_data.php fájlban csak a $currencies változó tartalmához kell nyúlnunk, máshoz nem. A tömb két, számunkra igen fontos adatot tartalmaz: az instrumentum nevét mint kulcs, és a legkorábbi letöltendő adat dátumát UNIXtimestampben mint érték.

Aki nem ismeri, annak röviden a Unix Timestampről: “A Unix-idő vagy POSIX idő a számítástechnikában a UTC szerinti 1970. január 1. éjfél óta eltelt másodpercek száma, a szökőmásodperceket nem számolva.” (wikipedia)

Mivel a Dukascopy szervere ingyen bocsájtja rendelkezésünkre az adatokat, valószínűleg ők is értékelik, ha nem bombázzuk őket felesleges lekérésekkel. Én azt csináltam, hogy letöltöttem a számomra fontos instrumentumok adatait 2007-től, és innentől kezdve csak a legfrissebb (azaz hiányzó) adatokat kérem le a szervertől. Ezt pedig – akár automatizálva, akár manuálisan – a unix idő megadásával lehet megtenni.

Az eredeti download szkriptet érdemes módosítani, mert abban egy vagonnyi devizapár fel van sorolva. Mivel a letöltés elég hosszú időt vesz igénybe, érdemes a próbát egy darab instrumentummal megtenni. Módosítsuk a download_dukascopy_data.php fájlban a $currencies-t a következőre:

$currencies = array(

“EURUSD” => 1175270475

);

Ez azt adja meg a letöltő szkriptnek, hogy csak az EURUSD árfolyamait töltse le. Na de mikortól? Aki nem született unixbuzerátor vagy webfejlesztő, annak ez a szám nem sokat mond. Csináljunk belőle hát ember számára is olvasható időpontot, pl. ezen vagy ezen a weboldalon keresztül ! Figyeljünk arra, hogy az időzónát helyesen adjuk meg. A Dukascopy adatai GMT időzónában vannak, Magyarország időzónája pedig GMT+2. Ennek ellenére én GMT időzónában használom az adatokat, mivel a legtöbb bróker is ezen időzónában működik.

Tehát ha például csak 2010. január 1-től szeretnénk adatokat letölteni, akkor a unix timestampünk (2010. 01. 01. 00:00:00, GMT-ben): 1262304060. A $currencies tömb kis akciónk után így fest:

$currencies = array(

“EURUSD” => 1262304060

);

Természetesen ha mondjuk szükségünk van ugyanígy több devizapár adataira, akkor kiegészíthetjük a tömböt további adatokkal:

$currencies = array(
"EURUSD" => 1262304060,
"EURJPY" => 1262304060,
);

Nem egy nagy ördöngősség, ugye? Arra nagyon figyeljünk, hogy a tömb elemei közé mindig kerüljön egy vessző. Az nem fogja zavarni a PHP fordítóját, ha az utolsó vessző után nincs következő adat a tömbben.

Indítsuk el a szkriptet parancssorban:

php download_dukascopy_data.php

A letöltés ekkor megindul, tapasztalatom szerint maximum 150kbyte/sec sebességgel. Ha valami hiba történik, azt látni fogjuk a képernyőn megjelenő hibaüzenetekből. Alapbeállításként a szkript abba a könyvtárba ment, ahol saját maga van, devizapáronként külön könyvtárba. Amennyiben letöltődött a 2010-es összes adat (ez devizapáronként lehet akár egy-másfél óra is), legközelebb már csak a legfrissebb adat timestampjétől terheljük újra a szervert. (ez annyit tesz, hogy ha nem 2010. január elseje timestampjét adod meg a tömbben, hanem mondjuk a mai nap 0 órájáét)

Előfordulhat, hogy a szkript a letöltés folyamán hibákba fut bele. Ezt a képernyőn is, de az error.log fájlban elmentve is megtaláljuk. Amennyiben missing data-ra panaszkodik a szkript, az csak annyit tesz, hogy a Dukascopy szerverén nincsen meg az adott órára vonatkozó fájl. Ezen ne idegeskedjünk, mert nagyon ritkán fordul elő (és legtöbbször az épp aktuális óránál, ami logikus). Ha azonban 502-es (Bad Gateway) hibaüzenetet kapott a szkript, akkor azok a fájlok biztosan hiányoznak. Ha a szkriptet újra lefuttatjuk az eredeti timestamppel, akkor csak a hiányzó fájlokat fogja lekérni a szervertől. Az első próbálkozásom folyamán 2007-es adatoktól napjainkig indított letöltés során 26 fájl lekérése során kapott a szkript 502-es hibaüznetet. Ezek a fájlok a második körben, a szkript újrafuttatásánál pótlódtak. Jótanács: nem érdemes idegeskedni, mert minden adat lejön – ha nem is azonnal elsőre.

Ne lepjen meg senkit az sem, hogy a hétvégék, ünnepnapok adatait rengeteg nulla byte méretű fájl mutatja majd a letöltések között. Szóval a sok nullás fájl nem hiba, hanem tudatos koncepció eredménye.

process_dukascopy_data.php

Ez a szkript hivatott a letöltött temérdek .bin kiterjesztésű fájlból CSV fájlokat generálni, amelyeket így majd konvertálhatunk a későbbiekben. A szkript használata – mint fentebb már utaltam rá – történhet kézzel és történhet automatizálva is. Először nézzük meg az egyszerűbb, kézi változatot – az automatizált bat és sh úgyis csak ezen parancsok gyűjteményét tartalmazza majd.

Szintén parancssorból, másoljuk a következő parancsot terminálunkba:

php process_dukascopy_data.php EURUSD 201001 201006 /tmp/EURUSD.csv

Ez a parancs 2010 januárjától 2010 júniusig dolgozza fel az adatokat. Ez azt jelenti, hogy 2010 január elsejének nulla órájától 2010 május 31. napjának utolsó percéig eltelt idő alatt történt árfolyamváltozásokat fogja tartalmazni CSV fájlunk.

A generálás minden gépen eltérő lehet, de a letöltéshez képest mindenképpen gyorsabb lesz.

Amennyiben az előző napon letöltöttük az összes számunkra fontos devizát, a generálást beütemezhetjük a process.bat / .sh segítségével. Legyen sok szabad helyünk, mert az adatok és a CSV fájlok is rengeteg helyet képesek felemészteni. (példa: 2007-től 2010 júliusáig az EURUSD CSV adatai közel 6 gigabájtot foglalnak); az eredeti szerző szerint az összes instrumentum adatai .bin fájlokként 7,5 gigabájtot, CSV formátumban pedig kb. 60 gigabájtot foglalnak.

A CSV fájlok felhasználása – konvertálás

Elérkeztünk a történet feléhez – van már adatunk, de csak CSV-ben. Fontos megjegyeznem, hogy ez a CSV nem olyan adatstruktúrát tartalmaz, amelyet a MetaTrader history centerébe importálni tudnánk, ezt megpróbálni is felesleges. Ezért szükségeltetik még egy utolsó lépés, amely során a terminál saját formátumába konvertáljuk a CSV adatokat egy MetaTrader szkript segítségével.

  1. Másold be a dukascopy_mql_scripts_22.04.2010.zip tartalmát a megcélzott MT4 főkönyvtáradba!
  2. A tick adatokat tartalmazó CSV fájlt (EURUSD.csv) másold be az experts\files\ könyvtárba; innen fogja kiolvasni az MQL szkript az adatokat
  3. Nyiss egy EURUSD chartot (értelemszerűen ha EURJPY adatokat akarsz konvertálni, akkor EURJPY chart kell neked)
  4. Válaszd ki a számodra szükséges idősíkot (ha csak H1-ben akarsz backtesztelni, akkor H1; az összes kívánt idősíkonként el kell végezni a konverziót!)
  5. Kattints kétszer a Navigátorban a Dukascopy2FXT szkriptre (a szkriptek között találod) és állítsd be a paramétereket. Alapesetben nem szükséges átállítani semmit, a paraméterek részletezését lásd lentebb!

Fontos: a HST fájlokat a terminál a chartok böngészése során használja, míg az FXT állományokat a backtesztek során.

A CsvFile paraméterhez nem szükséges semmit írnod, csak abban az esetben, ha nem EURUSD.csv a fájlneved. Ha CreateHst paraméter true, akkor a chart számára használható HST formátum legenerálásra kerül minden idősíkba, tekintet nélkül a megadott tól-ig dátumokra. Amennyiben csak egy új FXT állományt generálsz a jövőben, szükségtelen ezt a paramétert piszkálni.

A Spread paraméter használatával az FXT fájlnak különböző méretű spreadet állíthatsz be. Ha nullán hagyod, akkor a brókered aktuális értéke kerül be az FXT fájlba. (FxOpen és EURUSD esetén pl. 2 pip). Figyelj arra is, hogy több bróker változó spreadet használhat, illetve arra, hogy 4 vagy 5 tizedesjegy pontosságot használ a brókered. Kis trükk a spread változtatására az FXT újragenerálása nélkül: nyisd meg a már legenerált FXT fájlt egy hexeditorban; a spread a 0xFC címen található.

A StartDate és EndDate mezők az FXT fájl maximális mérete miatt szükségesek, ugyanis egy programozási hiba miatt az MT4 terminál 2 gigabájt feletti FXT fájlokkal nem tud mit kezdeni. Éppen ezért egy kezdő és végdátum megadásával trükközhetjük ki ezt a problémát. Javaslom egyébként a maximum 1 éves időtávú FXT fájlok generálását, és külön terminálban való tesztelését. Magyarul 2009, 2010 külön terminálban tesztelhető. A két mező formátuma YYYY.MM.DD kell, hogy legyen – amennyiben nem adsz meg adatot, a legrégebbitől a legújabb adatig minden adatot felhasznál a konverter.

Kattints az OK -ra. Innentől kezdve csak az experts\files\ könyvtárt frissítgetve látsz valami történést, a szkript csak hiba esetén szól, illetve ha befejezte a konvertálást. Minden üzenetet Alert formában jelenít meg.

A szkript lefutása után minden HST és FXT fájlt megtalálhatsz az experts\files\ könyvtárban. A konvertálás jellemzően 5-30 percet vesz igénybe, a processzorsebességtől függően.

Ha Vista  vagy 7 felhasználó vagy, és nem találod a fájlokat ebben a könyvtárban, akkor nagy valószínűséggel a virtualizáció miatt máshol lesznek. Próbáld a c:\ProgramData\ vagy a c:\Users\felhasználónév\AppData\Local\VirtualStore\Program Files\ könyvtárakon belüli keresést! Ha itt sem találod őket, akkor keress rá a gépeden FXT fájlokra. (erről a problémáról részletesen az utolsó előtti bekezdésben olvashatsz)

Még egy jellemző probléma, hogy a MIN_LOT és a LOT_STEP szimbólumadatok hiányoznak a legenerált FXT fájlból. Ez amiatt fordulhat elő, hogy az adott terminál még sosem volt kapcsolódva a brókerhez. Jellemzően “szűz” telepítéseknél probléma ez. Megoldani a legkönnyebb: demó számla regisztrálása (vagy éles használata), kapcsolódás, és csak ezek után konvertálás.

A konvertált fájlok felhasználása

Miután a szkript lefutott, a fent taglalt fájlokat át kell helyezni a megfelelő könyvtárakba. Először lépj ki a terminálból, majd töröld ki az összes fájlt a history\Szervernév\, a history\downloads\ és a \tester\history\ könyvtárból. Esetemben például a history\FXOpen-Demo\ könyvtár teljes tartalmát töröltem. A másolási és törlési procedúrát minden szerver esetében el kell végezni, ha egy terminálból mondjuk éles és demó számlát is használsz (és mind a kettőnél használni akarod a legenerált adatokat).

Ezek után másold be az összes .hst fájlt a history\Szervernév\ könyvtárba, valamint az összes .fxt fájlt a \tester\history könyvtárba. Ezzel az adatok már a megfelelő helyen vannak, már csak a terminál indítását kell egy picit megbolondítani. Hogy miért? Az MT4 terminál egy ideje nem engedi az egyénileg generált fxt fájlok felhasználását. Természetesen ezt egy kis trükkel ki lehet játszani, szükségeltetik hozzá a 226_loader.ziptartalma. (amennyiben 225-ös buildet használsz, akkor pedig 225_loader.zip). Lehetőség van MT4 szkripttel is használni az adatokat, de ezzel kapcsolatban nem tudok tanácsot adni – olvasd el az eredeti leírást. A zip fájl egy-egy úgymond betöltő exe-t tartalmaz, amely átállít egy bizonyos beállítást aztán elindítja a terminal.exe -t. Ha nem így indítod a terminált és backtesztelsz, akkor a terminál mindenáron új FXT fájlokat akar generálni, és a hosszú kínok árán legenerált FXT fájlodat felül fogja írni. Éppen ezért két javaslat:

  • a terminál parancsikonjait töröld ki, és csinálj újakat, melyek a loader.exe-re mutatnak; az ikont és a parancsikon nevét természetesen arra állítod, amire tetszik.
  • konvertálás és generálás után a kapott fájlokat (csv, hst, fxt) azonnal mentsd el egy olyan helyre, ahonnan újra elő tudod venni őket!

A terminál indulása után a Beállítások->Chartokok fülön a “Max oszlop a múltban” és “Max oszlop a chartban” értékét állítsuk minél nagyobbra (max 2147483647), és csukjunk be minden chartot ha esetleg nyitva lett volna. Nyissunk egy új chartot a konvertált instrumentumra, és az Auto Scrollt kikapcsolva menjünk vissza a konvertált adatok első időpontjához. Remélhetőleg más adatokat fogunk látni, mintha csak brókerünk adatait használnák.

A legizgalmasabb rész kétségkívül a Stratégiai teszter résznél vár minket: teszteljünk egy kisebb időszakra, az adott devizapáron egy választott robottal. Az első különbség rögtön feltűnik: nincs kalkuláció, a teszt rögtön indul. A teszt végeztével a “Jelentés” fülön a Modelling quality értékénél 99%-ot kell, hogy lássunk. Fontos ellenőrizni, hogy a tester\history\ könyvtár tartalma változott-e a teszt végeztével. Amennyiben igen, akkor valamit nem jól csináltunk, vagy nem a loaderen keresztül indítottuk el a terminált.

Megjegyzések Windows Vista és Windows 7 használata esetén

A visszajelzések és saját tapasztalatom kapcsán fény derült arra, hogy az említett két operációs rendszer esetében igen komoly idegi problémák törhetnek felszínre bizonyos esetekben. Az ok: a Windows Vista és 7 esetében is létezik egy ún. “Kompatibilitási mód”. A probléma gyökere az, hogy a legtöbb számítógépen 64 bites Vista vagy 7 van telepítve. A MetaTrader terminált viszont mindkét rendszer 32 bites programként kezeli, viszont ily módon több fájlt “elrejt” a felhasználó elől – így például hiába keresünk a logs könyvtárban logfájlokat, azok nem léteznek – vagyis léteznek, csak máshol.
Amennyiben furcsaságokat tapasztalunk, illetve nem vagy nem megfelelően működik a visszatesztelés és nem 99%-os pontosságot jelez ki a terminál, a következő dolgokat szükséges ellenőrizni:
  • a c:\Users (vagy Felhasználók) könyvtáron belül rejtett mappaként található egy AppData könyvtár (amennyiben nem látszik, akkor a Vezérlőpult -> Mappa beállításai -> Rejtett fájlok és mappák megjelenítése hivatkozásra kattintva kikereshető a “Rejtett fájlok és mappák” sor, ezen belül pedig a “Rejtett fájlok, mappák és meghajtók megjelenítése” rádiógomb – a párbeszédpanelt jóváhagyva már láthatóvá válik az AppData könyvtár)
  • az AppData könyvtárban navigáljunk el a Local\VirtualStore\ könyvtárba. Ha itt látunk egy Program Files(x86) vagy ehhez hasonló könyvtárat, akkor ezen belül a megfelelő terminálkönyvtárban eddig nem látott fájlokat érhetünk el. Előfordul, hogy a konvertáló szkript ide, és nem a megszokott c:\Program Files könyvtárba dolgozik. Legyünk alaposak, és vizsgáljuk meg ezen könyvtárakat is!
  • A fenti fájlok előhívhatóak a “Kompatibilis fájlok / Compatibility  files” gombbal is az intézőből – Total Commander használata esetén viszont a fenti módszer az eredményesebb.

Végszó

Habár az eredeti cikk foglalkozik még többek közt más forrásból történő adatszerzéssel, változó spreades adatok használatával is, úgy gondolom hogy legtöbbünknek ez a kiindulópont tökéletesen elég. Ha valakinek mégsem, akkor az angol nyelvű leírás biztosan választ ad kérdéseire.

Örülnék neki, ha visszajelzéseket kapnék arról, hogy mennyire volt érthető ez a kis tutorial, valamint hogy ki milyen tapasztalatot szerzett a fentiek alkalmazása során.

Köszönet és források

Köszönet az eredeti cikkért a szerzőnek, Birtnek. Az összes php és MQL szkript az ő fejlesztése, a zip csomagokban semmilyen módosítást nem eszközöltem.

Letöltések

A letöltések a blogomon lévő poszt végén találhatóak, melyeket regisztráció után tudsz letölteni.

Kiegészítések

2010. 11. 23. A cikk megírása óta új információk derültek ki a teszteléssel kapcsolatban, melyeket ezen a címen olvashattok el.

1 hozzászólás

  1. Köszi!
    Nagyon hasznosnak bizonyult ez a részletes leírás. Mindenkinek ajánlom, hogy próbálja ki, mert tesztelni csak valós adatokkal érdemes!

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét