Terminal
- Изменен порядок отображения записей в журналах терминала и
MetaEditor. Ранее в начале журнала показывались самые свежие записи,
теперь — самые старые. Обратный порядок сортировки сделает чтение
журнала более удобным и привычным.
Кроме того, через контекстное меню журнала теперь можно скрыть столбцы "Время" и "Источник". - В торговой истории у ордеров и сделок закрытия позиций в режиме
хеджинга теперь показывается тикет закрытой позиции. Это облегчит поиск
парных операций открытия и закрытия.
- Исправлена ошибка, приводившая к копированию уровней SL/TP из
имеющейся позиции в новую позицию по тому же инструменту. Ошибка
проявлялась при использовании функций торговли одним кликом (например,
на графике, в окне "Обзор рынка") в режиме хеджинга.
- Исправлено отображение объектов-стрелок на экранах сверхвысокого разрешения (4К).
MQL5
- Добавлена функция ArrayPrint для вывода в журнал массивов простых типов и структур.
void ArrayPrint( const void& array[], // выводимый массив uint digits=_Digits, // количество десятичных знаков после запятой const string separator=NULL, // разделитель между значениями полей структуры ulong start=0, // индекс первого выводимого элемента ulong count=WHOLE_ARRAY, // количество выводимых элементов ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN );
ArrayPrint выводит в журнал не все поля массива структур – поля-массивы и поля-указатели объектов пропускаются. Для вывода всех полей такой структуры понадобится собственная функция массового вывода с желаемым форматированием.//--- выводит значения 10 последних баров MqlRates rates[]; if(CopyRates(_Symbol,_Period,1,10,rates)) { ArrayPrint(rates); Print("Проверка\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]"); for(int i=0;i<10;i++) { PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i, TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS), rates[i].open,rates[i].high,rates[i].low,rates[i].close, rates[i].tick_volume,rates[i].spread,rates[i].real_volume); } } else PrintFormat("CopyRates failed, error code=%d",GetLastError()); //--- пример вывода /* [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 Проверка [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume] [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 */
- Исправлена ошибка сложения строк вида S1=S2+S1
- Изменено поведение функции ArrayResize.
При передаче в качестве параметра reserve_size значения -1 функция
освобождает неиспользованную (зарезервированную) память, если при этом
не происходит увеличение размера массива. Изменение размера массива на 0
со значением reserve_size=-1 эквивалентно вызову ArrayFree. Новое
поведение позволяет оптимизировать использование памяти в
MQL5-программах.
void OnStart() { int arr[]; //--- сколько памяти использовано изначально Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- сколько памяти использовано для массива размером 1, но с резервом ArrayResize(arr,1,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- после увеличения массива размер используемой памяти не изменится за счет резерва ArrayResize(arr,1024*512,1024*1024); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- после уменьшения массива размер памяти также не изменится ArrayResize(arr,1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); //--- не используемая массивом память освободится за счет удаления резерва ArrayResize(arr,1,-1); Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB"); }
- В стандартную библиотеку добавлены функции для построения графиков.
Для использования включите файл MQL5\Include\Graphics\Graphic.mqh в свой
проект.
Построение графика из 3 серий данных при помощи GraphPlot:#include <Graphics/Graphic.mqh> double Func1(double x) { return MathPow(x,2); } double Func2(double x) { return MathPow(x,3); } double Func3(double x) { return MathPow(x,4); } void OnStart() { GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES); }
Результат:
Построение графика на основе массива данных при помощи GraphPlot:#include <Math/Stat/Binomial.mqh> #include <Graphics/Graphic.mqh> void OnStart(void) { double vars[101]; double results[101]; const int N=2000; //--- MathSequence(0,N,20,vars); MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results); ArrayPrint(results,4); GraphPlot(results); //--- }
Результат: - Обновлены функции работы с математической статистикой в стандартной
библиотеке. Проведена большая проверка качества и точности всех функций
как в MQL5-версии, так и в исходном языке R. Для контроля точности и
скорости работы вместе со статистической библиотекой распространяются
юнит-тесты. Они находятся в каталоге \MQL5\Scripts\UnitTests\Stat.
- TestStat.mq5 — основной тестовый скрипт для проверки результатов вычислений
- TestPrecision.mq5 — тест точности вычислений
- TestBenchmark.mq5 — тест с замером производительности вычислений
Tester
- Расширены настройки задержки исполнения торговых запросов при
тестировании. Теперь проверить торгового робота можно в еще большем
количестве разнообразных торговых условий: от идеального случая без
задержек до любой задержки, заданной пользователем.
Ранее был доступен только режим произвольных задержек. - Исправлена ошибка формирования тикового объема баров при тестировании в режиме OHLC на М1.
- Исправлено проставление времени открытия у ордеров и позиций с точностью до миллисекунд при торговле в режиме хеджинга.
- Исправлена ошибка "old tick" (тик устарел), появлявшаяся при мультивалютном либо мультитаймфреймовом тестировании в режиме реальных тиков.
- Ускорена работа функции CopyTicks в случае, когда запрошенные тики читались из базы на диске.
MetaEditor
- Команды работы с версионным хранилищем исходных кодов MQL5
Storage добавлены в контекстное меню файла в Навигаторе и на панель
инструментов.
- Исправлена ошибка, приводившая к нарушению целостности локальной базы MQL5 Storage при работе более чем с 1024 файлами в хранилище.
- Исправлены ошибки отображения дерева файлов MQL5 Storage.
- Исправлено отображение файла после массовой замены текста.
Обновлена документация.