Разъясните пожалуйста что в этой функции может быть не так?

 
MetaQuotes Software Corp.:

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

Как-же общаться, если сначала идёт ошибочный ответ, а потом игнорирование. Заявка 2016.06.22 08:06, #1499568

Может что сообщество сможет объяснить?


Вот часть кода советника. Внутри void OnTick()

   bool openNew, newDay, newHour;

    if((int)mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено.
     {
      newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); // 
   if(newDay)
    Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true
       newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
    if(newHour)
     Print("***** newHour ", newHour); // Судя по распечатке newHour = true
        if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ.
         {
          openNew = openNew_or_No();
           Print("***** openNew ", openNew, " ***** PositionsTotal ", PositionsTotal()); // Эта распечатка отсутствует
            if(openNew || PositionsTotal() == 0)
             
              // Продолжение кода...
              // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.

Это содержимое вкладки "Эксперты"

2016.06.22 00:00:44.531 Toad Green (EURUSD,M15) ***** newHour true
2016.06.22 00:00:44.331 Toad Green (USDJPY,M15) ***** newHour true
2016.06.22 00:00:18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0
2016.06.22 00:00:12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0

Первые строки логфайла за 21.06 где чётко видно, что вышеприведённый код работал исправно.

GM      0       00:00:30.116    Trades  '3265046': instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55)
NK      0       00:00:30.246    Trades  '3265046': accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55)
IE      0       00:00:30.246    Trades  '3265046': deal #73303810 buy 0.01 EURUSD at 1.13188 done (based on order #87892298)
KI      0       00:00:30.246    Trades  '3265046': order #87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms
ON      0       00:00:30.256    Trades  '3265046': instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55)
LQ      0       00:00:30.366    Trades  '3265046': accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55)
HG      0       00:00:30.376    Trades  '3265046': deal #73303813 sell 0.01 EURUSD at 1.13093 done (based on order #87892301)
RK      0       00:00:30.376    Trades  '3265046': order #87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms
MJ      0       00:00:30.376    Trades  '3265046': modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462
GK      0       00:00:30.476    Trades  '3265046': accepted modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462
OK      0       00:00:30.486    Trades  '3265046': modify #87608748 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 107 ms
OH      0       00:00:30.486    Trades  '3265046': modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462
GJ      0       00:00:30.586    Trades  '3265046': accepted modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462
KI      0       00:00:30.596    Trades  '3265046': modify #87892301 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 109 ms
EN      0       04:20:25.608    Trades  '3265046': deal #73317674 sell 0.01 EURUSD at 1.13388 done (based on order #87906853)

До начала следующих суток советник отдыхает.

Последние 2 строки логфайла за 21.06

OD      0       23:09:20.196    Network '3265046': scanning network for access points
NR      0       23:09:33.496    Network '3265046': scanning network finished

и начало лога за 22.06

PM      1       02:13:39.422    Network '3265046': connection to MetaQuotes-Demo lost
GF      2       02:13:39.582    MQL5.community  authorization failed
DO      2       02:13:39.682    MQL5.community  authorization failed
IP      2       02:13:40.052    MQL5.community  authorization failed
PK      0       02:13:43.252    Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms)
DI      0       02:13:43.252    Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
Support Team 2016.06.22 08:36

Если у вас одновременно и NewDay, и NewHour распечатываются принтом, то в логах они должны быть рядом, друг за другом. С одним и тем же временем

А у вас в логах они не только от разных экспертов (EURUSD и USDJPY) но вообще с разным временем
И заявку закрыли...
Alexey Viktorov 2016.06.22 11:25

Простите за беспокойство, на время я и не обратил внимания. Но!!! Тогда почему при появлении первого бара нового дня, он-же и первый бар нового часа и новой минуты одна и та-же функция возвращает кому-то true кому-то false а когда захочет может вернуть всем всё правильно?

Разъясните пожалуйста что в этой функции может быть не так?

/*****************Определение появления нового бара******************/
class cNewBar
{
   public:
bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld)
 {
  datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE);
   if(tNew > m_tOld)
    {
     m_tOld = tNew;
     return(true);
    }
   return(false);
 }
};
/********************************************************************/
Почему так могло случиться, что не одну неделю всё работало исправно и вдруг вот такая беда???
УБЕДИТЕЛЬНО ПРОШУ ВОЗДЕРЖАТЬСЯ ОТ ОЦЕНКИ ИСПОЛЬЗОВАНИЯ ТАКОГО КЛАССА.

Support Team 2016.06.22 11:31

Эта функция не может использоваться многократно из-за

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Что-то я вчера не сразу сообразил... Ведь в переменную m_tOld передаётся переменная по ссылке которая объявлена на уровне глобальных переменных и никак не должна влиять на многократный вызов если в функцию передаются по ссылке разные переменные. Разве не так? Это во-первых, а во-вторых - почему-же в тестере и дебаге всё отрабатывает правильно, а на демосчёте так чудит, то отрабатывает, то нет.

Support Team 2016.06.23 10:24

А вот эта проверка?

   if(tNew > m_tOld)


Support Team 2016.06.23 10:24

Вызовите Вашу функцию 2 раза подряд. Если в первый вызов она возвратит true, то в следующий вызов она возвратит false, несмотря на то, что Вы её вызываете на том же самом тике


Alexey Viktorov 2016.06.23 10:36

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

При всём при том, сейчас не сохранился, советник использующий такую-же функцию на mql4, но проблем не возникало. Эта проблема вылезла только на mql5.

Alexey Viktorov 2016.06.23 10:41


И что? Ну проверка... Ведь перед проверкой переменной tNew присваивается значение и оно сравнивается с переменной переданной по ссылке, а не с самой переменной m_tOld а она, эта m_tOld может иметь значение времени предыдущего бара указанного периода, или 01.01.1970 если это первый вызов. И только на следующем тике для каждого периода будет сравниваться значения одного и того-же бара.

Alexey Viktorov 2016.06.23 10:57


Обратите внимание, в функцию передаются разные переменные и разные периоды

      newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay);
   

       newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);


И ВСЁ... После этого полный игнор. Спасибо что сразу ответили без задержки, но ответа вразумительного так и не последовало. Если есть баг в mql5 то можно-же просто написать типа "разбираемся, ждите"... А так, получается просто игнорирование проблемы.

Аналогичной функцией в mql4 определялось изменение времени кратно 15 секундам, а в mql5 вдруг такая проблема...

 

Вот что значит неправильная организация наблюдения при проведении эксперимента.

 
Дмитрий, опять началось? Может проще ответить на вопрос "Почему 21.06.2016 ордера открылись без проблем, а 22.06.2016 вдруг неправильная организация наблюдения" или какие-то другие проблемы...
 
Alexey Viktorov:
...

Чтобы ответить - нужен код. У вас отрывки кода. Сделайте минимальный код - такой, чтобы любой человек мог запустить у себя этот код. 

Хорошо бы ещё в коде принтовать значения переменных - на входе в функцию и на выходе из функции. 


 
Alexey Viktorov:
Дмитрий, опять началось? Может проще ответить на вопрос "Почему 21.06.2016 ордера открылись без проблем, а 22.06.2016 вдруг неправильная организация наблюдения" или какие-то другие проблемы...
Если отвечу просто прямо и как есть, меня, скорее всего, за это забанят.
 
Dmitry Fedoseev:
Если отвечу просто прямо и как есть, меня, скорее всего, за это забанят.
навсегда...
 
Alexander Bereznyak:
навсегда...

Прям даже спать покоя нет, так сильно мечтается?

А смысл? Ведь, вы от этого не поумнеете.

Прикольно жить наверно, когда смысл жизни - ненависть? А? 

 
Karputov Vladimir:

Чтобы ответить - нужен код. У вас отрывки кода. Сделайте минимальный код - такой, чтобы любой человек мог запустить у себя этот код. 

Хорошо бы ещё в коде принтовать значения переменных - на входе в функцию и на выходе из функции. 


Не вопрос.

Но обратите внимание, что проблем не возникало и вдруг... с чего-бы? Кроме отрывков кода есть логи в которых видно что 21.06.2016 и до этого не одну неделю отрабатывало как и должно быть, но вот 22.06.2016 вдруг появились проблемы. Перед тем как написать в СД я неоднократно прогнал в тестере, дебаге по истории и никаких проблем не обнаружено.

Потому и сомневаюсь в полезности выкладывания кода. Разве что для развлечения.

#property strict

datetime oldDay, oldHour;
MqlDateTime mqlDateTime;
/*******************Expert initialization function*******************/
int OnInit()
{
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
  bool newDay, newHour;
   TimeToStruct(TimeCurrent(), mqlDateTime);
    if((int)mqlDateTime.hour == 0)
     {
      newDay = IsNewBar(_Symbol, PERIOD_D1, oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке
   if(newDay)
    Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true
       newHour = IsNewBar(_Symbol, PERIOD_H1, oldHour); // А это совсем другая переменная
    if(newHour)
     Print("***** newHour ", newHour); // Судя по распечатке newHour = true
        if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ.
         {
          Print("Ордер должен откыться. ");
         }
     }
}/*******************************************************************/

/*****************Определение появления нового бара******************/
bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld)
 {
  datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE);
   if(tNew > m_tOld)
    {
     m_tOld = tNew;
     return(true);
    }
   return(false);
 }
/********************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
 

Раз автор не желает, попробую я:

//+------------------------------------------------------------------+
//|                                                   test_1Vc2f.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   bool openNew,newDay,newHour;
//---
   newDay=IsNewBar(_Symbol,PERIOD_D1,oldDay); // 
   if(newDay)
      Print("***** newDay ",newDay," mqlDateTime.hour ",mqlDateTime.hour); // Судя по распечатке newDay = true
   newHour=IsNewBar(_Symbol,PERIOD_H1,oldHour);
   if(newHour)
      Print("***** newHour ",newHour); // Судя по распечатке newDay = true
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe,datetime &m_tOld)
  {
   datetime tNew=(datetime)SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE);
   if(tNew>m_tOld)
     {
      Print("in: m_tOld = ",m_tOld);
      m_tOld=tNew;
      Print("out: m_tOld = ",m_tOld);
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+

 

Осталось решить, что есть за структура "mqlDateTime" и где объявлять переменные "oldDay" и "oldHour"...

 
Karputov Vladimir:

Раз автор не желает, попробую я:

Осталось решить, что есть за структура "mqlDateTime" и где объявлять переменные "oldDay" и "oldHour"...

Все ответы постом выше.
Причина обращения: