hétfő, július 08, 2013

Money Management I. rész - Stop-loss kezelés

Többször is említettem, hogy elengedhetetlenül fontos a Money Management (továbbiakban MM).
Miért is?

Azért, mert az MM-nek kettős feladata van egy forex robot esetében.
Az egyik feladat a kockázatkezelés, a másik pedig a nyereség maximalizálása. Ez utóbbi gondoskodik egyébként a gyengén teljesítő robot nyereségességéről, míg a kockázatkezelés a veszteségek minimalizálásáról.

A kockázatkezelés helytelen altgoritmizálása lehet ugyanolyan káros, mint az, ha rossz a robotunk pozíció nyitása. A kockázatkezelés legegyszerűbb módszeréül robot készítők többnyire az egyszerű stop-loss-t szokták választani, ami nem rossz döntés, de két hátránya van :

  • ha túl közel van, akkor a visszateszteknél kiüti és ezzel megakadályozza a hosszabb trendekben való részvételt, jól lehet a veszteség is alacsony marad, de a nyereség is
  • ha túl messze van, akkor ugyan benne tudunk maradni a hosszú trendekben, de hosszú távon sajnos - a nagy távolság miatt - komoly veszteségeket termel. Ne felejtsük el, hogy a piac 30%-ban trendel csak, a többi részében oldalazik. 
Mi lehet a megoldás? 
Kockázatot kezelni úgy lehet, ha tudja az ember, miféle kockázatra kell felkészülnie. A fenti két hátrány az, ami a legkomolyabb kockázat, ha stop-loss-t használunk, ha nem használunk, akkor viszont fel kell készülni a teljes számla elvesztésére! 
Tehát, hogyan védekezhetünk a fenti két esetben? A válasz egyszerűnek tűnik, de persze nem az. Az egyik megoldás az, ha követő stopot használunk. 

Követő stop esetében a legkomolyabb kérdés természetesen az, hogy milyen távolságban legyen a stop vonal az árhoz viszonyítva, illetve az is fontos szempont, hogy mikor kezdjük el húzni a stopot az ár után. 
A távolság persze szubjektív, tehát egy adott devizapár esetén ki kell kísérletezni backtest-tel, esetleg meg lehet próbálni optimalizálni is. Nyilván két fontos tényező befolyásolja:
  1. az egyik a spread, 
  2. a másik pedig az, hogy mit enged meg a bróker legkisebb stop távolságnak (stoplevel paraméter).
Ha meg van a távolság, akkor már csak azt kell eldönteni, hogy mikor kezdjük el húzni a stop vonalat. Erre három lehetőségünk adódik :
  1. Az árfolyam pozitív elmozdulása esetén azonnal - itt ugyebár el tudjuk érni azt, hogy a veszteségünket a lehető legkisebbre csökkentsük, de ezzel persze csak ámítjuk magunkat, mert ezt a módszert akkor választjuk, ha túl messze van a stop az ártól. Nagyjából mindig lesz veszteség, kisebb-nagyobb, mert a stoplevel túlságosan magas, vagy az időtáv kicsi.
  2. Amikor az árfolyam pozitív irányba elmegy legalább egy spread-nyit, akkor nullába húzzuk (breakeven stop, azaz fedezeti stop) és innentől indulhat a stop húzás - ami jó módszer arra, hogy legrosszabb esetben veszteség és nyereség nélkül jöjjünk ki a pozícióból. Igen ám, de a legtöbb brókernél a stoplevel, azaz a minimális stop távolság jóval nagyobb, mint a spread, tehát ez nem minden esetben járható. Ráadásul a kezdeti stop távolság itt is fontos tényező.
  3. Amikor az árfolyam pozitív irányba mozdul el, több, mint egy spread-nyit, és már valamekkora nyereség is realizálható lenne (1:1 Risk reward esetén természetesen ez a nyereség meg kell egyezzen a stop-loss veszteségével és ez az ideális), akkor a stop vonalunkat behúzzuk a spread határára és onnan húzzuk az ár után, ahogy megy felfelé - ez szintén jó módszer lehetne, ha a 2-es pontban említett akadály nem állna fenn a bróker oldaláról. Ekkor ugyanis vagy nyereséges, vagy stop-loss-nyi veszteséges pozíciókat zárnánk, és ha jól választjuk meg a minimális nyereség mértékét, és a stratégiánk találati aránya 50%-nál jobb, akkor máris nyereséges stratégiát alkotottunk.
A fentiekből látható, hogy kulcs kérdés a jó bróker megválasztása, amikor is a spread-ek alacsonyak és természetesen a stoplevel is alacsony, vagy esetleg nincs. 
Persze azonnal rávágja mindenki, hogy ezek bizony az ECN brókerek, ahol persze magas összeggel lehet csak tőkét nyitni. Pedig bármilyen hihetetlen, vannak nem ECN brókerek, aki stoplevel nélkül (akár tized PIP-pel az ár alatt) engednek stop-loss vonalat húzni, alacsony a belépési tőke és a spread-ek sem eget verőek!

Ilyen bróker az LMAX Exchange is. Bátran ajánlom, jó feltételekkel lehet náluk számlát nyitni!

Van azonban a fenti három módszernél egy sokkal jobb módszer is, ha már sikerült jó brókernél számlát nyitni! A módszert az szülte, hogy nyilvánvalóan nehéz jó teszteket futtatni, hogy eltaláljuk az optimális stop távolságot, ami minden piaci helyzetben megállja a helyzetét.
Egy jó forex robot képes alkalmazkodni a piaci helyzethez és képesnek kell lennie olyan stop távolságokat számítani, ami minden esetben jó. Na jó, de hogyan?

Ha fix stop távolságot használ a robot, akkor ha túl kicsi, gyorsan kiüti az árfolyam. Ha túl nagy, akkor a veszteséges pozíció zárások lesznek többségben és elúszik a pénzünk. Ha teszteket futtatunk, akkor láthatóvá válik ez a probléma. Ezen egy rendkívül egyszerű módszerrel lehet úrrá lenni. Ha a piac trendel, akkor lehet nagy stop távolságokat hagyni, ha pedig oldalazik, akkor ajánlatos minél kisebbeket választani, és inkább stoppolódjunk ki, ha nem megy semerre sem a piac. 
Erre tökéletes megoldás a piac volatilitásának figyelése, amikor is az ATR indikátor siet a segítségünkre. Van persze, aki a Parabolic SAR-t használja, de saját tapasztalatom az, hogy a Parabolic későn reagál és sokszor nehéz jól paraméterezni, hogy megbízható stop-okat adjon. Ehelyett ha long pozíciót nyitunk, akkor az előzőleg bezárt gyertya kanóc aljára ráteszünk egy ATR értéket és annyival lejjebb húzzuk meg a stop-loss vonalunkat (mínusz a spread természetesen), short esetén természetesen a kanóc tetejére számolunk rá ATR-nyit (és még egy spread-nyit). Finomításképpen be lehet iktatni egy szorzót, amely tovább növelheti a stop távolságot, de többnyire ez felesleges, mert az ATR stop húzás kellőképpen igazodik a piachoz.
Ha trendel a piac, akkor kellő stop távolságot tart, hogy a visszatesztek és a counter trendek esetében ne csapja ki az árfolyam a stopot, de amikor oldalazásba kezd a piac, akkor a volatilitás is csökken, közelebb kerül a stop-loss és ha esetleg megfordul a trend, a lehető legkisebb veszteséggel tudjuk realizálni a profitot. 

Ez talán a lehető legjobb stratégia a kockázatkezelésre. Nyilván ez nem minden devizapárnál jön be, de a legtöbbnél igen. A legjobban fluktuáló piacok azok, ahol ezt kamatoztatni lehet, tehát a major párokra kell koncentrálnunk, és persze a lehető legkisebb spread-del rendelkező párokra.

Az MM másik aspektusa - a kockázatkezelés mellett - a nyereségek maximalizálása. A nyereségek maximalizálásának is többféle módja létezik, bár a közös bennük mindig az úgynevezett pozíció építés nevű technika.

Erről azonban a következő post-ban lesz szó, hamarosan!

Addig is gondolkodtatónak íme egy indikátor, amely a lehetséges ATR stop-okat mutatja a gyertyák felett és alatt.


 //+------------------------------------------------------------------+  
 //|                           ATRStop.mq4 |  
 //|                  Copyright © 2010, János Antal |  
 //|                 http://tozsdecapak.blogspot.com |  
 //+------------------------------------------------------------------+  
 #property copyright "Copyright © 2010, János Antal"  
 #property link   "http://tozsdecapak.blogspot.com"  
   
 #property indicator_chart_window  
 #property indicator_buffers 2  
 #property indicator_color1 DodgerBlue  
 #property indicator_color2 Red  
   
 extern  int  ATR=50;  
 extern  int  Multiplier=1;  
 extern  bool Body=0;  
   
 double UP[], DN[];  
   
 int init()  
 {  
   SetIndexStyle(0,DRAW_LINE,0,2);  
   SetIndexBuffer(0,UP);  
   SetIndexLabel(0,"UP");  
   
   SetIndexStyle(1,DRAW_LINE,0,2);  
   SetIndexBuffer(1,DN);  
   SetIndexLabel(1,"DN");  
 }  
   
 int start()  
 {  
   int  counted_bars=IndicatorCounted();  
   double _ATR;  
     
   int limit = Bars-counted_bars;  
     
   for(int i=0;i<=limit;i++)  
   {  
    _ATR=iATR(Symbol(),Period(),ATR,i);  
    if (!Body)  
    {  
      UP[i]=iHigh(Symbol(),Period(),i)+_ATR*Multiplier;  
      DN[i]=iLow(Symbol(),Period(),i)-_ATR*Multiplier;  
    }else  
    {  
      if (iOpen(Symbol(),Period(),i) > iClose(Symbol(),Period(),i))    // Piros gyertya  
      {  
       UP[i]=iOpen(Symbol(),Period(),i)+_ATR*Multiplier;  
       DN[i]=iClose(Symbol(),Period(),i)-_ATR*Multiplier;  
      }else if (iOpen(Symbol(),Period(),i) < iClose(Symbol(),Period(),i)) // Zöld gyertya  
      {  
       UP[i]=iClose(Symbol(),Period(),i)+_ATR*Multiplier;  
       DN[i]=iOpen(Symbol(),Period(),i)-_ATR*Multiplier;  
      }else if (iOpen(Symbol(),Period(),i) == iClose(Symbol(),Period(),i)) // Doji gyertya  
      {  
       UP[i]=iOpen(Symbol(),Period(),i)+_ATR*Multiplier;  
       DN[i]=iClose(Symbol(),Period(),i)-_ATR*Multiplier;  
      }  
    }  
   }  
 }  

És némi magyarázat a kódhoz :

  • ATR : ez természetesen az ATR indikátor periódus paramétere
  • Multiplier : ez az a bizonyos szorzó, egész szám! Ennyiszeresére szorozza fel a normál ATR értéket
  • Body : ha 0 értékre állítjuk, akkor a gyertya kanócokra számítja rá az ATR értéket, ha bármi másra, akkor gyertya testre számol rá ATR-nyit
A kék vonal a short pozíciók lehetséges stop-loss pontjait köti össze, a piros pedig a long-okét. Természetesen minden esetben az előző gyertyára számított értéket van értelme figyelembe venni, hiszen az aktuális gyertya még nem zárult be, vagyis folyamatosan változ(hat)nak az értékek.

Jó nézelődést!

kedd, április 23, 2013

Backtest - avagy a puding próbája

Egyik korábbi bejegyzésemben arról írtam, hogy a tesztelés egy igen fontos fázis, ha robotot készítünk.
A tesztelés nem túl egyszerű dolog, ugyanis ehhez teszt adatok kellenek. Korábban a NinjaTrader-rel próbálkoztam, de olyan nagyon megbízhatatlan adatokat szolgáltatott a teszteléshez, ami miatt a sokkal megbízhatóbb - és talán éppen ezért népszerűbb - MetaTrader-re nyergeltem át.

A FOREX robot tesztelésének egyik legfontosabb lépése a backtest. Nem kell megijedni ettől a szótól, csupán annyit jelent, hogy a múlt adatait alapul véve tesztelünk. A MetaTrader ebben is profibb társainál (habár biztosan lesz aki talál ettől is jobbat), ugyanis a múltbéli adatokat nem gyertyákként raktározza el, hanem tick-ekként, vagyis a múlt történései reprodukálhatók tick-ről tick-re.

Természetesen ez a rendszer sem hibátlan, de legalább korrigálhatók a hibák és egy olyan adatbázison tudunk tesztelni, ami a valósághoz a legközelebb áll.

Hozzátenném azonban, hogy a múlt béli adatokon végzett tesztek eredményei nem azt jelentik, hogy a jövőben is így fog teljesíteni a robot! Olyannyira nem, hogy előfordulhat az, hogy a backtest alkalmával fantasztikus eredményeket hoz a robot, de amikor az éles FOREX adatokon teszteljük, akkor sorra köti és zárja a vesztes pozíciókat. Természetesen a backtest statisztikailag bizonyítja FOREX robotunk működésének helyességét, de ez minden. A fontos az, hogy nem szabad nagyobb jelentőséget tulajdonítani a backtest-nek, mint ami valójában! Csak statisztikai teszt.

Viszont ez a statisztikai tesz igen sok hasznos információval szolgál arról, hogy az általunk kitalált stratégia életképes-e, egyáltalán vannak-e sikeres kötései, illetve ha veszteséges kötései vannak, akkor azok miért vannak, mennyi ilyen veszteséges kötés van egymás után, illetve milyen körülmények között történik.

Miért érdekesek ezek számunkra? Nagyon egyszerű a válasz. Azért, mert rájöhetünk a stratégiánk gyenge pontjára, amit a stratégia módosításával megszüntethetünk, de akár azt is láthatjuk belőle, hogy egy jó Money Management stratégiával hogyan lehet még több nyereségre szert tenni, esetleg a veszteséges stratégiát nyereségesbe átfordítani.

Nézzük hogyan is megy ez és mit láthatunk egy ilyen tesztből.
A tesztet a Stratégia Teszter menüpontban találjuk, a Nézet menüben (CTRL-R gyorsbillentyű). A grafikon alján meg is nyílik egy kis ablak, amiben néhány mezőt találunk.
Nézzük őket sorjában :
  • Expert Advisor - ez a mi kis programunk lesz, itt a legördülő menüből lehet kiválasztani a tesztelni kívánt robotot.
  • Szimbólum - Nos, itt pedig azt a devizapárt fogjuk tudni kiválasztani, amin a tesztet végre akarjuk hajtani.
  • Model - itt a szimuláció modelljét tudjuk kiválasztani, erről mindjárt kicsit bővebben beszélünk
  • Használat dátuma - itt mondhatjuk meg, hogy mely dátumtól mely dátumig történjen a teszt, illetve azt, hogy egyáltalán foglalkozzon-e a dátumokkal a teszter.
  • Visual mode - ha kipipáljuk, akkor látni fogjuk a szimulációt tick-ről tick-re és követhetjük mit művel a programunk. Itt van pár érdekesség, erről is beszélünk mindjárt.
  • Időszak - itt tulajdonképpen az időtávot választhatjuk meg, hogy 15 percesen, vagy 1 óráson, vagy valamelyik másik időtávon szeretnénk a tesztet végrehajtani.
  • Optimalizáció - ha optimalizálni szeretnénk, akkor ezt kell bepipálni. Ezt ne tegyük, ugyanis most backtest-telni fogunk.
  • Van egy-két nyomógomb is a jobb szélen, ezek közül a legfontosabb az Expert tulajdonságok, ahol a robotunk paramétereit adhatjuk meg úgy, mintha éppen most indítanánk éles rendszerben, de a rendelkezésre álló tőkét is beállíthatjuk, az optimalizálás paramétereit is, stb. (Az optimalizálás egy külön témakör, ezért erről most nem ejtünk szót)
  • Szimbólumok tulajdonságai - itt az adott devizapár chart-jára vonatkozó információkat láthatjuk - sajnos nem módosíthatjuk. Ez a bróker által meghatározott spread, swap, margin, stb. információk, tájékoztatásul.
  • Nyitott chart - ezzel a gombbal megnyithatjuk a chart-ot, ha nem visuális módban futattuk a tesztünket és megnézhetjük mi történt a teszt ideje alatt. 
  • Expert módosítás - egyértelmű, ez az átjáró a MetaEditor-ba.
A tesztet azután tudjuk elindítani, ha már mindent beállítottunk. Vizuális tesztelés során, látni fogjuk, hogyan mozog az árfolyam, illetve mikor milyen pozíciókat nyit az Expert-ünk. 

A tesztelés sebességét a kis csúszkával állíthatjuk, illetve dönthetünk úgy is, hogy kihagyjuk a vizuális megjelenítést, fusson végig a meghatározott időszakon a program és mutassa a tesztelés eredményeit.

A tesztelések eredménye azonban már más kérdés. 
Nyilvánvalóan érdekes látni azt, hogy az általunk fabrikált Expert követi az utasításainkat - és miért is ne tenné - tehát a pozíció nyitások akkor lép-e pozícióba, amikor a megfelelő jelet kapja, akkor zárja-e a pozíciót, amikor kell, stb.
A backtest természetesen erre is választ ad.

Feltételezzük azonban, hogy az Expert írója képes úgy megírni a programot, ahogy a robot kívánja, és a stratégia szerint nyit és zár pozíciót. Az igazi kérdés ilyenkor az, hogy maga a stratégia életképes-e!
Ez nyilván nem csak attól függ, hogy a pozícióba lépés és a pozíció zárás sikeres volt-e, de sokat nyom a latba.
Nézzük csak miről is van szó...

Robotunk stratégiáját ugye úgy találtuk ki, hogy bizonyos piaci körülményekre számítva nyitunk és zárunk pozíciót. A valódi kérdés az, hogy ezeket a piaci körülményeket sikerült-e úgy meghatározni, hogy nyertes pozíciót zárjunk a lehető legtöbb alkalommal. Mondok egy példát.

Tegyük fel, hogy olyan forex robotot készítünk, amely semmi mást nem figyel, csak azt, hogy az aktuális gyertyatrend végén (mondjuk 5 gyertyából álló lokális gyertyatrendeket figyelünk) van-e kulcsforduló gyertya. Ha van, akkor a lokális gyertyatrend megfordulására számítunk és a feltételezett fordulás irányba nyitunk pozíciót. Tehát trend irányba.
(valljuk be őszintén, hogy ez nem is egy rossz stratégia, sokan kereskednek ilyen egyszerű szabályok alapján, ráadásul minden tőzsdeiskolában tanítják ennek az egyedülálló gyertya alakzatnak az erősségét, jelentőségét)

Azt, hogy mennyire sikeres a robotunk sok tényező befolyásolja, a legbeszédesebb mérőszáma a számlaegyenleg változása. De ne csak ezt figyeljük. 
Egy forex robot esetében igen fontos információ a találati arány. Nézzük meg, mit is olvashatunk ki egy teszt eredményeiből!

Amikor a backtest lefutott, a Stratégia teszter alsó ablakában öt fület látunk.
Az első fülön a robot beállításait látjuk (Beállítások fül), a második fülön ar Eredmények-et, azaz a kötéslistát részletesen, a harmadig fül a Grafikon nevet kapta és tulajdonképpen a számla egyenlegünk változásait jeleníti meg a rendszer, negyedik fül a Jelentés-é, az ötödik pedig a Napló, ahol az Expert Advisor hibaüzeneteit találhatjuk meg.

Számunkra a Jelentés fülön található információk a lényegesek most! 
A legfontosabb információk közé tartozik a Modelling quality a jobb felső sarokban. Ez azt mondja meg, hogy a tesztelés során használt adatok milyen pontossággal felelnek meg a historikus adatoknak. Ez a mérőszám igen fontos, hiszen, ha ez nem elég magas szám, akkor a teszt komolysága kerül veszélybe. 
Alap esetben ez 25%, ami sajnos elégtelen! 50%-nál jobb értékre van szükség egy hihető teszthez, minél közelebb esik a 100%-hoz, annál megbízhatóbbak a jelentés eredményei. Azt, hogy hogyan lehet ezt a %-os arányt javítani, igen sok útmutatót találunk az interneten, erre most nem térnék ki, de meg kell említenem, hogy viszonylag egyszerű és ingyenes megoldásokkal fel lehet tornászni ezt a számot 90%-ra. 70% körüli értékkel már nyugodtan tesztelhetünk és hihetünk is a teszteknek.

A következő fontos információ a középen lévő Short pozíciók (won %) nevű adat, amely mellett rögtön ott van jobbra a Long pozíciók (won %) adat is és ne feledkezzünk meg a középső oszlopban lévő Nyereséges kereskedések (összes %-a) adatról sem! Ezek fogják megmondani, hogy valójában mennyire sikeres a stratégiánk, mekkora a találati arány! A short és long pozíciók találati arányát láthatjuk itt, illetve az összes (short és long) kötés találati arányát, ami a két előbbi átlaga. 
Ha ez az érték 50%, vagy e körüli, akkor egy átlagos stratégiát sikerült összeraknunk.
(és szeretném megjegyezni itt gyorsan, hogy például a gyárilag készített MACD Sample nevű Expert Advisor találati aránya az összes kötésre 90%!!! Érdekes, hogy maga a robot nem hoz komoly eredményeket ennek ellenére)

Ez a szám igazából azért fontos, hogy tudjuk, hogy a kitalált stratégiánk - azaz milyen jelre kötünk és zárunk pozíciót - hányszor "jön be" az aktuális piaci helyzetben. Minél magasabb ez a szám, annál inkább alkalmas a stratégia automatikus kereskedésre, forex robot készítésére. Ha ezek a számok 50%-nál alacsonyabbak, akkor inkább fél automatikus (semi-automatic) stratégiát építhetünk belőle! 
Tehát ha ez a szám alacsony, az még nem jelenti azt, hogy használhatatlan kereskedésre, csupán azt, hogy olyan feltételeket állítottunk fel, amely az esetek kevesebb, mint 50%-ban jön csak be, mint nyerő stratégia. Tehát tanuljuk meg helyén kezelni ezt az adatot.

Az előbbi információk beszédességét nagyban befolyásolja, hogy a teszt milyen időszakot ölel át. Minél nagyobbat, annál jobb. Ha tudunk egyben tesztelni mondjuk egy évet, akkor az a legjobb, hiszen egy év alatt igen sokféle gazdasági esemény fordul elő, amelyekre reagálnia kell a robotunknak! 
Fontos és meghatározó információ az is, hogy összesen hány kötés szerepelt a tesztben, hiszen nem mindegy, hogy 3 kötésből lett a robot 60%-os találati arányú, vagy 300 kötésből. Minél nagyobb az össz kötések száma, annál jobb és megbízhatóbb a teszt.
Ezt egyébként a jelentés bal oldalán az Összes kereskedés mellett látjuk majd!

Érdekes adat még az egymást követő sikeres ügyletek (a profit pénzben) és az egymást követő veszteséges ügyletek (a veszteség pénzben) adatok is. Ezek tulajdonképpen a sorozatban nyert és vesztett ügyletek számát mutatja, ahol igen fontos lehet adott stratégia esetében, hogy milyen arányban van e két szám. Természetesen minél nagyobb a sorozatban megnyert kötések száma a sorozatban elvesztett kötésekhez képest, annál jobb.

A fenti adatok sokat mondhatnak egy Expert Advisor teljesítményéről, ha nem csak a számla egyenleg értékét nézzük. Ugyanis ezek abban segítenek, hogy mit tegyünk még a robotunkhoz annak érdekében, hogy nyerhessünk vele. Esetleg mit változtassunk a stratégiánkon.

A stratégia megváltoztatásához annyit fűznék hozzá, hogy ez nem feltétlenül okos ötlet. Ugyanis, ha a legnagyobb veszteségeket kielemzi az ember a chart-on, akkor azt fogjuk a stratégiában kiküszöbölni és ezzel még több bonyodalmat okozunk robotunknak, az egyébként nyereséges szituációkra.
Tehát a stratégiához csak a legvégső esetben nyúljuk.

Sokkal okosabb ötlet a Money Management-hez nyúlni. Létezik olyan stratégia, amely 30%-os találati aránnyal rendelkezik, ennek ellenére nyereséges, nem is kicsit. Ezt természetesen a Money Management-nek köszönheti. Igen, egy alapvetően veszteséges stratégiát is nyereségessé lehet tenni egy jó Money Management-tel, a kérdés mindössze annyi, hogy érdemes-e azért a nyereségért bonyolult MM-et hozzá fejleszteni.

Fogok írni a MM különféle elgondolásairól,mert nagyon érdekes, ha az ember végig gondolja, mihez mit érdemes párosítani. Nem mindegy, hogy trend irányába kereskedünk, vagy trend ellen, és az sem mindegy, hogy mekkora a találati aránya a robotnak! Egy jó forex robot jó MM-el kell rendelkezzen!

kedd, április 16, 2013

Egy különleges - támasz ellenállás - indikátor forex robotokhoz

Ahogyan kifejlődött

Amikor tőzsdézni tanultam, sokat kellett küzdenem azzal, hogy mi számít völgynek és mi számít csúcsnak. Éppen ezért sokat gondolkodtam később egy olyan indikátoron, ami megjelöli nekem a csúcsokat és a völgyeket! Mindjárt rávilágítok arra is, hogy miért!

Sokat kísérleteztem, keresgéltem a neten, de sehogyan sem találtam olyan indikátort, amivel elégedett lettem volna, mert sokszor oda is rajzol egy indikátor völgyet és csúcsot, ahová én nem tenném. Viszont, ahová völgy és csúcs megjelölést tennék, oda meg nem tesz jelet!

Na de miért is probléma ez?
Rengeteg stratégiát néztem át az elmúlt évek során, különösen azért, hogy FOREX robotot készítsek belőle. A legtöbb stratégia indikátor betegségben szenved, mert több, mint 6 indikátort használnak, amelyek különféle kombinációi esetén nyitnak pozíciót, amit aztán még többféle kombináció esetében zár le.
A legtöbb stratégia az emberi megérzésre, intuícióra, vagy valami olyasmire hajaz, amiből aztán lehetetlen egy jól működő expert advisor-t összehozni!

Ezzel szemben, a leges-legegyszerűbb stratégiák, amelyekkel kézzel kereskedni is lehet, a támasz-ellenállás átlépésekre alapszik, és ezeket viszont nem nehéz leprogramozni, ha az ember kellő gyakorlatra tesz szert!
És itt jön a csúcs-völgy megállapítás problémája.

Az alapötlet rém egyszerű, ebből sikerült azután építkezni.
Hogyan állapítsunk meg völgyet és csúcsot, ez itt a kérdés. Amikor tanultam a tőzsdézés fortélyait, volt egy érdekes megállapítási "algoritmus", ami segített megtanulni a völgy és csúcs meghatározását. Ha ez nem megy, akkor felejtsük is el, hogy kézzel kereskedni fogunk valaha is!
Erre a "feladatra" az volt a "mankó", hogy feltettem a chart-ra egy 2-es és egy 6-os mozgóátlagot (Moving Average). Ezekkel kezdtem operálni. Ha a gyorsabb MA alulról felfelé keresztezi a lassabbat, akkor ott a közelben kell lennie egy völgynek, míg ha felülről lefelé keresztezi, akkor ott meg egy csúcsnak kell lennie valamerre a keresztezés előtt!

Amint ezt felfedeztem, már sokkal könnyebb volt a völgyeket és csúcsokat szubjektíven meghatározni. Igen ám, de ez kézi módszer, segít a kézi kereskedésben, de nem segít automatizáltan.
Egy olyan indikátorban kezdtem gondolkodni, amely megjelöli a csúcsokat és völgyeket, de jól is használható.

Végül sikerült összerakni! Nem sima vagy exponenciális mozgóátlagot használtam, hanem súlyozottat, és mellé tettem egy logikát, az indikátor kereszteződése után visszamenőleg a Highest() és a Lowest() függvénnyel megkeresi a legalacsonyabb pontot és a legmagasabb pontot  (highest high és lowest low logika). Ott lesznek a csúcsok és völgyek!

De hogy még jobban hangolható legyen a dolog, a Highest() és a Lowest() függvények vizsgálódási paraméterét - tehát, hogy hány gyertyára visszamenőleg keressék meg a csúcsot és völgyet - változtathatóra állítottam be, sőt, a mozgóátlagok paraméterét is!

Addig, amíg az indikátor nyilakkal bejelölte a csúcsot és völgyet, kézi kereskedéshez kiváló, de forex robot számára nem túl használható megoldás született. Sok a baj ezekkel a nyilakkal.
Robot számára valami egyszerűbb kell. Kitaláltam hát, hogy a Donchian channel mintájára elkészítem az indikátor "csatornásított" változatát, amelyben ugyanúgy három paraméterrel lehet meghatározni a tulajdonságát (MA-k és a Highest és Lowest függvények paraméterét).

Ez nagyon bejött! A csatornából kitörő gyertya azonnal jelzi a trend megindulását, a csatorna érintése viszont tökéletes megoldás oldalazás végig kereskedésére! A robotok is szeretik, mert egy határozott vonal átlépést sokkal könnyebb ellenőrizni programból, mint nyilakat keresgélni visszamenőleg X gyertyára!

Az indikátor neve : TopBottomChannel.
Paraméterei :
  • sens : alapérték 20, azt a gyertyaszámot adja meg, amelyen belül meg kell keresni a legmagasabb, vagy a legalacsonyabb pontját a gyertyatrendnek.
  • slowMA : alapérték 6, lassú mozgóátlag periódus ideje.
  • fastMA : alapérték 2, gyors mozgóátlag periódus ideje.
Lehet játszani a beállításokkal, de az alapértékek általában jók. M1-től fölfelé kereskedésre is lehet hazsnálni, mindjárt leírom hogyan.

Az indikátor :

 //+------------------------------------------------------------------+  
 //|                       TopBottomChannel.mq4 |  
 //|                  Copyright © 2009, Janos Antal |  
 //|                                 |  
 //+------------------------------------------------------------------+  
 #property copyright "Copyright © 2013, Janos Antal"  
 #property link   "http://tozsdecapak.blogspot.hu"  
   
 #property indicator_chart_window  
 #property indicator_buffers 2  
 #property indicator_color1 DodgerBlue  
 #property indicator_color2 Red  
   
 #include <stderror.mqh>  
 #include <stdlib.mqh>  
   
 #include <WinUser32.mqh>  
   
 #import "user32.dll"  
   int RegisterWindowMessageA(string lpstring);  
 #import  
   
 #define CHART_CMD_UPDATE_DATA  33324  
   
 extern int sens = 20;  
 extern int slowMA = 6;  
 extern int fastMA = 2;  
   
 double top[], bottom[];  
 int bar;  
 int hwnd = 0;  
 //+------------------------------------------------------------------+  
 //| Custom indicator initialization function             |  
 //+------------------------------------------------------------------+  
   
 int UpdateChartWindow()  
 {    
   if(hwnd == 0) {  
    //Megkeressük a chart window-t az update-eléshez  
    hwnd = WindowHandle(Symbol(), Period());  
   }  
   if(hwnd!= 0) {  
    if (IsDllsAllowed() == false) {  
      //DLL calls engedélyezve kell legyen  
      Print("Dll calls must be allowed");  
      return (-1);  
    }  
    if (PostMessageA(hwnd,WM_COMMAND,CHART_CMD_UPDATE_DATA,0) == 0) {  
      //Nem sikerült, bezárult az ablak  
      hwnd = 0;  
    } else {  
      //Sikerült  
      int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");  
      PostMessageA(hwnd,MT4InternalMsg,2,1);       
      return (0);  
    }  
   }  
   return (-1);  
 }  
   
 int init()  
  {  
   SetIndexStyle(0,DRAW_LINE,0,2);  
   SetIndexBuffer(0,top);  
   SetIndexLabel(0,"Top");  
   SetIndexArrow(0,241);  
   
   SetIndexStyle(1,DRAW_LINE,0,2);  
   SetIndexBuffer(1,bottom);  
   SetIndexLabel(1,"Bottom");  
   SetIndexArrow(1,242);  
   return(0);  
   bar=0;  
  }  
 //+------------------------------------------------------------------+  
 //| Custom indicator deinitialization function            |  
 //+------------------------------------------------------------------+  
 int deinit()  
  {  
 //----  
     
 //----  
   return(0);  
  }  
 //+------------------------------------------------------------------+  
 //| Custom indicator iteration function               |  
 //+------------------------------------------------------------------+  
 int start()  
 {  
   int  counted_bars=IndicatorCounted();  
   int bi;  
   int ti;  
   int index,i,j;  
   double FMWA1, FMWA2, SMWA1, SMWA2, t,b;  
       
   if(counted_bars<0) return(-1);   
   if(counted_bars>0) counted_bars--;   
     
   int limit = Bars-counted_bars;  
     
   if (bar == Bars)  
   {  
    return;  
   }else  
   {  
    bar=Bars;  
   }  
     
   if (limit < 1500)  
    limit=1500;  
   
   for(i=limit;i>0;i--)  
   {  
    FMWA1=iMA(NULL,0,slowMA,0,MODE_LWMA,PRICE_CLOSE,i);  
    FMWA2=iMA(NULL,0,slowMA,0,MODE_LWMA,PRICE_CLOSE,i-1);  
    SMWA1=iMA(NULL,0,fastMA,0,MODE_LWMA,PRICE_CLOSE,i);  
    SMWA2=iMA(NULL,0,fastMA,0,MODE_LWMA,PRICE_CLOSE,i-1);  
      
    top[i]=GlobalVariableGet("Top"+Symbol()+Period());  
    bottom[i]=GlobalVariableGet("Bottom"+Symbol()+Period());      
              
    if (SMWA1 > FMWA1 && SMWA2 < FMWA2)            
    {  
      bi=iLowest(Symbol(),Period(),MODE_LOW,sens,i);  
      b=Low[bi];  
      for(j=0;j<=bi;j++)  
      {  
       bottom[j]=b;  
      }  
      GlobalVariableSet("Bottom"+Symbol()+Period(),b);  
    }  
      
    if (SMWA1 < FMWA1 && SMWA2 > FMWA2)            
    {  
      ti=iHighest(Symbol(),Period(),MODE_HIGH,sens,i);  
      t=High[ti];  
      for(j=0;j<=ti;j++)  
      {  
       top[j]=t;  
      }  
      GlobalVariableSet("Top"+Symbol()+Period(),t);      
    }   
   }  
     
   UpdateChartWindow();  
 }  

Kereskedés

Az időtáv gyakorlatilag bármi lehet, M1-től D1-ig, bár azt meg kell mondjam, hogy magasabb időtávon biztosabb a jel, de aki tőzsdézik, jól tudja ezt.

Trendben
Pozíció nyitás : amikor az alsó vonal alatt zár egy gyertya, short pozíció nyitása, illetve ha a felső vonal fölött zár a gyertya, akkor long. Stop-loss lehet az átlépés helye, vagy a korábbi völgy, azaz a csatorna alja.

Pozíció zárás: több megoldás működhet, nekem ami eddig legjobban bejött, az az, ha mondjuk a felső vonal fölött zár a gyertya, megnyitom a long-ot, majd az árfolyam elkezd felfelé mozogni. Amikor visszateszt, vagy counter trend kezdődik, létrejön egy újabb mozgóátlag keresztezés, és a TopBottomChannel felső vonala felugrik. Na ekkor zárom a a long-ot. Short-nál ugyanígy, csak ellentétes irányban természetesen.
Másik megoldás egy követő stop, ami lehet ATR alapú (ha a bróker enged közeli stopokat), vagy lehet fix. Lehet nullába húzós (break even stop) is, majd ezután indul a követő stop húzás. 

Oldalazásban
Pozíció nyitás : amikor a csatorna vonala "ugrik", akkor detektálja a mozgóátlagok kereszteződését. Ekkor általában "megérinti" a csatorna tetjét, vagy az alját egy gyertya, de nem lépi át (oldalaz). Ekkor érdemes trend irányú pozíciót nyitni! Tehát ha a felső vonal "ugrott", akkor short, mert már lefelé megy az árfolyam, ha a pedig az alsó vonalat érinti, akkor long. Stop-loss lehet a csatorna vonal maga, célárnak pedig meg lehet jelölni a másik csatorna vonalát.

Pozíció zárás : amikor eléri az ár az alsó csatornát, akkor céláron, vagy kézzel ott. Esetleg követő stop, de ez rosszabb hatásfokkal működik. 

Sok sikert a kereskedéshez!