Ошибки, баги, вопросы - страница 2677

 
fxsaber:

Освобождаю, конечно. Сам терминал в кеше у себе хранит тики, которые мне не нужны во время работы.

Мне лучше потом на холодную эти тики снова поднять. Нужен механизм "остывания" Терминала.

не заметил

void OnStart()
  {
   Print("используется памяти до закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   MqlTick items[];
   ulong t0=GetMicrosecondCount();
   uint    count=CopyTicks(Symbol(),items,COPY_TICKS_INFO,0,100000000);
   t0=GetMicrosecondCount()-t0;
   Print ("Загружено за "+string(t0/1000)+" миллисекунд "+ (string)count+ " тиков");
   Print("используется памяти после закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   ArrayFree(items);
   Print("используется памяти после ArrayFree: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
  }


ЗЫ Печально, что в памяти тики хранятся в незапакованном виде размером 60 байт на каждый тик. Легко можно упаковать в 5 раз (~12 байт на тик)

 
Stanislav Korotky:

Лучше сделать автоматическую закачку как по CopyRates.

В данном случае неизвестен таймфрейм. Закачка инициируеися по запросу символа-периода.

Подумаем, что можно сделать

 
Nikolai Semko:

не заметил

Надо смотреть, что Терминал потребляет.

void OnStart()
  {
//   Print("используется памяти до закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   Print("используется памяти до закачки истории: "+string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+" Mb");
   MqlTick items[];
   ulong t0=GetMicrosecondCount();
   uint    count=CopyTicks(Symbol(),items,COPY_TICKS_INFO,0,1e7);
   t0=GetMicrosecondCount()-t0;
   Print ("Загружено за "+string(t0/1000)+" миллисекунд "+ (string)count+ " тиков");
//   Print("используется памяти после закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   Print("используется памяти после закачки истории: "+string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+" Mb");
   ArrayFree(items);
//   Print("используется памяти после ArrayFree: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   Print("используется памяти после ArrayFree: "+string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+" Mb");
  }


Результат на Терминале, который давно работает. Никакие советники/индикаторы не запущены. Два чарта, M1 бары за текущий год только.

используется памяти до закачки истории: 1043 Mb
Загружено за 11223 миллисекунд 10000000 тиков
используется памяти после закачки истории: 1675 Mb
используется памяти после ArrayFree: 1102 Mb

60Мб не высвободилось. Пустой Терминал потребляет больше гигабайта. Единственная возможность уменьшить потребление - перезагрузить Терминал.

 
Sergey Dzyublik:

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

МТ5 (build 2363):

Вышел в бету 2364 (к сожалению в нём есть ошибка компилятора для new T() внутри шаблона)

Вот логи вашего скрипта:

2020.03.19 10:39:45.784 Test (EURUSD,H1)        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
2020.03.19 10:39:46.765 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=984
2020.03.19 10:39:48.233 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1469
2020.03.19 10:39:49.944 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
2020.03.19 10:39:50.923 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=969
2020.03.19 10:39:52.392 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1484
2020.03.19 10:39:54.100 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
2020.03.19 10:39:55.079 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=985
2020.03.19 10:39:56.548 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1469
2020.03.19 10:39:58.258 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
2020.03.19 10:39:59.237 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=984
2020.03.19 10:40:00.705 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1469
2020.03.19 10:40:02.416 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
Видно, что ArrayResize для объектов стал работать быстре.

Ещё раз, сложность одной из частей функции ArrayResize удалось свести от логарифма к нолю
 
Ilyas:
Видно, что ArrayResize для объектов стал работать быстре.
Ещё раз, сложность одной из частей функции ArrayResize удалось свести от логарифма к нолю

Удалось на реальном проекте сравнил скорость работы массивов ArrayResizeReserve и ArrayOnNew для типа данных - класс с единственным полем int, количество записей 20М.

В MT5 (build 2363) по всем параметрам сравнения кроме одного ArrayOnNew оказался хуже за ArrayResizeReserve:

Доступ на чтение/запись (std::fill_n, std::copy, std::vector::clear): в 2-2.5 раз медленнее
Создание всех элементов сразу (std::vector::resize) для "холодной"/"горячей" памяти - в 1.1-1.2 раза медленнее
Создание всех элементов по одному (std::vector::push_back) для "горячей" памяти  - в 1.2 раза быстрее

 

эти ссылки в справке (эдитор) ведут на страницу ненайдену


 
Баг МТ5 (build 2363) Не соответствие приоритетов выполнения шаблонных функций в MQL в сравнении с шаблонными функциями в С++ (online: https://onlinegdb.com/HkNqBDZ88).
Проблема  возникает, когда первая функция "test" в качестве аргумента содержит полностью специализированный шаблонный базовый класс,
а вторая функция "test" перегружает первую, является шаблонной, и в качестве аргумента содержит неспециализированный шаблонный базовый класс.

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   A<B<int>>::test(bb);         //'test' - ambiguous call to overloaded function        
}
 
Всем здравия !! Вопрос : В общем ситуация такая : я на копьютере пользуюсь двумя платформами МТ4 и МТ5 , с МТ 4 подключилась на сигнал без проблем . А вот с МТ5 на другой сигнал   не получается . Счёт есть и и движение средств отображается , но в графе счета нет номера счета , И в панели терминала нет кнопки сигналы . И арендовав сервер vps мне пишет что нужна миграция , при этом кнопка миграция не срабатывает. Подскажите почему так .
 
Anna:
Всем здравия !! Вопрос : В общем ситуация такая : я на копьютере пользуюсь двумя платформами МТ4 и МТ5 , с МТ 4 подключилась на сигнал без проблем . А вот с МТ5 на другой сигнал   не получается . Счёт есть и и движение средств отображается , но в графе счета нет номера счета , И в панели терминала нет кнопки сигналы . И арендовав сервер vps мне пишет что нужна миграция , при этом кнопка миграция не срабатывает. Подскажите почему так .

Для MetaTrader 5 (для аренды встроенного в терминал виртуального хостинга) нужна 64-битная операционная система.

 

на Win 10 кто-нибудь подключает локальных агентов? 

попробовал подключить 2 ПК, удаленный агент постоянно ready-connecring-ready-connecring... задания не получает

посмотрел в брандмауэр вроде есть галки для Metatrader Agent , экспорт - импорт агентов через файл тоже видит порты и имя ПК

подозреваю, что  где то дополнительно порты нужно пробросить?

Причина обращения: