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

 

Здравствуйте, столкнулся с проблемой, что CopyTicks и CopyTicksRange в тестере не могут получить данные у других инструментов.. При добавлении на график, все работает.

Билд 2363 (и на 2361 тож самое было)

Может я ошибку допустил? Прошу помощи, спасибо!

#property copyright "Copyright 2020, LittleBitTime"
#property link      "https://login.mql5.com/ru/users/LittleBitTime"
#property version   "1.00"

int OnInit() {
   return INIT_SUCCEEDED;
}

void OnDeinit(const int reason) {
}

void OnTick() {
   MqlTick LastTick;
   if (SymbolInfoTick(Symbol(), LastTick)) {
      //Print("START");
      
      if (GetTicks("RTS-3.20", LastTick.time_msc) && GetTicks("RTS-6.20", LastTick.time_msc)) {
         Print("История загружена");
      } else {
         Print("Ошибка загрузки истории");
      }
      //Print("END");
   } else {
      Print("Ошибка получения последнего тика, для получения последнего известного времени");
   }
}

bool GetTicks(string symbol, ulong TimeEnd) {
   ulong TimeStartPeriod = TimeEnd-(60*1000);
   
   MqlTick ticks[];
   bool success = false; //флаг успешного выполнения копирования тиков
   uint start = GetTickCount(); //замерим время старта перед получением тиков
   
   int received = CopyTicksRange(symbol, ticks, COPY_TICKS_ALL, TimeStartPeriod, TimeEnd);
   if (received != -1) {
      //выведем информацию о количестве тиков и затраченном времени времени
      PrintFormat("%s: received %d ticks in %d ms", symbol, received, GetTickCount()-start);
      //если тиковая история синхронизирована, то код ошибки равен нулю
      if (GetLastError() == 0)
         success = true;
      else
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", symbol, received, GetTickCount()-start, _LastError);
   }
   
   if (!success) {
      PrintFormat("Ошибкаp загрузки тиков! " + symbol);
      
      return false;
   }
   
   
   return true;
}
Файлы:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime:

Здравствуйте, столкнулся с проблемой, что CopyTicks и CopyTicksRange в тестере не могут получить данные у других инструментов.. При добавлении на график, все работает.

Билд 2363 (и на 2361 тож самое было)

Может я ошибку допустил? Прошу помощи, спасибо!

CopyTicks не инициирует закачку данных в тестере

Запросите сначала CopyRates нужного инструмента. Хотя бы 1 бар. Тогда произойдёт закачка и генерация тиковой последовательности.

После этого спокойно запрашивайте тики

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 
Ilyas:

Спасибо за сообщение.
Код ArrayResize имеет защиту от пустого вызова (когда нет изменения количества элементов), поэтому код функции не отрабатывает.
Тогда как реальное изменение количества элементов, заставляет сработать ту или часть функции ArrayResize, в зависимости от массива

Благодаря представленному Вами коду, мне удалось свести сложность одной из частей ArrayResize к нулю, это ускорит работу функции для массивов объектов

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

МТ5 (build 2363):

#define K 1000
#define M (1000 * K)

#define   SpeedTest(test_count,msg,EX)        {uint mss=GetTickCount(); ulong count=test_count;for(ulong ii=0;ii<count&&!_StopFlag;ii++){EX;} \
                                              printf("%-60s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
                                              
class A{
public:
   int data;
};


template<typename T>
void test1(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize all",
   {
      T class_array[];
      ArrayResize(class_array, array_size);
   }
   )
};

template<typename T>
void test2(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize one by one with reserved memory",
   {
      T class_array[];
      ArrayResize(class_array, 1, array_size - 1);
      for(int i = 2; i <= array_size; i++){
         ArrayResize(class_array, i);
      }
   }
   )
};

template<typename T>
void test3(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize one by one with new operator",
   {
      T* class_array[];
      ArrayResize(class_array, array_size);
      for (int i = 0; i < array_size; ++i){
         class_array[i] = new T();
      }
      for (int i = 0; i < array_size; ++i){
         delete class_array[i];
      }
   }
   )
};


void OnStart()
{
  const int test_count = 1*K;
  const int array_size = 25*K;  
  
   printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
   test1<A>(test_count, array_size);              // Avg time: release( 730) / debug( 830)
   test2<A>(test_count, array_size);              // Avg time: release(1540) / debug(1720)
   test3<A>(test_count, array_size);              // Avg time: release(1200) / debug(1470)
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
}
  
 
Slava:

CopyTicks не инициирует закачку данных в тестере

Запросите сначала CopyRates нужного инструмента. Хотя бы 1 бар. Тогда произойдёт закачка и генерация тиковой последовательности.

После этого спокойно запрашивайте тики

Спасибо большое, помогло. А в документации этого я не нашел.. Или плохо искал? Не плохо было бы об этом там написать :)
 
LittleBitTime:
Спасибо большое, помогло. А в документации этого я не нашел.. Или плохо искал? Не плохо было бы об этом там написать :)

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

 

Почистил вчера в профиле список "старых" неактивных агентов

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

Причем, изменена дата создания и активности агентов

Есть предположение(возможно ошибочное), что список восстанавливается после просмотра статистики агентов на cloud.mql5.com
 
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 удалось свести от логарифма к нолю