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))

Címkézve: ,

8 bejegyzés megtekintése - 1-8 / 8
  • Szerző
    Bejegyzés
  • filewalker
    Tag
    Bejegyzések száma: 19

    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.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    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.

    filewalker
    Tag
    Bejegyzések száma: 19

    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…

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    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.

    filewalker
    Tag
    Bejegyzések száma: 19

    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…

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    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 :)

    filewalker
    Tag
    Bejegyzések száma: 19

    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!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    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.

8 bejegyzés megtekintése - 1-8 / 8
  • Be kell jelentkezni a hozzászóláshoz.