Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › OnTick meghívása az OnInit()-ben. Lehetséges? (pl.: hétvégén))
-
SzerzőBejegyzés
-
Sziasztok!
Azt szeretném elérni, hogy robotom ne csak új tick érkezésekor fusson (hétvégén is). Ennek miértjére nem térek ki mert nem tudnám röviden elmagyarázni.
Korábban meghívtam az OnTick() funkciót az OnInit-ben, de állítólag az gondot okozhat, és hát ugye pénzzel játszik a cucc… Aztán időzítettem, hogy csak péntek késő estétől hívja meg az OnInit-et. Csakhogy pl.: tegnap az IronFX délben leállította a ticket mert holyday volt (Martin Luther King születése, IsConnect true maradt).
Ez pedig nálam máris meglepetést okozott. Nem vagyok képes és nem is elegánsd dolog beírogatni a világ összes ünnepét a robotba, pláne, hogy nem mindegyik broker áll le.
Tud valaki olyan kódot ami „figyeli” hogy érkezik-e új tick, és ha nem akkor elindítja az OnTick funkciót?
Példa:int OnInit() { //-- if(TestModeWeekend && ((TimeDayOfWeek(TimeCurrent())==5 && TimeHour(TimeCurrent())>=22 && TimeMinute(TimeCurrent())>=59 && TimeSeconds(TimeCurrent())>=00) || (TimeDayOfWeek(TimeLocal())==6) || (TimeDayOfWeek(TimeLocal())==0) || (DayOfYear()==1)))Weekend=true; else Weekend=false; if (Weekend){ if (EventSetTimer (1) == true){ // Define time millesekundah timer Print ("Expert elindult!!!");} // Report success else // otherwise Print ("Hiba! Expert nem indult el."); // Report failure } if (!IsOptimization() && !IsTesting() && !IsVisualMode() && Weekend) OnTick(); //--- return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { EventKillTimer(); } void OnTick() { if (!IsOptimization() && !IsTesting() && !IsVisualMode() && Weekend) { while (! IsStopped ()) { Expert (); // Call the main function Sleep (100); // After each iteration cycle pauses that would not overload the PC processor } } else Expert (); // If this is a testing run in normal mode }
Esetleg (és ezt még nem próbáltam…):
void OnTimer() { if(TimeMinute(TimeLocal())!=TimeMinute(TimeCurrent())) OnTick(); }
Előre is köszönöm a segítséget!
Remélem érthető volt.OnTick-et semmiképp ne hívd meg más függvényekből.
Használd az OnTimer() -t, szervezd át a kódod úgy hogy a fő teendőidet egy közös eljárásban legyen, amit OnTick-ből és OnTimer-ből is meg tudsz hívni.
Használd az EventSetTimer vagy EventSetMillisecondTimer függvényeket az OnInit -ben, egyszer.
Deinitben pedig az EventKillTimer függvényt hívd meg.
Megint villámgyors voltál!
Mi történik, ha OnInitböl hívom meg? Milyen hibát eredményezhet?
A közölt kódban az EventSetTimer-t használom.
Ha nem az OnTick()-et használom akkor jó lehet a struktúra?
Tehát:if (!IsOptimization() && !IsTesting() && !IsVisualMode()) Expert();
Vagy hasonló.
Az OnTick itt csak egy feladatot hív meg… folyamatosan…A fő függvényeket (OnTick, OnInit, stb.) a régi dokumentációban nem javasolták meghívni egynél többször. A jelenlegiben igaz, nem találok ilyen figyelmeztetést, de régről ez maradt bennem.
Amit írsz, az jó. Az Expert() nevű függvényt meghívhatod OnTickből, OnTimerből, bárhonnan.
Köszönöm a segítséged!
Hétvégén csekkolom.
A kód a módosításokkal most fut hibátlanul (péntek). Majd hétvégén jön a fekete leves.Még annyi, hogy úgy találtam, hogy az OnInit csak egyszer fut az induláskor és aztán leáll. Tehát max egyszer hívja meg az OnTicket… és hétvégén meg nincs tick…
Szerintem a timer hétvégén is működni fog.
Arra figyelj, hogy hétvégén – zárt piacnál – véletlenül se próbálj meg pozíciókezelést végezni :)
Szia!
Működik az OnTimer hétvégén!
Köszi az emlékeztetést. Végiggondoltam, és hát próbálkozhat a hétvégén is mert kap timer tick-et…
Eddig még nem bombázott hibaüzenetekkel, pedig van időalapú lezárás beállítva.
Szétválasztottam az „örökké futtatandó folyamatokat” a „pozíció kezelőktől”.
A „pozíció kezelők” és „örökké futtatandó folyamatok” az OnTick-ben vannak meghívva (tehát ott mindkettő indul), és csak az „örökké futtatandó folyamatok” :) vannak az OnTimer alatt. Szóval elvileg nem akar lezárni, megnyitni semmit hétvégén…
Szerintem ez így már jó.//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { AlwaysOn(); Expert (); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { AlwaysOn(); }
Köszi mégegyszer a segítséget!
Igen, jónak tűnik. A zárást gondolom a TimeCurrent() alapján ellenőrzöd, ez pedig a pénteki legutolsó beérkező árváltozás időpontját mutatja egész hétvégén. Csak piacnyitáskor fog megváltozni. Ez az oka annak, hogy nem kaptál hibaüzeneteket, hiszen egész hétvégén ugyanazt az állapotot ellenőrzi le újra és újra, mint ami a piaczárás pillanatában volt.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.