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 */
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"); }
#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); }Результат:
#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); //--- }Результат:
Обновлена документация.
Добавлены всплывающие подсказки для кнопок Buy, Sell и Close в диалогах торговли. Подсказки поясняют, какие именно активы будут куплены и проданы при выполнении той или иной операции, помогая начинающим трейдерам понять суть торгового процесса.
Возможности библиотеки
Как использовать
Файлы библиотеки ALGLIB расположены в каталоге \MQL5\Include\Math\Alglib. Для использования функций включите основной файл библиотеки в свою программу:
В стандартную библиотеку включены функции работы с математической статистикой. Теперь в MQL5 доступны возможности языка R — одного из лучших инструментов статистической обработки и анализа данных.
Возможности библиотеки
Статистическая библиотека содержит функции для расчета статистических характеристик данных, а также функции для работы со статистическими распределениями:
Как использовать
Файлы статистической библиотеки расположены в каталоге \MQL5\Include\Math\Stat. Для использования включите файл с нужными функциями в свою программу, например:
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
Подробное описание функций библиотеки читайте в статье Статистические распределения в MQL5 - берем лучшее из R.
В стандартную библиотеку включена MQL5-версия библиотеки Fuzzy, в которой реализованы системы нечеткого логического вывода Мамдани и Сугено.
Возможности библиотеки
Как использовать
Файлы библиотеки Fuzzy расположены в каталоге \MQL5\Include\Math\Fuzzy. Для использования включите файл с нужными функциями в свою программу, например:
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
Подробное описание библиотеки можно найти в Code Base: Fuzzy - библиотека для работы с нечеткой логикой
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); } } }
//--- одинаковые свечи, окрашенные в один цвет #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, номер_модификатора, цвет) , где номер_модификатора можеть иметь следующие значения:
//--- установим цвет контура и теней PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- установим цвет тела для бычьей свечи PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- установим цвет тела для медвежьей свечи PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
Обновлена документация.
class CFoo final { //--- тело класса }; class CBar : public CFoo { //--- тело класса };При попытке наследования от класса с модификатором final, как показано в примере выше, компилятор выдаст ошибку:
class CFoo { void virtual func(int x) const { } };Далее метод переопределяется в наследуемом классе:
class CBar : public CFoo { void func(short x) { } };Но по ошибке тип аргумента изменяется с int на short. Фактически, в этом случае уже происходит не переопределение, а перегрузка метода. Действуя в соответствии с алгоритмом определения перегруженной функции, в определенных ситуациях компилятор может выбрать метод, определенный в базовом классе, вместо переопределенного метода.
class CBar : public CFoo { void func(short x) override { } };Если при переопределении будет изменена сигнатура метода, компилятор не сможет найти в родительском классе метод с точной такой же сигнатурой и выдаст ошибку компиляции:
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };При попытке переопределения метода с модификатором final, как показано в примере выше, компилятор выдаст ошибку:
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'
Обновлена документация.
Tester: Исправлен расчет комиссии в годовых процентах при тестировании.
Tester: Исправлен пересчет и отображение баланса на графике, формируемом в процессе тестирования.
После 2 месяцев публичного тестирования состоялся официальный выпуск веб-версии мультирыночной платформы MetaTrader 5. Она позволяет торговать на финансовых рынках в любом браузере и любой операционной системе. При этом не требуется устанавливать программу на компьютер, достаточно доступа в интернет и любого веб-браузера.
Приложение сочетает в себе ключевые преимущества десктопной платформы (скорость, мультирыночность и расширенные торговые функции) с удобством и кроссплатформенностью веб-решения. Важным новшеством релизной версии является стакан, который позволяет видеть глубину рынка, а также выставлять одним кликом рыночные и отложенные ордера.
Веб-платформа позволяет проводить технический анализ и совершать торговые
операции точно так же, как в десктопной версии. В приложении доступны:
Было |
Стало |
|
---|---|---|
Срабатывание | Все виды отложенных ордеров и 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. В
ценовом потоке мы получили новые текущие цены:
На
биржевых инструментах триггером для срабатывания стоп-ордеров является
цена Last. Поэтому, поступление в потоке цены Last=72580 привело к
активации ордера Buy Stop. Ранее именно эта цена 72580 была бы
использована для исполнения данного ордера. Такое поведение было
некорректным, поскольку цены Ask=72580 для исполнения операции на
покупку на рынке нет.
Исправления по крешлогам.
По многочисленным просьбам трейдеров разработана веб-версия торговой платформы 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 // тикет позиции
);
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.
Произведен ряд улучшений и исправлений в работе тестера стратегий. Значительно уменьшены потери времени на промежуточные подготовительные операции и сетевые задержки. Ускорено тестирование и оптимизация во всех режимах: при работе с локальными агентами тестирования, с фермой агентов в локальной сети и при использовании MQL5 Cloud Network.
Исправления по крешлогам.
Обновлена документация.
Обновление доступно через систему LiveUpdate.
Опубликовано обновление платформы MetaTrader 5. Обновление содержит следующие изменения:
MetaTrader 5 Client Terminal build 1085
Таким образом вы можете в любой момент изменить количество графиков и
список символов, состав запущенных программ и их входные
параметры, настройки терминала и подписку на Сигналы.
При выполнении миграции вся информация записывается в лог клиентского терминала.
MetaTrader 5 Android build 1052
В Google Play стала доступна новая версия мобильного терминала MetaTrader 5 для Android. В ней исправлены некоторые ошибки и улучшена стабильность работы. В ближайших версиях планируется добавление аналитических объектов и системы обмена сообщениями.
Загрузить приложение можно по ссылке: https://download.mql5.com/cdn/mobile/mt5/android?hl=ru&utm_source=www.metatrader5.com
Обновление будет доступно через систему LiveUpdate.
Агенты тестирования переведены на работу только в 64-разрядных системах. Данное решение обусловлено необходимостью следовать развитию IT-индустрии. Отказ от старых технологий в пользу новых позволит увеличить производительность вычислений и даст возможность дальнейшему развитию сети облачных вычислений MQL5 Cloud Network.
Изменения в компонентах платформы:
int WebRequest (string method, string url,string headers,int timeout, const char &data[], int data_size,char &result[], string &result_headers)
Данная функция позволяет явно формировать содержимое заголовка HTTP-запроса, предоставляя более гибкий механизм взаимодействия с различными Web-сервисами. Пример - Автоматическая публикация с WebRequest()
Исправления по крешлогам.
Обновлена документация.
Обновление доступно через систему LiveUpdate.