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

Market Profile for Amibroker (AFL)

Rating:
5 / 5 (Votes 1)
Tags:
market profile, amibroker, intraday

Calculate the market profile.

Similar Indicators / Formulas

OHLC indicator
Submitted by godisbogus about 15 years ago
1 Minute inside 6 bar consolidation
Submitted by alvaroaltair almost 11 years ago
INTRADAY AVERAGE VOLUME
Submitted by shethia over 14 years ago
MultiCharts
Submitted by janet0211 almost 15 years ago
Real Time Daily Price Levels
Submitted by kaiji about 15 years ago
MPLite --KAKA+ Heinkin Ashi +NickMA
Submitted by bestnifty almost 15 years ago

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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
_SECTION_BEGIN("MarketProfile");
//------------------------------------------------------------------------------
//
//  Formula Name:    Market Profile
//
// Use with 5/15min chart
// Originial - From AFL library
// Edited by - Milind / KAKA
 
//Market Profile 10/12/2009
 
 
//------------------------------------------------------------------------------
// This is a modified version of afl date 09/19/2009 as listed above
// Contains a couple changes:
// 1) a more correct (but not complete) calculation of POC.
// 2) attempt to avoid the out of bound runtime error that
//    sometimes occurs. See below:
//
// Here are changes to emulate the arrays x[] and total[] so
// that the array size are not limited by Barcount.
// Now one probably should not get the out of bound error even
// if the density or ticksize is smaller. Of course, there will
// be more overhead in calculation.
// johncw 20091010
// Wrapper start
_N(VarKey = NumToStr(GetChartID(), 1.0, False) + "_");
_N(VarTotal = "V_T" + VarKey);
_N(VarX = "V_x" + VarKey);
 
function L_StaticVarSet(L_name, L_value)
{
    local L_name, L_value;
    StaticVarSet(L_name + VarKey, L_value);
}
 
function L_StaticVarGet(L_name)
{
    local L_name;
    return(StaticVarGet(L_name + VarKey));
}
 
function x_g(L_idx)
{
    local L_idx;
    return VarGet(VarX + L_idx);
}
 
function x_s(L_idx, L_value)
{
    local L_idx, L_value;
    VarSet(VarX + L_idx, L_value);
}
 
function total_g(L_idx)
{
    local L_idx;
    return VarGet(VarTotal+L_idx);
}
 
function total_s(L_idx, L_value)
{
    local L_idx, L_value, L_name;
    VarSet(VarTotal+L_idx, L_value);
}
// Wrapper end
//------------------------------------------------------------------------------
 
 
PlotOHLC(O,H,L,C,"Price",IIf(C>O,colorGreen,colorRed),styleCandle);
 
 
EnMP2= ParamList("MarketProfile","Solid|Lines|Letters");
styleLines = ParamStyle("Style", styleLine, maskAll);
 
Type=ParamList("Type","Price Profile|Volume Profile");
Period= ParamList("Base","Hourly|Daily|Weekly|Monthly",1);
 
Den = Param("Density", 1, 0.25, 100, 0.25); // Resolution in terms of $
percent=Param("Value Area", 70, 1, 100, 1);
ViewTPOCount= ParamToggle("Show TPO Count", "No|Yes",1);
Viewvalues= ParamToggle("Show Values", "No|Yes",1);
 
ViewPREVIOUS = ParamToggle("Previous Values", "No|Yes",1);
 
ViewVALVAH = ParamToggle("Show VAL VAH Line", "No|Yes",1);
Viewfill = ParamToggle("Show VA Fill", "No|Yes",0);
Colorpoc=ParamColor("Color POC", colorYellow);
Colorfill=ParamColor("Color Fill", ColorRGB(20,40,60));
 
 
EnIB = ParamToggle("Show Initial Balance", "Yes|No");
IBBars = Param("Initial Balance Bars", 2, 0, 10, 1);
 
if(Period=="Daily"){
BarsInDay = BarsSince(Day() != Ref(Day(), -1));
Bot = TimeFrameGetPrice("L", inDaily, 0);
Top = TimeFrameGetPrice("H", inDaily, 0);
Vol = TimeFrameGetPrice("V", inDaily, 0);
}
 
if(Period=="Hourly"){
BarsInDay = BarsSince(Minute() != Ref(Minute(), -1));
Bot = TimeFrameGetPrice("L", in5Minute, 0);
Top = TimeFrameGetPrice("H", in5Minute, 0);
Vol = TimeFrameGetPrice("V", in5Minute, 0);
}
 
if(Period=="Weekly"){
BarsInDay = BarsSince(DayOfWeek() < Ref( DayOfWeek(), -1 ));
Bot = TimeFrameGetPrice("L", inWeekly, 0);
Top = TimeFrameGetPrice("H", inWeekly, 0);
Vol = TimeFrameGetPrice("V", inWeekly, 0);
}
 
if(Period=="Monthly" ){
BarsInDay = BarsSince(Month() != Ref(Month(), -1));
Bot = TimeFrameGetPrice("L", inMonthly, 0);
Top = TimeFrameGetPrice("H", inMonthly, 0);
Vol = TimeFrameGetPrice("V", inMonthly, 0);
}
 
CurTop = HHV(H,BarsInDay+1);
Curbot = LLV(L,BarsInDay+1);
Range = Highest(Top-Bot);
TodayRange = Top - Bot;
 
AveRange = Sum(Top-Bot,30)/30;
LAveRange = AveRange[BarCount-1];
 
// Initialization
baseX = 0;
baseY = floor(Bot[0]/Den)*Den;
relTodayRange = 0;
firstVisBar = Status("firstvisiblebar");
lastVisBar = Status("lastvisiblebar");
 
D=.0005;
//total=0;
totaldn=0;
totalup=0;
shiftup=0;
shiftdn=0;
startr=0;
 
i0 = 0;
i1 = 0;
for (i=0; i<BarCount; i++) {
  x_s(i, 0); // should not need this
  if (BarsInDay[i] == 0 AND i < firstVisBar) {
    i0 = i;
  }
  if (BarsInDay[i] == 0 AND i >= lastVisBar) {
    i1 = i;
  }
}
 
i1 = BarCount-1;
for (i=i0; i<=i1; i++) {
  if (BarsInDay[i] == 0) {
    baseX = i;
    baseY = floor(Bot[i]/Den)*Den;
    maxY = floor(Top[i]/Den)*Den;
    relTodayRange = (maxY-baseY)/Den;
 
    for (j=0; j <= relTodayRange; j++) {
        x_s(j, 0);
         
    }
  }
     
    range_x=lastVisBar-firstVisBar;
    spread = Param("X Space", 80, 1, 200, 1);
    tpl = Param("Time Per Letter (mins)", 30, 1, 360, 1);
    Intervalmin=Interval()/60;
    flt =Param("First Letter (Bars)", 1, 1, 60, 1);
    teb=ParamToggle("To Each Bar","No|Yes");
    Color=Param("Color Threshold",20,1,50,1);
    stopg=0;
    stopr=0;
    new=0;
     
    Voloumeunit=Vol[i]/LastValue(BarsInDay);
 
 
  if (EnMP2 == "Letters") {
    for (j=0; j<= relTodayRange; j++) {
      if (L[i] <= baseY+j*Den AND H[i] >= baseY+j*Den) {
        PlotText(StrExtract(" A , B , C , D , E , F , G , H ,  I  , J , K , L , M , N , O , P , Q , R , S , T , U , V , W , X , Y , Z, a , b , c , d , e , f , g , h , i , j , k , L , m , n ,o , p , q , r , s , t , u , v , w , x , y , z ",
        IIf(BarsInDay[i]<flt,0,ceil(BarsInDay[i]/(tpl/Intervalmin))-0)), baseX+IIf(teb==1,BarsInDay[i],x_g(j)*(range_x/spread)), baseY+j*Den,
        colorWhite,ColorHSB(10+((ceil(BarsInDay[i]/(tpl/Intervalmin)))*Color),160,140));
        x_s(j, x_g(j)+1);
 
      }
    }
  }
     
  else if (EnMP2 == "Lines" OR EnMP2 == "Solid") {
    for (j=0; j<= relTodayRange; j++) {
     if (L[i] <= baseY+j*Den AND H[i] >= baseY+j*Den) {
        if(Type=="Price Profile"){x_s(j, x_g(j)+1);}
        else if(Type=="Volume Profile"){x_s(j, x_g(j)+round(V[i]/Voloumeunit));}
     
       }
    }
  
 
  // Draw Initial Balance after 11am bar is complete
  if (BarsInDay[i] == IBBars+1 AND EnIB == 0) {
    Line1 = LineArray(i-2, curtop[i-1],i+7, curtop[i-1],0,True);
    Plot(Line1,"",colorLightGrey,styleLine+styleDashed|styleNoRescale);
    Line1 = LineArray(i-2, curbot[i-1],i+7, curbot[i-1],0,True);
    Plot(Line1,"",colorLightGrey,styleLine+styleDashed|styleNoRescale);
  }
 
  // Examine x[j]
  if ((i < BarCount - 1 AND BarsInDay[i+1] == 0) OR i == BarCount-1) {
    maxXj = 0;
    maxj = 0;
    midrange = int(relTodayRange/2)+1;
    for (j=0; j<= relTodayRange; j++) {
      if (maxXj < x_g(j)) {
            maxXj = x_g(j); maxj = j; L_StaticVarSet("Maxj",j); new=j;
      } else if ( MaxXj == x_g(j)) {
            if (abs(midrange-j)  < abs(midrange-L_StaticVarGet("Maxj"))) {
                maxXj = x_g(j); maxj = j; L_StaticVarSet("Maxj",j); new=j;
            }
      }
    }
    total_s(0, 0);
    for ( n = 1; n <= relTodayRange; n++ ) {
        total_s(n, x_g(n) + total_g(n-1));
        }
 
    Value_area=(total_g(relTodayRange)*percent)/100;
 
    for ( a = 1; a <= relTodayRange; a++ )
     {
        if(Maxj-a>0 AND Maxj+a<relTodayRange)
        {
            if(MaxXj+total_g(Maxj+a)-total_g(Maxj)+(total_g(maxj)-MaxXj)-total_g(Maxj-(a+1))>=Value_area) {shiftup=a; shiftdn=a; break;}
        }  
        else if(Maxj-a<1 )
        {
            if(MaxXj+total_g(Maxj+a)-total_g(Maxj)+(total_g(maxj)-MaxXj)>=Value_area){shiftup=a; shiftdn=maxj-1; break;}    
        }
        else if(Maxj+a>relTodayRange )
        {
            if(MaxXj+total_g(relTodayRange)-total_g(Maxj)+(total_g(maxj)-MaxXj)-total_g(Maxj-(a+1)) >=Value_area){shiftup=relTodayRange-maxj; shiftdn=a; break;}    
        }
     }
 
    Vah = LineArray(baseX, baseY+(maxj+shiftup)*Den, i, baseY+(maxj+shiftup)*Den,0,True);
    Val = LineArray(baseX, baseY+(maxj-shiftdn)*Den, i, baseY+(maxj-shiftdn)*Den,0,True);
    Vah1 = LineArray(i, baseY+(maxj+shiftup)*Den, i+BarsInDay[i], baseY+(maxj+shiftup)*Den,0,True);
    Val1 = LineArray(i, baseY+(maxj-shiftdn)*Den, i+BarsInDay[i], baseY+(maxj-shiftdn)*Den,0,True);
    poc = LineArray(baseX, baseY+maxj*Den, i, baseY+maxj*Den,0,True);
    poc1 = LineArray(i, baseY+maxj*Den, i+BarsInDay[i], baseY+maxj*Den,0,True);
 
    if(ViewVALVAH==1)
    {
        Plot(Vah,"",ParamColor("Color_VA"colorBlueGrey),styleLine|styleNoRescale);
        Plot(Val,"",ParamColor("Color_VA"colorLightBlue),styleLine|styleNoRescale);
        Plot(poc,"",Colorpoc,styleLine|styleNoRescale);
    }
    if(ViewPREVIOUS==1)
    {
        Plot(Vah1,"",ParamColor("Color_VA"colorBlueGrey),styleDashed|styleNoRescale);
        Plot(Val1,"",ParamColor("Color_VA"colorLightBlue),styleDashed|styleNoRescale);
        Plot(poc1,"",Colorpoc,styleDashed|styleNoRescale);
    }
 
 
    if(Viewvalues==1)
    {
    PlotText(""+(baseY+maxj*Den),i-5,baseY+maxj*Den,Colorpoc);
    PlotText(""+(baseY+(maxj+shiftup)*Den),i-5,baseY+(maxj+shiftup)*Den,colorWhite);
    PlotText(""+(baseY+(maxj-shiftdn)*Den),i-5,baseY+(maxj-shiftdn)*Den,colorWhite);
    if(ViewTPOCount==1){PlotText(""+(total_g(maxj)-MaxXj)+" / "+(total_g(maxj-shiftdn-1)),basex,bot[i]-(Top[i]-bot[i])*0.05,ParamColor("Color_Below_VA"colorGrey40));
    PlotText(""+(total_g(relTodayRange)-total_g(maxj))+" / "+(total_g(relTodayRange)-total_g(maxj+shiftup)),basex,Top[i],ParamColor("Color_Above_VA", colorGrey40));
    }
 
 
 
    }
     
  }
     
    if (i < BarCount - 1 AND BarsInDay[i+1] == 0 OR i == BarCount-1) {
     
      for  (p = 1; p < relTodayRange+1; p++){
      line = LineArray(baseX, baseY+p*Den, baseX+x_g(p), baseY+p*Den);
      line2 = LineArray(baseX, baseY+(p-1)*Den, baseX+x_g(p-1), baseY+(p-1)*Den);
 
      if (EnMP2 == "Solid")
      {
      PlotOHLC( Line,  Line,  Line2, Line2, "",IIf(p>(maxj+shiftup),ParamColor("Color_Above_VA",   colorGrey40),IIf(p<=(maxj+shiftup)AND p>(maxj-shiftdn),ParamColor("Color_VA", colorBlueGrey),ParamColor("Color_Below_VA"colorGrey40))) ,styleCloud|styleNoRescale|styleNoLabel);
      }
      if (EnMP2 == "Lines")
      {
     Plot(line,"",IIf(p>(maxj+shiftup),ParamColor("Color_Above_VA"colorGrey40),IIf(p<=(maxj+shiftup)AND p>(maxj-shiftdn),ParamColor("Color_VA", colorBlueGrey),ParamColor("Color_Below_VA",   colorGrey40))) , styleLines|styleNoLabel);
     }
     
   }
     if(Viewfill==1){PlotOHLC(Vah,Vah,Val,Val,"",Colorfill,styleCloud|styleNoRescale|styleNoLabel);}
 
 }
}
 
 
_SECTION_END();

5 comments

1. kelvinhand

Recently was looking into this AFL in TJ.

Found that there are bugs, not properly done and check before uploading to here.
1) On line 102-107 for hourly timeframe

  • => BarsInDay = BarsSince(Minute() != Ref(Minute(), -1));
    KH:Why hourly is using Minute() ?
  • => Bot = TimeFrameGetPrice(“L”, in5Minute, 0);
  • => Top = TimeFrameGetPrice(“H”, in5Minute, 0);
  • => Vol = TimeFrameGetPrice(“V”, in5Minute, 0);
    KH:Why use in5Minute and not inHourly

2) Hourly timeframe cannot be used.
=> Because the Plot()/PlotOHLC() were using in the huge looping, this will cause the amibroker raise the exception of more than 500 calls.
Therefore not suggest to use in hourly timeframe set.

3) The program seen to me there are bugs which not able to figure yet regardless of timeframe set. It keep plotting the Vah & Val, Vah1 & val1, and overwrite the plotting of Poc/Poc1 (Yellow color) and never appear.

Also I doubt the algorithm is correct.

Please kindly solve the problem.

If not, i don’t suggest anyone use this script in hourly

2. jayman2005

@kevinhand, actually it should not matter because when you use in5minute in TimeFrameSet when your current interval is inHourly, the timeframe will default to inHourly. AB will only act if you use a HIGHER TF than the one that is current while using TimeFrameSet.

3. oskempawad

It doesn’t work for Bank Nifty and few other stocks.

4. surbhi bhosle

Hey what is the ideal density for Density for Indian Markets as you have given Density in terms of Dollars: ‘Den = Param(“Density”, 1, 0.25, 100, 0.25); // Resolution in terms of $’

5. ford7k

The formula works good. just go to parameters and change density to 100.
THANKS TO THE UPLOADER.
Can somebody upload eod market profile afl code please.
thanks in advance.

Leave Comment

Please login here to leave a comment.

Back