Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Помогите упростить поиск координат цены на графике Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
GREEN_X5



Зарегистрирован: 13.04.2012
Сообщения: 136

СообщениеДобавлено: Пт Май 16, 2014 9:54 am Ответить с цитатой Вернуться к началу

Всем привет и всем профита!

Никак не сдаюсь, хочу треугольник на последнем баре графика. )
Вот нарыл подобный пример у Томаша.
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

СообщениеДобавлено: Пт Май 16, 2014 11:05 am Ответить с цитатой Вернуться к началу

На первый взгляд там все хорошо и ничего не сократить.
Можно использовать новые возможности функции status(). Типа "pxheight". Но это не принципиально.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
GREEN_X5



Зарегистрирован: 13.04.2012
Сообщения: 136

СообщениеДобавлено: Пт Май 16, 2014 11:42 am Ответить с цитатой Вернуться к началу

А как думаешь, там нет лишних наворотов именно для работы с видимой областью графика?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Май 16, 2014 11:56 am Ответить с цитатой Вернуться к началу

Нет. Надо найти координаты последнего бара. Они зависят от масштабирования графика. А он в свою очередь зависит от того, какая часть графика видна. Поэтому в любом случае придется обрабатывать всю видимую часть.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
GREEN_X5



Зарегистрирован: 13.04.2012
Сообщения: 136

СообщениеДобавлено: Пт Май 16, 2014 12:11 pm Ответить с цитатой Вернуться к началу

Ага, начинаю понимать алгоритм, спасибо.
Там сейчас есть одно неудобство - если прокручиваем график назад, стрелка остаётся в поле зрения, указывая на последнюю видимую цену.
Не мог бы ты помочь - ввинтить туда "показывать только если видимый бар = последний".
Или вдруг время найдешь - всё это без функций переписать, степ-бай-степ? Smile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Май 16, 2014 1:17 pm Ответить с цитатой Вернуться к началу

В общем это не сложно.
Смотришь status("lastvisiblebar") и если он меньше BarCount то не рисуешь свой треугольник.
Попробуй сам. Если не получится - пиши. Вечером сделаю.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
GREEN_X5



Зарегистрирован: 13.04.2012
Сообщения: 136

СообщениеДобавлено: Пт Май 16, 2014 2:26 pm Ответить с цитатой Вернуться к началу

Спасибо, с этим я справился ))

Код:
if (Status("lastvisiblebar")>BarCount)
GfxPolygon(x, y, x+20, y-10, x+20, y+10);


Посмотришь вечером как эту кашу без функций написать? )
Посмотреть профиль Отправить личное сообщение
GREEN_X5



Зарегистрирован: 13.04.2012
Сообщения: 136

СообщениеДобавлено: Пт Май 16, 2014 10:19 pm Ответить с цитатой Вернуться к началу

Посидел пару часов, поковырялся... Упростил до неприличного безобразия! )))

Код:
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

СообщениеДобавлено: Пт Май 16, 2014 11:03 pm Ответить с цитатой Вернуться к началу

Впрочем, вот так правильнее.

Код:
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

СообщениеДобавлено: Сб Май 17, 2014 2:25 pm Ответить с цитатой Вернуться к началу

Код:
// 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

СообщениеДобавлено: Сб Май 17, 2014 3:12 pm Ответить с цитатой Вернуться к началу

Код:
// 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

СообщениеДобавлено: Ср Мар 02, 2016 6:06 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Ср Мар 02, 2016 11:32 pm Ответить с цитатой Вернуться к началу

Вопрос не понял.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Aleksandr



Зарегистрирован: 13.11.2011
Сообщения: 99

СообщениеДобавлено: Чт Мар 03, 2016 5:07 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Чт Мар 03, 2016 8:40 am Ответить с цитатой Вернуться к началу

Прежде чем сделать надо уточнить. Т.е. задача в том, чтобы найти минутную свечку на которой был дневной хай?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen