// Downloaded From https://www.WiseStockTrader.com _SECTION_BEGIN( "MPLite" ); // - there was a plot limit call introduced after 5.41.0 beta // i.e. "•Warning 502: Calling Plot()/PlotOHLC over 500 times is displayed in indicator in runtime to prevent abuse" // - uses GFX for major calls of plot only if AB version newer than 5.40 - this only delays reaching the plot limit // http://www.***********.com/amibroker/2961-market-profile-amibroker-new-13.html Version (5.80); PS_SOLID=0; PS_DASH=1; PS_DOT=2; PS_DASHDOT=3; PS_DASHDOTDOT=4; PS_NULL=5; PS_INSIDEFRAME=6; function Lastthursday() { Daysinmonth= IIf(Month()==2, IIf(Year()%4==0 AND Year()%100!=0,29,28), IIf(Month()==4 OR Month()==6 OR Month()==9 OR Month()==11,30,31)); return IIf(Daysinmonth-Day()<7 AND DayOfWeek()==4,1, IIf(Daysinmonth-Day()<8 AND DayOfWeek()==3 AND Ref(DayOfWeek(),1)!=4 AND Day()!=Daysinmonth,1,0)); } procedure GfxPlotLine( ix0, iy0, ix1, iy1, iColor, iWidth, iStyle) { GfxSetBkMode(1); GfxSelectPen( iColor, iWidth, iStyle ); GfxMoveTo( ix0, iy0 ); GfxLineTo( ix1, iy1 ); } PlotOHLC( O, H, L, C, "Price", IIf( C > O, colorGreen, colorRed ), styleCandle ); FirstVisibleBar = Status( "FirstVisibleBar" ); Lastvisiblebar = Status( "LastVisibleBar" ); totalVisible = Lastvisiblebar - FirstVisibleBar; //Den = Param("Density", 1, 0.1, 10, 0.1); percent = Param( "Value Area", 70, 1, 100, 1 ); Type = ParamList( "Type", "Price Profile|Volume Profile" ); Period = ParamList( "Base", "Hourly|Daily|Weekly|Monthly|Lastthursday|Yearly", 1 ); x_scale = Param( "Horizontal_scale", 2, 0, 10, 0.1 ); EnMP2 = ParamStyle( "Style", styleLine | styleNoLabel, maskAll ); EnIB = ParamToggle( "Show Initial Balance", "No|Yes", 0 ); IBBars = Param( "Initial Balance Bars", 2, 1, 10, 1 ); ViewYvalues = ParamToggle( "Show Yesterdays Values", "No|Yes", 1 ); ViewVlines = ParamToggle( "Show Vertical Base Lines", "No|Yes", 1 ); Viewvalues = ParamToggle( "Show Values", "No|Yes", 0 ); ViewVpoc = ParamToggle( "Show Virgin POC", "No|Yes", 1 ); ViewTPO = ParamToggle( "Show TPO Count", "No|Yes", 0 ); Color_Above_VA = ParamColor( "Color_Above_VA", colorGrey40 ); Color_VA = ParamColor( "Color_VA", colorBlueGrey ); Color_Below_VA = ParamColor( "Color_Below_VA", colorGrey40 ); Color_POC_line = ParamColor( "Color_POC_Line", colorYellow ); color_YVAH = ParamColor( "YVAH", colorWhite ); color_YVAL = ParamColor( "YVAL", colorWhite ); color_YPOC = ParamColor( "YPOC", colorYellow ); IBColor = ParamColor( "IB Color", colorWhite ); IBstyle = ParamStyle( "IB style", styleLine, maskAll ); Color_Virgin_POC = ParamColor( "Virgin Poc Color", colorYellow ); Color_Base_Line = ParamColor( "Base Line Color", colorDarkGrey ); switch (Period) { case "Yearly": BarsInDay = BarsSince(Year() != Ref(Year(), -1)); tf = inMonthly; break; case "Monthly": BarsInDay = BarsSince(Month() != Ref(Month(), -1)); tf = inMonthly; break; case "Weekly": BarsInDay = BarsSince(DayOfWeek() < Ref( DayOfWeek(), -1 )); tf = inWeekly; break; case "Hourly": BarsInDay = BarsSince(Hour() != Ref(Hour(), -1)); tf = inHourly; break; case "Daily": BarsInDay = BarsSince(Day() != Ref(Day(), -1)); tf = inDaily; break; } if(Period=="Lastthursday" ) { BarsInDay = BarsSince(Lastthursday()==0 AND Ref(Lastthursday(), -1)==1); bot1=ValueWhen(BarsInDay==0,L); Bot2 = ValueWhen(Ref(BarsInDay)==1 OR BarIndex()>BarCount-2 ,LLV(L,BarsInDay),0); bot=Min(bot1,bot2); top1=ValueWhen(BarsInDay==0,H); Top2 =ValueWhen(Ref(BarsInDay,1)==1 OR BarIndex()>BarCount-2,HHV(H,BarsInDay),0); top=Max(top1,top2); Vol = ValueWhen(Ref(BarsInDay,1)==1 OR BarIndex()>BarCount-2 ,Sum(V,BarsInDay),0); } else { Bot = TimeFrameGetPrice("L", tf, 0); Top = TimeFrameGetPrice("H", tf, 0); Vol = TimeFrameGetPrice("V", tf, 0); } CurTop = HHV( H, BarsInDay + 1 ); Curbot = LLV( L, BarsInDay + 1 ); Range = Top - Bot; coverage = LastValue( Ref( ATR( 10 ), -1 ) ); den = ( coverage / 10 ); //den=1; multiplier = IIf( round( totalVisible ) / 300 < 1, 1, round( totalVisible ) / 300 ); if ( ViewVlines) Plot( BarsInDay == 0, "", Color_Base_Line, styleHistogram | styleOwnScale | styleLine | styleNoLabel ); relTodayRange = 0; x = 0; basey = 0; basex = 0; newday = 0; total = 0; shiftup = 0; shiftdn = 0; //Line = Null; Voloumeunit = 0; GfxSetOverlayMode( 1 ); GfxSetCoordsMode( 1 ); // bar/price mode (instead of pixel) for ( i = IIf( FirstVisibleBar - 100 > 1, FirstVisibleBar - 100, FirstVisibleBar ); i < Lastvisiblebar AND i < BarCount - 1 ; i++ ) { if ( BarsInDay[i] == 0 ) { t = BarsInDay[i-1]; if ( EnIB ) { IBH = HHV( H, IBBars ); IBL = LLV( L, IBBars ); /* Line1 = LineArray( basex, IBH[basex+IBBars-1], i, IBH[basex+IBBars-1] ); Plot( Line1, "", IBColor, IBstyle ); Line2 = LineArray( basex, IBL[basex+IBBars-1], i, IBL[basex+IBBars-1] ); Plot( Line2, "", IBcolor, IBstyle ); */ GfxPlotLine(basex, hY=IBH[basex+IBBars-1], i, hY, IBColor, 1, PS_SOLID); GfxPlotLine(basex, hY=IBL[basex+IBBars-1], i, hY, IBColor, 1, PS_SOLID); } ////////////////////////////////// poc = 0; pocj = 0; midrange = int( relTodayRange / 2 ) + 1; for ( j = 1; j <= relTodayRange + 1 ; j++ ) { if ( poc < x[j] ) { poc = x[j]; pocj = j; } else if ( poc == x[j] ) { if ( abs( midrange - j ) < abs( midrange - pocj ) ) { poc = x[j]; pocj = 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 ( pocj - a > 0 AND pocj + a < relTodayRange ) { if ( poc + total[pocj+a] - total[pocj] + ( total[pocj] - poc ) - total[pocj-( a+1 )] >= Value_area ) { shiftup = shiftdn = a; break; } } else if ( pocj - a < 1 ) { if ( poc + total[pocj+a] - total[pocj] + ( total[pocj] - poc ) >= Value_area ) { shiftup = a; shiftdn = pocj; break; } } else if ( pocj + a > relTodayRange ) { if ( poc + total[relTodayRange] - total[pocj] + ( total[pocj] - poc ) - total[pocj-( a+1 )] >= Value_area ) { shiftup = floor( relTodayRange ) - pocj; shiftdn = a + 1; break; } } } //Vah = LineArray( baseX[i], baseY + ( pocj + shiftup ) * den, i, baseY + ( pocj + shiftup ) * den ); //Val = LineArray( baseX[i], baseY + ( pocj - shiftdn ) * den, i, baseY + ( pocj - shiftdn ) * den ); //pocline = LineArray( basex, basey + pocj * den, basex[i] + poc, basey + pocj * den ); if ( ViewVpoc) { Virginpoc = basey + pocj * den; newi = Null; for ( j = i; j <= ( BarCount - 1 ) ; j++ ) if ( L[j] < Virginpoc AND H[j] > Virginpoc ) { newi = j; break; } else newi = BarCount; Plot( LineArray( basex[i], hY=basey + pocj*den, newi, hY), "", Color_Virgin_POC, styleNoRescale ); } if ( ViewYvalues) { //Vahn = LineArray( i, baseY + ( pocj + shiftup ) * den, i + t, baseY + ( pocj + shiftup ) * den ); //pocn = LineArray( i, baseY + ( pocj ) * den, i + t, baseY + ( pocj ) * den ); //Valn = LineArray( i, baseY + ( pocj - shiftdn ) * den, i + t, baseY + ( pocj - shiftdn ) * den ); GfxPlotLine( i, baseY + ( pocj + shiftup ) * den, i + t, baseY + ( pocj + shiftup ) * den, color_YVAH, 0, PS_DOT); GfxPlotLine( i, baseY + ( pocj ) * den, i + t, baseY + ( pocj ) * den, color_YPOC, 0, PS_DOT); GfxPlotLine(i, baseY + ( pocj - shiftdn ) * den, i + t, baseY + ( pocj - shiftdn ) * den, color_YVAL, 0, PS_DOT); //Plot( Vahn, "", color_YVAH, styleDashed | styleNoRescale ); //Plot( Valn, "", color_YVAL, styleDashed | styleNoRescale ); //Plot( pocn, "", color_YPOC, styleDashed | styleNoRescale ); } if ( ViewTPO ) { nnn = HHV( H, BarsInDay ); PlotText( "" + ( total[relTodayRange] - total[pocj] ), basex[i], nnn[i], colorLightGrey ); PlotText( "" + ( total[pocj-1] ), basex[i], basey - den, colorLightGrey ); } if ( Viewvalues) { PlotText( "" + ( ( basey + pocj*den ) ), baseX[i], basey + pocj*den, colorWhite, colorDarkGrey ); PlotText( "" + ( ( baseY + ( pocj + shiftup )*den ) ), baseX[i], baseY + ( pocj + shiftup )*den, colorWhite, colorDarkGrey ); PlotText( "" + ( ( baseY + ( pocj - shiftdn )*den ) ), baseX[i], baseY + ( pocj - shiftdn )*den, colorWhite, colorDarkGrey ); } //-- Plot Market Profile for ( p = 0; p <= relTodayRange + 1; p = p + multiplier ) { GfxPlotLine( baseX, hY=baseY + p * Den, baseX + x[p], hY, IIf( p > ( pocj + shiftup ), Color_Above_VA, IIf( p <= ( pocj + shiftup ) AND p >= ( pocj - shiftdn ), Color_VA, Color_Below_VA )), 1, PS_SOLID); } //-- Plot PoC GfxPlotLine( baseX, hY = basey + pocj * den, basex[i] + poc, hY, Color_POC_Line, 1, PS_SOLID); /////////////////// basex = 0; x = 0; Basex = i; baseY = Bot[i]; relTodayRange = Range[i] / Den; Voloumeunit = Vol[i] / LastValue( BarsInDay ); } for ( j = 0; j <= relTodayRange ; j++ ) { if ( L[i] <= Bot[i] + j*Den AND H[i] >= Bot[i] + j*Den ) { if ( Type == "Price Profile" ) { x[j] += x_scale; } else if ( Type == "Volume Profile" ) { x[j] += round( V[i] / Voloumeunit ) + 1; } } } } if ( EnIB ) { IBH = HHV( H, IBBars ); IBL = LLV( L, IBBars ); Line1 = LineArray( basex, IBH[basex+IBBars-1], i, IBH[basex+IBBars-1] ); Plot( Line1, "", IBColor, IBstyle ); Line2 = LineArray( basex, IBL[basex+IBBars-1], i, IBL[basex+IBBars-1] ); Plot( Line2, "", IBColor, IBstyle ); } ////////////////////////////////// poc = 0; pocj = 0; midrange = int( relTodayRange / 2 ) + 1; for ( j = 1; j <= relTodayRange + 1 ; j++ ) { if ( poc < x[j] ) { poc = x[j]; pocj = j; } else if ( poc == x[j] ) { if ( abs( midrange - j ) < abs( midrange - pocj ) ) { poc = x[j]; pocj = 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 ( pocj - a > 0 AND pocj + a < relTodayRange ) { if ( poc + total[pocj+a] - total[pocj] + ( total[pocj] - poc ) - total[pocj-( a+1 )] >= Value_area ) { shiftup = shiftdn = a; break; } } else if ( pocj - a < 1 ) { if ( poc + total[pocj+a] - total[pocj] + ( total[pocj] - poc ) >= Value_area ) { shiftup = a; shiftdn = pocj; break; } } else if ( pocj + a > relTodayRange ) { if ( poc + total[relTodayRange] - total[pocj] + ( total[pocj] - poc ) - total[pocj-( a+1 )] >= Value_area ) { shiftup = floor( relTodayRange ) - pocj; shiftdn = a + 1; break; } } } Vah = LineArray( baseX[i], baseY + ( pocj + shiftup ) * den, i, baseY + ( pocj + shiftup ) * den ); Val = LineArray( baseX[i], baseY + ( pocj - shiftdn ) * den, i, baseY + ( pocj - shiftdn ) * den ); pocline = LineArray( basex, basey + pocj * den, basex[i] + poc, basey + pocj * den ); if ( ViewTPO) { PlotText( "" + ( total[relTodayRange] - total[pocj] ), basex[i], top[i], colorLightGrey ); PlotText( "" + ( total[pocj-1] + x_scale ), basex[i], basey - den, colorLightGrey ); } if ( Viewvalues ) { PlotText( "" + ( ( basey + pocj*den ) ), baseX[i], basey + pocj*den, colorWhite, colorDarkGrey ); PlotText( "" + ( ( baseY + ( pocj + shiftup )*den ) ), baseX[i], baseY + ( pocj + shiftup )*den, colorWhite, colorDarkGrey ); PlotText( "" + ( ( baseY + ( pocj - shiftdn )*den ) ), baseX[i], baseY + ( pocj - shiftdn )*den, colorWhite, colorDarkGrey ); } for ( p = 0; p <= relTodayRange + 1; p = p + multiplier ) { GfxPlotLine( baseX, hY=baseY + p * Den, baseX + x[p], hY, IIf( p > ( pocj + shiftup ), Color_Above_VA, IIf( p <= ( pocj + shiftup ) AND p >= ( pocj - shiftdn ), Color_VA, Color_Below_VA )), 1, PS_SOLID); } Plot( pocline, "", Color_POC_Line, styleNoRescale | styleNoLabel ); _SECTION_END();