Делаем кнопку на графике.

Часть 2.

Продолжаем изучать рисоваие кнопки на графике.

Сделанная в прошлый раз кнопка срабатывала только один раз при нажатии.
А что делать если надо чтобы наша кнопак включалась и выключалась? Все очень просто. Надо запомнить ее состояние. Для этого в Ами есть статические переменные. Статическая переменная это переменная которая доступна из любого кода AFL и соответственно может служить для передачи данных между различными формулами. В общем для начала надо инициализировать переменную которая будет "помнить" состояние нашей кнопки.
key = StaticVarGet("key");
затем в блоке, где мы обнаруживаем щелчек по кнопке изменяем значение нашей переменной на противоположное.
if(MouseOnBut AND ClikBut)
{
	if(key == 1) 
		StaticVarSet("key", 0);
	else
		StaticVarSet("key", 1);	
}
Дальше проверяем в каком состоянии сейчас наша кнопка (Вкл. или Выкл.).
Если включена, то выполняем необходимые действия. Я изменю цвет кнопки на красный и нарисую скользящую среднюю.
if(key == 1)
{
	color = colorRed;
	Plot(MA(C, 10), "MA_10", ColorRed);
}
В итоге весь код выглядит так.
MouseOnBut = 
	GetCursorXPosition( 1 ) > 5 AND 
	GetCursorXPosition( 1 ) < 100 AND 
	GetCursorYPosition( 1 ) > 20 AND 
	GetCursorYPosition( 1 ) < 50; 
	
ClikBut = GetCursorMouseButtons() == 9;  

key = StaticVarGet("key");

color = colorBlue;
if(MouseOnBut AND ClikBut)
{
	if(key == 1) 
		StaticVarSet("key", 0);
	else
		StaticVarSet("key", 1);	
}

if(key == 1)
{
	color = colorRed;
	Plot(MA(C, 10), "MA_10", ColorRed);
}	
	
Plot(C, "", colorBlack, styleCandle);
GfxSelectSolidBrush( color );
GfxRectangle( 5, 20, 100, 50 );
GfxSelectFont("Tahoma", 15, 700 );
GfxSetBkColor(color);
GfxSetTextColor(colorWhite);
GfxTextOut( "Кнопка", 15, 23 ); 
Но это еще не все. Если данный код попробовать на графике который не подключен к данным, то сразу бросается в глаза, что график или совсем не реагирует на наши нажатия на кнопку, или реагирует с большой задержкой. Пока его не "пошевелишь".
Это происходит потому, что Ами если не видит изменений в данных на экране не будет перерисовывать график и пересчитывать AFL код.
К счастью, мы можем заставить Ами принудительно перерисовывать график. Для этого можно воспользоваться функцией
RequestTimedRefresh( 1 ); 
Тут 1 - это время в секундах через которое необходимо перерисовать график. Эту функцию можно добавить или в начало или в конец кода.

Удачи.