Perda de performance no evento OnTrade (gera 6 vezes x expetativa apenas 1 vez)

 

Bom dia,

Coloquei o evento OnTrade a função Print "Gerou evento" e tinha a expectativa desse evento, pela entendimento da leitura da documentação, que ele seria acionado 1 vez quando executei a função OrderSend().

Só que esse evento na prática foi acionado 6 vezes (sem nenhuma ação / mudança em nenhuma ordem ou posição) .

Alguém sabe dizer o porque disso?  Na teoria o código que quero colocar nesse evento seria necessário  executar uma vez, só que na prática vai executar 6 vezes, PERDENDO PERFORMANCE DO EA.

 At.

 Daniel 

 --------------------------------------------------------------------------------------------------------------------------

Na documentação:

 OnTrade

A função é chamada quando o evento Trade ocorre, que surge quando você muda a lista de ordens postadas e posições abertaso histórico de ordens e histórico de operações (deals). Quando uma atividade de negociação (trade) é realizada (abertura de ordem pendente, abertura/fechamento de posição, definição de stop, disparo de ordem pendente, etc.) o histórico de ordens e operações (deals) e/ou a lista de posições e ordens correntes são por conseqüência alterados.

void OnTrade();

Os usuários devem implementar de forma independente no código a verificação do estado de uma conta de negociação quanto tal evento é recebido (se isto é requerido pelas condições da estratégia de negócio). Se a chamada da função OrderSend() foi concluída com sucesso e retornou um valor de true, isso significa que o servidor de negociação postou a ordem na fila de execução e atribuiu um número de bilhetagem (ticket number) nele. Tão logo o servidor processe esta ordem, o evento Trade será gerado. E se um usuário lembrar valor da bilhetagem (ticket), ele/ela será capaz de descobrir o que aconteceu com a ordem usando este valor na função OnTrade(). 

 
Daniel Andrejczuk:

Bom dia,

Coloquei o evento OnTrade a função Print "Gerou evento" e tinha a expectativa desse evento, pela entendimento da leitura da documentação, que ele seria acionado 1 vez quando executei a função OrderSend().

Só que esse evento na prática foi acionado 6 vezes (sem nenhuma ação / mudança em nenhuma ordem ou posição) .

Alguém sabe dizer o porque disso?  Na teoria o código que quero colocar nesse evento seria necessário  executar uma vez, só que na prática vai executar 6 vezes, PERDENDO PERFORMANCE DO EA.

 At.

 Daniel 

 --------------------------------------------------------------------------------------------------------------------------

Na documentação:

 OnTrade

A função é chamada quando o evento Trade ocorre, que surge quando você muda a lista de ordens postadas e posições abertaso histórico de ordens e histórico de operações (deals). Quando uma atividade de negociação (trade) é realizada (abertura de ordem pendente, abertura/fechamento de posição, definição de stop, disparo de ordem pendente, etc.) o histórico de ordens e operações (deals) e/ou a lista de posições e ordens correntes são por conseqüência alterados.

void OnTrade();

Os usuários devem implementar de forma independente no código a verificação do estado de uma conta de negociação quanto tal evento é recebido (se isto é requerido pelas condições da estratégia de negócio). Se a chamada da função OrderSend() foi concluída com sucesso e retornou um valor de true, isso significa que o servidor de negociação postou a ordem na fila de execução e atribuiu um número de bilhetagem (ticket number) nele. Tão logo o servidor processe esta ordem, o evento Trade será gerado. E se um usuário lembrar valor da bilhetagem (ticket), ele/ela será capaz de descobrir o que aconteceu com a ordem usando este valor na função OnTrade(). 

Olá Daniel Andrejczuk,

Primeiramente a pergunta: você tem certeza de que a função está sendo acionada APENAS uma única vez?

Já faz algum tempo desde que desenvolvi o último EA com a função OnTrade... atualmente desenvolvo apenas utilizando OnTradeTransaction, que é mais atual e mais completa do que a função OnTrade.

Portanto, que eu me lembre de cabeça, essa função realmente é acionada apenas uma única vez, por isso mesmo pergunto se eventualmente você não estaria chamando a função mais de uma vez...

Certamente isso seria extremamente perigoso, concorda? Por isso mesmo duvido que você esteja cometendo esse erro.

Com relação ao seu último comentário (EA perdendo performance), duvido bastante que isso tenha qualquer impacto em sua estratégia, SALVO se a mesma for uma estratégia de scalping e que precise administrar as ordens com base no milissegundo...

Abraços,
Malacarne

 

Malacarme, bom dia novamente!

 

Primeiramente obrigado pela atenção novamente.

Respondendo sua pergunta, concluí que só uma ordem foi enviada pois abaixo da  função OrderSend coloquei comando Print("comando enviado") e na guia "expert" aparece 1 ordem enviada para varias OnTrade.

Muito pertinente seu comentário, irei usar a  OnTradeTransaction.

Como sou inciante no desenvolvimento no meta com certeza posso e irei cometer vários erros "inicialmente", agora analisar e afinar o EA, o que me facilita é que desenvolvo ERP's a uns 20 anos pelo menos e sempre foi a programação que levou o leite para casa e A BOLSA "MAU BOLETADA" manualmente sem conseguir seguir o trade system tirou, heheheh.

Quanto a questão da performance concordo que na prática não deve gerar impacto, usei esse termo baseado que a logica é realizar a rotina apenas uma vez.

Ainda estou me familiarizando com a programação no meta, por isso ainda algumas duvidas que acho pertinente e não localizo no fórum ou na documentação estou buscando ajuda.

 

Abraço,

 

Daniel 

Razão: