По многочисленным просьбам трейдеров разработана веб-версия торговой платформы MetaTrader 5. Новинка сочетает в себе удобство и кроссплатформенность веб-терминала с преимуществами десктопной "пятерки" — скоростью, мультирыночностью, расширенными торговыми функциями.
Веб-платформа MetaTrader 5 стала доступной на сайте MQL5.community и позволяет торговать на финансовых рынках через любой браузер в любой операционной системе (Windows, Mac, Linux). Для этого не нужно устанавливать никаких программ, достаточно иметь доступ в интернет.
В бета-версии трейдерам сразу же доступны:
Неттинговая система
Эта
система учета подразумевает, что в один момент времени на счете может
быть только одна открытая позиция по одному и тому же символу:
При этом не имеет
значения, в результате какого действия совершается сделка в
противоположном направлении — в результате исполнения рыночного ордера
или срабатывания отложенного.
Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:
Результатом исполнения этих сделок стала одна общая позиция объемом 1 лот.
Хеджинговая система
Эта
система учета позволяет иметь на счету множество торговых позиций по
одному и тому же инструменту, в том числе — разнонаправленных.
Если
по торговому инструменту есть открытая позиция и трейдер совершает
новую сделку (или срабатывает отложенный ордер), происходит открытие
новой позиции. Существующая позиция не изменяется.
Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:
Результатом исполнения этих сделок стало открытие двух отдельных позиций.
Новый тип торговой операции Close By
Для
счетов с хеджинговым учетом позиций добавлен новый вид торговых
операций — закрытие позиции встречной. Эта операция позволяет
одновременно закрыть две разнонаправленные позиции по одному и тому же
инструменту. Если встречные позиции имеют разное количество лотов, то
открытым останется только один ордер из двух. Его объем будет равен
разности лотов двух закрытых позиций, а направление позиции и цена
открытия — большей (по объему) из закрываемых позиций.
По сравнению с одиночным закрытием двух позиций, закрытие встречной позволяет сэкономить трейдеру один спред:
При закрытии позиции встречной выставляется ордер типа "close by". В комментарии к нему указываются тикеты закрываемых позиций. Закрытие пары встречных позиций происходит двумя сделками типа "out by". Размер итоговой прибыли/убытка, полученного в результате закрытия обеих позиций, указывается только в одной сделке.
При импорте тикеты ордеров и позиций (в том числе ордеров истории) не
сохраняются, поскольку одной записи в торговой истории MetaTrader 4
может соответствовать до 4 записей в истории MetaTrader 5. Всем торговым
записям проставляются новые тикеты.
Номера счетов могут быть сохранены или заменены новыми в зависимости от того, как брокер произведет импорт.
При тестировании на реальных тиках через MQL5 Cloud Network может передаваться большой объем интернет-трафика. Это может существенно повлиять на итоговую стоимость использования вычислительной сети.
class CAnimal { public: CAnimal(); // конструктор virtual void Sound() = 0; // чисто виртуальная функция private: double m_legs_count; // количество ног животного };Здесь функция Sound() является чисто виртуальной, потому что она объявлена со спецификатором чисто виртуальной функции PURE (=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" } };Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.
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)); // ошибка: должно быть два параметраУказатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса.
ulong PositionGetTicket( int index // номер в списке позиций );
bool PositionSelectByTicket(
ulong ticket // тикет позиции
);
Неттинговая система
Эта система учета подразумевает, что в один момент времени на счете может
быть только одна открытая позиция по одному и тому же символу:
При этом не имеет значения, в результате какого действия совершается сделка
в противоположном направлении — в результате исполнения рыночного ордера
или срабатывания отложенного.
Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5
лота каждая:
Результатом исполнения этих сделок стала одна общая позиция объемом 1
лот.
Хеджинговая система
Эта система учета позволяет иметь на счету множество торговых позиций по
одному и тому же инструменту, в том числе — разнонаправленных.
Если по торговому инструменту есть открытая позиция и трейдер совершает
новую сделку (или срабатывает отложенный ордер), происходит открытие новой
позиции. Существующая позиция не изменяется.
Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5
лота каждая:
Результатом исполнения этих сделок стало открытие двух отдельных позиций.
Новый тип торговой операции Close By
Для счетов с хеджинговым учетом позиций добавлен новый вид торговых операций
— закрытие позиции встречной. Эта операция позволяет одновременно закрыть
две разнонаправленные позиции по одному и тому же инструменту. Если встречные
позиции имеют разное количество лотов, то открытым останется только один
ордер из двух. Его объем будет равен разности лотов двух закрытых позиций,
а направление позиции и цена открытия — большей (по объему) из закрываемых
позиций.
По сравнению с одиночным закрытием двух позиций, закрытие встречной позволяет
сэкономить трейдеру один спред:
При закрытии позиции встречной выставляется ордер типа "close by". В комментарии к нему указываются тикеты закрываемых позиций. Закрытие пары встречных позиций происходит двумя сделками типа "out by". Размер итоговой прибыли/убытка, полученного в результате закрытия обеих позиций, указывается только в одной сделке.
class CAnimal { public: CAnimal(); // конструктор virtual void Sound() = 0; // чисто виртуальная функция private: double m_legs_count; // количество ног животного };Здесь функция Sound() является чисто виртуальной, потому что она объявлена со спецификатором чисто виртуальной функции PURE (=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" } };Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.
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)); // ошибка: должно быть два параметраУказатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса.
ulong PositionGetTicket( int index // номер в списке позиций );
bool PositionSelectByTicket(
ulong ticket // тикет позиции
);
Новая система учета — как в MetaTrader 4. При этом трейдеры могут использовать все преимущества пятой версии платформы — исполнение ордеров несколькими сделками (в том числе — частичное), стоп-лимитные ордера и многое другое.
Торговлю с хеджированием можно попробовать сразу же после установки обновления. При открытии демо-счета включите опцию "Использовать хеджирование", она будет доступна, если торговый сервер брокера уже обновлен и настроен.
Новая система учета — как в MetaTrader 4. При этом трейдеры могут использовать все преимущества пятой версии платформы — исполнение ордеров несколькими сделками (в том числе — частичное), стоп-лимитные ордера и многое другое.
Торговлю с хеджированием можно попробовать сразу же после установки обновления. При открытии демо-счета включите опцию "Использовать хеджирование", она будет доступна, если торговый сервер брокера уже обновлен и настроен.
MetaEditor: В Мастер MQL5 добавлена ссылка на обучающий видеоролик "Как собрать торгового робота в Мастере MQL5". Посмотрите 3-минутное видео и создайте торгового робота, не написав ни одной строчки кода.
2015.10.14 14:48:18.486 Data Folder: C:\Program Files\MetaTrader 5 2015.10.14 14:48:18.486 Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7 920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00 2015.10.14 14:48:18.486 MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
struct MqlTick { datetime time; // Время последнего обновления цен double bid; // Текущая цена Bid double ask; // Текущая цена Ask double last; // Текущая цена последней сделки (Last) ulong volume; // Объем для текущей цены Last long time_msc; // Время последнего обновления цен в миллисекундах uint flags; // Флаги тиков };У каждого тика всегда заполняются все параметры, независимо от того, изменились ли данные по сравнению с предыдущим тиком. Это позволяет всегда иметь актуальное состояние цен на любой момент времени без поиска предыдущих значений по тиковой истории. Например, с тиком могла измениться только цена бид, но в структуре помимо новой цены будут указаны и остальные параметры: предыдущая цена аск, объем и т.д. Чтобы узнать, какие именно данные изменились с текущим тиком, анализируйте его флаги:
//+------------------------------------------------------------------+ //| TemplTest.mq5 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Объявляем шаблонный класс | //+------------------------------------------------------------------+ template<typename T> class TArray { protected: T m_data[]; public: bool Append(T item) { int new_size=ArraySize(m_data)+1; int reserve =(new_size/2+15)&~15; //--- if(ArrayResize(m_data,new_size,reserve)!=new_size) return(false); //--- m_data[new_size-1]=item; return(true); } T operator[](int index) { static T invalid_index; //--- if(index<0 || index>=ArraySize(m_data)) return(invalid_index); //--- return(m_data[index]); } }; //+------------------------------------------------------------------+ //| Шаблонный класс массива указателей, в деструкторе он удаляет | //| объекты, указатели на которые хранились в нём. | //| | //| Обратите внимание на наследование от шаблонного класса TArray | //+------------------------------------------------------------------+ template<typename T> class TArrayPtr : public TArray<T *> { public: void ~TArrayPtr() { for(int n=0,count=ArraySize(m_data);n<count;n++) if(CheckPointer(m_data[n])==POINTER_DYNAMIC) delete m_data[n]; } }; //+------------------------------------------------------------------+ //| Объявим класс, указатели на его объекты будем хранить в массиве | //+------------------------------------------------------------------+ class CFoo { int m_x; public: CFoo(int x):m_x(x) { } int X(void) const { return(m_x); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ TArray<int> ExtIntArray; // инстанцируем шаблон TArray (специализируем шаблон TArray типом int) TArray<double> ExtDblArray; // инстанцируем шаблон TArray (специализируем шаблон TArray типом double) TArrayPtr<CFoo> ExtPtrArray; // инстанцируем шаблон TArrayPtr (специализируем шаблон TArrayPtr типом CFoo) //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- наполняем массивы данными for(int i=0;i<10;i++) { int integer=i+10; ExtIntArray.Append(integer); double dbl=i+20.0; ExtDblArray.Append(dbl); CFoo *ptr=new CFoo(i+30); ExtPtrArray.Append(ptr); } //--- выведем содержимое массивов string str="Int:"; for(int i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(int i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(int i=0;i<10;i++) str+=" "+(string)ExtPtrArray[i].X(); Print(str); //--- созданные через new объекты CFoo удалять не нужно, они удалятся в деструкторе объекта TArrayPtr<CFoo> }Результат выполнения:
int ObjectsDeleteAll( long chart_id, // идентификатор графика const string prefix, // префикс имени объекта int sub_window=-1, // индекс окна int object_type=-1 // тип объекта для удаления );
Исправления по крешлогам.
Обновлена документация.Полный текст новости читайте здесь.
Теперь любое приложение в Маркете можно купить в один шаг без регистрации прямо в платформах MetaTrader 4/5. Для этого нужно лишь нажать кнопку "Купить" и выбрать подходящую платежную систему.
После этого вы будете перенаправлены на страницу платежной системы, где сможете завершить покупку. PayPal, WebMoney, Neteller или банковская карта - оплачивайте свои покупки в магазине готовых роботов и индикаторов привычным для себя способом.
После покупки мы все же рекомендуем зарегистрировать аккаунт MQL5.community - ваша покупка будет автоматически привязана к нему. Так вы получите возможность обновлять продукт и устанавливать его на других компьютерах. Кроме того, аккаунт MQL5.community откроет вам доступ к множеству других сервисов для платформ MetaTrader - торговым сигналам для копирования сделок успешных трейдеров, виртуальному хостингу для бесперебойной работы ваших приложений и фриланс-сервису для заказа эксклюзивных роботов у разработчиков.
Теперь вы точно знаете самый простой и быстрый способ получить торгового робота. Более 5 000 различных приложений для MetaTrader уже ждут вас в Маркете - выбирайте и покупайте!
Активы
(Assets) прибавляются к собственным средствам (Equity) и увеличивают
размер свободной маржи (Free Margin), что позволяет увеличить объемы
торговых операций на счете.
Таким образом, появилась возможность создавать счета с различными типами обеспечения.
ulong GetMicrosecondCount();
Данная функция может быть использована для дополнительной профилировки исполнения программы и выявления "узких мест".Исправления по крешлогам.
Обновлена документация.
Обновление доступно через систему LiveUpdate.
Оцените все эти изменения сами — обновите MetaTrader 5 iOS прямо сейчас.