Algoritmo falhando com validação de data

 

Amigos, boa tarde !


Gostaria de compartilhar com vocês uma falha que identifiquei hoje em um de meus códigos...


Não quis usar a ontimer, e fiz o controle do meu código todo na ontick.  E eu faço o seguinte :

Primeiro criei a variável :

datetime v_candle_time;

//Depois carrego ela assim :

v_candle_time = iTime(_Symbol, _Period,0);

//Minha validação logo na sequência tem que atender essa regra, que está dentro de um if de envio de ordens :

&& (v_candle_time+2 >= TimeCurrent()) 

// Os resultados foram no momento do envio :

v_candle_time+2   = 2020.09.15 09:25:02 
 TimeCurrent()    = 2020.09.15 09:25:08

ou seja, não respeitou essa condição e fez o envio de uma ordem indevida ocasionando stop. Alguem já passou por isso ? Porque é a primeira vez que vejo o código falhar... De 45 pessoas que usam aconteceu com umas 10. Teria algum tratamento ?


Obrigado !

 
Carlos Martins:


Olá Carlos,

o TIME_CURRENT() dentro do OnTick() vai exibir o time da oferta mais recente dos ativos que estão na Janela de observação.

Então se o robô está operando WDO e tem WIN na lista de observação isso pode acontecer.

Esses dois ativos mantém o TIME_CURRENT() mais próximo de TIME_TRADESERVER()

 
Rogerio Giannetti Torres:

Olá Carlos,

o TIME_CURRENT() dentro do OnTick() vai exibir o time da oferta mais recente dos ativos que estão na Janela de observação.

Então se o robô está operando WDO e tem WIN na lista de observação isso pode acontecer.

Esses dois ativos mantém o TIME_CURRENT() mais próximo de TIME_TRADESERVER()

Fala Rogério blz ?

Mesmo que seja um pouco divergente, ele não atendeu minha condição e passou fazendo o envio da ordem. Minha variável V_candle_time era menor que o time current... Mesmo assim ele entrou no bloco.


Eu só peguei pois armazeno os valores das variáveis em log.

 
Carlos Martins:

Fala Rogério blz ?


Opa,

acho que você não captou.  Um gargalo de segundos acontece com alguma frequência.

Para WIN no momento de agressão forte ao book.

/*----------------------------------------------------------- Isso aqui pode dar um resultado */
if (v_candle_time+2 >= TimeCurrent())
..
..
..
..
Print(v_candlet_time+2,"  ",TimeCurrent());

/*----------------------------------------------------------- Diferente disso daqui */

datetime TC = TimeCurrent();
if (v_candle_time+2 >= TC)
..
..
..
..
Print(v_candle_time+2," ",TC);
 
Rogerio Giannetti Torres:

Opa,

acho que você não captou.  Um gargalo de segundos acontece com alguma frequência.

hum...entendi..


realmente no momento ouve uma agressão forte mesmo, o preço explodiu e voltou.


Vou colocar o valor do timecurrent em variável então.


Muito obrigado