É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.
//+------------------------------------------------------------------+Ezt egyszerűen bemásolod a MetaEditor egyik új indikátor fájljába és lefordítod.
//| 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);
}
//+------------------------------------------------------------------+
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 :
//+------------------------------------------------------------------+Tulajdonképpen ennyi! A robot ez utóbbi indikátor színváltozásait figyeli és köt.
//| 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;
}
}
}
//+------------------------------------------------------------------+
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...