Если данных меньше, тестер сдвигает фактическую дату старта на ближайшую доступную, где условия выполняются.
Из-за этих требований иногда возникает ситуация: тестирование начинается не с указанной даты, а с более поздней. В журнале тестера это сопровождается сообщением:
start time changed to 2024.03.15 00:00 to provide data at beginning
class Base { public: void Print(int x) { ::Print("Base int: ", x); } void Print(double y){ ::Print("Base double: ", y); } }; class Derived : public Base { public: void Print(string s){ ::Print("Derived string: ", s); } }; void OnStart() { Derived d; d.Print("text"); // вызов Derived::Print(string) d.Print(10); // ВНИМАНИЕ! вызов Derived::Print(string), т.к. Base::Print скрыт (недоступен) d.Base::Print(10); // явный вызов скрытого метода предка }Некоторое время компилятор MQL5 будет выдавать предупреждение, если скрытый метод предка лучше подходит по параметрам вызова, чем доступный метод потомка. Пример для приведенного выше кода d.Print(10):
class Base { protected: void Print(int x) { ::Print("Base int: ", x); } void Print(double y){ ::Print("Base double: ", y); } }; class Derived : public Base { public: void Print(string s){ ::Print("Derived string: ", s); } using Base::Print; // возвращаем перегрузки Print из Base }; void OnStart() { Derived d; d.Print("text"); // Derived::Print(string) d.Print(42); // Base::Print(int) d.Print(3.14); // Base::Print(double) }Если убрать using Base::Print;, то вызовы d.Print(42) и d.Print(3.14) будут недоступны — останется только метод Derived::Print(string)
Опубликована Справка по работе с MQL5 Algo Forge. Из нее вы узнаете все ключевые преимущества Git, без лишней сложности:
Клонирование чужого проекта
На forge.mql5.io зайди в проект, который ты хочешь клонировать, и выполни команду Fork. Заполни имя создаваемого форка и описание и сохрани изменения:
Затем перейди в MetaEditor с тем же MQL-аккаунтом и выполни команду обновить (Refresh) в Навигаторе. В папке Shared projects появится твой клонированный проект. Теперь загрузи его с портала Algo Forge командой Git Clone. Ты скачаешь не только все файлы проекта, но и всю историю коммитов и все ветки этого проекта. То есть ты сможешь продолжить работу над форком, имея всю историю клонированного проекта.
struct A { int y; string func(double x) { return(__FUNCSIG__); } }; struct B : public A { string func(int x) // метод скрывает A::func { return(__FUNCSIG__); } }; void OnStart(void) { B b; b.func(M_PI); // по новым правилам это вызов B::func b.A::func(M_PI); // вызов скрытого метода A::func }Это упрощает чтение кода и устраняет неоднозначность, ранее сопровождавшуюся лишь предупреждением компилятора.
input int somename=42; int somename(int x) { return(42); }
int somename(ENUM_TIMEFRAMES TF=PERIOD_CURRENT); int somename(ENUM_TIMEFRAMES TF=0) // ошибка, несоответствие типа параметра по умолчанию, несмотря на их одинаковые значения { return(42); }
enum A { Value }; enum B { Value // ошибка, имя Value уже используется в перечислении A }; void OnStart(void) { enum C { Value // ошибки нет, в области видимости OnStart имя Value не используется }; }В разных областях видимости можно использовать одинаковые имена.
template<typename T> void Initializer(matrix<T>& mat,int method=0); matrix<double> A(10,10,Initializer,42); // ошибка, функция Initializer должна быть типизирована явно matrix<double> A(10,10,Initializer<double>); // ошибка, отсутствует параметр 'method' для вызова функции Initializer (значения по умолчанию больше не поддерживаются) matrix<double> A(10,10,Initializer<double>,42); // ошибки нет
В последних версиях мобильного приложения MetaTrader 5 для iOS
появилось множество новых функций, которые помогут трейдерам держать
руку на пульсе финансовых рынков, где бы они ни находились.
Установите последнюю версию приложения и расширьте свои торговые возможности:
![]() |
![]() |
matrix A(2, 3); matrix B(3, 2); matrix C = A @ B; // Результат: матрица C размером [2,2]Матричное умножение (матрица × вектор)
matrix M(2, 3); vector V(3); vector R = M @ V; // Результат: вектор R из 2 элементовМатричное умножение (вектор × матрица)
matrix M(2, 3); vector V(1, 2); vector R = V @ M; // Результат: вектор R из 3 элементовСкалярное произведение (вектор × вектор)
vector V1(1, 3), V2(1, 3); double r = V1 @ V2; // Результат: скаляр
static vector vector::Random( const ulong size, // длина вектора const double min=0.0, // минимальное значение const double max=1.0 // максимальное значение ); static matrix matrix::Random( const ulong rows, // количество строк const ulong cols // количество столбцов const float min=0.0, // минимальное значение const float max=1.0 // максимальное значение );
Обновление будет доступно через систему Live Update.
В последних версиях мобильного приложения MetaTrader 5 для iOS мы добавили множество удобных функций для графиков, а также сделали несколько важных исправлений для более стабильной работы приложения.
Установите последнюю версию приложения и расширьте свои торговые возможности:
![]() |
![]() |
В MetaTrader 5 build 4755 мы исправили ошибку в расчете тройного свопа в тестере стратегий, происходившую при некоторых сочетаниях условий тестирования. Также мы внесли ряд более мелких улучшений и исправлений, чтобы сделать работу платформы еще более стабильной.
matrix<complex<T>> matrix<complex<T>>::TransposeConjugate(void) const;Метод возвращает новую сопряженно-транспонированную матрицу, в которой элементы исходной матрицы транспонированы и приведены к их комплексно сопряженным значениям.
int matrix<T>::CompareEqual(const matrix<T>& mat) constВозвращаемые значения:
pip install --upgrade MetaTrader5
Функция | Действие |
---|---|
Singular Value Decomposition, алгоритм divide and conquer. Считается наиболее быстрым среди других алгоритмов SVD (lapack-функция GESDD). | |
Singular Value Decomposition, QR-алгоритм. Считается классическим алгоритмом SVD (lapack-функция GESVD). | |
Singular Value Decomposition, алгоритм QR with pivoting (lapack-функция GESVDQ). | |
Singular Value Decomposition, алгоритм bisection (lapack-функция GESVDX). | |
Singular Value Decomposition, алгоритм Jacobi high level (lapack-функция GEJSV). | |
Singular Value Decomposition, алгоритм Jacobi low level (lapack-функция GESVJ). В некоторых случаях вычисляет малые сингулярные значения и их сингулярные векторы гораздо более точно, чем другие подпрограммы SVD. | |
Singular Value Decomposition, алгоритм divide and conquer для бидиагональной матрицы (lapack-функция BDSDC). | |
Singular Value Decomposition, алгоритм bisection для бидиагональных матриц (lapack-функция BDSVDX). | |
Вычисление собственных значений и собственных векторов обычной квадратной матрицы классическим алгоритмом (lapack-функция GEEV). | |
Вычисление собственных значений и собственных векторов симметричной или эрмитовой (комплексно-сопряжённой) матрицы при помощи алгоритма divide and conquer (lapack-функции SYEVD, HEEVD). | |
Функция-метод расчета относительных вкладов спектральных компонент по собственным значениям. | |
Функция-метод расчета реконструированных и прогнозируемых данных с использованием спектральных компонент входного временного ряда. | |
Функция-метод расчета реконструированных компонент входного временного ряда и их вклады. | |
Функция-метод расчета реконструированного временного ряда с использованием первых component_count компонент. |
Terminal
MQL5
Web Terminal
Обновление доступно через систему Live Update.
MetaTrader 5 Android
Обновите ваши мобильные приложения на билд 4360 через Google Play, Huawei AppGallery или скачайте файл APK.
Добавлена горячая клавиша Alt+X для вызова списка экспертов, исправлены ошибки в MetaTester при установке свойств графического объекта «Рисунок». Также запрещено подключение агентов тестирования к MQL5 Cloud Network в виртуальных средах и при отсутствии поддержки AVX у процессора.
Terminal
MetaTester
Web Terminal
MetaEditor
Terminal
MQL5
MetaTrader 5 Web Terminal
vector<double/complex> operator[](const int i) const; vector<double/complex> operator[](const ulong i) const;Теперь вместо них используется один метод с константным возвращаемым значением:
const vector<double/complex> operator[](const ulong i) const;Внесенная правка позволит отловить некорректное использование результата по месту: в новой версии Alglib код mat[row][col]=x работает не так, как в старой. Ранее это была запись в матрицу, а теперь — запись во временный объект vector<double/complex>, который после записи сразу же уничтожается.
bool ArrayToFP16(ushort &dst_array[],const float &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayToFP16(ushort &dst_array[],const double &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayToFP8(uchar &dst_array[],const float &src_array[],ENUM_FLOAT8_FORMAT fmt); bool ArrayToFP8(uchar &dst_array[],const double &src_array[],ENUM_FLOAT8_FORMAT fmt); bool ArrayFromFP16(float &dst_array[],const ushort &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayFromFP16(double &dst_array[],const ushort &src_array[],ENUM_FLOAT16_FORMAT fmt); bool ArrayFromFP8(float &dst_array[],const uchar &src_array[],ENUM_FLOAT8_FORMAT fmt); bool ArrayFromFP8(double &dst_array[],const uchar &src_array[],ENUM_FLOAT8_FORMAT fmt);Поскольку форматы вещественных чисел для 16 и 8 бит могут отличаться, в параметре fmt в функциях конверсии необходимо указывать, какой именно формат числа требуется обработать. Для 16-битных версий используется новое перечисление NUM_FLOAT16_FORMAT, которое на данный момент имеет следующие значения:
Улучшено отображение маржевых требований в спецификации контракта. Теперь помимо коэффициентов и исходных параметров для расчета отображается итоговое значение маржи. Если сумма залога зависит от объема позиции, в диалоге будут показаны соответствующие уровни.
Terminal
MQL5
MetaEditor
Tester
Web Terminal
Terminal
MQL5
MetaTrader 5 Web Terminal
Terminal
MetaTrader 5 Web Terminal
Terminal
MQL5
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { complex a=1+1i; complex b=a.Conjugate(); Print(a, " ", b); /* (1,1) (1,-1) */ vectorc va= {0.1+0.1i, 0.2+0.2i, 0.3+0.3i}; vectorc vb=va.Conjugate(); Print(va, " ", vb); /* [(0.1,0.1),(0.2,0.2),(0.3,0.3)] [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)] */ matrixc ma(2, 3); ma.Row(va, 0); ma.Row(vb, 1); matrixc mb=ma.Conjugate(); Print(ma); Print(mb); /* [[(0.1,0.1),(0.2,0.2),(0.3,0.3)] [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)]] [[(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)] [(0.1,0.1),(0.2,0.2),(0.3,0.3)]] */ ma=mb.Transpose().Conjugate(); Print(ma); /* [[(0.1,0.1),(0.1,-0.1)] [(0.2,0.2),(0.2,-0.2)] [(0.3,0.3),(0.3,-0.3)]] */ }
from sys import argv data_path=argv[0] last_index=data_path.rfind("\\")+1 data_path=data_path[0:last_index] from sklearn.datasets import load_iris iris_dataset = load_iris() from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0) from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=1) knn.fit(X_train, y_train) # Convert into ONNX format from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType initial_type = [('float_input', FloatTensorType([None, 4]))] onx = convert_sklearn(knn, initial_types=initial_type) path = data_path+"iris.onnx" with open(path, "wb") as f: f.write(onx.SerializeToString())Откройте созданный onnx-файл в MetaEditor:
struct MyMap { long key[]; float value[]; };Здесь мы использовали динамические массивы с соответствующими типами. В данном случае можно использовать фиксированные массивы, поскольку для данной модели Map всегда содержит 3 пары ключ+значение.
//--- объявим массив для приема данных с выходного слоя output_probability MyMap output_probability[]; ... //--- выполнение модели OnnxRun(model,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);
MetaEditor
Web Terminal