Всплывающие подсказки на графике Amibroker

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

Как добавить Tooltips в программы на Amibroker.Tooltip а Amibroker

 

Если Вы пишете механические торговые системы в AmiBroker только для себя, этот материал вряд ли будет Вам полезен, кроме как в качестве забавного чтива перед сном. В ином случае, если Вы пишете на заказ (как я), оказывается, что вместо написания объёмной документации либо ответов на бесчисленное количество писем, оказывается проще задокументировать саму программу. Если робот, написаный в Amibroker, имеет пользовательский интерфейс (например, кнопки), то самым простым и весьма действенным способом дать ответы на самые часто возникающие вопросы пользователей могут всплывающие подсказки (tooltips).

В случае если tooltips в Вашей программе задействованы, то при наведении мышкой на кнопку (или на любой иной определённый район графика) появится всплывающая подсказка с информацией об интересующем пользователя месте графика.

Внутри подсказок может размещаться текст, графика, табличные данные, меню, предупреждения и т.д., границы очень широки. Конечно, можно изменять размер подказки, цвета, шрифты, формы и т.д. в соответствии с Вашими надобностями, в том числе и динамически (например, большой график - большие буквы, маленький - буквы меньше).

Подсказки могут отображаться в режиме реального времени. Например, можно вывести текущее время и цену инструмента на момент вызова подсказки.

Также можно размещать дополнительную информацию о графиках. Например, при наведении мышкой на метку сделки, можно запрограммировать появление подсказки с расширенной информацией о сделке. Если это не расчетная сделка, а реальная, например, полученная в результате работы механической торговой системы, написанной на Ambroker-AmiSharp-QUIK, то в качестве дополнительной информации можно вывести точное время, номер ордера, таблицу порождённых ордером сделок, среднюю себестоимость и так далее.

Вот код на языке AFL, демонстрирующий методику создания всплывающих подсказок:

 


function ShowTip( TipColor, TipOutlineColor, TipTextColor )
{
global MX, MY, PxWidth, PxHeight, TipWidth, TipHeight, TipsOn, TipFontName, TipFontSize;
TipMsg = VarGetText( "TipMsg" );

if ( TipsOn AND TipMsg != "" )
{
Quadrant = ( MX < pxwidth / 2 ) + ( MY < pxheight / 2 ) * 2;
D = 30;          // Rounding Diameter

switch ( Quadrant )
{

case 3:
X1 = MX;
Y1 = MY + D * 0.75;
X2 = MX + TipWidth;
Y2 = MY + TipHeight + D * 0.75;
X3 = MX + D * 0.75;
Y3 = Y1;
X4 = MX + D * 2;
Y4 = Y1;
X5 = MX;
Y5 = MY;
break;

case 2:
X1 = MX - TipWidth;
Y1 = MY + D * 0.75;
X2 = MX;
Y2 = MY + TipHeight + D * 0.75;
X3 = MX - D * 0.75;
Y3 = Y1;
X4 = MX - D * 2;
Y4 = Y1;
X5 = MX;
Y5 = MY;
break;

case 1:
X1 = MX;
Y1 = MY - TipHeight - D * 0.75;
X2 = X1 + TipWidth;
Y2 = Y1 + TipHeight;
X3 = MX + 2 * D;
Y3 = Y2 - 1;
X4 = MX + D * 0.75;
Y4 = Y2 - 1;
X5 = MX;
Y5 = y2 + D * 0.75;
break;

case 0:
X1 = MX - TipWidth;
Y1 = MY - TipHeight - D * 0.75; // Rectangle
X2 = X1 + TipWidth;
Y2 = Y1 + TipHeight;
X3 = X2 - 2 * D;
Y3 = Y2 - 1; // Pointer
X4 = X2 - D * 0.75;
Y4 = Y2 - 1;
X5 = X2;
Y5 = y2 + D * 0.75;
break;

default:
x1 = x2 = x3 = x4 = x5 = y1 = y2 = y3 = y4 = y5 = 0;
}

GfxSetBkMode( 0 );

GfxSelectPen( TipOutlineColor );
GfxSetTextColor( TipTextColor );
GfxSelectFont( TipFontname, TipFontSize );
GfxSelectSolidBrush( TipColor );
GfxRoundRect( X1, y1, x2, y2, D, D );
GfxPolygon( X3, Y3 , X4 , Y4, X5, Y5 ); // Pointer
GfxSelectPen( TipColor ); // Hide line between RoundRect and Pointer
GfxMoveTo( X3, Y3 );
GfxLineTo( X4, Y4 );
GfxDrawText( TipMsg, x1 + 10, y1 + 3, x2 - 10, y2 - 5, 16 + 65 );
}
}

function TestObject( Label, X1, Y1, X2, Y2, Color ) // Do-Nothing Demo function only
{
GfxSelectPen( colorBlack );
GfxSelectSolidBrush( Color );
GfxRectangle( X1, y1, x2, y2 );
OverObject = MX > x1 AND MX < x2 AND MY > y1 AND MY < y2;

if ( OverObject )
VarSetText( "TipMsg", "The cursor is now over the " + Label +
" quadrant and the shape of the Tip is adjusted accordingly." );

return OverObject;
}

// Global variables and parameters can be hard-coded in the final application
global MX, MY, PxWidth, PxHeight, TipWidth, TipHeight, TipsOn, FontName, FontSize;
TipColor = ParamColor( "Tip Background Color", colorWhite );
TipOutlineColor = ParamColor( "Tip Outline Color", colorBlack );
TipTextColor = ParamColor( "Tip Text Color", colorBlack );
TipsOn = ParamToggle( "Tips On", "OFF|ON", 1 );
TipFontSize = Param( "Font Size", 9, 0, 24, 1 );
TipWidth = Param( "Tip Width", 220, 50, 500, 10 );
TipHeight = Param( "Tip Height", 80, 50, 500, 10 );
TipFontName = ParamStr( "Tip Font name", "Lucida Console" );

GfxSetBkMode( 1 );
GfxSetOverlayMode( 0 );
RequestTimedRefresh( 0.1 );
MX = GetCursorXPosition( 1 );
MY = GetCursorYPosition( 1 );
PxWidth = Status( "pxwidth" );
PxHeight = Status( "pxheight" );

// In a real application each colored area could be s small button
TestObject( "UpperLeft", 0, 0, pxwidth / 2, pxheight / 2, colorRed );
TestObject( "UpperRight", pxwidth / 2, 0, pxwidth, pxheight / 2, colorBlue );
TestObject( "LowerLeft", 0, pxheight / 2, pxwidth / 2, pxheight, colorYellow );
TestObject( "Lowerright", pxwidth / 2, pxheight / 2, pxwidth, pxheight, colorBrightGreen );

ShowTip( TipColor, TipOutlineColor, TipTextColor ); // Place this call at the very endo of your code

 


 

Для того, чтобы реакция на движение мышкой была быстрой, необходимо, чтобы Ваш скрипт имел частоту обновления меньше 1 секунды, например 0.1 секунды. Как это сделать, описано в этой статье.

 

Комментарии   

# admin 23.12.2013 12:29
В продолжение разговора.

Вот пример отображения информации о реально произошедших сделках с использованием AmiSharp. При наведении мышки на метку сделки вылезает тултип с информацией о ней:

www.bot4sale.ru/.../ToolTip.jpg

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