FVEStrategy.efs
EFSLibrary - Discussion Board
File Name: FVEStrategy.efs
Description:
FVE Strategy
Formula Parameters:
- Samples - number of bars to calculate FVE: 50
- FVEenterl - lower entry level of FVE: -20
- FVEenteru - upper entry level of FVE: 10
- MA - number of bars to calculate MA: 40
- LRPeriod - number of bars to calculate Linear regression: 20
- Bangle - the angle to buy: 30
- Sangle - the angle to sell: -30
- LRC - number of bars to calculate Linear regression slope: 30
- UB - limit for Linear regression rising: 0.1
- LB - limit for Linear regression falling: -0.5
- BarToExitOn - number of bars to exit position: 70
Notes:
This is a strategy based on FVE (Finite Volume Elements) indicator.
Download File:
FVEStrategy.efs
EFS Code:
/********************************* Provided By: eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2008. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name. eSignal is not responsible for the functionality once modified. eSignal reserves the right to modify and overwrite this EFS file with each new release. Description: FVE Strategy Version: 1.0 10/14/2008 Notes: This is a strategy based on FVE (Finite Volume Elements) indicator. Formula Parameters: Default: Samples - number of bars to calculate FVE 50 FVEenterl - lower entry level of FVE -20 FVEenteru - upper entry level of FVE 10 MA - number of bars to calculate MA 40 LRPeriod - number of bars to calculate Linear regression 20 Bangle - the angle to buy 30 Sangle - the angle to sell -30 LRC - number of bars to calculate Linear regression slope 30 UB - limit for Linear regression rising 0.1 LB - limit for Linear regression falling -0.5 BarToExitOn - number of bars to exit position 70 **********************************/ var fpArray = new Array(); var bInit = false; function preMain(){ setPriceStudy(false); setShowCursorLabel(false); setShowTitleParameters( false ); setStudyTitle("FVE Strategy"); setColorPriceBars(true); var x=0; fpArray[x] = new FunctionParameter("Samples", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Number Of Bars To Calculate FVE"); setLowerLimit(1); setDefault(50); } fpArray[x] = new FunctionParameter("FVEenterl", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Lower Entry Level Pf FVE"); setLowerLimit(-100); setDefault(-20); } fpArray[x] = new FunctionParameter("FVEenteru", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Upper Entry Level Of FVE"); setLowerLimit(1); setDefault(10); } fpArray[x] = new FunctionParameter("MA", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Length To Calculate MA"); setLowerLimit(1); setDefault(40); } fpArray[x] = new FunctionParameter("LRPeriod", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Length To Calculate Linear Regression"); setLowerLimit(1); setDefault(20); } fpArray[x] = new FunctionParameter("Bangle", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("The Angle To Buy"); setLowerLimit(0); setDefault(30); } fpArray[x] = new FunctionParameter("Sangle", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("The Angle To Sell"); setLowerLimit(-100); setDefault(-30); } fpArray[x] = new FunctionParameter("LRC", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Length Linear Regression Slope"); setLowerLimit(1); setDefault(30); } fpArray[x] = new FunctionParameter("UB", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Limit Ror Linear Regression Rising"); setLowerLimit(0); setDefault(0.1); } fpArray[x] = new FunctionParameter("LB", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Limit For Linear Regression Falling"); setLowerLimit(-100); setDefault(-0.5); } fpArray[x] = new FunctionParameter("BarToExitOn", FunctionParameter.NUMBER); with(fpArray[x++]){ setName("Length To Exit Position"); setLowerLimit(1); setDefault(70); } } var EMA_1 = 0; var EMA = 0; var VolumePlusMinusArray = new Array(); var FVEArray = new Array(); var BarsSinceEntry = 0; var xTP = null; function main(Samples, FVEenterl, FVEenteru, MA, LRPeriod, Bangle, Sangle, LRC, UB, LB, BarToExitOn){ var nState = getBarState(); var TP = 0, TP1 = 0, MF = 0, Cintra = .1, Cinter = .1, CutOff = 0, VolumePlusMinus = 0, FVE = 0, Fvesum = 0, FveFactor = 0, Intra = 0, Inter = 0, Vintra = 0, Vinter = 0, i = 0, VolSum = 0; K = 2 / (MA + 1), vHL = high(0) - low(0), vVar = vHL * 0.25, vAddVar = vVar * 0.35, Condition1 = false, Condition2 = false, Condition3 = false, Condition4 = false, Condition5 = false; var IntraArray = new Array(); var InterArray = new Array(); if (nState == BARSTATE_ALLBARS) { if(Samples == null) Samples = 50; if(FVEenterl == null) FVEenterl = -20; if(FVEenteru == null) FVEenteru = 10; if(MA == null) MA = 40; if(LRPeriod == null) LRPeriod = 20; if(Bangle == null) Bangle = 30; if(Sangle == null) Sangle = -30; if(LRC == null) LRC = 30; if(UB == null) UB = .1; if(LB == null) LB = -.5; if(BarToExitOn == null) BarToExitOn = 70; } if (bInit == false) { xTP = hlc3(); bInit = true; } if(getCurrentBarIndex() == 0) return; setPriceBarColor(Color.black); for(i = 0; i < Samples; i++){ IntraArray[i] = Math.log(high(-i)) - Math.log(low(-i)); InterArray[i] = Math.log(xTP.getValue(-i)) - Math.log(xTP.getValue(-i-1)); } Intra = Math.log(high(0)) - Math.log(low(0)); Vintra = StandardDev(IntraArray, Samples); Inter = Math.log(xTP.getValue(0)) - Math.log(xTP.getValue(-1)); Vinter = StandardDev(InterArray, Samples); CutOff = Cintra * Vintra + Cinter * Vinter; MF = (close(0) - (high(0) + low(0))/2)+ xTP.getValue(0) - xTP.getValue(-1); if(MF > CutOff * close(0)) FveFactor = 1; else if(MF < -1 * CutOff * close(0)) FveFactor = -1; else FveFactor=0; VolumePlusMinus = volume(0) * FveFactor; for(i = Samples - 1; i > 0; i--) VolumePlusMinusArray[i] = VolumePlusMinusArray[i - 1]; VolumePlusMinusArray[0] = VolumePlusMinus; for(i = 0; i < Samples; i++){ Fvesum += VolumePlusMinusArray[i]; VolSum += volume(-i); } if(VolumePlusMinusArray[Samples - 1] != null){ FVE = (Fvesum / VolSum) * 100; for(i = LRPeriod - 1; i > 0; i--) FVEArray[i] = FVEArray[i - 1]; FVEArray[0] = FVE; if (getBarState() == BARSTATE_NEWBAR) EMA_1 = EMA; EMA = K * FVE + (1 - K) * EMA_1; } else return; if(FVEArray[LRPeriod - 1] != null){ BarsSinceEntry++; if(FVE > FVEenterl && FVE < FVEenteru){ Condition1 = true; } if(LinearReg(FVEArray,LRPeriod,"AngleFC",LRC-1) > Bangle){ Condition2 = true; } if(FVE > EMA){ Condition3 = true; } if(LinearReg(close(0,-LRC),LRC,"Slope",LRC-1) < UB * LinearReg(close(0,-LRC),LRC,"Value",LRC-1) / 100 && LinearReg(close(0,-LRC),LRC,"Slope",LRC-1) > LB * LinearReg(close(0,-LRC),LRC,"Value",LRC-1) / 100){ Condition4 = true; } if(LinearReg(FVEArray,LRPeriod,"AngleFC",LRC-1) < Sangle){ Condition5 = true; } if(!Strategy.isLong() && Condition1 && Condition2 && Condition3 && Condition4){ Strategy.doLong("BUY", Strategy.CLOSE, Strategy.THISBAR); setPriceBarColor(Color.lime); drawTextRelative(-1, 0, "Long", Color.black, Color.lime, Text.VCENTER | Text.BOLD | Text.PRESET, null, null, "buyTxt" + getValue("time")); BarsSinceEntry = 0; } if(Condition5 && Strategy.isLong()){ Strategy.doSell("FVE EXIT", Strategy.CLOSE, Strategy.THISBAR); setPriceBarColor(Color.red); drawTextRelative(-1, 0, "Exit Long", Color.black, Color.red, Text.VCENTER | Text.BOLD | Text.PRESET, null, null, "buyTxt" + getValue("time")); } if(BarsSinceEntry == BarToExitOn && Strategy.isLong()){ Strategy.doSell("TimeBarsLX", Strategy.CLOSE, Strategy.THISBAR); setPriceBarColor(Color.red); drawTextRelative(-1, 0, "Exit Long", Color.black, Color.red, Text.VCENTER | Text.BOLD | Text.PRESET, null, null, "buyTxt" + getValue("time")); } return LinearReg(close(0,-LRC),LRC,"Slope",LRC-1); } else return; } function StandardDev(Array, Length, Type){ var i; var vSum = 0; var SumSqr = 0; var StdDev = 0; for(i = 0; i < Length; i++) vSum += Array[i]; if(Length != 0) for(i = 0; i < Length; i++) SumSqr += (Array[i] - vSum / Length) * (Array[i] - vSum / Length); StdDev = Math.sqrt(SumSqr / Length); return StdDev; } function LinearReg(Array, Length, Type, TargetB){ var i = 0, num1 = 0, num2 = 0, SumBars = 0, SumSqrBars = 0, SumY = 0, Sum1 = 0, Sum2 = 0, Slope = 0, Intercept = 0; if(Length == 0) return 0; SumBars = Length * (Length - 1) * .5; SumSqrBars = (Length - 1) * Length * (2 * Length - 1) / 6; Sum1 = 0; for(i = 0; i < Length; i++){ Sum1 += i * Array[i]; SumY += Array[i]; } Sum2 = SumBars * SumY; Num1 = Length * Sum1 - Sum2; Num2 = SumBars * SumBars - Length * SumSqrBars; if(Num2 != 0) Slope = Num1 / Num2; else Slope = 0; if(Type == "AngleFC") return Math.atan(Slope); else if(Type == "Slope") return Slope; else if(Type == "Value"){ Intercept = (SumY - Slope * SumBars) / Length; return Intercept + Slope * (Length - 1 - TargetB); } }