Felipe,
OnTrade() é chamado apenas quando ocorre os eventos abaixos:
- envio, modificação e remoção de uma ordem pendente;
- cancelamento de uma ordem pendente com ausência de dinheiro suficiente ou expiração;
- ativação de uma ordem pendente;
- abertura, acréscimo ou encerramento de uma posição (ou parte da posição);
- modificação da posição aberta (alteração de stops - Stop Loss e/ou Take Profit).
Só que ele só é chamado quando esses eventos ocorrem feitos por você. Isso é, se você envia uma ordem ou modifica uma ordem pendente. Entendeu? Se você não enviar nada o dia todo, esse evento não será chamado.
Acredito que a melhor maneira para você fazer isso, é utilizar o método OnTick(), colocando um filtro de horário, tipo: HoraInicial : 09:00:01 e HoraFinal: 17:45:00 por exemplo.
Estou com esta mesma dúvida no meu Stop móvel. Na abertura ou no fechamento o meu stop ia lá pra cima e zerava a operação devido ao leilão, que dá ticks altíssimos, o que dá um resultado indesejável o algoritmo do stop movel. Então coloquei filtro de horário e até agora funcionou, por exemplo, das 10:00 hs às 17:00 hs, para evitar com 100% o leilão de abertura. Mas em dias em que a bolsa abre mais tarde, por exemplo, na quarta feira de cinzas, teria que fazer uma nova programação no EA, e todo ano muda este dia. Deveria ter uma forma de filtrar sem precisar fazer pelo horário.
Felipe,
OnTrade() é chamado apenas quando ocorre os eventos abaixos:
- envio, modificação e remoção de uma ordem pendente;
- cancelamento de uma ordem pendente com ausência de dinheiro suficiente ou expiração;
- ativação de uma ordem pendente;
- abertura, acréscimo ou encerramento de uma posição (ou parte da posição);
- modificação da posição aberta (alteração de stops - Stop Loss e/ou Take Profit).
Só que ele só é chamado quando esses eventos ocorrem feitos por você. Isso é, se você envia uma ordem ou modifica uma ordem pendente. Entendeu? Se você não enviar nada o dia todo, esse evento não será chamado.
Acredito que a melhor maneira para você fazer isso, é utilizar o método OnTick(), colocando um filtro de horário, tipo: HoraInicial : 09:00:01 e HoraFinal: 17:45:00 por exemplo.
Fernando, agradeço sua resposta mas como nosso amigo MetaLucson disse acima, o evento OnTick resolve parcialmente pois limitar com filtro de horário, em determinados momentos do ano (quarta-feira de cinzas, por exemplo), pode não funcionar ou ter exceções a mais no código.
Minha real necessidade é entrar com ordem no exato momento em que o mercado abrir, ou seja, o mais rápido possível. Não tem nada específico mesmo?
Grande abs,
Fernando, agradeço sua resposta mas como nosso amigo MetaLucson disse acima, o evento OnTick resolve parcialmente pois limitar com filtro de horário, em determinados momentos do ano (quarta-feira de cinzas, por exemplo), pode não funcionar ou ter exceções a mais no código.
Minha real necessidade é entrar com ordem no exato momento em que o mercado abrir, ou seja, o mais rápido possível. Não tem nada específico mesmo?
Grande abs,
Felipe, boa noite.
Você pode trabalhar com a função Copyticks(), assim que houver a primeira negociação do dia você executa o que deve ser feito.
Abs,
Romeu Bertho.
Felipe, boa noite.
Você pode trabalhar com a função Copyticks(), assim que houver a primeira negociação do dia você executa o que deve ser feito.
Abs,
Romeu Bertho.
Romeu, obrigado pela dica.
Fiquei pensando aqui e acredito que tenha encontrado uma solução para o caso. Veja abaixo:
if(candle[0].open!=lastDayOpeningTrade) { enterOrder = true; lastDayOpeningTrade = candle[0].open; }
Imagino que vai funcionar bem pois o candle[0].open somente irá obter informação a partir do momento de formação do primeiro candle do dia.
Ou estou errado?
Grande abs,
Olá
veja se esse código pode te ajudar.
int OnInit() { .. ... .... SymbolInfoTick(_Symbol,tick); while((tick.flags&TICK_FLAG_BUY)!=TICK_FLAG_BUY && (tick.flags&TICK_FLAG_SELL)!=TICK_FLAG_SELL && !IsStopped()) { Sleep(20); SymbolInfoTick(_Symbol,tick); } Print("Primeiro negócio: ",tick.time," ",// Hora do tick tick.bid," ", // Preço corrente de venda tick.ask," ", // Preço corrente de compra tick.last," ", // Preço da última operação (preço último) tick. volume," ", // Volume para o preço último corrente tick.time_msc," ", // Tempo do "Last" preço atualizado em milissegundos tick.flags); // Flags de tick }
Romeu, obrigado pela dica.
Fiquei pensando aqui e acredito que tenha encontrado uma solução para o caso. Veja abaixo:
Imagino que vai funcionar bem pois o candle[0].open somente irá obter informação a partir do momento de formação do primeiro candle do dia.
Ou estou errado?
Grande abs,
Felipe, boa noite.
Sinceramente eu nunca testei esta sua abordagem, já a do CopyTicks() eu garanto que funciona.
Caso você chegue a testar o seu código, conte-nos depois como que foi.
Abs,
Romeu Bertho.
Felipe, boa noite.
Sinceramente eu nunca testei esta sua abordagem, já a do CopyTicks() eu garanto que funciona.
Caso você chegue a testar o seu código, conte-nos depois como que foi.
Abs,
Romeu Bertho.
Romeu, boa noite
O código funcionou sim, sem nenhum problema. Veja que coloquei uma condição anterior ao código para que rode uma única vez no código, depois ela é descartada pois a variável "a" terá o valor de 2. O código para esse check ficaria assim:
//--- Função CopyRate para capturar dados do último candle CopyRates(ativo,PERIOD_D1,0,2,candle); //--- Condição para igualar o preço do último candle à variável lastDayOpeningTrade. Repete uma única vez em todo código if(a==1) { lastDayOpeningTrade = candle[0].open; a = 2; } //--- Verifica se houve alteração do candle de abertura && verifica se o último tick é diferente do preço do candle de abertura if(candle[0].open!=lastDayOpeningTrade) { enterOrder = true; lastDayOpeningTrade = candle[0].open; }
Abs,
Romeu, boa noite
O código funcionou sim, sem nenhum problema. Veja que coloquei uma condição anterior ao código para que rode uma única vez no código, depois ela é descartada pois a variável "a" terá o valor de 2. O código para esse check ficaria assim:
Abs,
Romeu, boa noite
O código funcionou sim, sem nenhum problema. Veja que coloquei uma condição anterior ao código para que rode uma única vez no código, depois ela é descartada pois a variável "a" terá o valor de 2. O código para esse check ficaria assim:
Abs,
- 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
Pessoal, bom dia
Acho que essa é bem fácil mas gostaria da confirmação dos universitários: estou utilizando a função OnTick num EA porém percebi que esse evento é chamado durante o leilão de abertura do mercado, ou seja, antes mesmo das 09h.
1. É isso mesmo? Essa função passa a coletar as variações antes mesmo da abertura propriamente dita do mercado?
2. O evento OnTrade trabalharia da mesma maneira ou somente após a primeira negociação ter ocorrido que se daria próximo das 09h?
Na prática, preciso exatamente de um evento que somente passe a ser chamado após a abertura do mercado, ou seja, não pode ser vinculado no leilão de abertura!
Muito obrigado