#property description "Эксперт для демонстрации работы с функцией ChartIndicatorAdd()."
#property description "После запуска на графике (и получения ошибки в Журнал) откройте"
#property description "свойства советника и задайте правильные параметры <symbol> и <period>."
#property description "На график будет добавлен индикатор MACD."
//--- input parameters
input string symbol="AUDUSD"; // имя символа
input ENUM_TIMEFRAMES period=PERIOD_M12; // таймфрейм
input int fast_ema_period=12; // период быстрой средней MACD
input int slow_ema_period=26; // период медленной средней MACD
input int signal_period=9; // период усреднения разности
input ENUM_APPLIED_PRICE apr=PRICE_CLOSE; // тип цены для расчета MACD
int indicator_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- попробуем добавить индикатор на график
if(!AddIndicator())
{
//--- функция AddIndicator() отказалась добавить индикатор на график
int answer=MessageBox("Всё равно попытаться добавить MACD на график?",
"Неправильно задан символ и/или таймфрейм для добавления индикатора",
MB_YESNO // будут показаны кнопки выбора "Yes" и "No"
);
//--- если пользователь все равно настаивает на неправильном использовании ChartIndicatorAdd()
if(answer==IDYES)
{
//--- сначала сообщим об этом в Журнал
PrintFormat("Внимание! %s: Попробуем добавить индикатор MACD(%s/%s) на график %s/%s. Получим ошибку 4114",
__FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
//--- получим номер нового подокна, в которое попытаемся добавить индикатор
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- теперь сделаем попытку, обреченную на ошибку
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
PrintFormat("Не удалось добавить индикатор MACD на окно %d графика. Код ошибки %d",
subwindow,GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// эксперт ничего не делает
}
//+------------------------------------------------------------------+
//| Функция проверки и добавления индикатора на график |
//+------------------------------------------------------------------+
bool AddIndicator()
{
//--- выводимое сообщение
string message;
//--- проверим на совпадение символ индикатора и символ графика
if(symbol!=_Symbol)
{
message="Демонстрация использования функции Demo_ChartIndicatorAdd():";
message=message+"\r\n";
message=message+"Нельзя на график добавить индикатор, рассчитанный на другом символе.";
message=message+"\r\n";
message=message+"Укажите в свойствах эксперта символ графика - "+_Symbol+".";
Alert(message);
//--- досрочный выход, не будем добавлять индикатор на график
return false;
}
//--- проверим на совпадение таймфрейм индикатора и таймфрейм графика
if(period!=_Period)
{
message="Нельзя на график добавить индикатор, рассчитанный на другом таймфрейме.";
message=message+"\r\n";
message=message+"Укажите в свойствах эксперта таймфрейм графика - "+EnumToString(_Period)+".";
Alert(message);
//--- досрочный выход, не будем добавлять индикатор на график
return false;
}
//--- все проверки прошли, символ и период индикатора соответствуют графику
if(indicator_handle==INVALID_HANDLE)
{
Print(__FUNCTION__," Создаем индикатор MACD");
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
if(indicator_handle==INVALID_HANDLE)
{
Print("Не удалось создать индикатор MACD. Код ошибки ",GetLastError());
}
}
//--- сбросим код ошибки
ResetLastError();
//--- накладываем индикатор на график
Print(__FUNCTION__," Добавляем индикатор MACD на график");
Print("MACD построен на ",symbol,"/",EnumToString(period));
//--- получим номер нового подокна, в которое добавим индикатор MACD
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
PrintFormat("Добавляем индикатор MACD на окно %d графика",subwindow);
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
{
PrintFormat("Не удалось добавить индикатор MACD на окно %d графика. Код ошибки %d",
subwindow,GetLastError());
}
//--- добавление индикатора на график прошло успешно
return(true);
} |