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

 
Это баг?
struct STRUCT
{
  int a;
  
  STRUCT() {} // Если закомментировать, ошибка пропадает
};

void OnStart()
{
  STRUCT Struct = {1}; // cannot be initialized with initializer list
}
 

баг при использовании стилизатора?

предположим,мы писали с использованием табуляции.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
   input int x=0;
   #define TWO_DIM (10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+

ошибок нет.

затем используем стилизатор,получаем

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int x=0;
#define TWO_DIM(10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+
'10000' - unexpected in macro formal parameter list     bug.mq5 7       17
'[' - invalid index value       bug.mq5 13      25

т.е. стилизатор подтирает пробел между TWO_DIM(10000)

 
Ошибка компиляции
template <typename T>
struct STRUCT
{
  template <typename T1>  
  STRUCT( T1 Value ) {} // 'STRUCT<int><int>' - declaration without type

};

void OnStart()
{
  STRUCT<int> Struct(0); // 'STRUCT<int>' - cannot to apply function template
}
 
Небольшой лайфхак. Обход оператора присваивания
template <typename T>
struct STRUCT_COPY
{
  T Value;
  
  STRUCT_COPY( const T& tValue)
  {
    this = (STRUCT_COPY)tValue;
  }  
};

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

#define PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  STRUCT Struct;  
  Struct.i = 1;  
  PRINT(Struct.i);
  
  STRUCT StructCopy1 = Struct;
  PRINT(StructCopy1.i);
  
  // Обходим void STRUCT::operator=(const STRUCT&)
  STRUCT_COPY<STRUCT> StructCopy2(Struct);
  PRINT(StructCopy2.Value.i);  
}

Результат

Struct.i = 1
StructCopy1.i = 5
StructCopy2.Value.i = 1
 

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

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 они не доступны,пока символ не добавлен в обзор, то соответственно запустив подобный скрипт после запуска терминала, он выполняется "бесконечно" долго,если запустить на очень большом колве. Это только как пример. 

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