//+------------------------------------------------------------------+ //| Twiggs Money Flow.mq4 | //| Copyright © 2011, JW Skerritt | //| | //| Twiggs Money Flow Algorithm attributed to Colin Twiggs| //| http://www.incrediblecharts.com/indicators/twiggs_money_flow.php| //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, JW Skerritt." #property link " " #property indicator_separate_window #property indicator_minimum -50 #property indicator_maximum 50 #property indicator_buffers 3 #property indicator_color1 Yellow #property indicator_width1 2 extern int EMAperiod= 21; //---- buffers double TMFbuffer[]; double ADbuffer[]; double Vbuffer[]; int drawbegin= 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorShortName("Twiggs Money Flow "); //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,TMFbuffer); SetIndexStyle(1,DRAW_NONE); SetIndexBuffer(1,ADbuffer); SetIndexStyle(2,DRAW_NONE); SetIndexBuffer(2,Vbuffer); int drawbegin= EMAperiod; // summary of nonzero elements of array //---- return(0); } //+------------------------------------------------------------------+ //| Accumulation/Distribution | //+------------------------------------------------------------------+ int start() { double TRH, TRL, TR, TMF, emaV; //---- if (Bars < drawbegin) return (0); int countedBars = IndicatorCounted(); if (countedBars < 0) return (-1); if (countedBars > 0) countedBars--; int i, limit = Bars - countedBars - 1; for (i = limit; i >= 0; i--) { double high = High[i]; double low = Low[i]; double open = Open[i]; //double close= Close[i]; double volume= Volume[i]; TRH= MathMax(high,Close[i+1]); TRL= MathMin(low, Close[i+1]); TR = TRH-TRL; if(TR==0) TR=99999; if(ADbuffer[i]!=0) { ADbuffer[i]=((Close[i]-TRL)-(TRH-Close[i]))/TR*volume; ADbuffer[i]= funcSUM(ADbuffer); Vbuffer[i]= funcSUM(Volume); // Wilder Moving Average = WMA(i) = (close(i) + (n-1) x WMA(i-1))/n TMFbuffer[i]= ADbuffer[i+(EMAperiod+1)] + ADbuffer[i] * ((EMAperiod-1)/EMAperiod); // 20/21 Vbuffer[i]= Volume[i+(EMAperiod+1)] + Vbuffer[i] * ((EMAperiod-1)/EMAperiod); TMF= 100*TMFbuffer[i]/Vbuffer[i]; } } return(0); } int funcSUM(double array[j]) { // int array_size=ArraySize(array); double sum=0.0; for(int j=0;j<=EMAperiod; j++) { if(array[j]==0) continue; sum+=array[j]; } return(sum); } //+------------------------------------------------------------------+