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

 

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

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+
 
prostotrader:

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

 
setborg:

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

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

 
setborg:

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

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

 
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);
  }
Причина обращения: