Triangle exploration using P&F Chart.afl
上传用户:shiqiang
上传日期:2009-06-12
资源大小:1289k
文件大小:5k
源码类别:

金融证券系统

开发平台:

Others

  1. //------------------------------------------------------------------------------
  2. //
  3. //  Formula Name:    Triangle exploration using P&F Chart
  4. //  Author/Uploader: Graham Kavanagh 
  5. //  E-mail:          kavemanperth@telstra.com
  6. //  Date/Time Added: 2002-12-01 01:51:11
  7. //  Origin:          
  8. //  Keywords:        Triangle, P&F
  9. //  Level:           semi-advanced
  10. //  Flags:           exploration
  11. //  Formula URL:     http://www.amibroker.com/library/formula.php?id=237
  12. //  Details URL:     http://www.amibroker.com/library/detail.php?id=237
  13. //
  14. //------------------------------------------------------------------------------
  15. //
  16. //  This is exploration for charts making triangle patterns. The chart is for
  17. //  the P&F chart using High/Low prices.
  18. //
  19. //------------------------------------------------------------------------------
  20. //P&F Chart exploration for triangles
  21. // Chart based on High/Low prices.
  22. //The box size is auto calculated
  23. //Reverse is 3 boxes.
  24. //The continuation of exploration for breakout of the triangles is located at end of the code. Designed to be run with the charts from first exploration for the triangles placed in a watchlist.
  25. //Graham Kavanagh 01 Dec 2002
  26. SetBarsRequired(100000,100000);
  27. first=Cum(1);
  28. period=Min(20,first);
  29. mean = (HHV(C,period)+LLV(C,period))/2;
  30. range = (HHV(C,period)-LLV(C,period));
  31. bigrange=Highest(C)-Lowest(C);
  32. bigmean=(Highest(C)+Lowest(C))/2;
  33. Change0 = MA(abs(C-Ref(C,-1)),period);
  34. Ratio = IIf(range<mean, Max(range/mean,0.5),IIf(range>mean, Min(range/mean,1.1),range/mean));
  35. Change=Change0*ratio;
  36. mean=C;
  37. box = IIf(mean<=10,Max(int(change)+round(frac(Change)*10)/10,0.1),
  38. IIf(mean>10 AND mean<=20,Max(int(Change)+round(frac(Change)*10/5)*5/10,0.5), 
  39. IIf(mean>20 AND mean<=30,Max(int(Change)+round(frac(Change)/5*10)*5/10,0.5), 
  40. IIf(mean>30 AND mean<=50,Max(int(Change)+round(frac(Change)/5*10)*5/10,0.5), 
  41. IIf(mean>50 AND mean<=200,Max(round(Change),1),
  42. IIf(mean>200 AND mean<=500,Max(round(Change),1),
  43. IIf(mean>500 AND mean<=1000,Max(round(Change),2),
  44. IIf(mean>1000 AND mean<=2000,Max(round(Change/10)*10,5),
  45. Max(round(Change/10)*10,10)))))))));
  46. box = IIf(box<0.05,0.05,box);
  47. Box=LastValue(box);
  48. High  = IIf( H<10, Prec(H,1), IIf( H>=10 AND H<50, int(H) + Prec(frac(H)/5,1)*5, int(H)));
  49. Low   = IIf( L<10, Prec(L,1), IIf( L>=10 AND L<50, int(L) + Prec(frac(L)/5,1)*5, int(L)));
  50. EnableScript("jscript");
  51. <%
  52. High = VBArray( AFL( "High" ) ).toArray();
  53. Low = VBArray( AFL( "Low" ) ).toArray();
  54. PFO = new Array();
  55. PFC = new Array();
  56. Box = AFL("Box");
  57. // initialize first element
  58. j = 0;
  59. PFC[j] = Box*Math.floor(Low[0]/Box);
  60. PFO[j] = PFC[j] + Box;
  61. down = 1;                  // By default the first bar is a down bar.
  62. up = 0;
  63. swap = 0;
  64. // perform the loop that produces PF Chart
  65. for( i = 1; i < High.length; i++ )
  66. {
  67.  Reverse = Box * 3 + Box;                      // reversal requirement
  68.  if( Low[i] <= PFC[j]-Box && down)         //continue down
  69.  {
  70.   PFC[j] = Box*Math.floor(Low[i]/Box);
  71.   PFO[j] = PFC[j] + Box;
  72.  }
  73.  else
  74.  {
  75.   if( High[i] >= PFC[j] + Reverse && down)  //Change direction to up
  76.   {
  77.    j++;
  78.    swap = 1;
  79.    PFC[j] = Box*Math.ceil(High[i]/Box);
  80.    PFO[j] = PFC[j]-Box;
  81.   }
  82.  }
  83.  if( High[i] >= PFC[j] + Box && up)         //Continue up
  84.  { 
  85.   PFC[j] = Box*Math.ceil(High[i]/Box);
  86.   PFO[j] = PFC[j] - Box;
  87.  }
  88.  else
  89.  {
  90.   if( Low[i] <= PFC[j] - Reverse && up)   //Change direction to down
  91.   {
  92.    j++;
  93.    PFC[j] = Box*Math.floor(Low[i]/Box);
  94.    PFO[j] = PFC[j] + Box;
  95.    swap = 1;
  96.   }
  97.  }
  98.  if( swap )
  99.  {
  100.   swap = 0;
  101.   if( up )
  102.   {
  103.    up = 0;
  104.    down = 1;
  105.   }
  106.   else
  107.   {
  108.    up = 1;
  109.    down = 0;
  110.   }
  111.  }
  112. }
  113. delta = High.length - j-1;
  114. AFL.Var("PFO") = PFO;
  115. AFL.Var("PFC") = PFC;
  116. AFL.Var("Box") = Box;
  117. AFL.Var("delta") = delta;
  118. AFL.Var("Reverse") = Reverse; 
  119. %>
  120. PFO = Ref( PFO, -delta );
  121. PFC = Ref( PFC, -delta );
  122. // High-Low range sets the height of the P&F bar 
  123. H = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-Box,Max(PFO,PFC));
  124. L = IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+Box,Min(PFO,PFC));
  125. O = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-Box,IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+Box,PFO));
  126. // the difference between Open AND Close should be set to box size 
  127. // the sign decides if X or O are plotted 
  128. C = O + Box * IIf( PFC > PFO, 1,-1);
  129. //Exploration for Triangles
  130. Equal = (C>O AND H<Ref(H,-2) AND Ref(H,-2)<Ref(H,-4) AND Ref(L,-1)>Ref(L,-3)) OR (C<O AND L>Ref(L,-2) AND Ref(L,-2)>Ref(L,-4) AND Ref(H,-1)<Ref(H,-3));
  131. Ascend = (C>O AND ( (H<Ref(H,-2) AND Ref(H,-2)==Ref(H,-4)) OR H==Ref(H,-2) ) AND Ref(L,-1)>Ref(L,-3)) OR (C<O AND ( (Ref(H,-1)<Ref(H,-3) AND Ref(H,-3)==Ref(H,-5)) OR Ref(H,-1)==Ref(H,-3) ) AND L>Ref(L,-2) AND Ref(L,-2)>Ref(L,-4));
  132. Descend = (C>O AND ( (Ref(L,-1)>Ref(L,-3) AND Ref(L,-3)==Ref(L,-5)) OR Ref(L,-1)==Ref(L,-3) ) AND H<Ref(H,-2) AND Ref(H,-2)<Ref(H,-4)) OR (C<O AND ( (L>Ref(L,-2) AND Ref(L,-2)==Ref(L,-4)) OR L==Ref(L,-2) ) AND Ref(H,-1)<Ref(H,-3));
  133. Filter = Equal==1 OR Ascend==1 OR Descend==1;
  134. AddColumn(Equal,"E",1.0);
  135. AddColumn(Ascend,"A",1.0);
  136. AddColumn(Descend,"D",1.0);
  137. /*
  138. //after the exploration locates the charts with triangle pattern they can be loaded into a watchlist and further exploration carried out for the breakout
  139. Breakout = H>Ref(H,-2);
  140. Filter = Breakout==1;
  141. AddColumn(Breakout,"BO",1.0);