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

 

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.

Nuova MetaTrader 5 build 3620: Miglioramenti al terminale web e moltiplicazioni veloci delle matrici in MQL5

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

  1. Terminale: Corretto il calcolo del profitto totale nei rapporti di trading.
  2. Terminale: Aggiornati i dati fondamentali per gli strumenti di trading disponibili attraverso la finestra del Market Watch.
  3. Terminale: Risolto l’avvio della piattaforma di trading con Wine 7.0.1 nei sistemi Linux.
  4. Terminale: Corretta l'aggiunta di simboli al Depth of Market tramite la barra di ricerca. Un simbolo trovato tramite descrizione non può essere aggiunto alla lista facendo clic sulla sua riga.
  5. MQL5: Aggiunto il supporto per le operazioni con i modelli ONNX (Open Neural Network Exchange).

    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:


    Un esempio di lavoro con un modello ONNX in progetti pubblici


    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.exe -m pip install --upgrade pip
    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
    Le istruzioni per l'uso di ONNX sono disponibili nella documentazione.

  6. MQL5: È stato aggiunto il supporto per la General Matrix Multiplication (GeMM). Questo algoritmo velocizza i calcoli su alcuni tipi di processore attraverso attività parallele e l'utilizzo ottimizzato delle cache L1/L2/L3. La velocità di calcolo è paragonabile a quella di pacchetti popolari come Math Kernel Library (MKL) e OpenBLAS. I test comparativi dettagliati saranno presto pubblicati.

    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.

  7. MQL5: Aggiunta la possibilità di trasferire matrici e vettori a DLL. Ciò consente l’importazione di funzioni che utilizzano i relativi tipi, da variabili esterne.

    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.

  8. 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   |
    */
      }
  9. MQL5: Corretto il funzionamento della funzione OrderSend . La richiesta della funzione potrebbe restituire un ticket d'ordine errato se lo stesso account è stato utilizzato contemporaneamente su più piattaforme.
  10. MQL5: Corretta l'importazione di librerie EX5. Si verifica un errore se il nome della libreria importata corrisponde al nome del file in cui è stata importata.
  11. MetaEditor: È stato aggiunto l'invio di notifiche push ai membri del progetto condiviso. La nuova opzione può notificare agli utenti le modifiche alle impostazioni e ai file del progetto. Per abilitare le notifiche, inserisci il tuo MetaQuotes ID nella sezione "Impostazioni \ Sicurezza" del tuo profilo MQL5.community .


    Notifiche push sugli aggiornamenti del progetto


  12. MetaEditor: Aggiornate le icone dei file nel Navigatore. Nuove metafore più semplici ne faciliteranno la comprensione.
  13. Tester: Risolto un errore che causava il troncamento del parametro della stringa di input se conteneva il carattere “|”.
  14. Corretti gli errori segnalati nei registri degli arresti anomali.

Terminale Web MetaTrader 5 build 3620

  1. Aggiunti modelli di colori pronti all’uso per l'interfaccia del terminale web. I modelli influiscono sulla visualizzazione delle barre e delle linee del grafico e sui prezzi nel Market Watch e nei rendiconti finanziari del conto. Il nostro team di progettazione ha preparato modelli predefiniti di colori, sulla base dei vostri suggerimenti e sulle combinazioni di colori tradizionali.


    Nuovi modelli di colore per il terminale web


  2. Finestra delle specifiche del simbolo ridisegnata. I dati degli strumenti di trading sono stati riorganizzati in blocchi logici per facilitarne la visualizzazione.


    Aggiornata la finestra delle specifiche degli strumenti di trading


  3. Corretta l'apertura di conti reali tramite il terminale web. Il server potrebbe restituire un errore dopo aver compilato un modulo di registrazione.
  4. Risolto un errore nella finestra di dialogo di trading. Se l'utente ha chiuso una posizione premendo il pulsante X nella finestra degli Strumenti mentre la finestra di dialogo di modifica della posizione era aperta, il contenuto della finestra di dialogo non veniva ripristinato. Dopo l'aggiornamento, in questo caso la finestra di dialogo verrà reimpostata automaticamente sulla modalità di immissione di un nuovo ordine.
  5. Corretta la visualizzazione del campo Server nella finestra di dialogo di gestione dell'account.
  6. Risolto il problema con la visualizzazione del timeframe corrente sulla barra degli strumenti.
  7. Corretta la visualizzazione dei volumi in termini di unità di asset sottostanti, nella finestra di dialogo di trading.
  8. Corretta la modifica dei livelli di Stop Loss e Take Profit. La modifica di uno dei valori potrebbe azzerare il secondo in determinate condizioni.
  9. Corretta la visualizzazione degli avvisi di rischio di investimento.

L'aggiornamento sarà disponibile attraverso il sistema Live Update.

Motivazione: