Vline и номер бара

 
Как определить номер бара в установленной вручную вертикальной линии?
 
liker:
Как определить номер бара в установленной вручную вертикальной линии?

  1. Программно или вручную?
  2. Если программно, то:
    1. Для какого языка: MQL4 или MQL5?
    2. Как предполагается идентифицирование линии, для которой следует определить индекс бара?

 
Ihor Herasko:

  1. Программно или вручную?
  2. Если программно, то:
    1. Для какого языка: MQL4 или MQL5?
    2. Как предполагается идентифицирование линии, для которой следует определить индекс бара?

Програмно. MQL 5. Линия будет только одна. Она будет ставиться вручную пользователем. Это просто ограничение для меня на количество анализируемых баров для эксперта.

В MQL 4 номер бара под линией, как я помню,  определял по времени.

 

Перебираем в цикле объекты графика, находим нужную Vline. Читаем время объекта. По времени определяем бар.

Функции ObjectsTotal, ObjectGetInteger, CopyTime.

 
liker:

Програмно. MQL 5. Линия будет только одна. Она будет ставиться вручную пользователем. Это просто ограничение для меня на количество анализируемых баров для эксперта.

В MQL 4 номер бара под линией, как я помню,  определял по времени.

Даже если линия должна быть одна, ей всё-же лучше дать определённое имя, так не надо будет искать её перебором всех объектов. Следовательно создать линию лучше при запуске советника на каком-то расстоянии и потом её двигать как душе угодно. Затем определяется время этой линии и последнее

int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты время этой линии
   datetime         stop_time        // по какую дату текущее время
   );


А вообще, если забыть про mql4 то номер бара вообще не нужен. Всё что надо будет определить определяется по указанному времени.

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

int Bars_Count;
long Vline_Time;

ObjectCreate(0,"Vline",OBJ_VLINE,0,TimeCurrent(),0,0,0,0,0);


ObjectSetInteger(0,"Vline",OBJPROP_SELECTABLE,1,1);


Теперь нужен обработчик события, который среагирует на перетаскивание мышью Vline.

OnChartEvent(CHARTEVENT_OBJECT_DRAG,"VLine") ;

В теле обработчика :

Vline_Time=ObjectGetInteger(0,"Vline",OBJPROP_TIME,0);

Bars_Count=Bars(Symbol(),0,TimeCurrent(),Vline_Time);

Alert (Bars_Count);


 
liker:

Вот всё что надо было написать...

#property indicator_chart_window
#property indicator_plots 0

/**************Custom indicator initialization function**************/
int OnInit()
{
 if(ObjectFind(0, "Vline") < 0)
  {
   ObjectCreate(0, "Vline", OBJ_VLINE, 0, TimeCurrent(), 0);
   ObjectSetInteger(0, "Vline", OBJPROP_SELECTABLE, true);
  }
   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);
}/*******************************************************************/

void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam  // параметр события типа string 
                 )
{
  int Bars_Count;
  datetime Vline_Time;
   if(id == 2 && sparam == "Vline")
    {
     Vline_Time = (datetime)ObjectGetInteger(0, "Vline", OBJPROP_TIME);
     Bars_Count = Bars(_Symbol, PERIOD_CURRENT, Vline_Time, TimeCurrent());
     Print(Bars_Count, " ********** ", Vline_Time);
    }
}/*******************************************************************/
Если нумерация нужна с нуля, то значение Bars_Count просто уменьшить на 1.
 
Спасибо всем !
Причина обращения: