Original code:
{Calculate Wilders Average Directional Index [ADX] }
TH:= IF(Ref(Close,-1) > High,Ref(Close,-1), High);
TL:= IF(Ref(Close,-1) < Low ,Ref(Close,-1), Low );
TR:= TH-TL;
{--------------}
PlusDM := IF(High > Ref(High,-1) AND Low >= Ref(Low,-1), High-Ref(High,-1), If(High > Ref(High,-1) AND Low < Ref(Low,-1) AND High - Ref(High,-1) > Ref(Low,-1) - Low, High - Ref(High,-1),0));
PlusDI := 100 * Wilders(PlusDM,ADXPr) / Wilders(Tr,ADXPr);
MinusDM:= IF(Low < Ref(Low,-1) AND High <= Ref(High,-1), Ref(Low,-1) - Low, If(High > Ref(High,-1) AND Low < Ref(Low,-1) AND High - Ref(High,-1) < Ref(Low,-1) - Low, Ref(Low,-1) - Low,0));
{--------------}
MinusDI := 100 * Wilders(MinusDM,ADXPr) / Wilders(Tr,ADXPr);
DIDif := Abs(PlusDI - MinusDI);
DISum := PlusDI + MinusDI;
ADXFinal := 100 * Wilders(DIDif/DISum,ADXPr);
ADXRCustom:= (ADXFinal + Ref(ADXFinal,1-ADXPr)) / 2;
_ADX := IF( ADXtype = 0,ADXFinal,ADXRCustom);
{Calculate a Variable Moving Average using method devised by Tushar Chande}
Barnum := BarCount();
EmaIndex:= IF(VarMAPr > 0 ,(2 / (1+VarMAPr)) ,0.20);
Diff := HHV(_ADX, ADXPr) - LLV(_ADX, ADXPr);
MyConst := IF(Diff > 0,(_ADX - LLV(_ADX,ADXPr)) / Diff,EmaIndex);
MyConst := IF(MyConst > EmaIndex,EmaIndex,MyConst);
VarMA := IF(Barnum < ADXPr + (ADXPr * 1.5), Close,MOV((((1 - MyConst) * Ref(VarMA,-1)) + (MyConst * Close)), 2, s));
{Calculte & Plot Multiple MA's of the Variable Moving Average}
MA1 :=Mov(VarMA, 2,Initial_MA_Type);
MA2 :=Mov(VarMA, 4,Initial_MA_Type);
MA3 :=Mov(VarMA, 6,Initial_MA_Type);
MA4 :=Mov(VarMA, 8,Initial_MA_Type);
MA5 :=Mov(VarMA,10,Initial_MA_Type);
MA6 :=Mov(VarMA,12,Initial_MA_Type);
MA7 :=Mov(VarMA,14,Initial_MA_Type);
MA8 :=Mov(VarMA,16,Initial_MA_Type);
MA9 :=Mov(VarMA,18,Initial_MA_Type);
MA10:=Mov(VarMA,20,Initial_MA_Type);
MA11:=Mov(VarMA,22,Initial_MA_Type);
MA12:=Mov(VarMA,24,Initial_MA_Type);
MA13:=Mov(VarMA,26,Initial_MA_Type);
MA14:=Mov(VarMA,28,Initial_MA_Type);
MA15:=Mov(VarMA,30,Initial_MA_Type);
MA16:=Mov(VarMA,32,Initial_MA_Type);
MA17:=Mov(VarMA,34,Initial_MA_Type);
MA18:=Mov(VarMA,36,Initial_MA_Type);
MA19:=Mov(VarMA,38,Initial_MA_Type);
MA20:=Mov(VarMA,40,Initial_MA_Type);
MA21:=Mov(VarMA,42,Initial_MA_Type);
MA22:=Mov(VarMA,44,Initial_MA_Type);
MA23:=Mov(VarMA,46,Initial_MA_Type);
MA24:=Mov(VarMA,48,Initial_MA_Type);
MA25:=Mov(VarMA,50,Initial_MA_Type);
MA26:=Mov(VarMA,52,Initial_MA_Type);
MA27:=Mov(VarMA,54,Initial_MA_Type);
MA28:=Mov(VarMA,56,Initial_MA_Type);
MA29:=Mov(VarMA,58,Initial_MA_Type);
MA30:=Mov(VarMA,60,Initial_MA_Type);
MA31:=Mov(VarMA,62,Initial_MA_Type);
MA32:=Mov(VarMA,64,Initial_MA_Type);
MA33:=Mov(VarMA,66,Initial_MA_Type);
MA34:=Mov(VarMA,68,Initial_MA_Type);
MA35:=Mov(VarMA,70,Initial_MA_Type);
MA36:=Mov(VarMA,72,Initial_MA_Type);
MA37:=Mov(VarMA,74,Initial_MA_Type);
MA38:=Mov(VarMA,76,Initial_MA_Type);
MA39:=Mov(VarMA,78,Initial_MA_Type);
MA40:=Mov(VarMA,80,Initial_MA_Type);
MA41:=Mov(VarMA,82,Initial_MA_Type);
MA42:=Mov(VarMA,84,Initial_MA_Type);
MA43:=Mov(VarMA,86,Initial_MA_Type);
MA44:=Mov(VarMA,88,Initial_MA_Type);
MA45:=Mov(VarMA,90,Initial_MA_Type);
MA46:=Mov(VarMA,92,Initial_MA_Type);
MA47:=Mov(VarMA,94,Initial_MA_Type);
MA48:=Mov(VarMA,98,Initial_MA_Type);
MA49:=Mov(VarMA,100,Initial_MA_Type);
My code for Metastock:
TH:= If(Ref(CLOSE,-1) > HIGH,Ref(CLOSE,-1), HIGH);
TL:= If(Ref(CLOSE,-1) < LOW ,Ref(CLOSE,-1), LOW );
TR:= TH-TL;
PlusDM := If(HIGH > Ref(HIGH,-1) AND LOW >= Ref(LOW,-1), HIGH-Ref(HIGH,-1), If(HIGH > Ref(HIGH,-1) AND LOW < Ref(LOW,-1) AND HIGH - Ref(HIGH,-1) > Ref(LOW,-1) - LOW, HIGH - Ref(HIGH,-1),0));
ADXPr:=8;
PlusDI := 100 * Wilders(PlusDM,ADXPr) / Wilders(Tr,ADXPr);
MinusDM:= If(LOW < Ref(LOW,-1) AND HIGH <= Ref(HIGH,-1), Ref(LOW,-1) - LOW, If(HIGH > Ref(HIGH,-1) AND LOW < Ref(LOW,-1) AND HIGH - Ref(HIGH,-1) < Ref(LOW,-1) - LOW, Ref(LOW,-1) - LOW,0));
MinusDI := 100 * Wilders(MinusDM,ADXPr) / Wilders(Tr,ADXPr);
DIDif := Abs(PlusDI - MinusDI);
DISum := PlusDI + MinusDI;
ADXFinal := 100 * Wilders(DIDif/DISum,ADXPr);
ADXRCustom:= (ADXFinal + Ref(ADXFinal,1-ADXPr)) / 2;
ADXtype:=0;
VADX := If(ADXtype = 0,ADXFinal,ADXRCustom);
Barnum := BarsSince(100);
VarMAPr:=4;
EmaIndex:= If(VarMAPr > 0 ,(2 / (1+VarMAPr)) ,0.20);
Diff := HHV(VADX, ADXPr) - LLV(VADX, ADXPr);
MyConst := If(Diff > 0,(VADX - LLV(VADX,ADXPr)) / Diff,EmaIndex);
MyConst := If(MyConst > EmaIndex,EmaIndex,MyConst);
VarMA := If(Barnum < ADXPr + (ADXPr * 1.5), CLOSE,Mov((((1 - MyConst) * Ref(VarMA,-1)) + (MyConst * CLOSE)), 2, S));
Two probelms i am facing is,
1) VarMa not returning any value
2) Metastock limiting to number of variables defined to 20
So point 2 can be solvable, as all MA's are computed from VarMa only, so once VarMa got completed, one can add moving averages on it.
Please help in getting VarMa...
Disclaimer: i am a new coder, its an attmept from my side