Radu MetaTrader a blogja | További ingyenes és hasznos eszközök MetaTraderhez | Kérdésed merült fel? Kérdezz!
MQL4 Könyv tartalomjegyzék | Stratégiák programozása MetaTrader platformra | Fogalomtár | Gyakran Ismételt Kérdések

MQL4 könyv   Egyszerű MQL4 programok     ROC egyéni indikátor (Price Rate of Change)


ROC egyéni indikátor (az árarány változása)

 

Közismert, hogy minden indikátor legfontosabb feladata, hogy segítsenek egy kereskedőnek tájékozódni a  ármozgásban és bizonyos mértékig előre jelezzék a jövőbeli ármozgást. Megfelelő tapasztalattal lehet kereskedni például a Moving Average változásának jellege alapján is, egyszerűen követni kell az irányát. Mindazonáltal, Moving Average csak általában tükrözi vissza a piaci árváltozások dinamikáját mert van egy nagyon komoly hátránya: a lemaradás. Az itt leírt ROC indikátornak, egy egyszerű MA-val összehasonlítva van néhán előnyös tuajdonsága: kisebb a lemaradása  és szemléletesebb.

Lássuk, hogy a MA-k különböző átlagolt időszakkal hogyan jellemezik az ármozgásokat! 125. ábrán láthatunk két ilyen indikátorvonalat: a piros MA periódusa 21 bár és a kék MA periódusa 5 bár. Láthatjuk, hogy a kisebb átlagolt időszakú MA közelebb van az árfolyamhoz és kisebb lemaradása van. Azonban nehéz a piac jellemzésére használni ezt a vonalat, mert túl hullámos, nagyon gyakran változtatja meg az irányát és így sok hamis jelet ad. Az MA egy nagyobb átlagolt időszakkal nem annyira hullámos, nem fog olyan sokat hamis jelzést adni, de van egy másik hátránya – nagyobb a lemaradása.


125. ábra. Indikátorvonalak: MA(21) - piros, MA(5) - kék, ROC - narancs.

A harmadik vonal a 125. ábrán az árváltozás indikátor (narancs). Ennek az indikátorvonalnak mindkét MA-val összehasonlítva van egy látható előnye:  kicsi a lemaradás és simább. Nézzük meg ezt a vonalat  alaposan!

Ezt az indikátorvonalat az MA(21) változás arányának alapján építjük föl. Az A-B szakaszon az MA változás aránya nő. Ez azt jelenti, hogy ezen a szakaszon az MA mindegyik pontja nemcsak egyszerűen magasabb, mint az előző, de a pontok közötti különbség is növekszik. Például, ha a 271indexszel rendelkező báron az MA(21) értéke 1.3274 volt,  a 272 indexű báron  1.3280, és a 273 indexű báron 1.3288, a 271-es és 272 indexű bárok MA értékei közötti különbég 6 pont, míg a 272 és 273 bárok között 8 pont. Így MA nem egyszerűen nő, de a változás aránya  szintén növekszik. Az (A-B) szakaszon az MA változás aránya növekedési görbéjének bármelyik kis része leírható a görbére felülről illesztett r1 sugarú kör részeként.

Ahogy MA megközelít a B görbületi pontot, a körnek a sugara, ami leírja az utolsó szakaszt nől és a B pontban végtelen lesz.  B pontban az MA egy egyenes vonallá változik, amit a növekedés állandó arányát jelzi, ezért a narancssárga vonal növekedése abbamarad. A  B-C szakaszon az MA növekedése lelassul, de tovább folytatódik. Bár az MA továbbra is növekszik de egyre csökkenő sebességgel, mivel az MA növekedési aránya csökken a V görbe is csökkenni fog. Ezen a szakaszon az MA vonalának bármilyen kicsi töredék leírható a görbére alulról illesztett r2 sugarú körrel.

