Market Profile is the recent buzzword in social media especially when comes to Indian traders. And this article throws light on the variety of options available for traders to access market profile and footprint charts(ranging from low cost to high cost depending upon the trader’s need and to access in your favorite trading analysis software like Amibroker, Metastock, Esignal, Market Delta, Multicharts, Windotrader, InvestorRT & SierraCharts.
Amibroker
If one is looking for low cost option to learn market profile during live market then one should try installing Amibroker + 1min Realtime datafeed (Globaldatafeeds or any other)

Market Profile Charts : One can get Market Profile Charts using Amibroker at free of cost. Licensed Amibroker version cost 339 USD (one time license fee) All they need is a quality datafeed from authentic datavendors. The credit goes to the orginal creator Milind/Kaka. Market Profile Charts with Letters are shown below. The below modified code by john even supports lower tick size.
Market Profile – Amibroker AFL Code
_SECTION_BEGIN("MarketProfile");
SetChartOptions(0,chartShowArrows|chartShowDates);
//------------------------------------------------------------------------------
//
// Formula Name: Market Profile
//
// Use with 5/15min chart
// Originial - From AFL library
// Edited by - Milind / KAKA
// AFL Modified by Rajandran R ( www.marketcalls.in) code works good in 5min, 15min, 30min timeframe
// Code is Compatible with Amibroker 5.8 and above
// Letter A now repeats for first 30 min, Letter B next 30 min so on
// Multiple Repeating Alphabets Horizontally to be fixed in 5min and 15min
//Market Profile 9/12/2009
PlotOHLC(Ref(O,-1),Ref(H,-1),Ref(L,-1),Ref(C,-1),"Price",colorblack,stylenoline);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g", Ref(O,-1), Ref(H,-1), Ref(L,-1), Ref(C,-1) ));
EnMP2= ParamList("MarketProfile","Letters|Solid|Lines");
styleLines = ParamStyle("Style", styleLine, maskAll);
Type=ParamList("Type","Price Profile|Volume Profile");
Period= ParamList("Base","Hourly|Daily|Weekly|Monthly",1);
Den = Param("Density", 3, 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);
ViewPOC = ParamToggle("Show POC", "No|Yes",1);
ViewVALVAH = ParamToggle("Show VAL VAH Line", "No|Yes",1);
Viewfill = ParamToggle("Show VA Fill", "No|Yes",1);
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;
for (j=0; j <= 100; j++) {
x[j] = 0;
}
i0 = 0;
i1 = 0;
for (i=0; i<BarCount; i++) {
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[j] = 0;
}
}
range_x=lastVisBar-firstVisBar;
spread = Param("X Space", 112, 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) {
PlotTextSetFont("", "Arial", 6, BarCount-1, Close[ BarCount - 3 ], colorGreen, colorDefault, -20 );
PlotTextSetFont("C", "Arial", 40, 100, 100, colorGreen, colorDefault, -20 );
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,floor(BarsInDay[i]/(tpl/Intervalmin))-0)), baseX+IIf(teb==1,BarsInDay[i],x[j]*(range_x/spread)), baseY+j*Den,
colorWhite,ColorHSB(10+((floor(BarsInDay[i]/(tpl/Intervalmin)))*Color),160,140));
x[j]++;
PlotTextSetFont("", "Arial", 10, BarCount-1, Close[ BarCount - 3 ], colorGreen, colorDefault, -20 );
}
}
}
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[j]=x[j]+1;}
else if(Type=="Volume Profile"){x[j]=x[j]+round(V[i]/Voloumeunit);}
}
}
}
// Draw Initial Balance after 11am bar is complete
if (BarsInDay[i] == IBBars 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;
for (j=0; j<= relTodayRange; j++) {
if (maxXj < x[j]) {maxXj = x[j]; maxj = j; StaticVarSet("Maxj",j); new=j;
}
}
for ( n = 1; n <= relTodayRange; n++ ) {
total[n]=x[n]+total[n-1];
}
Value_area=(total[relTodayRange]*percent)/100;
for ( a = 1; a <= relTodayRange; a++ )
{
if(Maxj-a>0 AND Maxj+a<relTodayRange)
{
if(MaxXj+total[Maxj+a]-total[Maxj]+total[Maxj-1]-total[Maxj-(a+1)]>=Value_area) {shiftup=a; shiftdn=a; break;}
}
else if(Maxj-a<1 )
{
if(MaxXj+total[Maxj+a]-total[Maxj]+total[Maxj-1]>=Value_area){shiftup=a; shiftdn=maxj-1; break;}
}
else if(Maxj+a>relTodayRange )
{
if(MaxXj+total[relTodayRange]-total[Maxj]+total[Maxj-1]-total[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);
poc = LineArray(baseX, baseY+maxj*Den, i, baseY+maxj*Den,0,True);
if(ViewVALVAH==1){Plot(Vah,"",ParamColor("Color_VA", colorLightBlue),styleLine|styleNoRescale);
Plot(Val,"",ParamColor("Color_VA", colorLightBlue),styleLine|styleNoRescale);}
if(ViewPOC==1){Plot(poc,"",Colorpoc,styleLine|styleNoRescale);}
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[maxj],basex,bot[i]-(Top[i]-bot[i])*0.05,ParamColor("Color_VAL", colorLavender));
PlotText(""+(total[relTodayRange]-total[maxj]),basex,Top[i]+(Top[i]*0.0005),ParamColor("Color_VAH", colorLavender));}
if(ViewPOC==1){PlotText(""+(baseY+maxj*Den),i-5,baseY+maxj*Den,Colorpoc);}
}
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[p], baseY+p*Den);
line2 = LineArray(baseX, baseY+(p-1)*Den, baseX+x[p-1], baseY+(p-1)*Den);
if (EnMP2 == "Solid")
{
PlotOHLC( Line, Line, Line2, Line2, "",IIf(p>(maxj+shiftup),ParamColor("Color_VAH", colorLavender),IIf(p<=(maxj+shiftup)AND p>(maxj-shiftdn),ParamColor("Color_VA", colorLightBlue),ParamColor("Color_VAL", colorLavender))) ,styleCloud|styleNoRescale|styleNoLabel);
}
if (EnMP2 == "Lines")
{
Plot(line,"",IIf(p>(maxj+shiftup),ParamColor("Color_VAH", colorLavender),IIf(p<=(maxj+shiftup)AND p>(maxj-shiftdn),ParamColor("Color_VA", colorLightBlue),ParamColor("Color_VAL", colorLavender))) , styleLines|styleNoLabel);
}
}
if(Viewfill==1){PlotOHLC(Vah,Vah,Val,Val,"",Colorfill,styleCloud|styleNoRescale|styleNoLabel);}
}
}
_SECTION_END();
_SECTION_BEGIN("Gradient Backfill");
SetChartBkGradientFill( ParamColor("BgTop", ColorRGB( 0,0,0 )),
ParamColor("BgBottom", ColorRGB( 0,0,0 )),ParamColor("titleblock",ColorRGB( 192,192,192 )));
_SECTION_END();
Datafeed : Supports Indian data vendors and International datavendors providing 1min realtime feeds or tick level feeds.
Compatibility : AFL Code is compatible only with 5.8 and above.
Ninjatrader
Ninjatrader is a free trading analysis software. But to access Market Profile charts one need to get the paid subscription from Final 269USD (onetime license fee) or Market-Profit-Pack 230USD (onetime license fee). Both provides 7 days of free trial.
Datafeed : Supports Indian datavendors providing feeds for ninjatrader or International datavendors like esignal/CQG/Barchart etc.,
Advantage : Values are more accurate, greater control over the charts, scrolling back to the historical charts, Zooming in/Zooming out will not cause issues. Vertical Scrolling possible. More Reliable if used with authentic data vendors. Suits for professional traders.
Disadvantage : Computation time gets slower if used with lower tpo size less than 100. Lesser the price per tick values more the computational power and time required.
[wp_ad_camp_5]
Footprint charts : Both Final and Market Profile Pack supports order flow aka footprint charts. But the data is not compatible with Indian vendors. One need historical tick level datafeeds. For Indian Markets one have to rely on Esignal (min 140USD per month) as of now not much options available.
Final offers Order flow charts at 59 USD per month(via paypal) or 250 USD x 3 Monthly Installments (750 USD). And Market Profit Pack offer at 512USD (one time license fee).
Esignal
If you are a Esignal Subscriber then you have to subscribe to the Market Profile premium addon for Esignal users. Currently charging 55 USD per month and for the first time market profile users will get at 10 USD for the first month (promotional). Your total costing will be coming less than 220 USD per month in this case.
Advantages : Accurate VAL, VAH, POC levels with multi day dashboard tracker. Suits for professinal traders
Disadvantages : Only Daily profile can be accessed. No facility to choose hourly profile.
Footprint Charts : Esignal Provides in the premium addon name – volume delta charts and charges 50 USD per month. Requires Esignal Premier subscription or higher.
Disadvantages : Not Interactive as Market Delta does. Cant create your own custom templates as Market Delta software does. Suits for beginners in orderflow reading.
Linnsoft – InvestorRT
Linnsoft offers Market Profile charts in Standard License 65USD per month and Professional License at 85USD per month (Comes with addon Volume breakdown Indicator
Datafeed : Compatible with Esignal only for Indian Markets. As of now no Indian datavendors supporting InvestRT Software.
Advantage : : Interactive as Market Delta TPO Profile Charts. Suits for professional traders
Footprint Charts : Currently footprint charts are not available in InvestorRT (Linnsoft)
Multicharts
Market Profile charts are available at free of cost for both Multicharts and Multicharts.Net editions. Can be downloaded here
Datafeed : Globaldatafeeds supports Multicharts can be used in case of TPO Profile Charts. However footprint charts requires Esignal Data Subscription (tick level feeds) for Indian Markets.
Multicharts supports inbuilt volume delta charts(order flow charts). But cant do much customization with volume delta charts. However Russian vendor Orderflowtrading provides Footprint Profile charts setup and the subscription pricing starts at 74 USD per month. It is interactive as Market Delta and provides custom template facilities as Market Delta does.

Market Delta Charts
Benchmark tool and mother of all the market profile charts and footprint charts. Suits for professional trader. Pricing starts at 154 USD per month (Order Flow + TPO Profile Charts)
Datafeed : Supports Esignal only for Indian Markets (TSTQ Features in Esignal needs to be enabled to work with Market Delta). Requires Esignal data subscription.
Sierra Charts
Sierra charts provides in-built TPO Profile Charts and Volume by Price Study and license fee starting at 35 USD per month
Datafeeds : Supports Globaldatafeeds. Google Finance in case of learning with Market Profile Charts.

Advantages : Extensive Customization, Interactive, Great User Experience, Cheaper to learn compared to other traditional market profile software. Suits both learners and professional profile traders.
Window Trader
Should say market profile charts are better than Market Delta in terms of Inter-activeness and user experience and can zoom out to watch any level of back historical data. Font size of letters automatically reduces when you try to put more historical data on the screen. Subscription starts at 150 USD per month. Interactive Volume Profile is the best feature and the USP in windowtrader
Datafeed : Requires Esignal data subscription for Indian Markets. No Indian vendors as of now supporting.
Advantages : Suits professional market profile traders who is looking for greater profile accuracy at tick level.
Web Based
Last but not least you can access live market profile charts from our website. Currently access is allowed only for limited scripts. Soon could extend to multiple scripts. Suits for beginners in Market Profile. It also has a social media dashboard below the charts which tracks the twitter market profile experts and provides opportunity to learn from them while watching the live charts.
Hope you got lot more insights on Market Profile and Foot Print (order flow) Softwares available for Indian Traders. Let me know if we missed out any.
Thanks a lot for all the information.
Is it possible to subscribe for normal E-signal tick data & use it for volume footprint , orderflow analysis in a C# ,C++ program..
Regards
Heard Esignal Shutdown Market Data API Services for Individual traders! But possible with Interactive Brokers as they provide Tick level access using IB API
Dear Rajandran, can you please prove me market profile with letters for amibroker 5.7 please.
Dennis
sir afl is not working showing error. using with 5.9
Make sure you had done all the TPO Density adjustments according to your Price value. Code is tested.
What are the settings you are talking about? From where to access them. I am not getting the profile displayed properly. Can you guide me?
Just like your site gives Market Profile Charts. Is it possible to provide FootPrint charts just for Nifty Futures? Thanks for this wonderful post!
Thanks for the info rajandran….
GOM ladder from Bigmiketrading is one more option which I came across,,,,,
order flow trading is the only software I have tried for 2 months which is really nice,,,but not indian scripts ( for gold , silver ) using NT 7
Dear Rajandran,
I am getting the below error.
IIf(BarsInDay[i]<flt,0,floor(BarsInDay[i]/(tpl/Intervalmin))-0)), baseX+IIf(teb==1,BarsInDay[i],x[j]*(range_x/spread)), baseY+j*Den,
colorWhite,ColorHSB(10+((floor(BarsInDay[i]/(tpl/Intervalmin)))*Color),160,140));
x[j]++;
PlotTextSetFont(
__________________________^
File: 'Formulas/Drag-Drop/Market Profile.afl', Ln: 143, Col: 17
Error 32.
Syntax Error, unexpected '('. Is there semicolon missing at the end of the previous line?
Thanks,
Sanjoy
You are not using 5.8 version and above. The above code is compatible with 5.8 and above coz PlotTextSetFont() is not supportive in lower versions.
HI rajandran,
I have version 5.7. DO you think this is the right time to upgrade Amibroker ?
Thanks
kiran
Yes if you are looking for monte carlo analysis or Matrix related functions. I personally upgraded because of montecarlo!
Sir Am having E Signal Advance Get
How can i get this study in to my system.
Please guide…..
Reagards,
Sunil Bedekar
Excellent post Rajandran ! All the available options explained in lucind manner with images to support them. Thank you for that.
So, looks like if someone wants a quality Footprint charts then one needs to shell out at least $300/mo (MarketDelta+eSignal datafeed). Any other alternative only for Footprint (orderflow) charts?
Many thanks!
I am a Intraday Trader. Trying to work on best strategy which is having more accuracy. 80 to 90 percent.
I need to know esignal with advanced get strategy is best or metastock strategy with lci and MacD for only Intraday.
Pleas suggest me any other indicator.
1…Which is better marketdelta or ninjatrader
2… ninjatrader with noft is it better
From Market Profile Point of View Ninjatrader + Fin-Alg is better and cheaper. I haven’t explored with NOFT. But in terms of order flow Market Delta provides lots of comfort. And comfort comes at a greater price 🙂
Hi Rajendran
How do decode the RED and Blue color in IB what do they say…
Just wanted to add some info here. You can now get datafeed for Ninjatrader/Market Profile from TrueData from India..no need for expensive E-signal datafeed.
For Accessing Market Profile data Esignal is not mandatory you can connect with any local vendors like Globaldatafeeds, Trudata or neotrade. However to access Foot Print Charts we require TSTQ feature (Historical BidxAsk data which currently ESignal is providing the feature.)
How this market profile can be use om MUlticahrts trading platform.
I have tried from below location, butu cant be draw properly.Can you help ?
http://www.multicharts.com/discussion/viewtopic.php?f=5&t=10872
In that case you can try out Multicharts addon – Market Profile from here http://www.multicharts.com/multicharts/addons/
I inquired about Sierra Charts from Global data feeds. GDF says they now no more support Sierra Charts. Is there any alternative. Any help appreciated.
Yeh they stopped supporting for Sierra Charts and now only alternative is Esignal for Sierra Charts users.
Hello Sir plz guide me
i am not able to get tick by tick live data for orderflowtrading.net software …plz help as i need to load footprint charts on ATAS software for NSE and MCX ….
Hi rajendran, few info required on orderflow datafeed. Currently using NT8+truedata data feed for orderflow charts. Drawback is no historical traded BIDxASK data backfill provided. is there any service provider who provides historical backfill of BIDXASK data. I saw ur previous posts mentioning that ,Esignal provides. but not tried it.
1. which datafeed provider provides ?
2. if they provide, how many days of backfill?
3. any reviews on esignal data which is providing historical data of bidxask price?
4. cost structure as of now if u r using?, one year back i enquired.
Hi Rajandran
Can you pls help me rectify “Warning 505 division by zero.” in your market profile afl.
I’m using Amibroker version 6.2 .
Check
https://forum.amibroker.com/t/i-am-getting-warning-505-division-by-zero-when-tried-to-add-market-profile-as-an-indicator/9183/3?u=vijayraghavs
How to solved error 131 (warning 505.Division by zero)
please start equity F&O script Charts
Hi Rajendran,
Neenga tamila? Naanum tamil thaan. I am based in USA and very much into trading just like yourself. Unga phone number ennanga?
dear mr rajendran
i am unable to see MF charts on ur web iam using opera/crome
i tried after deleting catche
Its already removed.
Hi Rajandran,
Many thanks for a very informative post.
Can you let us know how Bell TPO is for Indian data? Does it include features like Imbalance chart (available in Market Delta)?
Does the one time fee of 50K include data as well?
Regards
Shantanu
BellTPO doesn’t provide data. They are 3rd party Market Profile and Orderflow providers for Ninjatrader software. Imbalance is covered in NT8 platform (orderflow)
I am interested in Order Flow Analysis only.
Hi Rajendran,
Any inputs on where i can source historic tick data with ask/bid spread for indian markets [Something similar to current tick data provided by zerodha kite api]
Cheers,
Prakash
First of all thanks,sir IAM interested in level 2 screen like us market.but this type of data not available in india.but I want volume at Price in each candle or certain selected area .is it any one way method available??. please help me
Hi Admin i am getting warning 505, Error 10. Array subscript out of range.
you must not access array elements outside 0..(BarCount-1) range. You attempted to access non-existing 3rd element of array. please help in correcting it.
Dear Rajendran ji,
Your work is really very helpful. Can you please edit the code so as to make a Weekly Composite Profile and a Monthly Composite Profile.
That would be really helpful.
For mt4 , any MP indicators is there?
Hi i am getting error please could you help
Makr sure you are using Amibroker 5.8 or above
can u update this info please. i believe market delta has closed. TY!