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

 
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 парах и все будет понятно. Выложу здесь...

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

 
Alexey Viktorov #:

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

Вот эксперт. Он создает базу (если уже нет) и раз в секунду пишет в нее текущее время.
В коде нет ни одного Print().
Запустил на 10 парах, пошли ошибки:

CS      2       11:44:36.561    Test_DB (EURUSD,M10)    database error, database is locked
CS      2       11:55:27.018    Test_DB (BTCUSD,M10)    database error, database is locked
CS      2       11:55:28.026    Test_DB (BTCUSD,M10)    database error, database is locked
CS      2       11:55:49.177    Test_DB (TRXUSD,M10)    database error, database is locked
CS      2       11:55:51.183    Test_DB (EURUSD,M10)    database error, database is locked
CS      2       11:55:53.182    Test_DB (TRXUSD,M10)    database error, database is locked

Что бы получить ошибку надо закрыть и заново запустить MT5 тогда все эксперты начинают работать синхронно.

Хорошо бы:
1. Понять как избавиться от вывода этой ошибки.
2. Придумать шаблонный механизм который бы ставил в очередь в случае недоступности базы.

п.2 я решил тем, что добавил Sleep() с рандомным временем, но это похоже на костыль.

UPDATE: перезалил фаил, первый был с ошибкой

Файлы:
Test_DB_1.mq5  3 kb
 
Evgeny Dyuka #:

Вот эксперт. Он создает базу (если уже нет) и раз в секунду пишет в нее текущее время.
В коде нет ни одного Print().
Запустил на 10 парах, пошли ошибки:

Что бы получить ошибку надо закрыть и заново запустить MT5 тогда все эксперты начинают работать синхронно.

Хорошо бы:
1. Понять как избавиться от вывода этой ошибки.
2. Придумать шаблонный механизм который бы ставил в очередь в случае недоступности базы.

п.2 я решил тем, что добавил Sleep() с рандомным временем, но это похоже на костыль.

UPDATE: перезалил фаил, первый был с ошибкой

Увы, моих знаний не хватает. Хватило только на то, чтобы понять, что ошибка печатается 

      DatabaseExecute(db, sql);

Возможность проверить доступность перед созданием запроса, увы отсутствует.

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

 
Не открываются ордера на сервере, стопов и тейков нет, режимы алго включены и команда на установку проходит, а журналы молчат CTrade class . В тестере работает на реальной торговле молчок. Что проверить? 
 
mwwm #:
Не открываются ордера на сервере, стопов и тейков нет, режимы алго включены и команда на установку проходит, а журналы молчат CTrade class . В тестере работает на реальной торговле молчок. Что проверить? 

журнал терминала

 
Vladimir Deryagin #:

журнал терминала

Догадался включил логи, не может лот рассчитать. Не понимаю почему на реале не хочет считать?

void OpenBuy(const int index,double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);
   double long_lot=0.0;
   if(InpLotOrRisk==risk)
     {
      long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,", OK: ","sl=",DoubleToString(sl,m_symbol.Digits()),
               ", CheckOpenLong: ",DoubleToString(long_lot,2),
               ", Balance: ",    DoubleToString(m_account.Balance(),2),
               ", Equity: ",     DoubleToString(m_account.Equity(),2),
               ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
      if(long_lot==0.0)
        {
         ArrayRemove(SPosition,index,1);
         if(InpPrintLog)
            Print(__FILE__," ",__FUNCTION__,", ERROR: ","CMoneyFixedMargin.CheckOpenLong returned the value of 0.0");
         return;
        }
     }
 
mwwm #:

Догадался включил логи, не может лот рассчитать. Не понимаю почему на реале не хочет считать?

Логов нет, поэтому догадок может быть в разы больше.

Как вариант, при торговле кроссами если в обзоре рынка не выбрана пара с валютой депозита, торговать не будет.

Например торгуем EURJPY, валюта депозита USD, в обзоре рынка должны присутствовать EURUSD  и  USDJPY.