Как связать номер бара и его координаты в пикселях?

Опубликовано в AmiBroker

При использовании низкоуровневых графических функций Amibroker'a иногда возникает надобность получить из номера бара его координаты на графике в пикселях.

Такое необходимо, если требуется нарисовать на графике что-то нестандартное, готовых средств для чего Амиброкер не предоставляет. Преобразование подразумевает нахождение бара внутри отображаемого диапазона. Необходимо также узнать шкалу по Y оси и пиксельные размеры области рисования. Ниже привожу пример от Tomasz Janeczko (автор Amibroker), который иллюстрирует подход к решению подобного рода задач:

function GetVisibleBarCount()
{ 
lvb = Status("lastvisiblebar");
fvb = Status("firstvisiblebar");return Min( Lvb - fvb, BarCount - fvb );
} function GfxConvertBarToPixelX( bar )
{
lvb = Status("lastvisiblebar");
fvb = Status("firstvisiblebar");
pxchartleft = Status("pxchartleft");
pxchartwidth = Status("pxchartwidth"); return pxchartleft + bar * pxchartwidth / ( Lvb - fvb + 1 );
} function GfxConvertValueToPixelY( Value )
{
local Miny, Maxy, pxchartbottom, pxchartheight; Miny = Status("axisminy");
Maxy = Status("axismaxy"); pxchartbottom = Status("pxchartbottom");
pxchartheight = Status("pxchartheight"); return pxchartbottom - floor( 0.5 + ( Value - Miny ) * pxchartheight/ ( Maxy - Miny ) );
} Plot(C, "Price", colorBlack, styleHistogram ); GfxSetOverlayMode(0);
GfxSelectSolidBrush( colorRed );
GfxSelectPen( colorRed ); AllVisibleBars = GetVisibleBarCount();
fvb = Status("firstvisiblebar"); for( i = 0; i < AllVisibleBars ; i++ )
{
x = GfxConvertBarToPixelX( i );
y = GfxConvertValueToPixelY( C[ i + fvb ] ); GfxRectangle( x-1, y-1, x + 2, y+1 );
} RequestTimedRefresh(1); // ensure 1 sec refresh

См. также:

Недостаточно прав для комментирования