Függő megbízás adott időben 2014-05-22T10:21:30+00:00

Radu.hu Fórum Kérdések az MQL4 programozási nyelvvel kapcsolatban Függő megbízás adott időben

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

    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,
    Jaki

    ghipszjakab
    Tag
    Bejegyzések száma: 8

    Bocs, 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 
    Radulovic Attila
    Tag
    Bejegyzések száma: 644

    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
    ghipszjakab
    Tag
    Bejegyzések száma: 8

    Köszi szépen a részletes választ, ezen most akkor átrágom magamat 🙂

    ghipszjakab
    Tag
    Bejegyzések száma: 8

    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é…

    Radulovic Attila
    Tag
    Bejegyzések száma: 644

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

    ghipszjakab
    Tag
    Bejegyzések száma: 8

    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?

    Radulovic Attila
    Tag
    Bejegyzések száma: 644

    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.

    ghipszjakab
    Tag
    Bejegyzések száma: 8

    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.

    Radulovic Attila
    Tag
    Bejegyzések száma: 644

    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?

10 bejegyzés megtekintése - 1-10 / 10

A hozzászóláshoz jelentkezz be!

Adhatok Neked még több ingyenes tartalmat?

Értesítelek hetente megjelenő új tartalmaimról.