Triangular Moving Average new.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:16k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Triangular Moving Average new
  4. //  Author/Uploader: ali 
  5. //  E-mail:          abosliman2005m@hotmail.com
  6. //  Date/Time Added: 2006-09-09 09:03:23
  7. //  Origin:          h
  8. //  Keywords:        h
  9. //  Level:           basic
  10. //  Flags:           system
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=696
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=696
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  //Triangular Moving average
  17. //
  18. //  //Anthony Faragasso
  19. //
  20. //  //December, 2002
  21. //
  22. //  /* A Triangular moving average is similar to exponential AND
  23. //
  24. //  weighted moving averages except A different weighting scheme
  25. //
  26. //  is used. Exponential AND Weighted averages assign the majority
  27. //
  28. //  of the weight to the most recent data. Simple moving averages
  29. //
  30. //  assign the weight equally across all the data. With A Triangular
  31. //
  32. //  moving average, the majority of the weight is assigned to the middle
  33. //
  34. //  portion of the data.*/
  35. //
  36. //  Odd=13;//enter Odd numbers only
  37. //
  38. //  CoefOdd=round(Odd/2);
  39. //
  40. //  Even=12;//enter Even numbers only
  41. //
  42. //  Coefeven=Even/2;
  43. //
  44. //  Coefeven2=Coefeven+1;
  45. //
  46. //  CongestionPercent=2.8;/*Set % above/below Moving average for congestion /
  47. //  sideways market*/
  48. //
  49. //  TriangularOdd=MA(MA(C,CoefOdd),CoefOdd);
  50. //
  51. //  TriangularEven=MA(MA(C,Coefeven),Coefeven2);
  52. //
  53. //  finalMov_avg=IIf(Odd > even,triangularOdd,TriangularEven);
  54. //
  55. //  Color=colorBrightGreen;//select Moving average line color
  56. //
  57. //  tickercolor=colorBlack;//select price color
  58. //
  59. //  Plot(finalMov_avg,"",IIf(C <
  60. //  finalmov_avg,colorRed,Color),styleLine|styleThick);
  61. //
  62. //  Plot(C,"",tickercolor,styleCandle);
  63. //
  64. //  Title=Name()+"..."+"( "+WriteIf(Odd >
  65. //  even,WriteVal(Odd,1),WriteVal(even,1))+" ) Period
  66. //  "+EncodeColor(Color)+"Triangular"+WriteIf(Odd > even,"ODD","EVEN")+" Moving
  67. //  Average"+"..."+EncodeColor(colorBlack)+ WriteIf(C < finalMov_avg,"Close is
  68. //  "+EncodeColor(colorRed)+"Below"+EncodeColor(colorBlack)+" Moving Average by
  69. //  ","Close is"+EncodeColor(colorBrightGreen)+"
  70. //  Above"+EncodeColor(colorBlack)+" Moving Average by
  71. //  ")+"("+WriteVal(((C/finalMov_avg)-1)*100,1.1)+"%
  72. //  )"+"n"+WriteIf(finalmov_avg-Ref(finalmov_avg,-1)>0," Slope Of Average is
  73. //  UP : ","Slope Of Average is DOWN :")+WriteIf((((C/finalMov_avg)-1)*100 <=
  74. //  CongestionPercent AND ((C/finalMov_avg)-1)*100 >=
  75. //  -CongestionPercent),EncodeColor(colorYellow)+" with Price Congestion /
  76. //  Divergence to Average ","")+"n"+WriteIf(Ref(C,-1) < Ref(finalmov_avg,-1)
  77. //  AND C > finalmov_avg,EncodeColor(colorGreen)+"Possible Change in Trend From
  78. //  Down to Up"+"n"+" OR Short Term Correction of Previous
  79. //  Trend",WriteIf(Ref(C,-1) > Ref(finalmov_avg,-1) AND C <
  80. //  finalmov_avg,EncodeColor(colorRed)+"Possible Change in Trend From Up to
  81. //  Down "+"n"+" OR Short Term Correction to Previous
  82. //  Trend",""))+"n"+WriteIf(C > finalmov_avg,EncodeColor(colorGreen)+"Close
  83. //  has been above Moving Average ( "+WriteVal(BarsSince(C < finalmov_avg),1)+"
  84. //  ) Bars",EncodeColor(colorRed)+"Close has been Below Moving Average (
  85. //  "+WriteVal(BarsSince(C > finalmov_avg),1)+" )
  86. //  Bars")+"n"+EncodeColor(colorBlack)+"The average # of Bars Above (
  87. //  "+WriteVal(round(Cum(BarsSince(C < finalmov_avg)/Cum(1))),1)+" )"+"n"+"The
  88. //  average # of Bars Below ( "+WriteVal(round(Cum(BarsSince(C >
  89. //  finalmov_avg)/Cum(1))),1)+" )";
  90. //
  91. //  _SECTION_BEGIN("AFL Example");
  92. //
  93. //  /*
  94. //
  95. //  This is an attempt to provide a basic trading system AFL. The system is
  96. //  purely imaginary
  97. //
  98. //  AND NOT provided as one that would make money. This is just to provide a
  99. //  guide to learners
  100. //
  101. //  on the common components of writing AFL.
  102. //
  103. //  Prepared by Graham Kavanagh 12 Aug 2005
  104. //
  105. //  AB Write http://e-wire.net.au/~eb_kavan/ab_write.htm
  106. //
  107. //  When you copy/paste ensure the existing continuous lines have not been
  108. //  wrapped. This wrapping
  109. //
  110. //  can create error signals when you try to use the code. Click on the check
  111. //  afl button in the
  112. //
  113. //  editor before trying to apply or scan.
  114. //
  115. //  I have used slash-asterisk /* */ /* for my comments to get around the
  116. //  problem of wrapping,
  117. //
  118. //  which could happen if you used double slash //
  119. //
  120. //  I hope this helps the beginners in creating AFL code
  121. //
  122. //  */
  123. //
  124. //  /*firstly some basics common*/
  125. //
  126. //  SetBarsRequired(10000,10000); /* this ensures that the charts include all
  127. //  bars AND NOT just those on screen */
  128. //
  129. //  SetFormulaName("Sample System"); /*name it for backtest report
  130. //  identification */
  131. //
  132. //  SetTradeDelays( 1, 1, 1, 1 ); /* delay entry/exit by one bar */
  133. //
  134. //  SetOption( "initialequity", 100000 ); /* starting capital */
  135. //
  136. //  PositionSize = -10; /* trade size will be 10% of available equty */
  137. //
  138. //  SetOption( "MaxOpenPositions", 6 ); /* I don't want to comit more than 60%
  139. //  of Equity at any one time */
  140. //
  141. //  SetOption( "PriceBoundChecking", 1 ); /* trade only within the chart bar's
  142. //  price range */
  143. //
  144. //  SetOption( "CommissionMode", 2 ); /* set commissions AND costs as $ per
  145. //  trade */
  146. //
  147. //  SetOption( "CommissionAmount", 32.95 ); /* commissions AND cost */
  148. //
  149. //  SetOption( "UsePrevBarEquityForPosSizing", 1 ); /*set the use of last bars
  150. //  equity for trade size*/
  151. //
  152. //  PositionScore = 100/C; /*Set the order for which stock trades when get
  153. //  mulitple signals in one bar in backtesting */
  154. //
  155. //  //Trade system
  156. //
  157. //  /*
  158. //
  159. //  Buy when exp mov avg crosses and the high is highest for 50 bars
  160. //
  161. //  Sell when exp mov avg crosses back
  162. //
  163. //  Cross is first variable moves to above the second variable
  164. //
  165. //  */
  166. //
  167. //  LongPer = Param("Long Period", 50, 30, 100, 5 ); /* select periods with
  168. //  parameter window */
  169. //
  170. //  ShortPer = Param("Short Period", 5, 3, 10, 1 );
  171. //
  172. //  LongMA = EMA( C, LongPer );
  173. //
  174. //  ShortMA = EMA( C, ShortPer );
  175. //
  176. //  LastHigh = HHV( H, LongPer );
  177. //
  178. //  Buy = Cross( ShortMA, LongMA ) AND H > Ref( LastHigh, -1 );
  179. //
  180. //  /* ref,-1 is used for the high to have todays high greater than the
  181. //  previous 50 bar high.
  182. //
  183. //  To just use H==LastHigh couold mean a previous high was equal to current
  184. //  high */
  185. //
  186. //  Sell = Cross( LongMA, ShortMA );
  187. //
  188. //  /* exrem is one method to remove surplus strade signals*/
  189. //
  190. //  Buy = ExRem(Buy,Sell);
  191. //
  192. //  Sell = ExRem(Sell,Buy);
  193. //
  194. //  /* Now for exploration results.
  195. //
  196. //  Will restrict results of exploration to when the Buy AND Sell signals occur
  197. //
  198. //  You can use Filter=1; to display every bar result */
  199. //
  200. //  Filter = Buy OR Sell;
  201. //
  202. //  AddTextColumn( FullName(), "Company Name" );
  203. //
  204. //  AddColumn( Buy, "Buy", 1 );
  205. //
  206. //  AddColumn( Sell, "Sell", 1 );
  207. //
  208. //  AddColumn( C, "Close", 1.3 );
  209. //
  210. //  AddColumn( H, "High", 1.3 );
  211. //
  212. //  AddColumn( LastHigh, "HHV", 1.3 );
  213. //
  214. //  AddColumn( LongMA, "Long MA", 1,3 );
  215. //
  216. //  AddColumn( ShortMA, "Short MA", 1,3 );
  217. //
  218. //  /* Now to show this on a chart */
  219. //
  220. //  /* I use WriteVal to limit the values to the wanted number of decimal
  221. //  places,
  222. //
  223. //  seeing a value of 5 decimal places can be frustrating.
  224. //
  225. //  I have included additional information in the plot title sections to add
  226. //  some
  227. //
  228. //  information to the title block */
  229. //
  230. //  GraphXSpace = 10; /* create empty space of 10% top and bottom of chart */
  231. //
  232. //  Plot( C, " Close Price", colorGrey50, styleBar );
  233. //
  234. //  Plot( LongMA, " EMA(C,"+WriteVal(LongPer,1)+")", colorYellow,
  235. //  styleLine|styleNoRescale );
  236. //
  237. //  Plot( ShortMA, " EMA(C,"+WriteVal(ShortPer,1)+")", colorSkyblue,
  238. //  styleLine|styleNoRescale );
  239. //
  240. //  Plot( Ref(Lasthigh,-1), " HHV(H,"+WriteVal(LongPer,1)+")", colorRed,
  241. //  styleNoLine|styleDots|styleNoRescale );
  242. //
  243. //  /* styleNoRescale in the plots stops the added plots from compressing the
  244. //  original bar chart to the middle of the pane */
  245. //
  246. //  PlotShapes( shapeUpArrow*Buy, colorGreen, 0, L, -10 );
  247. //
  248. //  PlotShapes( shapeDownArrow*Sell, colorRed, 0, H, -10 );
  249. //
  250. //  Title = " {{NAME}} {{DATE}} {{INTERVAL}} "+_DEFAULT_NAME()+" Chart values :
  251. //  {{VALUES}} ";
  252. //
  253. //  /* _DEFAULT_NAME() shows the section name or, if not present, the file name
  254. //
  255. //  the items in {{}} are short cuts for the title block. It can be done long
  256. //  hand
  257. //
  258. //  Title = Name() +" "+ Date() +" "+ "{{INTERVAL}}"+_DEFAULT_NAME()+" Chart
  259. //  values : " +
  260. //
  261. //  " Close Price = " + C +
  262. //
  263. //  " EMA(C,"+WriteVal(LongPer,1)+") = "+WriteVal(LongMA,1.3) +
  264. //
  265. //  " EMA(C,"+WriteVal(ShortPer,1)+") = "+WriteVal(ShortMA,1.3) +
  266. //
  267. //  " HHV(H,"+WriteVal(LongPer,1)+") = "+WriteVal(Ref(LastHigh,-1),1.3) ;
  268. //
  269. //  */
  270. //
  271. //  _SECTION_END();
  272. //
  273. //------------------------------------------------------------------------------
  274. //Triangular Moving average
  275. //Anthony Faragasso
  276. //December, 2002
  277. /* A Triangular moving average is similar to exponential AND 
  278. weighted moving averages except A different weighting scheme
  279. is used. Exponential AND Weighted averages assign the majority
  280. of the weight to the most recent data. Simple moving averages
  281. assign the weight equally across all the data. With A Triangular
  282. moving average, the majority of the weight is assigned to the middle
  283. portion of the data.*/
  284. Odd=13;//enter Odd numbers only
  285. CoefOdd=round(Odd/2);
  286. Even=12;//enter Even numbers only
  287. Coefeven=Even/2;
  288. Coefeven2=Coefeven+1;
  289. CongestionPercent=2.8;/*Set % above/below Moving average for congestion / sideways market*/
  290. TriangularOdd=MA(MA(C,CoefOdd),CoefOdd);
  291. TriangularEven=MA(MA(C,Coefeven),Coefeven2);
  292. finalMov_avg=IIf(Odd > even,triangularOdd,TriangularEven);
  293. Color=colorBrightGreen;//select Moving average line color
  294. tickercolor=colorBlack;//select price color
  295. Plot(finalMov_avg,"",IIf(C < finalmov_avg,colorRed,Color),styleLine|styleThick);
  296. Plot(C,"",tickercolor,styleCandle);
  297. Title=Name()+"..."+"( "+WriteIf(Odd > even,WriteVal(Odd,1),WriteVal(even,1))+" ) Period "+EncodeColor(Color)+"Triangular"+WriteIf(Odd > even,"ODD","EVEN")+" Moving Average"+"..."+EncodeColor(colorBlack)+ WriteIf(C < finalMov_avg,"Close is "+EncodeColor(colorRed)+"Below"+EncodeColor(colorBlack)+" Moving Average by ","Close is"+EncodeColor(colorBrightGreen)+" Above"+EncodeColor(colorBlack)+" Moving Average by ")+"("+WriteVal(((C/finalMov_avg)-1)*100,1.1)+"% )"+"n"+WriteIf(finalmov_avg-Ref(finalmov_avg,-1)>0," Slope Of Average is UP : ","Slope Of Average is DOWN :")+WriteIf((((C/finalMov_avg)-1)*100 <= CongestionPercent AND ((C/finalMov_avg)-1)*100 >= -CongestionPercent),EncodeColor(colorYellow)+" with Price Congestion / Divergence to Average ","")+"n"+WriteIf(Ref(C,-1) < Ref(finalmov_avg,-1) AND C > finalmov_avg,EncodeColor(colorGreen)+"Possible Change in Trend From Down to Up"+"n"+" OR Short Term Correction of Previous Trend",WriteIf(Ref(C,-1) > Ref(finalmov_avg,-1) AND C < finalmov_avg,EncodeColor(colorRed)+"Possible Change in Trend From Up to Down "+"n"+" OR Short Term Correction to Previous Trend",""))+"n"+WriteIf(C > finalmov_avg,EncodeColor(colorGreen)+"Close has been above Moving Average ( "+WriteVal(BarsSince(C < finalmov_avg),1)+" ) Bars",EncodeColor(colorRed)+"Close has been Below Moving Average ( "+WriteVal(BarsSince(C > finalmov_avg),1)+" ) Bars")+"n"+EncodeColor(colorBlack)+"The average # of Bars Above ( "+WriteVal(round(Cum(BarsSince(C < finalmov_avg)/Cum(1))),1)+" )"+"n"+"The average # of Bars Below ( "+WriteVal(round(Cum(BarsSince(C > finalmov_avg)/Cum(1))),1)+" )";
  298. _SECTION_BEGIN("AFL Example");
  299. /*
  300. This is an attempt to provide a basic trading system AFL. The system is purely imaginary
  301.  AND NOT provided as one that would make money. This is just to provide a guide to learners
  302.  on the common components of writing AFL.
  303.  Prepared by Graham Kavanagh 12 Aug 2005
  304.  AB Write http://e-wire.net.au/~eb_kavan/ab_write.htm
  305. When you copy/paste ensure the existing continuous lines have not been wrapped. This wrapping
  306.  can create error signals when you try to use the code. Click on the check afl button in the
  307.  editor before trying to apply or scan.
  308.  I have used slash-asterisk /*  */ /* for my comments to get around the problem of wrapping,
  309.  which could happen if you used double slash //
  310. I hope this helps the beginners in creating AFL code
  311. */
  312. /*firstly some basics common*/
  313. SetBarsRequired(10000,10000); /* this ensures that the charts include all bars AND NOT just those on screen */
  314. SetFormulaName("Sample System"); /*name it for backtest report identification */
  315. SetTradeDelays( 1, 1, 1, 1 ); /* delay entry/exit by one bar */
  316. SetOption( "initialequity", 100000 ); /* starting capital */
  317. PositionSize = -10; /* trade size will be 10% of available equty */
  318. SetOption( "MaxOpenPositions", 6 ); /* I don't want to comit more than 60% of Equity at any one time */
  319. SetOption( "PriceBoundChecking", 1 ); /* trade only within the chart bar's price range */
  320. SetOption( "CommissionMode", 2 ); /* set commissions AND costs as $ per trade */
  321. SetOption( "CommissionAmount", 32.95 ); /* commissions AND cost */
  322. SetOption( "UsePrevBarEquityForPosSizing", 1 ); /*set the use of last bars equity for trade size*/
  323. PositionScore = 100/C; /*Set the order for which stock trades when get mulitple signals in one bar in backtesting */
  324. //Trade system
  325. /*
  326. Buy when exp mov avg crosses and the high is highest for 50 bars
  327. Sell when exp mov avg crosses back
  328. Cross is first variable moves to above the second variable
  329. */
  330. LongPer = Param("Long Period", 50, 30, 100, 5 ); /* select periods with parameter window */
  331. ShortPer = Param("Short Period", 5, 3, 10, 1 ); 
  332. LongMA = EMA( C, LongPer );
  333. ShortMA = EMA( C, ShortPer );
  334. LastHigh = HHV( H, LongPer );
  335. Buy = Cross( ShortMA, LongMA ) AND H > Ref( LastHigh, -1 );
  336. /* ref,-1 is used for the high to have todays high greater than the previous 50 bar high.
  337.    To just use H==LastHigh couold mean a previous high was equal to current high */
  338. Sell = Cross( LongMA, ShortMA );
  339. /* exrem is one method to remove surplus strade signals*/
  340. Buy = ExRem(Buy,Sell);
  341. Sell = ExRem(Sell,Buy);
  342. /* Now for exploration results. 
  343.    Will restrict results of exploration to when the Buy AND Sell signals occur 
  344.    You can use Filter=1; to display every bar result */
  345. Filter = Buy OR Sell;
  346. AddTextColumn( FullName(), "Company Name" );
  347. AddColumn( Buy, "Buy", 1 );
  348. AddColumn( Sell, "Sell", 1 );
  349. AddColumn( C, "Close", 1.3 );
  350. AddColumn( H, "High", 1.3 );
  351. AddColumn( LastHigh, "HHV", 1.3 );
  352. AddColumn( LongMA, "Long MA", 1,3 );
  353. AddColumn( ShortMA, "Short MA", 1,3 );
  354. /* Now to show this on a chart */
  355. /* I use WriteVal to limit the values to the wanted number of decimal places,
  356.    seeing a value of 5 decimal places can be frustrating.
  357.    I have included additional information in the plot title sections to add some
  358.    information to the title block */
  359. GraphXSpace = 10; /* create empty space of 10% top and bottom of chart */
  360. Plot( C, " Close Price", colorGrey50, styleBar );
  361. Plot( LongMA, " EMA(C,"+WriteVal(LongPer,1)+")", colorYellow, styleLine|styleNoRescale );
  362. Plot( ShortMA, " EMA(C,"+WriteVal(ShortPer,1)+")", colorSkyblue, styleLine|styleNoRescale );
  363. Plot( Ref(Lasthigh,-1), " HHV(H,"+WriteVal(LongPer,1)+")", colorRed, styleNoLine|styleDots|styleNoRescale );
  364. /* styleNoRescale in the plots stops the added plots from compressing the original bar chart to the middle of the pane */
  365. PlotShapes( shapeUpArrow*Buy, colorGreen, 0, L, -10 );
  366. PlotShapes( shapeDownArrow*Sell, colorRed, 0, H, -10 );
  367. Title = " {{NAME}} {{DATE}} {{INTERVAL}} "+_DEFAULT_NAME()+" Chart values : {{VALUES}} ";
  368. /* _DEFAULT_NAME() shows the section name or, if not present, the file name
  369. the items in {{}} are short cuts for the title block. It can be done long hand
  370. Title = Name() +" "+ Date() +" "+ "{{INTERVAL}}"+_DEFAULT_NAME()+" Chart values : " + 
  371. " Close Price = " + C + 
  372. " EMA(C,"+WriteVal(LongPer,1)+") = "+WriteVal(LongMA,1.3) + 
  373. " EMA(C,"+WriteVal(ShortPer,1)+") = "+WriteVal(ShortMA,1.3) + 
  374. " HHV(H,"+WriteVal(LongPer,1)+") = "+WriteVal(Ref(LastHigh,-1),1.3) ;
  375.  */
  376. _SECTION_END();