A C pontban az MA növekedése megszűnik, a növekedés sebessége egyenlő nullával. Ebben a példában a piros MA vonalat támaszvonalként használjuk. Itt a támasz MA fogalmát részletezni kell. Bármilyen grafikon szokásos ábrázolására általában a Descartes-féle koordináta-rendszert használjuk, és az alapvonalként az X tengelyt használjuk. Ez esetben alapvonalként nem egy egyenes tengelyt használunk, hanem egy bizonyos időszakkal átlagolt MA-t (ebben az esetben MA (21), piros vonal), és azt támasz MA-nak nevezzük. Az MA változásának aránya egyenlő a piros MA és a narancssárga V közötti különbséggel. Ha a narancssárga vonal az MA fölött van, az MA sebessége pozitív; ha alatta negatív, és amikor V keresztezi az MA-t az MA növekedés aránya egyenlő nullával. A C-D szakasz hasonló az A-B szakaszhoz, de a MA növekedési sebessége negatív érték.

Egy fontos mozzanat, hogy MA az egész E-C időszak alatt nő, amíg V egy meghatározott K pontban irányt változtat.  A vizuális elemzés megmutatja, hogy a ROC indikátorvonal egyértelműben jelzi a csúcsokat és az aljakat a charton mint az MA.

Az MA változás arányán alapuló indikátor kiszámítására egyszerű technológiát használunk. A változás aránya egy olyan tört érték melynek a számlálójában a meghatározott idő alatt bekövetkező MA változás a paraméter, a nevezője pedig az idő, ami alatt ez a paraméter változik. Ennek az indikátornak a vonatkozásában (lásd 126. ábrát) ez az MA_c (aktuális MA érték) és MA_p (előző érték) közti különbsége, és az időköz, ami alatt a változás megtörténik egyenlő Bars_V-vel. Határesetben a változás arányát az egymást követő bárokra számoljuk ki, ez esetben a nevező 1, tehát elhagyható, ekkor az árváltozás aránya az MA_c és MA_p, vagyis az aktuális és az előző báron számolt értékek közötti különbség.


126. ábra. Paraméterek a ROC indikátorvonal kiszámitásához.

A vizsgált egyéni indikátorban összesen 6 indikátorvonalat számolunk ki. A Line_0[] indikátortömb tartalmazza a támasz MA értékeit, ez a kiindulási alap minden más indikátorvonal építéséhez. Következő három indikátortömb (Line_1[], Line_2[] és Line_3[]) különböző átlagolt időszakú MA-k árváltozási arányait  tartalmazzák. A Line_4[] indikátortömb a (Line_1[], Line_2[] és Line_3[]) számtani átlaga, és a Line_5[] szintúgy egy átlag vonalat hoz létre, de csillapított kilengésekkel.

Mikor a kereskedő kereskedelmi döntéseket hoz akkor nem csak az aktuális időkeretet figyeli, de általában számításba veszi a legközelebbi időkereteket is. Hogy jobban megértsük azt, hogy a három ROC indikátorvonal hogyan épül föl, fordítsuk a figyelmünket a következő tényre. Egy bizonyos időszakkal átlagolt MA egy bizonyos időkeretben visszatükrözi a nagyobb időkeretbeni MA-t, ha a nagyobb időkeretben az átlagolt periódusok számát annyiad részére csökkentjük, ahányszorosan az időkeret nagyobb. Például, az M30 időkeretben 400 periódussal átlagolt MA visszatükrözi a  H1 időkeret 200 periódussal átlagolt, és a H4 időkeret 50 periódussal átlagolt MA-ját, és így tovább. Bár lesz valamilyen eltérés, amit  a kisebb időkereteken rendelkezésre álló nagyobb adat mennyiség okoz. Azonban a legtöbb esetben ez a pontatlanság elfogadhatóan kicsi.

A narancssárga vonal, amit az Line_1[] indikátortömb alapján építetünk, visszatükrözi az árváltozást az aktuális időkereten. A zöld vonal Line_2[] visszatükrözi (az aktuális idő keretben) azt az értéket, amit a narancssárga vonal jelenítene meg, ha a közelebbi nagyobb idő keretben alkalmaznánk az indikátort. A barna vonal mutatja az aktuális időkeretben azt az értéket, amit a narancssárga mutatna az aktuálisnál kettővel nagyobb időkereten. Így a leírt ROC indikátort használva három vonalat láthatunk egy ábrán – amely vonalak visszatükrözik az ár változását az aktuális időkeretben valamint a két legközelebbi nagyobb időkeretben.


roc.mq4 (Price Rate Change) egyéni indikátor az aktuális időkeretben, a legközelebbi nagyobb és a következő még nagyobb időkeretben.

//--------------------------------------------------------------------
// roc.mq4 (Priliv)
// The code should be used for educational purpose only.
//--------------------------------------------------------------------
//--------------------------------------------------------------- 1 --
#property copyright "Copyright © SK, 2007"
#property link      "http://AutoGraf.dp.ua"
//--------------------------------------------------------------------
#property indicator_chart_window    // Indicator is drawn in the main window
#property indicator_buffers 6       // Number of buffers
#property indicator_color1 Black    // Line color of 0 buffer
#property indicator_color2 DarkOrange//Line color of the 1st buffer
#property indicator_color3 Green    // Line color of the 2nd buffer
#property indicator_color4 Brown    // Line color of the 3rd buffer
#property indicator_color5 Blue     // Line color of the 4th buffer
#property indicator_color6 Red      // Line color of the 5th buffer
//--------------------------------------------------------------- 2 --
extern int History    =5000;        // Amount of bars for calculation history
extern int Period_MA_0=13;          // Period of supporting MA for cur. timefr.
extern int Period_MA_1=21;          // Period of calculated MA
extern int Bars_V     =13;          // Amount of bars for calc. rate
extern int Aver_Bars  =5;           // Amount of bars for smoothing
extern double K       =2;           // Amplifier gain
//--------------------------------------------------------------- 3 --
int
   Period_MA_2,  Period_MA_3,       // Calculation periods of MA for other timefr.
   Period_MA_02, Period_MA_03,      // Calculation periods of supp. MAs
   K2, K3;                          // Coefficients of timeframe correlation
double
   Line_0[],                        // Indicator array of supp. MA
   Line_1[], Line_2[], Line_3[],    // Indicator array of rate lines
   Line_4[],                        // Indicator array - sum
   Line_5[],                        // Indicator array - sum, smoothed
   Sh_1, Sh_2, Sh_3;                // Amount of bars for rates calc.
//--------------------------------------------------------------- 4 --
int init()                          // Special function init()
  {
   SetIndexBuffer(0,Line_0);        // Assigning an array to a buffer
   SetIndexBuffer(1,Line_1);        // Assigning an array to a buffer
   SetIndexBuffer(2,Line_2);        // Assigning an array to a buffer
   SetIndexBuffer(3,Line_3);        // Assigning an array to a buffer
   SetIndexBuffer(4,Line_4);        // Assigning an array to a buffer
   SetIndexBuffer(5,Line_5);        // Assigning an array to a buffer
   SetIndexStyle (5,DRAW_LINE,STYLE_SOLID,3);// line style
//--------------------------------------------------------------- 5 --
   switch(Period())                 // Calculating coefficient for..
     {                              // .. different timeframes
      case     1: K2=5;K3=15; break;// Timeframe M1
      case     5: K2=3;K3= 6; break;// Timeframe M5
      case    15: K2=2;K3= 4; break;// Timeframe M15
      case    30: K2=2;K3= 8; break;// Timeframe M30
      case    60: K2=4;K3=24; break;// Timeframe H1
      case   240: K2=6;K3=42; break;// Timeframe H4
      case  1440: K2=7;K3=30; break;// Timeframe D1
      case 10080: K2=4;K3=12; break;// Timeframe W1
      case 43200: K2=3;K3=12; break;// Timeframe MN
     }
//--------------------------------------------------------------- 6 --
   Sh_1=Bars_V;                     // Period of rate calcul. (bars)
   Sh_2=K2*Sh_1;                    // Calc. period for nearest TF
   Sh_3=K3*Sh_1;                    // Calc. period for next TF
   Period_MA_2 =K2*Period_MA_1;     // Calc. period of MA for nearest TF
   Period_MA_3 =K3*Period_MA_1;     // Calc. period of MA for next TF
   Period_MA_02=K2*Period_MA_0;     // Period of supp. MA for nearest TF
   Period_MA_03=K3*Period_MA_0;     // Period of supp. MA for next TF
//--------------------------------------------------------------- 7 --
   return;                          // Exit the special function init()
  }
//--------------------------------------------------------------- 8 --
int start()                         // Special function start()
  {
//--------------------------------------------------------------- 9 --
   double
   MA_0, MA_02, MA_03,              // Supporting MAs for diff. TF
   MA_c, MA_p,                      // Current and previous MA values
   Sum;                             // Technical param. for sum accumul.
   int
   i,                                  // Bar index
   n,                                  // Formal parameter (bar index)
   Counted_bars;                       // Amount of counted bars
//-------------------------------------------------------------- 10 --
   Counted_bars=IndicatorCounted(); // Amount of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   if (i<History-1)                 // If too many bars ..
      i=History-1;                  // ..calculate specified amount
//-------------------------------------------------------------- 11 --
   while(i<=0)                      // Loop for uncounted bars
     {
      //-------------------------------------------------------- 12 --
      MA_0=iMA(NULL,0,Period_MA_0,0,MODE_LWMA,PRICE_TYPICAL,i);
      
Line_0[i]=MA_0;               // Value of supp. MA
      //-------------------------------------------------------- 13 --
      MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
      
MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_1);
      
Line_1[i]= MA_0+K*(MA_c-MA_p);// Value of 1st rate line
      //-------------------------------------------------------- 14 --
      MA_c=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i);
      
MA_p=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_2);
      
MA_02= iMA(NULL,0,Period_MA_02,0,MODE_LWMA,PRICE_TYPICAL,i);
      
Line_2[i]=MA_02+K*(MA_c-MA_p);// Value of 2nd rate line
      //-------------------------------------------------------- 15 --
      MA_c=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i);
      
MA_p=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_3);
      
MA_03= iMA(NULL,0,Period_MA_03,0,MODE_LWMA,PRICE_TYPICAL,i);
      
Line_3[i]=MA_03+K*(MA_c-MA_p);// Value of 3rd rate line
      //-------------------------------------------------------- 16 --
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])/3;// Summary array
      //-------------------------------------------------------- 17 --
      if (Aver_Bars>0)              // If wrong set smoothing
         Aver_Bars=0;               // .. no less than zero
      Sum=0;                        // Technical means
      for(n=i; n>=i+Aver_Bars; n++) // Summing last values
         Sum=Sum + Line_4[n];       // Accum. sum of last values
      Line_5[i]= Sum/(Aver_Bars+1); // Indic. array of smoothed line
      //-------------------------------------------------------- 18 --
      i--;                          // Calculating index of the next bar
      //-------------------------------------------------------- 19 --
     }
   return;                          // Exit the special function start()
  }
//-------------------------------------------------------------- 20 --

A három MA indikátortömb kiszámításához különböző átlagoló időszakokat használunk. az MA aktuális időkeretbeni átlagolási időszakának beállításához a Period_MA_1 külső változót, míg a támasz MA átlagolási időszakának beállításához a Period_MA_0 változót használhatja a felhasználó.

A magasabb időkereteken kiszámítandó MA-k meghatározásához ki kell számolni, hogy az aktuális időkeretben milyen átlagolási időszakot használjunk ahhoz, hogy a magasabb időkeretben a kívánt átlagolási időszakot kapjuk, ez a 6-7 blokkban történik. Az ehhez szükséges együtthatókat a 5-6 blokkban határozzuk meg. Például, ha az indikátort az M30 ábrához erősítettük, a K2 és K3 együttható 2 és 8 lesz, mert a legközelebbi időkeret a H1 kétszer nagyobb, mint az M30 és a következő még magasabb időkeret a H4 nyolcszor nagyobb, mint az M30.

A start() számításai nagyon egyszerűek. A 12-13 blokkban kiszámoljuk a támasz MA értékét az aktuális időkeretben (fekete indikátorvonal). A 13-14 blokkban a Line_1[] indikátortömb elemeinek értékét  határozzuk meg az aktuális időkeretben lévő ROC vonal szerkesztéséhez (narancssárga vonal). Az árváltozás-arányt az elemezett MA értékének az aktuális bár és az aktuális bárnál Sh_1 –el nagyobb bár különbözetéből számoljuk ki (MA_c - MA_p). A Line_1[] indikátortömb értékét az aktuális báron  a támasz MA és a K változóval megszorzott árváltozás összege adja (a K egy skálaegyütthatót, amit egy külső változóban adunk meg):

 Line_1[i]= MA_0+K*(MA_c-MA_p);// value of 1st rate line

Hasonló számításokat végzünk a két másik időkereten az indikátorvonalak meghatározásához (14-16 blokk). A támasz MA indikátorvonalakat itt nem mutatjuk. A 16-17 blokkban a Line_4[] indikátortömb értékeit (kék vonal) egy egyszerű számtani átlagszámítással határozzuk meg.

A 17-18 blokkban egy további átlagvonal értékeit számítjuk ki, egy simított átlagvonalét (vastag piros vonal, Line_5[] indikátor tömb). A simítást egyszerű átlagolással végezzük: az aktuális báron a Line_5[] indikátortömb elemértékét a Line_4[]  indikátortömb utolsó értékeinek  számtani átlaga adja. Ennek a módszernek a segítségével az indikátorvonal kevesebbé válik hullámos, és kisebb a lemaradása. A simítandó bárok számát az Aver_Bars külső változóban adhatjuk meg.

Az indikátor indítása után 6 indikátorvonalat fogunk látni az ablakban:

  • fekete vonal – a támasz MA az aktuális idő keretben;
  • narancssárga vonal – az árváltozás aránya az aktuális időkereten;
  • zöld vonal - az árváltozás aránya a legközelebbi, magasabb időkereten;
  • barna vonal - az árváltozás aránya a következő, magasabb időkereten;
  • kék vonal - az árváltozás arányának átlagolt vonala;
  • piros vonal - az árváltozás arányának simított átlagolt vonala.


127. ábra. A  roc.mq4 egyéni indikátor, az aktuális és a két nagyobb időkeretben számolt árarány változással.


A roc.mq4 indikátort bármilyen időkeretben bármilyen szimbólum ablakához csatolhatjuk. Mindegyik időkeretben ugyanaz a szabály érvényes: a narancssárga vonal visszatükrözi a számítás eredményét az aktuális időkereten, a zöld - a legközelebbi nagyobb időkereten és a barna a következő nagyobb időkereten. Ezt könnyen ellenőrizni tudjuk: csatoljuk az indikátort egy ablakhoz és láthatjuk az aktuális időkeretben és legközelebbi időkeretekben lévő vonalakat (lásd 128. és 129. ábrát).


128. ábra. A képen a barna vonal az aktuális (M15) időkereten, a zöld vonal
egy magasabb időkereten (M30, 129. ábra) és a narancs vonal a következő magasabb időkereten (H1, 129. ábra) kiszámolt értékeket láthatjuk.



