Назад  Вперед

ChartXYToTimePrice

Преобразует координаты  X и Y графика в значения время и цена.

bool  ChartXYToTimePrice(
   long           chart_id,     // идентификатор графика
   int            x,            // координата X на графике
   int            y,            // координата Y на графике
   int&           sub_window,   // номер подокна
   datetime&      time,         // время на графике
   double&        price,        // цена на графике
   );

Параметры

chart_id

[in]  Идентификатор графика. 0 означает текущий график.

x

[in]  Координата X.

y

[in]  Координата Y.

sub_window

[out]  Переменная, в которую будет записан номер подокна графика. 0 означает главное окно графика.

time

[out]  Значение времени на графике, для которого будет получено значение в пикселах на оси X. Начало координат находится в левом верхнем углу окна/подокна.

price

[out]   Значение цены на графике, для которого будет получено значение в пикселах на оси Y. Начало координат находится в левом верхнем углу окна/подокна.

Возвращаемое значение

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

Пример:

//--- хендлы индикаторов
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;
        }
     }
  }

Смотри также

ChartTimePriceToXY()