csütörtök, február 16, 2012

A TVI indikátor

Ismételten eltelt sok-sok idő, már nem is szabadkozom. A lényeg az, hogy ugyan a robotot a kezeitek közé adtam, de éppen az az indikátor, amely ehhez nélkülözhetetlen, az hiányzik.
Éppen ezért most közre adom azt, illetve azokat, amelyekkel én is dolgozom!

Azért a többes szám, mert itt két indikátorról van szó. Az egyik maga a TVI indikátor, a másik pedig egy színes változata, amely azonban az "ős" TVI-t használja!
Tehát a robotunkban lévő indikátor nem működik az eredeti TVI indikátor nélkül.

Lássuk hát! Az első tehát a TVI önmaga.
//+------------------------------------------------------------------+
//|                                           Ticks Volume Indicator |
//|                                        Copyright © William Blau |
//|                                    Coded/Verified by Profitrader |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Profitrader."
#property link      "profitrader@inbox.ru"
//-----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
//---- input parameters
extern int r=12;
extern int s=12;
extern int u=5;
//---- buffers
double TVI[];
double UpTicks[];
double DownTicks[];
double EMA_UpTicks[];
double EMA_DownTicks[];
double DEMA_UpTicks[];
double DEMA_DownTicks[];
double TVI_calculate[];


double MyPoint;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorShortName("TVI("+r+","+s+","+u+")");
   IndicatorBuffers(8);
   SetIndexBuffer(0,TVI);
   SetIndexBuffer(1,UpTicks);
   SetIndexBuffer(2,DownTicks);
   SetIndexBuffer(3,EMA_UpTicks);
   SetIndexBuffer(4,EMA_DownTicks);
   SetIndexBuffer(5,DEMA_UpTicks);
   SetIndexBuffer(6,DEMA_DownTicks);
   SetIndexBuffer(7,TVI_calculate);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,"TVI");


    if (Digits == 5 || (Digits == 3 && StringFind(Symbol(), "JPY") != -1))
    {
      MyPoint = Point*10;
    }
    else
    if (Digits == 6 || (Digits == 4 && StringFind(Symbol(), "JPY") != -1))
    {
      MyPoint = Point*100;
    }
    else
    {MyPoint = Point;}


   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Ticks Volume Indicator                                           |
//+------------------------------------------------------------------+
int start()
  {
   int i,counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
//----
   for(i=0; i<limit; i++)     {
      UpTicks[i]=(Volume[i]+(Close[i]-Open[i])/MyPoint)/2;
      DownTicks[i]=Volume[i]-UpTicks[i];
     }
   for(i=limit-1; i>=0; i--)
     {
      EMA_UpTicks[i]=iMAOnArray(UpTicks,0,r,0,MODE_EMA,i);
      EMA_DownTicks[i]=iMAOnArray(DownTicks,0,r,0,MODE_EMA,i);
     }
   for(i=limit-1; i>=0; i--)
     {
      DEMA_UpTicks[i]=iMAOnArray(EMA_UpTicks,0,s,0,MODE_EMA,i);
      DEMA_DownTicks[i]=iMAOnArray(EMA_DownTicks,0,s,0,MODE_EMA,i);
     }
   for(i=0; i<limit; i++)      TVI_calculate[i]=100.0*(DEMA_UpTicks[i]-DEMA_DownTicks[i])/(DEMA_UpTicks[i]+DEMA_DownTicks[i]);
   for(i=limit-1; i>=0; i--)
      TVI[i]=iMAOnArray(TVI_calculate,0,u,0,MODE_EMA,i);
//----
   return(0);
  }
//+------------------------------------------------------------------+
Ezt egyszerűen bemásolod a MetaEditor egyik új indikátor fájljába és lefordítod.
Ez egyébként a TVI indikátor megvalósítása, amelyet egy korábbi bejegyzésben taglaltam.
A színes változat ezt hívja meg, és kétféle színnel jelöli az emelkedő és a csökkenő trendet.

Íme :
//+------------------------------------------------------------------+
//|   TVI_2color.mq4
//+------------------------------------------------------------------+
#property indicator_separate_window
#include <stdlib.mqh>
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_level1 0.00
#property indicator_levelcolor Black


extern int r=12;
extern int s=12;
extern int u=5;
extern int tf=15;


double ev=EMPTY_VALUE;


double Up[];
double Dn[];


double TVI[];
double Trend[];


int init()
{
   IndicatorBuffers(2);
  
   SetIndexStyle(0,DRAW_LINE,0,2);
   SetIndexBuffer(0,Up);
   SetIndexLabel(0,"Up");


   SetIndexStyle(1,DRAW_LINE,0,2);
   SetIndexBuffer(1,Dn);
   SetIndexLabel(1,"Dn");


   ArraySetAsSeries(TVI,true);
   ArraySetAsSeries(Trend,true);


   return(0);
}


int deinit()
{
   return(0);
}


int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1); //---- check for possible errors
   if(counted_bars>0) counted_bars--; //---- last counted bar will be recounted
   int limit = Bars-counted_bars;
  
   for (int i=limit;i>=0;i--)
   {
      ArrayResize(TVI,Bars);  
      ArrayResize(Trend,Bars);  


      Trend[i] = Trend[i+1];
     
      TVI[i] = iCustom(NULL,tf,"TVI",r,s,u,0,i);
     
      if (TVI[i] > TVI[i+1])
      {Trend[i] = 1;}
      else
      if (TVI[i] < TVI[i+1])
      {Trend[i] = -1;}
     
      if (Trend[i] > 0)
      {
         Up[i] = TVI[i];
        
         if (Trend[i+1] < 0)
         {
            Up[i+1] = TVI[i+1];
         }
         Dn[i] = ev;  
      }
      else
      if (Trend[i] < 0)
      {
         Dn[i] = TVI[i];
        
         if (Trend[i+1] > 0)
         {
            Dn[i+1] = TVI[i+1];
         }
         Up[i] = ev;  
      }
   }
}
//+------------------------------------------------------------------+
Tulajdonképpen ennyi! A robot ez utóbbi indikátor színváltozásait figyeli és köt.

Hamarosan folyt.köv., ugyanis az elmúlt jó néhány hónapban sok érdekes dolgot tanultam!
Amit tanultam mindannyiótok hasznára fog válni! 
Addig is jó kísérletezést a robival...