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

Как правильно?

struct STRUCT
{
  template <typename T>
  void operator []( int ) {}
};

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
вопрос еще такой есть - я так понимаю,что на МТ5 время первого копирования буфера того же CopyClose зависит от:

1. если ранее не получали котировки по тикеру совсем,не открывали чарт и т.п. (зависит от пинга,скорости интернета, жесткого диска,подготовка файла Bases/Брокер/history/тикер/caсhe/)

2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 0  время= 8355581
2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 1  время= 1083

2. если ранее котировки получали , и затем терминал был перезагружен, при условии,что не открыт чарт этого тикера (подготовка файла Bases/Брокер/history/тикер/caсhe/)

2017.04.11 11:29:14.672 время копирования буфера (EURUSD,M1)    проход = 0  время= 599396
2017.04.11 11:29:14.734 время копирования буфера (EURUSD,M1)    проход = 1  время= 259
/////////////////////////////
2017.04.12 19:32:46.489 время копирования буфера (FULT,M5)      проход = 0  время= 98167
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 1  время= 155
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 2  время= 14

время в 10-15 раз меньше,чем п.1


для сравнения время доступа в МТ4 по п.2,т.е. после перезагрузки терминала

2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 2  время= 276
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 1  время= 434
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 0  время= 2260
2017.04.12 19:30:38.816 время копирования буфера EURUSD,M1: initialized
2017.04.12 19:30:38.666 время копирования буфера EURUSD,M1 inputs: Pair=USDCAD;

т.е. в МТ4 время после перезагрузки терминала на порядки меньше.

В этот раз проверялось все на винде,без SSD!

3. если котировки получали, терминал не перезагружали,обращение к данным были

2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 0  время= 89
2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 1  время= 42

я правильно понимаю тогда, что подготовив кэш,терминал при последующих обращениях (начиная со 2 обращения) затрачивает на порядки меньше времени?

можно ли как-то уменьшить время первого обращения после перезагрузки терминала,чтобы было как в МТ4?

код был в https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
kaus_bonus:
вопрос еще такой есть - я так понимаю,что на МТ5 время первого копирования буфера того же CopyClose зависит от:

У вас очень грязный метод тестирования, так как вообще нет никаких описаний окружения и метода воспроизведения.

Не указаны:

  • лимиты баров в окне
  • фактические объемы данных в базах терминалов
  • какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.
  • платформа и битность тестирования (под вайном? нужно указывать детально)
  • наличие открытых окон

Без этого выводы голословны.


Для примера посмотрите на EURUSD M1 - у МТ5 там больше 6 млн баров (если режим unlimited у чартов), а у МТ4 сколько? Пару десятков тысяч М1 баров в базе данных по факту?
Renat Fatkhullin:

У вас очень грязный метод тестирования, так как вообще нет никаких описаний окружения и метода воспроизведения.

Не указаны:

  • лимиты баров в окне

  • фактические объемы данных в базах терминалов
  • какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.
  • платформа и битность тестирования (под вайном? нужно указывать детально)
  • наличие открытых окон

Без этого выводы голословны.


в общем-то ответы на большинство вопрсов были в моем посте,не вопрос,сейчас все данные дам.

для начала ответ на 

какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.

сервер MQ-demo, данные загружены,т.к. речь идет о п.2 и п.3. в предыдущем посте. С пунктом 1 все понятно, и вопросов там нет - как и было написано - подгружаются данные,формируется кэш по указанному пути.

лимиты баров в окне

МТ4

МТ5

фактические объемы данных в базах терминалов

MT4

MT5

платформа и битность тестирования (под вайном? нужно указывать детально)

win XP 32bit, билды МТ все последние

наличие открытых окон

МТ4 - открыт 1 чарт, проверку делаем по другому символу

МТ5 - открыт 1 чарт, проверку делаем по другому символу

еще раз, перезагружаем терминал, кидаем скрипт на чарт,выбираем ДРУГОЙ символ,данные по которому были загружены ДО перезагрузки терминала

МТ4

2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 2  время= 36
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 1  время= 282
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 0  время= 1871
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: initialized
2017.04.12 21:18:31.405 время копирования буфера EURUSD,M1 inputs: Pair=GBPUSD; 

МТ5

2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 0  время= 303951
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 1  время= 29
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 2  время= 25

Вот мой тест с большими деталями и точнее:

Описание условий
 MetaTrader 4 build 1065
MetaTrader 5 x64 build 1580
Оборудование и операционка
Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz, RAM: 32 Gb, SSD Disk
Торговый сервер
MetaQuotes-Demo
MetaQuotes-Demo
Лимит баров на чартах в настройках
10 000
10 000
Лимит баров в истории в настройках 10 000 000
понятия об ограничении нет
Фактическое количество баров на диске у EURUSD, M1
 3.382 миллиона
6.538 миллиона
Проверяемый символ и период
EURUSD, M1
EURUSD, M1
Открытые графики
только GBPUSD, M1, на него же бросается скрипт
только GBPUSD, M1, на него же бросается скрипт
Результаты холодные, после старта терминала
#0 pass, 1000 records in 680 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

#0 pass, 1000 records in 113497 msc
#1 pass, 1000 records in 3 msc
#2 pass, 1000 records in 3 msc

Результаты теплые, второй запуск сразу после первого
#0 pass, 1000 records in 13 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc
 
#0 pass, 1000 records in 14 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

Файлы тестовые приложены, а все время в микросекундах (не миллисекундах, 1 миллисекунда = 1000 микросекунд).

Теперь выводы:

  1. Разница только в скорости начальной инициализации кеша чарта 0.6 мс МТ4 против 113 мс у МТ5

    Тут проблемы нет - поднятие всегда стоит ресурсов.
    Особенно в случае, когда используются концептуально разные архитектуры: у МТ5 более сложные кеши (cache\*.hc файлы строятся из исходных *.hcc) ради масштабирования + обязательный контроль полной синхронизации с серверными данными (бинарными *.hcc чанками).

  2. Повторные запросы показывают одинаковую скорость - по 2-3 микросекунды на копирование данных

    В реализации обоих терминалов нет провалов и все работает быстро.
Файлы:

Спасибо за ответ.

В общем результаты,как я и показывал в своих постах.

К тому же вас небольшой чит передо мной - SSD. я вооще тестил на обычном.

И все же результаты между МТ4 и МТ5 отличаются почти в 200 раз (из за  - обязательный контроль полной синхронизации с серверными данными ?? и пинга?).

Я как бы смирился еще до постинга тут,что это ,Скорей всего,особенность терминала.  Даже жить с этим можно, но в некоторых моментах сложно. Например,т.к. в МТ нет скринера рынка, то я накропал небольшой скрипт,который добавляет символы в обзор рынка,т.к. при этом цены доступны только через CopyClose, ни через SymbolInfoDouble,ни через MqlTick они не доступны,пока символ не добавлен в обзор, то соответственно запустив подобный скрипт после запуска терминала, он выполняется "бесконечно" долго,если запустить на очень большом колве. Это только как пример. 

kaus_bonus:

Спасибо за ответ.

В общем результаты,как я и показывал в своих постах.

К тому же вас небольшой чит передо мной - SSD. я вооще тестил на обычном.

Не чит, это одинаковые условия для обоих систем.


И все же результаты между МТ4 и МТ5 отличаются почти в 200 раз (из за  - обязательный контроль полной синхронизации с серверными данными ?? и пинга?).

Про 0.6 мс у МТ4 я еще разберусь. Там по всей видимости данные уже предподготовлены и поэтому эта цифра не показывает реальных расходов.

У МТ4 совсем другая идеология и на самом деле фоном терминал копирует огромный объем данных для каждого скрипта/эксперта на системном уровне вне MQL4 кода. Тем самым замеры из MQL4 чаще всего не показывают реальных расходов ресурсов на получение данных. Расходы конечно есть, но они на другом уровне - система берет их на себя.

Понятно, что механизм МТ4 (строить копии рыночных данных для каждого робота) нельзя применять, когда у тебя задача масштабируется на неограниченные потоки данных (глубокая история, десятки тысяч инструментов). Поэтому пришлось кардинально изменить и улучшить MQL5, избавившись от прямых доступов Open/High/Low/Close и перейдя на CopyXXX функции. С учетом объемов данных МТ5, строить копию EURUSD M1 на 6 миллионов баров для эксперта слишком накладно.

MT5/MQL5 везде использует стратегию загрузки данных по требованию без предварительных созданий копий, что означает бОльшую возможность замерить реальные расходы из MQL5 кода.

Поднять базу в память, проверить синхронизацию и подготовить кеши сложного объекта в МТ5 за 113 миллисекунд - это приемлемо.

kaus_bonus:

Например,т.к. в МТ нет скринера рынка, то я накропал небольшой скрипт,который добавляет символы в обзор рынка,т.к. при этом цены доступны только через CopyClose, ни через SymbolInfoDouble,ни через MqlTick они не доступны,пока символ не добавлен в обзор, то соответственно запустив подобный скрипт после запуска терминала, он выполняется "бесконечно" долго,если запустить на очень большом колве. Это только как пример. 

Инструменты не обязательно должны быть добавлены в обзор рынка, чтобы по ним получить историю. Любое обращение к данным символа вызывает фоновую синхронизацию данных.

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

Уже поставлена задача изменить эту стратегию и поднимать данные, не глубже 500 баров от самой далекой даты запроса. Это позволит безболезненно писать скринеры рынка.

fxsaber:

Как правильно?


Сами спросили, сами ответили:) Ну да, так и есть.
Алексей Тарабанов:

Сами спросили, сами ответили:) Ну да, так и есть.
Сокращенного вызова шаблонного оператора так и не увидел.