I've only had a quick glance through your code, but it looks like you're testing for the profit being greater than 15%, not the loss.
I think the sell signal generated by ApplyStop should include reason code 1 for maximum loss. Try checking that. Regards, GP --- In [email protected], "tipequity" <[EMAIL PROTECTED]> wrote: > > How can test to see of max loss percent has been met (using CBI)? > Below is my feeble attempt. > Thanks in advance > > /*==================================================================== > ========== > Global Settings > ====================================================================== > ========*/ > SetBarsRequired(1000000,0); /* this ensures that the charts include > all bars AND NOT just those on screen */ > SetFormulaName("System Four with Stochastics-6"); /* name it for > backtest report identification */ > SetOption("InitialEquity", 100000); /* starting capital */ > SetOption("CommissionAmount",8); /* commissions AND cost */ > SetOption("CommissionMode", 2); /* set commissions AND costs as $ per > trade */ > SetTradeDelays( 1, 1, 1, 1); > SetOption("PriceBoundChecking", 1); /* trade only within the chart > bar's price range */ > SetOption("UsePrevBarEquityForPosSizing", 1); /* set the use of last > bars equity for trade size */ > /* SetOption("MinPosValue", ); */ > SetOption("AllowPositionShrinking", True); > SetOption("MinShares", 100); > SetOption("AccountMargin", 100); > SetOption("HoldMinBars",2 ); /* Set Minimun Holding Days to 2 Days*/ > RoundLotSize = 1 ; > PositionSize = - 10; /* trade size will be 10% of available equity */ > MaxLossPercentStop = 15 ; > ApplyStop(0, 1, MaxLossPercentStop, 0, False, 0); > > SetBacktestMode( backtestRegularRaw ); > > /*==================================================================== > ========== > > ====================================================================== > ========*/ > > TradeDate = DateTime(); > > SetCustomBacktestProc(""); > > MaxBuys = 3; // Set no more than 4 buys per day > > if( Status("action") == actionPortfolio ) > { > bo = GetBacktesterObject(); > bo.PreProcess(); > > Symbol = " "; > TransType = ""; > CommissionAmount = 8; > SEC_Fee = 0; > Rank = 0; > TradeSize = 0; > Shares = 0; > TransAmount = 0; > Reason = 0; > Price = 0; > CashBal = bo.InitialEquity; > EquityBal = bo.Equity; > ProfitPercent = 0; > > for( i = 0; i < BarCount; i++ ) > { > cntBuys = 0; > // look at new signals and exclude signals if they exceed maxBuys > for( sig = bo.GetFirstSignal(i); sig; sig = > bo.GetNextSignal(i) ) > { > EquityBal = bo.Equity; > // check for Sell signal > if (sig.IsExit() AND sig.Type == 2 ) > { > // scan through open positions > OpenPos = bo.FindOpenPos( > sig.Symbol ); > // check for entry signal and long > signal > > if (OpenPos.GetPercentProfit()>15) > { > Symbol = sig.Symbol; > TransType = "Sold"; > Shares = OpenPos.Shares; > Price = sig.Price; > SEC_Fee = round((OpenPos.Shares * > Price)*(1530/1000000))/100; > CommissionAmount = 8 + SEC_Fee; > TransAmount = (OpenPos.Shares * > Price)- CommissionAmount; > CashBal = CashBal + TransAmount; > > ProfitPercent = > OpenPos.GetPercentProfit(); > Reason = "MaxLossPercentStop"; > Rank = ""; > > bo.RawTextOutput( > > Symbol + > > "\t" + cntBuys + > > "\t" + TransType + > > "\t" + DateTimeToStr(TradeDate[ i ]) + > > "\t" + Price + > > "\t" + "Shares " + Shares + > > "\t" + "Commission " + CommissionAmount + > > "\t" + "Amount " + TransAmount + > > "\t" + "PosSize " + TradeSize + > > "\t" + "CashBal " + CashBal + > > "\t" + "Cash " + bo.Cash + > > "\t" + "EquityBal " + EquityBal + > > "\t" + "Reason " + Reason + > > "\t" + "Profit% " + ProfitPercent + > > "\t" + Rank > > ); > } > else if( openpos AND openpos.IsLong ) > { > Symbol = sig.Symbol; > TransType = "Sold"; > Shares = OpenPos.Shares; > Price = sig.Price; > SEC_Fee = round((OpenPos.Shares * > Price)*(1530/1000000))/100; > CommissionAmount = 8 + SEC_Fee; > TransAmount = (OpenPos.Shares * > Price)- CommissionAmount; > CashBal = CashBal + TransAmount; > > Reason = sig.Reason; > Rank = ""; > > bo.RawTextOutput( > > Symbol + > > "\t" + cntBuys + > > "\t" + TransType + > > "\t" + DateTimeToStr(TradeDate[ i ]) + > > "\t" + Price + > > "\t" + "Shares " + Shares + > > "\t" + "Commission " + CommissionAmount + > > "\t" + "Amount " + TransAmount + > > "\t" + "PosSize " + TradeSize + > > "\t" + "CashBal " + CashBal + > > "\t" + "Cash " + bo.Cash + > > "\t" + "EquityBal " + EquityBal + > > "\t" + "Reason " + Reason + > > "\t" + "Profit% " + ProfitPercent + > > "\t" + Rank > > ); > } > } > // check for entry signal > } > bContinue = True; > for( sig = bo.GetFirstSignal(i); sig; sig = > bo.GetNextSignal(i) ) > { > if( sig.IsEntry() ) > { > Symbol = sig.Symbol; > TradeSize = (bo.Equity / - > sig.PosSize); > Shares = round(TradeSize/sig.Price); > Price = sig.Price; > if( cntBuys > MaxBuys ) > { > sig.PosSize = 0; > TransType = "Rejected"; > Reason = "Exceed Max No. > Trades per Day"; > bo.RawTextOutput( > > Symbol + > > "\t" + cntBuys + > > "\t" + TransType + > > "\t" + DateTimeToStr(TradeDate[ i ]) + > > "\t" + Price + > > "\t" + "Shares " + Shares + > > "\t" + "Commission " + CommissionAmount + > > "\t" + "Amount " + TransAmount + > > "\t" + "PosSize " + TradeSize + > > "\t" + "CashBal " + CashBal + > > "\t" + "Cash " + bo.Cash + > > "\t" + "EquityBal " + EquityBal + > > "\t" + "Reason " + Reason + > > "\t" + "Profit% " + > > "\t" + Rank > > ); > } > else > { > TransType = "Bought"; > cntBuys = cntBuys + 1; > TransAmount = -(Shares * > Price)-CommissionAmount; > CashBal = CashBal + > TransAmount; > Reason = sig.Reason; > Rank = sig.PosScore; > > bo.RawTextOutput( > > Symbol + > > "\t" + cntBuys + > > "\t" + TransType + > > "\t" + DateTimeToStr(TradeDate[ i ]) + > > "\t" + Price + > > "\t" + "Shares " + Shares + > > "\t" + "Commission " + CommissionAmount + > > "\t" + "Amount " + TransAmount + > > "\t" + "PosSize " + TradeSize + > > "\t" + "CashBal " + CashBal + > > "\t" + "Cash " + bo.Cash + > > "\t" + "EquityBal " + EquityBal + > > "\t" + "Reason " + Reason + > > "\t" + "Profit% " + > > "\t" + Rank > > ); > } > } > } > bo.ProcessTradeSignals( i ); > } > bo.PostProcess(); > } > > > //fast = Optimize("fast", 12, 5, 20, 1 ); > //slow = Optimize("slow", 26, 10, 25, 1 ); > Buy=Cross(MACD(12,26),Signal(12,26)); > Sell=Cross(Signal(12,26),MACD(12,26)); >