129. ábra. A zöld vonal az aktuális M30 időkeretben egyforma a barna vonallal a kisebb időkeretben (M15, 128. ábra) és a narancs vonallal a magasabb időkeretben (H1).


Egy sajátossága van a vizsgált  roc.mq4 indikátornak: az indikátorvonalak nem csak az ár arányának a változását mutatják, de függenek a támasz MA változásától is. Egyfelől ez a technológia megengedi, hogy közvetlenül a szimbólum ábrán jelenítsük meg az indikátorvonalakat, ami nagyon kényelmes. Másfelől ha a ár arányának a változás értékei túl kicsik, a fő összetevő az indikátorvonalak szerkezetében a támasz MA értéke, ami nemkívánatos, mert az MA-nak van egy bizonyos lemaradása.

A következő egyéni indikátor a roc.mq4 indikátornak a teljes analógja, de azt egy különálló ablakban helyeztük el. Ez lehetővé teszi, hogy a különböző időkereteken kiszámított indikátorvonalak értékeit ne a támasz MA- hoz viszonyítva ábrázoljuk, hanem egy vízszintes nulla vonalhoz viszonyítva. Eszerint a programkódot egy kissé megváltoztatjuk: nem szükséges a támasz MA és a skála együtthatót használata.

A rocseparate.mq4 egyéni indikátor ROC (Price Rate Change) az aktuális időkeretben, legközelebbi magasabb, és következő magasabb időkeretben. Egy különálló ablakban elhelyezve.

//--------------------------------------------------------------------
// rocseparate.mq4 (Priliv_s)
// The code should be used for educational purpose only.
//--------------------------------------------------------------- 1 --
#property copyright "Copyright © SK, 2007"
#property link      "http://AutoGraf.dp.ua"
//--------------------------------------------------------------------
#property indicator_separate_window // Indicator is drawn in a separate window
#property indicator_buffers 6       // Number of buffers
#property indicator_color1 Black    // Line color of 0 buffer
#property indicator_color2 DarkOrange//Line color of the 1st buffer
#property indicator_color3 Green    // Line color of the 2nd buffer
#property indicator_color4 Brown    // Line color of the 3rd buffer
#property indicator_color5 Blue     // Line color of the 4th buffer
#property indicator_color6 Red      // Line color of the 5th buffer
//--------------------------------------------------------------- 2 --
extern int History    =5000;        // Amount of bars in calculation history
extern int Period_MA_1=21;          // Period of calculated MA
extern int Bars_V     =13;          // Amount of bars for calc. rate
extern int Aver_Bars  =5;           // Amount of bars for smoothing
//--------------------------------------------------------------- 3 --
int
   Period_MA_2,  Period_MA_3,       // Calculation periods of MA for other timefr.
   K2, K3;                          // Coefficients of timeframe correlation
double
   Line_0[],                        // Indicator array of supp. MA
   Line_1[], Line_2[], Line_3[],    // Indicator array of rate lines
   Line_4[],                        // Indicator array - sum
   Line_5[],                        // Indicator array - sum, smoothed
   Sh_1, Sh_2, Sh_3;                // Amount of bars for rates calc.
