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); } }