.
Terminal
MQL5
Terminal Web
La mise à jour sera disponible via le système Live Update.
MetaTrader 5 Android
Mettez à jour vos applications mobiles via Google Play, Huawei AppGallery ou en téléchargeant le fichier APK.
Terminal
MetaTester
Terminal Web
MetaEditor
Terminal
MQL5
Terminal Web MetaTrader 5
vector<double/complex> operator[](const int i) const; vector<double/complex> operator[](const ulong i) const;Elles ont été remplacées par une méthode unique avec une valeur de retour constante :
const vector<double/complex> operator[](const ulong i) const;Cette modification aidera à capturer une utilisation incorrecte du résultat en place car dans la nouvelle version d'Alglib, le code mat[row][col]=x fonctionne différemment de l'ancienne version. Auparavant, cela signifiait écrire dans une matrice. Désormais, la valeur est écrite dans un vecteur d'objet temporaire<double/complex>, qui est immédiatement détruit après l'enregistrement.
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);Étant donné que les formats de nombres réels pour 16 et 8 bits peuvent être différents, le paramètre "fmt" des fonctions de conversion doit indiquer quel format de nombres doit être traité. Pour les versions 16 bits, la nouvelle énumération NUM_FLOAT16_FORMAT est utilisée, avec les valeurs suivantes :
Correction des erreurs rapportées dans les journaux de crash.
Terminal
MQL5
MetaEditor
Testeur
Terminal Web
Terminal
MQL5
Terminal Web MetaTrader 5
Terminal
Terminal Web MetaTrader 5
Terminal
MQL5
//+------------------------------------------------------------------+ //| Fonction de démarrage du programme de script | //+------------------------------------------------------------------+ 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) # Conversion en format ONNX 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())Ouvre le fichier onnx créé dans MetaEditor :
struct MyMap { long key[]; float value[]; };Nous avons utilisé ici des tableaux dynamiques avec les types correspondants. Dans ce cas, nous pouvons utiliser des tableaux fixes car la carte de ce modèle contient toujours 3 paires clé+valeur.
//--- déclaration du tableau pour récupérer les données de la couche de sortie output_probability MyMap output_probability[] ; ... //--- modèle en cours d'exécution OnnxRun(model,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);
MetaEditor
Terminal Web
Terminal
The report is divided into four tabs, each containing aggregated information:
De nouveaux rapports vous permettent d'évaluer visuellement les résultats des transactions sous divers aspects en cliquant simplement sur les onglets. Les histogrammes, les graphiques et les diagrammes sont interactifs et fournissent des informations supplémentaires au passage du curseur de la souris. Nos concepteurs se sont efforcés de rendre les rapports aussi simples et clairs que possible. Essayez-les !
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;
MetaEditor
Tester
Updated user interface translations.
Fixed errors reported in crash logs.
MetaTrader 5 Web Terminal build 3950
Terminal
MQL5
double vector::RegressionMetric( const vector& vector_true, // valeurs vraies const ENUM_REGRESSION_METRIC metric // métrique ); double matrix::RegressionMetric( const matrix& matrix_true, // valeurs vraies const ENUM_REGRESSION_METRIC metric // métrique ); vector matrix::RegressionMetric( const matrix& matrix_true, // valeurs vraies const ENUM_REGRESSION_METRIC metric, // métrique const int axis // axe );
vector::LinearRegression(); matrice matrix::LinearRegression( ENUM_MATRIX_AXIS axis=AXIS_NONE // axe le long duquel la régression est calculéeExemple :
vecteur vector_a; //--- remplit le vecteur avec les prix vector_a.CopyRates(_Symbol, _Period, COPY_RATES_CLOSE,1, 100); //--- obtient une régression linéaire vecteur vector_r=vecteur_a.LinearRegression();Les résultats sont visualisés dans un graphique :
ulong vector::HasNan(); ulong matrix::HasNan();Lors de la comparaison d’une paire d'éléments ayant des valeurs NaN, les méthodes Compare et CompareByDigits considèrent ces éléments comme égaux, alors que dans le cas d'une comparaison habituelle de nombres à virgule flottante, NaN != NaN.
Modification de la structure OnnxTypeInfo utilisée pour les opérations avec les modèles ONNX (Open Neural Network Exchange) :
struct OnnxTypeInfo { ENUM_ONNX_TYPE type; // type du paramètre OnnxTensorTypeInfo tensor; // description du tenseur OnnxMapTypeInfo map; // description de la carte OnnxSequenceTypeInfo sequence; // description de la séquence };
Le type de données est spécifié dans la structure à l'aide de nouvelles sous-structures :
struct OnnxTensorTypeInfo { ENUM_ONNX_DATATYPE data_type; // type de données dans le tenseur long dimensions[]; // nombre d'éléments }; struct OnnxMapTypeInfo { ENUM_ONNX_DATA_TYPE key_type; // type de la clé OnnxTypeInfo type_info; // type de la valeur }; struct OnnxSequenceTypeInfo { OnnxTypeInfo type_info; // type de données dans la séquence };En fonction de OnnxTypeInfo::type (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP ou ONNX_TYPE_SEQUENCE), la sous-structure concernée est remplie.
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
Correction des erreurs rapportées dans les journaux de crash.
Terminal Web
MQL5.community
Terminal
MQL5
Terminal Web
Terminal Web
MQL5
MQL5 : Ajout des flags COPY_TICKS_VERTICAL et COPY_RATES_VERTICAL pour les méthodes CopyTicks, CopyTicksRange et CopyRates.
Par défaut, les ticks et les séries sont copiées dans la matrice le long de l'axe horizontal, ce qui signifie que les données sont ajoutées à droite, à la fin de la ligne. Dans les tâches d'exécution du modèle ONNX entraîné , ce type de matrice doit être transposée afin d'alimenter les données d'entrée :
const long ExtOutputShape[] = {1,1}; // model's output shape
const long ExtInputShape [] = {1,10,4}; // model's input shape
#resource "Python/model.onnx" as uchar ExtModel[]// model as a 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);
En spécifiant le flag supplémentaire COPY_RATES_VERTICAL (COPY_TICKS_VERTICAL pour les ticks) lors de l'appel à la méthode, il n’est plus nécessaire de transposer les données :
//+------------------------------------------------------------------+
//| 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
Compilez le projet et exécutez-le sur EURUSD H1 pour voir le résultat.
En
plus du modèle et du code MQL5 qui l'exécute, le projet comprend
également le script Python PricePredictionTraining.py. Il montre comment
vous pouvez créer vous-même un modèle ONNX. Pour exécuter le script,
installez Python sur votre ordinateur et les modules requis à partir de
la ligne de commande :
#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)
En plus des buffers, vous devez transmettre les tailles de matrice et de vecteur pour un traitement correct.Ajout d'une nouvelle fonction CopySeries pour copier des séries temporelles synchronisées de MqlRates dans des tableaux séparés.
La fonction CopySeries permet d'obtenir uniquement les séries temporelles nécessaires dans différents tableaux spécifiés au cours d'un appel, et toutes les données des séries temporelles seront synchronisées. Cela signifie que toutes les valeurs des tableaux résultants à un certain indice N appartiendront à la même barre sur la paire Symbole/Timeframe spécifiée. Par conséquent, le programmeur n'a pas besoin de synchroniser les séries temporelles reçues avec l'heure d'ouverture de la barre.
Contrairement à CopyRates, qui renvoie l'ensemble complet des séries temporelles sous la forme d'un tableau MqlRates, la fonction CopySeries permet d'obtenir des séries temporelles spécifiques requises dans des tableaux séparés. Cela peut se faire en spécifiant une combinaison de drapeaux pour sélectionner le type de série temporelle. L'ordre des tableaux transmis à la fonction doit correspondre à l'ordre des champs dans la structure MqlRates :
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
}
Donc si vous avez besoin d'obtenir les valeurs des séries temporelles 'time', 'close' et 'real_volume' pour les 100 dernières barres du Symbol/Timeframe actuel, vous devez faire l'appel suivant :
datetime time[];
double close[];
long volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
L'ordre des tableaux "time, close, volume" doit correspondre à l'ordre des champs de la structure MqlRates. L'ordre des valeurs dans rate_mask est ignoré. Le masque pourrait être le suivant :
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
Exemple
//--- 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
Nouvelle version 3620 du Terminal Web MetaTrader 5
Terminal
Terminal Web
Terminal Web
Terminal Client
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); }Résultat :
MetaEditor
Terminal
MQL5
//--- the first handle parameter is ignored when obtaining the last error code
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
//--- get the code of the last OpenCL error
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
string desc; // to get the text description of the error
//--- use the error code to get the text description of the error
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);
//--- to get the description of the last OpenCL error without receiving the code, pass CL_LAST_ERROR
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);
Le nom de l'énumération interne est transmis comme description de l'erreur. Son explication peut être trouvée sur https://registry.khronos.org/OpenCL/specs/3.0-unified/html /OpenCL_API.html#CL_SUCCESS.
Par exemple, la valeur CL_INVALID_KERNEL_ARGS signifie "Renvoyé lors de
la mise en file d'attente d'un noyau lorsque certains arguments du
noyau n'ont pas été définis ou sont invalides." (" Returned when
enqueuing a kernel when some kernel arguments have not been set or are
invalid." )