Funktion |
Aktion |
---|---|
Singulärwertzerlegung, Divide-and-Conquer-Algorithmus; er gilt als der schnellste unter den anderen SVD-Algorithmen (Lapack-Funktion GESDD). |
|
Singulärwertzerlegung, QR-Algorithmus; er gilt als klassischer SVD-Algorithmus (Lapack-Funktion GESVD). |
|
Singulärwertzerlegung, QR mit Pivoting-Algorithmus (Lapack-Funktion GESVDQ). |
|
Singulärwertzerlegung, Bisektionsalgorithmus (Lapack-Funktion GESVDX). |
|
Singulärwertzerlegung, Jacobi-Algorithmus auf hohem Niveau (Lapack-Funktion GEJSV). |
|
Singulärwertzerlegung, Jacobi-Low-Level-Algorithmus (Lapack-Funktion GESVJ). Die Methode berechnet kleine singuläre Werte und ihre singulären Vektoren in bestimmten Fällen mit viel größerer Genauigkeit als andere SVD-Routinen. |
|
Singulärwertzerlegung, Divide-and-Conquer-Algorithmus für bidiagonale Matrizen (Lapack-Funktion BDSVDX). |
|
Singulärwertzerlegung, Bisektionsalgorithmus für bidiagonale Matrizen (Lapack-Funktion BDSVDX). |
|
Berechnung von Eigenwerten und Eigenvektoren einer regelmäßigen quadratischen Matrix mit dem klassischen Algorithmus (Lapack-Funktion GEEV). |
|
Berechnung von Eigenwerten und Eigenvektoren einer symmetrischen oder hermiteschen (komplex konjugierten) Matrix mit Hilfe des Divide-and-Conquer-Algorithmus (Lapack-Funktionen SYEVD, HEEVD). |
|
Eine Methodenfunktion zur Berechnung der relativen Beiträge von Spektralkomponenten auf der Grundlage ihrer Eigenwerte |
|
Eine Methodenfunktion zur Berechnung rekonstruierter und vorhergesagter Daten unter Verwendung von Spektralkomponenten der Eingangszeitreihen. |
|
Eine Methodenfunktion zur Berechnung der rekonstruierten Komponenten der Eingangszeitreihe und ihrer Beiträge. |
|
Eine Methodenfunktion zur Berechnung der rekonstruierten Zeitreihe unter Verwendung der ersten component_count-Komponenten. |
Terminal
MQL5
MetaTrader 5 Web-Terminal
Die Aktualisierung wird über das Live-Update-System verfügbar sein.
MetaTrader 5 Android
Aktualisieren Sie Ihre mobilen Anwendungen über Google Play, Huawei AppGallery oder durch das Herunterladen der APK-Datei.
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;Sie wurden durch eine einzige Methode mit einem konstanten Rückgabewert ersetzt:
const vector<double/complex> operator[](const ulong i) const;Diese Änderung wird dazu beitragen, die falsche Verwendung des Ergebnisses an Ort und Stelle zu erfassen, da in der neuen Alglib-Version der Code mat[row][col]=x anders funktioniert als in der alten Version. Zuvor war damit das Schreiben in eine Matrix gemeint. Jetzt wird der Wert in ein temporäres Objekt vector<double/complex> geschrieben, das nach der Aufzeichnung sofort zerstört wird.
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);Da sich die realen Zahlenformate für 16 und 8 Bit unterscheiden können, muss der Parameter „fmt“ in den Konvertierungsfunktionen angeben, welches Zahlenformat verarbeitet werden muss. Für 16-Bit-Versionen wird die neue Enumeration NUM_FLOAT16_FORMAT verwendet, die derzeit folgende Werte hat:
Terminal
MQL5
MetaEditor
Tester
Web-Terminal
Terminal
MQL5
MetaTrader 5 Web-Terminal
Terminal
MetaTrader 5 Web-Terminal
Terminal
MQL5
//+------------------------------------------------------------------+ //| Skript Programm Start Funktion | //+------------------------------------------------------------------+ 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) # Konvertierung ins 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())Öffnen Sie die erstellte onnx-Datei in MetaEditor:
struct MyMap { long key[]; float value[]; };Hier haben wir dynamische Arrays mit entsprechenden Typen verwendet. In diesem Fall können wir feste Arrays verwenden, da die Map für dieses Modell immer 3 Schlüssel/Wertpaare enthält.
//--- ein Array deklarieren, um Daten von der Ausgabeschicht output_probability zu erhalten MyMap output_probability[]; ... //--- Modell läuft OnnxRun(model,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);
MetaEditor
MetaTrader 5 Web Terminal build 3980
Terminal
Der Bericht ist in vier Registerkarten unterteilt, die jeweils aggregierte Informationen enthalten:
Neue Berichte ermöglichen es Ihnen, die Handelsergebnisse unter verschiedenen Aspekten visuell auszuwerten, indem Sie einfach auf die Registerkarten klicken. Histogramme, Schaubilder und Diagramme sind interaktiv und liefern zusätzliche Informationen, wenn der Mauszeiger über sie bewegt wird. Unsere Designer haben sich viel Mühe gegeben, die Berichte so einfach und klar wie möglich zu gestalten. Probieren Sie sie einfach aus!
Terminal MetaTrader 5 x64 build 3914 started for MetaQuotes Software Corp.
Terminal Windows 10 build 19045, 20 x Intel Xeon E5-2630 v4 @ 2.20GHz, AVX, 41 / 63 Gb memory, 58 / 280 Gb disk, UAC, GMT+2
VPS-Hosting
MQL5
#define MACRO1 /* #define MACRO2 */ void OnStart() { #ifdef MACRO2 Print( 2 ); #else Print( 1 ); #endif }
void OnStart() { Print("CPU name: ",TerminalInfoString(TERMINAL_CPU_NAME)); Print("CPU cores: ",TerminalInfoInteger(TERMINAL_CPU_CORES)); Print("CPU architecture: ",TerminalInfoString(TERMINAL_CPU_ARCHITECTURE)); Print(""); Print("EX5 architecture: ",__CPU_ARCHITECTURE__); } CPU name: 12th Gen Intel Core i9-12900K CPU cores: 24 CPU architecture: AVX2 + FMA3 EX5 architecture: AVX
extern int X=0; void OnStart() { }
extern int X; void OnStart() { }
extern int X; int Y=X; void OnStart(void) { Print("Y=",Y," X=",X); } int X=_Digits;
Lösungen an
Die ALGLIB-Bibliothek wurde auf die Version 3.19 aktualisiert. ALGLIB ist eine leistungsstarke Bibliothek für numerische Analysen, die für die Arbeit mit numerischen Methoden und Datenanalysealgorithmen entwickelt wurde.
Wir haben bestehende
Bibliotheksklassen überarbeitet, um Matrizen und Vektoren zu verwenden,
und auch neue Funktionen aus ALGLIB 3.19 hinzugefügt. Der gesamte
Quellcode wurde überarbeitet und in einen einheitlichen Designstil
gebracht. Der Quellcode der ALGLIB-Bibliothek befindet sich im
Verzeichnis <Terminaldaten>\MQL5\Include\Math\Alglib. Die
Testskripts befinden sich in MQL5\Scripts\UnitTests\Alglib.
Neben der Bibliothek selbst wurden auch die Testskripte aktualisiert — die Anzahl der Tests stieg von 62 auf 91 für Klassen und von 143 auf 152 für Schnittstellen. Daher bieten die Entwickler der MetaTrader 5-Plattform den Händlern die effizientesten
MetaEditor
Tester
Behoben wurde ein Fehler in den Absturzprotokollen.
MetaTrader 5 Web Terminal Build 3950
Terminal
MQL5
double vector::RegressionMetric( const vector& vector_true, // true values const ENUM_REGRESSION_METRIC metric // metric ); double matrix::RegressionMetric( const matrix& matrix_true, // true values const ENUM_REGRESSION_METRIC metric // metric ); vector matrix::RegressionMetric( const matrix& matrix_true, // true values const ENUM_REGRESSION_METRIC metric, // metric const int axis // axis );
vector vector::LinearRegression(); matrix matrix::LinearRegression( ENUM_MATRIX_AXIS axis=AXIS_NONE // Achse, entlang der die Regression berechnet wird );Beispiel:
vector vector_a; //--- den Vektor mit Preisen füllen vector_a.CopyRates(_Symbol,_Period,COPY_RATES_CLOSE,1,100); //--- eine lineare Regression erhalten vector vector_r=vector_a.LinearRegression();Die Ergebnisse sind in der Grafik dargestellt:
ulong vector::HasNan(); ulong matrix::HasNan();Wenn ein entsprechende Paar von Elementen mit NaN-Werten verglichen wird, betrachten die Methoden Compare und CompareByDigits diese Elemente als gleich, während bei einem gewöhnlichen Vergleich von Fließkommazahlen NaN != NaN.
Die Struktur OnnxTypeInfo, die für Operationen mit ONNX-Modellen verwendet wird, wurde geändert:
struct OnnxTypeInfo { ENUM_ONNX_TYPE type; // parameter type OnnxTensorTypeInfo tensor; // tensor description OnnxMapTypeInfo map; // map description OnnxSequenceTypeInfo sequence; // sequence description };
Der Datentyp wird in der Struktur über neue Unterstrukturen angegeben:
struct OnnxTensorTypeInfo { ENUM_ONNX_DATATYPE data_type; // data type in the tensor long dimensions[]; // number of elements }; struct OnnxMapTypeInfo { ENUM_ONNX_DATA_TYPE key_type; // key type OnnxTypeInfo type_info; // value type }; struct OnnxSequenceTypeInfo { OnnxTypeInfo type_info; // data type in the sequence };Je nach OnnxTypeInfo::type (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP oder ONNX_TYPE_SEQUENCE) wird die entsprechende Unterstruktur gefüllt.
bool vector<T>::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,ulong start_pos,ulong count); bool vector<T>::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,ulong count); bool vector<T>::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,datetime stop_time);
MetaEditor
Tester
Behoben wurde ein Fehler in den Absturzprotokollen.
Web Terminal
MQL5.community
Terminal
MQL5
Web Terminal
Web Terminal
MQL5
MQL5: Hinzugefügt wurden die Flags COPY_TICKS_VERTICAL und COPY_RATES_VERTICAL für die Methoden CopyTicks, CopyTicksRange und CopyRates.
Standardmäßig werden Ticks und Zeitreihendaten entsprechend einer horizontalen Achse in die Matrix kopiert, d. h. die Daten werden am rechten Ende der Zeilen hinzugefügt. Für das Training von ONNX-Modelllaufaufgaben muss eine solche Matrix transponiert werden, um die Eingabedaten einzugeben:
const long ExtOutputShape[] = {1,1}; // Ausgangsform des Modells
const long ExtInputShape [] = {1,10,4}; // Eingangsform des Modells
#resource "Python/model.onnx" as uchar ExtModel[]// das Modell als Resource
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int OnStart(void)
{
matrix rates;
//--- get 10 bars
if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
return(-1);
//--- input a set of OHLC vectors
matrix x_norm=rates.Transpose();
vector m=x_norm.Mean(0);
vector s=x_norm.Std(0);
matrix mm(10,4);
matrix ms(10,4);
Durch die Angabe des zusätzlichen Flags COPY_RATES_VERTICAL (bzw. COPY_TICKS_VERTICAL für Ticks) beim Aufruf der Methode können Sie die zusätzliche Datentransposition vermeiden:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
int OnStart(void)
{
matrix rates;
//--- get 10 bars
if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10))
return(-1);
//--- input a set of OHLC vectors
MetaEditor
Terminal
Terminal
MQL5
Kompilieren Sie das Projekt und lassen Sie es auf EURUSD H1 laufen, um das Ergebnis zu sehen.
Neben
dem Modell und dem MQL5-Code, der es ausführt, enthält das Projekt auch
das Python-Skript PricePredictionTraining.py. Es zeigt, wie Sie selbst
ein ONNX-Modell erstellen können. Um das Skript auszuführen,
installieren Sie Python auf Ihrem Computer und die erforderlichen Module
über die Eingabeaufforderung:
#import "mmlib.dll"
bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
#import
C++extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
Zusätzlich zu den Puffern sollten Sie Matrix- und Vektorgrößen für eine korrekte Verarbeitung übergeben.Die neue Funktion CopySeries zum Kopieren von synchronisierten Zeitreihen aus MqlRates in separate Arrays hinzugefügt.
Die Funktion CopySeries ermöglicht es, mit einem einzigen Aufruf nur die erforderlichen Zeitreihen in verschiedene spezifizierte Arrays zu erhalten, wobei alle Zeitreihendaten synchronisiert werden. Das bedeutet, dass alle Werte in den resultierenden Arrays bei einem bestimmten Index N zum selben Balken des angegebenen Symbol/Zeitrahmenpaares gehören. Daher muss der Programmierer die empfangenen Zeitreihen nicht zusätzlich mit der Eröffnungszeit der Balken synchronisieren.
Im Gegensatz zu CopyRates, das den gesamten Satz von Zeitreihen als MqlRates-Array zurückgibt, ermöglicht die Funktion CopySeries, bestimmte erforderliche Zeitreihen in separaten Arrays zu erhalten. Dies kann durch die Angabe einer Kombination von Flags geschehen, um den Typ der Zeitreihe auszuwählen. Die Reihenfolge der an die Funktion übergebenen Arrays muss mit der Reihenfolge der Felder in der MqlRates-Struktur übereinstimmen:
struct MqlRates
{
datetime time; // period beginning time
double open; // open price
double high; // high price for the period
double low; // low price for the period
double close; // close price
long tick_volume; // tick volume
int spread; // spread
long real_volume; // exchange volume
}
Wenn Sie also die Werte der Zeitreihen „time“, „close“ und „real_volume“ für die letzten 100 Balken des aktuellen Symbols/Zeitrahmens abrufen möchten, sollten Sie den folgenden Aufruf verwenden:
datetime time[];
double close[];
long volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
Die Reihenfolge der Arrays „time, close, volume“ muss mit der Reihenfolge der Felder in der Struktur MqlRates übereinstimmen. Die Reihenfolge der Werte in der Maske rates_mask wird nicht berücksichtigt. Die Maske könnte auch folgendermaßen aussehen:
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
Beispiel
//--- input parameters
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo =D'2023.01.01 00:00:00';
input uint InpCount =20;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(void)
{
//--- arrays to get timeseries from the Rates structure
double open[];
double close[];
float closef[];
datetime time1[], time2[];
//---request close prices to a double array
ResetLastError();
int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
PrintFormat("1. CopySeries returns %d values. Error code=%d", res1, GetLastError());
ArrayPrint(close);
//--- now also request open prices; use float array for close prices
ResetLastError();
int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
PrintFormat("2. CopySeries returns %d values. Error code=%d", res2, GetLastError());
ArrayPrint(closef);
//--- compare the received data
if((res1==res2) && (time1[0]==time2[0]))
{
Print(" | Time | Open | Close double | Close float |");
for(int i=0; i<10; i++)
{
PrintFormat("%d | %s | %.5f | %.5f | %.5f |",
i, TimeToString(time1[i]), open[i], close[i], closef[i]);
}
}
/* Result
1. CopySeries returns 0 values. Error code=0
[ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
[10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
2. CopySeries returns 0 values. Error code=0
[ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
[10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
| Time | Open | Close double | Close float |
0 | 2023.03.01 17:00 | 1.06660 | 1.06722 | 1.06722 |
1 | 2023.03.01 18:00 | 1.06722 | 1.06733 | 1.06733 |
2 | 2023.03.01 19:00 | 1.06734 | 1.06653 | 1.06653 |
3 | 2023.03.01 20:00 | 1.06654 | 1.06520 | 1.06520 |
4 | 2023.03.01 21:00 | 1.06520 | 1.06573 | 1.06573 |
5 | 2023.03.01 22:00 | 1.06572 | 1.06649 | 1.06649 |
6 | 2023.03.01 23:00 | 1.06649 | 1.06694 | 1.06694 |
7 | 2023.03.02 00:00 | 1.06683 | 1.06675 | 1.06675 |
8 | 2023.03.02 01:00 | 1.06675 | 1.06684 | 1.06684 |
9 | 2023.03.02 02:00 | 1.06687 | 1.06604 | 1.06604 |
*/
}
MetaEditor
Tester
MetaTrader 5 Web Terminal Build 3620
MetaTrader 5 Client Terminal Build 3550
MetaTrader 5 Web Terminal Build 3550
Web Terminal
Terminal
MQL5
long preferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
void OnStart() { string cpu,os; //--- cpu=TerminalInfoString(TERMINAL_CPU_NAME); os=TerminalInfoString(TERMINAL_OS_VERSION); PrintFormat(„CPU: %s, OS: %s“,cpu,os); }Ergebnis:
MetaEditor