//--------------------------------------------------------------- 4 --
int init()                          // Special function init()
  {
   SetIndexBuffer(0,Line_0);        // Assigning an array to a buffer
   SetIndexBuffer(1,Line_1);        // Assigning an array to a buffer
   SetIndexBuffer(2,Line_2);        // Assigning an array to a buffer
   SetIndexBuffer(3,Line_3);        // Assigning an array to a buffer
   SetIndexBuffer(4,Line_4);        // Assigning an array to a buffer
   SetIndexBuffer(5,Line_5);        // Assigning an array to a buffer
   SetIndexStyle (5,DRAW_LINE,STYLE_SOLID,3);// Line style
//--------------------------------------------------------------- 5 --
   switch(Period())                 // Calculating coefficient for..
     {                              // .. different timeframes
      case     1: K2=5;K3=15; break;// Timeframe M1
      case     5: K2=3;K3= 6; break;// Timeframe M5
      case    15: K2=2;K3= 4; break;// Timeframe M15
      case    30: K2=2;K3= 8; break;// Timeframe M30
      case    60: K2=4;K3=24; break;// Timeframe H1
      case   240: K2=6;K3=42; break;// Timeframe H4
      case  1440: K2=7;K3=30; break;// Timeframe D1
      case 10080: K2=4;K3=12; break;// Timeframe W1
      case 43200: K2=3;K3=12; break;// Timeframe MN
     }
//--------------------------------------------------------------- 6 --
   Sh_1=Bars_V;                     // Period of rate calcul. (bars)
   Sh_2=K2*Sh_1;                    // Calc. period for nearest TF
   Sh_3=K3*Sh_1;                    // Calc. period for next TF
   Period_MA_2 =K2*Period_MA_1;     // Calc. period of MA for nearest TF
   Period_MA_3 =K3*Period_MA_1;     // Calc. period of MA for next TF
//--------------------------------------------------------------- 7 --
   return;                          // Exit the special function init()
  }
//--------------------------------------------------------------- 8 --
int start()                         // Special function start()
  {
//--------------------------------------------------------------- 9 --
   double
   MA_c, MA_p,                      // Current and previous MA values
   Sum;                             // Technical param. for sum accumul.
   int
   i,                               // Bar index
   n,                               // Formal parameter (bar index)
   Counted_bars;                    // Amount of counted bars
//-------------------------------------------------------------- 10 --
   Counted_bars=IndicatorCounted(); // Amount of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   if (i<History-1)                 // If too many bars ..
      i=History-1;                  // ..calculate specified amount
//-------------------------------------------------------------- 11 --
   while(i<=0)                      // Loop for uncounted bars
     {
      //-------------------------------------------------------- 12 --
      Line_0[i]=0;                  // Horizontal reference line
      //-------------------------------------------------------- 13 --
      MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
      
MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_1);
      
Line_1[i]= MA_c-MA_p;         // Value of 1st rate line
      //-------------------------------------------------------- 14 --
      MA_c=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i);
      
MA_p=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_2);
      
Line_2[i]= MA_c-MA_p;         // Value of 2nd rate line
      //-------------------------------------------------------- 15 --
      MA_c=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i);
      
MA_p=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_3);
      
Line_3[i]= MA_c-MA_p;         // Value of 3rd rate line
      //-------------------------------------------------------- 16 --
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])/3;// Summary array
      //-------------------------------------------------------- 17 --
      if (Aver_Bars>0)              // If wrong set smoothing
         Aver_Bars=0;               // .. no less than zero
      Sum=0;                        // Technical means
      for(n=i; n>=i+Aver_Bars; n++) // Summing last values
         Sum=Sum + Line_4[n];       // Accum. sum of last values
      Line_5[i]= Sum/(Aver_Bars+1); // Indic. array of smoothed line
      //-------------------------------------------------------- 18 --
      i--;                          // Calculating index of the next bar
      //-------------------------------------------------------- 19 --
     }
   return;                          // Exit the special function start()
  }
//-------------------------------------------------------------- 20 --

Ha figyelmesen megvizsgáljuk az indikátorvonalakat a különálló ablakban, és a chartablakban látni fogunk néhány különbséget, ami a különböző számítási módszerek használatából ered. A fő szimbólumablakban lévő indikátor számításához a támasz MA-t használtuk, a különálló ablakban levő indikátornál pedig nem használtunk támasz MA-t. Ezért nincs szigorú egyezés a  roc.mq4 és a rocseparate.mq4 indikátorok megfelelő indikátorvonalainak metszéspontjai között.


130. ábra. A  rocseparate.mq4 egyéni indikátor egy különálló ablakban jeleníti meg az árarány változását az
az aktuális időkereten, legközelebbi magasabb időkereten és következő még magasabb időkereten.