Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - страница 6

 
Ilyas #:

Достигнуто максимальное количество объектов DB (32766)

Вам необходимо проверить свой код на утечку хендлов DB, скорее всего не удалются объекты запросов после их выполнения

Спасибо, совет помог. Моя вина была - не финализировал SQL запросы... Вопрос ещё такой. А при закрытии БД хэндлы автоматически удаляются? Утечки не будет как с динамическими указателями?

 

FreezeLevel не показывается в спецификации символа.

Слева спецификация Терминала, справа - Тестера. Слева нет FreezeLevel.


Скрипт в терминале показывает наличие ненулевого FreezeLevel.

void OnStart()
{
  Print(SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL));
}


2023.01.16 17:04:43.765 Test5-3 (AUDUSD,M1)     3
Строка для поиска: Uluchshenie 055.
 
Feature request для сайта, сделайте возможность поиска по отдельной теме, машинное обучение уже и за год не перелопатить.
 
OrderSend возвращает неправильный тикет
OrderSend возвращает неправильный тикет
  • 2023.01.17
  • www.mql5.com
После прочтения свежей темы задумался о теоретической возможности там сказанного, когда OrderSend на разных терминалах одного счета получили один и...
 

@Ilyas, подскажите пож-ста по базам данных. Или есть баг со временными таблицами...

Создаю БД company.sqlite из примера (только без флага DATABASE_OPEN_COMMON): https://www.mql5.com/ru/docs/database/databasereadbind

Добавляю в редакторе ещё 2 таблицы:

1) CREATE TABLE contacts (
        contact_id INTEGER PRIMARY KEY,
        first_name TEXT NOT NULL,
        last_name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE,
        phone TEXT NOT NULL UNIQUE);

2) CREATE TABLE groups (
   group_id INTEGER PRIMARY KEY,
   name TEXT NOT NULL);

Запрашиваю список таблиц командой:

Всё работает.

В редакторе создаю пару временных таблиц:

CREATE TEMPORARY TABLE TEMP_TABLE1 AS 
SELECT 
  NAME,
  ADDRESS
FROM COMPANY

CREATE TEMPORARY TABLE TEMP_TABLE2 AS 
SELECT 
  ID,
  AGE
FROM COMPANY

Запрашиваю список таблиц командой:

Редактор видит временные таблицы. Всё ок.

Но таблица не видна, когда обращаемся к ней в коде. В моём примере это "TEMP_TABLE1".

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string filename="company.sqlite";
   uint flags=0;
   int db = ::DatabaseOpen(filename, flags);
   if (db == INVALID_HANDLE )
     {
      ::Print("DB: ", filename, " open failed with code ", ::GetLastError());
      return;
     }
//--- Real table
   string sql_request="SELECT name FROM sqlite_schema "
                      "WHERE type ='table' AND name NOT LIKE 'sqlite_%';";
   if(!::DatabaseExecute(db, sql_request))
     {
      ::Print("DB: ", filename, " create table failed with code ", GetLastError());
      ::DatabaseClose(db);
      return;
     }
   long printed_rows=::DatabasePrint(db, sql_request, 0);
   string table_name="COMPANY";
   string str_to_print=::StringFormat("PRAGMA TABLE_INFO(%s);", table_name);
   printed_rows=::DatabasePrint(db, str_to_print, 0);
//--- Temporary table
   sql_request="SELECT name FROM sqlite_temp_master;";
   if(!DatabaseExecute(db, sql_request))
     {
      Print("DB: ", filename, " create table failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }
   printed_rows=::DatabasePrint(db, sql_request, 0);
   table_name="TEMP_TABLE1";
   str_to_print=::StringFormat("PRAGMA TABLE_INFO(%s);", table_name);
   printed_rows=::DatabasePrint(db, str_to_print, 0);
   ::DatabaseClose(db);
  }
//+------------------------------------------------------------------+


После выполнения скрипта в журнале есть только такие строки:

list_tables (EURUSD,H1) #| name    
list_tables (EURUSD,H1) -+---------
list_tables (EURUSD,H1) 1| COMPANY  
list_tables (EURUSD,H1) 2| contacts 
list_tables (EURUSD,H1) 3| groups   
list_tables (EURUSD,H1) #| cid name    type     notnull dflt_value pk
list_tables (EURUSD,H1) -+-------------------------------------------
list_tables (EURUSD,H1) 1|   0 ID      INT            1             1 
list_tables (EURUSD,H1) 2|   1 NAME    TEXT           1             0 
list_tables (EURUSD,H1) 3|   2 AGE     INT            1             0 
list_tables (EURUSD,H1) 4|   3 ADDRESS CHAR(50)       0             0 
list_tables (EURUSD,H1) 5|   4 SALARY  REAL           0             0 
Документация по MQL5: Работа с базами данных / DatabaseReadBind
Документация по MQL5: Работа с базами данных / DatabaseReadBind
  • www.mql5.com
DatabaseReadBind - Работа с базами данных - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Denis Kirichenko #:

@Ilyas, подскажите пож-ста по базам данных. Или есть баг со временными таблицами...

На сколько я знаю, временная таблица "принадлежит" соединению (connection)

Т.к. соединения редактора и MQL программы разные, то временные таблицы созданные в одном, не доступны в другом.

 


Баг при тестировании советника на реальных тиках



 
Denis Kirichenko #:


Редактор видит временные таблицы. Всё ок.

Но таблица не видна, когда обращаемся к ней в коде.


И не должна быть видна, она же временная. 

SQLITE_TEMP_SCHEMA works just like SQLITE_SCHEMA except that it is only visible to the application that created the temporary tables.

 

b3563. После переключения на другой торговый сервер (без открытых чартов и сервисов) Терминал оставляет в работе реальные символы предыдущего торгового сервера и кастомные символы.

На картинке ситуация после переключения с RannForex-сервера на MetaQuotes-Demo. Открытых чартов нет. Чужие символы в рамке.



При этом реальные символы предыдущего торгового сервера попадают в соответствующую bases-папку нового торгового сервера.

На скрине MetaQuotes-Demo папка баров содержит несуществующий символ (реальный, с другого торгового сервера).


Строка для поиска: Uluchshenie 056.
 

Не могу понять баг это или фича:

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


input string   Input1="Hello world || my friend!";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

void s(string s)

{
   Print(s);
}


int OnInit()
  {
//---
   Print(Input1);
   s(Input1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Результат работы на реальных данных:

2023.01.20 12:19:05.555 Experts automated trading is enabled
2023.01.20 12:19:08.992 testinput (GBPUSD,H1)   Hello world || my friend!
2023.01.20 12:19:08.993 testinput (GBPUSD,H1)   Hello world || my friend!

Результат работы в тестере стратегий:

2023.01.20 12:22:56.246 USDJPY,M1: testing of Experts\testinput.ex5 from 2018.01.01 00:00 to 2022.05.01 00:00 started with inputs:
2023.01.20 12:22:56.246   Input1=Hello world 
2023.01.20 12:22:56.268 2018.01.01 00:00:00   Hello world 
2023.01.20 12:22:56.268 2018.01.01 00:00:00   Hello world 

То есть в тестере стратегий входная строка обрезается по подстроке "||".  


И второй вопрос, если это баг то куда сообщать, чтоб его исправили? )))