Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1445

 
Aleksandr Slavskii #:

Вроде fxsaber где то выкладывал батник и описание как им пользоваться, но где и как я не помню.

Если не ошибаюсь, то батник надо положить в папку терминала C:\Users\имя пользователя\AppData\Roaming\MetaQuotes\Terminal\E98C5173D8A802F9B8F133E800FDDE2B 

И запускать  батник каждый раз перед запуском терминала.

Решение не особо удобное, но если нет другого, то ...


Блин. Сначала выложил, а потом увидел, что батник для запрета логов в тестере. 

Ну извините, ничем помочь не могу.

я думал где то галочку поставить и все ))
в общем, надо смириться,
спасибо за ответ
 
Evgeny Dyuka #:
я думал где то галочку поставить и все ))
в общем, надо смириться,
спасибо за ответ

Вы сами писали тот код? Может покажете кусок кода как вызывается db и несколько строк после вызова. Что-то мне кажется, что там написано печатать об ошибке…

 
Alexey Viktorov #:

Вы сами писали тот код? Может покажете кусок кода как вызывается db и несколько строк после вызова. Что-то мне кажется, что там написано печатать об ошибке…

Задача каждые 10 сек писать в базу текущее время. Делает это один и тот же эксперт, но на 4 графиках.
Что бы развести их по времени прикрутил костыль в виде Sleep() рандомное время - от 0 до 3 секунд.
И по 10 попыток подключится.
Лог показал, что максимум на второй попытке все получается, т.е. в целом работает надежно.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void db_update_lastseen(string symbol)
  {
   string comm = "UPDATE LastSeen SET utime='" +
                 IntegerToString((int)TimeGMT()) +
                 "' WHERE who='mt5' AND symbol='" + symbol + "'";
   if(!db_exe("db_update_lastseen", comm))
      Telegram("⚠MT5 DB ERROR db_update_lastseen() " + symbol, DevChannel);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool db_exe(string who, string comm, bool readonly = false)
  {
   ResetLastError();
   int count = 0;
   bool repeat = true;
   int dbmt = INVALID_HANDLE;
   while(repeat)
     {
      count++;
      Sleep((int)((float)MathRand() / 10));
      if(count > 10)
        {
         Print("DB: " + who + " failed with code ", GetLastError(), " DatabaseOpen ", " count: ", count);
         return false;
        }
      if(readonly)
         dbmt = DatabaseOpen(path_to_db, DATABASE_OPEN_READONLY);
      else
         dbmt = DatabaseOpen(path_to_db, DATABASE_OPEN_READWRITE);
      if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }
      else
        {
         if(!DatabaseExecute(dbmt, comm))
           {
            DatabaseClose(dbmt);
            continue;
           }
         else
           {
            DatabaseClose(dbmt);
            return true;
           }
        }
     }
   DatabaseClose(dbmt);
   return false;
  }
 
Evgeny Dyuka #:
Задача каждые 10 сек писать в базу текущее время. Делает это один и тот же эксперт, но на 4 графиках.
Что бы развести их по времени прикрутил костыль в виде Sleep() рандомное время - от 0 до 3 секунд.
И по 10 попыток подключится.
Лог показал, что максимум на второй попытке все получается, т.е. в целом работает надежно.

Ну так вот строка которая печатается в журнал

         Print("DB: " + who + " failed with code ", GetLastError(), " DatabaseOpen ", " count: ", count);

Достаточно её закомментировать поставив впереди // или совсем удалить и все вопросы будут сняты, если нигде в другом месте нет другого Print();

 
Alexey Viktorov #:

Ну так вот строка которая печатается в журнал

Достаточно её закомментировать поставив впереди // или совсем удалить и все вопросы будут сняты, если нигде в другом месте нет другого Print();

Эта строка напечатается если с 10 попыток не получится.
Ошибку печатает сама функция.


 
Evgeny Dyuka #:

Эта строка напечатается если с 10 попыток не получится.
Ошибку печатает сама функция.


Понятно. Это печатается при попытке работать с db. Надо посмотреть есть-ли проверка валидности хендла db перед использованием базы. 

Вот вы вызвали функцию

void db_update_lastseen(string symbol)
  {
   string comm = "UPDATE LastSeen SET utime='" +
                 IntegerToString((int)TimeGMT()) +
                 "' WHERE who='mt5' AND symbol='" + symbol + "'";
   if(!db_exe("db_update_lastseen", comm))
      Telegram("⚠MT5 DB ERROR db_update_lastseen() " + symbol, DevChannel);
  }

Попытались открыть db, получили ошибку, отправили сообщение в телеграмм…

А где используете переменную dbmt там проверяете её значение? 

if(dbmt < 0)
// ничего делать нельзя. База не открыта…

или так

if(dbmt >= 0)
 {
  // Базу можно использовать.
 }
 
Alexey Viktorov #:

Понятно. Это печатается при попытке работать с db. Надо посмотреть есть-ли проверка валидности хендла db перед использованием базы. 

Вот вы вызвали функцию

Попытались открыть db, получили ошибку, отправили сообщение в телеграмм…

А где используете переменную dbmt там проверяете её значение? 

или так

Да, в db_exe() проверяю так и отправляю на повторную попытку. А db_exe() вернет False если 10 раз не получилось (ни разу не возвращал).
if(dbmt == INVALID_HANDLE)
        {
         DatabaseClose(dbmt);
         continue;
        }
Думаю, сама библиотека работы с базой шлет ошибку и, похоже, в ней нет обработки ситуации когда база залочена.
В Python такая проблема не возникает, видимо в нем заложено создание очереди и ожидание.

Спасибо за ответы.
 
Evgeny Dyuka #:
Да, в db_exe() проверяю так и отправляю на повторную попытку. А db_exe() вернет False если 10 раз не получилось (ни разу не возвращал).
Думаю, сама библиотека работы с базой шлет ошибку и, похоже, в ней нет обработки ситуации когда база залочена.
В Python такая проблема не возникает, видимо в нем заложено создание очереди и ожидание.

Спасибо за ответы.

1. Если хендл базы не получен, то базу закрывать не надо.

2. Если получен INVALID_HANDLE то зачем продолжать выполнение программы? Я думаю в этом случае лучше прервать, return

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

 
Alexey Viktorov #:

1. Если хендл базы не получен, то базу закрывать не надо.

2. Если получен INVALID_HANDLE то зачем продолжать выполнение программы? Я думаю в этом случае лучше прервать, return

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

Сделаю минимальный тестовый эксперт который будет каждую секунду обновлять запись в базе. Запустим его на 10 парах и все будет понятно. Выложу здесь...
 
Evgeny Dyuka #:
Сделаю минимальный тестовый эксперт который будет каждую секунду обновлять запись в базе. Запустим его на 10 парах и все будет понятно. Выложу здесь...

Интересно. Буду ждать…