Ed Seykota's TSP EMA Crossover System.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:5k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Ed Seykota's TSP: EMA Crossover System
  4. //  Author/Uploader: Mark H. 
  5. //  E-mail:          
  6. //  Date/Time Added: 2006-09-15 11:12:58
  7. //  Origin:          
  8. //  Keywords:        Seykota EMA Crossover
  9. //  Level:           basic
  10. //  Flags:           system
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=708
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=708
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  This is the code for the EMA Crossover System of Ed Seykota's Trading
  17. //  System Project at
  18. //
  19. //  http://www.seykota.com/tribe/TSP/index.htm.
  20. //
  21. //  I have tested it and got identical results to the dime compared to those at
  22. //  Seykota's website. I can't get it identical to cents due to rounding
  23. //  errors.
  24. //
  25. //------------------------------------------------------------------------------
  26. /*==============================================================================
  27. Global Settings
  28. ==============================================================================*/
  29. SetOption("InitialEquity", 1000000);
  30. SetOption("MinShares", 50);
  31. SetOption("NoDefaultColumns", True );
  32. SetOption("CommissionMode", 2); //$$ per trade
  33. SetOption("CommissionAmount", 0); // commission is accounted for in skid
  34. SetOption("MarginRequirement", 10);
  35. SetOption("UsePrevBarEquityForPosSizing", True);
  36. SetOption("UseCustomBacktestProc", True );
  37. SetTradeDelays( 1, 1, 1, 1 );
  38. /*==============================================================================
  39. User-defined Functions
  40. ==============================================================================*/
  41. function EMA0(A, p)
  42. {
  43. r[0] = a[0];
  44. ep = 2/(p+1);
  45. for(i = 1; i < BarCount; i++)
  46. {
  47. r[i] = r[i-1] + (a[i] - r[i-1]) * ep;
  48. }
  49. return r;
  50. }
  51. function OptimizeNot(a1, a2, a3, a4, a5)
  52. {
  53. return a2;
  54. }
  55. /*==============================================================================
  56. Entry and Exit Rules
  57. ==============================================================================*/
  58. tr = Max(H-L, Max(abs(H-Ref(C, -1)), abs(Ref(C, -1)-L)));
  59. tr[0] = H[0] - L[0];
  60. fast = EMA0(C, Optimize("FastEMA", 15, 20, 140, 5));
  61. slow = EMA0(C, Optimize("SlowEMA", 150, 150, 1000, 10));
  62. Buy = Cross(fast, slow);
  63. Sell = Cross(slow, fast);
  64. Buy[1] = 0; // to avoid false signal at the beginning
  65. //ApplyStop(stopTypeLoss, stopModePoint, ATR_multi*Ref(ATR0, -1), True, True );
  66. /*==============================================================================
  67. Skid of Executions
  68. ==============================================================================*/
  69. BuyPrice = (H+O)/2;
  70. SellPrice = (L+O)/2;
  71. /*==============================================================================
  72. Position Sizing
  73. ==============================================================================*/
  74. ATR_multi = OptimizeNot("ATP Multi", 5, 1, 9, 1);
  75. ATR0 = EMA0(tr, 20);
  76. Risk_Per_Share = Ref(ATR0, -1) * ATR_multi;
  77. Heat = OptimizeNot("Heat", 0.10, 0.01, 0.50, 0.01);
  78. PosSizeFactor = Heat / Risk_Per_Share; 
  79. // the real position size value is calculated within CBT
  80. SetPositionSize(PosSizeFactor, spsValue);
  81. /*==============================================================================
  82. Automatic Analysis Action Options
  83. ==============================================================================*/
  84. AAAction = Status("action");
  85. if(AAAction == actionIndicator)
  86. {
  87. Plot(fast, "FastEMA", colorRed);
  88. Plot(slow, "SlowEMA", colorYellow);
  89. }
  90. else if(AAAction == actionExplore)
  91. {
  92. Filter = 1;
  93. AddColumn( DateTime(), "Date", formatDateTime ); 
  94. //AddColumn(DayOfWeek(), "DayOfWeek", 1);
  95. AddColumn(O, "Open");
  96. AddColumn(H, "High");
  97. AddColumn(L, "Low");
  98. AddColumn(C, "Close");
  99. //AddColumn(Avg, "AVG");
  100. AddColumn(fast, "FastEMA", 1.3);
  101. AddColumn(slow, "SlowEMA", 1.3);
  102. AddColumn(ATR0, "ATR", 1.3);
  103. //AddColumn(Risk_Per_Share, "Risk/Share");
  104. AddColumn(IIf(Buy, 111, IIf(Sell, 222, 0)) , "Buy1Sell2", 1);
  105. AddColumn(PosSize, "PosSize%Eq");
  106. AddColumn(Equity() , "Equity");
  107. }
  108. else if(AAAction == actionPortfolio)
  109. {
  110. bo = GetBacktesterObject();
  111. bo.PreProcess(); // Initialize backtester
  112. for( bar=0; bar < BarCount; bar++)
  113. {
  114. eq =  bo.Equity;
  115. for ( sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar) )
  116. {
  117. if (sig.isExit())
  118. {
  119.              if(bo.ExitTrade(bar,sig.symbol,sig.Price))
  120. _TRACE("EXIT: " + sig.symbol + "@" + sig.Price);
  121. }
  122. }
  123. }
  124.         // update stats after closing trades
  125.       bo.UpdateStats(bar, 1 );
  126.        
  127.       for ( sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar)) 
  128.       { 
  129. if (sig.isEntry()) 
  130. // sig.PosSize is passed from Phase I.
  131. ps = Round(( eq * sig.PosSize)/250)*250 * sig.Price; 
  132. if(bo.EnterTrade(bar, sig.symbol, True, sig.Price, ps, sig.PosScore,sig.RoundLotSize)) 
  133. {
  134. _TRACE("ENTRY: " + sig.symbol + " @" + sig.Price + " PosScore=" + sig.PosScore + " PosSize=" + ps);
  135.              }
  136. }
  137. }
  138. //bo.HandleStops(bar); // MUST BE PLACED HERE TO WORK FOR N-BAR STOPS (not before enter/exit trades)
  139. bo.UpdateStats(bar,1); // MAE/MFE is updated when timeinbar is set to 1.
  140. bo.UpdateStats(bar,2);
  141.     }
  142. bo.PostProcess(); // Finalize backtester
  143. }
  144. /*==============================================================================
  145. End of Formula
  146. ==============================================================================*/