Not being interested in this indicator but just for fun...
The entire code can be significantly optimized to higher speed performance using AMA2 function instead of first loop and averaging code part (2nd loop) may use visible chart area etc.
For example just compare the higher responsiveness if you insert the two AFL versions into a chart pane (one pane per AFL). Then you will see that the difference is huge on tens of thousands of bars and more.
BTW, you mean 5.90 not 4.90. 4.90 is of year 2007.
The entire code can be significantly optimized to higher speed performance using AMA2 function instead of first loop and averaging code part (2nd loop) may use visible chart area etc.
For example just compare the higher responsiveness if you insert the two AFL versions into a chart pane (one pane per AFL). Then you will see that the difference is huge on tens of thousands of bars and more.
BTW, you mean 5.90 not 4.90. 4.90 is of year 2007.
Code:
/***************************************
Solar Wind Joy Translated from MT4 to Amibroker
heavily modified by trash to significantly improve speed of original code by KelvinHand
origins from http://www.traderji.com/amibroker/98121-convert-solar-wind-joy-mt4-indicator-afl-2.html
****************************************/
Version( 5.90 );
period = Param( "Period", 35, 1 );
smooth = Param( "Smoothing period", 10, 1 );
//---- mod by trash start
// using AMA2 -> huge speed up by using array instead of loop
function aFishFunc( period ) {
MaxH = HHV( H, period );
MinL = LLV( L, period );
midbar = ( H + L ) / 2;
array1 = 2 * ( ( midbar - MinL ) / ( MaxH - MinL + 1e-30 ) - 0.5 );
Value = AMA2( array1, 0.33, 0.67 );
Value = Min( Max( Value, -0.999 ), 0.999 );
array2 = log( ( 1 + Value ) / ( 1 - Value ) );
aFish = AMA2( array2, 0.5, 0.5 );
return IIf( aFish > 0, 10, -10 );
}
function VarSum( per ) {
result = per;
for( i = 1; i < per; i++ )
result += per - i;
return result;
}
// two times used average calculation put to function
function cAverage( array, period ) {
bi = BarIndex();
if( Status( "action" ) == actionIndicator ) {
startbar = Max( period, FirstVisibleValue( bi ) - period );
endbar = LastVisibleValue( bi );
} else {
startbar = period;
endbar = BarCount - 1;
}
//
result = Null;
for( i = startbar; i <= endbar; i++ ) {
SumI = 0;
for( k = 0; k < period; k++ ) {
weight = period - k;
SumI += weight * array[i - k];
}
result[i] = SumI;
}
return result / VarSum( period );
}
aFish = aFishFunc( period );
aLine = cAverage( cAverage( aFish, smooth ), smooth );
// --- mod by trash end
colorH = IIf( aLine > 0, colorBrightGreen,
IIf( aLine < 0, colorRed, colorGold ) );
Plot( aLine, "", colorH, stylenolabel | styleHistogram, Null, Null, 0, 0, -30 );
colorL = IIf( /*mod by trash*/Sum(aLine > 0, 2) == 2, colorBrightGreen,
IIf( /*mod by trash*/Sum(aLine < 0, 2) == 2, colorRed, colorGold ) );
Plot( aLine, "", colorL, stylenolabel | stylethick );
PlotGrid( 0, colorLightgrey, 6, 1, True );
Title = StrFormat( "{{NAME}} - {{INTERVAL}} - Solar Wind Joy: " +
EncodeColor( SelectedValue( ColorL ) ) + "%g", aline );
Looks exactly same on the chart, values are also matching but then did't know how to check for the performance
so just added some random buy sell code to both the code (same logic to both)
now surprisingly the results were slight different,
very small difference though . . . and no other big noticeable difference, but maybe it will be during live market
anyway something nice to experiment and learn on a weekend :thumb:
Thanks