Автор |
Сообщение |
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Всем привет и всем профита!
Никак не сдаюсь, хочу треугольник на последнем баре графика. )
Вот нарыл подобный пример у Томаша.
http://www.amibroker.com/kb/2009/03/30/how-to-convert-from-bar-value-to-pixel-co-ordinates/
Но он здесь находит координаты всех Close в видимой области графика и вешает туда красные точки для обозначения результатов, а мне нужен только один треугольник (рисую полигоном) на последней цене.
Убрал цикл, добавил полигон, получилось
Код: |
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 ) );
}
GfxSetOverlayMode(0);
GfxSelectSolidBrush( colorRed );
AllVisibleBars = GetVisibleBarCount();
fvb = Status("firstvisiblebar");
i = AllVisibleBars-1;
x = LastValue(GfxConvertBarToPixelX( i ))+30;
y = LastValue(GfxConvertValueToPixelY( C[ i + fvb ] ));
Plot(Close, "Close", colorBlack, styleBar);
GfxPolygon(x, y, x+20, y-10, x+20, y+10);
RequestTimedRefresh(1); // ensure 1 sec refresh
|
Чтобы видеть треугольник, в настройках нужно выставить пустую область справа, пяток баров.
Дальше упростить код не могу, там целая куча непонятных мне функций. (
Помогите пожалуйста упростить насколько возможно! Цель, повторю, всего один треугольник на последней цене (не в видимой области, а всего графика!) |
Последний раз редактировалось: GREEN_X5 (Пт Май 16, 2014 11:44 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
На первый взгляд там все хорошо и ничего не сократить.
Можно использовать новые возможности функции status(). Типа "pxheight". Но это не принципиально. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
А как думаешь, там нет лишних наворотов именно для работы с видимой областью графика? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Нет. Надо найти координаты последнего бара. Они зависят от масштабирования графика. А он в свою очередь зависит от того, какая часть графика видна. Поэтому в любом случае придется обрабатывать всю видимую часть. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Ага, начинаю понимать алгоритм, спасибо.
Там сейчас есть одно неудобство - если прокручиваем график назад, стрелка остаётся в поле зрения, указывая на последнюю видимую цену.
Не мог бы ты помочь - ввинтить туда "показывать только если видимый бар = последний".
Или вдруг время найдешь - всё это без функций переписать, степ-бай-степ? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В общем это не сложно.
Смотришь status("lastvisiblebar") и если он меньше BarCount то не рисуешь свой треугольник.
Попробуй сам. Если не получится - пиши. Вечером сделаю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Спасибо, с этим я справился ))
Код: |
if (Status("lastvisiblebar")>BarCount)
GfxPolygon(x, y, x+20, y-10, x+20, y+10); |
Посмотришь вечером как эту кашу без функций написать? ) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Посидел пару часов, поковырялся... Упростил до неприличного безобразия! )))
Код: |
GfxSetOverlayMode(0);
GfxSelectSolidBrush( colorRed );
Miny = Status("axisminy");
Maxy = Status("axismaxy");
x= LastValue(Status("pxchartwidth")-15);
y= LastValue(Status("pxchartbottom")-floor(0.5+(LastValue(C)-Miny)*Status("pxchartheight")/(Maxy-Miny )));
Plot(Close, "Close", colorBlack, styleBar);
if (Status("lastvisiblebar")>BarCount) GfxPolygon(x, y, x+20, y-10, x+20, y+10);
RequestTimedRefresh(1); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Впрочем, вот так правильнее.
Код: |
GfxSetOverlayMode(0);
GfxSelectSolidBrush( colorRed );
Miny = Status("axisminy");
Maxy = Status("axismaxy");
lvb = Status("lastvisiblebar");
fvb = Status("firstvisiblebar");
pxchartleft = Status("pxchartleft");
pxchartwidth = Status("pxchartwidth");
bar = Min( Lvb - fvb, BarCount - fvb );
x= pxchartleft + bar * pxchartwidth / ( Lvb - fvb + 1 );
y= LastValue(Status("pxchartbottom")-floor(0.5+(LastValue(C)-Miny)*Status("pxchartheight")/(Maxy-Miny )));
Plot(Close, "Close", colorBlack, styleBar);
if (Status("lastvisiblebar")>BarCount)
GfxPolygon(x, y, x+20, y-10, x+20, y+10);
RequestTimedRefresh(1); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
fujis84
Зарегистрирован: 07.01.2014
Сообщения: 56
|
Код: |
// edited by fuji
lvb = Status( "lastvisiblebar" );
fvb = Status( "firstvisiblebar" );
Miny = Status( "axisminy" );
Maxy = Status( "axismaxy" );
pxchartleft = Status( "pxchartleft" );
pxchartwidth = Status( "pxchartwidth" );
pxchartbottom = Status( "pxchartbottom" );
pxchartheight = Status( "pxchartheight" );
function GfxConvertBarToPixelX( bar )
{
return Nz( pxchartleft + ( bar - fvb ) * pxchartwidth / ( lvb - fvb + 1 ) );
}
function GfxConvertValueToPixelY( Value )
{
return Nz( pxchartbottom - floor( 0.5 + ( Value - Miny ) * pxchartheight / ( Maxy - Miny ) ) );
}
GfxSetOverlayMode( 0 );
GfxSelectSolidBrush( colorRed );
bi = LastValue( BarIndex() );
Close_ = LastValue( C );
x = Min( pxchartwidth - 16, LastValue( GfxConvertBarToPixelX( bi ) ) + 30 );
y = LastValue( GfxConvertValueToPixelY( Close_ ) );
Plot( Close, "Close", colorBlack, styleBar );
GfxSetOverlayMode( 1 );
GfxPolygon( x, Min( y, pxchartbottom), x + 20, Min( y - 10, pxchartbottom), x + 20, Min( y + 10, pxchartbottom ) );
RequestTimedRefresh( 1 ); // ensure 1 sec refresh |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
fujis84
Зарегистрирован: 07.01.2014
Сообщения: 56
|
Код: |
// edited by fuji
lvb = Status( "lastvisiblebar" );
fvb = Status( "firstvisiblebar" );
Miny = Status( "axisminy" );
Maxy = Status( "axismaxy" );
pxchartleft = Status( "pxchartleft" );
pxchartwidth = Status( "pxchartwidth" );
pxchartbottom = Status( "pxchartbottom" );
pxchartheight = Status( "pxchartheight" );
function GfxConvertBarToPixelX( bar )
{
return Nz( pxchartleft + ( bar - fvb ) * pxchartwidth / ( lvb - fvb + 1 ) );
}
function GfxConvertValueToPixelY( Value )
{
return Nz( pxchartbottom - floor( 0.5 + ( Value - Miny ) * pxchartheight / ( Maxy - Miny ) ) );
}
GfxSetOverlayMode( 0 );
GfxSelectSolidBrush( colorRed );
bi = LastValue( BarIndex() );
Close_ = LastValue( C );
x = LastValue( GfxConvertBarToPixelX( bi ) ) + 30;
y = LastValue( GfxConvertValueToPixelY( Close_ ) );
Plot( Close, "Close", colorBlack, styleBar );
GfxSetOverlayMode( 1 );
x1 = Min( pxchartwidth+5, x);
x2 = Min( pxchartwidth+5, x + 20);
x3 = x2;
y1 = Min( y, pxchartbottom);
y2 = Min( y - 10, pxchartbottom);
y3 = Min( y + 10, pxchartbottom );
GfxPolygon( x1, y1, x2, y2, x3, y3 );
RequestTimedRefresh( 1 ); // ensure 1 sec refresh |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
Aleksandr
Зарегистрирован: 13.11.2011
Сообщения: 99
|
fujis84 писал(а): |
Код: |
// edited by fuji
lvb = Status( "lastvisiblebar" );
fvb = Status( "firstvisiblebar" );
Miny = Status( "axisminy" );
Maxy = Status( "axismaxy" );
pxchartleft = Status( "pxchartleft" );
pxchartwidth = Status( "pxchartwidth" );
pxchartbottom = Status( "pxchartbottom" );
pxchartheight = Status( "pxchartheight" );
function GfxConvertBarToPixelX( bar )
{
return Nz( pxchartleft + ( bar - fvb ) * pxchartwidth / ( lvb - fvb + 1 ) );
}
function GfxConvertValueToPixelY( Value )
{
return Nz( pxchartbottom - floor( 0.5 + ( Value - Miny ) * pxchartheight / ( Maxy - Miny ) ) );
}
GfxSetOverlayMode( 0 );
GfxSelectSolidBrush( colorRed );
bi = LastValue( BarIndex() );
Close_ = LastValue( C );
x = LastValue( GfxConvertBarToPixelX( bi ) ) + 30;
y = LastValue( GfxConvertValueToPixelY( Close_ ) );
Plot( Close, "Close", colorBlack, styleBar );
GfxSetOverlayMode( 1 );
x1 = Min( pxchartwidth+5, x);
x2 = Min( pxchartwidth+5, x + 20);
x3 = x2;
y1 = Min( y, pxchartbottom);
y2 = Min( y - 10, pxchartbottom);
y3 = Min( y + 10, pxchartbottom );
GfxPolygon( x1, y1, x2, y2, x3, y3 );
RequestTimedRefresh( 1 ); // ensure 1 sec refresh |
|
У свечи четыре цены . Пока не удаётся прописать координаты одной из них ? Для того чтобы вычерчивались между свечами линии . |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вопрос не понял. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Aleksandr
Зарегистрирован: 13.11.2011
Сообщения: 99
|
000 писал(а): |
Вопрос не понял. |
Например , Есть цена High на вчерашней сессии ( за всю сессию ) и пусть будет high на любой минутной свечи настоящей сессии эти Хаи нужно соединить линией , вот и всё .
А этот код нашёл на сайте Ami . Здесь линия идёт в живую так как привязана к Close . \\ где то что то рядом
inputArray = Close;
Plot( inputArray, "input", colorDefault, styleDots );
bi = BarIndex();
lvbi = LastValue( bi );
x0 = lvbi - 50;
x1 = lvbi;
y0 = inputArray[ lvbi - 50 ];
y1 = inputArray[ lvbi ];
Plot( LineArray( x0, y0, x1, y1, True , True ), "line", colorRed, styleThick ); |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Прежде чем сделать надо уточнить. Т.е. задача в том, чтобы найти минутную свечку на которой был дневной хай? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|