Nuova piattaforma MetaTrader 5 build 3490: Versione Mobile del Terminale Web e nuovi metodi matriciali in MQL5

 

L'aggiornamento della piattaforma MetaTrader 5 sarà rilasciato venerdì 4 novembre 2022.

L'aggiornamento introduce il nuovo Terminale Web con pieno supporto per i dispositivi mobili. Ora la sua interfaccia si adatta automaticamente alle dimensioni dello schermo dell'utente.

Inoltre, abbiamo migliorato il task manager per un monitoraggio più accurato delle risorse consumate e abbiamo aggiunto la scheda OpenCL per la gestione dei dispositivi disponibili. Il nuovo gestore OpenCL consente di utilizzare esplicite specifiche dei dispositivi per calcoli più rapidi.

Continuiamo ad espandere le capacità della piattaforma nel lavorare con matrici e vettori. MQL5 presenta nuove funzioni per le operazioni con i tick dei prezzi e per lo scambio di dati tra matrici e vettori. Fornisce inoltre metodi di assegnazione ampliati.

Versione Mobile del Terminale Web e nuovi metodi matriciali e vettoriali in MQL5

Inoltre, abbiamo implementato più correzioni e miglioramenti in tutti i componenti della piattaforma. Tutte le nuove funzionalità, correzioni e miglioramenti delle prestazioni sono descritti in dettaglio di seguito.


Versione mobile della piattaforma web

Il nuovo Web Terminal fornisce un supporto completo per i dispositivi mobili. L'interfaccia si adatterà automaticamente alle dimensioni dello schermo, consentendo operazioni efficienti da telefoni e tablet iOS e Android:

Aggiunto il supporto per dispositivi mobili nel nuovo terminale web

Inoltre, il Terminale Web presenta molte correzioni e miglioramenti.

Il Nuovo Terminale Web MetaTrader 5 supporta l'intero set di funzioni di trading. Consente agli utenti di:

  • Lavorare con conti demo e reali
  • Ricevere tutte le quotazioni dei simboli finanziari
  • Fare trading in qualsiasi mercato
  • Analizzare le quotazioni dei simboli utilizzando più di 30 indicatori e 20 oggetti grafici
  • Utilizzare i dati del calendario economico per l'analisi fondamentale


Terminale Client MetaTrader 5 build 3490

  1. Terminale: Funzionalità estese del task manager. La nuova versione consente un monitoraggio più accurato delle risorse consumate.

    • Aggiunta la visualizzazione delle dimensioni dello stack per i thread.
    • Aggiunta la visualizzazione del numero di commutazioni di contesto.
    • Aggiunto il riconoscimento del sistema e dei thread DLL di terze parti.
    • Aggiunta la visualizzazione del tempo di funzionamento della modalità kernel. Un aumento di questa metrica rispetto al tempo trascorso in modalità utente può indicare problemi a livello di sistema: problemi di driver, errori hardware o hardware lento. Per ulteriori dettagli, leggere la Documentazione Microsoft.
    • Aggiunta la visualizzazione del tempo di funzionamento della modalità utente.

    Gestore OpenCL per controllare i dispositivi disponibili


  2. Terminale: Nuova scheda OpenCL in impostazioni del terminale per la gestione dei dispositivi disponibili. Il nuovo gestore OpenCL consente esplicite specifiche dei dispositivi da utilizzare per i calcoli.

    Gestore OpenCL per controllare i dispositivi disponibili

  3. Terminale: Aggiunta l’indicazione dei livelli di Stop Loss e Take Profit nella Profondità di Mercato per i conti operanti in modalità FIFO (la modalità può essere abilitata lato broker).

    Secondo la regola FIFO, le posizioni per ogni strumento possono essere chiuse solo nello stesso ordine in cui sono state aperte. Per garantire la conformità FIFO della chiusura della posizione tramite i livelli di stop, è stata implementata la seguente logica lato terminale client:

    Se esistono più posizioni per lo stesso strumento, il posizionamento dei livelli di stop per una qualsiasi delle posizioni comporta il posizionamento degli stessi livelli anche per tutte le altre posizioni. Di conseguenza, se si attiva un livello, tutte le posizioni verranno chiuse nell’ordine conforme FIFO.

    Ora, quando l'utente apre la Profondità di mercato per uno strumento per il quale sono già aperte posizioni, i livelli delle posizioni esistenti (se presenti) vengono automaticamente specificati nei campi Stop Loss e Take Profit.

  4. Terminale: Risolto l'eliminazione dei livelli Stop Loss e Take Profit utilizzando i pulsanti X nella finestra Toolbox\Trade. L'errore si presentava quando la funzione di trading rapido era disabilitata. Un clic sul pulsante aprirà una finestra di dialogo con un valore vuoto del livello pertinente.

  5. Terminale: Descrizione del grafico fisse e calcoli delle commissioni finali nel rapporto di trading. La sezione potrebbe mostrare Profitto errato nelle statistiche del rapporto e valori errati nelle descrizioni dei grafici Equity e Balance.

  6. MQL5: Aggiunti metodi vettoriali e matriciali CopyTicks e CopyTicksRange. Consentono di copiare facilmente gli array dei dati dei tick in vettori e matrici.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    Il tipo di dato copiato viene specificato nel parametro 'flags' utilizzando l'enumerazione ENUM_COPY_TICKS. Sono disponibili i seguenti valori:
    COPY_TICKS_INFO    = 1,       // tick risultanti dalle variazioni di Bid e/o Ask
    COPY_TICKS_TRADE   = 2,       // tick risultanti dalle variazioni di Last e Volume
    COPY_TICKS_ALL     = 3,       // tutti i tick che hanno delle variazioni
    COPY_TICKS_TIME_MS = 1<<8,    // tempo in millisecondi
    COPY_TICKS_BID     = 1<<9,    // prezzo del Bid
    COPY_TICKS_ASK     = 1<<10,   // prezzo dell'Ask
    COPY_TICKS_LAST    = 1<<11,   // ultimo prezzo Last
    COPY_TICKS_VOLUME  = 1<<12,   // volume
    COPY_TICKS_FLAGS   = 1<<13,   // tick flags
    Se vengono selezionati più tipi di dati (disponibili solo per le matrici), l'ordine delle righe nella matrice corrisponderà all'ordine dei valori nell'enumerazione.

  7. MQL5: Funzionalità estese dei metodi matrix::Assign e vector::Assign .

    Ora alla matrice può essere assegnata un vettore o una matrice unidimensionale:
    bool matrix::Assign(const vector &vec);
    Il risultato sarà una matrice a una riga.

    Inoltre, una matrice può ora essere assegnata a un vettore (verrà eseguito il livellamento della matrice):
    bool vector::Assign(const matrix &mat);
  8. MQL5: Aggiunti metodi di Swap per vettori e matrici.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    Ogni array, vettore o matrice fa riferimento a un buffer di memoria che contiene gli elementi di quell'oggetto. Il metodo Swap scambia effettivamente i puntatori a questi buffer senza scrivere gli elementi in memoria. Pertanto, una matrice rimane una matrice e un vettore rimane un vettore. Lo Swapping di una matrice e di un vettore risulterà una matrice a una riga con elementi vettoriali e un vettore con elementi di matrice in una rappresentazione piatta (vedere il metodo Flat).
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- swap dei puntatori della matrice 
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a prima dello Swap:
      [[1,2,3]
      [4,5,6]]
      b prima dello Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a dopo lo Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b dopo lo Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v prima dello Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b prima dello Swap:
      [[1,2,3]
      [4,5,6]]
      
      v dopo lo Swap:
      [1,2,3,4,5,6]
      b dopo lo Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Il metodo Swap() consente anche operazioni con array dinamici (gli array di dimensioni fisse non possono essere passati come parametri). L'array può essere di qualsiasi dimensione ma di una grandezza concordata, il che significa che la dimensione totale di una matrice o di un vettore deve essere un multiplo della dimensione zero dell'array. La dimensione zero dell'array è il numero di elementi contenuti nel primo indice. Ad esempio, per un array tridimensionale dinamico 'double array[][2][3]', la dimensione zero è il prodotto delle dimensioni della seconda e della terza dimensione: 2x3=6. Quindi, un tale array può essere utilizzato solo nel metodo Swap con matrici e vettori la cui dimensione totale è un multiplo di 6: 6, 12, 18, 24, ecc.

    Prendiamo in considerazione il seguente esempio.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- riempie la matrice 1x10 con il valore 7.0
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- Prova lo scambio (Swap) la matrice e l'array
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // la grandezza della matrice non è un multiplo della prima dimensione dell'array
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      la matrice prima dello Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small prima dello Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) fallito. Errore 4006
      */
    //--- utilizzare una matrice più grande e riprovare l'operazione di swap
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // un array statico non può essere utilizzato per lo swap con una matrice
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static prima dello Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) fallito. Errore 4006
      */
    //--- un altro tentativo di scambiare un array e una matrice
      double array_dynamic[][10];    // array dinamico
      ArrayResize(array_dynamic, 3); // imposta la grandezza della prima dimensione
      ArrayCopy(array_dynamic, array_static);
    //--- ora utilizza un array dinamico per lo swap
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  nessun errore
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic dopo lo Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      la matrice dopo lo Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  9. MQL5: Aggiunto metodo LossGradient per vettori e matrici. Questo metodo calcola un vettore o una matrice di derivate parziali della funzione di perdita sui valori previsti. Nell'algebra lineare, tale vettore viene chiamato gradiente e viene utilizzato nell'apprendimento automatico.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  10. MQL5: Abilitato l'uso di FOREIGN KEYS in SQLite per rafforzare le relazioni tra le tabelle nelle query SQL.   Esempio:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  11. MQL5: Corretta la selezione del metodo di classe appropriato in base al metodo e alla consistenza dell'oggetto.

  12. MetaEditor: Aumento della lunghezza consentita dei commenti destinati in MQL5 Storage. Commenti dettagliati quando si commettono modifiche al repository sono considerati buona pratica quando si lavora in grandi progetti, ma in precedenza la lunghezza del commento è stata limitata a 128 caratteri. La lunghezza consentita è ora fino a 260 caratteri.
  13. MetaTester: Aumento della sensibilità del pulsante della velocità di test in modalità visiva.
  14. Corretti gli errori segnalati nei registri degli arresti anomali.


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

Motivazione: