Stock Portfolio Organizer

The ultimate porfolio management solution.

Shares, Margin, CFD's, Futures and Forex
EOD and Realtime
Dividends and Trust Distributions
And Much More ....
For Portfolio Manager Click Here

WiseTrader Toolbox

#1 Selling Amibroker Plugin featuring:

Advanced Adaptive Indicators
Advanced Pattern Exploration
Neural Networks
And Much More ....
Find Out More Here

Triangle exploration using P&F Chart for Amibroker (AFL)
kaiji
about 15 years ago
Amibroker (AFL)

Rating:
3 / 5 (Votes 4)
Tags:

This is exploration for charts making triangle patterns. The chart is for the P&F chart using High/Low prices.

Indicator / Formula

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

1 comments

1. eurosiva

What are E, A, D readings in the scan result, please explain.

Leave Comment

Please login here to leave a comment.

Back