"every tick based on real ticks" gera ou não os ticks reais?

 

Testando um EA com a opção "every tick based on real ticks" ocorrem as seguintes mensagens:

Symbols WING22: symbol to be synchronized
Symbols WING22: symbol synchronized, 3720 bytes of symbol info received
History WING22: history synchronization started
History WING22: load 27 bytes of history data to synchronize in 0:00:00.001
History WING22: history synchronized from 2021.10.14 to 2022.01.21
Ticks   WING22: ticks synchronization started
Ticks   WING22: load 34 bytes of tick data to synchronize in 0:00:00.000
Ticks   WING22: history ticks synchronized from 2022.01.07 to 2022.01.07
History WING22,M1: history cache allocated for 12492 bars and contains 11224 bars from 2021.10.14 11:41 to 2022.01.06 18:24
History WING22,M1: history begins from 2021.10.14 11:41
Tester  WING22,M1 (...): generating based on real ticks
Tester  testing with execution delay 20 milliseconds
Tester  WING22,M1: testing of Experts\ProjTwo\....ex5 from 2022.01.07 00:00 to 2022.01.08 00:00 started with inputs:
Tester    ...
...
Ticks   WING22 : 2022.01.07 23:59 - all the real ticks discarded within a day
Ticks   WING22 : 2022.01.07 23:59 - 1380690 tick prices mismatch for 565 minute bars
Ticks   WING22 : real ticks begin from 2022.01.07 00:00:00
Ticks   WING22 : 2022.01.07 00:00 - 2022.01.08 00:00  real ticks discarded for 565 minutes of 565 total minute bars, every tick generation used
Ticks   WING22 : 2022.01.07 00:00 - 2022.01.08 00:00  real ticks discarded for 1 whole days
Ticks   WING22 : 2022.01.07 00:00 - 2022.01.08 00:00  tick volumes not matched for 565 minute bars
Ticks   WING22 : 2022.01.07 00:00 - 2022.01.08 00:00  tick prices of 1380690 ticks not matched for 565 minute bars

Comparando os resultados desse teste com outro usando "every tick" (ticks simulados) observa-se que em ambos os casos as ordens executadas são as mesmas, mas algumas têm resultados diferentes.

O fato de que algumas ordens produzem resultados diferentes (um stop sendo atingido antes de um target, ou vice-versa) parece sugerir que são diferentes as sequências de ticks usadas em cada caso, como de fato deveriam ser. No entanto, no caso "every tick based on real ticks" duas coisas chamam a atenção:

1) As mensagens acima, que parecem indicar que os ticks reais estão sendo ignorados;

2) O histórico de ordens mostra o target ou o stop sendo atingido instantaneamente para TODAS as ordens, o que parece improvável tendo em vista que (a) target = 150 e stop = 50 e (b) o histórico de ordens usando a opção "every tick" mostra as transações durando de 2 segundos a 6 minutos, o que parece mais realista.

Afinal, "every tick based on real ticks" gera ou não os ticks reais?

 
Filipe_Almeida:

Testando um EA com a opção "every tick based on real ticks" ocorrem as seguintes mensagens:

Comparando os resultados desse teste com outro usando "every tick" (ticks simulados) observa-se que em ambos os casos as ordens executadas são as mesmas, mas algumas têm resultados diferentes.

O fato de que algumas ordens produzem resultados diferentes (um stop sendo atingido antes de um target, ou vice-versa) parece sugerir que são diferentes as sequências de ticks usadas em cada caso, como de fato deveriam ser. No entanto, no caso "every tick based on real ticks" duas coisas chamam a atenção:

1) As mensagens acima, que parecem indicar que os ticks reais estão sendo ignorados;

2) O histórico de ordens mostra o target ou o stop sendo atingido instantaneamente para TODAS as ordens, o que parece improvável tendo em vista que (a) target = 150 e stop = 50 e (b) o histórico de ordens usando a opção "every tick" mostra as transações durando de 2 segundos a 6 minutos, o que parece mais realista.

Afinal, "every tick based on real ticks" gera ou não os ticks reais?

"..based On Real Ticks" SÃO os ticks reais vindos da corretora. Isso não quer dizer que sejam bons (qualidade).

Execute um teste de 2 dias no modo visual para você atestar que as operações estão sendo feitas corretamente.

 
Flavio Jarabeck #:

"..based On Real Ticks" SÃO os ticks reais vindos da corretora. Isso não quer dizer que sejam bons (qualidade).

Execute um teste de 2 dias no modo visual para você atestar que as operações estão sendo feitas corretamente.

As mensagens de descarte dos ticks reais ocorrem independentemente do dia. Foram testados diversos dias, dando sempre o mesmo problema.

Extraindo os ticks para um arquivo csv usando um script, observa-se o seguinte:

time;bid;ask;last;vol;t_msc;flags;vol_real
2022.02.01 08:55:00;118000;112280;0;0;1643705700135;6;0
2022.02.01 08:55:00;118000;111565;0;0;1643705700520;4;0
2022.02.01 08:55:23;118000;108000;0;0;1643705723357;4;0
2022.02.01 08:55:44;118315;108000;0;0;1643705744641;2;0
...
2022.02.01 08:56:00;123795;101415;0;0;1643705760293;2;0
2022.02.01 08:56:02;123875;101415;0;0;1643705762315;2;0
2022.02.01 08:56:03;123935;101415;0;0;1643705763704;2;0
2022.02.01 08:56:45;123935;101415;0;0;1643705805982;4;0
2022.02.01 08:57:00;123935;101415;0;0;1643705820849;2;0
2022.02.01 08:57:46;123935;101415;0;0;1643705866052;4;0
2022.02.01 08:58:00;123935;101415;0;0;1643705880151;2;0
2022.02.01 08:58:47;123935;101415;0;0;1643705927271;4;0
2022.02.01 08:59:00;123935;101415;0;0;1643705940192;2;0
2022.02.01 08:59:47;123935;101415;0;0;1643705987840;4;0
2022.02.01 09:00:00;123935;101415;0;0;1643706000561;2;0
2022.02.01 09:00:48;123935;101415;0;0;1643706048435;4;0
2022.02.01 09:00:58;123935;101415;112540;87;1643706058127;312;87
2022.02.01 09:00:58;123935;101415;112540;4920;1643706058129;312;4920
2022.02.01 09:00:58;123935;101415;112535;10;1643706058149;312;10
2022.02.01 09:00:58;123935;101415;112535;3;1643706058150;312;3
...
2022.02.01 18:24:59;113700;113730;113730;9;1643739899530;4;9
2022.02.01 18:24:59;113700;113730;113730;45;1643739899811;312;45
2022.02.01 18:24:59;113700;113730;113735;5;1643739899811;312;5
2022.02.01 18:24:59;113700;113730;113700;10;1643739899968;344;10
2022.02.01 18:25:00;113700;113715;113700;10;1643739900084;6;10
2022.02.01 18:25:00;115705;111695;113700;10;1643739900516;6;10
...
2022.02.01 18:28:03;120000;109000;113700;10;1643740083026;6;10
2022.02.01 18:29:01;120000;109000;113700;10;1643740141782;2;10
2022.02.01 18:29:08;120000;109000;113700;10;1643740148735;4;10
2022.02.01 18:30:01;120000;109000;113700;10;1643740201267;2;10
2022.02.01 18:30:06;120000;108000;113700;10;1643740206006;4;10
2022.02.01 18:31:02;120000;108000;113700;10;1643740262983;2;10
2022.02.01 18:31:10;120000;108000;113700;10;1643740270439;4;10
2022.02.01 18:31:24;120000;108000;113745;242;1643740284848;312;242
2022.02.01 18:31:24;113740;113745;113745;242;1643740284852;6;242
2022.02.01 18:31:24;113740;113745;113745;11118;1643740284852;312;11118
2022.02.01 19:30:00;0;0;113745;11118;1643743800025;6;11118

O começo do arquivo apresenta alguns ticks antes da abertura do pregão (8:55, 8:56...) e o fim do arquivo apresenta alguns após o encerramento (18:30, 19:30).

Fica a dúvida de se não seriam esses ticks de antes das 9:00 e depois da 18:25 que fariam o Tester detectar uma discrepância entre o histórico de ticks e o histórico de candles M1.

Uma forma de testar essa hipótese seria poder restringir o teste a um intervalo de tempo específico, por exemplo 9:00-18:25. Infelizmente não identifiquei no Tester nenhuma opção desse tipo. O único filtro disponível parece ser por data, sendo que a data implicitamente é a data cheia. Não sei se estou deixando de ver alguma coisa...

 
Filipe_Almeida #:

As mensagens de descarte dos ticks reais ocorrem independentemente do dia. Foram testados diversos dias, dando sempre o mesmo problema.

Extraindo os ticks para um arquivo csv usando um script, observa-se o seguinte:

O começo do arquivo apresenta alguns ticks antes da abertura do pregão (8:55, 8:56...) e o fim do arquivo apresenta alguns após o encerramento (18:30, 19:30).

Fica a dúvida de se não seriam esses ticks de antes das 9:00 e depois da 18:25 que fariam o Tester detectar uma discrepância entre o histórico de ticks e o histórico de candles M1.

Uma forma de testar essa hipótese seria poder restringir o teste a um intervalo de tempo específico, por exemplo 9:00-18:25. Infelizmente não identifiquei no Tester nenhuma opção desse tipo. O único filtro disponível parece ser por data, sendo que a data implicitamente é a data cheia. Não sei se estou deixando de ver alguma coisa...

Ticks antes do começo do pregão são de Leilão, mas duvido que sejam confiáveis. Os de pós fechamento são do after market.

O mínimo que um EA deve ter é restrição de horário para operar. implemente isso.

 
Flavio Jarabeck #:

Ticks antes do começo do pregão são de Leilão, mas duvido que sejam confiáveis. Os de pós fechamento são do after market.

O mínimo que um EA deve ter é restrição de horário para operar. implemente isso.

Bom Dia Flávio,

Obrigado pela ajuda. Mas observe o seguinte: isso está implementado. Inclusive, quando me surgiram dúvidas sobre isso, restringi o horário de operação do robot de 10h às 15h e não faz diferença. Não faz diferença porque é o Tester que pega os ticks da corretora, faz alguma validação em cima deles e decide descartá-los. ANTES de o robot ser acionado ou ter qualquer oportunidade de decidir sobre isso.

Enfim... Ausente algum recurso no Tester para permitir filtrar os ticks durante o processo de load e validação (antes do acionamento do robot) parecem restar duas opções:

1) Repetir o procedimento em outra corretora (atualmente estou usando a Clear) ;

2) Desenvolver um script de simulação que não dependa do Tester.

Mas, mais uma vez, obrigado pela ajuda.

 
Filipe_Almeida #:

Bom Dia Flávio,

Obrigado pela ajuda. Mas observe o seguinte: isso está implementado. Inclusive, quando me surgiram dúvidas sobre isso, restringi o horário de operação do robot de 10h às 15h e não faz diferença. Não faz diferença porque é o Tester que pega os ticks da corretora, faz alguma validação em cima deles e decide descartá-los. ANTES de o robot ser acionado ou ter qualquer oportunidade de decidir sobre isso.

Enfim... Ausente algum recurso no Tester para permitir filtrar os ticks durante o processo de load e validação (antes do acionamento do robot) parecem restar duas opções:

1) Repetir o procedimento em outra corretora (atualmente estou usando a Clear) ;

2) Desenvolver um script de simulação que não dependa do Tester.

Mas, mais uma vez, obrigado pela ajuda.

Eu suspeito de qualidade de histórico. Experimente com outra corretora.

De novo, use o backteste visual para corroborar se as suas operacoes estao sendo feitas nos locais e momentos corretos.

 
Filipe_Almeida:

Testando um EA com a opção "every tick based on real ticks" ocorrem as seguintes mensagens:

Comparando os resultados desse teste com outro usando "every tick" (ticks simulados) observa-se que em ambos os casos as ordens executadas são as mesmas, mas algumas têm resultados diferentes.

O fato de que algumas ordens produzem resultados diferentes (um stop sendo atingido antes de um target, ou vice-versa) parece sugerir que são diferentes as sequências de ticks usadas em cada caso, como de fato deveriam ser. No entanto, no caso "every tick based on real ticks" duas coisas chamam a atenção:

1) As mensagens acima, que parecem indicar que os ticks reais estão sendo ignorados;

2) O histórico de ordens mostra o target ou o stop sendo atingido instantaneamente para TODAS as ordens, o que parece improvável tendo em vista que (a) target = 150 e stop = 50 e (b) o histórico de ordens usando a opção "every tick" mostra as transações durando de 2 segundos a 6 minutos, o que parece mais realista.

Afinal, "every tick based on real ticks" gera ou não os ticks reais?

São sim mas você terá de baixar eles antes, exportar, e importar para um símbolo personalizado que você crie...

Na janela de ativos você consegue fazer tudo citado acima.....Expliquei com mais detalhes aqui também https://www.mql5.com/pt/forum/388772/page2#comment_27844101

Backtest - Por que são apresentados resultados diferentes para o mesmo ativo (WING22) nas contas DEMO e Real ?
Backtest - Por que são apresentados resultados diferentes para o mesmo ativo (WING22) nas contas DEMO e Real ?
  • 2022.02.13
  • www.mql5.com
Testei o EA, mês a mês, de 2017 pra cá, usando a opção Cada Tick e os resultados se mostraram promissores, mas ao colocar em conta real surgiram al...
 
Adailton Silva #:

São sim mas você terá de baixar eles antes, exportar, e importar para um símbolo personalizado que você crie...

