Как лучше узнать что пришел новый бар? - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
prostotrader
7023
prostotrader  

А так не проще?

//+------------------------------------------------------------------+
//|                                                       NewBar.mq5 |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//
int mem_bars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   mem_bars = Bars(Symbol(), PERIOD_CURRENT);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   int cur_bars = Bars(Symbol(), PERIOD_CURRENT);
   if(mem_bars != cur_bars)
   {
     mem_bars = cur_bars;
     Print("New bar found!");
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Alexey Viktorov
38591
Alexey Viktorov  
prostotrader:

А так не проще?

В индикаторе появление нового бара определяется ещё проще.

if(rates_total > prev_calculated)
 Print("Новый бар");
Ihor Herasko
25841
Ihor Herasko  
Alexey Viktorov:

В индикаторе появление нового бара определяется ещё проще.

А если была подкачка истории?

Поэтому правильнее будет так:

if(rates_total - prev_calculated == 1)
 Print("Новый бар");
Aliaksandr Hryshyn
2614
Aliaksandr Hryshyn  
Используйте время открытия бара. Это самый простой и надёжный способ.
Ihor Herasko
25841
Ihor Herasko  
Taras Slobodyanik:

а еще правильней)

Нет. Это неправильно, т. к. не учитывает подкачку истории. Ведь по сути это то же самое, что и:

if(rates_total > prev_calculated)
 Print("Новый бар");
setborg
43
setborg  
Aliaksandr Yemialyanau:


хм, что то не работает этот код по обнаружению нового бара.

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

Задача следующая,

1) если есть сигнал, то покупаем.

2) На следующий день мы закрываем позицию.


Не понятно следующее.

Работаем на таймфрейме D1

Если есть сигнал и есть позиции и программа пишет что уже есть новый бар.

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

Файлы:
New_bars.jpg 121 kb
setborg
43
setborg  
prostotrader:

А так не проще?

Я советник пишу, а Функция OnCalculate() вызывается только в пользовательских индикаторах

Vitaly Muzichenko
12488
Vitaly Muzichenko  
setborg:

Я советник пишу, а Функция OnCalculate() вызывается только в пользовательских индикаторах

А OnTick() не пробовали, ну или почитать внимательно документацию, ну или скачать код советника с кодобазы, и посмотреть как там реализовано?

Ihor Herasko
25841
Ihor Herasko  
setborg:

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

Логично. Ведь данных до запуска программы нет. Поэтому при запуске программы всегда будем иметь дело в новым баром. Причем это тоже нужно. Ведь при запуске в большинстве случаев стоит обработать текущий бар. Хотя никто не мешает чуть поправить логику, и бар, имеющийся при запуске программы, всегда пропускать. Но, как мне кажется, это плохой подход.

Vitaly Muzichenko
12488
Vitaly Muzichenko  
setborg:

Я советник пишу, а Функция OnCalculate() вызывается только в пользовательских индикаторах

bool NewBar(int TF=0)
  {
   static datetime NewTime=0;
   if(NewTime!=iTime(Symbol(),TF,0) /*&& NewTime!=0 (если это первый запуск, то "бар не новый")*/)
     {
      NewTime=iTime(Symbol(),TF,0);
      return(true);
     }
   return(false);
  }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий