hi,
I am working on code that allows for the combination of multiple systems.
Combining signals leads to situations that you need to cover 1 position and buy
3 positions at the same bar. Therefor in high level AFL you can not define the
positionSize properly since it needs a separate size for the cover and buy but
you are only allowed to fill 1 array element in the positionSize array.
So what I did is first define the buy/sell etc arrays and then I defined
separate positionSize arrays, positionSizeBuy, PositionSizeSell etc.
Then I define a dummy positionSize array so that the proper signals are
calculated except that in some cases the positionSize is at fault.
Then I use the "Custom Backtester" CBT to change the positionSize, see code
below.
My question: the CBT starts to loop through the bars starting at i = 0.
However, this index coincides with the start bar of the backtest which you set
in the AA window. The arrays in which I have set the positionSize I calculated
outside the CBT and have their index starting at the true starting index of the
complete data array.
So then I calculate the index at which the backtest starts and call that
bi_start, using:
bi_start = LastValue(ValueWhen(Status("firstbarintest"),bi));
This number I want to use inside the CBT code, for instance like:
positionSizeBuy[ bi_start + i ], to access the proper positionSize for a
certain element.
But once inside the CBT it does not recognise bi_start, it is set to 0. Why is
this?
thanks, Ed
snippet of code:
bi_start = LastValue(ValueWhen(Status("firstbarintest"),bi));
"";
"bi_start: " + WriteVal(bi_start);
"barindex backtest test: " + WriteVal(bi - bi_start);
"BarIndex(): " + WriteVal(bi);
// custom backtest. Replace dummy positionSize
SetCustomBacktestProc("");
if (Status("action") == actionPortfolio)
{
bo = GetBacktesterObject();
bo.PreProcess();
for (i = 0; i < BarCount; i++)
{
//_TRACE("bi_start");// + " " + bi_start[ i ];
for (sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i))
{
_TRACE("sig: " + sig.IsEntry() + " " + sig.IsExit() + " " + sig.IsLong() + "
" + sig.IsScale() + " " + i + " bi_start: " + bi_start);
// buy -1,0,-1,0
if (sig.IsEntry() AND !sig.IsExit() AND sig.IsLong() AND !sig.IsScale())
{
//_TRACE("Buy" + i);
sig.PosSize = positionSizeBuy[ bi_start + i ];
}
// short -1,0,0,0
else if (sig.IsEntry() AND !sig.IsExit() AND !sig.IsLong() AND !sig.IsScale())
{
//_TRACE("Short" + i);
sig.PosSize = positionSizeShort[ bi_start + i ];
}
// ScaleIn (long or short) 0,0,-1,-1
else if (!sig.IsEntry() AND !sig.IsExit() AND sig.IsLong() AND sig.IsScale())
{
//_TRACE("ScaleIn Long/Short" + i);
sig.PosSize = Max(positionSizeBuy[ bi_start + i ],positionSizeShort[
bi_start + i ]);
}
// sell 0,-1,-1,0
else if (!sig.IsEntry() AND sig.IsExit() AND sig.IsLong() AND !sig.IsScale())
{
//_TRACE("Sell" + i);
sig.PosSize = positionSizeSell[ bi_start + i ];
}
// cover 0,-1,0,0
else if (!sig.IsEntry() AND sig.IsExit() AND !sig.IsLong() AND !sig.IsScale())
{
//_TRACE("Cover" + i);
sig.PosSize = positionSizeCover[ bi_start + i ];
}
// ScaleOut (long or short) 0,0,0,-1
else if (!sig.IsEntry() AND !sig.IsExit() AND !sig.IsLong() AND sig.IsScale())
{
//_TRACE("ScaleOut Long/Short" + i);
sig.PosSize = Max(positionSizeBuy[ bi_start + i ],positionSizeShort[
bi_start + i ]);
}
}
bo.ProcessTradeSignals(i);
}
bo.PostProcess();
}