//+------------------------------------------------------------------+ //| VoltyChannel_Stop_v2.mq4 | //| Copyright © 2007, TrendLaboratory | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, TrendLaboratory" #property link "http://finance.groups.yahoo.com/group/TrendLaboratory" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Blue #property indicator_color4 Red #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 //---- input parameters extern int Price = 0; //Applied Price: 0-C,1-O,2-H,3-L,4-Median,5-Typical,6-Weighted extern int MA_Length = 1; //MA's Period extern int MA_Mode = 0; //MA's Method:0-SMA,1-EMA,2-SMMA,3-LWMA extern int ATR_Length =10; //ATR's Period extern double Kv = 4; //Volatility's Factor or Multiplier extern double MoneyRisk = 1; //Offset Factor extern int AlertMode = 0; //0-alert off,1-on extern int VisualMode = 0; //0-lines,1-dots //---- indicator buffers double UpBuffer[]; double DnBuffer[]; double UpSignal[]; double DnSignal[]; double smin[]; double smax[]; double trend[]; bool UpTrendAlert=false, DownTrendAlert=false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- indicator line IndicatorBuffers(7); SetIndexBuffer(0,UpBuffer); SetIndexBuffer(1,DnBuffer); SetIndexBuffer(2,UpSignal); SetIndexBuffer(3,DnSignal); SetIndexBuffer(4,smin); SetIndexBuffer(5,smax); SetIndexBuffer(6,trend); if(VisualMode==0) { SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); } else { SetIndexStyle(0,DRAW_ARROW); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(0,159); SetIndexArrow(1,159); } SetIndexStyle(2,DRAW_ARROW); SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(2,108); SetIndexArrow(3,108); //---- name for DataWindow and indicator subwindow label short_name="VoltyChannel_Stop("+MA_Length+","+ATR_Length+","+DoubleToStr(Kv,3)+")"; IndicatorShortName(short_name); SetIndexLabel(0,"UpTrend"); SetIndexLabel(1,"DnTrend"); SetIndexLabel(2,"UpSignal"); SetIndexLabel(3,"DnSignal"); //---- SetIndexDrawBegin(0,MA_Length+ATR_Length); SetIndexDrawBegin(1,MA_Length+ATR_Length); SetIndexDrawBegin(2,MA_Length+ATR_Length); SetIndexDrawBegin(3,MA_Length+ATR_Length); //---- return(0); } //+------------------------------------------------------------------+ //| VoltyChannel_Stop_2 | //+------------------------------------------------------------------+ int start() { int shift,limit, counted_bars=IndicatorCounted(); if ( counted_bars > 0 ) limit=Bars-counted_bars; if ( counted_bars < 0 ) return(0); if ( counted_bars ==0 ) limit=Bars-MA_Length-1; for(shift=limit;shift>=0;shift--) { if(Price==2 || Price==3) { double bprice = iMA(NULL,0,MA_Length,0,MA_Mode,2,shift); double sprice = iMA(NULL,0,MA_Length,0,MA_Mode,3,shift); } else { bprice = iMA(NULL,0,MA_Length,0,MA_Mode,Price,shift); sprice = iMA(NULL,0,MA_Length,0,MA_Mode,Price,shift); } smin[shift] = sprice - Kv*iATR(NULL,0,ATR_Length,shift); smax[shift] = bprice + Kv*iATR(NULL,0,ATR_Length,shift); trend[shift]=trend[shift+1]; if ( bprice > smax[shift+1] ) trend[shift] = 1; if ( sprice < smin[shift+1] ) trend[shift] = -1; if ( trend[shift] >0 ) { if( smin[shift] < smin[shift+1]) smin[shift] = smin[shift+1]; UpBuffer[shift] = smin[shift] - (MoneyRisk - 1)*iATR(NULL,0,ATR_Length,shift); if( UpBuffer[shift] < UpBuffer[shift+1] && UpBuffer[shift+1]!=EMPTY_VALUE) UpBuffer[shift] = UpBuffer[shift+1]; if(trend[shift+1] != trend[shift]) UpSignal[shift] = UpBuffer[shift]; else UpSignal[shift] = EMPTY_VALUE; DnBuffer[shift] = EMPTY_VALUE; DnSignal[shift] = EMPTY_VALUE; } else if ( trend[shift] <0 ) { if( smax[shift]>smax[shift+1]) smax[shift] = smax[shift+1]; DnBuffer[shift] = smax[shift] + (MoneyRisk - 1)*iATR(NULL,0,ATR_Length,shift); if( DnBuffer[shift] > DnBuffer[shift+1]) DnBuffer[shift] = DnBuffer[shift+1]; if(trend[shift+1] != trend[shift]) DnSignal[shift] = DnBuffer[shift]; else DnSignal[shift] = EMPTY_VALUE; UpBuffer[shift] = EMPTY_VALUE; UpSignal[shift] = EMPTY_VALUE; } } //---------- string Message; if ( trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert) { Message = " "+Symbol()+" M"+Period()+": Signal for BUY"; if ( AlertMode>0 ) Alert (Message); UpTrendAlert=true; DownTrendAlert=false; } if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert) { Message = " "+Symbol()+" M"+Period()+": Signal for SELL"; if ( AlertMode>0 ) Alert (Message); DownTrendAlert=true; UpTrendAlert=false; } //---- return(0); }