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

Convergence pattern based on new ATR pivots for Amibroker (AFL)

Rating:
4 / 5 (Votes 5)
Tags:
amibroker, pattern, pivot, atr

I posted similar code already but this code uses the Reverse() function to calculate the ATR pivots. Pivots can for instance be used to look for price patterns. In this case the code looks for “convergence” patterns. By default (see parameter window) it only shows bullish patterns. Once the pattern is confirmed (meaning it will not repaint) the color changes to green (bullish) or red (bearish). As soon as a pattern is confirmed a buy or a short signal will also appear in the chart.

In the example chart you see 3 patterns in the daily INTC chart. The last pattern is bearish but is still not completed and therefor still has a grayish color. The pattern could either be confirmed or disappear before it is confirmed.

Screenshots

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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
// "Convergence" Patterns, Amibroker AFL code, E.M.Pottasch, Nov 2016
 
GfxSetCoordsMode( 1 );
GfxSetOverlayMode( 1 );
x = BarIndex();
fvb = FirstVisibleValue( x );
lvb = LastVisibleValue( x );
 
perBull = Param( "Bullish ATR Period", 20, 1, 150, 1 );
perBear = Param( "Bearish ATR Period", 20, 1, 150, 1 );
multBull = Param( "Bullish ATR Multiple", 2, 1, 4, 0.05 );
multBear = Param( "Bearish ATR Multiple", 2, 1, 4, 0.05 );
trailValueClose = ParamToggle( "Trail value", "High/Low|Close", 1 );
//tfrm = in1Minute * Param( "Time Frame (min)", 5, 1, 1440 * 10, 1 ); // 1440 minutes is 1 day
tfrm = in1Minute * Interval() / 60 * Param( "Chart Time Frame Factor", 2, 1, 10, 1 ); // factor 1 uses timeframe of chart
tog2 = ParamToggle( "Show Trail", "No|Yes", 0 );
tog3 = ParamToggle( "Show Valid High/Low", "No|Yes", 0 );
tog4 = ParamToggle( "Show Labels", "No|Yes", 1 );
tog5 = ParamToggle( "Show Bullish Convergence Pattern", "No|Yes", 1 );
tog6 = ParamToggle( "Show Bearish Convergence Pattern", "No|Yes", 0 );
 
function ATRtrail_func()
{
    // Trail code largely from:
    // http://traders.com/Documentation/FEEDbk_docs/2009/06/TradersTips.html
    if( trailValueClose )
    {
        tvHigh = C;
        tvLow = C;
    }
    else
    {
        tvHigh = H;
        tvLow = L;
    }
 
    sup = tvHigh - multBull * ATR( perBull );
    res = tvLow + multBear * ATR( perBear );
 
    trailARRAY = Null;
    trailstop = 0;
 
    for( i = 1; i < BarCount; i++ )
    {
        if( C[ i ] > trailstop AND C[ i - 1 ] > trailstop )
            trailstop = Max( trailstop, sup[ i ] );
        else
            if( C[ i ] < trailstop AND C[ i - 1 ] < trailstop )
                trailstop = Min( trailstop, res[ i ] );
            else
                trailstop = IIf( C[ i ] > trailstop, sup[ i ], res[ i ] );
 
        trailARRAY[ i ] = trailstop;
    }
 
    return trailARRAY;
}
 
TimeFrameSet( tfrm );
trBull = multBull * ATR( perBull );
trBear = multBear * ATR( perBear );
trailArray = ATRtrail_func();
ts = IIf( trailArray > C, trailArray, Null ); // dntrend
tl = IIf( trailArray < C, trailArray, Null ); // uptrend
TimeFrameRestore();
 
ts = TimeFrameExpand( ts, tfrm, expandlast );
tl = TimeFrameExpand( tl, tfrm, expandlast );
 
lll = LLV( L, BarsSince( !IsEmpty( tl ) ) );
lll = IIf( ts, lll, Null );
trm = ts AND L == lll;
 
hhh = HHV( H, BarsSince( !IsEmpty( ts ) ) );
hhh = IIf( tl, hhh, Null );
pkm = tl AND H == hhh;
 
tr = ExRem( Reverse( trm ), Reverse( pkm ) );
pk = ExRem( Reverse( pkm ), Reverse( trm ) );
 
tr = Reverse( tr );
pk = Reverse( pk );
 
pkHigh = ValueWhen( trm, ValueWhen( pk, H, 1 ), 1 );
trLow = ValueWhen( pkm, ValueWhen( tr, L, 1 ), 1 );
 
for( i = 0; i < 3; i++ )
{
    VarSet( "px" + i, ValueWhen( pk, x, i ) );
    VarSet( "tx" + i, ValueWhen( tr, x, i ) );
    VarSet( "ph" + i, ValueWhen( pk, H, i ) );
    VarSet( "tl" + i, ValueWhen( tr, L, i ) );
    VarSet( "pxm" + i, ValueWhen( pkm, x, i ) );
    VarSet( "txm" + i, ValueWhen( trm, x, i ) );
    VarSet( "phm" + i, ValueWhen( pkm, H, i ) );
    VarSet( "tlm" + i, ValueWhen( trm, L, i ) );
}
 
ll = tr AND tl1 < tl2;
hl = tr AND tl1 > tl2;
hh = pk AND ph1 > ph2;
lh = pk AND ph1 < ph2;
dt = pk AND ph1 == ph2;
db = tr AND tl1 == tl2;
 
ll_h = IIf( ll, 1, 0 );
hl_h = IIf( hl, 2, 0 );
hh_h = IIf( hh, 3, 0 );
lh_h = IIf( lh, 4, 0 );
dt_h = IIf( dt, 5, 0 );
db_h = IIf( db, 6, 0 );
 
combi = ll_h + hl_h + lh_h + hh_h;
 
t0 = ValueWhen( combi, combi, 0 );
t1 = ValueWhen( combi, combi, 1 );
t2 = ValueWhen( combi, combi, 2 );
t3 = ValueWhen( combi, combi, 3 );
t4 = ValueWhen( combi, combi, 4 );
 
BuConv = tr AND t1 == 2 AND t2 == 4;
Buy = ( pkm AND t1 == 2 AND t2 == 4 )
      OR( pk AND t2 == 2 AND t3 == 4 );
BuyPrice = C;
Sell = trm;
SellPrice = C;
Buy = ExRem( Buy, Sell );
Sell = ExRem( Sell, Buy );
 
BeConv = pk AND t1 == 4 AND t2 == 2;
Short = ( trm AND t1 == 4 AND t2 == 2 )
        OR( tr AND t2 == 4 AND t3 == 2 );
ShortPrice = C;
Cover = pkm;
CoverPrice = C;
Short = ExRem( Short, Cover );
Cover = ExRem( Cover, Short );
 
GraphXSpace = 5;
SetChartBkColor( colorBlack );
SetChartOptions( 1, chartShowDates, chartGridMiddle, 0, 0, 0 );
SetBarFillColor( IIf( C > O, ColorRGB( 0, 75, 0 ), IIf( C <= O, ColorRGB( 75, 0, 0 ), colorLightGrey ) ) );
Plot( C, "", IIf( C > O, ColorRGB( 0, 255, 0 ), IIf( C <= O, ColorRGB( 255, 0, 0 ), colorLightGrey ) ), 64, Null, Null, 0, 0, 1 );
 
if( tog2 )
{
    Plot( ts, "", colorRed, styleStaircase | styleNoRescale, Null, Null, 0, 0, 1 );
    Plot( lll, "", colorRed, styleDashed | styleNoRescale, Null, Null, 0, 0, 1 );
    Plot( tl, "", colorGreen, styleStaircase | styleNoRescale, Null, Null, 0, 0, 1 );
    Plot( hhh, "", colorGreen, styleDashed | styleNoRescale, Null, Null, 0, 0, 1 );
}
 
if( tog3 )
{
    Plot( pkHigh, "", colorBlue, styleLine | styleNoRescale, Null, Null, 0, 0, 1 );
    Plot( trLow, "", colorRed, styleLine | styleNoRescale, Null, Null, 0, 0, 1 );
}
 
PlotShapes( shapeSmallCircle*trm, ColorRGB( 0, 30, 0 ), 0, L, -10 );
PlotShapes( shapeSmallCircle*pkm, ColorRGB( 50, 0, 0 ), 0, H, 10 );
PlotShapes( shapeSmallCircle*tr, IIf( ValueWhen( trm, x, 1 ) < ValueWhen( pkm, x, 0 ), ColorRGB( 0, 255, 0 ), ColorRGB( 255, 255, 255 ) ), 0, L, -10 );
PlotShapes( shapeSmallCircle*pk, IIf( ValueWhen( pkm, x, 1 ) < ValueWhen( trm, x, 0 ), ColorRGB( 255, 0, 0 ), ColorRGB( 255, 255, 255 ) ), 0, H, 10 );
 
function drawPivotLabels()
{
    sz = 5;
 
    for( i = lvb; i > fvb; i-- )
    {
        {
            if( ll[i] ) PlotTextSetFont( "LL", "Arial Black", sz, i, L[i], colorGreen, colorDefault, -25 );
 
            if( hl[i] ) PlotTextSetFont( "HL", "Arial Black", sz, i, L[i], colorGreen, colorDefault, -25 );
 
            if( db[i] ) PlotTextSetFont( "DB", "Arial Black", sz, i, L[i], colorLightBlue, colorDefault, -25 );
 
            if( hh[i] ) PlotTextSetFont( "HH", "Arial Black", sz, i, H[i], colorRed, colorDefault, 20 );
 
            if( lh[i] ) PlotTextSetFont( "LH", "Arial Black", sz, i, H[i], colorRed, colorDefault, 20 );
 
            if( dt[i] ) PlotTextSetFont( "DT", "Arial Black", sz, i, H[i], colorOrange, colorDefault, 20 );
        }
    }
}
function drawBuConvergence()
{
    for( i = lvb; i > fvb; i-- )
    {
        if( BuConv[i] )
        {
            if( txm1[i] < pxm0[i] )
            {
                GfxSelectPen( ColorRGB( 0, 255, 0 ), 1 );
                GfxSelectSolidBrush( ColorRGB( 0, 10, 0 ) );
            }
            else
            {
                GfxSelectPen( ColorRGB( 0, 60, 0 ), 1 );
                GfxSelectSolidBrush( ColorRGB( 30, 30, 30 ) );
            }
 
            GfxPolygon( tx1[i], tl1[i], tx2[i], tl2[i], px2[i], ph2[i], px1[i], ph1[i], tx1[i], tl1[i] );
        }
    }
}
function drawBeConvergence()
{
    for( i = lvb; i > fvb; i-- )
    {
        if( BeConv[i] )
        {
            if( pxm1[i] < txm0[i] )
            {
                GfxSelectPen( ColorRGB( 255, 0, 0 ), 1 );
                GfxSelectSolidBrush( ColorRGB( 10, 0, 0 ) );
            }
            else
            {
                GfxSelectPen( ColorRGB( 60, 0, 0 ), 1 );
                GfxSelectSolidBrush( ColorRGB( 30, 30, 30 ) );
            }
 
            GfxPolygon( tx1[i], tl1[i], tx2[i], tl2[i], px2[i], ph2[i], px1[i], ph1[i], tx1[i], tl1[i] );
        }
    }
}
Title = Name() +
        " | " + Now( 2 ) +
        " | " + "PIVOT TIMEFRAME: " + tfrm / 60 + " Minutes or " + tfrm / 3600 + " Hours or " + tfrm / ( 3600 * 24 ) + " Days ";
 
if( tog4 ) drawPivotLabels();
 
if( tog5 )
{
    drawBuConvergence();
    PlotShapes( IIf( Buy, shapeUpArrow, shapeNone ), colorBrightGreen, 0, L, -15 );
    PlotShapes( IIf( Buy, shapeSmallCircle, shapeNone ), colorWhite, 0, BuyPrice, 0 );
    PlotShapes( IIf( Sell, shapeDownArrow, shapeNone ), colorRed, 0, H, -15 );
    PlotShapes( IIf( Sell, shapeSmallCircle, shapeNone ), colorWhite, 0, SellPrice, 0 );
}
 
if( tog6 )
{
    drawBeConvergence();
    PlotShapes( IIf( Short, shapeSmallDownTriangle, shapeNone ), colorRed, 0, H, IIf( Short AND Sell, -30, -15 ) );
    PlotShapes( IIf( Short, shapeSmallCircle, shapeNone ), colorWhite, 0, ShortPrice, 0 );
    PlotShapes( IIf( Cover, shapeSmallUpTriangle, shapeNone ), colorBrightGreen, 0, L, IIf( Cover AND Buy, -30, -15 ) );
    PlotShapes( IIf( Cover, shapeSmallCircle, shapeNone ), colorWhite, 0, CoverPrice, 0 );
}

14 comments

1. kumaran669

Syntax errors..

2. satish1b

Getting Error

3. joeoil

It works ok for me. No syntax error.

I use Amibroker v. 5.90

4. empottasch

indeed joeoil, i wish these clowns wouldn’t start screaming for justice as they clearly didn’t even pay for Amibroker. I just explained that I used the Reverse() function. You need 5.9 for this or 5.8. Why don’t you clowns point me to a real error for a change.

5. davidalan

very nice

6. tradinology

nice work empottasch, thank you,,,,

7. crkumar

Sir,
I have heard people talk highly of you & your techniques.
Is there any regular location where your old and new/updated ideas, codes, posts etc may be found.
Thanx.

8. empottasch

thank you. No I just post occasionally some code. In this case it dawned on me I could use the Reverse() function on old code I had. It might also work for code I posted before using fractal type pivots. Will try that out.

9. ramesh_chennai

Hi Ed Sir,

Your codes always simple and powerful.Thanks for sharing such a wonderful things.

Thanking you

Ramesh

10. crkumar

Great community service spirit !!

11. szgolyas

dont work on ami 5 and 5.7

12. Tuenv

Dear frd
Can use code to scan?

13. ahfnakakil

It says Syntax errors ln=182 col=40 . Can anyone tell me what really it is.

14. administrator

You need to upgrade your Amibroker to a newer version.

Leave Comment

Please login here to leave a comment.

Back