Месяц назад Microsoft выпустила большое обновление операционной системы Windows 10 Creators Update (версия 1703). После его установки у некоторых пользователей перестали запускаться MQL4-программы. В новой версии платформы MetaTrader 4 build 1080 эта проблема исправлена. Советники и индикаторы будут корректно запускаться на графиках, повторная компиляция в новом MetaEditor при этом не потребуется.
С 1 октября 2017 года прекращается поддержка клиентских терминалов MetaTrader 4 ниже 1065-го билда. Такие терминалы не смогут подключаться к серверам новых версий. Мы настоятельно рекомендуем заранее обновить ваши терминалы.
Исправлена ошибка перезапуска экспертов на графиках после смены таймфрейма. Теперь работа советников не останавливается, переинициализация происходит корректно.
Обновление платформы
MetaTrader 4 вызвано выходом предварительной версии Windows 10
Insider Preview build 15007. Изменения в механизмах безопасности ОС Windows 10 привели к тому, что в некоторых случаях
клиентские терминалы MetaTrader 4 не могли запуститься.
Обязательно установите новую версию платформы, чтобы подготовиться к выходу очередного обновления Windows
10.
Добавлен чат, в котором участники MQL5.community могут общаться между собой. Просто указав логин нужного пользователя в адресате сообщения, вы можете отправить ему послание сразу на мобильное устройство.
Появилась возможность переключаться между 22 доступными языками прямо в платформе. Если вы предпочитаете английский язык в трейдинге, включите его в разделе "Настройки" ("О программе" в iPad), не переключая язык всего устройства.
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 } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // вернет код символа 'H'
Внесены исправления по крешлогам.
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)); // ошибка: должно быть два параметраУказатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса.
Исправления по крешлогам.
Теперь для доступа к приложению можно установить ПИН-код. Ваши счета будут дополнительно защищены даже в случае утери мобильного устройства. Включите "Блокировку экрана" в настройках приложения. По умолчанию будет использоваться тот же ПИН-код, что и для доступа к генератору одноразовых паролей.
В новую версию также внесены многочисленные улучшения и исправления.
Новая версия веб-платформы
MetaTrader 4 получила полный набор индикаторов для технического анализа.
Теперь в ней доступны 30 самых популярных технических инструментов, как
и в десктопной версии MetaTrader 4:
Accelerator Oscillator |
DeMarker | Moving Average |
Accumulation/Distribution | Envelopes | Moving Average of Oscillator |
Alligator | Force Index |
On Balance Volume |
Average Directional Movement Index | Fractals | Parabolic SAR |
Average True Range |
Gator Oscillator | Relative Strength Index |
Awesome Oscillator | Ichimoku Kinko Hyo | Relative Vigor Index |
Bears Power |
MACD | Standard Deviation |
Bollinger Bands |
Market Facilitation Index |
Stochastic Oscillator |
Bulls Power |
Momentum | Volumes |
Commodity Channel Index |
Money Flow Index | Williams' Percent Range |
Продолжается работа над локализацией приложения, теперь интерфейс веб-платформы доступен на 38 языках мира. Были добавлены переводы еще на 14 языков:
Голландский |
Литовский | Хорватский |
Греческий | Румынский | Чешский |
Иврит | Сербский |
Шведский |
Итальянский | Словенский |
Эстонский |
Латышский |
Финский | |
Откройте веб-платформу прямо сейчас и сами оцените обновленное приложение!
В свежей версии веб-платформы MetaTrader 4 существенно ускорена работа графиков благодаря применению современной технологии WebGL — теперь даже множество одновременно запущенных индикаторов не влияют на быстродействие веб-платформы.
Начаты работы по внедрению технических индикаторов. На текущий момент уже
доступны индикаторы
Билла Вильямса:
В Мастер MQL4 добавлена ссылка на обучающий видеоролик "Как собрать торгового робота". Посмотрите 3-минутное видео и создайте торгового робота, не написав ни одной строчки кода.
Исправления по крешлогам.
Исправления по крешлогам.
//+------------------------------------------------------------------+ //| 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(i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(i=0;i<10;i++) str+=" "+(string)ExtPtrArray[i].X(); Print(str); //--- созданные через new объекты CFoo удалять не нужно, они удалятся в деструкторе объекта TArrayPtr<CFoo> }Результат выполнения:
Исправления по крешлогам.