Customised Avg. Profit %, Avg. Loss % etc.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:3k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Customised Avg. Profit %, Avg. Loss % etc
  4. //  Author/Uploader: Paul Ho 
  5. //  E-mail:          paultsho@yahoo.com.au
  6. //  Date/Time Added: 2006-09-28 08:54:39
  7. //  Origin:          
  8. //  Keywords:        Average Profit Loss Custom Backtest Procedure
  9. //  Level:           medium
  10. //  Flags:           system
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=722
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=722
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  With the current definition of Avg. Profit %, Avg. Loss % and Avg.
  17. //  Profit/Loss %, it is possible to have a negative Avg. profit/loss % even
  18. //  though the Avg. profit/loss is positive.
  19. //
  20. //  An alternative defintion is being implemented through the custom backtest
  21. //  procedure. Avg. Profit/loss %is to be equal to "sum of Profit / sum of
  22. //  position value", and similar defintions to Avg. Profit % and Avg. Loss %.
  23. //
  24. //------------------------------------------------------------------------------
  25. SetCustomBacktestProc("");  
  26. if( Status("action") == actionPortfolio ) 
  27. bo = GetBacktesterObject();
  28. bo.Backtest();
  29. PosSumProfit = 0;
  30. NegSumProfit = 0;
  31. PosTradePos = 0;
  32. NegTradePos = 0;
  33. // iterate through closed trades first 
  34. for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() ) 
  35. profit = trade.GetProfit(); 
  36. if(profit >= 0)
  37. {
  38. PosSumProfit = PosSumProfit + profit;
  39. PosTradePos = PosTradePos + trade.GetPositionValue();
  40. }
  41. else
  42. {
  43. NegSumProfit = NegSumProfit + profit;
  44. NegTradePos = NegTradePos + trade.GetPositionValue();
  45. }   
  46. // iterate through eventually still open positions 
  47. for( trade = bo.GetFirstOpenPos(); trade; trade = bo.GetNextOpenPos() ) 
  48. profit = trade.GetProfit(); 
  49. if(profit >= 0)
  50. {
  51. PosSumProfit = PosSumProfit + profit;
  52. PosTradePos = PosTradePos + trade.GetPositionValue();
  53. }
  54. else
  55. {
  56. NegSumProfit = NegSumProfit + profit;
  57. NegTradePos = NegTradePos + trade.GetPositionValue();
  58. }
  59.    } 
  60. bo.AddCustomMetric(" Avg Profit/Loss %", 100 * (PosSumProfit + NegSumProfit)/(PosTradePos + NegTradePos));
  61. bo.AddCustomMetric(" Avg Profit %", 100 * PosSumProfit/PosTradePos);
  62. bo.AddCustomMetric(" Avg Loss %", 100 * NegSumProfit/NegTradePos);
  63. // bo.ListTrades();
  64. }
  65. // Your system codes starts here
  66. Sell = Cross(MACD(), Signal());
  67. Buy = Cross(Signal(), MACD());
  68. SetPositionSize(10 ,spsPercentOfEquity);