AFL Example - Enhanced.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:6k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    AFL Example - Enhanced
  4. //  Author/Uploader: Brian Fenske 
  5. //  E-mail:          brfenske@hotmail.com
  6. //  Date/Time Added: 2005-08-14 15:02:31
  7. //  Origin:          AFL Example from Graham
  8. //  Keywords:        sample example aa analysis indicator backtest scan
  9. //  Level:           basic
  10. //  Flags:           system,exploration,indicator,commentary
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=547
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=547
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Graham did a nice job of capturing much of the essence of a basic script.
  17. //  In working with a group of programmers we've come up with some enhancements
  18. //  to his formula that makes it useful in the Automatic Analysis (AA)
  19. //  component.
  20. //
  21. //------------------------------------------------------------------------------
  22. /*
  23. This is an attempt to provide a basic trading system AFL. The system is purely imaginary
  24. AND NOT provided as one that would make money. This is just to provide a guide to learners
  25. on the common components of writing AFL.
  26.  Prepared by Graham Kavanagh 12 Aug 2005
  27.  AB Write http://e - wire.net.au/~eb_kavan/ab_write.htm
  28. When you copy/paste ensure the existing continuous lines have not been wrapped. This wrapping
  29. can create error signals when you try to use the code. Click on the Check AFL button in the
  30. editor before trying to apply or scan.
  31. I have used slash - asterisk /* */ /* for my comments to get around the problem of wrapping,
  32. which could happen if you used double slash //
  33. I hope this helps the beginners in creating AFL code
  34. */
  35. /*-------------------------------------
  36. Initialize
  37. -------------------------------------*/
  38. Title = "{{NAME}} {{DATE}} {{INTERVAL}} " + _DEFAULT_NAME() + " Chart values : {{VALUES}}";
  39. /* 
  40. _DEFAULT_NAME()shows the section name or, if not present, the file name.
  41. The items in {{}} are Short cuts for the Title block.
  42. Alternatively, use:
  43. Title = Name() + " " + Date() + " " + "{{INTERVAL}}" + _DEFAULT_NAME() + " Chart values : " +
  44. " Close Price = " + C +
  45. " EMA(C, " + WriteVal(LongPer, 1) + ") = " + WriteVal(LongMA, 1.3) +
  46. " EMA(C, " + WriteVal(ShortPer, 1) + ") = " + WriteVal(ShortMA, 1.3) +
  47. " HHV(H, " + WriteVal(LongPer, 1) + ") = " + WriteVal(Ref(LastHigh, - 1), 1.3);
  48. */
  49. PositionScore = 100 / C; /* Set the order for which stock trades when get multiple signals in one bar in backtesting */
  50. PositionSize = - 10; /* trade size will be 10% of available equty */
  51. SetBarsRequired(10000, 10000); /* this ensures that the charts include all bars AND NOT just those on screen */
  52. SetFormulaName("Sample System"); /* name it for backtest report identification */
  53. SetOption("CommissionAmount", 32.95); /* commissions AND cost */
  54. SetOption("CommissionMode", 2); /* set commissions AND costs as $ per trade */
  55. SetOption("InitialEquity", 100000); /* starting capital */
  56. SetOption("MaxOpenPositions", 6); /* I don't want to comit more than 60% of Equity at any one time */
  57. SetOption("PriceBoundChecking", 1); /* trade only within the chart bar's price range */
  58. SetOption("UsePrevBarEquityForPosSizing", 1); /* set the use of last bars equity for trade size */
  59. /*-------------------------------------
  60. Calculate Indicators
  61. Buy = when exp mov Avg crosses AND the High is Highest for 50 bars
  62. Sell = when exp mov Avg crosses back
  63. Cross = first variable moves above the Second variable
  64. -------------------------------------*/
  65. LongPer = Param("Long Period", 50, 30, 100, 5); /* select periods with parameter window */
  66. ShortPer = Param("Short Period", 5, 3, 10, 1);
  67. LongMA = EMA(C, LongPer);
  68. ShortMA = EMA(C, ShortPer);
  69. LastHigh = HHV(H, LongPer);
  70. /*-------------------------------------
  71. Trade
  72. -------------------------------------*/
  73. Buy = Cross(ShortMA, LongMA)AND H > Ref(LastHigh, - 1);
  74. /* ref, - 1 is used for the high to have todays high greater than the previous 50 bar high.
  75.    To just use H = = LastHigh couold mean a previous high was equal to current high */
  76. Sell = Cross(LongMA, ShortMA);
  77. /* exrem is one method to remove surplus strade signals */
  78. Buy = ExRem(Buy, Sell);
  79. Sell = ExRem(Sell, Buy);
  80. /*-------------------------------------
  81. Automatic Analysis (AA) Settings
  82. This formula can be used for the following purposes:
  83. 1 - Indicator, 2 - Commentary, 3 - Scan, 4 - Exploration, 5 - Backtest, Optimize
  84. -------------------------------------*/
  85. TransmitOrder = False;  // Set to True to really trade!
  86. AASettings = Status("action");
  87. if (AASettings == 1) {
  88. // [Indicator]
  89. GraphXSpace = 10; /* create empty space of 10% top and bottom of chart */
  90. Plot(C, " Close Price", colorGrey50, styleBar);
  91. Plot(LongMA, " EMA(C, " + WriteVal(LongPer, 1) + ")", colorRed, styleLine|styleNoRescale);
  92. Plot(ShortMA, " EMA(C, " + WriteVal(ShortPer, 1) + ")", colorGreen, styleLine|styleNoRescale);
  93. Plot(Ref(Lasthigh, - 1), " HHV(H, " + WriteVal(LongPer, 1) + ")", colorBlue, styleNoLine|styleDots|styleNoRescale);
  94. /* styleNoRescale in the plots stops the added plots from compressing the original bar chart to the middle of the pane */
  95. PlotShapes(shapeUpArrow * Buy, colorGreen, 0, L, - 10);
  96. PlotShapes(shapeDownArrow * Sell, colorRed, 0, H, - 10);
  97. } else if (AASettings == 2) {
  98. // [Commentary]
  99. "Closing price = " + WriteVal(Close);
  100. "Change since yesterday = " + WriteVal(Close - Ref(Close, -1));
  101. "Percent chg. since yesterday = " + WriteVal(ROC(Close, 1)) + " %";
  102. "MACD = " + WriteVal(MACD()) + " , Signal line = " + WriteVal(Signal());
  103. } else if (AASettings == 3) {
  104. // [Scan]
  105. AlertIf(Buy, "SOUND C:\PROGRAM FILES\AMIBROKER\BUY.WAV", "Buy", 3);
  106. AlertIf(Sell, "SOUND C:\PROGRAM FILES\AMIBROKER\SELL.WAV", "Sell", 3);
  107. } else if (AASettings == 4) {
  108. // [Exploration]
  109. /* We restrict results of exploration to when the Buy AND Sell signals occur */
  110. /* You can use Filter = 1; to display every bar result */
  111. Filter = Buy OR Sell;
  112. AddTextColumn(FullName(), "Company Name");
  113. AddColumn(Buy, "Buy", 1);
  114. AddColumn(Sell, "Sell", 1);
  115. AddColumn(C, "Close", 1.3);
  116. AddColumn(H, "High", 1.3);
  117. AddColumn(LastHigh, "HHV", 1.3);
  118. AddColumn(LongMA, "Long MA", 1, 3);
  119. AddColumn(ShortMA, "Short MA", 1, 3);
  120. } else if (AASettings == 5) {
  121. // [Backtest] //
  122. SetTradeDelays(1, 1, 1, 1);
  123. }