Stock Portfolio Organizer
The ultimate porfolio management solution.
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
The Real Jurik Moving Average (JMA) (Translated to Amibroker) for Amibroker (AFL)
I don’t remember where I got this formula but if I am not mistaken it was translated from MT4 to Amibroker by a German programmer. I’ve tested with original JMA, and the results are the same/accurate (if I’m not mistaken) but there are drawbacks, maybe because the translation is not perfect, sometimes we got an error. For example, the error (Error 10. Array subscript out of range) sometimes appears when changing timeframe to monthly. Maybe someone can fix it?
Many thanks are for Jurik, to the original coder and anyone who can fix the error and share the fix.
Screenshots
Indicator / Formula
//+------------------------------------------------------------------+
//SetBarsRequired(ceil(20+80*(r1^0.36)));
//SetBarsRequired(200,0);
function IntPortion( Paramet )
{
return IIf( Paramet > 0, floor( Paramet ), ceil( Paramet ) );
};
//+------------------------------------------------------------------+
function JJMA( Array, Length, Phase )
{
//----buffers
fC0Buffer = fC8Buffer = fA8Buffer = 0;
JMAValueBuffer = Array;
JMAValue = 0;
loopCriteria = cycleDelta = cycleLimit = counterA = counterB = JMATempValue = 0;
//+------------------------------------------------------------------+
//|JMAinitFlagizationfunction|
//+------------------------------------------------------------------+
ring2 = 0;
ring1 = 0;
buffer = 0;
//----initialpart
limitValue = 63;
startValue = 64;
//----
for( i = 0; i <= limitValue; i++ )
list[i] = -1000000;
for( i = startValue; i <= 127; i++ )
list[i] = 1000000;
//----
initFlag = True;
lengthParam = IIf( Length < 1.0000000002, 0.0000000001, ( Length - 1 ) / 2.0 );
//----
if( Phase < -100 )
phaseParam = 0.5;
else
if( Phase > 100 )
phaseParam = 2.5;
else
phaseParam = Phase / 100.0 + 1.5;
//----
logParam = log( sqrt( lengthParam ) ) / log( 2.0 );
//----
logParam = IIf( ( logParam + 2.0 ) < 0, 0, logParam + 2.0 );
//----
sqrtParam = sqrt( lengthParam ) * logParam;
lengthParam = lengthParam * 0.9;
lengthDivider = lengthParam / ( lengthParam + 2.0 );
//----
//+------------------------------------------------------------------+
//|JMAiterationfunction|
//+------------------------------------------------------------------+
//----maincycle
loopParam = 0;
for( shift = 0; shift <= BarCount - 1; shift++ )
{
series = Array[shift];
if( loopParam < 61 )
{
loopParam++;
buffer[loopParam] = series;
}
if( loopParam > 30 )
{
if( initFlag )
{
initFlag = False;
diffFlag = 0;
for( i = 1; i <= 29; i++ )
{
if( buffer[i + 1] != buffer[i] )
diffFlag = 1;
}
highLimit = diffFlag * 30;
if( highLimit == 0 )
paramB = series;
else
paramB = buffer[1];
paramA = paramB;
if( highLimit > 29 )
highLimit = 29;
}
else
highLimit = 0;
//----bigcycle
for( i = highLimit; i >= 0; i-- )
{
if( i == 0 )
sValue = series;
else
sValue = buffer[31 - i];
if( abs( sValue - paramA ) > abs( sValue - paramB ) )
absValue = abs( sValue - paramA );
else
absValue = abs( sValue - paramB );
dValue = absValue + 0.0000000001; //1.0e-10;
if( counterA <= 1 )
counterA = 127;
else
counterA--;
if( counterB <= 1 )
counterB = 10;
else
counterB--;
if( cycleLimit < 128 )
cycleLimit++;
cycleDelta = cycleDelta + ( dValue - ring2[counterB] );
ring2[counterB] = dValue;
if( cycleLimit > 10 )
highDValue = cycleDelta / 10.0;
else
highDValue = cycleDelta / cycleLimit;
if( cycleLimit > 127 )
{
dValue = ring1[counterA];
ring1[counterA] = highDValue;
s68 = 64;
s58 = s68;
while( s68 > 1 )
{
if( list[s58] < dValue )
{
s68 = s68 / 2.0;
s58 = s58 + s68;
}
else
if( list[s58] <= dValue )
{
s68 = 1;
}
else
{
s68 = s68 / 2.0;
s58 = s58 - s68;
}
}
}
else
{
ring1[counterA] = highDValue;
if( ( limitValue + startValue ) > 127 )
{
startValue--;
s58 = startValue;
}
else
{
limitValue++;
s58 = limitValue;
}
if( limitValue > 96 )
s38 = 96;
else
s38 = limitValue;
if( startValue < 32 )
s40 = 32;
else
s40 = startValue;
}
//----
s68 = 64;
s60 = s68;
while( s68 > 1 )
{
if( list[s60] >= highDValue )
{
if( list[s60 - 1] <= highDValue )
{
s68 = 1;
}
else
{
s68 = s68 / 2.0;
s60 = s60 - s68;
}
}
else
{
s68 = s68 / 2.0;
s60 = s60 + s68;
}
if( ( s60 == 127 ) && ( highDValue > list[127] ) )
s60 = 128;
}
if( cycleLimit > 127 )
{
if( s58 >= s60 )
{
if( ( ( s38 + 1 ) > s60 ) && ( ( s40 - 1 ) < s60 ) )
lowDValue = lowDValue + highDValue;
else
if( ( s40 > s60 ) && ( ( s40 - 1 ) < s58 ) )
lowDValue = lowDValue + list[s40 - 1];
}
else
if( s40 >= s60 )
{
if( ( ( s38 + 1 ) < s60 ) && ( ( s38 + 1 ) > s58 ) )
lowDValue = lowDValue + list[s38 + 1];
}
else
if( ( s38 + 2 ) > s60 )
lowDValue = lowDValue + highDValue;
else
if( ( ( s38 + 1 ) < s60 ) && ( ( s38 + 1 ) > s58 ) )
lowDValue = lowDValue + list[s38 + 1];
if( s58 > s60 )
{
if( ( ( s40 - 1 ) < s58 ) && ( ( s38 + 1 ) > s58 ) )
lowDValue = lowDValue - list[s58];
else
if( ( s38 < s58 ) && ( ( s38 + 1 ) > s60 ) )
lowDValue = lowDValue - list[s38];
}
else
{
if( ( ( s38 + 1 ) > s58 ) && ( ( s40 - 1 ) < s58 ) )
lowDValue = lowDValue - list[s58];
else
if( ( s40 > s58 ) && ( s40 < s60 ) )
lowDValue = lowDValue - list[s40];
}
}
if( s58 <= s60 )
{
if( s58 >= s60 )
list[s60] = highDValue;
else
{
for( j = s58 + 1; j <= ( s60 - 1 ); j++ )
{
list[j - 1] = list[j];
}
list[s60 - 1] = highDValue;
}
}
else
{
for( j = s58 - 1; j >= s60; j-- )
{
list[j + 1] = list[j];
}
list[s60] = highDValue;
}
if( cycleLimit <= 127 )
{
lowDValue = 0;
for( j = s40; j <= s38; j++ )
{
lowDValue = lowDValue + list[j];
}
}
//----
if( ( loopCriteria + 1 ) > 31 )
loopCriteria = 31;
else
loopCriteria++;
JMATempValue = sqrtDivider = sqrtParam / ( sqrtParam + 1.0 );
if( loopCriteria <= 30 )
{
if( sValue - paramA > 0 )
paramA = sValue;
else
paramA = sValue - ( sValue - paramA ) * sqrtDivider;
if( sValue - paramB < 0 )
paramB = sValue;
else
paramB = sValue - ( sValue - paramB ) * sqrtDivider;
JMATempValue = series;
if( loopCriteria == 30 )
{
fC0Buffer[shift] = series;
if( ceil( sqrtParam ) >= 1 )
intPart = ceil( sqrtParam );
else
intPart = 1;
leftInt = IntPortion( intPart );
if( floor( sqrtParam ) >= 1 )
intPart = floor( sqrtParam );
else
intPart = 1;
rightPart = IntPortion( intPart );
if( leftInt == rightPart )
dValue = 1.0;
else
dValue = ( sqrtParam - rightPart ) / ( leftInt - rightPart );
if( rightPart <= 29 )
upShift = rightPart;
else
upShift = 29;
if( leftInt <= 29 )
dnShift = leftInt;
else
dnShift = 29;
fA8Buffer[shift] = ( series - buffer[loopParam - upShift] ) * ( 1 - dValue ) / rightPart + ( series - buffer[loopParam - dnShift] ) * dValue / leftInt;
}
}
else
{
dValue = lowDValue / ( s38 - s40 + 1 );
if( 0.5 <= logParam - 2.0 )
powerValue = logParam - 2.0;
else
powerValue = 0.5;
if( logParam >= ( absValue / dValue )^powerValue )
dValue = ( absValue / dValue )^powerValue;
else
dValue = logParam;
if( dValue < 1 )
dValue = 1;
powerValue = sqrtDivider ^ ( sqrt( dValue ) );
if( sValue - paramA > 0 )
paramA = sValue;
else
paramA = sValue - ( sValue - paramA ) * powerValue;
if( sValue - paramB < 0 )
paramB = sValue;
else
paramB = sValue - ( sValue - paramB ) * powerValue;
}
}
//----endofbigcycle
if( loopCriteria > 30 )
{
JMATempValue = JMAValueBuffer[shift - 1];
powerValue = lengthDivider ^ dValue;
squareValue = powerValue ^ 2;
fC0Buffer[shift] = ( 1 - powerValue ) * series + powerValue * fC0Buffer[shift - 1];
fC8Buffer[shift] = ( series - fC0Buffer[shift] ) * ( 1 - lengthDivider ) + lengthDivider * fC8Buffer[shift - 1];
fA8Buffer[shift] = ( phaseParam * fC8Buffer[shift] + fC0Buffer[shift] - JMATempValue ) *
( powerValue * ( -2.0 ) + squareValue + 1 ) + squareValue * fA8Buffer[shift - 1];
JMATempValue = JMATempValue + fA8Buffer[shift];
}
JMAValue = JMATempValue;
}
if( loopParam <= 30 )
JMAValue = C[BarCount - 1];
JMAValueBuffer[shift] = JMAValue;
//----Endofmaincycle
}
return JMAValueBuffer;
}
P = ParamField( "Price field", -1 );
Periods = Param( "Periods", 15, 2, 300, 1, 10 );
phase = Param( "Phase", 0, -100, 100, 1, 1 );
SetBarsRequired( ceil( 20 + 80 * ( Periods ^ 0.36 ) ) );
Plot( JJMA( P, Periods, phase ), "JurikJMA", ParamColor( "Color", colorCycle ), ParamStyle( "Style" ) );2 comments
Leave Comment
Please login here to leave a comment.
Back
i’m not the translator not the creator of this program, not 100% perfect, hope someone can improve it.
change last line like to this line: