Обновлена документация.
В MetaTrader 5 Android добавлено представление торговой истории в виде позиций. Ранее во вкладке "История" отражались только сделки и ордера из истории, теперь же анализ торговли можно проводить в разрезе позиций. Для этого все сделки, относящиеся к позиции, группируются в единую запись, где можно увидеть:
Добавлено представление торговой истории в виде позиций. Ранее во вкладке "История" отражались только сделки и ордера из истории, теперь в неё добавлены и позиции. Торговая платформа собирает данные по сделкам, относящимся к позиции, и группирует эти данные в единую запись. В ней можно увидеть:
//+------------------------------------------------------------------+ //| Шаблонная функция | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Специальная перегрузка для случая bool+string | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }В результате выполнения кода мы увидим, что для пары int+string была использована шаблонная функция Assign(), а при втором вызове для пары bool+string уже использовалась перегруженная версия.
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // явная специализация шаблонной функции }Таким образом, специализация происходит не через параметры вызова, а прямым указанием типов.
Обновлена документация.
Обновлена документация.
Добавлена возможность авторизации и
регистрации MQL5.com-аккаунта через
Facebook. Теперь, если у вас есть профиль в этой социальной сети, вы можете в несколько кликов получить доступ к чатам и всему
набору сервисов для MetaTrader 5.
#resource путь_к_файлу_ресурса as тип_ресурсной_переменной имя_ресурсной_переменной
#resource "data.bin" as int ExtData[] // объявление массива числового типа, содержащего данные из файла data.bin #resource "data.bin" as MqlRates ExtData[] // объявление массива простых структур, содержащего данные из файла data.bin #resource "data.txt" as string ExtCode // объявление строки, содержащей данные файла data.txt #resource "data.txt" as string ExtCode[] // объявление строкового массива, содержащего строки файла data.txt #resource "image.bmp" as bitmap ExtBitmap[] // объявление одномерного массива, содержащего в себе растр из файла BMP, размер массива = height * width #resource "image.bmp" as bitmap ExtBitmap2[][] // объявление двумерного массива, содержащего в себе растр из файла BMP, размер массива [height][width]
Обновлена документация.
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");
Исправления по крешлогам.
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'
Обновлена документация.