Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 4): Ordens virtuais pendentes e salvamento de estado"
Não usaria essa arquitetura.
Imagine que o MQ fizesse comércio virtual incorporado à linguagem. Nesse caso, você não teria a ideia de incorporar outras entidades nela, porque isso simplesmente não pode ser feito por meio de herança OOP - os códigos-fonte não estão disponíveis. Você criaria uma arquitetura diferente.
Objetos gráficos em uma virtualização - bem, tudo isso está na mesma pilha novamente.
A arquitetura se tornou tão pesada que faz com que você se sinta desconfortável. Em vez de montar a partir de tijolos simples, você decidiu criar tijolos universais.
Voltamos a não gostar muito da implementação, mas gostamos ainda menos de outras (que ainda não foram feitas, mas já foram pensadas). Talvez no processo de desenvolvimento futuro seja possível fazer isso de forma diferente, mas por enquanto.
Sobre a situação com fontes inacessíveis: nessa implementação, decidi apenas aproveitar o fato de que as fontes estão disponíveis e você pode adicionar algo a elas que não era necessário adicionar de uma vez. Tentei fazer com que essas adições fossem mínimas. A alternativa era criar várias novas classes herdeiras para a família de classes CVirtual*. Essa abordagem me pareceu ainda mais complicada. Mas é bem possível que cheguemos a esse ponto quando houver mais classes e se torne feio armazená-las em uma pasta.
Eu precisava de objetos gráficos para controlar o desenvolvimento de estratégias de negociação, então eles foram implementados. E a classe CVirtualOrder não foi alterada em nada. Mas tive de adicionar quatro novas linhas de código à classe CVirtualReceiver. Escolhi essa opção entre as várias possíveis.
Se não houver necessidade de exibição gráfica das posições virtuais, você pode não usá-la ou retornar à variante da biblioteca do artigo anterior.
Voltamos a não gostar muito da implementação, mas gostamos ainda menos de outras (que ainda não foram feitas, mas já foram pensadas). Talvez, em um desenvolvimento futuro, seja possível fazer as coisas de forma diferente, mas, por enquanto, é assim que está.
Infelizmente, não tenho tempo suficiente para mostrar minha visão sobre o exemplo de refatoração parcial.
Após o primeiro lançamento, o Expert Advisor abre posições virtuais e reais, calcula, talvez, alguns indicadores sobre os dados de preço. São essas informações que compõem o estado do EA como um todo. Se você recarregar o terminal, o EA deverá não apenas reconhecer as posições abertas como suas, mas também restaurar todas as suas posições virtuais e os valores de cálculo necessários. Se as informações sobre as posições abertas puderem ser obtidas no terminal, as informações sobre as posições virtuais e os valores de cálculo deverão ser salvas pelo próprio Consultor Especializado.
Imagine que o Expert Advisor trabalhe em duas contas de negociação de uma corretora. Um dos terminais é desligado. Durante esse tempo, as posições virtuais foram alteradas na conta em execução. Como fazer com que o comportamento do Expert Advisor coincida com o do terminal que não parou de funcionar?
Como faço isso. Não salvo posições virtuais de forma alguma. Ao iniciar o Expert Advisor, todos os TSs internos são lançados no testador virtual antes do TimeCurrent atual. Assim, conseguimos que, no EA recarregado, todos os dados no momento atual coincidam com a versão sem recarregamento.
Por "recarregamento" também queremos dizer a situação em que há uma pausa no trabalho do Expert Advisor. Por exemplo, um longo OrderSend ou reping. É por isso que é necessário solicitar dados de preço a partir do momento da última solicitação. E executá-los em uma máquina virtual.
Infelizmente, estou com pouco tempo para mostrar minha visão com um exemplo de refatoração parcial.
Você já presta muita atenção na revisão do código de outras pessoas, e eu lhe agradeço muito por isso.
Imagine que um Expert Advisor trabalhe em duas contas de negociação da mesma corretora. Um terminal está inativo. Durante esse tempo, as posições virtuais foram alteradas na conta em execução. Como podemos fazer com que o comportamento do Expert Advisor corresponda ao do terminal que não parou de funcionar?
Já me deparei com essa situação, mas foi um fator insignificante que afetou o resultado da negociação. Além disso, houve ocasiões em que o terminal que "dormiu" durante o fechamento das posições as fechou a um preço mais favorável. Portanto, garantir a identidade total não era um fim em si mesmo.
E se houver corretores diferentes, até mesmo os Expert Advisors que trabalham de forma sincronizada podem mostrar resultados ligeiramente diferentes devido a pequenas diferenças nas cotações. Embora se deva buscar a identidade.
Como eu faço isso. Eu não salvo contas virtuais de forma alguma. Ao iniciar um Expert Advisor, todos os TS internos são iniciados no testador virtual antes do TimeCurrent atual. Assim, conseguimos que, no Expert Advisor recarregado, todos os dados no momento atual coincidam com a versão sem recarregamento.
Essa é uma abordagem interessante, e eu nunca havia considerado essa opção antes. Se entendi corretamente, ao usá-la, devemos ter uma data fixa para o início da negociação virtual, e ela deve ser a mesma para diferentes instâncias de Expert Advisors em diferentes terminais. Isso não é difícil. E um testador virtual deve ser implementado ou seu testador pronto deve ser usado. Isso é mais complicado.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Desenvolvendo um EA multimoeda (Parte 4): Ordens virtuais pendentes e salvamento de estado foi publicado:
Ao começar a desenvolver um EA multimoeda, já alcançamos alguns resultados e realizamos várias iterações de melhoria do código. No entanto, nosso EA não podia trabalhar com ordens pendentes e retomar o trabalho após reiniciar o terminal. Vamos adicionar essas funcionalidades.
No artigo anterior, fizemos uma reestruturação significativa da arquitetura do código para construir um EA multimoeda com várias estratégias operando em paralelo. Para buscar simplicidade e clareza, até agora focamos apenas em um conjunto mínimo de funcionalidades. E mesmo com essa abordagem bastante limitada, alteramos consideravelmente o código dos artigos anteriores.
Agora esperamos que o trabalho realizado seja suficiente para aumentar a funcionalidade sem grandes refatorações no código já escrito. Tentaremos fazer o mínimo de mudanças possíveis, apenas onde for estritamente necessário.
Como desenvolvimento adicional neste artigo, tentaremos fazer o seguinte:
Começaremos com o mais simples, isto é, trabalhar com ordens pendentes virtuais.
Autor: Yuriy Bykov