Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › Indikátor lassulás, indokolatlan újratöltés
Címkézve: indikátor
-
SzerzőBejegyzés
-
Sziasztok!
Egy EA-hoz használok egyéni indikátort, ami különböző valutapárokról és idősíkokról ad nekem adatot. A valutapárokat és az idősíkokat is tömbben tároltam; amikor új bar érkezik, két egymásba ágyazott ciklussal végigmegyek a tömbökön és azok alapján használom az iCustomot. Így:
for (int i=0; i<ArraySize(data); i++){ ... for (int j=0; j<ArraySize(tf); j++){ ... double green = iCustom(data[i].symbol,tf[j],"netforce_indicator_2",...,0,1); ... } ... }
Amikor az EA-t felrakom a chartra, gond nélkül lefut az egész egy pillanat alatt. Viszont amikor újra elindul a vizsgálat (új bar érkezik) és újra lekérem az adatokat, már érezhetően sokkal lassabb a folyamat. Közben hallgatom, ahogy felpörög a számítógépem, rengeteget vár, majd nagy nehezen kiköpi az adatokat.
Kipróbáltam mi történik ha backtesten futtatom és eléggé meglepődtem:
https://app.box.com/s/q24fd3g76ao0p3uh7mpxsrvaw3pssi25Azt könnyen el bírom képzelni, hogy minden vizsgálatnál felrakja egy valutapáron egy idősíkra, majd leveszi. De miért csinálja ezt meg egymás után 2-3-szor, amikor (ahogy a kódban is látszik) csak egyszer utasítom erre?
Találtam egy ilyet:
http://forum.mql4.com/48398#643743Oké, backtestre jogos, erre nem figyeltem: nincs meg minden timeframe-em.
Viszont a chartra helyezésnél attól még nem kellene lelassulnia és második lekérésnél megenni a processzort.Ha nincs más megoldás, az is megfelelne, ha sikerülne valahogy teljesen kiirtani a memóriából az indikátort a vizsgálatom végén. Lényegében reprodukálnám azt az állapotot, amikor először indítom el az EA-t.
Minimálisat gyorsított a folyamaton, hogy az iCustom függvényhívásnál a változókat előre konvertálva úgy adom át, ahogy azt az indikátor várja.
double(var1), int(var2), bool(var3), ...
Egyéb ötlet?
Arra is gondoltam, hogy ugyanaz a problémám mint a hosszabb távú backtestnél: olyan chartokról akarok adatot szedni amiket valójában soha nem nyitottam meg a MetaTraderben, vagyis gyakorlatilag semmi gyertyaadatom nincs. Tehát elvileg csak rá kell venni a termált, hogy szerezze be azokat a gyertyaadatokat, amiknek megfelel a szimbólum-idősík tömb kettős.
Lehet, hogy ez még tovább gyorsítana rajta, de ettől függetlenül is érthetetlen, hogy második-harmadik nekifutásnál miért megy döcögve, ha elsőre gond nélkül megcsinálja egy másodperc alatt.
Azt tartom valószínűnek, hogy minden iCustomnál újra „felcsatolja” magának az EA, de közben otthagyja a régit is, így minden vizsgálatkor ArraySize(data)*ArraySize(tf) darab indikátorral többet kell a memóriában eltárolni és nem mellesleg újraszámolni.
Tehát tényleg csak azt kellene elérni, hogy miután használtam az indikátort, azonnal kilőjem a memóriából.
A tapasztalatom szerint az ilyesmi a rosszul megírt indikátorokkal fordul elő, főleg azoknál, amelyeknél a viszonyítási pont – vagyis ahonnan számol és kirajzolja magát – folyamatosan változik.
Ez a valós idejű futtatásnál konstans marad, ezért ott nem látni ennyi lekérést. A backteszt azonban mindig újra és újra lekérdezi az indikátort, mintha mindig felraknád-levennéd a chartra. Ha pl. 500 gyertyával ezelőttről indul a számítás, akkor minden új bar esetén 500 gyertyával azelőttről indul újra. Valós időben viszont fixen a felhelyezés (inicializálás) időpontjától fog indulni a számítás. (Ez rossz felépítés így, de ez más kérdés)
Én első körben megvizsgálnám az indikátort, és ha kiderül hogy szar, kidobnám. Lehet persze javítgatni is, ezt mindig az adott helyzetben érdemes eldönteni a szükséges befektetendő energia mennyiségétől függően.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.