Hi all, would you please kindly let me know if the attached is repainting? it seems quite straightforward to be needing to repaint
Code: Select all
//+------------------------------------------------------------------+
//| Extent.mq4 |
//| Copyright © 2017, Gehtsoft USA LLC |
//| http://fxcodebase.com |
//+------------------------------------------------------------------+
//| Donate / Support: https://goo.gl/9Rj74e |
//| BitCoin: 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF |
//+------------------------------------------------------------------+
//| Developed by : Mario Jemic |
//| mario.jemic@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Gehtsoft USA LLC"
#property link "http://fxcodebase.com"
#property description "This indicator shows the difference between a MA and Price"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 clrLime
#property indicator_width1 3
#property indicator_color2 clrRed
#property indicator_width2 3
#property indicator_color3 clrLime
#property indicator_width3 3
#property indicator_color4 clrRed
#property indicator_width4 3
#property indicator_levelcolor clrYellow
#property indicator_levelwidth 1
#property indicator_levelstyle STYLE_DOT
enum e_method{ SMA = 1,
EMA = 2,
Wilder = 3,
LWMA = 4,
SineWMA = 5,
TriMA = 6,
LSMA = 7,
SMMA = 8,
HMA = 9,
ZeroLagEMA = 10,
ITrend = 11,
Median = 12,
GeoMean = 13,
REMA = 14,
ILRS = 15,
IE_2 = 16,
TriMAgen = 17
};
enum e_price{ CLOSE=PRICE_CLOSE, OPEN=PRICE_OPEN, LOW=PRICE_LOW, HIGH=PRICE_HIGH, MEDIAN=PRICE_MEDIAN, TYPICAL=PRICE_TYPICAL, WEIGHTED=PRICE_WEIGHTED };
extern e_method MA_Method = SMA;
extern int MA_Period = 36;
extern e_price MA_Price = CLOSE;
double Extent_Up_Plus[];
double Extent_Up_Minus[];
double Extent_Dn_Plus[];
double Extent_Dn_Minus[];
double Extent[];
double MA[];
double Price[];
int init(){
IndicatorShortName("Extent");
IndicatorBuffers(7);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,Extent_Up_Plus);
SetIndexLabel(0,"Extent Up");
SetIndexDrawBegin(0,MA_Period);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,Extent_Up_Minus);
SetIndexLabel(1,"Extent Up");
SetIndexDrawBegin(1,MA_Period);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexBuffer(2,Extent_Dn_Plus);
SetIndexLabel(2,"Extent Dn");
SetIndexDrawBegin(2,MA_Period);
SetIndexStyle(3,DRAW_HISTOGRAM);
SetIndexBuffer(3,Extent_Dn_Minus);
SetIndexLabel(3,"Extent Dn");
SetIndexDrawBegin(3,MA_Period);
SetIndexBuffer(4,Extent);
SetIndexBuffer(5,MA);
SetIndexBuffer(6,Price);
SetLevelValue(0,0);
return(0);
}
int start()
{
int i;
int counted_bars=IndicatorCounted();
int limit = Bars-counted_bars-1;
for (i=limit; i>=0; i--){
Price[i] = iMA(NULL,0,1,0,0,ENUM_APPLIED_PRICE(MA_Price),i);
}
for (i=limit; i>=0; i--){
switch(MA_Method){
case 1 :
MA[i] = SMA(Price,MA_Period,i);
break;
case 2 :
MA[i] = EMA(Price[i],MA[i+1],MA_Period,i);
break;
case 3 :
MA[i] = Wilder(Price[i],MA[i+1],MA_Period,i);
break;
case 4 :
MA[i] = LWMA(Price,MA_Period,i);
break;
case 5 :
MA[i] = SineWMA(Price,MA_Period,i);
break;
case 6 :
MA[i] = TriMA(Price,MA_Period,i);
break;
case 7 :
MA[i] = LSMA(Price,MA_Period,i);
break;
case 8 :
MA[i] = SMMA(Price,MA[i+1],MA_Period,i);
break;
case 9 :
MA[i] = HMA(Price,MA_Period,i);
break;
case 10:
MA[i] = ZeroLagEMA(Price,MA[i+1],MA_Period,i);
break;
case 11:
MA[i] = ITrend(Price,MA,MA_Period,i);
break;
case 12:
MA[i] = Median(Price,MA_Period,i);
break;
case 13:
MA[i] = GeoMean(Price,MA_Period,i);
break;
case 14:
MA[i] = REMA(Price[i],MA,MA_Period,0.5,i);
break;
case 15:
MA[i] = ILRS(Price,MA_Period,i);
break;
case 16:
MA[i] = IE2(Price,MA_Period,i);
break;
case 17:
MA[i] = TriMA_gen(Price,MA_Period,i);
break;
default:
MA[i] = SMA(Price,MA_Period,i);
break;
}
Extent[i] = Open[i] - MA[i];
if (Extent[i] <= 0){
if (Extent[i] > Extent[i+1])
Extent_Up_Plus[i] = Extent[i];
else
Extent_Up_Minus[i] = Extent[i];
}
else{
if (Extent[i] > Extent[i+1])
Extent_Dn_Plus[i] = Extent[i];
else
Extent_Dn_Minus[i] = Extent[i];
}
}
//----
return(0);
}
double SMA(double &array[],int per,int bar){
double Sum = 0;
for(int i = 0;i < per;i++) Sum += array[bar+i];
return(Sum/per);
}
double EMA(double price,double prev,int per,int bar){
if(bar >= Bars - 2)
double ema = price;
else
ema = prev + 2.0/(1+per)*(price - prev);
return(ema);
}
double Wilder(double price,double prev,int per,int bar){
if(bar >= Bars - 2)
double wilder = price;
else
wilder = prev + (price - prev)/per;
return(wilder);
}
double LWMA(double &array[],int per,int bar){
double Sum = 0;
double Weight = 0;
for(int i = 0;i < per;i++){
Weight+= (per - i);
Sum += array[bar+i]*(per - i);
}
if(Weight>0)
double lwma = Sum/Weight;
else
lwma = 0;
return(lwma);
}
double SineWMA(double &array[],int per,int bar){
double pi = 3.1415926535;
double Sum = 0;
double Weight = 0;
for(int i = 0;i < per;i++){
Weight+= MathSin(pi*(i+1)/(per+1));
Sum += array[bar+i]*MathSin(pi*(i+1)/(per+1));
}
if(Weight>0)
double swma = Sum/Weight;
else
swma = 0;
return(swma);
}
double TriMA(double &array[],int per,int bar){
double sma;
int len = MathCeil((per+1)*0.5);
double sum=0;
for(int i = 0;i < len;i++) {
sma = SMA(array,len,bar+i);
sum += sma;
}
double trima = sum/len;
return(trima);
}
double LSMA(double &array[],int per,int bar){
double Sum=0;
for(int i=per; i>=1; i--) Sum += (i-(per+1)/3.0)*array[bar+per-i];
double lsma = Sum*6/(per*(per+1));
return(lsma);
}
double SMMA(double &array[],double prev,int per,int bar){
if(bar == Bars - per)
double smma = SMA(array,per,bar);
else if(bar < Bars - per){
double Sum = 0;
for(int i = 0;i < per;i++) Sum += array[bar+i+1];
smma = (Sum - prev + array[bar])/per;
}
return(smma);
}
double HMA(double &array[],int per,int bar){
double tmp1[];
int len = MathSqrt(per);
ArrayResize(tmp1,len);
if(bar == Bars - per)
double hma = array[bar];
else if(bar < Bars - per){
for(int i=0;i<len;i++) tmp1[i] = 2*LWMA(array,per/2,bar+i) - LWMA(array,per,bar+i);
hma = LWMA(tmp1,len,0);
}
return(hma);
}
double ZeroLagEMA(double &price[],double prev,int per,int bar){
double alfa = 2.0/(1+per);
int lag = 0.5*(per - 1);
if(bar >= Bars - lag)
double zema = price[bar];
else
zema = alfa*(2*price[bar] - price[bar+lag]) + (1-alfa)*prev;
return(zema);
}
double ITrend(double &price[],double &array[],int per,int bar){
double alfa = 2.0/(per+1);
if (bar < Bars - 7)
double it = (alfa - 0.25*alfa*alfa)*price[bar] + 0.5*alfa*alfa*price[bar+1] - (alfa - 0.75*alfa*alfa)*price[bar+2] + 2*(1-alfa)*array[bar+1] - (1-alfa)*(1-alfa)*array[bar+2];
else
it = (price[bar] + 2*price[bar+1] + price[bar+2])/4;
return(it);
}
double Median(double &price[],int per,int bar){
double array[];
ArrayResize(array,per);
for(int i = 0; i < per;i++) array[i] = price[bar+i];
ArraySort(array);
int num = MathRound((per-1)/2);
if(MathMod(per,2) > 0) double median = array[num]; else median = 0.5*(array[num]+array[num+1]);
return(median);
}
double GeoMean(double &price[],int per,int bar){
if(bar < Bars - per){
double gmean = MathPow(price[bar],1.0/per);
for(int i = 1; i < per;i++) gmean *= MathPow(price[bar+i],1.0/per);
}
return(gmean);
}
double REMA(double price,double &array[],int per,double lambda,int bar){
double alpha = 2.0/(per + 1);
if(bar >= Bars - 3)
double rema = price;
else
rema = (array[bar+1]*(1+2*lambda) + alpha*(price - array[bar+1]) - lambda*array[bar+2])/(1+lambda);
return(rema);
}
double ILRS(double &price[],int per,int bar){
double sum = per*(per-1)*0.5;
double sum2 = (per-1)*per*(2*per-1)/6.0;
double sum1 = 0;
double sumy = 0;
for(int i=0;i<per;i++){
sum1 += i*price[bar+i];
sumy += price[bar+i];
}
double num1 = per*sum1 - sum*sumy;
double num2 = sum*sum - per*sum2;
if(num2 != 0) double slope = num1/num2; else slope = 0;
double ilrs = slope + SMA(price,per,bar);
return(ilrs);
}
double IE2(double &price[],int per,int bar){
double ie = 0.5*(ILRS(price,per,bar) + LSMA(price,per,bar));
return(ie);
}
double TriMA_gen(double &array[],int per,int bar){
int len1 = MathFloor((per+1)*0.5);
int len2 = MathCeil((per+1)*0.5);
double sum=0;
for(int i = 0;i < len2;i++) sum += SMA(array,len1,bar+i);
double trimagen = sum/len2;
return(trimagen);
}
double VWMA(double &array[],int per,int bar){
double Sum = 0;
double Weight = 0;
for(int i = 0;i < per;i++){
Weight+= Volume[bar+i];
Sum += array[bar+i]*Volume[bar+i];
}
if(Weight>0)
double vwma = Sum/Weight;
else
vwma = 0;
return(vwma);
}