Nuova MetaTrader 5 build 3620: Miglioramenti al terminale web, supporto ONNX e moltiplicazioni matriciali veloci in MQL5

Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
La nuova versione della piattaforma MetaTrader 5 aggiornata sarà rilasciata venerdì 10 marzo 2023.
L'aggiornamento fornisce miglioramenti al terminale web. Abbiamo implementato una serie di modelli di colori per l'interfaccia del terminale Web e abbiamo migliorato la finestra delle specifiche dei simboli.
Inoltre, la nuova versione fornisce General Matrix Multiplication (GeMM) in MQL5. Questo algoritmo velocizza i calcoli sulla maggior parte dei processori. Il nuovo algoritmo è attualmente supportato nel metodo matrix::GeMM.
Abbiamo anche implementato il supporto per le operazioni con i modelli ONNX in MQL5. Ciò faciliterà notevolmente l'uso delle reti neurali negli Expert Advisor.
La nuova versione presenta le seguenti modifiche:
Terminale Client MetaTrader 5 build 3620
ONNX è un formato open source per i modelli di apprendimento automatico. Questo formato è supportato da molte piattaforme, tra cui Chainer, Caffee2 e PyTorch. Create un modello ONNX utilizzando strumenti specializzati, integratelo nella vostra applicazione MQL5 e utilizzatelo per prendere decisioni di trading.
Le descrizioni di tutte le funzioni supportate sono disponibili nella documentazione. Un esempio di modello ONNX di prova è disponibile in progetti pubblici in MetaEditor. Individuare il progetto ONNX.Price.Prediction in "Toolbox \ Progetti pubblici" e selezionare Join nel menu contestuale. Il progetto verrà scaricato sul tuo computer e apparirà nel Navigatore:
Compilare il progetto ed eseguirlo su EURUSD H1 per vedere il risultato.
Oltre al modello e al codice MQL5 che lo esegue, il progetto include anche lo script Python PricePredictionTraining.py. Mostra come creare da soli un modello ONNX. Per eseguire lo script, installare Python sul computer e i moduli necessari da riga di comando:
python -m pip install --upgrade tensorflow
python -m pip install --upgrade pandas
python -m pip install --upgrade scikit-learn
python -m pip install --upgrade matplotlib
python -m pip install --upgrade tqdm
python -m pip install --upgrade metatrader5
python -m pip install --upgrade onnx==1.12
python -m pip install --upgrade tf2onnx
Il nuovo algoritmo è attualmente supportato nel metodo matrix::GeMM . Se il processore supporta le istruzioni AVX e FMA (la maggior parte dei processori rilasciati dopo il 2013 supporta queste istruzioni), l'algoritmo verrà abilitato automaticamente.
Matrici e vettori vengono passati a una DLL come puntatore a un buffer. Ad esempio, per passare una matrice di tipo float, il parametro corrispondente della funzione esportata dalla DLL deve avere un puntatore al buffer di tipo float. Per esempio:
MQL5
#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)
Oltre ai buffer, è necessario passare le dimensioni della matrice e del vettore per una corretta elaborazione.MQL5: Aggiunta la nuova funzione CopySeries per copiare serie temporali sincronizzate da MqlRates in array separati.
La funzione CopySeries consente di ottenere solo le serie temporali necessarie in diversi array specificati durante una chiamata, mentre tutti i dati delle serie temporali verranno sincronizzati. Ciò significa che tutti i valori negli array, risultanti a un certo indice N apparterranno alla stessa barra sulla coppia Simbolo/Timeframe specificata. Pertanto, non è necessario che il programmatore sincronizzi ulteriormente le serie temporali ricevute con l'ora di apertura delle barre.
A differenza di CopyRates, che restituisce il set completo di serie temporali come matrice MqlRates, la funzione CopySeries consente di ottenere specifiche richieste di serie temporali in array separati. Questo può essere fatto specificando una combinazione di flag per selezionare il tipo di serie temporale. L'ordine degli array passati alla funzione deve corrispondere all'ordine dei campi nella struttura MqlRates :
struct MqlRates { datetime time; // periodo di inizio double open; // prezzo di apertura double high; // prezzo massimo del periodo double low; // prezzo minimo del periodo double close; // prezzo di chiusura long tick_volume; // tick volume int spread; // spread long real_volume; // volume degli scambi }
Pertanto, se è necessario ottenere il valori delle serie temporali 'time', 'close' e 'real_volume' per le ultime 100 barre dell'attuale Simbolo/timeframe, è necessario utilizzare la seguente chiamata:
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'ordine degli array "time, close, volume" deve corrispondere all'ordine dei campi della struttura . L'ordine dei valori in rate_mask viene ignorato. La maschera potrebbe essere la seguente:
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
Esempio
//--- parametri di input 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 per ottenere le serie temporali dalla struttura Rates double open[]; double close[]; float closef[]; datetime time1[], time2[]; //---richiesta prezzi di chiusura in un array double 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); //--- ora richiediamo anche i prezzi di apertura; utilizza array float per i prezzi di chiusura 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); //--- confrontare i dati ricevuti 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]); } } /* Risultato 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 | */ }
Terminale Web MetaTrader 5 build 3620
L'aggiornamento sarà disponibile attraverso il sistema Live Update.