Imparare e scrivere insieme in MQL5 - pagina 14

 

Per curiosità, ho controllato. Il risultato è il seguente

2011.04.15 15:50:34     123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04.15 15:51:54     123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04.15 15:53:22     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04.15 15:55:11     123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04.15 15:56:39     123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04.15 15:58:12     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

Ma mi sembra che ci sia qualcosa di sbagliato qui (intendo il controllo dell'algoritmo)...

 

Yedelkin:

Si è scoperto che StringConcatenate è più lento di string binding che usa operazioni di addizione. Qual è l'intoppo?

La particolarità delle corde.
Nel primo passaggio, si ottiene la giusta dimensione del buffer per memorizzare il risultato dell'addizione e della trasformazione delle stringhe, cioè non c'è una rilocazione del buffer per le stringhe d,(stringa)b e(stringa)c.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
mql5:
Stringhe di caratteristiche.
Nel primo passaggio si ottiene la giusta dimensione del buffer per memorizzare il risultato dell'addizione e della trasformazione delle stringhe, cioè la rilocazione del buffer per le stringhe d,(stringa)b e(stringa)c non avviene.

Provato diversi modi di confrontare - non ottiene il risultato che voglio. Mi sono ritrovato con un codice come questo:

   uint   start,stop;
   long   i,length=1000000;
   string a1[1000000]; for(i=0;i<length;i++) a1[i]="Пример";
   string a2[1000000]; for(i=0;i<length;i++) a2[i]="Пример";
   string a3[1000000]; for(i=0;i<length;i++) a3[i]="Пример";

   double b1[1000000]; ArrayInitialize(b1,1.26);
   double b2[1000000]; ArrayInitialize(b2,1.26);
   double b3[1000000]; ArrayInitialize(b3,1.26);

   double c1[1000000]; ArrayInitialize(c1,1.27);
   double c2[1000000]; ArrayInitialize(c2,1.27);
   double c3[1000000]; ArrayInitialize(c3,1.27);

   string d1[1000000]; for(i=0;i<length;i++) d1[i]=NULL;
   string d2[1000000]; for(i=0;i<length;i++) d2[i]=NULL;
   string d3[1000000]; for(i=0;i<length;i++) d3[i]=NULL;


////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      d1[i]=a1[i]+(string)b1[i]+(string)c1[i];
     }
   stop=GetTickCount();
   Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(d2[i],a2[i]);
      StringAdd(d2[i],(string)b2[i]);
      StringAdd(d2[i],(string)c2[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringConcatenate(d3[i],a3[i],b3[i],c3[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);

Risultati:

KL 0 DoubleToString (EURGBP,M1)      23:53:01        time for 'd = a + b + c' = 15766 milliseconds, i = 1000000
HD 0 DoubleToString (EURGBP,M1)      23:53:26        time for 'StringAdd()' = 25390 milliseconds, i = 1000000
FK 0 DoubleToString (EURGBP,M1)      23:54:03        time for 'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS 0 DoubleToString (EURGBP,M1)      23:54:56        time for 'd = a + b + c' = 15781 milliseconds, i = 1000000
FL 0 DoubleToString (EURGBP,M1)      23:55:21        time for 'StringAdd()' = 25375 milliseconds, i = 1000000
OR 0 DoubleToString (EURGBP,M1)      23:55:57        time for 'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
 
Domanda. La funzione OrdersTotal() restituisce il numero totale di ordini attivi per un conto di trading. C'è un modo semplice per ottenere il numero di ordini attivi per un simbolo specifico?
 
Yedelkin:
Domanda. La funzione OrdersTotal() restituisce il numero totale di ordini attivi per un conto di trading. C'è un modo semplice per ottenere il numero di ordini attivi per un certo simbolo?
Prendi tutta la storia e fai una selezione.
 
Urain:
Prendi tutta la storia e fai un campionamento.
OK. Quindi non c'è un modo semplice.
 

Domanda. Le funzioni HistorySelect() e HistorySelectByPosition() richiedono la storia degli ordini e la storia delle operazioni. Ho eseguito lo script esplicativo da Expert Advisor, e la sua lista di operazioni è disposta in ordine crescente. È così per caso, o le funzioni HistorySelect() e HistorySelectByPosition() sono programmate per restituire liste ordinate in ordine crescente?

 
Yedelkin:

Domanda. Le funzioni HistorySelect() e HistorySelectByPosition() richiedono la storia degli ordini e la storia delle operazioni. Ho eseguito lo script esplicativo della Guida, e la sua lista di offerte è disposta in ordine crescente. È così per caso, o le funzioni HistorySelect() e HistorySelectByPosition() sono state programmate per restituire le liste ordinate in ordine crescente?

Non importa quante volte ho sperimentato, il risultato è lo stesso: viene restituita una lista ordinata in un certo modo.

Una volta ho anche voluto scrivere una richiesta per un parametro aggiuntivo specificando esattamente come le voci dovrebbero essere ordinate.

Ma poi ci ho pensato bene e ho deciso che non ne vale la pena (possono rispondere da soli a quel tipo e tutto il resto), anche se forse è un errore che non ho scritto...

 
Interesting:

... ordinate voi stessi e tutto il resto

È solo che se c'è un ordinamento forzato preimpostato è una cosa, ma creare manualmente un ordinamento aggiuntivo è un'altra.
 
Yedelkin:
Solo se c'è un ordinamento forzato preimpostato è una cosa, ma creare manualmente un ordinamento aggiuntivo è un'altra.

È solo che in MT4 ho ordinato manualmente (e anche filtrato), se non sbaglio ho ordinato in "bolle".

Ho preso il codice di ordinamento dal database lì, quindi questo può essere chiarito.

E non ho ancora deciso il modo migliore per ordinare in MQL5, dal momento che ho capito che le query della storia non sono ora legate alla scheda della storia (l'ordinamento e il contenuto non dipendono da ciò che l'utente ha fatto nella scheda).