Source: https://fxcodebase.com/code/viewtopic.php?f=17&t=1735
Forum: 17 · Topic 1735 · 17 post(s)
Apprentice · Tue Aug 10, 2010 9:14 am

Value1 = ((Close - Open) + 2(Close[1] - Open[1]) + 2(Close[2] - Open[2]) + (Close[3] - Open[3]))/6; Value2 = ((High - Low) + 2(High[1] - Low[1]) + 2(High[2] - Low[2]) + (High[3] - Low[3]))/6;
Num = Sum(Value1, Frame); Denom = Sum(Value2, Frame);
RVI = Num / Denom; RVISig = (RVI + 2RVI[1] + 2RVI[2] + RVI[3])/6;
The indicator was revised and updated
jefftrader · Tue Aug 10, 2010 2:01 pm
i have downloaded it and installed and it works perfectly.
thanks so much for your support and timeliness.
i appreciate it more than i can say………..
pipsqueak · Sun Nov 25, 2012 8:41 pm
Is this perhaps. the “Relative Vigor Index”?
Apprentice · Mon Nov 26, 2012 4:36 am
That they are one and the same.
Code: Select all `{****************** Relative Vigor Index (RVI) Copyright (c) 2001 MESA Software *******************} Inputs: Length(10);
Vars: Num(0), Denom(0), count(0), RVI(0), RVISig(0);
Value1 = ((Close - Open) + 2(Close[1] - Open[1]) + 2(Close[2] - Open[2]) + (Close[3] - Open[3]))/6; Value2 = ((High - Low) + 2(High[1] - Low[1]) + 2(High[2] - Low[2]) + (High[3] - Low[3]))/6; Num = 0; Denom = 0; For count = 0 to Length -1 begin Num = Num + Value1[count]; Denom = Denom + Value2[count]; End; If Denom <> 0 then RVI = Num / Denom;
RVISig = (RVI + 2RVI[1] + 2RVI[2] + RVI[3])/6;
Plot1(RVI, “RVI”); Plot2(RVISig, “Sig”);`
Although I have found a different formula. Will implement both, for comparison.
RVI = (CLOSE - OPEN) / (HIGH - LOW) The Relative Vigor Index (RVI) oscillator is smoothed by the 10-period simple moving average. A signal line is also formed as a 4-period moving average on the oscillator values.
Apprentice · Mon Nov 26, 2012 5:02 am

RVI = (CLOSE - OPEN) / (HIGH - LOW) The Relative Vigor Index (RVI) oscillator is smoothed by the 10-period simple moving average. ć A signal line is also formed as a 4-period moving average on the oscillator values.
Coondawg71 · Wed May 15, 2013 11:34 pm
Adaptive Relative Vigor Index.
Can we please request this indicator converted to Lua. Full code posted on this link, last indicator listed on the page.
Thanks,
sjc
http://www.mql5.com/en/articles/288
Apprentice · Fri May 17, 2013 4:58 am
Your request is added to the development list.
Patrick Sweet · Sat Nov 16, 2013 4:44 pm
can this code be used?
Code: Select all `//+——————————————————————+ //| Adaptive RVI.mq5 | //| Based on RVI by MetaQuotes Software Corp. | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+——————————————————————+ #property copyright ”2009, MetaQuotes Software Corp.” #property copyright ”2011, Adaptive version Investeo.pl” #property link “http://www.mql5.com” #property description “Adaptive Relative Vigor Index” //— indicator settings #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_color1 Green #property indicator_color2 Red #property indicator_label1 “AdaptiveRVI” #property indicator_label2 “Signal”
#define Price(i) ((high[i]+low[i])/2.0)
//— input parameters input int InpRVIPeriod=10; // Initial RVI Period //— indicator buffers double ExtRVIBuffer[]; double ExtSignalBuffer[]; //— int hCyclePeriod; input double InpAlpha=0.07; // alpha for Cycle Period int AdaptiveRVIPeriod;
#define TRIANGLE_PERIOD 3 #define AVERAGE_PERIOD (TRIANGLE_PERIOD*2) //+——————————————————————+ //| Custom indicator initialization function | //+——————————————————————+ int OnInit() { //— indicator buffers mapping SetIndexBuffer(0,ExtRVIBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA); IndicatorSetInteger(INDICATOR_DIGITS,3); hCyclePeriod=iCustom(NULL,0,”CyclePeriod”,InpAlpha); if(hCyclePeriod==INVALID_HANDLE) { Print(“CyclePeriod indicator not available!”); return(-1); } //— sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,(InpRVIPeriod-1)+TRIANGLE_PERIOD); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,(InpRVIPeriod-1)+AVERAGE_PERIOD); //— name for DataWindow and indicator subwindow label IndicatorSetString(INDICATOR_SHORTNAME,”AdaptiveRVI”); PlotIndexSetString(0,PLOT_LABEL,”AdaptiveRVI”); PlotIndexSetString(1,PLOT_LABEL,”Signal”); //— initialization done return 0; } //+——————————————————————+ //| Relative Vigor Index | //+——————————————————————+ int OnCalculate(const int rates_total,const int prev_calculated, const datetime &Time[], const double &Open[], const double &High[], const double &Low[], const double &Close[], const long &TickVolume[], const long &Volume[], const int &Spread[]) { int i,j,nLimit; double dValueUp,dValueDown,dNum,dDeNum; double CyclePeriod[4]; int copied; copied=CopyBuffer(hCyclePeriod,0,0,4,CyclePeriod);
if(copied<=0) { Print(“FAILURE: Could not get values from CyclePeriod indicator.”); return -1; } AdaptiveRVIPeriod = int(floor((4CyclePeriod[0]+3CyclePeriod[1]+2*CyclePeriod[2]+CyclePeriod[3])/20.0)); //— check for bars count if(rates_total<=AdaptiveRVIPeriod+AVERAGE_PERIOD+2) return(0); // exit with zero result //— check for possible errors if(prev_calculated<0) return(0); // exit with zero result //— last counted bar will be recounted nLimit=AdaptiveRVIPeriod+2; if(prev_calculated>AdaptiveRVIPeriod+TRIANGLE_PERIOD+2) nLimit=prev_calculated-1; //— set empty value for uncalculated bars if(prev_calculated==0) { for(i=0;i<AdaptiveRVIPeriod+TRIANGLE_PERIOD;i++) ExtRVIBuffer[i]=0.0; for(i=0;i<AdaptiveRVIPeriod+AVERAGE_PERIOD;i++) ExtSignalBuffer[i]=0.0; } //— RVI counted in the 1-st buffer for(i=nLimit;i<rates_total && !IsStopped();i++) { copied=CopyBuffer(hCyclePeriod,0,rates_total-i-1,4,CyclePeriod);
if(copied<=0) { Print(“FAILURE: Could not get values from CyclePeriod indicator.”); return -1; } AdaptiveRVIPeriod = int(floor((4CyclePeriod[0]+3CyclePeriod[1]+2CyclePeriod[2]+CyclePeriod[3])/20.0)); dNum=0.0; dDeNum=0.0; for(j=i;j>MathMax(i-AdaptiveRVIPeriod, 3);j–) { //Print(“rates_total=”+IntegerToString(rates_total)+” nLimit=”+IntegerToString(nLimit)+ // “ AdaptiveRVIPeriod=”+IntegerToString(AdaptiveRVIPeriod)+” j=”+IntegerToString(j)); dValueUp=Close[j]-Open[j]+2(Close[j-1]-Open[j-1])+2(Close[j-2]-Open[j-2])+Close[j-3]-Open[j-3]; dValueDown=High[j]-Low[j]+2(High[j-1]-Low[j-1])+2(High[j-2]-Low[j-2])+High[j-3]-Low[j-3]; dNum+=dValueUp; dDeNum+=dValueDown; } if(dDeNum!=0.0) ExtRVIBuffer[i]=dNum/dDeNum; else ExtRVIBuffer[i]=dNum; } //— signal line counted in the 2-nd buffer nLimit=AdaptiveRVIPeriod+TRIANGLE_PERIOD+2; if(prev_calculated>AdaptiveRVIPeriod+AVERAGE_PERIOD+2) nLimit=prev_calculated-1; for(i=nLimit;i<rates_total && !IsStopped();i++) ExtSignalBuffer[i]=(ExtRVIBuffer[i]+2ExtRVIBuffer[i-1]+2*ExtRVIBuffer[i-2]+ExtRVIBuffer[i-3])/AVERAGE_PERIOD;
//— OnCalculate done. Return new prev_calculated. return(rates_total); } //+——————————————————————+`
Apprentice · Sun Nov 17, 2013 3:19 am
Can you privide required CyclePeriod Indicator?
Patrick Sweet · Mon Nov 18, 2013 8:39 am
I think this is it…
We extracted the Dominant Cycle measurement from CyclePeriod indicator and apply it to RVI period. The “Length” variable is computed as a four bar weighted moving average of the period……
copied=CopyBuffer(hCyclePeriod,0,0,4,CyclePeriod);
if(copied<=0) { Print(“FAILURE: Could not get values from CyclePeriod indicator.”); return -1; } AdaptiveRVIPeriod = int(floor((4CyclePeriod[0]+3CyclePeriod[1]+2*CyclePeriod[2]+CyclePeriod[3])/20.0));
Patrick Sweet · Mon Nov 18, 2013 8:48 am
If the above is not complete….. and we need the adaptive CyberCycle then here it comes….. with a note on Ehlers alpha…..
Expotential moving alpha is related to the length of a simple moving average by the equation alpha, in the Adaptive Cyber Cycle indicator Mr. Ehlers used the Dominant Cycle period as the length in computation of alpha1 coefficient.
Code: Select all `#property description “Adaptive CyberCycle indicator - described by John F. Ehlers” #property description “in "Cybernetic Analysis for Stocks and Futures"” #property description “This indicator is available for free download.”
#property indicator_buffers 2 #property indicator_plots 2 #property indicator_width1 1 #property indicator_width2 1 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_color1 Green #property indicator_color2 Red #property indicator_label1 “Cycle” #property indicator_label2 “Trigger Line”
#define Price(i) ((high[i]+low[i])/2.0)
double Smooth[]; double Cycle[]; double Trigger[];
int hCyclePeriod; input double InpAlpha=0.07; // alpha for Cycle Period //+——————————————————————+ //| Custom indicator initialization function | //+——————————————————————+ int OnInit() { //— indicator buffers mapping ArraySetAsSeries(Cycle,true); ArraySetAsSeries(Trigger,true); ArraySetAsSeries(Smooth,true);
SetIndexBuffer(0,Cycle,INDICATOR_DATA); SetIndexBuffer(1,Trigger,INDICATOR_DATA);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
hCyclePeriod=iCustom(NULL,0,”CyclePeriod”,InpAlpha); if(hCyclePeriod==INVALID_HANDLE) { Print(“CyclePeriod indicator not available!”); return(-1); } return(0); } //+——————————————————————+ //| Custom indicator iteration function | //+——————————————————————+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //— long tickCnt[1]; int i; int ticks=CopyTickVolume(Symbol(), 0, 0, 1, tickCnt); if(ticks!=1) return(rates_total); double CyclePeriod[1],alpha1;
Comment(tickCnt[0]);
if(prev_calculated==0 || tickCnt[0]==1) { //— last counted bar will be recounted int nLimit=rates_total-prev_calculated-1; // start index for calculations
ArraySetAsSeries(high,true); ArraySetAsSeries(low,true);
ArrayResize(Smooth,Bars(_Symbol,_Period)); ArrayResize(Cycle,Bars(_Symbol,_Period)); if(nLimit>rates_total-4) // adjust for last bars nLimit=rates_total-4;
for(i=nLimit;i>=0 && !IsStopped();i–) { Smooth[i]=(Price(i)+2Price(i+1)+2Price(i+2)+Price(i+3))/6.0; int copied=CopyBuffer(hCyclePeriod,0,i,1,CyclePeriod);
if(copied<=0) { Print(“FAILURE: Could not get values from CyclePeriod indicator.”); return -1; } alpha1 = 2.0/(CyclePeriod[0]+1.0); //Print(alpha1); //Print(CyclePeriod[0]); if(i>=0) { Cycle[i]=(1.0-0.5alpha1) *(1.0-0.5alpha1) (Smooth[i]-2.0Smooth[i+1]+Smooth[i+2]) +2.0(1.0-alpha1)Cycle[i+1]-(1.0-alpha1)(1.0-alpha1)Cycle[i+2];
//Print(“Smooth[“+IntegerToString(i)+”]=”+DoubleToString(Smooth[i])+” Cycle[“+IntegerToString(i)+”]=”+DoubleToString(Cycle[i])); } else { Cycle[i]=(Price(i)-2.0*Price(i+1)+Price(i+2))/4.0; }
//Print(FILE+FUNCTION+” received values: “,rCnt); Trigger[i]=Cycle[i+1]; } } //— return value of prev_calculated for next call return(rates_total); } //+——————————————————————+`
Apprentice · Mon Nov 18, 2013 9:06 am
I need CyclePeriod indicator code. Its output is the basis for the proper functioning of the “Adaptive CyberCycle indicator
Apprentice · Mon Nov 18, 2013 11:30 am

This is what I could find on the internet. There are several versions out there.
Adaptive CyberCycle indicator.lua
Patrick Sweet · Mon Nov 18, 2013 3:21 pm
hi, Here comes the cyber cycle indicator…..is that what you got or is this what you need?
Cyber Cycle indicator The Cyber Cycle indicator is a high-pass filter taken from “Сybernetic analysis for stocks and futures”. This filter leaves only the cycle mode component from timeseries. Additionaly two-bar and three-bar cycle components are extracted from the result by smoothing it with a finite impulse response low pass filter.
Code: Select all `#property description “CyberCycle indicator - described by John F. Ehlers” #property description “in "Cybernetic Analysis for Stocks and Futures"” #property description “This indicator is available for free download.”
#property indicator_buffers 2 #property indicator_plots 2 #property indicator_width1 1 #property indicator_width2 1 #property indicator_type1 DRAW_LINE #property indicator_type2 DRAW_LINE #property indicator_color1 Green #property indicator_color2 Red #property indicator_label1 “Cycle” #property indicator_label2 “Trigger Line”
#define Price(i) ((high[i]+low[i])/2.0)
double Smooth[]; double Cycle[]; double Trigger[];
input double InpAlpha=0.07; // alpha //+——————————————————————+ //| Custom indicator initialization function | //+——————————————————————+ int OnInit() { //— indicator buffers mapping ArraySetAsSeries(Cycle,true); ArraySetAsSeries(Trigger,true); ArraySetAsSeries(Smooth,true);
SetIndexBuffer(0,Cycle,INDICATOR_DATA); SetIndexBuffer(1,Trigger,INDICATOR_DATA);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
return(0); } //+——————————————————————+ //| Custom indicator iteration function | //+——————————————————————+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //— long tickCnt[1]; int i; int ticks=CopyTickVolume(Symbol(), 0, 0, 1, tickCnt); if(ticks!=1) return(rates_total);
Comment(tickCnt[0]);
if(prev_calculated==0 || tickCnt[0]==1) { //— last counted bar will be recounted int nLimit=rates_total-prev_calculated-1; // start index for calculations
ArraySetAsSeries(high,true); ArraySetAsSeries(low,true);
ArrayResize(Smooth,Bars(_Symbol,_Period)); ArrayResize(Cycle,Bars(_Symbol,_Period)); if(nLimit>rates_total-4) // adjust for last bars nLimit=rates_total-4;
for(i=nLimit;i>=0 && !IsStopped();i–) { Smooth[i]=(Price(i)+2Price(i+1)+2Price(i+2)+Price(i+3))/6.0;
if(i<rates_total-5) { Cycle[i]=(1.0-0.5InpAlpha) *(1.0-0.5InpAlpha) (Smooth[i]-2.0Smooth[i+1]+Smooth[i+2]) +2.0(1.0-InpAlpha)Cycle[i+1]-(1.0-InpAlpha)(1.0-InpAlpha)Cycle[i+2]; } else { Cycle[i]=(Price(i)-2.0*Price(i+1)+Price(i+2))/4.0; }
//Print(FILE+FUNCTION+” received values: “,rCnt); Trigger[i]=Cycle[i+1]; } } //— return value of prev_calculated for next call return(rates_total); } //+——————————————————————+`
Patrick Sweet · Tue Nov 19, 2013 3:04 am
Thank you A! Much appreciated!!!
P
Alexander.Gettinger · Wed Jun 04, 2014 5:29 pm
MQL4 version of Ehlers RVI oscillator: viewtopic.php?f=38&t=60771.
Apprentice · Mon Jun 19, 2017 8:20 am
The indicator was revised and updated.