Biblioteca de classes genéricas - bugs, descrição, perguntas, recursos de uso e sugestões - página 12
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Você entende o que o código faz se não houver uma implementação explícita da funçãoGetHashCode para o tipo T?
Resposta: é uma chatice porque o problema da falta de implementação é silenciado. Todos os objetos da mesma classe retornarão o mesmo valor de hash.
O que tem a implementação (corpo) a ver com isso?! Eu acrescentei isto.
Eu inseri o corpo da bola.
O que tem a implementação (corpo) a ver com isso?! Eu acrescentei isto.
Eu coloquei o corpo do zero.
Fala-se de moscas (que não se deve fazer isso, o código pode adoecer no futuro) e continua-se a falar de costeletas.
OK, tenha um bom apetite.
Decidiu olhar para as características de velocidade da solução proposta. Consultor especializado para o testador
O Expert Advisor abre 100.000 negociações e depois procura por lucros totais de negociações aleatórias usando vários métodos (ver comentários). O resultado é
Aqui comparamos os dois valores destacados. Acontece que o acesso ao HashMap é 4 vezes mais rápido do que o dos desenvolvedores. Mas nos criadores já inclui história...
É 4 vezes mais rápido ou não é rápido o suficiente para esta situação? Bem, aqui está em 24 milissegundos. Se você acessar o histórico muitas vezes, você provavelmente poderia economizar muito dinheiro. Mas não tenho a certeza.
Para um caso de teste mais realista (2000 negócios e 1 000 000 de acessos individuais ao histórico), o resultado é o seguinte
Quase 100 msec economizados por passe! Se, digamos, fizermos o Optimize para 10.000 passes completos, então a variante Hash acabará 15 minutos mais rápida.
É muito cedo para dar aos desenvolvedores um "A" de História. É óbvio que eles podem acelerá-lo, uma vez que até a solução MQL está ficando mais rápida.
Decidiu olhar para as características de velocidade da solução proposta. Consultor especializado para o testador
O Expert Advisor abre 100.000 negociações e depois procura por lucros totais de negociações aleatórias usando vários métodos (ver comentários). O resultado é
Aqui comparamos os dois valores destacados. Acontece que o acesso ao HashMap é 4 vezes mais rápido do que o dos desenvolvedores. Mas nos criadores já inclui história...
É 4 vezes mais rápido ou não é rápido o suficiente para esta situação? Bem, aqui está em 24 milissegundos. Se você acessar o histórico muitas vezes, você provavelmente poderia economizar muito dinheiro. Mas não tenho a certeza.
Nas chamadas através da plataforma, você passa por objetos de sincronização duas vezes em GetDealProfitFull e uma vez em GetDealProfitClear e um monte de verificações obrigatórias a cada iteração.
Portanto, a velocidade é notoriamente mais lenta do que em limpos e otimizados com um monte de incrustações trabalhando em um hashmap local pré-preparado.
Ao chamar através da plataforma, você passa por objetos de sincronização duas vezes em GetDealProfitFull e uma vez em GetDealProfitClear e um monte de verificações obrigatórias a cada iteração.
Portanto, a velocidade é inerentemente mais lenta do que em um trabalho limpo e otimizado baseado em um hashmap local preparado preliminarmente com um monte de incrustações.
Corrigi o meu posto anterior. É por isso que o cheque duplo se chama Full.
Eu não entendo bem que objetos de sincronização caros e muitas verificações estamos falando no Strategy Tester for HistoryDealGetDouble?Corrigi o meu posto anterior. A dupla verificação é a razão pela qual se chama Full.
Não sei bem de que objectos de sincronização caros e massas de cheques o Testador está a falar para a HistóriaDealGetDouble?Qual é a diferença?
Olhei para o nosso código - há uma forma de optimizar as chamadas para a base comercial. Vamos tentar implementar até ao lançamento da próxima semana.
Renat Fatkhullin:
Na plataforma, ao extrair um único valor, você precisa tratar a consulta "como uma primeira vez", verificando novamente a correção e a presença de todos os dados
Mas o TryGetValue não é chamado sem verificar se está correcto? De acordo com os registros, você pode ver que o HistorySelect no testador é gratuito.
O que eu não entendo, por que para obter todos os dados sobre um negócio, você precisa chamar um monte de funções caras do HistoryDealGet*-functions? Há apenas uma chamada para preencher a estrutura do MqlDeal.
Obviamente, o usuário, quando quiser trabalhar com história através do HashMap, irá preencher o CHashMap<ulong, MqlDeal>.
Talvez devêssemos fazer MqlDealInteger, MqlDealDouble, MqlDealString ou algo semelhante, para não multiplicar chamadas de unidades caras, já que toda a tabela de histórico está no testador de qualquer maneira? E é suficiente verificar a correcção do DealTicket então uma vez, não de cada vez.
A chamada TryGetValue não é feita para verificar se está correcta? De acordo com os registros, você pode ver que o HistorySelect está livre no testador.
O que eu não entendo, por que para obter todos os dados sobre um negócio, você precisa chamar um monte de funções caras do HistoryDealGet*-functions? Há apenas uma chamada para preencher a estrutura do MqlDeal.
Obviamente, o usuário, quando quiser trabalhar com história via HashMap, preencha o CHashMap<ulong, MqlDeal>.
Nós não temos uma estrutura MqlDeal porque os formatos dos registros comerciais são flutuantes e em expansão periódica. Sem ela, é impossível estender a funcionalidade da plataforma.
Portanto, a única opção é acessá-los através da função Obter. E o acesso a outros campos do registro anteriormente acessado é muitas vezes mais rápido que o primeiro acesso, pois o registro está em cache.
E é o suficiente para verificar se está correcto, então o DealTicket uma vez e não sempre.
No teste acima, cada vez que os números de negócios são novos, o que perturba constantemente o cache do negócio previamente selecionado. Além disso, não há garantia de que algo não tenha mudado entre as chamadas. Você ainda pode negociar entre pedidos de histórico.
Como é grátis? Não é de graça nenhuma.
Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação
Biblioteca de classes genéricas - bugs, descrição, problemas, casos de uso e sugestões
fxsaber, 2017.12.08 22:46
O Advisor abre 100.000 negociações, depois procura lucro total de negociações aleatórias usando métodos diferentes (ver comentários). Resultado
Por 100.000 negócios (e o mesmo número de ordens) 1 microssegundo é grátis. É tudo sobre o testador.
No teste acima, os números de negócios são novos a cada vez, o que perturba constantemente o cache de negócios previamente selecionados. Além disso, não há garantia de que algo não tenha mudado entre as chamadas. Você pode negociar entre pedidos de histórico.
Assim, a história (especialmente no testador) é apenas complementada, os registos antigos não são alterados. Estamos a falar da variante Clear.
No mercado real, parece que mesmo quando uma ordem é parcialmente executada e gera vários negócios, ela não chega ao histórico até que seja completamente preenchida ou cancelada. Isto é, a regra da história congelada é mantida.
Para 100.000 negócios (e o mesmo número de ordens) 1 microssegundo é grátis. É tudo sobre o testador o tempo todo.
HistorySelect no testador é absolutamente virtual/featured, ainda mais com os parâmetros 0, INT_MAX. Isto foi optimizado há muito tempo.
Você não pode comparar HistorySelect(coloca o intervalo de acesso no testador) e HistoryDealSelect(ticket), que na verdade procura por um ticket específico e o armazena em cache.