Tőzsdei Oktatóközpont kezdőknek - Huntraders.com

Közlemény

Collapse
No announcement yet.

Általánosságok

Collapse
X
 
  • Szűrés
  • Idő
  • Mutat
Clear All
new posts

  • nlot
    válaszolt
    Találtam egy igen egyszerű megoldást az optimalizálás automatikus leállítására, és úgy döntöttem leírom hátha érdekel valakit. Csak létre kell hozni hozzá még néhány hamis külső változót, amit a robot szintén nem használ. Az iterációhoz hasonlóan ezeknek is meg kell adni szélsőértékeket és lépésközt, majd bekapcsolni a teszter gyári öröklődő algoritmusát. Ez érzékelni fogja, ha már nem érdemes tovább futnia, és le fogja állítani az optimalizálást. Csak azt kell kikísérletezni, hogy összesen mennyi legyen a hamis paraméterekkel megadott kombináció-szám, mert ha túl kevés akkor le fog állni idő előtt, ha túl sok akkor pedig tovább fog futni mint szükséges. Erre csak most jöttem rá, de az eddigi néhány teszt alapján úgy látom, hogy működik.

    Szólj hozzá::


  • nlot
    válaszolt
    CR4ZYFR0G eredeti hozzászólása Hozzászólás megtekintése
    Jogos amit írsz, a rendszer sebességén és hatékonyságán valóban rengeteget lehet még javítani. Leginkább azzal, ha az adott típusú optimalizálási probléma megoldására finomítod. Ilyenkor az univerzalitás általában csökken, vagyis más típusú optimalizálási problémák esetén lassabb lesz és/vagy gyakran ragad lokális optimumokba, de azt az egy fajtát, amire hangoltad, sokkal gyorsabban fogja megoldani.

    Ehhez a mini demonstrációhoz több okból és szándékosan választottam az első működőképes verziók közül is az egyik legalapabb, legnyersebb változatot. Ez kicsi és egyszerű, mindenki úgy szabhatja személyre és robotra, ahogy tetszik. Az újabbak sok paraméterrel és speciális eredmény-kiértékelő megoldással dolgoznak, hibát minimalizálnak, nem profitot maximalizálnak mint ez. Ha egy ilyet dobok fel, akkor használati utasítást kellett volna írnom hozzá, és azután is még hetekig magyarázni az optimális beállításokat a különböző típusú optimalizálási feladatokhoz. Ehhez nyilván sem időm, sem kedvem nem volt.

    Ezt a verziót több népszerű tesztfüggvénnyel is kipróbáltam, lokális optimumokba igen ritkán ragadt be, és akkor is csak maximum néhány ezer iterációig. Egyszerű neurális háló esetén, ismeretlen targetet szimulálva néha még gyorsabb is volt, mint annak az eredeti tréningelő rendszere (ezen az oldalon a C/C++ menüpont alatt található kód a legegyszerűbb példa erre, mivel a régi strukturált mq4 is szinte egy az egyben megeszi, csak minimális változtatások szükségesek).

    Az azonos kombinációk többszöri teszteléséről: ki lehet küszöbölni, és bizonyos esetekben érdemes is lenne. Nekem eddig eszembe se jutott, mindig elég sok paraméterrel és variációval dolgozom, ezért két egyforma kombináció előfordulásának az esélye igen kicsi.

    Az optimalizálás automatikus leállítása: jó ötlet ez is, kár hogy mql4-ben nincs valami gyári stop függvény erre. DLL hívással meg lehet oldani, csak számolni kell hozzá az eddigi legjobb eredmény megtalálása óta lefutott iterációkat a robotban, és menteni globális változóba. Azután meg lehet adni például külső változóban, hogy mennyi olyan iteráció után álljon meg, amiben a legjobb eredmény nem változott. Sokat tesztelek olyan szkriptekkel robotok helyett, amiknek saját beépített tesztere van, azokban is így oldottam meg ezt (csak nyilván ott globális változókat felesleges használni).

    Érdekes, hogy metáék gyakorlatilag már az egész platformot átdolgozták programnyelvestül, de a teszter variáció-limitjének megszüntetése valamiért eddig mindig kimaradt. Szerintem mindenki boldogabb lenne, ha nem ilyen barkácsmegoldásokkal kellene szórakozni. Egyelőre vagy ez, vagy másik platform, jelenleg egyéb lehetőségről nincs tudomásom.

    Szólj hozzá::


  • CR4ZYFR0G
    válaszolt
    nlot eredeti hozzászólása Hozzászólás megtekintése
    Még egy dolog eszembe jutott ezzel kapcsolatban. A teszter nem mindig érzékeli, ha az időszak megadása mellől kiveszem a pipát, és ugyanazon az időszakon optimalizál tovább, mintha még a pipa ott lenne. De

    amint az optimalizációt megállítom, és indítok egy tesztet, akkor már érzékeli a változtatást, és az egész adatsoron futtatja le a tesztet. Ez is okozhat olyan jelenséget, amit írtál.

    Jól mondod, ennek pontosan a rátermettségi függvény a legbonyolultabb része, magyarul annak számszerűsítése, hogy mi magunk mi alapján választanánk ki a legjobb beállítást, ha az optimalizáció befejeztével minden eredmény a

    birtokunkban volna. Ez minél pontosabban definiálva van, annál valószínűbb, hogy a program olyan beállítást fog találni, amilyet szeretnénk, és annál kevésbé van szükség az eredmények fájlba írására.
    Sziasztok!
    Először is köszi a kódot nlot -nak és Bill -nek jelentős időt lehet vele megtakarítani!

    Még az elején megemlíteném nem vagyok programozó csak időtöltés és megtérülés reményében szoktam magamnak expertet/indikátort készíteni, kérem a hozzászólásomat aszerint kezelni.

    A kóddal kapcsolatosan lenne észrevételem/javaslatom a használatához.
    Hiányoltam, hogy a függvényben nem lehet megadni a lépésközöket és így double érték esetén számomra teljesen haszontalan számokkal futtat tesztet. Függvényeket megtekintve arra jutottam, hogy felesleges a w_double() és w_bool() mivel az említett két függvényt kilehet váltani a w_int() függvénnyel. w_bool() helyet a w_int() minimum érték 0 a maximum érték 1 pl.: w_int(0,0,1). w_double() helyet ha 1-20 -ig 0.1 -es lépésközzel közzel akarok optimalizálni akkor w_int() bemeneti érték*10 és w_init() *0.1 pl.: w_int(0,10,200)*0.1
    Szerintem így használva további felesleges köröket lehet spórolni.

    Továbbá azt tapasztaltam, hogy kb. 100 000 -es variációra 1-2500 -ig iterációs értékkel optimalizálva 600 körüli iterációnál elérte a profit "maximumot" az expert és a továbbiakban az optimalizálás ugyanazokat az eredményeket hozta, illetve több teljesen azonos eredmény is található. Jó lenne ha kilehetne zárni az azonos értékek újra futtatását illetve ha nincs további variációs lehetőség állítsa le az optimalizálást.

    Szólj hozzá::


  • Guest's Avatar
    Guest replied
    Dzsabba eredeti hozzászólása Hozzászólás megtekintése
    Ezt kíváncsiságból én is kipróbálnám, de mivel nem értek a programozáshoz ezért kellene egy használati utasítás is hozzá mert nem tudom mit kell csinálni vele és az expertel (esetleg egy videó hangal). Ha bonyolultabb és szükséges hozzá programozási ismeret akkor hagyátok figyelmen kívül az üzenetet
    köszi
    Alapvetően nagyon egyszerű, de egy minimális programozási ismeret azért kell hozzá.
    Csináltam egy sablont, ezzel kell kiegészíteni a tesztelni szándékozott EA-t.
    1./ Be kell másolni a megfelelő részeket a megfelelő részekre (a sablonból az EA-ba).
    2./ Átnevezni a változókat (Variable) az EA eredeti változói szerint.
    Csatolt fájlok

    Szólj hozzá::


  • Dzsabba
    válaszolt
    nlot eredeti hozzászólása Hozzászólás megtekintése
    Úgy gondolom, itt az ideje, hogy mutassak valami hasznosat is, ne csak a szám járjon folyton. Sokat gondolkoztam, mi legyen az, ami ér is valamit, de annyit azért nem, hogy előbb lőljenek le, amiért megosztottam, minthogy az első komment megérkezne.

    Meg is találtam a szerintem ideális jelöltet.

    Szerintem ez a világon a legegyszerűbb megoldás, amivel paraméter- és variáció-limit nélkül lehet robotot optimalizálni mt4-ben. Persze csak olyat, aminek megvan a forráskódja is. Eddig 800 paraméter volt a maximum, amivel próbáltam, neuronháló súlyait optimalizáltam vele, ahol mindegyik súly -1 és 1 között vehetett fel értéket 6 digites pontossággal, és ott is hibátlanul működött. Ki lehet számolni, ez összesen hány variáció

    Ez a kódocska egy szokványos expert optimalizálását próbálja bemutatni nem szokványos módon. Maga a rendszer annyira egyszerű, hogy a faék ehhez képest SkyNet, szóval nem kell semmi bonyolultra készülni.

    Good Luck!

    Ezt kíváncsiságból én is kipróbálnám, de mivel nem értek a programozáshoz ezért kellene egy használati utasítás is hozzá mert nem tudom mit kell csinálni vele és az expertel (esetleg egy videó hangal). Ha bonyolultabb és szükséges hozzá programozási ismeret akkor hagyátok figyelmen kívül az üzenetet
    köszi

    Szólj hozzá::


  • Icebob
    válaszolt
    Szuper, én is kifogom próbálni!

    Szólj hozzá::


  • Guest's Avatar
    Guest replied
    nlot eredeti hozzászólása Hozzászólás megtekintése
    Wow, nagyon szép munka, mit ne mondjak. Kipróbáltam, hibátlanul működik. Köszi, hogy megcsináltad

    Én köszönöm, hogy volt min alakítgatni.

    Egy apróságot felfedeztem benne, ami bizonyos esetekben gondot okozhat. A haszontalan eredményeket fájlba írni nem kell ugyan, de menteni azért kellene a globális változókba, mert a program használja őket. Ennek alacsonyabb idősíkokon és sok paraméteres expertek esetén van jelentősége, ahol az első profitos beállítás megtalálásához akár többszáz iterációra is szükség lehet. Amíg az első profitos beállítást nem találja meg, addig a veszteségesek szinte nélkülözhetetlenek.

    Azt javasolnám, hogy a globális változók mentésének eredeti feltételét hagyd meg, a fájlba írás feltételét inkább egy sorral fölé tedd például ilyen formán:

    Kód:
    if(AccountBalance()>TesterStatistics(STAT_INITIAL_DEPOSIT) && !IsStopped() && Save_To_File) SaveToFile();
    Ezáltal ugyanúgy mentve lenne az összes nyerő verzió, és a progi működési logikájában sem történne változás.

    Így igaz, beleírtam a változtatást.

    Kicsit úgy érzem magam itt, ennyi nálam sokkal képzettebb és gyakorlottabb programozó közt, mintha én lennék az a vakon született, aki a látóknak magyarázza a színeket...
    No-no, csak szerényen a szerénységgel! A melót Te csináltad, a többi csak maszatolás volt.
    Csatolt fájlok

    Szólj hozzá::


  • nlot
    válaszolt
    Wow, nagyon szép munka, mit ne mondjak. Kipróbáltam, hibátlanul működik. Köszi, hogy megcsináltad

    Egy apróságot felfedeztem benne, ami bizonyos esetekben gondot okozhat. A haszontalan eredményeket fájlba írni nem kell ugyan, de menteni azért kellene a globális változókba, mert a program használja őket. Ennek alacsonyabb idősíkokon és sok paraméteres expertek esetén van jelentősége, ahol az első profitos beállítás megtalálásához akár többszáz iterációra is szükség lehet. Amíg az első profitos beállítást nem találja meg, addig a veszteségesek szinte nélkülözhetetlenek.

    Azt javasolnám, hogy a globális változók mentésének eredeti feltételét hagyd meg, a fájlba írás feltételét inkább egy sorral fölé tedd például ilyen formán:

    Kód:
    if(AccountBalance()>TesterStatistics(STAT_INITIAL_DEPOSIT) && !IsStopped() && Save_To_File) SaveToFile();
    Ezáltal ugyanúgy mentve lenne az összes nyerő verzió, és a progi működési logikájában sem történne változás.

    Kicsit úgy érzem magam itt, ennyi nálam sokkal képzettebb és gyakorlottabb programozó közt, mintha én lennék az a vakon született, aki a látóknak magyarázza a színeket...

    Szólj hozzá::


  • Guest's Avatar
    Guest replied
    Egy kis korrekció:
    nlot eredeti verziójában csak a "legjobb" setup megtalálása volt a cél, ezért mindig azt vizsgálta, hogy az aktuális balance nagyobb-e az addigi legnagyobbnál.
    A módosított verzió az összes nyerő setup-ot keresi. Ezért ezt a részt:

    Kód:
    if(AccountBalance()>prevbalance && AccountBalance()>TesterStatistics(STAT_INITIAL_DEPOSIT) && trades>0 && !IsStopped())
    megváltozttam erre:

    Kód:
    if(AccountBalance()>TesterStatistics(STAT_INITIAL_DEPOSIT) && trades>0 && !IsStopped())
    Így minden nyerő verziót elment.
    Csatolt fájlok

    Szólj hozzá::


  • Guest's Avatar
    Guest replied
    Közben kicsit megbütyköltem.
    Ez a verzió már elmenti fájlba (*.csv) is az eredményeket.
    Így Excel-be importálva könnyen áttekinthető az egész, és nem csak a "legjobb" marad meg.
    A konkrét esetben ezek lesznek mentve:

    "Iterations",
    "Profit",
    "Total Trades",
    "Profit Factor",
    "DD$",
    "DD%",
    "Profitable Trades",
    "Losing Trades"

    és a változók értékei is (így bármelyik teszt reprodukálható később is):

    "TakeProfit",
    "StopLoss",
    "UseTrailing",
    "TrailingStop",
    "MACDOpenLevel",
    "MACDCloseLevel",
    "MATrendPeriod"

    A fájl nevét automatikusan létrehozza (jelen esetben: SamACD_GBPUSD_60_Opt.csv).
    Azaz: expertneve_instrumentum_idősík
    Ízlés szerint módosítandó.
    Csatolt fájlok

    Szólj hozzá::


  • nlot
    válaszolt
    Még egy dolog eszembe jutott ezzel kapcsolatban. A teszter nem mindig érzékeli, ha az időszak megadása mellől kiveszem a pipát, és ugyanazon az időszakon optimalizál tovább, mintha még a pipa ott lenne. De amint az optimalizációt megállítom, és indítok egy tesztet, akkor már érzékeli a változtatást, és az egész adatsoron futtatja le a tesztet. Ez is okozhat olyan jelenséget, amit írtál.

    Jól mondod, ennek pontosan a rátermettségi függvény a legbonyolultabb része, magyarul annak számszerűsítése, hogy mi magunk mi alapján választanánk ki a legjobb beállítást, ha az optimalizáció befejeztével minden eredmény a birtokunkban volna. Ez minél pontosabban definiálva van, annál valószínűbb, hogy a program olyan beállítást fog találni, amilyet szeretnénk, és annál kevésbé van szükség az eredmények fájlba írására.

    Szólj hozzá::


  • Guest's Avatar
    Guest replied
    nlot eredeti hozzászólása Hozzászólás megtekintése
    Igen ilyenek nálam is előfordultak, ezért kellett a paraméterek mentési feltételébe a !IsStopped(), azzal oldódott meg a probléma. Nem törölted ki azt onnan véletlenül? Vagy olyankor fordulhat még ez elő, ha a globális változókat nem törlöd ki, mielőtt más időszakon kezdenél optimalizálni. Egyenlőre ennyi ötletem van, ha eszembe jut még valami, akkor majd megírom.
    Elvileg ezek nem fordultak elő, de nem mernék rá megesküdni.
    Amúgy Icebob javaslata irányában mindenképp tovább kellene fejleszteni, mert valóban nem biztos (sőt, szinte kizárt), hogy nekem is az a verzió a legszimpatikusabb, amelyiket kidobja a rendszer. Egyik verzió a már említett elmentés (az összes eredményről). Egy másik lehetne, hogy több paraméter együttes vizsgálata alapján rangsorolna (például profit,PF,DD együtt). Persze ez elég bonyi. Asszem elkezdem kicsit buherálni, aztán meglátjuk mi lesz belőle.

    Szólj hozzá::


  • nlot
    válaszolt
    Bill eredeti hozzászólása Hozzászólás megtekintése
    Megállítottam a tesztet, lefuttattam, de Stop Out-ra futott, holott az optim már kidobott jónéhány eredményes beállítást. Aztán az optimalizálás elölről indult (bár nyilván a GV-ből "táplálkozva").
    Igen ilyenek nálam is előfordultak, ezért kellett a paraméterek mentési feltételébe a !IsStopped(), azzal oldódott meg a probléma. Nem törölted ki azt onnan véletlenül? Vagy olyankor fordulhat még ez elő, ha a globális változókat nem törlöd ki, mielőtt más időszakon kezdenél optimalizálni. Egyenlőre ennyi ötletem van, ha eszembe jut még valami, akkor majd megírom.

    Szólj hozzá::


  • Guest's Avatar
    Guest replied
    Igen, barkácsmegoldással én is ki tudnám nyerni, de azt hittem, van valami triviálisabb megoldás, csak hirtelenjében nem látom.
    Amúgy konkrétan nem jelentett gondot, mert az említett EA-m kiírja a képernyőre az aktuális paramétereket, ezért csak általánosságban kérdeztem.

    Ez a dolog viszont valamiért nem működött:
    Az optimalizáció bármikor megállítható, lehet tesztelni is közben, vagy újrafordítani a programot, amíg a globális változókat nem töröljük (vagy legalább a balance nevűt), addig a rendszer folytatni fogja az optimalizálást ott, ahol abbahagyta. ... elég csak megállítani az optimalizációt, kivenni a pipát négyzetéből, és nyomni egy startot a tesztelésnek. Teszt után vissza a pipa, és folytatódik is.
    Megállítottam a tesztet, lefuttattam, de Stop Out-ra futott, holott az optim már kidobott jónéhány eredményes beállítást. Aztán az optimalizálás elölről indult (bár nyilván a GV-ből "táplálkozva").
    A lényeg: überjó a cucc.

    Szólj hozzá::


  • nlot
    válaszolt
    Tényleg nincs mit, örülök, hogy segíthettem

    Tudom, ez messze nem a legelegánsabb megoldás, de most példának talán megteszi.
    Keresd meg a programban az OnDeinit függvényt, így néz ki most:

    void OnDeinit(const int reason)
    {
    Opt_Deinit();
    return;
    }

    Ha megvan, az egészet cseréld ki erre, majd fordítsd le a programot:

    void OnDeinit(const int reason)
    {
    Opt_Deinit();
    string bool0="false";
    if(UseTrailing) {bool0="true";}
    int ms=MarketInfo(Symbol(),MODE_STOPLEVEL)+1;
    Print("MATrendPeriod = "+w_int(6,1,200));
    Print("MACDCloseLevel = "+w_double(5,0,50));
    Print("MACDOpenLevel = "+w_double(4,0,50));
    Print("TrailingStop = "+w_int(3,ms,300));
    Print("UseTrailing = "+bool0);
    Print("StopLoss = "+w_int(1,ms,300));
    Print("TakeProfit = "+w_int(0,ms,500));
    return;
    }

    Majd ezután állíts be valami jó rövid időszakot, mondjuk 1-2 napot, és azon teszteld le a progit újra (erre azért van szükség, mert ha hosszabb időszakon tesztelnél, akkor meg kellene várnod, amíg a teszter egy rakás kereskedés adatait kiírja). A teszt végén a teszter naplójában ott lesznek a paraméterek név szerint.

    Remélem tudtam segíteni.

    Szólj hozzá::

Working...
X