//--- хендлы индикаторов
int handle_macd,handle_trix;
//--- номера подокон индикаторов
int win_macd,win_trix;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- создадим горизонтальную линии перекрестия
ObjectCreate(0,"H Line",OBJ_HLINE,0,0,0);
//--- создадим вертикальную линию перекрестия
ObjectCreate(0,"V Line",OBJ_VLINE,0,0,0);
//--- зададим нулевые значения хендлам
handle_macd=0;
handle_trix=0;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- удалим перекрестие
ObjectDelete(0,"H Line");
ObjectDelete(0,"V Line");
//--- почистим комментарий
Comment("");
//--- удалим индикаторы
ChartIndicatorDelete(0,win_macd,ChartIndicatorName(0,win_macd,0));
ChartIndicatorDelete(0,win_trix,ChartIndicatorName(0,win_trix,0));
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- выведем параметры события на график
Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);
//--- если это события клика мышки на графике
if(id==CHARTEVENT_CLICK)
{
//--- подготовим переменные
int x =(int)lparam;
int y =(int)dparam;
datetime dt =0;
double price =0;
int window=0;
//--- преобразуем координаты X и Y в терминах дата/время
if(ChartXYToTimePrice(0,x,y,window,dt,price))
{
PrintFormat("Window=%d X=%d Y=%d => Time=%s Price=%G",window,x,y,TimeToString(dt),price);
//--- сделаем обратное преобразование: (X,Y) => (Time,Price)
if(ChartTimePriceToXY(0,window,dt,price,x,y))
PrintFormat("Time=%s Price=%G => X=%d Y=%d",TimeToString(dt),price,x,y);
else
Print("ChartTimePriceToXY return error code: ",GetLastError());
//--- зададим координату времени для вертикальной линии перекрестия
ObjectSetInteger(0,"V Line",OBJPROP_TIME,dt);
//--- выясним, в каком окне находится горизонтальная линия перекрестия
int h_line_window=ObjectFind(0,"H Line");
//--- если новое окно горизонтальной линии не совпадает с текущим
if(h_line_window!=window)
{
//--- удалим линию из одного окна и создадим в другом
ObjectDelete(0,"H Line");
ObjectCreate(0,"H Line",OBJ_HLINE,window,dt,price);
}
//--- зададим координату цены для горизонтальной линии перекрестия
ObjectSetDouble(0,"H Line",OBJPROP_PRICE,window,price);
ChartRedraw(0);
}
else
Print("ChartXYToTimePrice return error code: ",GetLastError());
Print("+--------------------------------------------------------------+");
}
//--- создадим пару индикаторов в отдельных подокнах, чтобы пример был полным
if(handle_macd==0 || handle_macd==INVALID_HANDLE)
{
handle_macd=iMACD(_Symbol,_Period,12,26,9,PRICE_CLOSE);
//--- если хэндл создался успешно
if(handle_macd!=INVALID_HANDLE)
{
//--- выясним сколько всего окон на графике
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- добавим индикатор на график в новом подокне и запомним номер подокна
if(ChartIndicatorAdd(0,windows,handle_macd)) win_macd=windows;
}
}
//--- создадим второй индикатор и добавим на график
if(handle_trix==0 || handle_trix==INVALID_HANDLE)
{
handle_trix=iTriX(_Symbol,_Period,14,PRICE_CLOSE);
if(handle_trix!=INVALID_HANDLE)
{
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
if(ChartIndicatorAdd(0,windows,handle_trix)) win_trix=windows;
}
}
} |