NOTE: This article describes old method of using bar\/value coordinates. New code should use GfxSetCoordsMode<\/a> which allows you to use bar\/value without any extra calculations.<\/font><\/p>
Sometimes when using low-level graphics functions<\/a> it is needed to convert from bar number to pixel X co-ordinate and from price level to pixel Y co-ordinate. Converting between them needs knowing visible bar range, Y-axis value range and pixel dimensions of drawing area. Once these params are known it is just a matter of performing simple scale transformation. The code example below shows how to do that.<\/p><\/span>function <\/span>GetVisibleBarCount<\/span>()
{
<\/span>lvb <\/span>= <\/span>Status<\/span>(<\/span>"lastvisiblebar"<\/span>);
<\/span>fvb <\/span>= <\/span>Status<\/span>(<\/span>"firstvisiblebar"<\/span>);
return <\/span>Min<\/span>( <\/span>Lvb <\/span>- <\/span>fvb<\/span>, <\/span>BarCount <\/span>- <\/span>fvb <\/span>);
}
function <\/span>GfxConvertBarToPixelX<\/span>( <\/span>bar <\/span>)
{
<\/span>lvb <\/span>= <\/span>Status<\/span>(<\/span>"lastvisiblebar"<\/span>);
<\/span>fvb <\/span>= <\/span>Status<\/span>(<\/span>"firstvisiblebar"<\/span>);
<\/span>pxchartleft <\/span>= <\/span>Status<\/span>(<\/span>"pxchartleft"<\/span>);
<\/span>pxchartwidth <\/span>= <\/span>Status<\/span>(<\/span>"pxchartwidth"<\/span>);
return <\/span>pxchartleft <\/span>+ <\/span>bar <\/span>* <\/span>pxchartwidth <\/span>\/ ( <\/span>Lvb <\/span>- <\/span>fvb <\/span>+ <\/span>1 <\/span>);
}
function <\/span>GfxConvertValueToPixelY<\/span>( <\/span>Value <\/span>)
{
<\/span>local Miny<\/span>, <\/span>Maxy<\/span>, <\/span>pxchartbottom<\/span>, <\/span>pxchartheight<\/span>;
<\/span>Miny <\/span>= <\/span>Status<\/span>(<\/span>"axisminy"<\/span>);
<\/span>Maxy <\/span>= <\/span>Status<\/span>(<\/span>"axismaxy"<\/span>);
<\/span>pxchartbottom <\/span>= <\/span>Status<\/span>(<\/span>"pxchartbottom"<\/span>);
<\/span>pxchartheight <\/span>= <\/span>Status<\/span>(<\/span>"pxchartheight"<\/span>);
return <\/span>pxchartbottom <\/span>- <\/span>floor<\/span>( <\/span>0.5 <\/span>+ ( <\/span>Value <\/span>- <\/span>Miny <\/span>) * <\/span>pxchartheight<\/span>\/ ( <\/span>Maxy <\/span>- <\/span>Miny <\/span>) );
}
<\/span>Plot<\/span>(<\/span>C<\/span>, <\/span>"Price"<\/span>, <\/span>colorBlack<\/span>, <\/span>styleHistogram <\/span>);
<\/span>GfxSetOverlayMode<\/span>(<\/span>0<\/span>);
<\/span>GfxSelectSolidBrush<\/span>( <\/span>colorRed <\/span>);
<\/span>GfxSelectPen<\/span>( <\/span>colorRed <\/span>);
<\/span>AllVisibleBars <\/span>= <\/span>GetVisibleBarCount<\/span>();
<\/span>fvb <\/span>= <\/span>Status<\/span>(<\/span>"firstvisiblebar"<\/span>);
for( <\/span>i <\/span>= <\/span>0<\/span>; <\/span>i <\/span>< <\/span>AllVisibleBars <\/span>; <\/span>i<\/span>++ )
{
<\/span>x <\/span>= <\/span>GfxConvertBarToPixelX<\/span>( <\/span>i <\/span>);
<\/span>y <\/span>= <\/span>GfxConvertValueToPixelY<\/span>( <\/span>C<\/span>[ <\/span>i <\/span>+ <\/span>fvb <\/span>] );
<\/span>GfxRectangle<\/span>( <\/span>x<\/span>-<\/span>1<\/span>, <\/span>y<\/span>-<\/span>1<\/span>, <\/span>x <\/span>+ <\/span>2<\/span>, <\/span>y<\/span>+<\/span>1 <\/span>);
}
<\/span>RequestTimedRefresh<\/span>(<\/span>1<\/span>); <\/span>\/\/ ensure 1 sec refres<\/code>