//+------------------------------------------------------------------+ //| Inverse Fisher Transform of RSI.mq4 | //| Treberk's Conversion | //| Treberk's Conversion | //+------------------------------------------------------------------+ #property copyright "Treberkn\'s Conversion" #property link "Treberk\'s Conversion" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 DimGray #property indicator_color2 Red //Inputs extern double HiTrigger= 0.5; // default= 0.5 extern double LoTrigger=-0.5; // default=-0.5 extern int RsiBars=5; // default=5 extern int WmaBars=9; // default=9 extern bool info =false; // default=0 extern bool zer0Bar =false; // default=0 //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer2); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer1); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- // SetLoopCount(0); //-------------------------------------------------------- //Variables: // Generic int shift; int loopBegin; bool is_First=True; double prevbars; int count; //Variables: // Specific // Name(\"InvFisher RSI\"), double Value2; double IFish; // for manual calc. RSI double SumUp; double SumDn; double AvgUp; double AvgDn; double Delta; double RSI; // for calc. WMA double WmaNumerator; double WmaDenominator; datetime LastTime; double PrevAvgUp; double PrevAvgDn; int cntdown; //Arrays: // for ( calc. generic WMA (weighted moving average) double Value1[40]; // Usage /*[if (info ) { Alert(\"See Terminal>Journal Tab for ( usage of \\n\",Name); Print(\"|___________________\"); Print(\"|* \",Name,\" *\"); Print(\"| \",\"Sell: cross under HiTrigger (or under LoTrigger if (no prior cross under HiTrigger)\"); Print(\"| \",\"Buy: cross over LoTrigger (or over HiTrigger if (no prior cross over LoTrigger)\"); Print(\"|* \",Name,\" *\"); Print(\"|```````````````````\"); }]*/ //-------------------------------------------------------- // Check Inputs if (0>HiTrigger || HiTrigger>1 ) { Alert("Input Error: must be 0< HiTrigger <1, Cannot=",HiTrigger); return(0); } if (-1>LoTrigger || LoTrigger>0 ) { Alert("Input Error: must be -1< LoTrigger <0, Cannot=",LoTrigger); return(0); } if (0>RsiBars || RsiBars>50 ) { Alert("Input Error: must be 0< RsiBars <50, Cannot=",RsiBars); return(0); } //-------------------------------------------------------- // Check for ( additional bars loading or total reloadng. if (Bars<prevbars || Bars-prevbars>1 ) is_First=True; prevbars=Bars; //-------------------------------------------------------- // Pre-Loop setup // loopbegin prevents counting of previously plotted bars excluding current Bars if (is_First ) { loopBegin=Bars-1-1;// BarIndexNumber=Shift=Bars-1...0 // Compute the initial AvgUp & AvgDn for RSI for ( shift=loopBegin; shift>=loopBegin-RsiBars; shift--) { Delta=Close[shift]-Close[shift+1]; SumUp=SumUp+MathMax(0,Delta); SumDn=SumDn-MathMin(0,Delta); } AvgUp=SumUp/RsiBars; AvgDn=SumDn/RsiBars; loopBegin=loopBegin-RsiBars; } //-------------------------------------------------------- // loop from loopbegin to current bar (shift=0) if (! is_First ) { if ((Time[0]!=LastTime) ) { PrevAvgUp = AvgUp; PrevAvgDn = AvgDn; AvgUp = 0; AvgDn = 0; for ( count=WmaBars-1; count>=1; count--) { Value1[count]=Value1[count-1]; } LastTime = Time[0]; } } else { if(zer0Bar)cntdown = 0; else cntdown = 1; } for ( shift=loopBegin; shift>=cntdown; shift--) { // Calc RSI manually Delta=Close[shift]-Close[shift+1]; if (is_First ) { AvgUp=((RsiBars-1)*AvgUp+MathMax(0,Delta))/RsiBars; AvgDn=((RsiBars-1)*AvgDn-MathMin(0,Delta))/RsiBars; } else { AvgUp=((RsiBars-1)*PrevAvgUp+MathMax(0,Delta))/RsiBars; AvgDn=((RsiBars-1)*PrevAvgDn-MathMin(0,Delta))/RsiBars; } RSI=100-100/(1+AvgUp/AvgDn); // ) scale RSI to between -5 and +5 /* Do not use iRSI fctn because it\'s too slow Value1=0.1*(iRSI(RsiBars,shift)-50); */ Value1[0]=0.1*(RSI-50); // Use weighted moving average to smooth Value1. // Ehler suggests could also use EMA, which would be simpler coding at the expense of Alpha. WmaNumerator=0; WmaDenominator=0; for ( count=WmaBars; count>= 1; count--) { WmaNumerator=WmaNumerator+count*Value1[WmaBars-count-1]; WmaDenominator=WmaDenominator+count; } Value2=WmaNumerator/WmaDenominator; IFish=(MathExp(2*Value2)-1)/(MathExp(2*Value2)+1); ExtMapBuffer1[shift]=IFish; // SetIndexValue[shift]=RSI; // Plot dual-value Trigger Line if (IFish >0 ) ExtMapBuffer2[shift]=HiTrigger; else ExtMapBuffer2[shift]=LoTrigger; //-------------------------------------------------------- // Update arrays. This technique minimizes array storage and thus allows more signal bars. if (is_First ) for ( count=WmaBars-1; count>= 1; count--) { Value1[count]=Value1[count-1]; } //-------------------------------------------------------- } is_First = False; cntdown = 0; loopBegin = 0; //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Relative strength index
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen