hi, In a backtest on a portfolio of futures, in the 5-minute time domain I am trying to close all positions during the day when a certain return threshold is reached. I know this can be programmed using high level AFL code by calling the ~~~EQUITY function and I have done this.
Now I am trying to do the same calculation using CBT code. I have it working almost. The logic is: 1) loop through all bars 2) calculate the equity at each bar and save in a temporary array 3) loop through the open positions 4) when the equity of the previous bar (bar - 1) is greater that the threshold close the open position at the open of "bar". this should ensure that any other open positions found later during the day will be closed out immidiatelly at the open. It almost seems to work but I can't figure out what is wrong. Anyone see a problem? As far as I can see it uses the wrong price when I exit a trade. It seems it does not take the price at "bar" but at "bar + 1". thanks ,Ed SetCustomBacktestProc(""); if( Status("action") == actionPortfolio ) { bo = GetBacktesterObject(); bo.PreProcess(); // temporary equity save array eqsave = 0; for( bar = 0; bar < BarCount; bar++ ) { CurrentPortfolioEquity = bo.Equity; // save portfolio equity on each bar eqsave[ bar ] = CurrentPortfolioEquity; for (openpos = bo.GetFirstOpenPos(); openpos; openpos = bo.GetNextOpenPos()) { firstBarOfDayIndex = StaticVarGet( "firstBarOfDayIndex" + openpos.Symbol ); bi = StaticVarGet( "bi" + openpos.Symbol ); dbar = bi[ bar ] - firstBarOfDayIndex[ bar ]; equityStartDay = eqsave[ bar - dbar ]; _TRACE("equityStartDay: " + equityStartDay); _TRACE("CurrentPortfolioEquity - equityStartDay: " + (CurrentPortfolioEquity - equityStartDay)); _TRACE("symbol: " + openpos.Symbol); _TRACE("firstBarOfDayIndex[ bar ]: " + firstBarOfDayIndex[ bar ]); _TRACE("bi[ bar ]: " + bi[ bar ]); _TRACE("bar: " + bar); _TRACE("dbar: " + dbar); // close out open position at open if threshold previous bar has been crossed if( eqsave[ bar - 1 ] - equityStartDay > thresholdEquity ) { _TRACE("***** threshold crossed at bar: " + (bar - 1)); _TRACE("exit price: " + openpos.GetPrice(bar, "O")); bo.ExitTrade(bar,openpos.Symbol,openpos.GetPrice(bar, "O")); } //bo.UpdateStats(bar, 1); // Update MAE/MFE stats for bar //bo.UpdateStats(bar, 2); // Update stats at bar's end } bo.ProcessTradeSignals( bar ); } bo.PostProcess(); } else if ( Status( "Actionex" ) == actionBacktest ) { StaticVarSet( "firstBarOfDayIndex" + Name(),firstBarOfDayIndex); StaticVarSet( "bi" + Name(),BarIndex()); }