/***********************************************************************/
void __declspec(dllexport) FVE(struct s_sg &sg)
{
if(sg.Inputs[2]==0)
{
sg.GraphName="Finite Volume Element";sg.SubgraphName[0]="FVE";
} else
{
sg.GraphName="FVE Linear Regression Slope";
sg.SubgraphName[0]="";sg.SubgraphName[1]="FVELRS"; sg.SubgraphName[2]="PriceLRS";
};
sg.SubgraphName[3]="0";
sg.DrawZeros=1;
sg.InputNames[2]="Type: 0=FVE, 1=LinRegresFVE";
sg.InputNames[3]="Volatility Cut Off";
sg.InputNames[4]="Samples";
sg.InputNames[5]="LRS Length";
sg.InputNames[6]="PriceSlope Multiplier";
sg.FreeDLL=1;
if(sg.ArraySize<100) return;
int i,pos;
float TP=0,TP1,MF,VolumePlusMinus=0,FVESum=0,VolAve=0,FVEFactor,FVE,
Sum1=0,SumY=0,Sum2=0,SumBars,SumSqrBars, Num1, Num2, FVESlope, PriceSlope, Intercept;
if(sg.Inputs[3]==0) sg.Inputs[3]=0.0002;
float CutOff=sg.Inputs[3];
if(sg.Inputs[4]==0) sg.Inputs[4]=21;
int Samples=sg.Inputs[4];
if(sg.Inputs[5]==0) sg.Inputs[5]=35;
int Len=sg.Inputs[5];
if(sg.Inputs[6]==0) sg.Inputs[6]=1;
sg.DataStartIndex=Samples+5;
SumBars= Len*(Len-1)*0.5;
SumSqrBars=(Len-1)*Len*(2*Len-1)/6;
Num2=(SumBars*SumBars)-(Len*SumSqrBars);
for (pos=sg.DataStartIndex; pos < sg.ArraySize; pos++)
{
TP1=TP;
TP = sg.BaseDataIn[7][pos];
MF = ( sg.BaseDataIn[3][pos] - ((sg.BaseDataIn[1][pos] + sg.BaseDataIn[2][pos] )/2) )+ TP - TP1 ;
if(MF > CutOff * sg.BaseDataIn[3][pos])
FVEFactor = 1; else
if(MF < (-1 * CutOff * sg.BaseDataIn[3][pos]))
FVEFactor = -1; else
FVEFactor = 0.000001;
VolumePlusMinus = sg.BaseDataIn[4][pos] * FVEFactor ;
FVESum = FVESum+VolumePlusMinus;
VolAve = VolAve+sg.BaseDataIn[4][pos];
FVE = ((FVESum/Samples)/(VolAve/Samples)) * 100 ; //
if(sg.Inputs[2]==0)
{sg.SubGraphDataOut[0][pos] = FVE;} else
{
sg.SubGraphDataOut[6][pos] = FVE;
if ( pos>=50)
{
Sum1=0; SumY=0;
for (i=0; i<=(Len-1); i++) {Sum1 = Sum1 + (i) * sg.SubGraphDataOut[6][pos-i];}
for (i=0; i<=(Len-1); i++) {SumY = SumY + sg.SubGraphDataOut[6][pos-i];}
Sum2=SumBars*SumY;
Num1=(Len*Sum1)-Sum2;
if(Num2!=0) FVESlope = Num1/Num2; else
FVESlope=0;
}
if ( pos>=50)
{
Sum1=0; SumY=0;
for (i=0; i<=(Len-1); i++) {Sum1 = Sum1 + (i) * sg.BaseDataIn[3][pos-i];}
for (i=0; i<=(Len-1); i++) {SumY = SumY + sg.BaseDataIn[3][pos-i];}
Sum2=SumBars*SumY;
Num1=(Len*Sum1)-Sum2;
if(Num2!=0) PriceSlope = Num1/Num2; else
PriceSlope=0;
}
sg.SubGraphDataOut[1][pos] = FVESlope;
sg.SubGraphDataOut[2][pos] = PriceSlope*sg.Inputs[6];
sg.SubGraphDataOut[3][pos] = 0;
};
sg.SubGraphDataOut[4][pos] = VolumePlusMinus;
sg.SubGraphDataOut[5][pos] = sg.BaseDataIn[4][pos];
FVESum = FVESum-sg.SubGraphDataOut[4][pos-Samples+1];
VolAve = VolAve-sg.SubGraphDataOut[5][pos-Samples+1];
}
};
/***********************************************************************/
void __declspec(dllexport) VFI(struct s_sg &sg)
{
sg.GraphName="Volume Flow Indicator";
if(sg.Inputs[2]==0)
{
sg.SubgraphName[0]="VFI"; sg.SubgraphName[1]=""; sg.SubgraphName[2]="";
} else
{
sg.SubgraphName[0]="VFI Neutral";sg.SubgraphName[1]="VFI Up"; sg.SubgraphName[2]="VFI Dn";
};
sg.SubgraphName[3]="VFI Smoothed";
sg.InputNames[2]="Type: 0= One Colour, 1= Three Colour";
sg.InputNames[3]="Period";
sg.InputNames[4]="Coeff";
sg.InputNames[5]="Max Volume Cutoff";
sg.InputNames[6]="Smoothing Period";
sg.FreeDLL=1;
if(sg.ArraySize<100) return;
int i,pos;
double VFI=0, VFISmooth=0, VFISmooth1, MF, Inter, VInter, MyVolAvg=0, MyVolAvg1, VAve, CutOff, VMax,VC,DirectionalVolume,
sum=0, sma, sumstd, sumsqrs,sumd=0 ;
if(sg.Inputs[3]==0) sg.Inputs[3]=130;
int Period=sg.Inputs[3];
if(sg.Inputs[4]==0) sg.Inputs[4]=0.2;
double Coef=sg.Inputs[4];
if(sg.Inputs[5]==0) sg.Inputs[5]=2.5;
double VCoef=sg.Inputs[5];
if(sg.Inputs[6]==0) sg.Inputs[6]=3;
double factor0 = 2/(sg.Inputs[6]+1);
sg.DataStartIndex=Period+5;
for (pos=sg.DataStartIndex; pos < sg.ArraySize; pos++)
{
sg.SubGraphDataOut[3][pos]=0;
MyVolAvg1=MyVolAvg;
MyVolAvg = MyVolAvg+sg.BaseDataIn[4][pos];
if(sg.BaseDataIn[7][pos]>0 & sg.BaseDataIn[7][pos-1]>0)
{
Inter = log10(sg.BaseDataIn[7][pos]) - log10(sg.BaseDataIn[7][pos-1]);
sg.SubGraphDataOut[4][pos] = Inter; // Calculate Std Deviation of Inter
sum = sum + Inter;
sma = sum/30 ;
sum = sum - sg.SubGraphDataOut[4][pos-30+1];
sumsqrs=0;
for(i=0; i<30; i++)
{
sumsqrs = sumsqrs + ((sg.SubGraphDataOut[4][pos-i]-sma)*(sg.SubGraphDataOut[4][pos-i]-sma));
}
VInter= sqrtf(sumsqrs/30); // stddev
CutOff = Coef * VInter * sg.BaseDataIn[3][pos] ;
VAve = MyVolAvg1/Period ;
VMax = VAve * VCoef ;
if(sg.BaseDataIn[4][pos] < VMax) VC=sg.BaseDataIn[4][pos]; else VC=VMax;
MF = sg.BaseDataIn[7][pos] - sg.BaseDataIn[7][pos-1];
if(MF>CutOff) DirectionalVolume=VC; else if(MF<-CutOff) DirectionalVolume=-VC; else DirectionalVolume=0;
sg.SubGraphDataOut[6][pos] = DirectionalVolume;
sumd = sumd + DirectionalVolume;
VFI = (sumd/Period) / VAve ;
sumd = sumd - sg.SubGraphDataOut[6][pos-Period+1];
if(pos>sg.DataStartIndex) VFISmooth = (1-factor0)*sg.SubGraphDataOut[3][pos-1] + factor0*VFI;
}
else
{ VFISmooth = 0; };
if(sg.Inputs[2]==0) sg.SubGraphDataOut[0][pos] = VFI; else
{
if(MF==CutOff) sg.SubGraphDataOut[0][pos] = VFI; else
if(MF>CutOff) sg.SubGraphDataOut[1][pos] = VFI; else
if(MF<CutOff) sg.SubGraphDataOut[2][pos] = VFI;
};
sg.SubGraphDataOut[3][pos] = VFISmooth;
sg.SubGraphDataOut[5][pos] = sg.BaseDataIn[4][pos];
MyVolAvg = MyVolAvg-sg.SubGraphDataOut[5][pos-Period+1];
}
};