csütörtök, április 05, 2012

A TrendMagic indikátor

Miután legutóbb feltettem a TVI indikátort, akkor vettem észre, hogy tulajdonképpen már csak a TrendMagic indikátor hiányzik hozzá. Nem szeretném, ha lemaradna, ezért most ezt is közzé teszem.

Korábban már volt róla szó, hogy ez egy CCI és ATR alapú indikátor, elég jól használható, amikor a trend irányára vagyunk kíváncsiak. Ez is színváltoztatós indikátor, de nem függ semmilyen másik indikátortól...

Nos, íme a kódja :

//+------------------------------------------------------------------+
//|                                                   TrendMagic.mq4 |
//|                                    Copyright © 2010, János Antal |
//|                                  http://tozsdecapak.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, János Antal"
#property link      "http://tozsdecapak.blogspot.com"
#include <stderror.mqh>
#include <stdlib.mqh>

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_width2 2

extern int CCI = 50;
extern int ATR = 5;

double bufferUp[];
double bufferDn[];

int init()
{
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, bufferUp);
   SetIndexLabel(0,"TrendMagic Up");

   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(1, bufferDn);
   SetIndexLabel(1,"TrendMagic Down");
}

int start()
{
   double thisCCI;
   double lastCCI;

   for (int shift = Bars; shift >= 0; shift--)
   {
      thisCCI = iCCI(NULL, 0, CCI, PRICE_TYPICAL, shift);
      lastCCI = iCCI(NULL, 0, CCI, PRICE_TYPICAL, shift + 1);

      if (thisCCI >= 0 && lastCCI < 0) bufferUp[shift + 1] = bufferDn[shift + 1];
      if (thisCCI <= 0 && lastCCI > 0) bufferDn[shift + 1] = bufferUp[shift + 1];

      if (thisCCI >= 0)
      {
         bufferUp[shift] = Low[shift] - iATR(NULL, 0, ATR, shift);
         if (bufferUp[shift] < bufferUp[shift + 1])
            bufferUp[shift] = bufferUp[shift + 1];
      }
      else
      {
         if (thisCCI <= 0)
         {
            bufferDn[shift] = High[shift] + iATR(NULL, 0, ATR, shift);
            if (bufferDn[shift] > bufferDn[shift + 1])
               bufferDn[shift] = bufferDn[shift + 1];
         }
      }
   }
}

Ez egy igen egyszerű, ám igen jól használható indikátor, amely leginkább napon belüli kereskedés fő trendirányának a meghatározására való. Ez igen jó támpont lehet, ha egy másik momentum indikátor jelei alapján szeretnénk pozícióba lépni! Ez az indikátor a mi kis robotunk alapja.

Hamarosan backtest következik.
A backtest fogja megmondani nekünk, hogy a kereskedési elv, amelyet leprogramoztunk.

Addig is azt javaslom, hogy a három indikátort, melyet nem is régen közzétettem (most a TrendMagic, korábban a TVI és a TVI_2color, melyek közül ugyan csak az utóbbit használjuk, mégis az előbbivel együtt képes csak működni), valamint a teljes robotot másoljátok le, fordítsátok le a MetaEditor segítségével és próbálgassátok különféle devizapárokon.

Aki már végzett backtest-et, annak is javaslom, hogy mindenféle devizapáron tesztelje le, nézegesse, aki még sosem tesztelt, annak csak azt javaslom, hogy tegye fel a robotot egy demó számlára tetszőleges devizapárra és nézze meg, mikor köt, jókor köt-e, stb.
FIGYELEM! Jelenleg a profit lényegtelen, csak az a fontos, hogy jól működik-e a program!

Ha bárkinek bármilyen kérdése lenne, írjon bátran, válaszolok szívesen!

Jó szórakozást mindenkinek!

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...