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

  • #16
    Na hogy álltok, sikerült valami hasznát venni? Vagy most az összes igazi programozó ezen röhög?
    Megjegyzem, engem soha senki nem tanított programozni, ezt kéretik figyelembe venni.

    Arra számítottam, hogy lesznek kérdések, észrevételek, javaslatok, de úgy látom a lényeg mindenkinek világos.
    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. Feltéve, hogy nem változtatunk az időszakon, idősíkon, és nem váltunk szimbólumot. Ez utóbbi esetekben nem garantált, hogy folytatódni fog a megállított optimalizálás. F3 lenyomására előjönnek a terminál globális változói, a szokásos billentyűkombináció az összes kijelölésére (Ctrl A) működik itt is, így elég egyszerű törölni az összeset egyszerre. A teszter gyári öröklődő algoritmusát nem használjuk, ezt célszerű ki is kapcsolni, majd például 1-es lépésközökkel adni neki pár ezer iterációt. A program mindig csak a legjobb beállítást tartja meg, ezért az optimalizációs eredmények fülön mindegy, melyikre kattintunk, a paraméterek nem onnan töltődnek be, hanem a globális változókból. Igazából feleselges is rájuk kattingatni, 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. Az eredmények fájlba irkálásával nem foglalkoztam eddig, helyette inkább a fitness funkciót bonyolítom tovább. Ebben a fitness értéke csak az egyenleg, de 30-40 paraméter felett már érdemes összetettebb fitness funkciót használni. Ez eléggé expertfüggő, van, amelyiknek elég az egyenleg, de vannak olyanok, ahol kellhet bele profit faktor, kereskedések száma, profittal zárt időszakok aránya, drawdown, stb.

    Örülnék bármilyen észrevételnek, javaslatnak, és a felmerülő kérdésekre is amint tudok, válaszolni fogok.

    Hozzászólás


    • #17
      Nagyon állat ez a cucc. Egy normál 6-7 órás (600-700 körös) optim helyett ezzel 20 perc alatt (100 körrel) meglett a legjobb set. Nem semmi.
      Köszi szépen!

      Én annyit tettem még bele, hogy a globális változóknál a névbe a Symbol-t is tegye bele, és így nem kell több párnál mindig törölni a globálisokat.

      Plusz még az egyik nagyobb problémám, hogy ugye mindig csak a legjobb eredményt tudom tesztelni optim után. Tehát ha annak nem tetszik a DD-je, vagy a görbéje, akkor nem tudom megnézni a 2. vagy 3. eredményt. Erre lenne jó még kitalálni valamit. Esetleg, ha nem globálisban tárolnánk a weight értékeket, hanem fájlba és iterációnként is le lennének rakva az értékek. És akkor ha sima BT-t futtatok és beállítom iterációnak, hogy 45. akkor tényleg azzal a weight értékekkel futna, amivel az optim alatt is futott. Szerinted?

      Amúgy nézegetem a GetWeights fgv. de még mindig nem igazán értem hogy működik, esetleg arról írnál pár szót?

      Szuper cucc!

      Hozzászólás


      • #18
        Helló Icebob,

        Nagyon köszönöm az elismerő szavakat, én is csak hasonlókat tudnék mondani a TraderAgent-edről, bár csak a trialt próbáltam. Még sose vettem programot, nekem izgalmasabb elkészíteni őket, ha nem így lenne, biztos beruháztam volna rá.

        Amúgy igazán nincs mit, részemről a szerencse.

        A globális változóknál a Symbol mellé még periódust is lehetne beletenni, sőt még a tesztelés első és utolsó gyertyájának az idejét is, csak úgy már elég hosszú lenne a változók neve, meg az init se lenne olyan egyszerű. De ha fájlba akarod írni az eredményeket, akkor csak a fájlnév lenne hosszú, ez talán annyira nem nagy gond.

        Az eredmények mentése nem lenne nehéz, arra már van ötletem, csak azért nem csináltam meg eddig, mert akkor fájlokat kellene mindig törölni, és az valamivel bonyolultabb, mint a globális változók törlése. Ha kiírod fájlba az optimalizációs eredményeket, akkor csak annyi a lényeg, hogy az iteráció számát is menteni kell valamelyik oszlopba, például az elsőbe, a paraméterek elé. Teszteléskor pedig az init függvényben beolvastatod a fájlt, és az iteráció száma alapján ki tudod kerestetni, és betöltetni azokat a paramétereket, amiket tesztelni szeretnél. Persze ez esetben már az optimalizációs eredményekből dupla kattintással ki kellene választani azt, amelyiket tesztelni akarod, vagy kézzel írni be az iteráció számát a robotnak.

        Ez a GetWeights optimalizáláskor úgy működik, hogy először azt választja ki véletlenszerűen, hogy ebben az iterációban hány paraméteren fog változtatni. Minimum egy, maximum az összes paraméterek száma. Ez a wsud nevű változó jelentése. Ezután a ciklusban ennyiszer választ ki egy paramétert szintén véletlenszerűen, lehet akár többször is ugyanazt. Majd választ egy véletlen számot 0.0001 és 1 között, a 10-nek a negatív hatványai szerint, ami az "a" nevű változó. A paraméter aktuális értékéből és ebből az "a"-ból képez két új paramétert, az egyik esetben összeadással, a másikban kivonással, plusz egy harmadikat, ami egy random szám. Végül, a változatosság kedvéért ismét véletlenszerűen dönti el, hogy a paraméter eredeti értékét e három lehetőség közül melyikre cserélje ki. Ezt a megoldást direkt többszáz paraméteres optimalizációkhoz kísérleteztem ki, mert a genetikus algoknál a nagyméretű populációkkal jóval nehézkesebb volt dolgozni. Ez nagyjából ugyanolyan gyors és hatékony, csak jóval egyszerűbb.

        Amúgy arra is van ötletem, hogyan csinálnám meg ugyanezt vásárolt robotokhoz, ahol a forráskódba nincs lehetőség belenyúkálni. Ahhoz, ha jól gondolom szkript kellene, meg TesterControl library, és set fájlok írása programból. De ez csak elméleti ötlet, gyakorlatban nem próbáltam megvalósítani.

        Ha van még bármi kérdés, továbbra is állok rendelkezére.

        Sok szerencsét!

        Hozzászólás


        • #19
          Szia nlot!

          Lehet, hülyeséget kérdezek, de akkor is:
          Amit nem igazán értek, hogy hogyan nyered vissza a paramétereket a globális változókból?
          A linkelt képen a bekeretezett értékekből hogyan nyered ki a paraméter értékét?
          Köszi
          Csatolt fájlok

          Hozzászólás


          • #20
            Az előzőhöz: elmented set fájlként? Vagy valami egyéb módon?

            Hozzászólás


            • #21
              Hát nlot, azt mindenesetre el kell mondanom, hogy ez a cuccos tényleg nagyon király! Respekt!
              Ráeresztettem egy EA-mra amely 16 változtatható paramétert használ. Bő 2 óra alatt 200 iterációt lefuttatott egy évnyi backtesten. Bele sem merek gondolni, meddig tartott volna ez a hagyományos módon. Őrület. Szóval, nagyon köszi!

              Hozzászólás


              • #22
                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.

                Hozzászólás


                • #23
                  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.

                  Hozzászólás


                  • #24
                    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.

                    Hozzászólás


                    • #25
                      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.

                      Hozzászólás


                      • #26
                        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.

                        Hozzászólás


                        • #27
                          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

                          Hozzászólás


                          • #28
                            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

                            Hozzászólás


                            • #29
                              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...

                              Hozzászólás


                              • #30
                                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

                                Hozzászólás

                                Working...
                                X