Il mio approccio. Il nucleo è il motore. - pagina 97

 
Vasiliy Sokolov:

Peter, che diavolo sono le stringhe?! Hai un mucchio di parametri come double, int, color che converti in una stringa per scriverli nell'oggetto sul grafico. Ma non c'è bisogno di corde quando si lavora con l'unione. Guardate di nuovo l'esempio, lì state lavorando direttamente con il doppio, senza stringhe, e i dati sono ben passati.

Vasiliy, oltre ai dati numerici, gli EA personalizzati impostano un sacco di dati stringa nel motore. Nomi, messaggi, ecc. Pertanto, è impossibile fare solo con i numeri.

Per esempio, l'Expert Advisor di Oleg Papkov farà passare nelle sue finestre testi come "Il trend è salito, il trend è sceso...". Altri vorranno passare dei testi nelle celle della tabella. Nei campi di input.

Non c'è modo di fare solo con i numeri... ((

 

Se avete bisogno di passare del testo, allora traducete la stringa in un array di byte:

StringToCharArray("text", u.char);

dove u è unione e u.char array char[] rispettivamente. L'array di unione avrà una dimensione fissa, quindi se la stringa non ci sta, o si aumenta u.char o si passa la stringa in parti.

 
Vasiliy Sokolov:

Se avete bisogno di passare del testo, allora traducete la stringa in un array di byte:

dove u è unione e u.char array char[] rispettivamente. L'array di unione avrà una dimensione fissa, quindi se la stringa non ci sta, o espandete u.char o passate la stringa in parti.

Capisco, grazie. Lo proverò ora. (Anche se potrei fare tutto attraverso la descrizione dell'oggetto ), ma voglio capire bene le risorse. Può anche tornare utile.

Le funzioni aggiuntive sono sempre utili. E anche qualche nuova conoscenza non farà male...

In breve, grazie mille per il tuo aiuto personale e di tutti gli altri.

 
Реter Konow:

Capisco, grazie. Farò un tentativo. (Anche se si potrebbe fare tutto attraverso la descrizione degli oggetti ), ma voglio arrivare al fondo delle risorse. Può anche tornare utile.

Le funzioni aggiuntive sono sempre utili. E anche qualche nuova conoscenza non farà male...

In breve, grazie mille per il tuo aiuto personale e di tutti gli altri.

Se volete una comunicazione veloce, non c'è niente di più veloce. La stringa con i parametri passerà attraverso gli oggetti molto velocemente, forse anche più velocemente di ResourceCreate, ma l'analisi di questa stringa ucciderà tutta la vostra velocità. Ma MQL è un linguaggio molto veloce, e anche il parsing lento è relativamente veloce qui.

 
Vasiliy Sokolov:

Se vuoi una comunicazione veloce, non puoi fare niente di più veloce dell'unione. Potete passare una stringa con parametri attraverso gli oggetti molto velocemente, forse anche più velocemente di ResourceCreate, ma il parsing di questa stringa ucciderà la vostra velocità. Ma MQL è un linguaggio molto veloce, e anche il parsing lento è relativamente veloce qui.

Il problema è che il parsing sarà necessario in ogni caso. Dopo tutto, anche dopo aver scritto la stringa nella risorsa, deve poi essere estratta da lì, raccolta e poi divisa in parti"numero del parametro/valore del parametro".

Cioè, difficilmente si possono ottenere le stringhe rotte dalla risorsa in una volta sola. E quindi il parsing è ancora necessario...((

 
Реter Konow:

Il problema è che il parsing sarà necessario in ogni caso. Dopo tutto, anche dopo aver scritto una stringa nella risorsa, deve poi essere estratta da lì, raccolta, e poi divisa in parti"numero del parametro / valore del parametro".

Cioè, difficilmente si possono ottenere le stringhe rotte dalla risorsa in una volta sola. Quindi abbiamo ancora bisogno del parsing...((

Peter, lo stai facendo di nuovo. Quante volte è andata avanti? È già stato detto molte volte: si passano valori e numeri di parametri senza usare stringhe. Nel tuo esempio hai passato e ottenuto il doppio senza alcun parsing di stringa. Allora perché stai cercando di mettere di nuovo questo doppio in una stringa? Se avete bisogno di passare un messaggio a un utente - lo passate come testo senza alcun parsing. Questo è tutto.

 
Vasiliy Sokolov:

Peter, ci risiamo. Quante volte è stato detto? È stato detto molte volte: si passano e ricevono valori di parametri e numeri SENZA usare stringhe. Nel tuo esempio hai passato e ottenuto il doppio senza alcun parsing di stringa. Allora perché stai cercando di mettere di nuovo questo doppio in una stringa? Se avete bisogno di passare un messaggio a un utente - lo passate come testo senza alcun parsing. Questo è tutto.

Vasily, lasciami provare a spiegare.

I valori dei parametri non sono solo numeri. Un valore di parametro può essere un testo. Per esempio, un utente ha inserito del testo nel campo di input. Questo testo viene trasferito dal motore all'Expert Advisor. Oppure, l'Expert Advisor invia un testo alla GUI ad un evento specifico, con il messaggio "Una sessione di trading è iniziata!

Poiché su ogni evento, l'Expert Advisor o il motore ha bisogno di passare avanti e indietro dati di TUTTI i tipi (int, double, long, string...), è più conveniente passare tutto in un solo modo, attraverso una stringa, e poi fare il cast al tipo desiderato.

Altrimenti, un modo per passare alcuni dati e un altro modo per passare altri dati.

Nessuno sa quali dati l'utente trasferirà o riceverà di più. Forse saranno i testi ad essere i dati principali. Da tutti i lati, si scopre che la corda, è un mezzo universale per trasmettere e ricevere informazioni.

 
Vasiliy Sokolov:


A proposito, guardate che passo avanti ho fatto grazie alle nostre soluzioni di ieri (e al vostro aiuto):

In questo particolare esempio, tutto passa attraverso una risorsa.



Ed è tutto fatto attraverso questo codice nell'EA:

void OnTimer()
  { 
   static int q1,q2,q3,a,b,c,d; 
   //------------------------------------
   LOAD_CANVAS_Last_10_bars();
   //---------------------------------
   if(!a) { q1++;}
   if(q1 == 200)a = 1;
   if(a)q1--;
   if(!q1)a = 0;
   //------------------------------------  
   CIRCLE(q1,q2,q3,clrGreen);  
   TRIANGLE(q1,q1,q1 + 100,q1 + 10,q1 + 50,q1 + 200,clrRed);  
   ELLIPSE(q1,q1,q1 + q1*2,q1 +  q1,clrBlue);  
   FILLED_CIRCLE(q1,20,20,clrBlue); 
   TRIANGLE(q1 + 10,q1,q1 + 10,q1 + 100,q1 + 50,q1 + 200,clrAqua);  
   ELLIPSE(q1 + 50,q1,q1 + q1*2,q1 * q1-30,clrBlack);  
   ELLIPSE(q1 + 52,q1,q1 + q1*3,q1 * q1-32,clrMagenta); 
   ELLIPSE(q1 + 54,q1,q1 + q1*4,q1 * q1-34,clrOrange); 
   FILLED_CIRCLE(q1 + 70,q1+20,20,clrDarkCyan);        
   FILLED_CIRCLE(q3,q2,40,clrGreen); 
   //------------------------------------
   REDRAW_CANVAS();
  }
 
Реter Konow:

A proposito, guardate che passo avanti ho fatto grazie alle nostre soluzioni di ieri (e al vostro aiuto):

In questo particolare esempio, tutto viene trasferito attraverso una risorsa.

Sì, sembra spettacolare.

 
Реter Konow:

Da tutti i lati, sembra che la corda sia un mezzo universale per trasmettere e ricevere informazioni.

Qui non sono d'accordo con te. Il cavallo di battaglia universale per trasferire informazioni è l'array di byte.

Sono d'accordo che anche il testo dovrebbe essere trasferito. E sono anche d'accordo che è meglio passare il testo come una stringa. Ma, di fatto, una stringa è solo un'astrazione. Quando si passavano testi tramite oggetti nel grafico, la lunghezza di questo testo era limitata a 64 caratteri. Questo significa che dietro le quinte stavate effettivamente passando un array di 64 byte (MQL ha fatto tutto il lavoro di conversione di una stringa in un array e ritorno per voi, non esplicitamente). Se state facendo un progetto in cui lo scambio di informazioni tra programmi MQL è un punto critico e fondamentale del progetto, è fuori questione lasciare questa funzione a una soluzione generalizzata. Se fossi in te, svilupperei un sistema di trasferimento generalizzato per tipi arbitrari, incluse le stringhe, con un controllo rigoroso della conversione. Questo potrebbe essere fatto sulla base del parsing e della lettura delle risorse. Ma nel parsing delle stringhe questo è problematico, perché non c'è garanzia che la stringa analizzata sia valida.