Не нашёл в документации такую привязку.

 

Мне хотелось бы, чтоб, скажем, советником я создал на графике горизонтальную линию и над нею текст с некой информацией. Надпись всегда на неком расстоянии выше линии, скажем, на 5 пунктов. Далее, скажем так, я переместил линию на новое место и, с приходом нового тика надпись отыскала мою линию и снова встала на 5 пунктов выше линии (возможно с новым текстом).

Посмотрел справку для размещения текста. Есть привязка объекта по координатам х-у, есть привязка к отступам от краёв окна, есть привязка через пару дата-цена. В том-то весь и фокус, чтоб текст был прилеплен всегда к крайней правой вертикали окна (ну, может на неком, небольшом расстоянии от неё), а вверх-вниз катался вслед за линией. Возможно это вообще осуществить в коде? Ведь крайняя правая вертикаль не имеет такого параметра как дата. Хотелось бы, чтоб это было примерно так:

Скрин

 
Vitaly Murlenko:


Ведь крайняя правая вертикаль не имеет такого параметра как дата..

 А куда он (параметр) делся?
 

Время крайнего правого бара окна можно узнать путем сложения времени левого крайнего бара окна (CHART_FIRST_VISIBLE_BAR) и количества баров в окне (CHART_WIDTH_IN_BARS). Цена имеется. По дате и цене можно вывести текст.

Но, на мой взгляд, указание отступа в пунктах - плохо. Лучше делать отступ в пикселях. В таком случае может потребоваться дополнительное использование ChartTimePriceToXY().

 
Mikhail Dovbakh #:
 А куда он (параметр) делся?

А он был? Я не видел. Может я что-то не знаю?

 
Ihor Herasko #:

Время крайнего правого бара окна можно узнать путем сложения времени левого крайнего бара окна (CHART_FIRST_VISIBLE_BAR) и количества баров в окне (CHART_WIDTH_IN_BARS). Цена имеется. По дате и цене можно вывести текст.

Но, на мой взгляд, указание отступа в пунктах - плохо. Лучше делать отступ в пикселях. В таком случае может потребоваться дополнительное использование ChartTimePriceToXY().

Там наверху окна графика есть треугольник. Он, как правило смещён круто вправо от центра окна.

Этот

Понятно, что слева баров поместится куда больше. Если к крайнему бару прибавить время крайнего левого бара, то справа мы выйдем за границу окна.

 
Vitaly Murlenko #:

А он был? Я не видел. Может я что-то не знаю?

void OnStart()
{
   datetime time=iTime(_Symbol,0,0);//  current bar
   if (!ChartGetInteger(0,CHART_SHIFT)) ChartSetInteger(0,CHART_SHIFT,true);
   double shift=ChartGetDouble(0,CHART_SHIFT_SIZE,0);
   Print (shift); 
   ObjectCreate(0,"V_Line_Test",OBJ_VLINE,0,time+(long)(shift*PeriodSeconds()),0);
   ChartRedraw();
   Sleep (8000);
   ObjectDelete(0,"V_Line_Test");
}

Все на месте, вроде...

 
Mikhail Dovbakh #:

Все на месте, вроде...

Спасибо. Поработаю. Я не совсем понял эту конструкцию. Не приходилось ранее пользоваться функциями операций с графиками и окнами. Как-то нужды не было.

 
//Отловить момент создания или перемещения графического объекта 'горизонтальная линия' ( OBJ_HLINE ). После чего в описание объекта прописать цену горизонтальной линии.

#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.000"
#property indicator_chart_window
#property indicator_buffers      0
#property indicator_plots        0
//--- input parameters
input bool     InpPrintLog          = false;       // Print log
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- the object has been created
   if(id==CHARTEVENT_OBJECT_CREATE)
     {
      long obj_type=ObjectGetInteger(0,sparam,OBJPROP_TYPE);
      if(obj_type!=OBJ_HLINE)
         return;
      double hline_price=ObjectGetDouble(0,sparam,OBJPROP_PRICE);
      ObjectSetString(0,sparam,OBJPROP_TEXT,DoubleToString(hline_price,Digits()));
      ChartRedraw(0);
      if(InpPrintLog)
         Print("The object with name ",sparam," has been created");
     }
//--- the object has been moved or its anchor point coordinates has been changed
   if(id==CHARTEVENT_OBJECT_DRAG)
     {
      long obj_type=ObjectGetInteger(0,sparam,OBJPROP_TYPE);
      if(obj_type!=OBJ_HLINE)
         return;
      double hline_price=ObjectGetDouble(0,sparam,OBJPROP_PRICE);
      ObjectSetString(0,sparam,OBJPROP_TEXT,DoubleToString(hline_price,Digits()));
      ChartRedraw(0);
      if(InpPrintLog)
         Print("The anchor point coordinates of the object with name ",sparam," has been changed");
     }
//--- the text in the Edit of object has been changed
  }
//+------------------------------------------------------------------+

Тут есть пример.

HLine Add Description
HLine Add Description
  • www.mql5.com
Индикатор добавляет в описание горизонтальной линии цену этой линии