//+------------------------------------------------------------------+ //| NRTR Rosh v2.mq4 | //| Rosh | //| http://forexsystems.ru/phpBB/index.php | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "http://forexsystems.ru/phpBB/index.php" //---- #property indicator_chart_window #property indicator_buffers 6 #property indicator_color1 Red #property indicator_color2 Blue #property indicator_color3 DeepSkyBlue #property indicator_color4 Tomato #property indicator_color5 Orange #property indicator_color6 DodgerBlue #property indicator_width1 0 #property indicator_width2 0 #property indicator_width3 0 #property indicator_width4 0 #property indicator_width5 0 #property indicator_width6 0 //---- input parameters extern int PerATR =40; extern double kATR =2.0; extern bool useSendMail=true; extern bool useNewTrendSig =true; extern int BuySellLevelDrawMode =1;//0-none; 1-lines,2-arrows extern int FloorCeilLevelDrawMode=1;//0-none; 1-lines,2-arrows extern int TimeFrame = 0; extern string note_TimeFrames_ = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-currentTF"; extern string NRTRDrawLineMode = "0-none; 1-lines,2-arrows"; string IndicatorFileName; //---- buffers double SellBuffer[]; double BuyBuffer[]; double Ceil[]; double Floor[]; double Trend[]; int sm_Bars; double SellBufferSig[]; double BuyBufferSig[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorBuffers(7); if (BuySellLevelDrawMode==0)BuySellLevelDrawMode=DRAW_NONE; if (BuySellLevelDrawMode==1)BuySellLevelDrawMode=DRAW_LINE; if (BuySellLevelDrawMode==2)BuySellLevelDrawMode=DRAW_ARROW; if (FloorCeilLevelDrawMode==0)FloorCeilLevelDrawMode=DRAW_NONE; if (FloorCeilLevelDrawMode==1)FloorCeilLevelDrawMode=DRAW_LINE; if (FloorCeilLevelDrawMode==2)FloorCeilLevelDrawMode=DRAW_ARROW; SetIndexStyle(0,BuySellLevelDrawMode); SetIndexStyle(1,BuySellLevelDrawMode); SetIndexStyle(2,FloorCeilLevelDrawMode); SetIndexStyle(3,FloorCeilLevelDrawMode); SetIndexArrow(0,167); //251 SetIndexBuffer(0,SellBuffer); SetIndexEmptyValue(0,0.0); // SetIndexArrow(1,167); //251 SetIndexBuffer(1,BuyBuffer); SetIndexEmptyValue(1,0.0); SetIndexArrow(2,158);//159 SetIndexBuffer(2,Ceil); SetIndexEmptyValue(2,0.0); // SetIndexArrow(3,158);//159 SetIndexBuffer(3,Floor); SetIndexEmptyValue(3,0.0); if (useNewTrendSig) { SetIndexStyle(4,DRAW_ARROW); SetIndexStyle(5,DRAW_ARROW); } else { SetIndexStyle(4,DRAW_NONE); SetIndexStyle(5,DRAW_NONE); } SetIndexArrow(4,176); // 250 177 251 SetIndexBuffer(4,SellBufferSig); SetIndexEmptyValue(4,0.0); SetIndexArrow(5,176); //250 177 251 SetIndexBuffer(5,BuyBufferSig); SetIndexEmptyValue(5,0.0); // SetIndexBuffer(6,Trend); SetIndexEmptyValue(6,0); switch(TimeFrame) { case 1: string TimeFrameStr = "M1" ; break; case 5 : TimeFrameStr = "M5" ; break; case 15 : TimeFrameStr = "M15"; break; case 30 : TimeFrameStr = "M30"; break; case 60 : TimeFrameStr = "H1" ; break; case 240 : TimeFrameStr = "H4" ; break; case 1440 : TimeFrameStr = "D1" ; break; case 10080 : TimeFrameStr = "W1" ; break; case 43200 : TimeFrameStr = "MN1"; break; default : TimeFrameStr = "TF0"; } TimeFrame = MathMax(TimeFrame,Period()); IndicatorFileName = WindowExpertName(); string short_name; short_name="NRTR_R("+PerATR+ ", "+DoubleToStr(kATR,2)+") "+TimeFrameStr ; IndicatorShortName(short_name); SetIndexLabel(0,"DnTrendRes "+short_name); SetIndexLabel(1,"UpTrendSup "+short_name); SetIndexLabel(2,"UpTrendCeil "+short_name); SetIndexLabel(3,"DnTrendFloor "+short_name); SetIndexLabel(4,"DnTrendSig "+short_name); SetIndexLabel(5,"UpTrendSig "+short_name); //---- return(0); } //+------------------------------------------------------------------+ //| break downtrend's top | //+------------------------------------------------------------------+ bool BreakDown(int shift) { bool result=false; if (Close[shift]>SellBuffer[shift+1]) result=true; return(result); } //+------------------------------------------------------------------+ //| break uptrend's butt om | //+------------------------------------------------------------------+ bool BreakUp(int shift) { bool result=false; if (Close[shift]<BuyBuffer[shift+1]) result=true; return(result); } //+------------------------------------------------------------------+ //| taking new min on downtrend | //+------------------------------------------------------------------+ bool BreakFloor(int shift) { bool result=false; if (High[shift]<Floor[shift+1]) result=true; return(result); } //+------------------------------------------------------------------+ //| taking new max on uptrend | //+------------------------------------------------------------------+ bool BreakCeil(int shift) { bool result=false; if (Low[shift]>Ceil[shift+1]) result=true; return(result); } //+------------------------------------------------------------------+ //| def prev trend | //+------------------------------------------------------------------+ bool Uptrend(int shift) { //Print("Trend=",Trend[shift+1]); bool result=false; if (Trend[shift+1]==1) result=true; if (Trend[shift+1]==-1) result=false; if ((Trend[shift+1]!=1)&&(Trend[shift+1]!=-1)) Print("attension! trend is not defined, thats impossible. bar from the end",(Bars-shift)); return(result); } //+------------------------------------------------------------------+ //| volatility calc | //+------------------------------------------------------------------+ double ATR(int iPer,int shift) { double result; //result=iMA(NULL,0,Per,0,MODE_SMA,PRICE_HIGH,shift+1)-iMA(NULL,0,Per,0,MODE_SMA,PRICE_LOW,shift+1); result=iATR(NULL,0,iPer,shift); //if (result>1.0) Alert("big atr=",result); //Print("ATR[",shift,"]=",result); return(result); } //+------------------------------------------------------------------+ //| setting new ceil | //+------------------------------------------------------------------+ void NewCeil(int shift) { Ceil[shift]=Close[shift]; Floor[shift]=0.0; } //+------------------------------------------------------------------+ //| new foor | //+------------------------------------------------------------------+ void NewFloor(int shift) { Floor[shift]=Close[shift]; Ceil[shift]=0.0; } //+------------------------------------------------------------------+ //| set sup levl uptrend | //+------------------------------------------------------------------+ void SetBuyBuffer(int shift) { BuyBuffer[shift]=Close[shift]-kATR*ATR(PerATR,shift); SellBuffer[shift]=0.0; } //+------------------------------------------------------------------+ //| sup levl downtrend | //+------------------------------------------------------------------+ void SetSellBuffer(int shift) { SellBuffer[shift]=Close[shift]+kATR*ATR(PerATR,shift); BuyBuffer[shift]=0.0; } //+------------------------------------------------------------------+ //|trend reverce and new levels set | //+------------------------------------------------------------------+ void NewTrend(int shift) { if (Trend[shift+1]==1) { Trend[shift]=-1; NewFloor(shift); SetSellBuffer(shift); SellBufferSig[shift]=SellBuffer[shift]; } else { Trend[shift]=1; NewCeil(shift); SetBuyBuffer(shift); BuyBufferSig[shift]=BuyBuffer[shift]; } } //+------------------------------------------------------------------+ //| trend continuation | //+------------------------------------------------------------------+ void CopyLastValues(int shift) { SellBuffer[shift]=SellBuffer[shift+1]; BuyBuffer[shift]=BuyBuffer[shift+1]; Ceil[shift]=Ceil[shift+1]; Floor[shift]=Floor[shift+1]; Trend[shift]=Trend[shift+1]; } //+------------------------------------------------------------------+ //| trend continuation | //+------------------------------------------------------------------+ void SendSMS(int shift) { if (sm_Bars!=Bars) sm_Bars=Bars; if ((Trend[shift+1]*Trend[shift+2]==-1)&&(shift==0)&&useSendMail) // trend changed { if (Trend[shift+1]==1) { SendMail("NRTR",Symbol()+" "+Period()+" turned UP, Bid="+NormalizeDouble(Bid,Digits)); } else { SendMail("NRTR",Symbol()+" "+Period()+" turned Dn, Bid="+Bid); } } return; } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i,limit; if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if (TimeFrame != Period()) { datetime TimeArray[]; limit = MathMax(limit,TimeFrame/Period()); ArrayCopySeries(TimeArray ,MODE_TIME ,NULL,TimeFrame); for(i=0,int y=0; i<limit; i++) { if(Time[i]<TimeArray[y]) y++; SellBuffer[i]= iCustom(NULL,TimeFrame,IndicatorFileName,PerATR,kATR, useSendMail,useNewTrendSig,BuySellLevelDrawMode,FloorCeilLevelDrawMode,0,y); BuyBuffer[i] = iCustom(NULL,TimeFrame,IndicatorFileName,PerATR,kATR, useSendMail,useNewTrendSig,BuySellLevelDrawMode,FloorCeilLevelDrawMode,1,y); Ceil[i] = iCustom(NULL,TimeFrame,IndicatorFileName,PerATR,kATR, useSendMail,useNewTrendSig,BuySellLevelDrawMode,FloorCeilLevelDrawMode,2,y); Floor[i] = iCustom(NULL,TimeFrame,IndicatorFileName,PerATR,kATR, useSendMail,useNewTrendSig,BuySellLevelDrawMode,FloorCeilLevelDrawMode,3,y); SellBufferSig[i]= iCustom(NULL,TimeFrame,IndicatorFileName,PerATR,kATR, useSendMail,useNewTrendSig,BuySellLevelDrawMode,FloorCeilLevelDrawMode,4,y); BuyBufferSig[i] = iCustom(NULL,TimeFrame,IndicatorFileName,PerATR,kATR, useSendMail,useNewTrendSig,BuySellLevelDrawMode,FloorCeilLevelDrawMode,5,y); } return(0); } if (counted_bars>0) limit=Bars-counted_bars; if (counted_bars<0) return(0); if (counted_bars==0) { limit=Bars-PerATR-1; if (Close[limit+1]>Open[limit+1]) {Trend[limit+1]=1;Ceil[limit+1]=Close[limit+1];BuyBuffer[limit+1]=Close[limit+1]-kATR*ATR(PerATR,limit+1);} if (Close[limit+1]<Open[limit+1]) {Trend[limit+1]=-1;Floor[limit+1]=Close[limit+1];SellBuffer[limit+1]=Close[limit+1]+kATR*ATR(PerATR,limit+1);} if (Close[limit+1]==Open[limit+1]) {Trend[limit+1]=1;Ceil[limit+1]=Close[limit+1];BuyBuffer[limit+1]=Close[limit+1]-kATR*ATR(PerATR,limit+1);} } //---- for(int cnt=limit;cnt>=0;cnt--) { SendSMS(cnt); if (Uptrend(cnt)) { //Print("UpTrend"); if (BreakCeil(cnt)) { NewCeil(cnt); SetBuyBuffer(cnt); Trend[cnt]=1; continue; } if (BreakUp(cnt)) { NewTrend(cnt); continue; } CopyLastValues(cnt); } else { //Print("DownTrend"); if (BreakFloor(cnt)) { NewFloor(cnt); SetSellBuffer(cnt); Trend[cnt]=-1; continue; } if (BreakDown(cnt)) { NewTrend(cnt); continue; } CopyLastValues(cnt); } } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open time of each bar
Series array that contains open prices of each bar
Indicator Curves created:
Implements a curve of type BuySellLevelDrawMode
Implements a curve of type FloorCeilLevelDrawMode
Implements a curve of type DRAW_ARROW
Implements a curve of type DRAW_NONE
Indicators Used:
Indicator of the average true range
Custom Indicators Used:
Order Management characteristics:
Other Features:
It sends emails