Sometimes however, we may want to exclude the highest ranking symbol (or a couple of them) from trading. The code below shows how to do that using custom backtester<\/a>.<\/p>ExcludeTopN <\/span>= <\/span>1<\/span>; <\/span>\/\/ how many top positions to exclude
<\/span>SetCustomBacktestProc<\/span>(<\/span>""<\/span>);
if ( <\/span>Status<\/span>( <\/span>"action" <\/span>) == <\/span>actionPortfolio <\/span>)
{
<\/span>bo <\/span>= <\/span>GetBacktesterObject<\/span>();
<\/span>bo<\/span>.<\/span>PreProcess<\/span>();
for ( <\/span>bar <\/span>= <\/span>0<\/span>; <\/span>bar <\/span>< <\/span>BarCount<\/span>; <\/span>bar<\/span>++ )
{
<\/span>Cnt <\/span>= <\/span>0<\/span>;
for ( <\/span>sig <\/span>= <\/span>bo<\/span>.<\/span>GetFirstSignal<\/span>( <\/span>bar <\/span>); <\/span>sig<\/span>; <\/span>sig <\/span>= <\/span>bo<\/span>.<\/span>GetNextSignal<\/span>( <\/span>bar <\/span>) )
{
if ( <\/span>Cnt <\/span>< <\/span>ExcludeTopN <\/span>)
<\/span>sig<\/span>.<\/span>Price <\/span>= -<\/span>1<\/span>; <\/span>\/\/ exclude
<\/span>Cnt<\/span>++;
}
<\/span>bo<\/span>.<\/span>ProcessTradeSignals<\/span>( <\/span>bar <\/span>);
}
<\/span>bo<\/span>.<\/span>PostProcess<\/span>();
}
<\/span>EnableRotationalTrading<\/span>( <\/span>True <\/span>);
<\/span>SetOption<\/span>( <\/span>"MaxOpenPositions"<\/span>, <\/span>5 <\/span>);
<\/span>SetOption<\/span>( <\/span>"WorstRankHeld"<\/span>, <\/span>10 <\/span>);
<\/span>SetPositionSize<\/span>( <\/span>20<\/span>, <\/span>spsPercentOfEquity <\/span>);
<\/span>PositionScore <\/span>= <\/span>1 <\/span>\/ <\/span>RSI<\/span>( <\/span>14 <\/span>)<\/code>
The code is pretty straightforward mid-level
custom backtest<\/a> loop but it uses one trick – setting signal price to -1 tells AmiBroker to exclude given signal from further processing. Note also that signals retrieved by GetFirstSignal \/ GetNextSignal are already sorted, so the highest ranked signal appears first in the list.<\/p>","protected":false},"excerpt":{"rendered":"