Как связать номер бара и его координаты в пикселях?
При использовании низкоуровневых графических функций 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
См. также:
