Double top detection.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:8k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Double top detection
  4. //  Author/Uploader: Tomasz Janeczko 
  5. //  E-mail:          tj@amibroker.com
  6. //  Date/Time Added: 2001-06-16 08:45:38
  7. //  Origin:          Created by Tomasz Janeczko
  8. //  Keywords:        pattern,recognition,top,bottom
  9. //  Level:           semi-advanced
  10. //  Flags:           commentary
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=19
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=19
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  Detecting patterns is somewhat tricky thing mainly because you can be sure
  17. //  about that only if the pattern is complete. This implies delay in detecting
  18. //  patterns and/or formations and limits usefulness of automatic detection
  19. //  formulas. Anyway I will try to show you how to write pattern recognition
  20. //  formulas using AFL. In this article we will focus on detecting very well
  21. //  known pattern - a double top / double bottom.
  22. //
  23. //  The double top is a major reversal pattern that forms after an extended
  24. //  uptrend. As its name implies, the pattern is made up of two consecutive
  25. //  peaks that are roughly equal, with a moderate trough in between. Although
  26. //  there can be variations, the classic double top marks at least an
  27. //  intermediate change, if not long-term change, in trend from bullish to
  28. //  bearish. Many potential double tops can form along the way up, but until
  29. //  key support is broken, a reversal cannot be confirmed. The whole formation
  30. //  consists of the following parts: prior trend, first peak, trough, second
  31. //  peak, decline from the peak, support break and then decline to the price
  32. //  target. The pattern seems straightforward but there are many details to
  33. //  watch out. For the purpose of this article I will use simplified model of
  34. //  double top pattern that consists of double, roughly equal peaks and the
  35. //  decline from the second peak. So, let's begin.
  36. //
  37. //  AmiBroker Formula Language provides built in functions for detecting peaks
  38. //  and troughs. These functions are based on Zig( array, thresh ) function
  39. //  which you can test by trying the follwing formula:
  40. //
  41. //  graph0 = close;
  42. //
  43. //  graph1= zig( close, 5 );
  44. //
  45. //  As you can see Zig() function determines major peaks and troughs using
  46. //  percentage threshold given as a second parameter. The bigger threshold you
  47. //  specify the more significant peaks and troughs are detected. The line
  48. //  generated by Zig() function indentifies the main trend. There is one caveat
  49. //  however: please take special attention using Zig() function in trading
  50. //  systems because it looks in the future so you will get unrealistic system
  51. //  test results. Zig() function and all function using it (Peak, Trough,
  52. //  PeakBars, TroughBars) are intended for pattern recognition formulas only.
  53. //
  54. //  We will start wrting the formula for detecting double top pattern with
  55. //  detecting peaks:
  56. //
  57. //  percdiff = 10; /* this defines percentage threshold for detecting peaks */
  58. //
  59. //  PK = Peak( H, percdiff, 1 ) == HIGH;
  60. //
  61. //  Now PK array will hold "1" for all bars when peaks occur and "0" elsewhere
  62. //  because high price is equal to the peak value only on the day when this
  63. //  peak occurs.
  64. //
  65. //  Now we want to know if two subsequent peaks are more or less the same:
  66. //
  67. //  peakdiff = ValueWhen( PK, H, 1 )/ValueWhen( PK, H, 2 );
  68. //
  69. //  The peakdiff variable holds now the high price of the most recent peak
  70. //  divided by the high price of the second recent peak. Ideally this value
  71. //  should be 1 - peaks are exactly the same but we will allow slight
  72. //  differences. Let's say we allow the difference of one fourth of the
  73. //  percentage threshold used for detecting peaks:
  74. //
  75. //  validdiff = percdiff/400;
  76. //
  77. //  doubletop = PK AND abs( peakdiff - 1 ) < validdiff;
  78. //
  79. //  Now doubletop variable is "1" if double peak occurred and the difference
  80. //  between the peaks is less than one fourth of the threshold. In our example
  81. //  the threshold in 10% and validdiff is 0.025 (2.5%).
  82. //
  83. //  Everything is fine but soon you find out that this formula is not too good.
  84. //  It detects double tops much too often especially tops that are located to
  85. //  close. For that reason we will add a check for distance between peaks:
  86. //
  87. //  percdiff = 10;
  88. //
  89. //  validdiff = percdiff/400;
  90. //
  91. //  mindistance = 10;
  92. //
  93. //  PK= Peak( H, percdiff, 1 ) == HIGH;
  94. //
  95. //  x = Cum( 1 );
  96. //
  97. //  XPK1 = ValueWhen( PK, x, 1 );
  98. //
  99. //  XPK2 = ValueWhen( PK, x, 2 );
  100. //
  101. //  peakdiff = ValueWhen( PK, H, 1 )/ValueWhen( PK, H, 2 );
  102. //
  103. //  doubletop = PK AND abs( peakdiff - 1 ) < validdiff AND (XPK1 - XPK2)>
  104. //  mindistance;
  105. //
  106. //  The mindistance variable defines minimum number of bars between peaks
  107. //  needed for valid double top formation. XPK1 and XPK2 variables hold the bar
  108. //  number of the first and the second peak.
  109. //
  110. //  Now our formula does not detect peaks located to close but still generates
  111. //  too much signals because it does not check for the validity of the second
  112. //  peak. It just assumes too soon that the peak is valid. To be more sure we
  113. //  need to wait for some days to find out that the second peak is important.
  114. //  One idea is just to check for a couple of days if the price does not return
  115. //  above the level of the peak. So our formula now will look like this:
  116. //
  117. //  percdiff = 10; /* peak detection threshold */
  118. //
  119. //  validdiff = percdiff/400;
  120. //
  121. //  fwdcheck = 4; /* how many days forward to check for valid second peak*/
  122. //
  123. //  mindistance = 10;
  124. //
  125. //  PK= Peak( H, percdiff, 1 ) == HIGH;
  126. //
  127. //  x = Cum( 1 );
  128. //
  129. //  XPK1 = ValueWhen( PK, x, 1 );
  130. //
  131. //  XPK2 = ValueWhen( PK, x, 2 );
  132. //
  133. //  peakdiff = ValueWhen( PK, H, 1 )/ValueWhen( PK, H, 2 );
  134. //
  135. //  doubletop = PK AND abs( peakdiff - 1 ) < validdiff
  136. //
  137. //  AND (XPK1 - XPK2) > mindistance
  138. //
  139. //  AND HIGH > HHV( Ref( H, fwdcheck ), fwdcheck - 1 );
  140. //
  141. //  Note that this formula now references the future ( look at the following
  142. //  statement: Ref( H, fwdcheck ) ) - this means that it will not generate ANY
  143. //  signals until fwdcheck bars pass after the second peak. So, for example, if
  144. //  double top pattern has occured on Monday you will know about that on Friday
  145. //  because four days (future quotes) are needed to confirm the pattern.
  146. //
  147. //  Now our formula for detecting double tops is much better, but still is
  148. //  missing one imporant point - detecting prior trend. That is why it
  149. //  sometimes generates false signals. I will not, however, go any further in
  150. //  this article just to keep things simple. You can use the double top formula
  151. //  in Automatic analysis/Scan function for screening the stocks for potential
  152. //  reversal patterns or in Commentary. By adding buy=doubletop; sell=0;
  153. //  statement to the formula you will be able to screen stocks for the
  154. //  potential reversal patterns and see the arrows when the formula is used in
  155. //  Commentary window.
  156. //
  157. //------------------------------------------------------------------------------
  158. /* Detecting double tops */
  159. percdiff = 5; /* peak detection threshold */
  160. fwdcheck = 5; /* forward validity check */
  161. mindistance = 10;
  162. validdiff = percdiff/400;
  163. PK= Peak( H, percdiff, 1 ) == HIGH;
  164. x = Cum( 1 );
  165. XPK1 =  ValueWhen( PK, x, 1 ); 
  166. XPK2 = ValueWhen( PK, x, 2 ); 
  167. peakdiff = ValueWhen( PK, H, 1 )/ValueWhen( PK, H, 2 );
  168. doubletop = PK AND abs( peakdiff - 1 ) < validdiff AND (XPK1 - XPK2)>mindistance
  169. AND HIGH > HHV( Ref( H, fwdcheck ), fwdcheck - 1 );
  170. buy = doubletop;
  171. sell = 0;
  172. writeif( highest( doubletop ) == 1, "AmiBroker has detected some possible double top patterns for " + name() + "nLook for green arrows on the price chart.", "There are no double top patterns for " + name() );