Na janela de ativos você consegue fazer tudo citado acima.....Expliquei com mais detalhes aqui também https://www.mql5.com/pt/forum/388772/page2#comment_27844101

Oi Adailton.

Obrigado pelas dicas!! Importantes de fato.

No interim, já tinha percebido a necessidade de baixar os ticks e usar Custom Symbols. Como pretendo usar candles atemporais (por número de ticks ou volume) que infelizmente não estão disponíveis no MetaTrader, acabei criando um pequeno simulador e estou terminando de desenvolver um visualizador.

E baixo todos os dias os ticks do WIN e WDO, o que também é simples de fazer com um programa. Obviamente, o histórico não é longo, mas pelo menos temos a certeza de que são dados confiáveis.

Agora é recomeçar os testes e focar na estratégia.

 
Filipe_Almeida #:

Oi Adailton.

Obrigado pelas dicas!! Importantes de fato.

No interim, já tinha percebido a necessidade de baixar os ticks e usar Custom Symbols. Como pretendo usar candles atemporais (por número de ticks ou volume) que infelizmente não estão disponíveis no MetaTrader, acabei criando um pequeno simulador e estou terminando de desenvolver um visualizador.

E baixo todos os dias os ticks do WIN e WDO, o que também é simples de fazer com um programa. Obviamente, o histórico não é longo, mas pelo menos temos a certeza de que são dados confiáveis.

Agora é recomeçar os testes e focar na estratégia.

De fato, o problema é que o histórico estará retido ao período do contrato, ainda não estudei se há possibilidade de juntar períodos de contratos diferentes em um único arquivo *.csv (que é o que ele baixa) e obter mais tempo para realizar os testes.

Caso alguém leia e saiba como fazer, serei grato desde já. 

No mais é como você mesmo disse Filipe, recomeçar e focar na estratégia. 

Lhe desejo sucesso por aí.

 
Adailton Silva #:

De fato, o problema é que o histórico estará retido ao período do contrato, ainda não estudei se há possibilidade de juntar períodos de contratos diferentes em um único arquivo *.csv (que é o que ele baixa) e obter mais tempo para realizar os testes.

Caso alguém leia e saiba como fazer, serei grato desde já. 

No mais é como você mesmo disse Filipe, recomeçar e focar na estratégia. 

Lhe desejo sucesso por aí.

Observe que os ticks em si são "anônimos", no sentido em que neles não existe qualquer identificação do ativo (WING22, WINJ22...). Então, sim, vc sempre poderia concatenar os arquivos o que, dependendo da extensão do período que se pertenda processar, pode ficar meio inconveniente.

Uma solução que me parece mais prática, e a que estou usando, é manter os arquivos separados (um arquivo por dia) e usar uma lógica que os leia e gere um fluxo contínuo de ticks.

No exemplo em anexo, a parte importante é a função nextLine, onde os arquivos são abertos e lidos sequencialmente, dependendo de um padrão de pesquisa que suporta wildcards conforme disponibilizado pela função da API FileFindFirst.

A lógica dentro do while loop em OnStart é apenas para efeitos de teste, gerando um log com as quebras de hora cheia. Num simulador, é aqui que entraria a lógica de agregação de candles seguida da lógica de trading.

Forte Abraço.

Arquivos anexados:
 
Filipe_Almeida #:

Observe que os ticks em si são "anônimos", no sentido em que neles não existe qualquer identificação do ativo (WING22, WINJ22...). Então, sim, vc sempre poderia concatenar os arquivos o que, dependendo da extensão do período que se pertenda processar, pode ficar meio inconveniente.

Uma solução que me parece mais prática, e a que estou usando, é manter os arquivos separados (um arquivo por dia) e usar uma lógica que os leia e gere um fluxo contínuo de ticks.

No exemplo em anexo, a parte importante é a função nextLine, onde os arquivos são abertos e lidos sequencialmente, dependendo de um padrão de pesquisa que suporta wildcards conforme disponibilizado pela função da API FileFindFirst.

A lógica dentro do while loop em OnStart é apenas para efeitos de teste, gerando um log com as quebras de hora cheia. Num simulador, é aqui que entraria a lógica de agregação de candles seguida da lógica de trading.

Forte Abraço.

Nossa nobre, obrigada por disponibilizar o arquivo, vou estudar ele e sua idéia para realizar um teste assim que possível.

No momento estou com os dados em arquivos imensos de 2gb para mais a depender do contrato. 

Preciso terminar o desenvolvimento de algumas lógicas para começar a estudar essa questão....mais uma vez, muito obrigada pelo empurrãozinho.

Olha, se quiser conversar mais, manda um pm. 

Abraço, até mais.

Razão: