Что нового в MetaTrader 5?

История обновлений десктопной, мобильной и веб-платформ

18 января 2017
MetaTrader 5 Android build 1506: фильтрация и сортировка сделок
  • Во вкладках "Торговля" и "История" появилась возможность сортировки по символам (финансовым инструментам), ордерам и времени торговых операций. Помимо сортировки в "Истории" вы можете также отфильтровать сделки по символу.

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


9 декабря 2016
MetaTrader 5 build 1495: Улучшения в MQL5 для работы с пользовательской графикой

MQL5

  1. Добавлена функция CopyTicksRange.
  2. В класс CCanvas добавлены улучшенные функции сглаживания:
  3. В документацию MQL5 добавлено описание графической библиотеки, с помощью которой можно быстро строить гистограммы, распределения и линейные графики прямо на ценовых чартах.
  4. В константы Состояние клиентского терминала добавлены идентификаторы состояния системных клавиш. Вызов TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) возвращает такой же код состояния клавиши, как и функция GetKeyState() из MSDN.
  5. Отключена поддержка приведения типа string к типу bool. Для проверки строк потребуется явно прописать условие. Например, для следующего кода в новой версии будет выдаваться ошибка компиляции:
    string str;
    ...
    if(str)                        // будет ошибка компиляции "Cannot convert type 'string' to 'bool'" (в предыдущих билдах ошибки не было)
       Print("str is true");
    Следует написать явное условие:
    string str;
    ...
    
    //--- проверка, инициализирована ли строка
    if(str!=NULL)
       Print("str is true");
    
    или
    
    //--- проверка, является ли значение строки "true"
    if(StringCompare(str,"true",false))
       Print("str is true");
    
    или
    
    //--- проверка, что строка является числом и не равна нулю
    if((int)str!=0)
       Print("str is true");

Исправления по крешлогам.

2 декабря 2016
Веб-платформа MetaTrader 5: двухфакторная авторизация и смена пароля
  • Для усиления защиты торговых счетов добавлена двухфакторная авторизация при помощи одноразовых паролей. Чтобы включить двухфакторную авторизацию, воспользуйтесь мобильным приложением MetaTrader 5. Авторизуйтесь и в окне "Настройки" откройте генератор One-time password (OTP). Привяжите к нему все свои торговые счета — и для каждого будет автоматически создаваться уникальный одноразовый пароль из шести цифр. Введите его при авторизации в веб-платформу. 

  • Добавлена возможность смены обычного и инвесторского паролей. Воспользуйтесь этой возможностью, чтобы создать удобный для запоминания персональный идентификатор.
  • Веб-платформа также получила автоматическую генерацию демо-счетов. Теперь вы можете зайти в MetaTrader 5 Web из любого браузера и немедленно начать торговать на Форексе, фондовой бирже, фьючерсами или CFD.
24 ноября 2016
MetaTrader 5 build 1485: дополнительные режимы тестирования и графика в стандартной библиотеке

Terminal

  1. Изменен порядок отображения записей в журналах терминала и MetaEditor. Ранее в начале журнала показывались самые свежие записи, теперь — самые старые. Обратный порядок сортировки сделает чтение журнала более удобным и привычным.



    Кроме того, через контекстное меню журнала теперь можно скрыть столбцы "Время" и "Источник".

  2. В торговой истории у ордеров и сделок закрытия позиций в режиме хеджинга теперь показывается тикет закрытой позиции. Это облегчит поиск парных операций открытия и закрытия.



  3. Исправлена ошибка, приводившая к копированию уровней SL/TP из имеющейся позиции в новую позицию по тому же инструменту. Ошибка проявлялась при использовании функций торговли одним кликом (например, на графике, в окне "Обзор рынка") в режиме хеджинга.
  4. Исправлено отображение объектов-стрелок на экранах сверхвысокого разрешения (4К).

MQL5

  1. Добавлена функция 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 
    */

  2. Исправлена ошибка сложения строк вида S1=S2+S1
  3. Изменено поведение функции 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");
      }

  4. В стандартную библиотеку добавлены функции для построения графиков. Для использования включите файл 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);
    //---
      }
    Результат:



  5. Обновлены функции работы с математической статистикой в стандартной библиотеке. Проведена большая проверка качества и точности всех функций как в MQL5-версии, так и в исходном языке R. Для контроля точности и скорости работы вместе со статистической библиотекой распространяются юнит-тесты. Они находятся в каталоге \MQL5\Scripts\UnitTests\Stat.

    • TestStat.mq5 — основной тестовый скрипт для проверки результатов вычислений
    • TestPrecision.mq5 — тест точности вычислений
    • TestBenchmark.mq5 — тест с замером производительности вычислений

Tester

  1. Расширены настройки задержки исполнения торговых запросов при тестировании. Теперь проверить торгового робота можно в еще большем количестве разнообразных торговых условий: от идеального случая без задержек до любой задержки, заданной пользователем.


    Ранее был доступен только режим произвольных задержек.

  2. Исправлена ошибка формирования тикового объема баров при тестировании в режиме OHLC на М1.
  3. Исправлено проставление времени открытия у ордеров и позиций с точностью до миллисекунд при торговле в режиме хеджинга.
  4. Исправлена ошибка "old tick" (тик устарел), появлявшаяся при мультивалютном либо мультитаймфреймовом тестировании в режиме реальных тиков.
  5. Ускорена работа функции CopyTicks в случае, когда запрошенные тики читались из базы на диске.

MetaEditor

  1. Команды работы с версионным хранилищем исходных кодов MQL5 Storage добавлены в контекстное меню файла в Навигаторе и на панель инструментов.



  2. Исправлена ошибка, приводившая к нарушению целостности локальной базы MQL5 Storage при работе более чем с 1024 файлами в хранилище.
  3. Исправлены ошибки отображения дерева файлов MQL5 Storage.
  4. Исправлено отображение файла после массовой замены текста.

Обновлена документация.

24 ноября 2016
MetaTrader 5 iOS build 1425
  • Улучшена панель торговли одним кликом на графике: теперь она доступна и при вертикальной ориентации смартфона, а объем сделок можно быстро менять, выбирая нужный из списка.

  • Теперь символ графика можно изменить нажатием на его имя в заголовке окна.
  • Улучшен раздел настроек приложения: добавлена информация о текущем счете, упорядочены разделы, улучшен дизайн.
  • Многочисленные улучшения и исправления.
14 октября 2016
MetaTrader 5 build 1455: Библиотеки математических функций в MQL5

Terminal

  1. Добавлены всплывающие подсказки для кнопок Buy, Sell и Close в диалогах торговли. Подсказки поясняют, какие именно активы будут куплены и проданы при выполнении той или иной операции, помогая начинающим трейдерам понять суть торгового процесса.




  2. Добавлены новые пиктограммы ордеров, сделок и позиций на вкладках "Торговля" и "История".




  3. Оптимизировано и значительно ускорено (до 4 — 5 раз) отображение и обновление стакана цен, тикового графика стакана цен и ленты сделок.
  4. Исправлена ошибка синхронизации тиковой истории в неторговое время. В некоторых случаях ошибка приводила к чрезмерному потреблению сетевого трафика.

MQL5

  1. В стандартную библиотеку включена MQL5-версия библиотеки численного анализа ALGLIB.

    Возможности библиотеки

    • Линейная алгебра
    • Решение систем уравнений — линейных и нелинейных
    • Интерполяция
    • Оптимизация
    • Быстрое преобразование Фурье
    • Численное интегрирование
    • Линейная и нелинейная аппроксимация по методу наименьших квадратов
    • Решение обыкновенных дифференциальных уравнений
    • Вычисление специальных функций
    • Описательная статистика и проверка гипотез
    • Анализ данных — классификация, регрессия
    • Реализация алгоритмов линейной алгебры, интерполяции и т.д. в арифметике высокой точности (с использованием MPFR)

    Как использовать

    Файлы библиотеки ALGLIB расположены в каталоге \MQL5\Include\Math\Alglib. Для использования функций включите основной файл библиотеки в свою программу:

    #include <Math\Alglib\alglib.mqh>

  2. В стандартную библиотеку включены функции работы с математической статистикой. Теперь в MQL5 доступны возможности языка R —  одного из лучших инструментов статистической обработки и анализа данных.

    Возможности библиотеки

    Статистическая библиотека содержит функции для расчета статистических характеристик данных, а также функции для работы со статистическими распределениями:

    • Функции для расчета статистических характеристик элементов массива
    • Функции для работы со статистическими распределениями: нормальное распределение, логнормальное распределение, бета-распределение и т.д.

    Как использовать

    Файлы статистической библиотеки расположены в каталоге \MQL5\Include\Math\Stat. Для использования включите файл с нужными функциями в свою программу, например:

    #include <Math\Stat\Binomal.mqh>
    #include <Math\Stat\Cauchy.mqh>
    

    Подробное описание функций библиотеки читайте в статье Статистические распределения в MQL5 - берем лучшее из R.


  3. В стандартную библиотеку включена MQL5-версия библиотеки Fuzzy, в которой реализованы системы нечеткого логического вывода Мамдани и Сугено.

    Возможности библиотеки

    • 13 функций принадлежностей
    • Гибкая форма написания правил для нечетких систем
    • Система нечеткого логического вывода Мамдани
    • Система нечеткого логического вывода Сугено
    • 5 методов дефаззификации для систем типа Мамдани
    • Неограниченное количество входных и выходных переменных

    Как использовать

    Файлы библиотеки Fuzzy расположены в каталоге \MQL5\Include\Math\Fuzzy. Для использования включите файл с нужными функциями в свою программу, например:

    #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
    #include <Math\Fuzzy\sugenofuzzysystem.mqh>
    

    Подробное описание библиотеки можно найти в Code Base: Fuzzy - библиотека для работы с нечеткой логикой


  4. Добавлено свойство CHART_QUICK_NAVIGATION для включения/отключения строки быстрой навигации на графике. Для изменения и получения состояния свойства используйте функции ChartSetInteger и ChartGetInteger.




    Строка вызывается нажатием клавиши Enter или Space. При помощи нее можно быстро переместиться к заданной дате на графике, переключить символ и таймфрейм. Если ваша MQL5-программа обрабатывает нажатия клавиш Enter или Space, отключите свойство CHART_QUICK_NAVIGATION, чтобы терминал не перехватывал эти события. При этом останется возможность вызова строки навигации двойным кликом мыши.

  5. Добавлены функции FileLoad и FileSave для легкого чтения и сохранения массивов в файлы. В отличие от FileRead* и FileWrite*, этим функциям не требуется хэндл файла. FileLoad и FileSave работают с массивами числовых типов, а также с простыми структурами, не имеющими строк, динамических массивов или объектов класса.
    long  FileLoad(
       const string filename,      // [in] имя файла
       void         &buffer[],     // [out] массив, в который считывается файл
       uint         common_flag=0  // [in] 0 - поиск файла в папке Files терминала, FILE_COMMON - в общей папке терминалов
       );
    
    bool  FileSave(
       const string filename,      // [in] имя файла
       const void   &buffer[],     // [in] массив, который сохраняется в файл
       uint         common_flag=0  // [in] 0 - создание файла в папке Files терминала, FILE_COMMON - в общей папке терминалов
       );
    Пример записи массива тиков в файл с последующим чтением этих данных:
    //--- входные параметры
    input int      ticks_to_save=1000; // количество тиков
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       string  filename=_Symbol+"_ticks.bin";
       MqlTick ticks[];
    //---
       int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
       if(copied!=-1)
         {
          PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
          //--- если тиковая история синхронизирована, то код ошибки равен нулю
          if(!GetLastError()==0)
             PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
          //---  запишем тики в файл
          if(!FileSave(filename,ticks,FILE_COMMON))
             PrintFormat("FileSave() failed, error=%d",GetLastError());
         }
       else
          PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
    //--- теперь прочитаем эти тики обратно из файла
       ArrayFree(ticks);
       long count=FileLoad(filename,ticks,FILE_COMMON);
       if(count!=-1)
         {
          Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
          for(int i=0;i<count;i++)
            {
             PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
             TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
             ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
            }
         }
      }

  6. Модифицировано отображение пользовательского индикатора с режимом рисования DRAW_CANDLES. Теперь для этого стиля можно задавать от одного до трех цветов, в зависимости от этого меняется внешний вид свечей.

    Если указан один цвет, все свечи на графике будут полностью окрашены этим цветом.
    //--- одинаковые свечи, окрашенные в один цвет 
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- указан только один цвет, поэтому все свечи будут одного цвета
    #property indicator_color1  clrGreen  
    Если указано два цвета, контуры свечи будут отрисовываться первым цветом, а тело — вторым цветом.
    //--- цвет свечей отличается от цвета теней
    #property indicator_label1  "Two color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- тени и контур свечей зеленого цвета, тело белого цвета
    #property indicator_color1  clrGreen,clrWhite 
    Если указано три цвета, контур свечи будет нарисован первым цветом, а цвет бычьей и медвежьей свечей будет задаваться вторым и третьим цветом.
    //--- цвет свечей отличается от цвета теней
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- тени и контур зелёного цвета, тело бычьей свечи белого цвета, тело медвежьей свечи красного цвета
    #property indicator_color1  clrGreen,clrWhite,clrRed
    Таким образом, с помощью стиля DRAW_CANDLES можно создавать собственные пользовательские варианты раскраски свечей. Все цвета можно также менять динамически в процессе работы индикатора с помощью функции PlotIndexSetInteger(индекс_построения_DRAW_CANDLES, PLOT_LINE_COLOR, номер_модификатора, цвет) , где номер_модификатора можеть иметь следующие значения:
    • 0 – цвет контура и теней
    • 1– цвет тела бычьей свечи
    • 2 – цвет тела медвежьей свечи
    //--- установим цвет контура и теней
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
    //--- установим цвет тела для бычьей свечи
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
    //--- установим цвет тела для медвежьей свечи
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
  7. Исправлен ряд ошибок и ускорена работа с тиковой историей при помощи функций CopyTicks.
  8. Разрешено использование операторов в интерфейсах.

Market

  1. Исправлена ошибка, в некоторых случаях приводившая к повторному запросу авторизации на MQL5.community при покупке в Маркете.

Tester

  1. Добавлен перевод пользовательского интерфейса на греческий язык, малайский язык и иврит.

Обновлена документация.

29 сентября 2016
Веб-платформа MetaTrader 5: оптимизация кода и новые возможности интерфейса
  • Добавлена возможность изменять размеры блоков веб-приложения — от "Обзора рынка" до окон с графиками котировок.
  • Стала доступна сортировка по столбцам во вкладках "Торговля" и "История" в окне "Инструменты". Ширину столбцов при этом можно менять.
  • В Market Watch добавлен инструмент быстрого выделения символа и вкладка "Детали".
  • Проведена оптимизация кода для ускорения общей работы веб-терминала — инициализация счета, выделение символов и сама торговля стали работать еще быстрее.


26 сентября 2016
MetaTrader 5 iOS build 1403
  • Изменено отображение раздела "Торговля" — вид торговой информации теперь зависит от системы управления рисками на торговом счете: Retail Forex, CFD, Futures или Биржевая модель.


  • Выбор языка интерфейса перенесён в отдельный пункт меню в общих настройках.
  • Исправления и улучшения.
  • 26 сентября 2016
    MetaTrader 5 Android build 1372
    • Добавлена поддержка мультиоконного режима чартов — трейдеры могут одновременно следить за динамикой цен сразу нескольких финансовых инструментов.
    • Появилась возможность менять высоту подокон, в которых открываются индикаторы.
    • Теперь в мобильной платформе есть кнопка быстрого выбора инструмента и отдельное меню настроек чарта. 


    • Добавлено редактирование уровней индикаторов.
    • Интерфейс переведен на болгарский язык.
    16 сентября 2016
    MetaTrader 5 build 1430: Обновленная вкладка Exposure

    Terminal

    1. Реализован новый алгоритм формирования вкладки "Активы" для фондового рынка. Теперь терминал адаптирует представление активов в зависимости от того, какая система управления рисками используется для торгового счета: Retail Forex, CFD, Futures или Биржевая модель.

      Тем, кто торгует на Forex или фьючерсами на бирже, раздел "Активы" поможет понять свое текущее положение в рынке. Одни и те же валюты встречаются во множестве различных инструментов: в качестве одной из валют в паре, в качестве базовой валюты и т.д. Например, у вас могут быть разнонаправленные позиции по GBPUSD, USDJPY и GBPJY. В этой ситуации понять, сколько в итоге у вас есть той или иной валюты, и сколько вы должны, весьма проблематично. Еще сложнее, когда таких позиций не три, а гораздо больше. В этой ситуации итоговое состояние счета можно легко посмотреть на вкладке "Активы".
      Рассмотрим пример на тех же трех позициях:

      Buy GBPJPY 1 lot at 134.027 — получили 100 000 GBP, отдали 134 027 000 JPY
      Sell USDJPY 1 lot at 102.320 — отдали 100 000 USD, получили 102 320 000 JPY
      Sell GBPUSD 1 lot at 1.30923 — отдали 100 000 GBP, получили 103 920 USD

      Мы одновременно купили и продали 100 000 GPB. Суммарно по GBP у нас 0, и вкладка "Активы" эту валюту не показывает. По USD в одном случае мы отдали валюту, в другом — получили. Вкладка "Активы" посчитает итог и просуммирует его с текущим балансом, поскольку валюта депозита у нас также USD. JPY участвовала в двух сделках, вкладка также покажет итоговое значение.




      Тем, кто торгует по биржевой модели, раздел поможет понять, как используются деньги. В отличие от предыдущей модели, при совершении сделок деньги сразу списываются/начисляются на баланс. Например, при покупке EURRUB вы сразу получаете евро, а с баланса списывается соответствующая сумма в рублях. Во время торговли баланс счета даже может стать отрицательным: когда вы торгуете на заемные средства, а в роли обеспечения выступают приобретенные активы. В этой ситуации вкладка "Активы" позволит вам легко понять торговое состояние счета.

      Дополнительно здесь показывается стоимость ликвидации — сумма денежных средств на счету и стоимости (результата) закрытия текущих позиций по рыночной цене.





    2. Исправлена ошибка отображения типа сделки в истории торговых операций.
    3. Исправлен повторный показ окна уведомления о рисках при переподключении к торговому счету.
    4. Оптимизирована и исправлена работа с диалогом выбора торговых инструментов при большом числе символов (несколько тысяч и более).
    5. Исправлено отображение уровней у встроенных индикаторов, рассчитываемых на основе Moving Average (Bollinger Bands, Adaptive Moving Average и т.д.). Проблема возникала при построении индикаторов в отдельном подокне.
    6. Исправлена ошибка, в некоторых случаях приводившая к невозможности выставить ордер по фьючерсном контракту. Проблема возникала, если цена в ордере совпадала с верхним или нижним лимитом цен по контракту.

    MQL5

    1. Оптимизирована и ускорена компиляция MQL5-программ.
    2. Добавлена поддержка модификаторов final и override для классов, структур и функций.

      Модификатор final для классов и структур
      Наличие модификатора final при объявлении структуры или класса запрещает дальнейшее наследование от него. Если класс (структура) таков, что нет необходимости вносить в него дальнейшие изменения, или изменения недопустимы по соображениям безопасности, объявите его с модификатором final. При этом все методы класса будут также неявно считаться final.
      class CFoo final
        {
        //--- тело класса
        };
       
      class CBar : public CFoo
        {
        //--- тело класса
        };
      При попытке наследования от класса с модификатором final, как показано в примере выше, компилятор выдаст ошибку:
      cannot inherit from 'CFoo' as it has been declared as 'final'
      see declaration of 'CFoo'

      Модификатор override для функций
      Модификатор override означает, что объявляемая функция обязательно должна переопределить метод родительского класса. Использование этого модификатора позволяет избежать ошибок при переопределении, таких как случайное изменение сигнатуры метода. Например, в базовом классе определен метод func, принимающий в качестве аргумента переменную типа int:
      class CFoo
        {
         void virtual func(int x) const { }
        };
      Далее метод переопределяется в наследуемом классе:
      class CBar : public CFoo
        {
         void func(short x) { }
        };
      Но по ошибке тип аргумента изменяется с int на short. Фактически, в этом случае уже происходит не переопределение, а перегрузка метода. Действуя в соответствии с алгоритмом определения перегруженной функции, в определенных ситуациях компилятор может выбрать метод, определенный в базовом классе, вместо переопределенного метода.

      Чтобы избежать подобных ошибок, к переопределяемому методу следует явно добавлять модификатор override.
      class CBar : public CFoo
        {
         void func(short x) override { }
        };
      Если при переопределении будет изменена сигнатура метода, компилятор не сможет найти в родительском классе метод с точной такой же сигнатурой и выдаст ошибку компиляции:
      'CBar::func' method is declared with 'override' specifier but does not override any base class method

      Модификатор final для функций

      Модификатор final действует наоборот — он запрещает переопределение метода в классах-наследниках. Если реализация метода самодостаточна и полностью завершена, объявите его с модификатором final, чтобы он гарантированно не был изменен в последующем.
      class CFoo
        {
         void virtual func(int x) final { }
        };
       
      class CBar : public CFoo
        {
         void func(int) { }
        };
       
      При попытке переопределения метода с модификатором final, как показано в примере выше, компилятор выдаст ошибку:
      'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
      see declaration of 'CFoo::func'
    3. Исправлена ошибка компиляции шаблонных функций с параметрами по умолчанию.

    Market

    1. Исправлен ряд ошибок в сортировке продуктов Маркета.

    Tester

    1. Исправлены обновления текущих рыночных цен у открытых ордеров и позиций в режиме визуального тестирования.
    2. Убрано проскальзывание исполнения ордеров Buy Limit и Sell Limit при тестировании на биржевых инструментах.
    3. Исправлена ошибка, в некоторых случаях приводившая к генерации некорректных цен в режиме тестирования "По ценам открытия".
    4. Исправлено формирование событий OnTradeTransaction при тестировании.
    5. При тестировании на основе реальных тиков в журнал тестера выводится информация о несоответствии цен тиков (bid или last, в зависимости от того, по какой цене строится бар) значениям low или high имеющегося минутного бара.

    MetaEditor

    1. Исправлены ошибки отображения данных профилировки на файлах исходного кода.
    2. Обновлена документация.
    19 августа 2016
    MetaTrader 5 build 1395: Ускорение торговых операций и улучшения в визуальном тестировании

    Терминал

    1. Оптимизирована и значительно ускорена отправка торговых команд клиентским терминалом.
    2. Исправлена ошибка, приводившая к невозможности выполнения MQL5-программ в терминалах при работе в 32-х разрядной версии Windows 10, build 1607.
    3. В навигатор добавлен показ режима работы торгового счета — Hedging или Netting.
    4. В навигатор добавлена команда контекстного меню для подключения выбранным счетом к веб-терминалу.
    5. Переработан раздел меню "Справка", добавлены ссылки на обучающие видеоролики.
    6. Исправлен ряд ошибок интерфейса при работе на экранах высокого разрешения (4К).
    7. Исправлены ошибки в переводе пользовательского интерфейса на персидский язык.

    MQL5

    1. Добавлены указатели 'void *', что позволит создавать абстрактные коллекции объектов. В переменную этого типа можно сохранить указатель на объект любого класса.
      Для обратного преобразования рекомендуется использовать оператор dynamic_cast<имя класса *>(указатель void *). Если приведение невозможно, результатом будет NULL.
      class CFoo { };
      class CBar { };
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
         void *vptr[2];
         vptr[0]=new CFoo();
         vptr[1]=new CBar();
      //---
         for(int i=0;i<ArraySize(vptr);i++)
           {
            if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
               Print("CFoo * object at index ",i);
            if(dynamic_cast<CBar *>(vptr[i])!=NULL)
               Print("CBar * object at index ",i);
           }
         CFoo *fptr=vptr[1];  // выдаст ошибку приведения указателей, vptr[1] не является объектом CFoo
        }
      //+------------------------------------------------------------------+
    2. Добавлена поддержка оператора [ ] для строки, что позволит получать символ из строки по индексу. Если указанный индекс выходит за пределы строки, результатом будет 0.
      string text="Hello";
      ushort symb=text[0];  // вернет код символа 'H'
      
    3. Добавлен второй вариант обработчика события TesterInit с сигнатурой int OnTesterInit(void), который может возвращать коды INIT_SUCCEEDED (0) или INIT_FAILED (либо любое ненулевое значение). Если OnTesterInit возвращает ненулевое значение, то оптимизация не начинается.
    4. Исправлена ошибка, в результате которой разные перегрузки функции ChartGetString отдавали разный результат.

    Тестер

    1. Добавлены дополнительные команды и горячие клавиши для визуального тестирования. Теперь графики в визуальном тестере можно настраивать так же, как и в терминале: менять цвета, управлять показом различных элементов, применять шаблоны и т.д.




    2.  Исправлена работа функции Sleep в режиме тестирования "По ценам открытия".
    3.  Исправлена ошибка, приводившая к формированию некорректного состояния баров при работе на таймфреймах W1 и MN1.

    MetaEditor

    1. Добавлен перевод пользовательского интерфейса на традиционный китайский язык.

    Обновлена документация.

    8 августа 2016
    MetaTrader 5 iOS build 1371
    • Полностью обновлен внешний вид сообщений. Теперь переписка на MQL5.community и уведомления из десктопной платформы показываются в виде чатов, которые вы привыкли видеть в популярных мобильных мессенджерах.
    • Появилась возможность переключаться между 23 доступными языками прямо в платформе. Если вы предпочитаете английский язык в трейдинге, включите его в разделе "О программе", не переключая язык всего устройства.
    5 августа 2016
    MetaTrader 5 Android build 1338
    • Добавлен чат MQL5.community.
    • Добавлена возможность переноса SSL-сертификатов из десктопной платформы.
    • Добавлены переводы интерфейса на персидский и голландский языки. 
    15 июля 2016
    MetaTrader 5 build 1375: Лента сделок и доступ к тикам при тестировании

    Terminal

    1. Добавлена лента сделок в стакане цен.




      Что такое лента сделок
      В ленте сделок в режиме реального времени отображается список всех сделок, заключаемых на бирже. По каждой сделке показывается время ее заключения, направление (покупка или продажа), цена и объем. Для удобного визуального анализа каждое направление сделки показывается отдельным цветом: синим - покупки, розовым - продажи, зеленым - неопределенное направление. Объемы сделки дополнительно показываются в виде гистограммы.

      Как лента сделок помогает понять рынок
      Лента сделок позволит анализировать рынки более детально. Направление сделки в ленте сообщает трейдеру, кто был инициатором ее заключения: покупатель или продавец. Объем заключаемых сделок позволит понять поведение участников рынка: крупные это игроки или мелкие, какова их активность. Скорость совершения сделок и их объем на определенных ценовых уровнях позволит сделать вывод о значимости этих уровней.

      Как использовать данные
      Помимо визуального анализа таблицы, вы можете выгрузить данные по сделкам в CSV файл. Далее их можно изучать в любом другом приложении, например MS Excel. В файле все данные разделены запятой:
      Time,Bid,Ask,Last,Volume,Type
      2016.07.06 16:05:04.305,89360,89370,89370,4,Buy
      2016.07.06 16:05:04.422,89360,89370,89370,2,Buy
      2016.07.06 16:05:04.422,89360,89370,89370,10,Buy
      2016.07.06 16:05:04.669,89360,89370,89370,1,Buy
      2016.07.06 16:05:05.968,89360,89370,89360,7,Sell
      Для сохранения данных в файл откройте контекстное меню:



      Для точного определения направления сделок торговая платформа брокера должна быть обновлена до версии 1375.
    2. Значительно уменьшено время между приходом тика/изменения стакана цен и вызовом точек входа OnTick и OnCalculate. Также уменьшено время между приходом события изменения торгового состояния и вызовом точек входа OnTrade и OnTradeTransaction. Таким образом, MQL5-программы теперь будут быстрее реагировать на рыночные события.
    3.  Ускорена отправка торговых запросов при использовании расширенной аутентификации с помощью SSL-сертификатов.
    4.  Обновлен перевод пользовательского интерфейса на персидский язык.
    5. Исправлено отображение команд установки SL/TP в контекстном меню графика при работе в режиме хеджинга.

    Tester

    1. Добавлена возможность запрашивать тиковую историю при тестировании с помощью функции CopyTicks. Ранее данная функция не работала в тестере стратегий.

      • В режиме "Все тики" функция вернет историю сгенерированных тиков. Запросить можно не более 128 000 последних тиков.
      • В режиме "Каждый тик на основе реальных тиков" функция вернет историю реальных тиков. Глубина запрашиваемых данных ограничена только доступностью этих данных. Однако учитывайте, что последние 128 000 тиков кэшируются тестером стратегий, и запрос этих данных будет выполнен достаточно быстро. Более глубокая история запрашивается непосредственно с жесткого диска, а соответственно выполнение запроса займет значительно больше времени.
      • В режимах "Только цены открытия" и "M1 на OHLC" функция по-прежнему не будет работать, поскольку тиковая история фактически не создается.

    2. Добавлена поддержка времени с точностью до миллисекунд. Ранее в тестере стратегий квантом времени являлась одна секунда.

      • Теперь функции EventSetMillisecondTimer и Sleep работают более точно в тестере стратегий.
      • Повысилась точность подачи тиков при тестировании мультивалютных экспертов. Раньше, если в одну секунду укладывалось несколько тиков (тиковый объем минутного бара больше 60), всем им проставлялось одно и то же время. При тестировании моновалютных экспертов это не имеет большого значения, поскольку тики просто последовательно передаются эксперту. Однако при тестировании на нескольких парах важно знать, тик с какой пары пришел первым. Раньше тики по каждому символу передавались эксперту последовательно: сначала все тики за секунду по одному символу, затем - все тики по другому. Теперь они передаются с учетом миллисекунд.

        При тестировании на реальных тиках миллисекунды берутся из исходных тиковых данных. При генерации тиков проставление миллисекунд происходит в соответствии с тиковым объемом. Например, если в одной секунде умещается 3 тика, то им будет проставлено время 000, 333 и 666 миллисекунды.

    3. В режимах "По ценам открытия" и "M1 на OHLC" исполнение отложенных и SL/TP ордеров теперь осуществляется по заявленной, а не по текущей цене на момент исполнения. Алгоритм исполнения по рыночным ценам, используемый в точных режимах (все тики и реальные тики), не подходит для грубых режимов. В последних, промежуточные тики не генерируются, и разница между заявленной в ордере ценой и рыночной ценой на момент исполнения (Open или OHLC), может быть значительной. Исполнение ордеров по заявленной цене в режимах "По ценам открытия" и "M1 на OHLC" дает более точные результаты тестирования.

    4. Добавлена поддержка форвардного тестирования в визуальном режиме. Теперь для бэктеста и форвард-теста будут открываться два отдельных окна визуального тестирования, что позволит удобно сравнивать результаты работы советников на разных периодах.




      Окно форвард-тестирования появляется только после завершения тестирования на основном промежутке времени.

    5. На графике тестирования теперь вместо уровня маржи выводится нагрузка на депозит, которая вычисляется как отношение маржи к средствам (margin/equity).


    6. Tester: Исправлен расчет комиссии в годовых процентах при тестировании.

    7. Tester: Исправлен пересчет и отображение баланса на графике, формируемом в процессе тестирования.

    MQL5

    1. Изменено поведение функции OrderSend при выставлении, модификации и снятии ордеров. Поведение изменяется только при выводе ордеров во внешние торговые системы. Ранее управление функции OrderSend возвращалось после успешного размещения (обработки) ордера на сервере брокера. Теперь управление возвращается только после того, как сервер брокера получит уведомление от внешней торговой системы, что ордер в ней успешно размещен.

      Ниже схематично изображено предыдущее (красная стрелка) и текущее поведение функции:




    2. В структуру торгового результата MqlTradeResult добавлено поле retcode_external - код ошибки во внешней торговой системе. Проставление и виды этих ошибок зависят от брокера и внешней торговой системы, в которую выводятся торговые операции. Например, значения retcode_external, заполняемые Московской Биржей будут отличаться от DGCX.

    3. В перечисление ENUM_CHART_PROPERTY_STRING добавлены свойства CHART_EXPERT_NAME и CHART_SCRIPT_NAME. Теперь при помощи функции ChartGetString можно выяснить имена эксперта и/или скрипта, прикрепленного к графику, определенного параметром chart_id.

    Signals

    1. Исправлена ошибка, из-за которой в некоторых случаях операции закрытия позиции встречной (close by) не копировались.
    2. Доработано автоматическое сопоставление валютных пар, содержащих RUB и RUR.

    Market

    1. Исправлена сортировка по категории продукта.

    MetaEditor

    1. Исправлена установка фокуса в поле текста замены при открытии диалога замены.
    2. Исправлена массовая замена текста при поиске вверх от текущей позиции.


    Обновлена документация.
    5 июля 2016
    Веб-платформа MetaTrader 5: Состоялся официальный релиз

    После 2 месяцев публичного тестирования состоялся официальный выпуск веб-версии мультирыночной платформы MetaTrader 5. Она позволяет торговать на финансовых рынках в любом браузере и любой операционной системе. При этом не требуется устанавливать программу на компьютер, достаточно доступа в интернет и любого веб-браузера.

    Приложение сочетает в себе ключевые преимущества десктопной платформы (скорость, мультирыночность и расширенные торговые функции) с удобством и кроссплатформенностью веб-решения. Важным новшеством релизной версии является стакан, который позволяет видеть глубину рынка, а также выставлять одним кликом рыночные и отложенные ордера.

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

    • неттинговая и хеджинговая системы учета позиций,
    • 31 технический индикатор,
    • 23 аналитических объекта,
    • one-click trading и полный набор торговых ордеров,
    • интерфейс программы на 41 языке мира.
    19 мая 2016
    MetaTrader 5 iOS build 1335

    Переносить SSL сертификаты из десктопной платформы в мобильную стало удобно. iTunes больше не нужен.

    В MetaTrader 5 счета можно дополнительно защищать сертификатом, без которого подключение невозможно. Если сертификат был создан в десктопной версии, то для доступа к счету в мобильной платформе его нужно перенести.

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

    Помимо этого появился диалог миграции для счетов, перенесенных из MetaTrader 4. Если ваш счет перенесли в платформу 5-го поколения, вас горячо поприветствуют, расскажут о фишках и предложат поменять пароль.

    13 мая 2016
    MetaTrader 5 build 1340: Удобный перенос сертификатов в мобильные и улучшения в тестере

    Terminal

    1. Теперь сертификаты для подключения в режиме повышенной безопасности можно удобно переносить из десктопного терминала в мобильные.

      В торговой платформе поддерживается расширенная авторизация — в дополнение к паролю счет защищается специальным SSL-сертификатом. Сертификат представляет собой файл, сгенерированный для счета на торговом сервере. Файл уникален и без него подключение к счету невозможно.

      Ранее если сертификат был запрошен и сгенерирован через десктопный терминал, то для использования счета в MetaTrader 5 для iPhone/iPad или Android было необходимо переносить его файл на устройство вручную и затем устанавливать. Теперь сертификат переносится удобно.

      Как происходит перенос
      Перенос сертификата осуществляется через торговый сервер:

      • Сначала сертификат шифруется в десктопном терминале: владелец счета указывает пароль, которым сертификат будет зашифрован с использованием надежного алгоритма AES-256. Этот пароль знает только пользователь, на сервер пароль не отправляется.
      • Далее зашифрованный сертификат отправляется на торговый сервер, где он будет храниться до получения через мобильный терминал, но не более одного часа.
      • Для получения сертификата пользователь должен подключиться к счету через мобильный терминал. Сразу после подключения предлагается импортировать сертификат. Для этого необходимо указать пароль, которым он был зашифрован в десктопном терминале.

      Перенос сертификата происходит безопасно: торговый сервер используется лишь как промежуточное звено для хранения, шифрация происходит на стороне клиента, пароль сертификата не передается и не хранится на торговом сервере.

      Как перенести сертификат
      Подключитесь к счету в десктопном терминале и выберите "Перенести сертификат" в его контекстном меню:



      Укажите главный пароль счета для подтверждения того, что он принадлежит вам. Далее задайте пароль, которым будет защищен сертификат перед отправкой на сервер. Пароль должен состоять не менее чем из 8 цифр.

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



      Посмотреть импортированный сертификат можно в разделе "О программе — Сертификаты".
      Обновленные мобильные терминалы MetaTrader 5 для iPhone/iPad и Android с поддержкой переноса сертификатов будут выпущены в ближайшее время.

    Tester

    1.  Изменен алгоритм срабатывания и исполнения отложенных и SL/TP ордеров для более корректного тестирования. Расширены возможности визуального тестирования.

      Что изменилось для биржевых инструментов
      На реальном рынке для биржевых инструментов построение графиков и срабатывание стоп-ордеров осуществляется по ценам последней сделки (Last). Срабатывание лимитных ордеров осуществляется по ценам Bid/Ask. При этом исполнение всех видов ордеров всегда осуществляется по текущим рыночным ценам Bid/Ask. В тестер стратегий внесены изменения для более точного соответствия реальным условиям:
        Было
      Стало
      Срабатывание Все виды отложенных ордеров и SL/TP по Bid/Ask
      Лимитные ордера по Bid/Ask
      Стоп, стоп-лимитные и SL/TP ордера по Last
      Исполнение Все виды отложенных ордеров и SL/TP по цене, заявленной в ордере
      Все виды отложенных ордеров и SL/TP по рыночным ценам Bid/Ask на момент срабатывания

      Рассмотрим пример на инструменте Si-6.16. При текущих ценах Bid=72570, Ask=72572, Last=72552 был выставлен ордер Buy Stop с ценой срабатывания 72580. В ценовом потоке мы получили новые текущие цены:

      • Bid=72588
      • Ask=72590
      • Last=72580


      На биржевых инструментах триггером для срабатывания стоп-ордеров является цена Last. Поэтому, поступление в потоке цены Last=72580 привело к активации ордера Buy Stop. Ранее именно эта цена 72580 была бы использована для исполнения данного ордера. Такое поведение было некорректным, поскольку цены Ask=72580 для исполнения операции на покупку на рынке нет.


      В обновленном тестере используется текущая цена покупки Ask=72590, и ордер Buy Stop будет исполнен именно ней. Таким образом, новый алгоритм исполнения сделок в тестере более точно соответствует реальному рынку. При старом же алгоритме торговая операция была бы совершена по нерыночной цене, что привело бы к некорректным результатам тестирования.

      Что изменилось для небиржевых инструментов
      Для небиржевых инструментов алгоритм срабатывания остался прежним: для всех видов отложенных ордеров и SL/TP используются цены Bid и Ask. Изменился режим исполнения: ранее оно происходило по заявленной в ордере цене, теперь же используются текущие рыночные цены Bid и Ask на момент срабатывания.

      Новое в визуальном тестировании
      При визуальном тестировании теперь показываются линии максимальной цены Ask и минимальной цены Bid за бар. На таком графике легче тестировать советников на биржевых инструментах, где построение баров и срабатывание ордеров осуществляется по ценам Last, а исполнение рыночных операций — по Bid и Ask.



      На графике визуального тестирования появилась возможность навигации к указанной дате. Дважды кликните на графике и укажите нужную дату и время. Помимо этого график можно переместить к любому ордеру или сделке: дважды кликните на торговой операции на вкладке "Торговля", "История" или "Операции".
    2. Расширено журналирование загрузки ценовой и тиковой истории перед запуском тестирования. Теперь в журнале отражается факт окончания загрузки истории, объем загруженных данных и затраченное на загрузку время:
      2016.05.10 12:47:53    Core 1    5.10 Mb of history processed in 0:00.842
      2016.05.10 12:47:53    Core 1    GBPUSD: history synchronization completed [5225 Kb]

    MQL5

    1. Исправлена ошибка, в результате которой в некоторых случаях функция CopyTicks возвращала меньше тиков, чем запрошено.
    2. Исправлены ошибки генерации шаблонных функций.
    3. Обновлена документация.

    Исправления по крешлогам.

    12 мая 2016
    Веб-платформа MetaTrader 5: Бета-версия доступна для тестирования

    По многочисленным просьбам трейдеров разработана веб-версия торговой платформы MetaTrader 5. Новинка сочетает в себе удобство и кроссплатформенность веб-терминала с преимуществами десктопной "пятерки" — скоростью, мультирыночностью, расширенными торговыми функциями.

    Веб-платформа MetaTrader 5 стала доступной на сайте MQL5.community и позволяет торговать на финансовых рынках через любой браузер в любой операционной системе (Windows, Mac, Linux). Для этого не нужно устанавливать никаких программ, достаточно иметь доступ в интернет.

    В бета-версии трейдерам сразу же доступны:

    • хеджинговая система учета позиций,
    • 30 технических индикаторов,
    • 23 аналитических объекта,
    • полный набор торговых ордеров MetaTrader 5,
    • интерфейс на 41 языке.
    Выпуск бета-версии призван обеспечить широкое публичное тестирование и позволить трейдерам оценить новые возможности.
    22 апреля 2016
    MetaTrader 5 build 1325: Торговля с хеджированием и тестирование по реальным тикам

    Terminal

    1. Для расширения возможностей ритейл-форекса в платформу добавлена вторая система учета — хеджинг. Теперь по инструменту можно иметь множество позиций, в том числе — разнонаправленных. Это позволяет реализовывать торговые стратегии с так называемым локированием — если цена пошла против трейдера, он имеет возможность открыть позицию в противоположном направлении.

      Новая система учета аналогична используемой в MetaTrader 4, она будет привычна трейдерам. При этом они смогут использовать все преимущества пятой версии платформы — исполнение ордеров несколькими сделками (в том числе — частичное), мультивалютный и многопоточный тестер с поддержкой вычислительной сети MQL5 Cloud Network и многое другое.

      Теперь на одном счете можно торговать на бирже, где используется неттинг и по одному инструменту можно иметь только одну позицию. При этом в той же платформе, но на другом счете можно торговать на форексе и использовать хеджирование.

      Как открыть счет с хеджированием и где посмотреть тип учета позиций
      Тип учета позиций задается на уровне счета, он показывается в заголовке окна терминала, а также в журнале:



      Чтобы открыть демо-счет с хеджингом, включите соответствующую опцию:




      Неттинговая система
      Эта система учета подразумевает, что в один момент времени на счете может быть только одна открытая позиция по одному и тому же символу:

      • Если по инструменту существует позиция, при совершении сделки в том же направлении происходит наращивание объема этой позиции.
      • При совершении сделки в обратном направлении происходит уменьшение объема существующей позиции, ее закрытие (при совершении сделки в объеме, равном объему текущей позиции) либо разворот (если объем противоположной сделки больше текущей позиции).


      При этом не имеет значения, в результате какого действия совершается сделка в противоположном направлении — в результате исполнения рыночного ордера или срабатывания отложенного.

      Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:


      Результатом исполнения этих сделок стала одна общая позиция объемом 1 лот.

      Хеджинговая система
      Эта система учета позволяет иметь на счету множество торговых позиций по одному и тому же инструменту, в том числе — разнонаправленных.

      Если по торговому инструменту есть открытая позиция и трейдер совершает новую сделку (или срабатывает отложенный ордер), происходит открытие новой позиции. Существующая позиция не изменяется.

      Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:


      Результатом исполнения этих сделок стало открытие двух отдельных позиций.

      Новый тип торговой операции Close By
      Для счетов с хеджинговым учетом позиций добавлен новый вид торговых операций — закрытие позиции встречной. Эта операция позволяет одновременно закрыть две разнонаправленные позиции по одному и тому же инструменту. Если встречные позиции имеют разное количество лотов, то открытым останется только один ордер из двух. Его объем будет равен разности лотов двух закрытых позиций, а направление позиции и цена открытия — большей (по объему) из закрываемых позиций.

      По сравнению с одиночным закрытием двух позиций, закрытие встречной позволяет сэкономить трейдеру один спред:

      • При одиночном закрытии трейдер дважды платит спред: закрывает покупку по меньшей цене (Bid), а продажу — по большей (Ask).
      • При встречном закрытии для закрытия первой позиции используется цена открытия второй позиции, а для второй позиции — цена открытия первой.


      При закрытии позиции встречной выставляется ордер типа "close by". В комментарии к нему указываются тикеты закрываемых позиций. Закрытие пары встречных позиций происходит двумя сделками типа "out by". Размер итоговой прибыли/убытка, полученного в результате закрытия обеих позиций, указывается только в одной сделке.


    2. В дополнение к поддержке хеджинга в платформе расширились возможности переноса счетов из MetaTrader 4. Теперь брокеры могут в автоматическом режиме переносить счета в MetaTrader 5 вместе со всеми операциями: открытыми и отложенными ордерами, а также всей торговой историей.

      При первом подключении счету, перенесенному из MetaTrader 4, вы увидите приветственное окно. Перенос осуществляется безопасно. Для начала работы укажите пароль от счета, который ранее использовался в MetaTrader 4, а затем задайте новый пароль.



      После подключения вы сможете работать в обычном режиме, как если бы счет был изначально открыт в MetaTrader 5, при этом вся история сделок из MetaTrader 4 автоматически сохранится на новом счете.

      При импорте тикеты ордеров и позиций (в том числе ордеров истории) не сохраняются, поскольку одной записи в торговой истории MetaTrader 4 может соответствовать до 4 записей в истории MetaTrader 5. Всем торговым записям проставляются новые тикеты.

      Номера счетов могут быть сохранены или заменены новыми в зависимости от того, как брокер произведет импорт.


    3. Добавлен Чат. Теперь прямо в торговой платформе можно общаться с друзьями и коллегами на MQL5.community. В чате показываются все личные сообщения из MQL5-аккаунта. Для начала общения войдите в свой аккаунт прямо из окна чата или через настройки платформы: Сервис -> Настройки -> Сообщество.




    4. Упрощен диалог открытия демо-счета, добавлена возможность открытия счетов с хеджированием. Теперь не нужно заполнять большую анкету, достаточно указать основные данные и выбрать торговые параметры: тип счета, депозит, плечо и возможность хеджирования.



    5. Для быстрого начала работы с платформой добавлено автоматическое выделение демо-счета. Если в платформе еще нет ни одного счета, то при запуске выделяется демо-счет на первом доступном торговом сервере. После успешного открытия счет сразу же будет подключен.

    6. Теперь у каждой позиции есть тикет — уникальный номер. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Всем ранее открытым позициям тикет будет назначен автоматически после обновления на новую версию терминала.




    7. Исправлена установка уровней Стоп Лосс и Тейк Профит при выставлении рыночного ордера, приводящего к изменению направления позиции. Ранее соответствующие уровни у новой позиции не устанавливались.
    8. Исправлено отображение цен с четырьмя и более знаками после запятой на элементах управления панели торговли одним кликом.
    9. Исправлена ошибка отображения новости в окне предварительного просмотра перед печатью.
    10. Исправлены ошибки отображения тикового графика.
    11. Исправлено открытие стакана цен после аварийного завершения работы терминала.
    12. Добавлены проверки на разрешенность рыночных ордеров при отображении элементов управления панели торговли одним кликом.
    13. Оптимизирован расчет прибыли и маржи при большом количестве открытых ордеров и позиций.
    14. Добавлен перевод пользовательского интерфейса на малайский язык.
    15. Полностью обновлено руководство пользователя. Свежий дизайн, интерактивные скриншоты и встроенные видеоролики — все, чтобы сделать обучение торговли при помощи MetaTrader 5 максимально простым и удобным:




    16. Исправлено отображение графических объектов в режиме "График сверху".

    Tester

    1. Добавлена возможность тестирования торговых роботов и технических индикаторов по реальной тиковой истории.

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

      Чтобы начать тестирование или оптимизацию по реальным тикам, выберите соответствующий режим в тестере стратегий:



      Тиковые данные имеют значительно больший размер, чем минутные. При первом запуске тестирования их скачивание может занять продолжительное время. Скачанные тиковые данные хранятся по месяцам в TKC-файлах в каталоге \bases\[имя торгового сервера]\ticks\[имя символа]\.

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

      Если по инструменту транслируется биржевой стакан цен, бары строятся строго по ценам исполнения последней сделки — Last. В ином случае, тестер сначала пытается строить бары по ценам Last, и только если их нет, использует цены Bid. Событие прихода тика OnTick срабатывает на всех тиках, независимо от того, была ли в них цена Last или нет.

      Обратите внимание, что торговые операции всегда совершаются по ценам Bid и Ask, даже если график строится по ценам Last. Например, эксперт, использующий для торговли только цены открытия бара (в частности, встроенный Moving Average), получит сигнал по одной цене (Last), но сделку совершит уже по другой (Bid или Ask в зависимости от направления). При использовании режима генерации "Все тики", бары строятся по ценам Bid, а сделки совершаются по Bid и Ask. При этом Ask рассчитывается как Bid + фиксированный спред соответствующего минутного бара.

      Если в истории символа есть минутный бар, но тиковых данных за эту минуту нет, тестер сгенерирует тики в режиме "Все тики". Это позволяет протестировать советника на запланированном периоде в случае неполных тиковых данных у брокера. Если в истории символа нет минутного бара, но тиковые данные за эту минуту есть, то эти тики игнорируются. Минутные данные считаются более достоверными.

      Тестирование по реальным тикам в сети облачных вычислений MQL5 Cloud Network
      Тестирование по реальным тикам доступно не только на локальных и удаленных агентах, но и через облачную сеть MQL5 Cloud Network. Оптимизацию стратегии, которая могла бы занять месяцы, можно выполнить за несколько часов, используя вычислительную мощность тысяч компьютеров.

      Для тестирования через сеть включите использование облачных агентов:



      При тестировании на реальных тиках через MQL5 Cloud Network может передаваться большой объем интернет-трафика. Это может существенно повлиять на итоговую стоимость использования вычислительной сети.

    2. Исправлена ошибка, в результате которой не рассчитывалась комиссия на некоторых типах торговых инструментов.
    3. Исправлено заполнение поля Expert у торговых ордеров, возникших в результате срабатывания SL/TP, в соответствии со значением поля Expert у соответствующей позиции. Ранее оно не заполнялось.
    4. Исправлено переключение на вкладки результатов обычной и форвардной оптимизации.
    5. Исправлен расчет и отображение индикатора "Envelopes".
    6. Оптимизировано выполнение визуального тестирования.
    7. Оптимизирован расчет прибыли и маржи при большом количестве открытых ордеров и позиций.
    8. Оптимизировано выполнение торговых операций при высокочастотной торговле.
    9. Теперь синхронизация истории не производится при запросе свойств неосновного символа, не требующих текущих котировок. Например,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE и т.п. Раньше при любом запросе свойства неосновного символа производилась синхронизация истории по данному символу.
    10. Исправлен расчет свопов в процентах годовых.

    MQL5

    1. Изменился формат исполняемых EX5-файлов в связи с добавлением новых возможностей в язык MQL5 и появлением хеджинга в платформе MetaTrader 5. Все старые EX5-программы, скомпилированные в MetaEditor предыдущих билдов, будут после обновления работать корректно - таким образом, совместимость снизу вверх сохранена полностью.

      В то же время, EX5-программы, скомпилированные на билдах 1325 и выше, не будут работать в терминалах старых билдов - обратной совместимости нет.

    2. Добавлена поддержка абстрактных классов и чисто виртуальных функций.

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

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

      Виртуальная функция объявляется как "чистая" с помощью синтаксиса спецификатора чистоты. Рассмотрим в качестве примера класс CAnimal, который создается только для того, чтобы предоставлять общие функции – сами объекты типа CAnimal имеют слишком общий характер для практического применения. Таким образом, класс CAnimal является хорошим кандидатом в абстрактный класс:
      class CAnimal
        {
      public:
                            CAnimal();     // конструктор
         virtual void       Sound() = 0;   // чисто виртуальная функция
      private:
         double             m_legs_count;  // количество ног животного
        };
      Здесь функция Sound() является чисто виртуальной, потому что она объявлена со спецификатором чисто виртуальной функции PURE (=0).

      Чисто виртуальными функциями являются только такие виртуальные функции, для которых указан спецификатор чистоты  PURE, а  именно: (=NULL) или (=0). Пример объявления и использования абстрактного класса:
      class CAnimal
        {
      public:
         virtual void       Sound()=NULL;   // PURE method, должен быть переопределен в потомке, сам класс CAnimal стал абстрактным и не может быть создан
        };
      //--- потомок от абстрактного класса
      class CCat : public CAnimal
       {
      public:
        virtual void        Sound() { Print("Myau"); } // PURE переопределен, класс CCat не абстрактный и может быть создан
       };
      
      //--- примеры неправильного использования
      new CAnimal;         // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
      CAnimal some_animal; // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
      
      //--- примеры правильного использования
      new CCat;  // ошибки нет - класс CCat не абстрактный
      CCat cat;  // ошибки нет - класс CCat не абстрактный
      Ограничения на использование абстрактных классов
      При вызове конструктором абстрактного класса чистой виртуальной функции (прямо или косвенно) результат будет неопределенным.
      //+------------------------------------------------------------------+
      //| Абстрактный базовый класс                                        |
      //+------------------------------------------------------------------+
      class CAnimal
        {
      public:
         //--- чисто виртуальная функция
         virtual void      Sound(void)=NULL;
         //--- функция
         void              CallSound(void) { Sound(); }
         //--- конструктор
         CAnimal()
          {
           //--- явный вызов виртуального метода
           Sound();
           //--- неявный вызов (через третью функцию)
           CallSound();
           //--- в конструкторе и/или деструкторе всегда вызываются свои функции,
           //--- несмотря на виртуальность и переопределение вызываемой функции в потомке
           //--- если вызываемая функция чисто виртуальная, то
           //--- вызов приведет к критической ошибке выполнения: "pure virtual function call"
          }
        };
      Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.

    3. Для облегчения организации событийных моделей добавлена поддержка указателей на функции.

      Чтобы объявить указатель на функцию, определите тип "указатель на функцию", например:
      typedef int (*TFunc)(int,int);
      Теперь TFunc является типом и можно объявить переменную-указатель на функцию:
      TFunc func_ptr;
      В переменную func_ptr можно сохранить адрес функции, чтобы в дальнейшем ее вызывать:
      int sub(int x,int y) { return(x-y); }
      int add(int x,int y) { return(x+y); }
      int neg(int x)       { return(~x);  }
      
      func_ptr=sub;
      Print(func_ptr(10,5));
      
      func_ptr=add;
      Print(func_ptr(10,5));
      
      func_ptr=neg;           // ошибка: neg не имеет тип  int (int,int)
      Print(func_ptr(10));    // ошибка: должно быть два параметра
      Указатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса.

    4. В структуру торгового запроса MqlTradeRequest добавлены два новых поля:

      • position — тикет позиции. Следует заполнять при торговле с хеджированием при изменении и закрытии позиции для ее однозначной идентификации. При торговле с неттинговой системой учета заполнение этого поля ни на что не влияет, поскольку идентификация позиции происходит по имени торгового инструмента.
      • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Используется только при хеджинговом учете позиций.

    5. В перечисление типов торговых операций ENUM_TRADE_REQUEST_ACTIONS добавлено значение TRADE_ACTION_CLOSE_BY — закрытие позиции встречной. Используется только при хеджинговом учете позиций.

    6. В перечисления свойств ордеров, сделок и позиций добавлены тикеты соответствующих торговых операций:

      • В ENUM_ORDER_PROPERTY_INTEGER добавлено свойство ORDER_TICKET — тикет ордера. Уникальное число, которое присваивается каждому ордеру.
      • В ENUM_DEAL_PROPERTY_INTEGER добавлено свойство DEAL_TICKET — тикет сделки. Уникальное число, которое присваивается каждой сделке.
      • В ENUM_POSITION_PROPERTY_INTEGER добавлено свойство POSITION_TICKET — тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта позиция, следует использовать свойство POSITION_IDENTIFIER. Значение POSITION_TICKET соответствует MqlTradeRequest::position.

    7. В перечисление типов ордеров ENUM_ORDER_TYPE добавлено значение ORDER_TYPE_CLOSE_BY — ордер на закрытие позиции встречной позицией.
    8. В перечисление свойств ордеров ENUM_ORDER_PROPERTY_INTEGER добавлено значение ORDER_POSITION_BY_ID — идентификатор встречной позиции для ордеров типа ORDER_TYPE_CLOSE_BY.
    9. В перечисление направлений сделки ENUM_DEAL_ENTRY добавлено значение DEAL_ENTRY_OUT_BY — сделка произошла в результате закрытия позиции встречной.
    10. В структуру торговой транзакции MqlTradeTransaction добавлены два аналогичных поля:

      • position — тикет позиции, на которую повлияла транзакция. Заполняется для транзакций, касающихся обработки рыночных ордеров (TRADE_TRANSACTION_ORDER_* кроме TRADE_TRANSACTION_ORDER_ADD, где тикет позиции еще не присвоен) и истории ордеров (TRADE_TRANSACTION_HISTORY_*).
      • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Заполняется только для ордеров на закрытие позиции встречной (close by) и сделок на закрытие встречной (out by).

    11. Добавлена функция PositionGetTicket — возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.
      ulong  PositionGetTicket(
         int  index      // номер в списке позиций
         );

    12. Добавлена функция PositionSelectByTicket — выбирает открытую позицию для дальнейшей работы с ней по указанному тикету.
      bool  PositionSelectByTicket(
         ulong   ticket     // тикет позиции
         );

    13. В перечисление свойств торговых инструментов ENUM_SYMBOL_INFO_DOUBLE добавлено значение SYMBOL_MARGIN_HEDGED — размер контракта или маржи для одного лота перекрытых позиций (разнонаправленные позиции по одному символу).

      • Если для инструмента задана первоначальная маржа (SYMBOL_MARGIN_INITIAL), то хеджированная маржа указывается как абсолютное значение (в деньгах).
      • Если первоначальная маржа не задана (равна 0), то в SYMBOL_MARGIN_HEDGED указывается размер контракта, который будет использован при расчете маржи по формуле, соответствующей типу торгового инструмента (SYMBOL_TRADE_CALC_MODE).

      Особенности расчета маржи для захеджированных позиций описаны в руководстве пользователя торговой платформы MetaTrader 5.

    14. В перечисление свойств счета ENUM_ACCOUNT_INFO_INTEGER добавлено значение ACCOUNT_MARGIN_MODE — режим расчета маржи для текущего торгового счета:

      • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — используется для внебиржевого рынка при учете позиций в режиме "неттинг" (по одному символу может быть только одна позиция). Расчет маржи осуществляется на основе типа инструмента (SYMBOL_TRADE_CALC_MODE).
      • ACCOUNT_MARGIN_MODE_EXCHANGE — используется для биржевого рынка. Расчет маржи осуществляется на основе дисконтов, указанных в настройках инструментов. Дисконты устанавливаются брокером, однако не могут быть ниже значений, определенных биржей.
      • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — используется для внебиржевого рынка при независимом учете позиций ("хеджинг", по одному символу может быть несколько позиций). Расчет маржи осуществляется на основе типа инструмента (SYMBOL_TRADE_CALC_MODE) и с учетом размера захеджированной маржи (SYMBOL_MARGIN_HEDGED).

    15. В перечисление свойств клиентского терминала ENUM_TERMINAL_INFO_INTEGER добавлено значение TERMINAL_SCREEN_DPI — разрешающая способность вывода информации на экран измеряется в количестве точек на линейный дюйм поверхности (DPI). Знание этого параметра позволяет задавать размеры графических объектов таким образом, чтобы они выглядели одинаково на мониторах с различной разрешающей способностью.

    16. В перечисление свойств клиентского терминала ENUM_TERMINAL_INFO_INTEGER добавлено значение TERMINAL_PING_LAST — последнее известное значение пинга до торгового сервера в микросекундах. В одной секунде миллион микросекунд.

    17. Исправлен возврат результата вызова функции SendFTP. Ранее при удачной отсылке возвращалось значение FALSE вместо TRUE.
    18. Исправлена ошибка в функции StringConcatenate, в некоторых случаях приводившая к ошибке выполнения "Access violation".
    19. Исправлен ряд ошибок при работе с функциями-шаблонами.
    20. Теперь функции Print, Alert и Comment могут выводить строки размером более 4000 символов.
    21. Исправлена ошибка в функции ArrayCompare, возникавшая при сравнении массива с самим собой, но с разным смещением стартовой позиции от начала.
    22. В стандартную библиотеку добавлена поддержка торговли с хеджированием:

      CPosition
      Добавлены методы:

      • SelectByMagic — выбирает позицию по магическому номеру и символу для дальнейшей работы.
      • SelectByTicket — выбирает позицию по тикету для дальнейшей работы.

      CTrade
      Добавлены методы:

      • RequestPosition — получает тикет позиции.
      • RequestPositionBy — получает тикет встречной позиции.
      • PositionCloseBy — закрывает позицию с указанным тикетом позицией встречного направления.
      • SetMarginMode — устанавливает режим расчета маржи в соответствии с настройками текущего счета.

      Добавлена перегрузка для методов:

      • PositionClose — закрывает позицию по тикету.
      • PositionModify — модифицирует позицию по тикету.

      CAccountInfo
      Изменены методы:

      • MarginMode — теперь получает режим расчета маржи. Ранее работал аналогично новому методу StopoutMode.
      • MarginDescription — теперь получает режим расчета маржи как строку. Ранее работал аналогично новому методу StopoutModeDescription.

      Добавлены методы:

      • StopoutMode — получает режим задания минимального уровня залога.
      • StopoutModeDescription — получает режим задания минимального уровня залога как строку.

      CExpert
      Добавлены методы:

      • SelectPosition — выбирает позицию для последующей работы с ней.

    23. Внесен ряд исправлений в стандартную библиотеку.
    24. Исправлена ошибка выгрузки DLL-библиотек.
    25. Добавлена поддержка шаблонных конструкторов классов.

    Сигналы

    1. Исправлен ряд ошибок отображения витрины торговых сигналов.

    MetaEditor

    1. Исправлен поиск слова по файлам в режиме "Только слово целиком".
    2. Добавлен переход к файлу по двойному клику на строке результата компиляции соответствующего файла.
    3. Исправлено отображение некоторых элементов управления в Windows XP.
    4. Обновлена документация.

    1 апреля 2016
    MetaTrader 5 build 1295

    Terminal

    1. Чтобы расширить возможности трейдеров ритейл-форекса, в платформу добавлена вторая система учета — хеджинг. Теперь по инструменту можно иметь множество позиций, в том числе — разнонаправленных. Это позволяет реализовывать торговые стратегии с так называемым локированием — если цена пошла против трейдера, он имеет возможность открыть позицию в противоположном направлении.

      Новая система учета аналогична используемой в MetaTrader 4, она будет привычна трейдерам. При этом они смогут использовать все преимущества пятой версии платформы — исполнение ордеров несколькими сделками (в том числе — частичное), мультивалютный и многопоточный тестер с поддержкой вычислительной сети MQL5 Cloud Network и многое другое.

      Теперь на одном счете можно торговать на бирже, где используется неттинг и по одному инструменту можно иметь только одну позицию. При этом в той же платформе, но на другом счете можно торговать на форексе и использовать хеджирование.

      Как открыть счет с хеджированием и где посмотреть тип учета позиций
      Тип учета позиций задается на уровне счета, он показывается в заголовке окна терминала, а также в журнале:



      Чтобы открыть демо-счет с хеджингом, включите соответствующую опцию:




      Неттинговая система
      Эта система учета подразумевает, что в один момент времени на счете может быть только одна открытая позиция по одному и тому же символу:

      • Если по инструменту существует позиция, при совершении сделки в том же направлении происходит наращивание объема этой позиции.
      • При совершении сделки в обратном направлении происходит уменьшение объема существующей позиции, ее закрытие (при совершении сделки в объеме, равном объему текущей позиции) либо разворот (если объем противоположной сделки больше текущей позиции).


      При этом не имеет значения, в результате какого действия совершается сделка в противоположном направлении — в результате исполнения рыночного ордера или срабатывания отложенного.

      Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:


      Результатом исполнения этих сделок стала одна общая позиция объемом 1 лот.

      Хеджинговая система
      Эта система учета позволяет иметь на счету множество торговых позиций по одному и тому же инструменту, в том числе — разнонаправленных.

      Если по торговому инструменту есть открытая позиция и трейдер совершает новую сделку (или срабатывает отложенный ордер), происходит открытие новой позиции. Существующая позиция не изменяется.

      Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:


      Результатом исполнения этих сделок стало открытие двух отдельных позиций.

      Новый тип торговой операции Close By
      Для счетов с хеджинговым учетом позиций добавлен новый вид торговых операций — закрытие позиции встречной. Эта операция позволяет одновременно закрыть две разнонаправленные позиции по одному и тому же инструменту. Если встречные позиции имеют разное количество лотов, то открытым останется только один ордер из двух. Его объем будет равен разности лотов двух закрытых позиций, а направление позиции и цена открытия — большей (по объему) из закрываемых позиций.

      По сравнению с одиночным закрытием двух позиций, закрытие встречной позволяет сэкономить трейдеру один спред:

      • При одиночном закрытии трейдер дважды платит спред: закрывает покупку по меньшей цене (Bid), а продажу — по большей (Ask).
      • При встречном закрытии для закрытия первой позиции используется цена открытия второй позиции, а для второй позиции — цена открытия первой.


      При закрытии позиции встречной выставляется ордер типа "close by". В комментарии к нему указываются тикеты закрываемых позиций. Закрытие пары встречных позиций происходит двумя сделками типа "out by". Размер итоговой прибыли/убытка, полученного в результате закрытия обеих позиций, указывается только в одной сделке.



    2. Добавлена возможность тестирования торговых роботов и технических индикаторов по реальной тиковой истории.

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

      Чтобы начать тестирование или оптимизацию по реальным тикам, выберите соответствующий режим в тестере стратегий:



      Тиковые данные имеют значительно больший размер, чем минутные. При первом запуске тестирования их скачивание может занять продолжительное время. Скачанные тиковые данные хранятся по месяцам в TKC-файлах в каталоге \bases\[имя торгового сервера]\ticks\[имя символа]\.

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

      Если по инструменту транслируется биржевой стакан цен, бары строятся строго по ценам исполнения последней сделки — Last. В ином случае, тестер сначала пытается строить бары по ценам Last, и только если их нет, использует цены Bid. Событие прихода тика OnTick срабатывает на всех тиках, независимо от того, была ли в них цена Last или нет.

      Обратите внимание, что торговые операции всегда совершаются по ценам Bid и Ask, даже если график строится по ценам Last. Например, эксперт, использующий для торговли только цены открытия бара (в частности, встроенный Moving Average), получит сигнал по одной цене (Last), но сделку совершит уже по другой (Bid или Ask в зависимости от направления). При использовании режима генерации "Все тики", бары строятся по ценам Bid, а сделки совершаются по Bid и Ask. При этом Ask рассчитывается как Bid + фиксированный спред соответствующего минутного бара.

      Если в истории символа есть минутный бар, но тиковых данных за эту минуту нет, тестер сгенерирует тики в режиме "Все тики". Это позволяет протестировать советника на запланированном периоде в случае неполных тиковых данных у брокера. Если в истории символа нет минутного бара, но тиковые данные за эту минуту есть, то эти тики игнорируются. Минутные данные считаются более достоверными.
      В данный момент тестирование и оптимизация по реальным тикам возможны только на локальных и удаленных агентах. Поддержка сети облачных вычислений MQL5 Cloud Network будет добавлена в ближайшее время.

    3. Добавлен Чат. Теперь прямо в торговой платформе можно общаться с друзьями и коллегами на MQL5.community. В чате показываются все личные сообщения из MQL5-аккаунта. Для начала общения войдите в свой аккаунт прямо из окна чата или через настройки платформы: Сервис -> Настройки -> Сообщество.




    4. Упрощен диалог открытия демо-счета, добавлена возможность открытия счетов с хеджированием. Теперь не нужно заполнять большую анкету, достаточно указать основные данные и выбрать торговые параметры: тип счета, депозит, плечо и возможность хеджирования.



    5. Для быстрого начала работы с платформой добавлено автоматическое выделение демо-счета. Если в платформе еще нет ни одного счета, то при запуске выделяется демо-счет на первом доступном торговом сервере. После успешного открытия счет сразу же будет подключен.

    6. Теперь у каждой позиции есть тикет — уникальный номер. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Всем ранее открытым позициям тикет будет назначен автоматически после обновления на новую версию терминала.




    7. Исправлена установка уровней Стоп Лосс и Тейк Профит при выставлении рыночного ордера, приводящего к изменению направления позиции. Ранее соответствующие уровни у новой позиции не устанавливались.
    8. Исправлено отображение цен с четырьмя и более знаками после запятой на элементах управления панели торговли одним кликом.
    9. Исправлена ошибка отображения новости в окне предварительного просмотра перед печатью.
    10. Исправлены ошибки отображения тикового графика.
    11. Исправлено открытие стакана цен после аварийного завершения работы терминала.
    12. Добавлены проверки на разрешенность рыночных ордеров при отображении элементов управления панели торговли одним кликом.
    13. Оптимизирован расчет прибыли и маржи при большом количестве открытых ордеров и позиций.
    14. Добавлен перевод пользовательского интерфейса на малайский язык.
    15. Полностью обновлено руководство пользователя. Свежий дизайн, интерактивный скриншоты и встроенные видеоролики — все, чтобы сделать обучение торговли при помощи MetaTrader 5 максимально простым и удобным:




    MQL5

    1. Добавлена поддержка абстрактных классов и чисто виртуальных функций.

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

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

      Виртуальная функция объявляется как "чистая" с помощью синтаксиса спецификатора чистоты. Рассмотрим в качестве примера класс CAnimal, который создается только для того, чтобы предоставлять общие функции – сами объекты типа CAnimal имеют слишком общий характер для практического применения. Таким образом, класс CAnimal является хорошим кандидатом в абстрактный класс:
      class CAnimal
        {
      public:
                            CAnimal();     // конструктор
         virtual void       Sound() = 0;   // чисто виртуальная функция
      private:
         double             m_legs_count;  // количество ног животного
        };
      
      Здесь функция Sound() является чисто виртуальной, потому что она объявлена со спецификатором чисто виртуальной функции PURE (=0).

      Чисто виртуальными функциями являются только такие виртуальные функции, для которых указан спецификатор чистоты  PURE, а  именно: (=NULL) или (=0). Пример объявления и использования абстрактного класса:
      class CAnimal
        {
      public:
         virtual void       Sound()=NULL;   // PURE method, должен быть переопределен в потомке, сам класс CAnimal стал абстрактным и не может быть создан
        };
      //--- потомок от абстрактного класса
      class CCat : public CAnimal
       {
      public:
        virtual void        Sound() { Print("Myau"); } // PURE переопределен, класс CCat не абстрактный и может быть создан
       };
      
      //--- примеры неправильного использования
      new CAnimal;         // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
      CAnimal some_animal; // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
      
      //--- примеры правильного использования
      new CCat;  // ошибки нет - класс CCat не абстрактный
      CCat cat;  // ошибки нет - класс CCat не абстрактный
      
      Ограничения на использование абстрактных классов
      При вызове конструктором абстрактного класса чистой виртуальной функции (прямо или косвенно) результат будет неопределенным.
      //+------------------------------------------------------------------+
      //| Абстрактный базовый класс                                        |
      //+------------------------------------------------------------------+
      class CAnimal
        {
      public:
         //--- чисто виртуальная функция
         virtual void      Sound(void)=NULL;
         //--- функция
         void              CallSound(void) { Sound(); }
         //--- конструктор
         CAnimal()
          {
           //--- явный вызов виртуального метода
           Sound();
           //--- неявный вызов (через третью функцию)
           CallSound();
           //--- в конструкторе и/или деструкторе всегда вызываются свои функции,
           //--- несмотря на виртуальность и переопределение вызываемой функции в потомке
           //--- если вызываемая функция чисто виртуальная, то
           //--- вызов приведет к критической ошибке выполнения: "pure virtual function call"
          }
        };
      
      Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.

    2. Для облегчения организации событийных моделей добавлена поддержка указателей на функции.

      Чтобы объявить указатель на функцию, определите тип "указатель на функцию", например:
      typedef int (*TFunc)(int,int);
      Теперь TFunc является типом и можно объявить переменную-указатель на функцию:
      TFunc func_ptr;
      В переменную func_ptr можно сохранить адрес функции, чтобы в дальнейшем ее вызывать:
      int sub(int x,int y) { return(x-y); }
      int add(int x,int y) { return(x+y); }
      int neg(int x)       { return(~x);  }
      
      func_ptr=sub;
      Print(func_ptr(10,5));
      
      func_ptr=add;
      Print(func_ptr(10,5));
      
      func_ptr=neg;           // ошибка: neg не имеет тип  int (int,int)
      Print(func_ptr(10));    // ошибка: должно быть два параметра
      
      Указатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса.

    3. В структуру торгового запроса MqlTradeRequest добавлены два новых поля:

      • position — тикет позиции. Следует заполнять при торговле с хеджированием при изменении и закрытии позиции для ее однозначной идентификации. При торговле с неттинговой системой учета заполнение этого поля ни на что не влияет, поскольку идентификация позиции происходит по имени торгового инструмента.
      • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Используется только при хеджинговом учете позиций.

    4. В перечисление типов торговых операций ENUM_TRADE_REQUEST_ACTIONS добавлено значение TRADE_ACTION_CLOSE_BY — закрытие позиции встречной. Используется только при хеджинговом учете позиций.

    5. В перечисления свойств ордеров, сделок и позиций добавлены тикеты соответствующих торговых операций:

      • В ENUM_ORDER_PROPERTY_INTEGER добавлено свойство ORDER_TICKET — тикет ордера. Уникальное число, которое присваивается каждому ордеру.
      • В ENUM_DEAL_PROPERTY_INTEGER добавлено свойство DEAL_TICKET — тикет сделки. Уникальное число, которое присваивается каждой сделке.
      • В ENUM_POSITION_PROPERTY_INTEGER добавлено свойство POSITION_TICKET — тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта позиция, следует использовать свойство POSITION_IDENTIFIER. Значение POSITION_TICKET соответствует MqlTradeRequest::position.

    6. В перечисление типов ордеров ENUM_ORDER_TYPE добавлено значение ORDER_TYPE_CLOSE_BY — ордер на закрытие позиции встречной позицией.
    7. В перечисление свойств ордеров ENUM_ORDER_PROPERTY_INTEGER добавлено значение ORDER_POSITION_BY_ID — идентификатор встречной позиции для ордеров типа ORDER_TYPE_CLOSE_BY.
    8. В перечисление направлений сделки ENUM_DEAL_ENTRY добавлено значение DEAL_ENTRY_OUT_BY — сделка произошла в результате закрытия позиции встречной.
    9. В структуру торговой транзакции MqlTradeTransaction добавлены два аналогичных поля:

      • position — тикет позиции, на которую повлияла транзакция. Заполняется для транзакций, касающихся обработки рыночных ордеров (TRADE_TRANSACTION_ORDER_* кроме TRADE_TRANSACTION_ORDER_ADD, где тикет позиции еще не присвоен) и истории ордеров (TRADE_TRANSACTION_HISTORY_*).
      • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Заполняется только для ордеров на закрытие позиции встречной (close by) и сделок на закрытие встречной (out by).

    10. Добавлена функция PositionGetTicket — возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.
      ulong  PositionGetTicket(
         int  index      // номер в списке позиций
         );
      

    11. Добавлена функция PositionSelectByTicket — выбирает открытую позицию для дальнейшей работы с ней по указанному тикету.
      bool  PositionSelectByTicket(
         ulong   ticket     // тикет позиции
         );
      

    12. В перечисление свойств торговых инструментов ENUM_SYMBOL_INFO_DOUBLE добавлено значение SYMBOL_MARGIN_HEDGED — размер контракта или маржи для одного лота перекрытых позиций (разнонаправленные позиции по одному символу).

      • Если для инструмента задана первоначальная маржа (SYMBOL_MARGIN_INITIAL), то хеджированная маржа указывается как абсолютное значение (в деньгах).
      • Если первоначальная маржа не задана (равна 0), то в SYMBOL_MARGIN_HEDGED указывается размер контракта, который будет использован при расчете маржи по формуле, соответствующей типу торгового инструмента (SYMBOL_TRADE_CALC_MODE).

      Особенности расчета маржи для захеджированных позиций описаны в руководстве пользователя торговой платформы MetaTrader 5.

    13. В перечисление свойств счета ENUM_ACCOUNT_INFO_INTEGER добавлено значение ACCOUNT_MARGIN_MODE — режим расчета маржи для текущего торгового счета:

      • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — используется для внебиржевого рынка при учете позиций в режиме "неттинг" (по одному символу может быть только одна позиция). Расчет маржи осуществляется на основе типа инструмента (SYMBOL_TRADE_CALC_MODE).
      • ACCOUNT_MARGIN_MODE_EXCHANGE — используется для биржевого рынка. Расчет маржи осуществляется на основе дисконтов, указанных в настройках инструментов. Дисконты устанавливаются брокером, однако не могут быть ниже значений, определенных биржей.
      • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — используется для внебиржевого рынка при независимом учете позиций ("хеджинг", по одному символу может быть несколько позиций). Расчет маржи осуществляется на основе типа инструмента (SYMBOL_TRADE_CALC_MODE) и с учетом размера захеджированной маржи (SYMBOL_MARGIN_HEDGED).

    14. В перечисление свойств клиентского терминала ENUM_TERMINAL_INFO_INTEGER добавлено значение TERMINAL_SCREEN_DPI — разрешающая способность вывода информации на экран измеряется в количестве точек на линейный дюйм поверхности (DPI). Знание этого параметра позволяет задавать размеры графических объектов таким образом, чтобы они выглядели одинаково на мониторах с различной разрешающей способностью.

    15. В перечисление свойств клиентского терминала ENUM_TERMINAL_INFO_INTEGER добавлено значение TERMINAL_PING_LAST — последнее известное значение пинга до торгового сервера в микросекундах. В одной секунде миллион микросекунд.

    16. Исправлен возврат результата вызова функции SendFTP. Ранее при удачной отсылке возвращалось значение FALSE вместо TRUE.
    17. Исправлена ошибка в функции StringConcatenate, в некоторых случаях приводившая к ошибке выполнения "Access violation".
    18. Исправлен ряд ошибок при работе с функциями-шаблонами.
    19. Теперь функции Print, Alert и Comment могут выводить строки размером более 4000 символов.
    20. Исправлена ошибка в функции ArrayCompare, возникавшая при сравнении массива с самим собой, но с разным смещением стартовой позиции от начала.
    21. В стандартную библиотеку добавлена поддержка торговли с хеджированием:

      CPosition
      Добавлены методы:

      • SelectByMagic — выбирает позицию по магическому номеру и символу для дальнейшей работы.
      • SelectByTicket — выбирает позицию по тикету для дальнейшей работы.

      CTrade
      Добавлены методы:

      • RequestPosition — получает тикет позиции.
      • RequestPositionBy — получает тикет встречной позиции.
      • PositionCloseBy — закрывает позицию с указанным тикетом позицией встречного направления.
      • SetMarginMode — устанавливает режим расчета маржи в соответствии с настройками текущего счета.

      Добавлена перегрузка для методов:

      • PositionClose — закрывает позицию по тикету.
      • PositionModify — модифицирует позицию по тикету.

      CAccountInfo
      Изменены методы:

      • MarginMode — теперь получает режим расчета маржи. Ранее работал аналогично новому методу StopoutMode.
      • MarginDescription — теперь получает режим расчета маржи как строку. Ранее работал аналогично новому методу StopoutModeDescription.

      Добавлены методы:

      • StopoutMode — получает режим задания минимального уровня залога.
      • StopoutModeDescription — получает режим задания минимального уровня залога как строку.

      CExpert
      Добавлены методы:

      • SelectPosition — выбирает позиции для последующей работы с ней.

    22. Внесен ряд исправлений в стандартную библиотеку.

    Сигналы

    1. Исправлен ряд ошибок отображения витрины торговых сигналов.

    Tester

    1. Исправлена ошибка, в результате которой не рассчитывалась комиссия на некоторых типах торговых инструментов.
    2. Исправлено заполнение поля Expert у торговых ордеров, возникших в результате срабатывания SL/TP, в соответствии со значением поля Expert у соответствующей позиции. Ранее оно не заполнялось.
    3. Исправлено переключение на вкладки результатов обычной и форвардной оптимизации.
    4. Исправлен расчет и отображение индикатора "Envelopes".
    5. Оптимизировано выполнение визуального тестирования.
    6. Оптимизирован расчет прибыли и маржи при большом количестве открытых ордеров и позиций.
    7. Оптимизировано выполнение торговых операций при высокочастотной торговле.
    8. Теперь синхронизация истории не производится при запросе свойств неосновного символа, не требующих текущих котировок. Например,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE и т.п. Раньше при любом запросе свойства неосновного символа производилась синхронизация истории по данному символу.

    MetaEditor

    1. Исправлен поиск слова по файлам в режиме "Только слово целиком".
    2. Добавлен переход к файлу по двойному клику на строке результата компиляции соответствующего файла.
    3. Исправлено отображение некоторых элементов управления в Windows XP.
    Обновлена документация.




    предыдущая12345678...11