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

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    3 Price Break
  4. //  Author/Uploader: Bhcombo 
  5. //  E-mail:          
  6. //  Date/Time Added: 2004-12-05 17:16:00
  7. //  Origin:          
  8. //  Keywords:        Three Price Break
  9. //  Level:           medium
  10. //  Flags:           indicator
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=413
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=413
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  3 Price Break can be used to verify trend and to set trailing stops.
  17. //
  18. //  This is a work in progress. I pefer to see the 3PB lines graphed against a
  19. //  candlestick chart versus the traditional 3PB representation. This will
  20. //  graph the price break line as green in an uptrend and red in a down trend.
  21. //  There are parameters for changing the number of price breaks (2 versus 3)
  22. //  and the number of bars to use to begin the study. If you don't see a plot,
  23. //  it is, probably because there are not enough bars to perform the study.
  24. //
  25. //  To be corrected - the method used to determine the seed is not correct, but
  26. //  it doesn't matter once the initial trend has been established.
  27. //
  28. //------------------------------------------------------------------------------
  29. Title = Name()+ " Price Break Indicator." ;
  30. //+ "  Trend is " + Trend_Text + ".  SEQUENCE IS " + Sequence_Text;
  31. Plot(C,Title,colorBlack,styleCandle);
  32. /////////   Parameters  ////////
  33. nBars_To_Scan = Param("Number of bars to Scan",20, 10,480, 10); //Number of bars to include in scan
  34. PB_Interval = Param("Number of Bars for Price Break",3,2,3,1);
  35. /////////  Use Array of Prices and Price Breaks to Look Back and Determine What Price Break is For Current Bar
  36. Seedbar = nBars_To_Scan + 1; //Need an initial value to start the PB process
  37. if (BarCount > Seedbar)  //Make sure there are enough bars available to evaluate
  38. {
  39. Price[0]= LastValue(Ref(C,-Seedbar)); //Seed the 0 Bar in the Array with Values
  40. Trend[0]=1; //1 = Long, 0=Short
  41. Sequence[0]=0; //Sequence counter - counts number of new price breaks
  42. Price_Break[0] = LastValue(Ref(C,-Seedbar));
  43. High_C1[0] = LastValue(Ref(C,-Seedbar)); //Highest Close 1 Ago
  44. High_C2[0]= LastValue(Ref(C,-Seedbar)); //Highest Close 2 Ago
  45. High_C3[0]= LastValue(Ref(C,-Seedbar)); //Highest Close 3 Ago
  46. Low_C1[0] = LastValue(Ref(C,-Seedbar)); //Lowest Close 1 Ago
  47. Low_C2[0] = LastValue(Ref(C,-Seedbar)); //Lowest Close 2 Ago
  48. Low_C3[0] = LastValue(Ref(C,-Seedbar)); //Lowest Close 3 Ago
  49. for ( i=1; i < Seedbar ; i++)  //Cycle through prices filling in price array and caculating price breaks 
  50. {
  51. Prior = i-1; //Index for Prior entry in array.  Set the current array values to 
  52. Trend[i]=Trend[Prior]; //prior values to make sure everything that isn't changed later
  53. Price_Break[i] = Price_Break[Prior]; //gets carried forward to the next row in the array.
  54. Low_C1[i] = Low_C1[Prior];  //Carryover current values
  55. Low_C2[i] = Low_C2[Prior];
  56. Low_C3[i] = Low_C3[Prior];  
  57. High_C1[i] = High_C1[Prior]; //Carryover current values
  58. High_C2[i] = High_C2[Prior];
  59. High_C3[i] = High_C3[Prior];
  60. Sequence[i] = Sequence[Prior];
  61. Price[i] = LastValue (Ref (C,-(Seedbar-i))); //Seedbar is the bar just in front of where I start the method.  Works since i starts at 1
  62. if (Price[i] >Price[Prior] AND Trend[Prior] == 1 ) // If Close is Greater than the prior close And the Trend is Long
  63. { if (Price[i] >High_C1[Prior]) //If the Close is greater than the last highest close
  64. { //Test For Price Break.  The IIF is there to accomodate a 2 price or 3 price break option
  65. //based on the PB_Interval parameter
  66. Price_Break[i] = IIf(PB_Interval == 3,High_C3[Prior],IIf(PB_Interval == 2,High_C2[Prior],High_C3[Prior]));
  67. //The 3PB method says I take the highest close 4 ago as the new price break.
  68. Sequence[i] = Sequence[i] + 1; //Increment Sequence if Price Break
  69. High_C3[i] = High_C2[Prior]; //Stacking the higher closes like this avoids having to go back and iterate through the.
  70. High_C2[i] = High_C1[Prior]; //closes to find and count the higher closes.  They are just carried forward in the stack.
  71. High_C1[i] = Price[i]; //When a higher close occurs, it is put on the top of the stack, each close below is
  72. } //pushed down in sequence, and the earliest (farthest back) close goes away.
  73. }
  74. if (Price[i] >Price[Prior] AND Trend[Prior] == 0 ) // If Close is Greater than the prior close And the Trend is Short
  75. { if (Price[i] >Price_Break[Prior]) //If Close > Price Break in trend is Short, Reverse and go Long
  76. {
  77. High_C1[i] = High_C2[i] = High_C3[i] = Price[i]; //Initialize sequence of new Highs
  78. Price_Break[i] = Price[i]; //Set new value for Price Break
  79. Trend[i] = 1; //Set the trend Long
  80. Sequence = 0;
  81. }
  82. }
  83. if (Price[i] <Price[Prior] AND Trend[Prior] ==0) // If The Close is less than the prior close And the Trend is Short
  84. { if (Price[i] <Low_C1[Prior]) //If the Close is less than the last lowest close
  85. {
  86. Price_Break[i] = IIf(PB_Interval == 3,Low_C3[Prior],IIf(PB_Interval == 2,Low_C2[Prior],Low_C3[Prior])); //Test For Price Break
  87. Sequence[i] = Sequence[i] + 1; //Increment Sequence if Price Break
  88. Low_C3[i] = Low_C2[Prior]; //Update sequence of new Lows
  89. Low_C2[i] = Low_C1[Prior];
  90. Low_C1[i] = Price [i];
  91. }
  92. }
  93. if (Price[i] <Price[Prior] AND Trend[Prior] ==1) // If The Close is less than the prior close And the Trend is Long
  94. { if (Price[i] < Price_Break[Prior]) //If Close < Price Break in Long Trend, reverse and go Short
  95. {
  96. Low_C1[i] = Low_C2[i] = Low_C3[i] = Price[i]; //Initialize sequence of new Lows
  97. Price_Break[i] = Price[i]; //Set new value for Price Break
  98. Trend[i] = 0; //Set Trend Short
  99. Sequence = 0;
  100. }
  101. }
  102. ////  Plot the Price Breaks.
  103. Bar_x1=BarCount - (nBars_To_Scan - Prior );
  104. Bar_x2=BarCount - ( nBars_To_Scan - i);
  105. PB_Color = IIf(Trend[i] == 1,colorGreen, colorRed);
  106. Plot(LineArray(Bar_x1,Price_Break[i],Bar_x2,Price_Break[i],extend=0),"",PB_Color,styleThick);
  107. Sequence_Text = NumToStr(Sequence,format=1.0);
  108. Trend_Text = WriteIf(Trend[i] > 0, "Long","Short");
  109. } //Close the For Loop
  110. } //Close the first test for sufficient bars to do the study