Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Market is closed!
-
SzerzőBejegyzés
-
Sziasztok. Olyan kérdésben szeretnék segítséget kérni, hogy a használt robotom bizonyos esetekben akkor is kereskedni akar mikor a piac zárva van. Pontosabban olyan eset történt, hogy a brókercégnél ahol vagyok szerver idő szerint 00:00 és 00:05 között a piac bezár hétköznap. Azonban a robotom valamiért ekkor is kötni akar és küldi a megbízásokat, de hibaüzenetbe jön vissza hogy a: market is closed…
Hogy tudnám beállítani hogy érzékelje mikor van nyitva a piac és mikor van zárva, és csak akkor akarjon bármit is csinálni mikor nyitva van.
Köszönöm a segítséget előre is!
Németh AttilaHa mozog a piac, a robot is fut. Effektíve a piac mozog, és csak a brókered nem hagy kötni, nem a piac van zárva. A végeredmény ugyanaz.
Ezzel kapcsolatban lekérdezés-szerű megoldás nincsen, ha a piac zárva van, akkor ne próbálj tovább kötni. Ha periodikusan lép be a robotod (pl. gyertyánként egyszer), akkor ez bőven elegendő megoldás. Ha viszont pl. távolságalapú belépéseid vannak (azaz állandó ellenőrzés van és bármikor születhet kötés, akár gyertya közepén is), akkor neked kell kitalálnod valami workaroundot, pl. „market is closed” hibaüzenet esetén csak x percen múlva próbálkozol újra.
A logika szerint bizonyos feltételek teljesülése esetén új gyertya nyitásakor nyit poziciót. Abban tudnál segíteni, vagy iránymutatást adni, hogy milyen feltétel hozzáadásával küszöbölhetném ki ezt a problémát? keresgélek de nem találok rá választ.
A pozíciónyitási kísérlet után (ha többször próbálkozol, akkor a próbálkozások között is nyilván) lefuttatod a GetLastError() függvényt. Ha ez nullát ad vissza, akkor sikerült pozíciót nyitnod. Ha nem nullát ad vissza, hanem pl. ERR_MARKET_CLOSED értéket (132) vagy ehhez hasonló súlyos hibát, akkor szakítsd meg a pozíciónyitási rutint és állj le a próbálkozással. Ha ugyebár gyertyánként próbálkozol, akkor a legközelebbiben majd újra megpróbálod.
Bocsánat az amatőr kérdésekért:) én is a GetLastError() függvény alkalmazásán gondolkodok, csak nem vagyok benne biztos hogy jól alkalmazom. Ha belerakom simán csak a script elejére mint pl a free margin vizsgálatát, hogy vizsgálja a GetLastError értékeket, akkor is folyamatosan fogja figyelni a fent említett market close hiba értéket, vagy azt csak akkor figyeli ha már megpróbál pozíciót nyitni? Ha ez így van ebben az esetben akár be lehetne úgy rakni nyitási feltételnek, mint akár egy indikátort vagy mondjuk spread figyelést? Pl nyisson pozíciót ha ilyen-olyan indikátor a meghatározott értéken van, a spread értéke a meghatározott érték alatt van és GetLastError értéke egyenlő nullával. Ez így működhet?
A szkript elejére csak akkor rakd bele a margin vizsgálatot, ha ez mindenképpen szükséges a többi vizsgálat előtt. Lehet éppen logikus, de nem feltétlen; ha csak gyertyánként vizsgálod a beszálló lehetőségét (pl. indikátorok lezárt értékeit hasonlítva), akkor tökéletesen felesleges minden tickben szabad margint ellenőrizni.
Én összességében legtöbbször mindig csak akkor végzek szabad margin ellenőrzést, ha közvetlen a pozíciónyitás előtt állok, hiszen addig ameddig kérdéses hogy kötünk-e, felesleges az ellenőrzés – pláne minden tickben.
Arra figyelj, hogy a GetLastError() függvény meghívásakor a hibakód nullázódik, így a GetLastError() -t követő kódrésznél már új hibakód kerülhet mentésre (bármivel kapcsolatban). Érdemes tehát a függvény visszatérési értékét egy változóba menteni és azt kiértékelni, megelőzendő saját magunk szívatását :)
Őszintén szólva nemvágom hogy lehetne a visszatérési értéket külön változóba menten, meg nem is igazán értem ezt a részét a javaslatodnak:) én az alábbi megoldással probálkoztam, csak nemtudom hogy jó e, nyitási feltétlnek be írtam hogy if(… az adott indikátorok nyitási feltétele… && GetLastError() == 0 && … egyéb nyitási feltétel) és ha ez teljesül akkor nyitja meg a poziciót. Én azt feltételezem a jelenlegi tudásommal hogy ha ez alapján 0 értéket kapok vissza az adott pillanatban és teljesül a többi feltétel is akkor megtudja nyitni a pozicót. Vagy tévedek? vagy ha esetleg hibás az elképzelésem tudnál segíteni a helyes megoldásban?
Ha pl. nem csak egy puritán ellenőrzésről van szó, hanem naplózásról, hiba kijelzésről akkor többször lehet szükség a GetLastError() -ra. Ha ilyesmivel nem akarsz foglalkozni, akkor hagyd, egyszerűen csak fel akartam hívni a figyelmed egy gyakori problémára. A puritánság viszont nem mindig elegendő, főleg ha azt akarod tudni hogy a robot mit hisz/mit tesz éppen.
Szóval a feltevésed helyes, csak az én megvalósítási szokásaim mások, ezért említettem meg.
A megoldás maga pedig egyszerű, mint a faék:
errorCode = GetLastError(); if (errorCode == 0) { // Minden csudajó } else { // Hibakezelés Print ("Hiba történt: ", ErrorToString(errorCode)); }
Az ErrorToString például lehet egy saját hibaszöveg-kezelő függvény, igazából lényegtelen. Ha mindenhova GetLastError() -t írnál, akkor az első hívás után nullázódik a hiba értéke, a további feltételekben pedig ez zavart okozna. Így már okés a leírásom?:)
Igen igy már viágosabb:) de ezt a zavart okozna részt nem értem. mit értesz ez alatt pontosabban? Nekem pl 4 nyitási blokkom van, vagyis két különböző feltétel alapján nyithat longot és kettő alapján shortot, ez 4 felé van véve, és mind a 4be beillesztettem ezt a && GetLastError() == 0 && feltételt. Ez igy bezavarhat, vagy okozhat kárt, vagy hibát a robot müködésében? igy értetted? vagy ez mind a 4 feltételcsoport ellenőrzésekor lekérdeződik és az adott pillanat értékét veszi figyelembe és akkor minden tök jó? lehet értetlenkedek:) de nemtudok hibát generálni, hogy ellenőrizzem a müködését. :) A hibakezelés is tök jó ötlet, de egyenlőre nincs rá ötletem hogy tudnám hasznosítani. Nekem egyenlőre az a célom hogy bármilyen hiba esetén ne akarjon kötni új pozicót, de pl a meglévő pozicó zárását ha épp eléri a célárat akkor azt akármi van próbálja bezárni, nyilván ha nem olyan hiba van ami ezt nem engedi. Tehát zárási feltételnél nem akarom a GetLastError értékeit figyelembe venni.:)
A 4 darab GetLastError + AccountFreeMarginCheck ellenőrzés felesleges, egy OnTick-ben elég egyszer lekérdezni. Az eredményt eltárolod és utána azt ellenőrzöd a további feltételekben. (Természetesen más a helyzet, ha egymás után esetlegesen több pozíciót nyitsz egy ticken belül – akkor jó, amit írsz.)
Hibát (hibás feltétel teljesüléseket) akkor tapasztalhatsz, ha nem veszed figyelembe amit korábban írtam (vagyis hogy egy GetLastError() függvény futtatás kinullázza a hibát).
A zárás és a nyitás folyamán pedig igen is muszáj ellenőrizned a GetLastError() -t, minden kísérlet után. A kardinális hibák (nincs pénz, nincs kereskedési jog, stb.) esetén le kell állítanod a próbálkozást, mert valószínűtlen hogy ezek megváltoznak a próbálkozások egzakt pillanatában.
Hibát ezerféle módon tudsz generálni szándékosan: az AccountFreeMarginCheck kapcsán pl. túl nagy lotméretet adsz meg nyitáshoz kicsi egyenleghez, pozíciónyitási hibához pedig BUY pozíció nyitása során Bid értéket használj. Ez utóbbi jellemzően azonnal hibát okoz, amellyel már tudsz tesztelni.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.