Nuova piattaforma MetaTrader 5 build 3490: Versione Mobile del Terminale Web e nuovi metodi matriciali 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
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.
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:
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:
Terminale Client MetaTrader 5 build 3490
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.
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.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);
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]] */ }
vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const; matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );
L'aggiornamento sarà disponibile attraverso il sistema Live Update.