//+------------------------------------------------------------------+ //| Ma_Parabolic.mq4 | //| Copyright © 2007 | //+------------------------------------------------------------------+ // Olker, kroufr.ru #property copyright "Copyright © 2007" #property link "" //---- #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_color2 Red //---- input parameters extern int MA =24; // Period MA extern int MA_Mode =2; // 0=sma, 1=ema, 2=smma, 3=lwma extern int MA_Price=0; // 0-CLOSE,1-OPEN,2-HIGH,3-LOW,4-MEDIAN,5-TYPICAL,6-WEIGHTED extern double Step=0.02; extern double Maximum=0.08; extern bool Alert_Sound=true; //---- buffers double SarBuffer[]; double MaBuffer[]; //---- int save_lastreverse; bool save_dirlong; double save_start; double save_last_high; double save_last_low; double save_ep; double save_sar; //---- Íîìåð áàðà, ïî êîòîðîìó áóäåò èñêàòüñÿ ñèãíàë #define SIGNAL_BAR 1 //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,159); SetIndexBuffer(0,SarBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,MaBuffer); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SaveLastReverse(int last,int dir,double start,double low,double high,double ep,double sar) { save_lastreverse=last; save_dirlong=dir; save_start=start; save_last_low=low; save_last_high=high; save_ep=ep; save_sar=sar; } //+------------------------------------------------------------------+ //| Parabolic Sell And Reverse system | //+------------------------------------------------------------------+ int start() { static bool first=true; bool dirlong; double start,last_high,last_low; double ep,sar,price_low,price_high,price; int i,counted_bars=IndicatorCounted(); //---- for(i=0; i<Bars-MA-2; i++) MaBuffer[i]=iMA(NULL,0,MA,0,MA_Mode,MA_Price,i); //---- if(Bars<0) return(0); //---- initial settings i=Bars-2; if(counted_bars==0 || first) { first=true; dirlong=true; start=Step;//start=0.002 last_high=-10000000.0; last_low=10000000.0; while(i>0) { save_lastreverse=i; price_low=MaBuffer[i]; if(last_low>price_low) last_low=price_low; price_high=MaBuffer[i]; if(last_high<price_high) last_high=price_high; if(price_high>MaBuffer[i+1] && price_low>MaBuffer[i+1]) break; if(price_high<MaBuffer[i+1] && price_low<MaBuffer[i+1]) { dirlong=false; break; } i--; } //---- initial zero int k=i; while(k<Bars) { SarBuffer[k]=0.0; k++; } //---- check further if(dirlong) { SarBuffer[i]=MaBuffer[i+1]; ep=MaBuffer[i]; } else { SarBuffer[i]=MaBuffer[i+1]; ep=MaBuffer[i]; } i--; } else { i=save_lastreverse; start=save_start; dirlong=save_dirlong; last_high=save_last_high; last_low=save_last_low; ep=save_ep; sar=save_sar; } //---- while(i>=0) { price_low=MaBuffer[i]; price_high=MaBuffer[i]; //--- check for reverse if(dirlong && price_low<SarBuffer[i+1]) { SaveLastReverse(i,true,start,price_low,last_high,ep,sar); start=Step; dirlong=false; ep=price_low; last_low=price_low; SarBuffer[i]=last_high; i--; continue; } if(!dirlong && price_high>SarBuffer[i+1]) { SaveLastReverse(i,false,start,last_low,price_high,ep,sar); start=Step; dirlong=true; ep=price_high; last_high=price_high; SarBuffer[i]=last_low; i--; continue; } //--- price=SarBuffer[i+1]; sar=price+start*(ep-price); if(dirlong) { if(ep<price_high && (start+Step)<=Maximum) start+=Step; if(price_high<MaBuffer[i+1] && i==Bars-2) sar=SarBuffer[i+1]; price=MaBuffer[i+1]; if(sar>price) sar=price; price=MaBuffer[i+2]; if(sar>price) sar=price; if(sar>price_low) {SaveLastReverse(i,true,start,price_low,last_high,ep,sar); start=Step; dirlong=false; ep=price_low; last_low=price_low; SarBuffer[i]=last_high; i--; continue; } if(ep<price_high) {last_high=price_high; ep=price_high; } } else { if(ep>price_low && (start+Step)<=Maximum) start+=Step; if(price_low<MaBuffer[i+1] && i==Bars-2) sar=SarBuffer[i+1]; price=MaBuffer[i+1]; if(sar<price) sar=price; price=MaBuffer[i+2]; if(sar<price) sar=price; if(sar<price_high) { SaveLastReverse(i,false,start,last_low,price_high,ep,sar); start=Step; dirlong=true; ep=price_high; last_high=price_high; SarBuffer[i]=last_low; i--; continue; } if(ep>price_low) { last_low=price_low; ep=price_low; } } SarBuffer[i]=sar; i--; } //---- âðåìÿ ïîñëåäíåãî áàðà è íàïðàâëåíèå ïîñëåäíåãî ñèãíàëà static int PrevSignal=0, PrevTime=0; //---- Åñëè áàðîì äëÿ àíàëèçà âûáðàí íå 0-é, íàì íåò ñìûñëà ïðîâåðÿòü ñèãíàë //---- íåñêîëüêî ðàç. Åñëè íå íà÷àëñÿ íîâûé áàð, âûõîäèì. if(SIGNAL_BAR > 0 && Time[0]<=PrevTime) return(0); //---- Îòìå÷àåì, ÷òî ýòîò áàð ïðîâåðåí PrevTime=Time[0]; //---- Åñëè ïðåäûäóùèé ñèãíàë áûë ÑÅËË èëè ýòî ïåðâûé çàïóñê (PrevSignal=0) if(PrevSignal<=0) { if(Close[SIGNAL_BAR] - SarBuffer[SIGNAL_BAR] > 0) { PrevSignal=1; if (Alert_Sound)Alert("Ma_Parabolic(", Symbol(), ", ", Period(), ") - BUY"); } } if(PrevSignal>=0) { if(SarBuffer[SIGNAL_BAR] - Close[SIGNAL_BAR] > 0) { PrevSignal=-1; if (Alert_Sound)Alert("Ma_Parabolic(", Symbol(), ", ", Period(), ") - SELL"); } } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_ARROW
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen