FVE Strategy

ICE Data Services -


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/2008Notes:    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);	}}