Аналог iBarShift

 

Я упустил из виду функциональность, аналогичную iBarShift для МТ4. Подскажите как это сделать?

И насколько я понимаю вместо Time[10] нужно использовать CopyTime? 

 
GarF1eld писал(а)  :

Я упустил из виду функциональность, аналогичную iBarShift для МТ4. Подскажите как это сделать?

И насколько я понимаю вместо Time[10] нужно использовать CopyTime? 

аналог ibarshift:

int iBarOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )

аналог Time[]:

Time( int i )

там много еще чего, что пригодится:

double iHigh(string symbol,int tf,int ind)
double High( int i )
double iLow(string symbol,int tf,int ind)
double Low( int i )
double iClose(string symbol,int tf,int ind)
double Close( int i )
double iOpen(string symbol,int tf,int ind)
double Open( int i )
double HighOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double LowOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double CloseOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double OpenOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
string SPeriod(ENUM_TIMEFRAMES tf)  //символьное представление периода
datetime iTime( const string symbol, int tf, int ind  )

//+------------------------------------------------------------------+
//| Аналог Bars(), не требует предварительной синхронизации истории  |
//| Вход  : symbol - символ в терминале                              |
//|         timeframe - таймфрейм                                    |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int BarsSinh( string symbol,ENUM_TIMEFRAMES  timeframe )

//+------------------------------------------------------------------+
//| Произвести синхронизацию таймсерии с историей                    |
//| Вход  : symbol - символ в терминале                              |
//|         tf     - таймфрейм                                       |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
void SynhronizeSeries( string symbol, ENUM_TIMEFRAMES tf )

//+------------------------------------------------------------------+
//| Проверить наличие истории на дату start_date, если остуствует,   |
//| то произвести попытку загрузки                                   |
//| Вход  : symbol - символ в терминале                              |
//|         period - таймфрейм                                       |
//|         start_date - дата проверки истории                       |
//| Выход : код результата выполнения операции подробнее             |
//|         см. https://www.mql5.com/ru/docs/series/timeseries_access |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
//+------------------------------------------------------------------+
//| возвращает строкое значение периода                              |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
Файлы:
common.mqh  22 kb
 
gdtt:

аналог ibarshift:

аналог Time[]:

там много еще чего, что пригодится:

 

спасибо! полезная вещь

если ничего более вменяемого из стандартного нет, буду использовать алгоритмы из библиотеки

 
Кто-нибудь может подсказать более быстрый аналог iBarShift? Существующие варианты с CopyTime получаются страшно тормозными, судя по профилировщику. Нужна побаровая синхронизация. Считаю индюк на каждом баре один раз, но к сожалению до тех пор пока бар не становится синхронизированным, приходится обрабатывать тики. Таймер тоже вставлял, прироста в производительности не наблюдаю.
 

Если кому интересно, нашел альтернативу.

int iBarShiftFast(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)
{
  datetime lastBar;
  SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE, lastBar);
  return(Bars(symbol, timeframe, time, lastBar) - 1);
}

По моим замерам, ускорение по сравнению с вариантом с CopyTime - от 2 до 7 раз (в зависимости от входных данных). Если есть замечания или баги, напишите плиз.

 
marketeer:

Если кому интересно, нашел альтернативу.

По моим замерам, ускорение по сравнению с вариантом с CopyTime - от 2 до 7 раз (в зависимости от входных данных). Если есть замечания или баги, напишите плиз.

Спасибо. Попробую юзать.

 

А может теперь вот так правильней:

int bar = Bars(0, 0, barTime_last, TimeCurrent());
 
Roffild:

А может теперь вот так правильней:

int bar = Bars(0, 0, barTime_last, TimeCurrent());

А еще быстрее и правильнее (первый параметр должен быть NULL, с нулем не работает)

 int bar = Bars(NULL, 0, t, 32000000000);

Ибо зачем выполнять лишнюю функцию TimeCurrent()

 32000000000 - это не от текущего момента, а почти от момента 3000 года

 
Nikolai Semko:

А еще быстрее и правильнее (первый параметр должен быть NULL, с нулем не работает)

Ибо зачем выполнять лишнюю функцию TimeCurrent()

 32000000000 - это не от текущего момента, а почти от момента 3000 года


А как же -1? Важный же момент...
 
Denis:

А как же -1? Важный же момент...
Не понял,  о чем речь? 
Поясните. 
 
Nikolai Semko:
Не понял,  о чем речь? 
Поясните. 

Функция Bars возвращает количество баров. Когда нам нужно получить индекс бара с индексом 9(сори за тавтологию), она будет возвращать 10, т.к. индекс первого бара равен 0. 
Причина обращения: