Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 106

 
fxsaber:

Тестер, кастомные?

По всему фронту, включая системные оверхеды в тестере. Некоторые вещи ускоряем в разы.

Скоро мы представим новую модель тестера с совершенно другим интерфейсом.

 

Сохранение тиков в только что созданный кастомный символ одним куском

2019.01.15 22:46:52.993 ThirdPartyTicks (EURUSD,M1)     Saving Ticks...
2019.01.15 22:48:14.047 ThirdPartyTicks (EURUSD,M1)     Saved ticks = 26701144

длится больше минуты - 26 млн тиков.

 
fxsaber:

Сохранение тиков в только что созданный кастомный символ одним куском

длится больше минуты - 26 млн тиков.

Дайте полный код, пожалуйста.

Ускорим.

 
Renat Fatkhullin:

Выпустили бету 1971 с массой улучшений производительности.

Ура, заработало!

Спасибо.

 
Renat Fatkhullin:

Дайте полный код, пожалуйста.

Ускорим.

void OnStart()
{
  const string Name = "TESTER";
  MqlTick Ticks[];
      
  if ((ArrayResize(Ticks, 1e7) > 0) && CustomSymbolCreate(Name))
    Print(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));
}

Этот код не совсем тот - не дождаться конца выполнения. Попытка снятия скрипта приводит к длительному зависанию Терминала.

А если все свойства символа корректно задать и тики нормальные сделать - то это воспроизводит этот скрипт.

 
Спасибо, разберемся.
 

Немного поспешил радоваться :)

   long ChartId=ChartID();
   ObjectsDeleteAll(ChartId);
   string Name="Obj";
   uint Count=GetTickCount();
   for(int i=0; i<10000; i++)
      {
      if(ObjectFind(ChartId,Name)>=0) printf("Уже существует!");
      }
   printf("Время выполнения: "+IntegerToString(GetTickCount()-Count));   

Функция ObjectFind теперь работает быстрее, но всё равно значительно медленнее, чем до 1968

Сейчас в четвёрке время выполнения 0.

и функции ObjectGetInteger и ObjectGetString стали "поджирать" время

 
Renat Fatkhullin:

По всему фронту, включая системные оверхеды в тестере. Некоторые вещи ускоряем в разы.

Скоро мы представим новую модель тестера с совершенно другим интерфейсом.

Советник (только выставляет в OnInit заданное (Amount) количество позиций)

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inRange = 0;          // 1 .. 5
input int inAmount = 1;         // Amount of positions
input int iTakeProfit  = 10000; // TakeProfit in pips

uint iStartTime;

void OnInit()
{    
  const double Price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  
  for (int i = 0; i < inAmount; i++)
    OrderSend(_Symbol, OP_BUY, 0.1, Price, 100, 0, Price + iTakeProfit * _Point);
    
  iStartTime = GetTickCount(); // Начинается замер специально в OnInit, а не снаружи    
}

double OnTester()
{
  return(GetTickCount() - iStartTime);
}


Amount = 0

2019.01.15 23:34:23.184 Core 1  pass 0 returned result 10764.00 in 0:00:10.951
2019.01.15 23:34:23.184 Core 1  pass 1 started
2019.01.15 23:34:27.696 Core 1  pass 1 returned result 4462.00 in 0:00:04.509
2019.01.15 23:34:27.696 Core 1  pass 2 started
2019.01.15 23:34:31.823 Core 1  pass 2 returned result 4088.00 in 0:00:04.119
2019.01.15 23:34:31.823 Core 1  pass 3 started
2019.01.15 23:34:37.633 Core 1  pass 3 returned result 5725.00 in 0:00:05.803
2019.01.15 23:34:37.633 Core 1  pass 4 started
2019.01.15 23:34:41.550 Core 1  pass 4 returned result 3868.00 in 0:00:03.916
2019.01.15 23:34:41.550 Tester  optimization finished, total passes 5
2019.01.15 23:34:41.560 Statistics      optimization done in 0 minutes 30 seconds
2019.01.15 23:34:41.560 Statistics      shortest pass 0:00:03.916, longest pass 0:00:10.951, average pass 0:00:05.859
2019.01.15 23:34:41.560 Statistics      local 5 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)


Amount = 1

2019.01.15 23:20:59.851 Core 1  pass 0 returned result 15959.00 in 0:00:16.068
2019.01.15 23:20:59.851 Core 1  pass 1 started
2019.01.15 23:21:11.453 Core 1  pass 1 returned result 11559.00 in 0:00:11.606
2019.01.15 23:21:11.453 Core 1  pass 2 started
2019.01.15 23:21:22.423 Core 1  pass 2 returned result 10935.00 in 0:00:10.967
2019.01.15 23:21:22.423 Core 1  pass 3 started
2019.01.15 23:21:33.993 Core 1  pass 3 returned result 11513.00 in 0:00:11.560
2019.01.15 23:21:33.993 Core 1  pass 4 started
2019.01.15 23:21:45.126 Core 1  pass 4 returned result 11091.00 in 0:00:11.122
2019.01.15 23:21:45.127 Tester  optimization finished, total passes 5
2019.01.15 23:21:45.137 Statistics      optimization done in 1 minutes 02 seconds
2019.01.15 23:21:45.137 Statistics      shortest pass 0:00:10.967, longest pass 0:00:16.068, average pass 0:00:12.264
2019.01.15 23:21:45.137 Statistics      local 5 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)


Amount = 5

2019.01.15 23:22:52.868 Core 1  pass 0 returned result 38595.00 in 0:00:38.766
2019.01.15 23:22:52.868 Core 1  pass 1 started
2019.01.15 23:23:34.517 Core 1  pass 1 returned result 41574.00 in 0:00:41.636
2019.01.15 23:23:34.517 Core 1  pass 2 started
2019.01.15 23:24:05.763 Core 1  pass 2 returned result 31153.00 in 0:00:31.231
2019.01.15 23:24:05.763 Core 1  pass 3 started
2019.01.15 23:24:34.933 Core 1  pass 3 returned result 29126.00 in 0:00:29.173
2019.01.15 23:24:34.933 Core 1  pass 4 started
2019.01.15 23:25:03.608 Core 1  pass 4 returned result 28627.00 in 0:00:28.673
2019.01.15 23:25:03.609 Tester  optimization finished, total passes 5
2019.01.15 23:25:03.619 Statistics      optimization done in 2 minutes 50 seconds
2019.01.15 23:25:03.619 Statistics      shortest pass 0:00:28.673, longest pass 0:00:41.636, average pass 0:00:33.895
2019.01.15 23:25:03.619 Statistics      local 5 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)


Только один локальный Агент для замера использовался. Папка tester на виртуальном диске в ОЗУ. Режим по реальным тикам (Hedge), кастомный символ (чтобы кроссов избежать). Количество тиков

2019.01.15 23:27:42.769 Core 1  EURUSD.rann_RannForex,M1: 26469758 ticks, 324894 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:00:16.770 (including ticks preprocessing 0:00:04.914).


По логам видно, что 26.5 млн тиков "пустышка" проходит почти за 4 секунды. Быстро это или нет?


11 секунд для Amount = 1. И 28 секунд для Amount = 5. Такое замедление - нормально?


Дело в том, что сравнивал с другим "Тестером" и там такого сильного замедления не происходит. Подробности здесь.


ЗЫ Не могу понять, почему в Тестере такой сильный разброс по времени выполнения проходов. Почти в 1.5 раза.

 

Ошибка компиляции при кастинге структуры, содержащей сложные объекты:

struct A { string a; };

void OnInit()
{
  A a;
  (A)a; // '(' - invalid cast operation
  a=a; // А это работает. 
}

Почему копирование работает, а кастинг - нет?

 
Alexey Navoykov:

Ошибка компиляции при кастинге структуры, содержащей сложные объекты:

Почему копирование работает, а кастинг - нет?

А куда вы его кастили и как понимать эту строку?

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