Задачка на новый бар - страница 2

 
Alexey Viktorov #:

Я много чего могу. Но ведь выжпрограммисты тоже должны чуток напрягать мозги…

все бы ничего, но если вы будете использовать указанную вами функцию, вы совершите перебор баров на том ТФ, который передадите. Естественно, вы определите новый бар на указанном тф.

Но дело в том, что сверху у вас поступают бары не того тф, который вы передаете в функцию, а это значит, что полученный порядковый номер бара вы не можете запихать в iTime и взять его от tf. 

В этом решение вы сделаете перебор по 100 дням. 

//+------------------------------------------------------------------+
//|                                                          New.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i = 100; i > 0; i--)
     {
      if(IsNewBar(PERIOD_D1,i))
        {
         Print("Наступил новый день =================");
        }
     }
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
/*****************************IsNewBar*******************************/
bool IsNewBar(ENUM_TIMEFRAMES tf, int inBar)
  {
   datetime tm = iTime(_Symbol, tf, inBar);

   static datetime time = 0;
   if(tm != time)
     {
      time = tm;
      ObjectCreate(0,IntegerToString(time),OBJ_VLINE,0,time,0);
      return true;
     }
   return false;
  }/*******************************************************************/
//+------------------------------------------------------------------+

Задача заключается в том, чтобы сделать перебор по 100 барам младшего ТФ и среди них найти появление нового бара старшего тф. И сделав перебор по 100 барам н1, к примеру, мы не получим 100 новых свечей на д1, как в вашем примере. Поэтому кажущеяся легкость не является таковой. 

Дмитрий Федосеев предложили хорошую идею с iBarShift

Если переделывать конкретно ваш пример, то я идею Дмитрия понял следующим образом

//+------------------------------------------------------------------+
//|                                                          New.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

datetime times = 0;
ENUM_TIMEFRAMES setTf = PERIOD_D1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
  if(_Period >= setTf)
   {
    return(INIT_PARAMETERS_INCORRECT);
   }
   
   for(int i = 100; i > 0; i--)
     {
      if(IsNewBar(setTf,i))
        {
         Print("Наступил новый день =================");
        }
     }
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
/*****************************IsNewBar*******************************/
bool IsNewBar(ENUM_TIMEFRAMES tf, int inBar)
  {
   datetime tm = iTime(_Symbol,tf,iBarShift(_Symbol,tf,iTime(_Symbol,PERIOD_CURRENT,inBar)));

   if(tm != times) // && tm >= iTime(_Symbol,PERIOD_CURRENT,inBar)) раскомментировать, если нужен полный бар старшего тф, от которого стартуем
     {
      times = tm;
      ObjectCreate(0,IntegerToString(times),OBJ_VLINE,0,times,0);
      return true;
     }
   return false;
  }/*******************************************************************/
//+------------------------------------------------------------------+
 
Nikita Chernyshov #:

все бы ничего, но если вы будете использовать указанную вами функцию, вы совершите перебор баров на том ТФ, который передадите. Естественно, вы определите новый бар на указанном тф.

Но дело в том, что сверху у вас поступают бары не того тф, который вы передаете в функцию, а это значит, что полученный порядковый номер бара вы не можете запихать в iTime и взять его от tf. 

В этом решение вы сделаете перебор по 100 дням. 

Задача заключается в том, чтобы сделать перебор по 100 барам младшего ТФ и среди них найти появление нового бара старшего тф. И сделав перебор по 100 барам н1, к примеру, мы не получим 100 новых свечей на д1, как в вашем примере. Поэтому кажущеяся легкость не является таковой. 

Дмитрий Федосеев предложили хорошую идею с iBarShift

Если переделывать конкретно ваш пример, то я идею Дмитрия понял следующим образом

/*****************************IsNewBar*******************************/
bool IsNewBar(ENUM_TIMEFRAMES tf, int inBar)

Вот именно об этом я и писал

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Задачка на новый бар

Alexey Viktorov, 2023.01.13 17:13

Что-ж тут сложного-то???

  if(IsNewBar(PERIOD_D1))
   {
      Print(Наступил новый день);
   }

Это может быть в OnTick() или OnCalculate()

Это пользовательская функция

/*****************************IsNewBar*******************************/
bool IsNewBar(ENUM_TIMEFRAMES tf)
 {
  datetime tm = iTime(_Symbol, tf, 0);
  static datetime time = 0;
  if(tm != time)
   {
    time = tm;
    return true;
   }
  return false;
 }/*******************************************************************/

Чтобы перебрать историю можно вместо нуля поставить переменную во входящие функции…

Но сделано как-то через …это… введена переменная правильно, а дальше какая-то чушь.

Но если вам так нравится, то пусть будет так…


ps; ОЙ… я первый вариант совсем не посмотрел. А он ведь правильный…

 
Alexey Viktorov #:

Вот именно об этом я и писал

Но сделано как-то через …это… введена переменная правильно, а дальше какая-то чушь.

Но если вам так нравится, то пусть будет так…


ps; ОЙ… я первый вариант совсем не посмотрел. А он ведь правильный…

Скепсис не уместен. Ваш вариант на рынках, открытие которых происходит не в 00 часов, работать не будет. 

А тот который написал  Nikita Chernyshov, очень даже не плохо справится с поставленной задачей.

 
Aleksandr Slavskii #:

Скепсис не уместен. Ваш вариант на рынках, открытие которых происходит не в 00 часов, работать не будет. 

А тот который написал  Nikita Chernyshov, очень даже не плохо справится с поставленной задачей.

Значение слова «скепсис» вам вряд-ли известно. Не нравится писать через …это…, пишите через …это… на ваш выбор. А заявлять о неработоспособности не проверив не красиво. Конечно можно написать через …этоэто… так чтобы не работало можно. Вы всё так пишете. А потом заявляете о багах.

 
Alexey Viktorov #:

А заявлять о неработоспособности не проверив не красиво. 

Вы меня заставили сомневаться)

Итак, задача (читаем первый пост):  На текущем таймфрейме на истории в цикле перебираются бары. Как в этом цикле можно определить наступление нового бара на ТФ старше?

//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   ArraySetAsSeries(time, true);
   if(prev_calculated <= 0)
      for(int i = 10000; i > 0; i--)
         if(IsNewBar(PERIOD_D1, i))
            Print("Наступил новый день " + TimeToString(time[i], TIME_DATE | TIME_MINUTES));
   return(rates_total);
  }
/*****************************IsNewBar*******************************/
bool IsNewBar(ENUM_TIMEFRAMES tf, int inBar)
  {
   datetime tm = iTime(_Symbol, tf, inBar);
   static datetime time = 0;
   if(tm != time)
     {
      time = tm;
      return true;
     }
   return false;
  }
/*******************************************************************/


Запускаю на ТФ М1 и что мы имеем?

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:08

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:09

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:10

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:11

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:12

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:13

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:14

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:15

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:16

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:17

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:18

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:19

 (Si-3.23,M1) Наступил новый день 2023.01.13 17:20

 Ну и т.д.

Боюсь это совсем не тот результат, который нужен топикстартеру.

 

Меняем  это

datetime tm = iTime(_Symbol, tf, inBar);

на вот это

datetime tm = iTime(_Symbol, tf, iBarShift(_Symbol, tf, iTime(_Symbol, PERIOD_CURRENT, inBar)));

И получаем

 (Si-3.23,M1) Наступил новый день 2022.12.28 16:24

 (Si-3.23,M1) Наступил новый день 2022.12.29 09:00

 (Si-3.23,M1) Наступил новый день 2022.12.30 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.03 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.04 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.05 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.06 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.09 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.10 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.11 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.12 09:00

 (Si-3.23,M1) Наступил новый день 2023.01.13 09:00


Совсем другой коленкор)

 
Aleksandr Slavskii #:

Вы меня заставили сомневаться)

Итак, задача (читаем первый пост):  На текущем таймфрейме на истории в цикле перебираются бары. Как в этом цикле можно определить наступление нового бара на ТФ старше?

Вот именно об этом я и говорю

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Задачка на новый бар

Alexey Viktorov, 2023.01.14 13:21

Значение слова «скепсис» вам вряд-ли известно. Не нравится писать через …это…, пишите через …это… на ваш выбор. А заявлять о неработоспособности не проверив не красиво. Конечно можно написать через …этоэто… так чтобы не работало можно. Вы всё так пишете. А потом заявляете о багах.

Вот и в этом случае сначала вы сделали через …этоэто… а потом добавили что-то правильное, но по своему. Ну пусть будет так. Главное, что работает.

Вот результат работы мозгов. О чём я говорил

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Задачка на новый бар

Alexey Viktorov, 2023.01.13 18:17

Я много чего могу. Но ведь выжпрограммисты тоже должны чуток напрягать мозги


 
Aleksandr Slavskii #:

Меняем  это

на вот это

И получаем

 (Si-3.23,M1) Наступил новый день 2022.12.28 16:24

....

Совсем другой коленкор)

именно так

эта строчка и есть решение вопроса
 
Alexey Viktorov #:

О чём я говорил

Я вас не понимаю. Ну да ладно.

Мне интересно, вот эти ваши слова: " Вы всё так пишете. А потом заявляете о багах". Относятся лично ко мне или вы вообще всех имеете ввиду?

 
Aleksandr Slavskii #:

Я вас не понимаю. Ну да ладно.

Мне интересно, вот эти ваши слова: " Вы всё так пишете. А потом заявляете о багах". Относятся лично ко мне или вы вообще всех имеете ввиду?

Нет не ко всем. Из всех участников этого обсуждения, к Федосееву это не относится.

А говорил я о том, что вам тоже надо иногда напрягать мозги. 

Вы взяли функцию, напрягая не то место, тупо поставили дополнительно переменную… Заявили, что не работает. Потом почитали сообщение Федосеева, напрягли остаток мозга и сделали так как работает. Сделали через …это… но всё-же работает.

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