//+------------------------------------------------------------------+ //| MA_In_Color_wAppliedPrice.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| Modified from LSMA_In_Color to use any MA by Robert Hill | //| Added use of Applied Price by Robert Hill | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, FX Sniper and Robert Hill" #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Yellow #property indicator_color2 Green #property indicator_color3 Red #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 extern int MAPeriod=14; extern string m = "--Moving Average Types--"; extern string m0 = " 0 = SMA"; extern string m1 = " 1 = EMA"; extern string m2 = " 2 = SMMA"; extern string m3 = " 3 = LWMA"; extern string m4 = " 4 = LSMA"; extern string m5 = " 5 = New LSMA"; extern int MAType=1; extern string p = "--Applied Price Types--"; extern string p0 = " 0 = close"; extern string p1 = " 1 = open"; extern string p2 = " 2 = high"; extern string p3 = " 3 = low"; extern string p4 = " 4 = median(high+low)/2"; extern string p5 = " 5 = typical(high+low+close)/3"; extern string p6 = " 6 = weighted(high+low+close+close)/4"; extern int MAAppliedPrice = 0;//0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4 extern double AngleTreshold=0.25; extern int PrevMAShift=2; extern int CurMAShift=0; //---- buffers double FlatBuffer[]; double UpBuffer[]; double DownBuffer[]; //---- variables int MAMode; string strMAType; double myPoint; double mFactor; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { int ShiftDif; IndicatorBuffers(3); //---- drawing settings SetIndexBuffer(2,FlatBuffer); SetIndexBuffer(1,UpBuffer); SetIndexBuffer(0,DownBuffer); SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,2); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2); switch (MAType) { case 1: strMAType="EMA"; MAMode=MODE_EMA; break; case 2: strMAType="SMMA"; MAMode=MODE_SMMA; break; case 3: strMAType="LWMA"; MAMode=MODE_LWMA; break; case 4: strMAType="LSMA"; break; case 5: strMAType="NEW LSMA"; break; default: strMAType="SMA"; MAMode=MODE_SMA; break; } IndicatorShortName( strMAType+ " (" +MAPeriod + ") "); if(CurMAShift >= PrevMAShift) { Print("Error: CurMAShift >= PrevMAShift"); PrevMAShift = 6; CurMAShift = 0; } myPoint = SetPoint(); // Multiply by 10000 or 100 so that the fAngle is not too small // for the indicator Window. mFactor = 10000.0; if (StringFind(Symbol(), "JPY", 0) >= 0) mFactor = 100.0; ShiftDif = PrevMAShift-CurMAShift; mFactor /= ShiftDif; //---- initialization done return(0); } //+------------------------------------------------------------------+ //| LSMA with PriceMode | //| PrMode 0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, | //| 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4 | //+------------------------------------------------------------------+ double LSMA(int TimeFrame, int Rperiod, int prMode, int shift) { int i, myShift; double sum, pr; int length; double lengthvar; double tmp; double wt; length = Rperiod; sum = 0; for(i = length; i >= 1 ; i--) { lengthvar = length + 1; lengthvar /= 3; tmp = 0; myShift = length - i + shift; switch (prMode) { case 0: pr = iClose(NULL,TimeFrame,myShift);break; case 1: pr = iOpen(NULL,TimeFrame,myShift);break; case 2: pr = iHigh(NULL,TimeFrame,myShift);break; case 3: pr = iLow(NULL,TimeFrame,myShift);break; case 4: pr = (iHigh(NULL,TimeFrame,myShift) + iLow(NULL,TimeFrame,myShift))/2;break; case 5: pr = (iHigh(NULL,TimeFrame,myShift) + iLow(NULL,TimeFrame,myShift) + iClose(NULL,TimeFrame,myShift))/3;break; case 6: pr = (iHigh(NULL,TimeFrame,myShift) + iLow(NULL,TimeFrame,myShift) + iClose(NULL,TimeFrame,myShift) + iClose(NULL,TimeFrame,myShift))/4;break; } tmp = ( i - lengthvar)*pr; sum+=tmp; } wt = sum*6/(length*(length+1)); wt = MathFloor(wt/myPoint)*myPoint; return(wt); } double iLsma(int TimeFrame, int LSMAPeriod, int LSMAPrice,int shift) { double wt; double ma1=iMA(NULL,TimeFrame,LSMAPeriod,0,MODE_SMA ,LSMAPrice,shift); double ma2=iMA(NULL,TimeFrame,LSMAPeriod,0,MODE_LWMA,LSMAPrice,shift); wt = MathFloor((3.0*ma2-2.0*ma1)/myPoint)*myPoint; return(wt); } double SetPoint() { double mPoint; if (Digits < 4) mPoint = 0.01; else mPoint = 0.0001; return(mPoint); } int start() { double MA, MA_Cur, MA_Prev; double fAngle; int limit; 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; for(int i=limit; i>=0; i--) { switch (MAType) { case 4 : MA = LSMA(0, MAPeriod, MAAppliedPrice,i); MA_Cur = LSMA(0, MAPeriod, MAAppliedPrice,i+CurMAShift); MA_Prev = LSMA(0, MAPeriod, MAAppliedPrice,i+PrevMAShift); break; case 5 : MA = iLsma(0, MAPeriod, MAAppliedPrice,i); MA_Cur = iLsma(0, MAPeriod, MAAppliedPrice,i+CurMAShift); MA_Prev = iLsma(0, MAPeriod, MAAppliedPrice,i+PrevMAShift); break; default : MA = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,i); MA_Cur = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,i+CurMAShift); MA_Prev = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,i+PrevMAShift); } fAngle = mFactor * (MA_Cur - MA_Prev)/2.0; //========== COLOR CODING =========================================== DownBuffer[i] = MA; //red UpBuffer[i] = MA; //green FlatBuffer[i] = MA; //yellow if (fAngle < -AngleTreshold) { UpBuffer[i] = EMPTY_VALUE; } else if (fAngle > AngleTreshold) { FlatBuffer[i] = EMPTY_VALUE; //-1 red/greem tight } else { FlatBuffer[i]=EMPTY_VALUE;//EMPTY_VALUE; UpBuffer[i]=EMPTY_VALUE;//EMPTY_VALUE; } } return(0); } //+------------------------------------------------------------------+