//+------------------------------------------------------------------+ //| CycleIdentifier.mq4 | //| | //+------------------------------------------------------------------+ #property strict #property copyright "" #property link "" //---- #property indicator_separate_window #property indicator_buffers 6 //---- #property indicator_color1 clrDarkGray #property indicator_color2 clrLime #property indicator_color3 clrRed #property indicator_color4 clrDarkGreen #property indicator_color5 clrBrown //---- #property indicator_minimum -1.2 #property indicator_maximum 1.2 //---- extern int PriceActionFilter=1; extern int Length=3; extern int MajorCycleStrength=4; extern bool UseCycleFilter=false; extern int UseFilterSMAorRSI=1; extern int FilterStrengthSMA=12; extern int FilterStrengthRSI=21; //---- double LineBuffer[]; double MajorCycleBuy[]; double MajorCycleSell[]; double MinorCycleBuy[]; double MinorCycleSell[]; double ZL1[]; //---- double CyclePrice=0.0,Strength=0.0,SweepA=0.0,SweepB=0.0; int Switch=0,Switch2=0,SwitchA=0,SwitchB=0,SwitchC=0,SwitchD=0,SwitchE=0,SwitchAA=0,SwitchBB=0; //--- double Price1BuyA=0.0,Price2BuyA=0.0; int Price1BuyB=1,Price2BuyB=1; //--- double Price1SellA=0.0,Price2SellA=0.0; int Price1SellB=0,Price2SellB=0; //--- bool ActiveSwitch=true,BuySwitchA=false,BuySwitchB=false,SellSwitchA=false,SellSwitchB=false; int BuySellFac=1; bool Condition1,Condition2,Condition3,Condition6; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2); SetIndexBuffer(0,LineBuffer); //--- SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,3); SetIndexBuffer(1,MajorCycleBuy); //--- SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,3); SetIndexBuffer(2,MajorCycleSell); //--- SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,1); SetIndexBuffer(3,MinorCycleBuy); //--- SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,1); SetIndexBuffer(4,MinorCycleSell); //--- SetIndexStyle(5,DRAW_NONE); SetIndexBuffer(5,ZL1); //--- SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); //--- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() {return(0);} //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); int position=Bars-counted_bars; if(position<0) position=0; if(counted_bars==0) position-=(FilterStrengthRSI+4); //---- int rnglength=250; double range=0.0,srange=0.0; for(int pos=position; pos>=0; pos--) { srange=0.0; int j=0; for(int i=0;i=Bars) break; srange=srange+(High[posr]-Low[posr]); } range=srange/j*Length; int BarNumber=Bars-pos; //?????????? if(BarNumber<0) BarNumber=0; CyclePrice=iMA(NULL,0,PriceActionFilter,0,MODE_SMMA,PRICE_CLOSE,pos); if(UseFilterSMAorRSI==1) ZL1[pos]=ZeroLag(CyclePrice,FilterStrengthSMA,pos); if(UseFilterSMAorRSI==2) ZL1[pos]=ZeroLag(iRSI(NULL,0,14,(ENUM_APPLIED_PRICE)CyclePrice,FilterStrengthRSI),FilterStrengthRSI,pos); if(ZL1[pos]>ZL1[pos+1]) SwitchC=1; if(ZL1[pos]1) { /* ***** */ if(Switch>-1) { if(CyclePricePrice1BuyA) { SwitchA=BarNumber-Price1BuyB; if(!UseCycleFilter) { MinorCycleBuy[pos+SwitchA]=-1;//MinorBuySell - DarkGreen LineBuffer[pos+SwitchA]=-1;//line } if(UseCycleFilter && SwitchC==1) { MinorCycleBuy[pos+SwitchA]=-1; //MinorBuySell LineBuffer[pos+SwitchA]=-1; //line SwitchD=1; } else { SwitchD=0; } BuySwitchA=true; double cyclePrice1=iMA(NULL,0,PriceActionFilter,0,MODE_SMMA,PRICE_CLOSE,pos+SwitchA); if(ActiveSwitch) { Condition1=CyclePrice-cyclePrice1>=SweepA; } else { Condition1=CyclePrice>=cyclePrice1 *(1+SweepA/1000); } if(Condition1 && SwitchA>=BuySellFac) { Switch=-1; Price1SellA=CyclePrice; Price1SellB=BarNumber; SellSwitchA=false; BuySwitchA=false; } } } /* ***** */ if(Switch<1) { if(CyclePrice>Price1SellA) { if(UseCycleFilter && SwitchC==1 && SellSwitchA) { MinorCycleSell[pos+BarNumber-Price1SellB]=0; //MinorBuySell LineBuffer[pos+BarNumber-Price1SellB]=0; //line } if(!UseCycleFilter && SellSwitchA) { MinorCycleSell[pos+BarNumber-Price1SellB]=0;//MinorBuySell LineBuffer[pos+BarNumber-Price1SellB]=0;//line } Price1SellA=CyclePrice; Price1SellB=BarNumber; SellSwitchA=true; } else if(CyclePrice=SweepA; else Condition1=CyclePrice<=(cyclePrice2 *(1-SweepA/1000)); if(Condition1 && SwitchA>=BuySellFac) { Switch=1; Price1BuyA=CyclePrice; Price1BuyB=BarNumber; SellSwitchA=false; BuySwitchA=false; } } } } /* ***************************************************************** */ LineBuffer[pos]=0; MinorCycleBuy[pos]=0; MinorCycleSell[pos]=0; /* ***************************************************************** */ if(BarNumber==1) { if(Strength==0) SweepB=range *MajorCycleStrength; else SweepB=Strength*MajorCycleStrength; Price2BuyA=CyclePrice; Price2SellA=CyclePrice; } /* ***************************************************************** */ if(BarNumber>1) { /* ***** */ if(Switch2>-1) { if(CyclePricePrice2BuyA) { SwitchB=BarNumber-Price2BuyB; if(!UseCycleFilter) { MajorCycleBuy[pos+SwitchB]=-1; //MajorBuySell green // LineBuffer[pos + SwitchB] = -1; //line-------------- } if(UseCycleFilter && SwitchC==1) { MajorCycleBuy[pos+SwitchB]=-1; //MajorBuySell green // LineBuffer[pos + SwitchB] = -1; //line----------------- SwitchE=1; } else SwitchE=0; BuySwitchB=true; double cyclePrice3=iMA(NULL,0,PriceActionFilter,0,MODE_SMMA,PRICE_CLOSE,pos+SwitchB); if(ActiveSwitch) Condition6=CyclePrice-cyclePrice3>=SweepB; else Condition6=CyclePrice>=cyclePrice3 *(1+SweepB/1000); if(Condition6 && SwitchB>=BuySellFac) { Switch2=-1; Price2SellA=CyclePrice; Price2SellB=BarNumber; SellSwitchB=false; BuySwitchB=false; } } } /* ***** */ if(Switch2<1) { if(CyclePrice>Price2SellA) { if(UseCycleFilter && SwitchC==1 && SellSwitchB) { MajorCycleSell[pos+BarNumber-Price2SellB]=0; //"MajorBuySell",red // LineBuffer[pos + BarNumber - Price2SellB ] = 0; //line ----- } if(!UseCycleFilter && SellSwitchB) { MajorCycleSell[pos+BarNumber-Price2SellB]=0;//"MajorBuySell",red // LineBuffer[pos + BarNumber - Price2SellB ] = 0; //line ----- } Price2SellA=CyclePrice; Price2SellB=BarNumber; SellSwitchB=true; } else if(CyclePrice=SweepB; else Condition6=CyclePrice<=cyclePrice4 *(1.0-SweepB/1000.0); if(Condition6 && SwitchB>=BuySellFac) { Switch2=1; Price2BuyA=CyclePrice; Price2BuyB=BarNumber; SellSwitchB=false; BuySwitchB=false; } } } } /* ***************************************************************** */ LineBuffer[pos]=0; MajorCycleSell[pos]=0; MajorCycleBuy[pos]=0; } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double ZeroLag(double price,int length,int pos) { if(length<3) { return(price); } double aa=MathExp(-1.414*3.14159/length); double bb=2*aa*MathCos(1.414*180/length); double CB=bb; double CC=-aa*aa; double CA=1 - CB - CC; double CD=CA*price + CB*ZL1[pos+1] + CC*ZL1[pos+2]; return(CD); } //+------------------------------------------------------------------+