Hozzászólások

15 bejegyzés megtekintése - 361-375 / 651
  • Szerző
    Bejegyzés
  • Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Egyik olvasóm nemrég ezzel a programmal kapcsolatban kérdezett: ReportManager.

    Sajnos arra jutottunk, hogy a riportokból nem teljesen jól olvassa ki az értékeket a program, és amikor ezt jeleztük a fejlesztőnek, akkor nemigazán értette a problémát, és emiatt nem lett javítva a hiba.

    Mindenesetre azért nézd meg, mert ez a program ingyenes.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

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

    Ellenőrizd le, hogy van-e elegendő pénz a tesztben (induló tőke).

    A 0/1-es változód kapcsán: a billentyűre reagálás megoldható, de rendkívül körülményes. Az egyszerűbb jobb alapján inkább egy külső változót javaslok, amely a meglévő kereskedések menedzselését engedi, míg az új pozíció nyitást tiltja. Pl.: TradeEnabled = true/false.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Nincs mit, jó monitor-vadászatot! :)

    Radulovic Attila
    Tag
    Bejegyzések száma: 653
    Hozzászólás: Ledarálás? #3394

    herp: sajnos én csak mezei metaeditoros programírással foglalkozom, így a vizuális szerkesztőkben nem vagyok kompetens :( Azt hiszem, István segítségével többre mész! :)

    István: köszönöm, hogy válaszoltál és segítettél!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    A második képen a felbontásod miatt ugyanazon a zoom szinten több adat fér el a képernyődön. Tudomásom szerint ezt más módon nem tudod elérni, csak ha a felbontásodat növeled.

    Megnyugtatlak: nekem 27″-es monitorom van, és 1920×1080-as felbontásom. És ez sem elég mindenre:)

    Remélem, jól értettem a kérdésed.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Szia Gábor!

    Az első kérdésed kapcsán:
    Milyen stratégiáról van szó? Ha pl. ellentrendben/trendben építkezős, akkor a problémád onnan ered, hogy nem mindegy az első kötés helye, ami alapján a többi kötés majd datálódik. A bővebb válaszhoz ismernem kéne a stratégiát – így látatlanban a pozícióhalmozódás, és az ezzel kapcsolatos elszállás/túlzott kitettség lehet az ok (sok más egyéb mellett).

    A második kérdésed kapcsán:
    A kérdésed vizuál tesztben, manuális megállításra vonatkozik? Mert ott a Pause/Break feliratú gomb használható a billentyűzeten.

    Amennyiben programkódon belül szeretnél ilyen megoldást eszközölni, ott én az úgynevezett „szemafor” módszert javaslom. Azaz kell hogy legyen egy szemaforod (jelződ), amely megakadályozza a robotot az új pozíciónyitásban (többpozíciós rendszer esetén építkezés indításában), azonban a meglévő pozíciót/pozíciókat lemenedzseli. Szemafornak használhatsz egy fájlt, vagy akár egy globális változót – én jellemzően az utóbbiakat veszem igénybe.

    Az így elhelyezett szemaforokat természetesen majd kézzel kell törölni, mert a robot nem mindig tudhatja, hogy az adott szemafor érvényben van-e még, vagy csak egy korábbi futtatás eredményeként maradt ott.

    A jelző elhelyezése történhet pl. az első pozíció megnyitásakor, vagy egy más esemény bekövetkeztekor – ez teljes mértékben rád van bízva.

    Programkódot azért nem írnék most első körben, mert egyelőre megvárom hogy kifejtsd hogy pontosan mire is gondolsz.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Én köszönöm, hozzáadtam a hibajegyet a MetaQuotes rendszerében. Amennyiben kapok választ, jelzem azt ebben a topikban.

    Egyébként kijött egy új build a tesztszerveren (650), és az még nem tartalmaz semmilyen változást ezzel a problémával kapcsolatban.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Nekem nem teljesen tűnik átláthatónak az a kódrész, amelyben a RefreshRates() és a két OrderCloseBy sor van, hiszen az a kódrész mindig lefut, függetlenül attól hogy mi az if kiértékelések eredménye.

    Illetve a két OrderCloseBy helytelen, hiszen egy nyitott pozíciót zársz a másik ellenében.

    A következő for iterációban pedig az egész indexelés felborul.

    Ha {} jelek nélküli ifet használsz, akkor az első pontosvessző után befejeződik az adott feltétel.

    int type = OP_BUY;
    
    if (type == OP_BUY) Print ("Ez egy BUY!");
    if (type == OP_SELL) Print ("Ez egy SELL!");
    

    A kódodban viszont a SELL feltétel sora után van egy { } kódrész, ami mindig lefutásra kerül. Javaslatom az, hogy az átláthatóság kedvéért minden feltételt – főleg, ha több utasítás van utánuk – így használj:

    int type = OP_BUY;
    
    if (type == OP_BUY) { 
       Print ("Ez egy BUY!");
    }
    
    if (type == OP_SELL) { 
       Print ("Ez egy SELL!");
    }
    

    Illetve, olvasd el még a Pozíciók zárása című cikkemet, mert a pozíciók indexelésének felborulása is okozhat kellemetlen meglepetéseket.

    A fentiek közül bármelyik okozhatja a hibák tömkelegét. Azonban ezek a hibák nem az új fordítótól, hanem eleve programozási hibákból erednek.

    A continue; használata is teljesen felesleges, hiszen akár egymásba ágyazott, akár párhuzamos if-ekkel kiválthatod őket.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Szívesen bejelentem, de idő szűkében vagyok. Így megköszönném, hogy – amennyiben jól írsz angolul – megírnád a leírást, képernyőképekkel együtt (úgy, ahogy nekem küldted, csak angol kiírásokkal). Ezt megtennéd?

    Radulovic Attila
    Tag
    Bejegyzések száma: 653
    Hozzászólás: csv adatformátum #3365

    Szia kilovolt78!

    Az a cikk már meglehetősen idejétmúlt infókat tartalmaz. Olvasd el ezt a cikket, és használd a Tickstory Lite programot!

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    abunba, végülis jelentetted már a hibát a Service Desk-en? E-mailben mástól is megkaptam ezt a felismerést, úgyhogy egyre inkább úgy fest, hogy bugot találtál, amit jó lenne jelenteni.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653
    Hozzászólás: kernel32.dll #3360

    Köszönöm, hogy megosztottad.

    Kódformázásra a következő tagekkel nyílik lehetőség (a space-eket ki kell venni a p r e-ből, csak azért írtam be, hogy látszódjon a kód):

    <p r e lang="mql">
    MQL forráskód
    </p r e>
    
    <p r e>
    Egyéb forráskód
    </p r e>
    
    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Úgy nézem, teljesen helytálló a megállapításod. A témától független észrevételem: a jövőben javaslom, hogy használj konstans neveket (1440 helyett PERIOD_D1), mert így nehezebben olvasható a kód.

    Megoldást egyelőre nem tudok, mert ez így valóban nem normális működés, és régen tényleg nem volt ezzel baj.

    Radulovic Attila
    Tag
    Bejegyzések száma: 653

    Elküldenéd az indikátort és az expertet a radu kukac radu pont hu címemre? Megnézem úgy is. Nincs kizárva, hogy a MetaQuotes megint valami disznóságot követett el :)

15 bejegyzés megtekintése - 361-375 / 651