Erros, bugs, perguntas - página 1658

 
Alexey Volchanskiy:

Independentemente da questão, chamar qualquer função é sempre mais lento do que aceder a uma variável na pilha, neste caso nType.

Independentemente desta obviedade, a questão era sobre funções em linha. Isto é, OrderType() não é substituído em tempo de compilação por algo como Order.type.

Pessoalmente, eu cubro sempre taischamadas de função MQL, como no seu segundo caso.

Como as medições demonstraram, é desnecessário.

 
Sergei Vladimirov:

Independentemente desta obviedade, a questão era sobre funções em linha. Isto é, OrderType() não é substituído por algo como Order.type quando se faz a compilação.

Como as medições demonstraram, isto é desnecessário.

A julgar pela implementação interna de matrizes, o mesmo ArraySize deve estar em linha. Mas utilizo-a sempre desta forma (não a medi)

Em vez de

for (int i = 0; i < ArraySize(Array); i++)

Eu uso

const int Amount = ArraySize(Array);

for (int i = 0; i < Amount; i++)
Em termos de desempenho, fiquei recentemente surpreendido com este facto

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Como é que passo por uma enumeração de forma consistente?

fxsaber, 2016.08.22 09:13

Acrescentou estática ao conjunto. É quase três vezes mais rápido do que trocar! Lixeira tal interruptor. Obrigado pela dica!
Assim, parece ser melhor não confiar na optimização do compilador, mas "ajudá-lo" sempre através das chamadas de funções mais pequenas e usando em todo o lado possível e logicamente constantes e estáticas.
 
Sergei Vladimirov:

Independentemente desta obviedade, a questão era sobre funções em linha. Isto é, OrderType() não é substituído por algo como Order.type quando se faz a compilação.

Como as medições mostraram, é desnecessário.

Foi o senhor mesmo que o escreveu:

Sergei Vladimirov2016.09.01 02:53 RU

Verifiquei-o eu próprio. O segundo código corre 4 vezes mais rápido. Está tudo claro, a questão está fora da mesa.

 
Sergei Vladimirov:
Eu próprio o testei. O segundo código corre quatro vezes mais rápido. Tudo é claro, a questão é eliminada.
Não medir apenas em modo de perfilagem/debug. Não há aí qualquer inline. Apenas a Release-versão deve estar presente.
 
Inv Андрей Иващенко:

Boa tarde!

Senhores oficiais, podem dizer-me onde começar a apanhar um insecto?

Consultor Especialista Multimoedas. Após a primeira troca, o testador pára.

Dá um erro, cujo código não consigo encontrar.

Sim, o testador funciona bem a partir da data de início 2016.05.01. Se eu alterar esta data - o testador pára e comete um erro, registe-se abaixo.

Ajude, por favor!

Responder a mim próprio:

Isto é um insecto no testador. Por agora, é necessário adicionar o cabo de qualquer indicador técnico no OnInit a todos os símbolos, nos quais o Expert Advisor trabalha.

 
Alexey Volchanskiy:

Foi o senhor mesmo que o escreveu:

Sergei Vladimirov2016.09.01 02:53 RU

Verifiquei-o eu próprio. O segundo código corre 4 vezes mais rápido. Está tudo claro, a questão está fora da mesa.

No comentário seguinte escrevi números: o ganho com uma única operação é de 1 nanossegundo. Ao optimizar uma estratégia com carraças num trecho de dois anos e vários milhares de corridas, poupar um ns pode fazer sentido. Mas no comércio real...
 
A100:

Na construção 1398, o erro "EX5 loading failed" ainda existe (aparentemente não relacionado com esse exemplo).

Em caso semelhante, o erro de construção fixo 1400 é agora reproduzido como 'chamada de função virtual pura'. E sem comentários está bem

//Script1.mq5
typedef void (*fn)();
#import "Script2.ex5"
        void g( fn );
#import
void h() /*export*/ {} //если export без комментария - нормально
void OnStart() { g( h ); }
//Script2.mq5
#property library
typedef void (*fn)();
void g( fn f ) export { f(); }
 

Não pode ser aplicado :: para resolver ambiguidades


#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void g();
#import
typedef void (*fn)();
void OnStart()
{
        Script1::g(); //нормально
        Script2::g(); //нормально
        fn f = Script1::g; //Error
}
 
Inv Андрей Иващенко:

Responder a mim próprio:

Isto é um erro no testador. Por agora, é necessário adicionar um cabo de qualquer indicador técnico no OnInit a todos os símbolos, nos quais o Expert Advisor trabalha.

E parece que o problema ocorre quando se obtém apenas o primeiro tick numa nova barra, o testador parece "ficar preso" e fica 1 barra atrás, ou seja, a EA pensa que a barra não existe e na visualização não existe, mas após alguns segundos a barra aparece, no caso de testes no M1 o valor correcto aparece no segundo tick (se bem entendi), espero que os programadores corrijam este momento irritante o mais depressa possível ...

adição:

acontece que para contornar este ponto agora é preciso saltar artificialmente o primeiro tique de um novo bar...

 
Incapaz de fazer a depuração de EA em RTS-9.16 BCS-MetaTrader5 por CTRL+F5. O provador escreve
Tester  Leverage 1:1 set error