Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1754

 
Ситуация следующая: в переменной Х хранится индекс бара в истории, известно, что при появлении нового, происходит смещение, и поэтому Х уже указывает на другой бар. Как это пофиксить? Идея такая: с каждым новым баром увеличивать счетчик (count++) и прибавлять его к Х. Таким образом Х всегда будет указывать на один и тот же бар вне зависимости от смещения. Но возникает проблемка, когда инициализируется советник, то надо чтобы первый текущий бар не учитывался, думаю это легко решить если изначально count будет просто иметь значение -1. То есть на текущем баре после инкремента count будет равен "0", а уже на следующем новом баре (когда произошло первое смещение на 1 бар после инициализации) равен "1". Что скажете? Может я вообще думаю не туда?
 
Nerd Trader #:
Ситуация следующая: в переменной Х хранится индекс бара в истории, известно, что при появлении нового, происходит смещение, и поэтому Х уже указывает на другой бар. Как это пофиксить? Идея такая: с каждым новым баром увеличивать счетчик (count++) и прибавлять его к Х. Таким образом Х всегда будет указывать на один и тот же бар вне зависимости от смещения. Но возникает проблемка, когда инициализируется советник, то надо чтобы первый текущий бар не учитывался, думаю это легко решить если изначально count будет просто иметь значение -1. То есть на текущем баре после инкремента count будет равен "0", а уже на следующем новом баре (когда произошло первое смещение на 1 бар после инициализации) равен "1". Что скажете? Может я вообще думаю не туда?

Если это индикатор, то достаточно

bool  ArraySetAsSeries(
   const void&  array[],    // массив по ссылке
   bool         flag        // true означает обратный порядок индексации
   );

ко всем используемым массивам и буферам индикатора.

Тогда нулевой бар станет rates_total-1

ArraySetAsSeries - Операции с массивами - Справочник MQL4
ArraySetAsSeries - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArraySetAsSeries - Операции с массивами - Справочник MQL4
 
Nerd Trader #:
Ситуация следующая: в переменной Х хранится индекс бара в истории, известно, что при появлении нового, происходит смещение, и поэтому Х уже указывает на другой бар. Как это пофиксить? Идея такая: с каждым новым баром увеличивать счетчик (count++) и прибавлять его к Х. Таким образом Х всегда будет указывать на один и тот же бар вне зависимости от смещения. Но возникает проблемка, когда инициализируется советник, то надо чтобы первый текущий бар не учитывался, думаю это легко решить если изначально count будет просто иметь значение -1. То есть на текущем баре после инкремента count будет равен "0", а уже на следующем новом баре (когда произошло первое смещение на 1 бар после инициализации) равен "1". Что скажете? Может я вообще думаю не туда?
      datetime x=время нужного бара;
      int index=iBarShift(_Symbol,0,x);
 
MakarFX #:
К чему такие заморочки?
 
Alexey Viktorov #:
К чему такие заморочки?
Для меня это проще)
 
MakarFX #:
Для меня это проще)

Зато процессору тяжелей…

 
Alexey Viktorov #:

Зато процессору тяжелей…

Я не знаю какие функции какую нагрузку несут. Об этом можно где-то почитать?
 
Nerd Trader #:
Ситуация следующая: в переменной Х хранится индекс бара в истории, известно, что при появлении нового, происходит смещение, и поэтому Х уже указывает на другой бар. Как это пофиксить? Идея такая: с каждым новым баром увеличивать счетчик (count++) и прибавлять его к Х. Таким образом Х всегда будет указывать на один и тот же бар вне зависимости от смещения. Но возникает проблемка, когда инициализируется советник, то надо чтобы первый текущий бар не учитывался, думаю это легко решить если изначально count будет просто иметь значение -1. То есть на текущем баре после инкремента count будет равен "0", а уже на следующем новом баре (когда произошло первое смещение на 1 бар после инициализации) равен "1". Что скажете? Может я вообще думаю не туда?

Не туда. В Х при загрузке советника / индикатора ничего нет, если это внутри терминала, если только это не инпут или экстерн или глобальная переменная вне терминала, поэтому туда что то сперва надо записать. А потом тупо считать изменения в общем количестве баров (появление нового бара учитывать).  типа такого

datetime BarTime;

FlagNewBar=false;
if(BarTime!=iTime(NULL,0,0))
{
 BarTime=iTime(NULL,0,0);
 FlagNewBar=true;
}
if(FlagNewBar==true)
{
// И когда тру, делаем что нужно делать когда появился новый бар, 
//на следующем тике флаг нового бара будет ложь, так как БарТайм время все время существования нулевого бара будет равным
}
 

Приветствую. Подскажите, пожалста. Как в мт5  при инициализации или тике определить тестирование?

Пока нашел только OnTester(), которая вызывается непосредственно перед вызовом функции OnDeinit().

 
@Alexey Viktorov @MakarFX интересно, вполне годные решения. Спасибо.

@Valeriy Yastremskiy В Х помещается индекс ещё в OnInit(). У меня код выглядит так:
last_time = iTime(NULL, 0, 0);

  if(last_time > bar.time_open){
    bar.time_open = last_time;
    coint++;//стартовое значение -1
  }
Как по мне условие с FlagNewBar избыточно.
Причина обращения: