November 25, 2014
Using loops with TimeFrame functions
AmiBroker features a powerful set of TimeFrame functions that allow combining different time intervals in single system formula. There is one aspect of TimeFrame functions that is important to understand to properly use them. When we switch to higher interval using TimeFrameSet function – the BarCount does not really change – TimeFrameSet just squeezes the arrays so we have first N-bars filled with Null values (undefined) and then – last part of the array contains the actual time-compressed values. This is explained in details here: http://www.amibroker.com/guide/h_timeframe.html
Normally it does not present any problem as long as we use array functions, because array functions check for Nulls occuring at the beginning of the data series and skip them appropriately. The story is different when we try to use loops.
If we want to use looping code in higher time-frame, we can not really start our calculations from the bar 0, because it would contain Null instead of real data. That is why we would first need to detect were the actual compressed data begins and start calculations on that particular bar instead.
Here is a sample formula showing how to compute AMA function in a loop, based on weekly data (the code should be applied in Daily interval). Code will identify the first non-Null bar and initialize the first AMA value with Close of that bar, then it will continue calculations
Plot( Close, "Close", colorBlack );
// switch to higher timeframe
TimeFrameSet( inWeekly );
smooth = 0.2;
myAMA = Close;
// search for start (non-null) bar
for( start = 0; start < BarCount; start++ )
{
if( NOT IsNull( Close[ start ] ) ) break;
}
// looping code
for ( i = start + 1; i < BarCount; i++ )
{
// this part will execute only after the first non-null bar has been identified
myAMA[ i ] = Close[ i ] * smooth + myAMA[ i - 1 ] * ( 1 - smooth );
}
// regular AMA function for comparison
weeklyAMA = AMA( Close, 0.2 );
//restore original time-frame
TimeFrameRestore();
// plot expanded values retrieved from Weekly frame
Plot( TimeFrameExpand( myAMA, inWeekly ), "weekly AMA loop", colorRed );
Plot( TimeFrameExpand( weeklyAMA, inWeekly ), "weekly AMA", colorBlue, styleDots )
The code above is good for pre-5.90 versions. In version 5.90 we have a new function that counts Nulls for us making the code shorter and clearer, as shown below:
Version( 5.90 );
Plot( Close, "Close", colorBlack );
// switch to higher timeframe
TimeFrameSet( inWeekly );
smooth = 0.2;
myAMA = Close;
// new 5.90 function that counts leading Nulls
start = NullCount( Close );
// looping code
for ( i = start + 1; i < BarCount; i++ )
{
// this part will execute only after the first non-null bar has been identified
myAMA[ i ] = Close[ i ] * smooth + myAMA[ i - 1 ] * ( 1 - smooth );
}
// regular AMA function for comparison
weeklyAMA = AMA( Close, 0.2 );
//restore original time-frame
TimeFrameRestore();
// plot expanded values retrieved from Weekly frame
Plot( TimeFrameExpand( myAMA, inWeekly ), "weekly AMA loop", colorRed );
Plot( TimeFrameExpand( weeklyAMA, inWeekly ), "weekly AMA", colorBlue, styleDots )
Filed by Tomasz Janeczko at 5:26 pm under Indicators
Comments Off on Using loops with TimeFrame functions