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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Viktorov
26080
Alexey Viktorov  
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 вдруг такая проблема...

Dmitry Fedoseev
56925
Dmitry Fedoseev  

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

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

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

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


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

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

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

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

Alexey Viktorov
26080
Alexey Viktorov  
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("");
}/*******************************************************************/
Vladimir Karputov
Модератор
183309
Vladimir Karputov  

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

//+------------------------------------------------------------------+
//|                                                   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"...

Alexey Viktorov
26080
Alexey Viktorov  
Karputov Vladimir:

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

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

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