Per curiosità, ho controllato. Il risultato è il seguente
2011.04.1515:50:34123 (EURUSD,D1) time for'd = a + b + c' = 84453 milliseconds, i = 100000002011.04.1515:51:54123 (EURUSD,D1) time for'StringAdd()' = 80906 milliseconds, i = 100000002011.04.1515:53:22123 (EURUSD,D1) time for'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 100000002011.04.1515:55:11123 (EURUSD,D1) time for'd = a + b + c' = 83266 milliseconds, i = 100000002011.04.1515:56:39123 (EURUSD,D1) time for'StringAdd()' = 88390 milliseconds, i = 100000002011.04.1515:58:12123 (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)...
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: 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?
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?
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...
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).
Per curiosità, ho controllato. Il risultato è il seguente
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?
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.
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:
Risultati:
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 un campionamento.
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?
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...
... ordinate voi stessi e tutto il resto
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).