Code: Select all
#property strict
#property indicator_chart_window
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1 3
#property indicator_width2 3
#property indicator_buffers 2
double TrendUp[], TrendDown[];
int changeOfTrend;
extern int Nbr_Periods=12; // MOVING AVERAGE PERIODS
extern double Multiplier = 2; //ATR MULTIPLIER
//+------------------------------------------------------------------+
//| START Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//--- indicator buffers mapping (indicators)
SetIndexBuffer(0, TrendUp);
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 3);
SetIndexLabel(0, "Trend Up");
SetIndexBuffer(1, TrendDown);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 3);
SetIndexLabel(1, "Trend Down");
//---
return(0);
}
//+------------------------------------------------------------------+
//| END Custom indicator initialization function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| START Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| END Custom indicator deinitialization function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| START Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{int limit, i, flag, flagh, trend[5000];
double up[5000], dn[5000], medianPrice, atr;
int 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--;
limit=Bars-counted_bars;
//Print(limit);
//----
for (i = Bars; i >= 0; i--) {
TrendUp[i] = EMPTY_VALUE;
TrendDown[i] = EMPTY_VALUE;
//////
// c1 =abs( high - low)
double c1=MathAbs(High[0]-Low[0]);
// c2 = abs( close[1]-high )
double c2=MathAbs(Close[1]-High[0]);
// c3 = abs ( close[1] - low )
double c3=MathAbs (Close[1]-Low[0]);
// c4 = max(c1,c2)
double c4=MathMax(c1,c2);
// c5 = max(c4,c3)
double c5=MathMax(c4,c3);
//atr =Average[P](c5);
atr =iMA(NULL, 0, Nbr_Periods, 0, MODE_SMA, c5, 0);
//////////////////////////////////
// demiP = round(period/2)
int demiP=MathRound(Nbr_Periods/2);
// temp = 2*ExponentialAverage[demiP](close) - ExponentialAverage[period](close)
double temp = iMA(NULL,0,demiP,0,MODE_EMA,PRICE_CLOSE,i) * 2 - iMA(NULL,0,Nbr_Periods,0,MODE_EMA,PRICE_CLOSE,i);
// SqrtP = round(SQRT(period))
int SqrtP = MathRound(MathSqrt(Nbr_Periods));
//medianPrice = ExponentialAverage[SqrtP](temp)
medianPrice = iMA(NULL,0,SqrtP,0,1,temp,i);
//////////////////////////////////////////////
// up=avg+aa*atr;
// dn=avg-aa*atr;
//////////////////////////////////////////////
up[i]=medianPrice+Multiplier*atr;
//Print("up: "+up[i]);
dn[i]=medianPrice-Multiplier*atr;
//Print("dn: "+dn[i]);
trend[i]=1;
if (High[i]>up[i+1]) {
trend[i]=1;
if (trend[i+1] == -1) changeOfTrend = 1;
//Print("trend: "+trend[i]);
}
else if (Low[i]<dn[i+1]) {
trend[i]=-1;
if (trend[i+1] == 1) changeOfTrend = 1;
//Print("trend: "+trend[i]);
}
else if (trend[i+1]==1) {
trend[i]=1;
changeOfTrend = 0;
}
else if (trend[i+1]==-1) {
trend[i]=-1;
changeOfTrend = 0;
}
if (trend[i]<0 && trend[i+1]>0) {
flag=1;
//Print("flag: "+flag);
}
else {
flag=0;
//Print("flagh: "+flag);
}
if (trend[i]>0 && trend[i+1]<0) {
flagh=1;
//Print("flagh: "+flagh);
}
else {
flagh=0;
//Print("flagh: "+flagh);
}
if (trend[i]>0 && dn[i]<dn[i+1])
dn[i]=dn[i+1];
if (trend[i]<0 && up[i]>up[i+1])
up[i]=up[i+1];
if (flag==1)
up[i]=medianPrice+(Multiplier*atr);
if (flagh==1)
dn[i]=medianPrice-(Multiplier*atr);
//-- Draw the indicator
if (trend[i]==1) {
TrendUp[i]=dn[i];
if (changeOfTrend == 1) {
TrendUp[i+1] = TrendDown[i+1];
changeOfTrend = 0;
}
}
else if (trend[i]==-1) {
TrendDown[i]=up[i];
if (changeOfTrend == 1) {
TrendDown[i+1] = TrendUp[i+1];
changeOfTrend = 0;
}
}
}
WindowRedraw();
//----
return(0);
}
//+------------------------------------------------------------------+