A kereskedési kritériumokat meghatározó függvény
Bármilyen kereskedő stratégia sikere főleg attól a programrésztől függ, ahol a kereskedési kritériumokat feldolgozzuk. Az a függvény, ami kereskedési jelzéseket szolgáltatja, egy program legfontosabb része és szünet nélkül használni kell. A függvény visszaadott értékeknek kell szolgáltatnia a stratégia szerinti kereskedelmi kritériumokat.
Általános esetben a következő kritériumokat határozhatjuk meg:
- egy megbízás megnyitásának a szempontja;
- egy megbízás zárásának a szempontja;
- ismertetőjel egy megbízás részleges zárására;
- az ellentét megbízások zárásának feltételei;
- egy megbízás kért stop szintjeinek módosítási szempontjai;
- egy függőben levő megbízás elhelyezésének a szempontja;
- egy függőben levő megbízás törlésének a szempontja;
- egy függőben levő megbízás kért nyitó ára módosításának a szempontja;
- egy függőben levő megbízás kért stop szintjei módosításának a szempontja.
Ugyanakkor, a kereskedési szabályok szerint, a kereskedési stratégiával összhangban, bizonyos féle különböző ismertetőjelek egyidejűleg is létrejöhetnek. Például, egy Sell megbízás befejezésének, és egy függőben levő BuyStop megbízás módosításának szükségessége egyidejűleg is jelentkezhet.
A kereskedési stratégia meghatározza a kereskedési kritériumokat meghatározó függvény tartalmára és használatának technológiájára vonatkozó követelményeket. Minden függvény csak egy értéket küldhet vissza. Tehát, ha az Expert Advisorban megvalósítunk egy kereskedő stratégiát, a függvény által visszaadott érték csak egy ismertetőjel meglétét jelezheti, és kölcsönösen kizárja más ismertetőjelek használatát. Azonban, ha a stratégia megengedi különféle ismertetőjelek egyidejű kezelését, azok értékeiket másik függvényekben kell létrehozni és feldolgozni, ezért globális változókat kell használni.
A lenti EA-ban megvalósított kereskedő stratégia egyetlen kölcsönösen kizárólagos ismertetőjelet használ. Ezért az itt bemutatott Criterion() függvény által visszaküldött kritériumokat használják a többi függvények.
Criterion() felhasználói függvény
int Criterion()
A
függvény a kereskedési
kritériumokat határozza meg. A következő
értékeket küldheti vissza:
10 – jelzés a Buy megbízás
nyitása feltételeinek
meglétéről;
20 – jelzés a Sell megbízás
nyitása feltételeinek
meglétéről;
11 – jelzés a Buy megbízás
zárása feltételeinek
meglétéről;
21 – jelzés a Sell megbízás
zárása feltételeinek
meglétéről;
0 – nincsenek rendelkezésre
álló fontos ismertetőjelek;
-1 – nem az EURUSD szimbólumot
használjuk.
A
függvény a következő külső
változók értékeit
használja:
St_min - a Stochastic Oscillator indikátor alacsonyabb
szintje;
St_max - a Stochastic Oscillator indikátor magasabb szintje;
Open_Level - a MACD indikátor szintje (a
megbízás nyitásához);
Close_Level - a MACD indikátor szintje (a
megbízás
zárásához).
Az üzenetek megjelenítéséhez használja az Inform() adatfüggvényt. Ha az Inform() függvényt nem tartalmazza az EA, az üzenetek nem fognak megjelenni.
A Criterion() kereskedési kritériumokat meghatározó függvény a Criterion.mqh include fájlban megvalósítva://-------------------------------------------------------------------------
// Criterion.mqh
// The code should be used for educational purpose only.
//-------------------------------------------------------------------- 1 --
// Function calculating trading criteria.
// Returned values:
// 10 - opening Buy
// 20 - opening Sell
// 11 - closing Buy
// 21 - closing Sell
// 0 - no important criteria available
// -1 - another symbol is used
//-------------------------------------------------------------------- 2 --
// External variables:
extern int St_min=30; // Minimum stochastic level
extern int St_max=70; // Maximum stochastic level
extern double Open_Level =5; // MACD level for opening (+/-)
extern double Close_Level=4; // MACD level for closing (+/-)
//-------------------------------------------------------------------- 3 --
int Criterion() // User-defined function
{
string Sym="EURUSD";
if (Sym!=Symbol()) // If it is a wrong symbol
{
Inform(16); // Messaging..
return(-1); // .. and exiting
}
double
M_0, M_1, // Value MAIN at bars 0 and 1
S_0, S_1, // Value SIGNAL at bars 0 and 1
St_M_0, St_M_1, // Value MAIN at bars 0 and 1
St_S_0, St_S_1; // Value SIGNAL at bars 0 and 1
double Opn=Open_Level*Point; // Opening level of MACD (points)
double Cls=Close_Level*Point; // Closing level of MACD (points)
//-------------------------------------------------------------------- 4 --
// Parameters of technical indicators:
M_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); // 0 bar
M_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,1); // 1 bar
S_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);//0 bar
S_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);//1 bar
St_M_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN, 0);
St_M_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN, 1);
St_S_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);
St_S_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);
//-------------------------------------------------------------------- 5 --
// Calculation of trading criteria
if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)
return(10); // Opening Buy
if(M_0<S_0 && M_0>Opn && St_M_0<St_S_0 && St_S_0>St_max)
return(20); // Opening Sell
if(M_0<S_0 && M_0>Cls && St_M_0<St_S_0 && St_S_0>St_max)
return(11); // Closing Buy
if(M_0>S_0 && -M_0>Cls && St_M_0>St_S_0 && St_S_0>St_min)
return(21); // Closing Sell
//-------------------------------------------------------------------- 6 --
return(0); // Exit the user-defined function
}
//-------------------------------------------------------------------- 7 --
Az 1-2 blokkban a függvény visszatérési értékeit ismertetjük. A 2-3 blokkban néhány külső változót deklarálunk. Ebben az EA-ban egyedül a Criterion.mqh include fájl használja a szóban forgó (ebben az esetben külső) globális változókat. Az Egy szokásos program szerkezete részben található egy érvelést, hogy kivétel nélkül minden globális változót a különálló Variables.mqh fájlban célszerű deklarálni. Ebben az esetben a külső változókat a Criterion.mqh fájlban deklaráltuk, amit két okkal is megindokolunk: az első hogy demonstráljuk, hogy ez technikailag lehetséges (ez nem mindig lehetséges); a második, hogy bemutassuk hogyan használjuk a külső változókat hibaelhárításnál/ program tesztelésnél.
Technikailag lehetséges a külső változókat a Criterion.mqh fájlban deklarálni, mert ezeket a változókat nem használjuk a program semmilyen másik függvényében. A külső változók értékeit a 2-3 blokkban deklaráljuk, hogy a Stochastic Oscillator és MACD indikátorok ezeket az értékeket használják a szóban forgó Criterion() függvényben. Ésszerű lehet a kereskedő kritériumokat meghatározó függvény változóit ideiglenesen külső változóként deklarálni, ezzel megkönnyítve a hibaelhárítást és a változók értékeinek az optimalizálását. E célból más külső változókat adhatunk hozzá a programhoz, például optimalizálhatjuk az indikátorok paramétereit (ebben az esetben az állandók értékeit a MACD-nál 12,26,9 a Stochastic Oscillátornál 5,3,3 értékre állítjuk be). A kódolás végén törölhetjük ezeket a külső változókat a programból és lecserélhetjük őket az optimalizálás alatt meghatározott állandókra.
A 3-4 blokkban, létrehozzuk és leírjuk a helyi változókat. Az Expert Advisort az, EURUSD szimbólumon kívánjuk használni, ezt a 3-4 blokkban ellenőrizzük. Ha az EA-t egy másik szimbólum ablakában indítjuk el, a függvény befejezi a működését és -1 értékét (hibás szimbólum) küld vissza.
A programban két indikátornak az aktuális és előző báron számolt értékeit számoltak használjuk (4-5 blokk). Általában, amikor a Stochastic Oscillator és MACD indikátorokat használjuk, azt tekintjük kereskedési jelzésnek, amikor a két indikátorvonal találkozik egymással. Ebben az esetben egyidejűleg használunk két indikátort a kereskedési ismertetőjelek meghatározásához. Két indikátor indikátorvonalainak az egyidejű kereszteződésének a valószínűsége meglehetősen alacsony. Sokkal valószínűbb, hogy az egyik vagy másik indikátor kicsit késik. Ha az indikátorvonalak kereszteződése egy rövid időszakon belül történik, akkor elfogadjuk, hogy a két indikátor kialakított egy kereskedési ismertetőjelet.
Például, lent megmutatjuk a vételi megbízás kereskedési szempontjának kialakítását (5-6 blokk):
if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)
E szerint a sor szerint, a vételi megbízás feltételei fennállnak, ha a következő feltételek teljesülnek:
- A MACD indikátorban a MAIN (hisztogram) indikátorvonal, a SIGNAL indikátorvonalat alulról fölfelé metszi az Open_Level szintje alatt (157. ábra);
- Stochastic Oscillator indikátorban az St_min alatti tartományban alulról fölfelé keresztezi MAIN indikátorvonalat a SIGNAL indikátorvonal (158. ábra).
Рис. 157. Necessary condition of MACD indicator line positions to
confirm the importance of trading criteria for opening and closing of
orders.
157.ábra. A MACD indikátorvonalak helyzetének elemzése a kereskedési ismertetőjelek meghatározásához.
A 157. ábra bal oldali részében a MACD indikátorvonalak azon helyzetét láthatjuk, amikor két ismertetőjelet adnak: Buy megbízás nyitására és Sell zárására. A MAIN indikátorvonal a 0.0005-ös szint alatt van a T1 = t 1 - t 0 időintervallumban. Ha a Stochastic Oscillator kereskedelmi jelzése ezen az időintervallumon belül történik, akkor azt Buy megbízás nyitására vonatkozó kereskedelmi jelzésként értékeljük. A MAIN indikátorvonal a T2 = t 2 - t intervallumban a 0.0004-es szint alatt van. Ha Stochastic Oscillator jelei megerősítik ezt a pozíciót, akkor az a Sell megbízás befejezésének szükségességét jelzi.
Jegyezd meg, formálisan a T1időintervallumon belül két ismertetőjelet kapunk (ha azt a Stochastic Oscillator megerősítette). A Criterion() függvény, mint már említettük, csak egy értéket küldhet vissza, egyszerre csak egyféle kereskedelmi jelzést adhat. Ez alatt az időszak alatt szükségessé válik, hogy kiválasszuk a két ismertetőjel közül az egyiket. Ezt a feladatot előre, a programozás alatt oldjuk meg a kereskedési stratégia által meghatározott prioritások alapján.
Ebben az esetben (a szóban forgó kereskedési stratégia szerint), a Buy megbízás nyitásának a prioritása magasabb, mint a Sell megbízás befejezésének. Ezért, az 5-6 blokkban, azt a programsort, amiben a Buy megbízás megnyitásának a szempontjait értékeljük, fentebb helyezzük el. Ha T1 időszaka alatt a Stochastic Oscillatortól megerősítést kapunk (157. ábra), a függvény 10-es értéket küld vissza, amit ehhez az ismertetőjelhez társítottunk. A t1- t2 időszakon belül a függvény 21-et fog visszaküldeni, ami a Sell megbízás zárásának ismertetőjele.
Ugyanakkor a kereskedelmi függvény végrehajtása során kialakítjuk a szükséges kereskedelmi kéréseket. A Buy nyitását jelző ismertetőjel megjelenésekor először is minden elérhető Sell megbízás bezárására irányuló kereskedelmi kéréseket fogunk kialakítani. Amint ilyen megbízásaink már nincsenek, egy Buy megbízás megnyitását fogjuk kérni. Illetőleg, amikor a Sell megbízás zárásának a feltételei érkeznek el, akkor minden egyes Sell megbízást bezárunk (Buy megbízás nyitása nélkül) (lásd: Kereskedelmi függvények).Azokat a feltételek, amelyek alapján a Stochastic Oscillator megerősíti a kereskedelmi jelzést, láthatjuk a 158. ábrán.
158. ábra. A Stochastic Oscillator
indikátorvonalak
elhelyezkedése megerősíti a vételi
vagy eladási kritériumokat.
Az 5-6 blokkban elhelyezett programkód szerint, a Buy megnyitásának és Sell zárásának a feltételei bekövetkeznek, ha a MAIN indikátorvonalat a Stochastic Oscillatorban alulról keresztezi a SIGNAL vonal, miközben a MAIN vonal a St_min minimális szint alatt van. A 158. ábrán ezek a feltételek a T2 időszakon belül teljesülnek. A fenti feltételek tükörképe a Sell nyitásának és a Buy zárásának feltétele (a 158. ábra jobb oldalán). Ha nincs ismertetőjel, a függvény 0-t küld vissza. Más kereskedelmi kéréseket végrehajthatunk az alatt az időszak alatt, például: módosíthatjuk a stop szinteket.
Megfigyelhető, hogy a szóban forgó kereskedési stratégia a MACD indikátort 1 órás időkereten használja, míg a Stochastic Oscillatort 15 perces idő kereten. Az idő keretet a tesztelés során megváltoztathatjuk, hogy optimalizáljuk a stratégiát. Azonban a tesztelés után Criterion() függvény végső kódjában azokat az állandó paramétereket kell megadni, amelyekkel (külső változóként) a legjobb tesztelési eredményt kaptuk. Az EA-t csak a létrehozásakor megadott paraméterekkel lehet használni. A fenti példában (PERIOD_H1 és PERIOD_M15 értékeivel, amelyeket az indikátorokban beállítottunk), az EA ezeket a paramétereket fogja használni az EA szimbólumablakának aktuális időkeretétől függetlenül.
Figyelem!
Azokat a kereskedési kritériumokat, amelyeket az adott EA –ban alkalmaztunk, csak szemléltetésre használtuk, és nem tekinthető egy valódi számlán történő kereskedési útmutatónak.