Tried your code using my current ASX100 list and it showed your MaxLossPercentStop string as the reason for a few of the exits, which corresponded with trades with losses greater than 15%, so it seems to work.
One thing I don't understand though is why all the other exits have reason code one, which is supposed to be max loss, when they are just normal exits. According to the help information, they should have reason code zero. Regards, GP --- In [email protected], "tipequity" <[EMAIL PROTECTED]> wrote: > > GP, you are right, one problem had to you with OpenPos returning null > so I changed the code to the following: > if (OpenPos AND OpenPos.GetPercentProfit()<=-15) > However, it seems that the above code only returns zero. If you run > this code you will notice that I have written a rawtextoutput that > prints OpenPos.GetPercentProfit() and all the return values are zero. > I have a feeling that I am mixing apples and oranges in my code. > > Regards > > --- In [email protected], "gp_sydney" <gp.investment@> > wrote: > > > > Probably because OpenPos is returning Null when there's no open > > position for that stock. Any time you call a function to get an > > object, you need to test that the object returned is not Null. > > > > Technically this should be done with a statement like: > > > > if (!IsNull(OpenPos)) > > > > but the following also works due to the nature of Null: > > > > if (OpenPos) > > > > Regards, > > GP > > > > > > --- In [email protected], "tipequity" <l3456@> wrote: > > > > > > > > > if (OpenPos.GetPercentProfit()>15) > > > > > > --- In [email protected], "gp_sydney" <gp.investment@> > > > wrote: > > > > > > > > On which line? And what is the error message? > > > > > > > > Regards, > > > > GP > > > > > > > > > > > > --- In [email protected], "tipequity" <l3456@> wrote: > > > > > > > > > > Thanks GP for pointing that out. I been fooling around with > the > > > code > > > > > all weekend long and inadvertantly posted the wrong one. The > > > problem > > > > > is that it produces error on that line. > > > > > > > > > > > > > > > --- In [email protected], "gp_sydney" > <gp.investment@> > > > > > wrote: > > > > > > > > > > > > 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" <l3456@> > 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)); > > > > > > > > > > > > > > > > > > > > > > > > > > > >
