Аналог iBarShift - страница 2

 
Вот здесь есть два варианта аналога iBarShift(): пост #5 и пост #7
 
Denis:

Функция Bars возвращает количество баров. Когда нам нужно получить индекс бара с индексом 9(сори за тавтологию), она будет возвращать 10, т.к. индекс первого бара равен 0. 
Ну да,  спасибо.  В общем то правильное дополнение-замечание. Правда я особо не заморачиваюсь, просто знаю,  что это количество бар.  А если в программе нужен индекс,  только тогда отнимаю единицу.  
 
Vasiliy Pushkaryov:
Вот здесь есть два варианта аналога iBarShift(): пост #5 и пост #7
Просто вариант:
Bars(NULL, 0, t, 32000000000)-1;

самое короткое и быстрое решение для аналога iBarShift для текущих символа и  таймфрейма и не требует дополнительных функций. Впрочем и для нетекущих тоже, просто нужно будет заполнить первые два параметра вместо нулевых. 
 
Nikolai Semko:
Просто вариант:

самое короткое и быстрое решение для аналога iBarShift для текущего символа и текущего таймфрейма и не требует дополнительных функций. 

Только не во всех случаях правильно будет работать. GetBarShift() от fxsaber более универсальная.

Попробуйте в Вашу функцию вместо t поставить TimeCurrent(), сами увидите результат.

 
Vasiliy Pushkaryov:

Только не во всех случаях правильно будет работать. GetBarShift() от fxsaber более универсальная.

Попробуйте в Вашу функцию вместо t поставить TimeCurrent(), сами увидите результат.

Результат будет одинаковый
 
Nikolai Semko:
Результат будет одинаковый
Вы ведь даже не проверили
 
Vasiliy Pushkaryov:
Вы ведь даже не проверили
Я проверял до этого много раз и поэтому просто знаю.  Зато вы сами даже не пробовали. 
 
Nikolai Semko:
Я проверял до этого много раз и поэтому просто знаю.  Зато вы сами даже не пробовали. 

Вот скрипт

void OnStart()
{
  int idShort = Bars(NULL, 0, TimeCurrent(), 32000000000)-1;
  int idUni = GetBarShift(_Symbol, 0, TimeCurrent());
  Print("idShort = ", idShort, " idUni=", idUni);
}


//+------------------------------------------------------------------------------------------------------------------+
//| 
//+------------------------------------------------------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) 
{
  int res=-1;
  datetime last_bar;
  
   // --- время открытия последнего бара по символу, периоду
  if(SeriesInfoInteger(symbol_name, timeframe, SERIES_LASTBAR_DATE, last_bar)) 
  {
    if(time > last_bar) res = 0;
    else 
    {
      const int shift = Bars(symbol_name, timeframe, time, last_bar);
      if(shift > 0) res = shift-1;
    }
  }
  return res;
}

Он просто виснет. Принудительно удалив его с графика, получаю результат.


Так что попробовал, поэтому посоветовал и Вам. Но раз Вы пользовались и Вам подходит, я переубеждать не буду.

 

Ну и так тоже можно

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[1];      
        CopyTime(symbol,timeframe,0,1,tm0);
        int res=Bars(symbol,timeframe,tm0[0],tm)-1;
        return(res);
   }
 
iBarShift
iBarShift
  • голосов: 42
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4. В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки.