Por curiosidade, verifiquei. O resultado é o seguinte
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
Mas parece-me que há algo de errado aqui (refiro-me ao algoritmo de verificação)...
Acontece que o StringConcatenate é mais lento do que a encadernação de cordas utilizando operações de adição. Qual é o problema?
A peculiaridade das cordas. Na primeira passagem, obtém-se o tamanho de buffer adequado para armazenar o resultado da adição e transformação de cordas, ou seja, não há deslocalização de buffer para cordas d,(cordas)b e(cordas)c.
mql5: Caracterização de cordas. Na primeira passagem obtém-se o tamanho de buffer correcto para armazenar o resultado da adição e transformação de cordas, ou seja, a deslocação de buffer para cordas d,(cordas)b e(cordas)c não acontece.
Tentei diferentes formas de comparação - não obtém o resultado que eu quero. Cheguei a este código:
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);
Resultados:
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
Pergunta. A função OrdersTotal() devolve o número total de ordens activas para uma conta de negociação. Existe uma forma fácil de obter o número de encomendas activas para um símbolo específico?
Yedelkin: Pergunta. A função OrdersTotal() devolve o número total de ordens activas para uma conta de negociação. Existe uma forma fácil de obter o número de encomendas activas para um determinado símbolo?
Pergunta. As funções HistorySelect() e HistorySelectByPosition() solicitam o histórico de encomendas e histórico de negócios. Corri o guião explicativo do Expert Advisor, e a sua lista de acordos está disposta por ordem ascendente. É por acaso, ou as funções HistorySelect() e HistorySelectByPosition() estão programadas para devolver listas ordenadas por ordem ascendente?
Pergunta. As funções HistorySelect() e HistorySelectByPosition() solicitam o histórico de encomendas e histórico de negócios. Corri o guião explicativo do Guia, e a sua lista de acordos está disposta por ordem ascendente. É por acaso, ou as funções HistorySelect() e HistorySelectByPosition() foram programadas para devolver as listas ordenadas por ordem ascendente?
Não importa quantas vezes experimentei, o resultado é o mesmo: uma lista ordenada de uma certa forma é devolvida.
Uma vez quis até escrever um pedido para um parâmetro adicional especificando exactamente como as entradas devem ser classificadas.
Mas depois pensei cuidadosamente e decidi que não vale a pena (eles podem responder que se ordenem e tudo isso), embora seja possível que eu não o devesse ter escrito...
Yedelkin: Só se houver uma triagem forçada predefinida é uma coisa, mas criar uma triagem adicional manualmente é outra.
É que no MT4 eu classifiquei manualmente (e filtrei também), se não me engano, classifiquei em "bolhas".
Consegui o código de ordenação a partir da base de dados, para que possa ser esclarecido.
E ainda não decidi qual a melhor forma de classificar na MQL5, uma vez que compreendi que as consultas de história não estão agora vinculadas à guia da história (classificação e conteúdo não depende do que o utilizador tenha feito no separador).
Por curiosidade, verifiquei. O resultado é o seguinte
Mas parece-me que há algo de errado aqui (refiro-me ao algoritmo de verificação)...
Yedelkin:
Acontece que o StringConcatenate é mais lento do que a encadernação de cordas utilizando operações de adição. Qual é o problema?
Na primeira passagem, obtém-se o tamanho de buffer adequado para armazenar o resultado da adição e transformação de cordas, ou seja, não há deslocalização de buffer para cordas d,(cordas)b e(cordas)c.
Caracterização de cordas.
Na primeira passagem obtém-se o tamanho de buffer correcto para armazenar o resultado da adição e transformação de cordas, ou seja, a deslocação de buffer para cordas d,(cordas)b e(cordas)c não acontece.
Tentei diferentes formas de comparação - não obtém o resultado que eu quero. Cheguei a este código:
Resultados:
Pergunta. A função OrdersTotal() devolve o número total de ordens activas para uma conta de negociação. Existe uma forma fácil de obter o número de encomendas activas para um determinado símbolo?
Obtenha a história completa e faça uma amostragem.
Pergunta. As funções HistorySelect() e HistorySelectByPosition() solicitam o histórico de encomendas e histórico de negócios. Corri o guião explicativo do Expert Advisor, e a sua lista de acordos está disposta por ordem ascendente. É por acaso, ou as funções HistorySelect() e HistorySelectByPosition() estão programadas para devolver listas ordenadas por ordem ascendente?
Pergunta. As funções HistorySelect() e HistorySelectByPosition() solicitam o histórico de encomendas e histórico de negócios. Corri o guião explicativo do Guia, e a sua lista de acordos está disposta por ordem ascendente. É por acaso, ou as funções HistorySelect() e HistorySelectByPosition() foram programadas para devolver as listas ordenadas por ordem ascendente?
Não importa quantas vezes experimentei, o resultado é o mesmo: uma lista ordenada de uma certa forma é devolvida.
Uma vez quis até escrever um pedido para um parâmetro adicional especificando exactamente como as entradas devem ser classificadas.
Mas depois pensei cuidadosamente e decidi que não vale a pena (eles podem responder que se ordenem e tudo isso), embora seja possível que eu não o devesse ter escrito...
... ordene-a você mesmo e tudo isso
Só se houver uma triagem forçada predefinida é uma coisa, mas criar uma triagem adicional manualmente é outra.
É que no MT4 eu classifiquei manualmente (e filtrei também), se não me engano, classifiquei em "bolhas".
Consegui o código de ordenação a partir da base de dados, para que possa ser esclarecido.
E ainda não decidi qual a melhor forma de classificar na MQL5, uma vez que compreendi que as consultas de história não estão agora vinculadas à guia da história (classificação e conteúdo não depende do que o utilizador tenha feito no separador).