Как советнику дождаться момента появления нового бара? +некоторые тонкости - страница 2

 

у меня такая конструкция в эксперте определяла новый бар:

int start(){
// операции на каждом тике
   int bar = Bars;
   if (bar != counted ) {
      counted= bar;
// операции при появлении нового бара
   }
return(0);
}

теоретически работать не должно, но работает даже при синхронизации данных с сервером (перерисовка)

ЗЫ: на последних билдах МТ4 не проверял

 
sergeev:

а у вас сложности с левой (datetime curbar) или правой (Time[0]) часть этой операции?


Уже никаких) Погуглил и успешно выяснил, что Time[] - это массив, элементами которого являются моменты появления баров на графике.. Только сомнения есть по поводу этого куска теперь:

if(lastbar!=curbar){

lastbar=curbar;

return (true); }

else return(false);

Не понимаю логики. Например, рассмотрим первый запуск программы: lastbar = 0; curbar = 1823589823 (к примеру. Это ведь кол-во секунд, прошедшее между 01.01.1970 и появлением последнего бара.

lastbar, как можно увидеть, не равен curbar, поэтому вернётся true. Хотя появлением нового бара там даже и не пахло вроде..

В общем, не могли бы вы пояснить, пожалуйста, как это работает?.

 

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

Кстати, переменная lastbar не должна ли быть глобальной? Она же, по-моему, уничтожается каждый раз при завершении работы функции NewBar().

 

static

 
ну она же объявляется каждый раз при вызове функции, как-то это странно) Если сделать не статик, а обычную переменную, только глобально, тоже же работать будет, верно я думаю? )
 

Будет, так же, как и static, но это - некорректное использование памяти. Глобальные переменные предназначены исключительно для передачи значений в специальные функции, любое другое их использование - забивание гвоздей ноутбуком :) (чуть не сказал - логарифмической линейкой, но побоялся оказаться непонятым).

 

Я знаю, что такое логарифмическая линейка :) Еще не так много лет прошло со времен их использования.. Но это уже оффтоп. Спасибо за помощь)

 

Проще данного метода у меня нет.
Отслеживает время открытия текущего бара и при каждом тике сравнивает их.

double lastTime = 0;

void OnTick() {

   if(isNewBar()){

      Print("New Bar");

     }

}


bool isNewBar() {

   double thisTime= NormalizeDouble(iTime(_Symbol, PERIOD_CURRENT, 0), _Digits);

   if(lastTime != thisTime) {

      lastTime = thisTime;

      return true;

     }

   return false;

  }

 
Armen Shahinyan #:

Проще данного метода у меня нет.
Отслеживает время открытия текущего бара и при каждом тике сравнивает их.

Соглашусь насчёт отслеживания iTime нулевого бара, работает как часы... но зачем его приводить к типу double? 😯

 
transcendreamer #:

Соглашусь насчёт отслеживания iTime нулевого бара, работает как часы... но зачем его приводить к типу double? 😯

Плюс, про глобал и статик уже разобрали выше.

Причина обращения: