Ed Seykota's TSP Support and Resistance.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Ed Seykota's TSP: Support and Resistance
  4. //  Author/Uploader: Mark H. 
  5. //  E-mail:          com
  6. //  Date/Time Added: 2006-10-08 01:48:31
  7. //  Origin:          
  8. //  Keywords:        
  9. //  Level:           semi-advanced
  10. //  Flags:           system,exploration,indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=735
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=735
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  This is an implementation of Seykota's TSP S-R system.
  17. //
  18. //  See http://www.seykota.com/tribe/TSP/SR/index.htm for details.
  19. //
  20. //  I have tested it and got identical results (well there is 2-cent difference
  21. //  due to rounding).
  22. //
  23. //------------------------------------------------------------------------------
  24. /*==============================================================================
  25. Global Settings
  26. ==============================================================================*/
  27. SetOption("InitialEquity", 1000000);
  28. SetOption("NoDefaultColumns", True );
  29. SetOption("CommissionMode", 2); //$$ per trade
  30. SetOption("CommissionAmount", 0);
  31. SetOption("MarginRequirement", 10);
  32. SetOption("UsePrevBarEquityForPosSizing", True);
  33. SetOption("UseCustomBacktestProc", True );
  34. SetTradeDelays( 0, 0, 0, 0 );
  35. /*==============================================================================
  36. User-defined Functions
  37. ==============================================================================*/
  38. function Support(p)
  39. {
  40. sup = LLV(low, p);
  41. sup[0] = low[0];
  42. for (i = 1; i < p; i++)
  43. {
  44. if(low[i] < sup[i-1]) sup[i] = low[i];
  45. else sup[i] = sup[i-1];
  46. }
  47. return sup;
  48. }
  49. function Resistance(p)
  50. {
  51. res = HHV(high, p);
  52. res[0] = high[0];
  53. for (i = 1; i < p; i++)
  54. {
  55. if(high[i] > res[i-1]) res[i] = high[i];
  56.    else res[i] = res[i-1];
  57. }
  58. return res;
  59. }
  60. function OptimizeNot(a1, a2, a3, a4, a5)
  61. {
  62. return a2;
  63. }
  64. /*==============================================================================
  65. Entry and Exit Rules
  66. ==============================================================================*/
  67. fast = Optimize("Fast", 20, 5, 105, 5);
  68. slow = Optimize("Slow", 140, 20, 420, 20);
  69. FastRes = Resistance(fast);
  70. FastSup = Support(fast);
  71. SlowRes = Resistance(slow);
  72. SlowSup = Support(slow);
  73. heat = 0.05;
  74. // determine longer term trend
  75. // Note: could have problem if current bar is outside of all previous bars
  76. trend[0] = 0;
  77. for(bar= 1; bar < BarCount; bar++)
  78. {
  79.   if(high[bar] > SlowRes[bar-1]) trend[bar] = 1;
  80.   else if(low[bar] < SlowSup[bar-1]) trend[bar] = -1;
  81.   else trend[bar] = trend[bar-1];
  82. }
  83. LastPosition = 0; // 1 - long; -1 - short
  84. PositionRiskStop = 0;
  85. Buy = Sell = Short = Cover = 0;
  86. for(bar = 5; bar < BarCount-1; bar++)
  87. {
  88.    // Exit position  by protection stop
  89.     if(LastPosition == 1)
  90.     {
  91. // Sell at stop
  92. if(PositionRiskStop > low[bar] )   // skip if the signal price only touch (=) the low
  93. {
  94. // We just calculate the exact price to simulate Ed's skid     
  95. stopPrice = PositionRiskStop;
  96. ff = min(open[bar], stopPrice) - low[bar];
  97. stopPrice = min(open[bar], stopPrice) - 0.5*ff;
  98.    Sell[bar] = 1;
  99.    SellPrice[bar] = stopPrice;
  100. TradePrice[bar] = stopPrice;
  101. LastPosition = 0;
  102. }
  103.     }
  104.     else if(LastPosition == -1)
  105.     {
  106. // Cover at stop
  107. if(PositionRiskStop < high[bar])  // skip if the signal price only touch (=) the high
  108. {
  109. stopPrice = PositionRiskStop;
  110. ff = high[bar] - max(open[bar], stopPrice);
  111. stopPrice = max(open[bar], stopPrice) + 0.5*ff;
  112.    Cover[bar] = 1;
  113.    CoverPrice[bar] = stopPrice;
  114. TradePrice[bar] = stopPrice;
  115. LastPosition = 0;
  116. }
  117.     }
  118.   // move the protection stop
  119.   if(LastPosition == 1)
  120.   {
  121.       PositionRiskStop = FastSup[bar];
  122.   }
  123.   else if(LastPosition == -1)
  124.   {
  125.      PositionRiskStop = FastRes[bar];
  126.   }
  127.   else { // Enter position only when last position has been closed   
  128.   if(trend[bar] == 1)
  129.   {
  130. // buy at stop     
  131.     if( fastRes[bar] < high[bar+1]) 
  132.     {
  133.     ff = high[bar+1] - max(open[bar+1], fastRes[bar]);
  134.     stopPrice = max(open[bar+1], FastRes[bar]) + 0.5*ff;
  135.     f = heat/(FastRes[bar] - FastSup[bar]);
  136. Buy[bar+1] = 1;
  137. BuyPrice[bar+1] = stopPrice;
  138. PositionSize[bar+1] = f; //this value is passed to CBT for position sizing
  139. LastPosition  = 1;
  140. PositionRiskStop = FastSup[bar+1];
  141. TradePrice[bar+1] = stopPrice;
  142. bar ++; // skip one bar since next bar has been handled
  143.     }
  144.   }
  145.   else if(trend[bar] == -1)
  146.   {   
  147.    // short at stop
  148.     if( fastSup[bar] > low[bar+1]) 
  149.     {
  150. ff = min(open[bar+1], FastSup[bar]) - low[bar+1];
  151. stopPrice = min(open[bar+1], FastSup[bar]) - 0.5*ff;
  152. f = heat/(FastRes[bar] - FastSup[bar]);
  153.      Short[bar+1] = 1;
  154. ShortPrice[bar+1] = stopPrice;
  155. PositionSize[bar+1] = f; //this value is passed to CBT for position sizing
  156. LastPosition = -1;
  157.      PositionRiskStop = FastRes[bar+1];
  158. TradePrice[bar+1] = stopPrice;
  159. bar ++; // skip one bar since next bar has been handled
  160.     }
  161.   }
  162.   }
  163. }
  164. // close final day for accounting purpose
  165. bar = Barcount-1;
  166. if(LastPosition == 1) { Sell[bar] = 1; SellPrice[bar] = (low[bar]+close[bar])/2; }
  167. else if(LastPosition == -1) { Cover[bar] = 1; CoverPrice[bar] = (high[bar]+close[bar])/2; }
  168. /*==============================================================================
  169. Automatic Analysis Action Options
  170. ==============================================================================*/
  171. AAAction = Status("action");
  172. if(AAAction == actionIndicator)
  173. {
  174. Plot(FastRes, "FastRes", colorRed);
  175. Plot(SlowRes, "SlowRes", colorPink);
  176. Plot(FastSup, "FastSup", colorGreen);
  177. Plot(SlowSup, "SlowSup", colorBlue);
  178. }
  179. else if(AAAction == actionExplore)
  180. {
  181. Filter = 1;
  182. AddColumn( DateTime(), "Date", formatDateTime ); 
  183. AddColumn(O, "Open");
  184. AddColumn(H, "High");
  185. AddColumn(L, "Low");
  186. AddColumn(C, "Close");
  187. AddColumn(FastRes, "FastRes");
  188. AddColumn(SlowRes, "SlowRes");
  189. AddColumn(FastSup, "FastSup");
  190. AddColumn(SlowSup, "SlowSup");
  191. AddColumn(Trend, "Trend");
  192. AddColumn(IIf(Buy, Asc("B"), IIf(Sell, Asc("S"), IIf(Short, Asc("H"), IIf(Cover, Asc("C"), 0)))) , "Signal", formatChar);
  193. AddColumn(TradePrice, "TradePrice");
  194. }
  195. else if(AAAction == actionPortfolio)
  196. {
  197. bo = GetBacktesterObject();
  198. bo.PreProcess(); // Initialize backtester
  199. for( bar=0; bar < BarCount; bar++)
  200. {
  201. eq =  bo.Equity;
  202. for ( sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar) )
  203. {
  204. if (sig.isExit())
  205. {
  206.              if(bo.ExitTrade(bar,sig.symbol,sig.Price))
  207. _TRACE("EXIT: " + sig.symbol + "@" + sig.Price);
  208. }
  209. }
  210. }
  211.         // update stats after closing trades
  212.       bo.UpdateStats(bar, 1 );
  213.        
  214.       for ( sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar)) 
  215.       { 
  216. if (sig.isEntry()) 
  217. // sig.PosSize is passed from Phase I.
  218. shares = round((eq*sig.PosSize)/100)*100;
  219. ps = shares * sig.Price;
  220. if(bo.EnterTrade(bar, sig.symbol, sig.IsLong, sig.Price, ps, sig.PosScore,sig.RoundLotSize)) 
  221. {
  222. _TRACE("ENTRY: " + sig.symbol + " @" + sig.Price + " PosScore=" + sig.PosScore + " PosSize=" + ps);
  223.              }
  224. }
  225. }
  226. bo.UpdateStats(bar,1); // MAE/MFE is updated when timeinbar is set to 1.
  227. bo.UpdateStats(bar,2);
  228.     }
  229. bo.PostProcess(); // Finalize backtester
  230. }
  231. /*==============================================================================
  232. End of Formula
  233. ==============================================================================*/