MQL4 könyv    Egy szokásos program létrehozása  A kereskedési kritériumokat meghatározó függvény

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.
A legtöbb esetben, ha kapunk egy kereskedési ismertetőjelet az kizárja bizonyos másik ismertetőjelek meglétét. Például, ha egy Buy megbízás nyitásának az ismertetőjelei fennállnak egy bizonyos pillanatban, ez azt jelenti, hogy nem lehetnek ugyanakkor Buy záró vagy Sell nyitó ismertetőjelek (lásd: A kereskedés feltételeinek összefüggése). 

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.