Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Függő megbízás adott időben
Címkézve: függő megbízás, idő függvények, Pending, Time
-
SzerzőBejegyzés
-
Egy olyan kód részlet megoldása érdekelne, amiben függő megbízást helyezhetnék el a nap egy megadott (extern változóban módosítható) órájában. Mivel olyan brókeren futna ami GMT zónában van, ezért pontosan GMT idős megoldás érdekel. A lényeg az lenne, hogy az expert figyelje, hogy az order teljesült, ha igen akkor nem csinál semmit, ha nem akkor ha eltelt 24h törli, és rögtön kihelyez egy újat (azért kell törölni, mert közben nyilván változhat a jegyzés szintje. Most itt belegabalyodtam a TimeGmt (az első expertem kódolása, ezért megy nehezen) és egyéb idő függvényekkel, és ehhez kellene egy kis segítség.
Köszönöm,
JakiBocs, elfelejtettem beírni, hogy eddig mivel próbálkoztam.
if( TimeHour( TimeCurrent( ) ) < Entry_Hour ) { és ebbe tettem azt amit szeretnék } Ezzel megvizsgáltam, hogy legalább órára egyezzen a
A megoldásodban az a hiba, hogy a feltétel állandóan teljesülni fog, ha az idő nagyobb vagy egyenlő mint az adott Entry_Hour. Ezért arra is figyelned kell, hogy az adott napon bekövetkezett-e már a feltételed. Ellenőrizheted például a számlatörténet alapján, hogy történt-e már belépés a mai napon, vagy még jobb, ha egy jelzőt (szemafort) helyezel el. Például egy globális változó átállításával és lekérdezésével meggyőződhetsz erről.
Az első feltétel ellenőrzésekor a TimeHour(TimeCurrent()) helyett használd a Hour() függvényt!
Itt egy alap példa:
// A beállított órában vagyunk? if (Hour() >= Entry_Hour) { // Ha igen, ellenőrizzük hogy a mai napon történt-e már belépés Mai_belepo = GlobalVariableGet("entry_date"); if (Mai_belepo != Day()) { // Cselekvés Print ("A mai napon (", TimeToStr(TimeCurrent(), TIME_DATE), ") megtettem valamit..."); // A mai nap mentése a globális változóba GlobalVariableSet("entry_date", Day()); } }
Természetesen a fenti példa nem 100%-os, hiszen a teszt végén a deinitben figyelni kell arra, hogy a globális változó törlésre kerüljön:
if (IsTesting()) { GlobalVariableDel("entry_date"); }
A programozás során figyelni kell a következőkre is, amire a tesztkódom nem tér ki:
- valósidejű futtatásnál ne csak a napot, hanem a konkrét dátumot mentsük el TimeCurrent() segítségével, és a visszaellenőrzésnél csináljunk belőle napot a TimeDay() függvénnyel
- ha egy számlán belül több robotpéldányt futtatnánk, akkor a globális változó neve valami módon egyedi legyen – például legyen benne az instrumentum neve és a robot magic száma is: pl. entry_date_EURUSD_88
Köszi szépen a részletes választ, ezen most akkor átrágom magamat :-)
Most, hogy átnéztem a kód részletet amit szíveskedtél leírni és részletezni, kicsit több tudással, újból kérdezek. Előbb egy tévedésemet szeretném kijavítani ami a GMT időt illeti (elnézést a pontatlanságért). Pont hogy a szerver nem GMT, (amúgy a TimeLocal nyilván nem, ha magyar időzónában fut az expertes gép) de a megbízások mindenképpen GMT idő szerint kell kikerüljenek. Ezért gondolom, hogy csak a TimeGMT függvénnyel lehet boldogulni, így nem használható a sima Hour() valamint a TimeLocal és TimeCurrent függvény sem.
A szemaforos megoldás valóban nagyon jó, egy kicsit meghaladja a tudásomat, ezért nem is fordult meg a fejemben.
Én egy ilyen kivitelezést készítettem:
// Ha ez a függvény lefutott, akkor törölt minden régi megbízást, // és mehet a dolog a két új order irányába..ha nem járt le akkor meg majd a következő // if miatt nem fog új ordereke elhelyezni Lejart_az_Ido(); int Ora = TimeHour( TimeGMT() ); int Szerver_Ido = TimeHour( TimeCurrent( ) ); int Local_Ido = TimeHour( TimeLocal( ) ); // Ha "ütött az óra", azaz a GMT idő óra komponense megegyezik a megadott óra változóval, // és nincsen sem OP_BUYSTOP sem OP_SELLSTOP akkor... if( Ora == Entry_Hour && Buy_Stop_Darab == 0 && Sell_Stop_Darab == 0 ) { Print( "TIME HOUR. GMT: ", Ora, " SERVER: ", Szerver_Ido, " LOCAL: ", Local_Ido ); Stop_Limitek_Elhelyezese(); }
Úgy találtam, hogy ezzel a megoldással leszűkül pont 1 órányira az az időperiódus, amíg kihelyezheti az ordereket. Egyébként ha mondjuk valamikor délután indítanám az expertet, akkor is nagyobb lenne az Óra komponens, így akkor is kihelyezné…
A TimeGMT() is helyi időt használ, azaz a géped óráját veszi alapul.
Szerintem NE a helyi időt használd, hanem mindig a brókeridőt! Ettől eltérni még mindig el lehet, de a GMT eltolást érdemes bekérned akkor külső paraméterként. A helyi idő ugyanis ha késik, máris kakikban vagy…
Az Hour(), Minute(), stb. az aktuális brókeridőt veszi alapul – nekünk más nem is kell, hiszen a kereskedést, gyertyák ellenőrzését leginkább ez alapján végzed. Ha most felszisszentél, és a bejelentések és egyebek kapcsán a brókered időzónája és a saját időzónád között eltérés van, akkor azt GMT eltolással érdemes kezelned – de semmiképp nem a lokális gép ideje alapján. Hiszen az bármikor eltérhet, késhet, siethet, ráadásul nagyi gépén két napot késik is. Akkor ott mi fog történni az experteddel? Pár perc (vagy akár másodperc) csúszás is felborítja a szükséges periodikusságot, ami kizárólag brókeridő használatával működhet.
A brókeridő mindig megfelelő, dolgozz azzal!
A megoldásod kihelyezős része pedig akkor kerül bajba, ha a kihelyezett megbízások mondjuk röviddel a kihelyezés után teljesülnek.
Ekkor – mivel nincs kint egy megbízás sem, „csak” két aktív pozíciód van, a kihelyezés újra meg fog történni. Az ilyen forgatókönyvek végiggondolása mindenféleképpen fontos, még akkor is, ha relatíve ritka eseménynek számít az adott konfigurációban.Előbb-utóbb kénytelen leszel egy szemafor-megoldáshoz nyúlni, hiszen a logikai felépítésbe nagyon sok minden beleköphet (pl. felhasználói erőszak :) )
Köszi szépen a további részletes infókat! TE tetted, magadra vess, ezért most jönnek a további nyaggatások :-).
Valóban, a TimeGMT is lokális időből van származtatva, tehát nem jó. Pont az általad felsoroltak miatt akartam teljesen kizárni a helyi gép idejét (mindegy milyen változatáról lenne is szó)Közben egy furcsa dologba futottam a Meta Stratégia tesztere kapcsán. Nem tudom, hogy mi lehet az oka, de hosszú ideig azt hittem, hogy valami hiba van a kódban.
Ugyanis ahogy a teszter elindul, rögtön kihelyezi a két ordert függetlenül attól, hogy az idő nem jött el. Élő charton fut rendesen, de nyilván, hogy ne mind kelljen állítgatnom a belépési időt, gondoltam, hogy futtatom a teszterben. FxPro-s Demo Meta.
Ugyanakkor pedig mindegyik időre a Comment azt írja, hogy egyenlő, pld 11 óra. Mi a szösz lehet?Látnom kéne a teljes kódot. A Commenttel kiíratott változó egy az egyben az, amivel az ellenőrzést végzed? A két order azért helyeződik ki, mert az if feltételed teljesül. Tehát valami probléma nagy valószínűséggel a feltétellel lesz.
A kód az csak annyi amit fentebb már beírtam. Tehát ott van a gond, hogy mint látszik az Ora változó az GMT, de mindegy, hogy mikor indítom a tesztert rögtön kihelyezi a két ordert. Ha élő charton futtatom ott nem, csak a stratégia teszterben.
A kiíratott értékek mik? A „TIME HOUR. GMT:” kezdetű kiíratásra gondolok. Jó, ha minden tickben megjeleníted a TimeGMT() -t a backtesztben. Ha annak fix értéke van, akkor nem nálad, hanem a MT4-ben van hiba.
A kód ezen része természetesen nem kéne, hogy állandóan (vagy bármikor) lefusson. A Lejart_az_Ido(); és a Stop_Limitek_Elhelyezese(); fgv mit tartalmaz?
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.