Discussão do artigo "Desenvolvendo um sistema de Replay — Simulação de mercado (Parte 01): Primeiros experimentos (I)"

 

Novo artigo Desenvolvendo um sistema de Replay — Simulação de mercado (Parte 01): Primeiros experimentos (I) foi publicado:

Que tal criar um sistema para estudar o mercado quando ele está fechado, ou mesmo simular situações de mercado. Aqui vamos iniciar uma nova sequencia de artigos, a fim de tratar deste tema.

Este código, irá de fato criar as barras com um período de 1 minuto, que é o mínimo, que a plataforma exige, para poder gerar qualquer outro tempo gráfico. As partes em destaque, de fato não fazem parte o código, mas são uteis, para nos permitir analisar quanto a barra de 1 minuto. Esta de fato sendo criado dentro deste prazo, pois se ela demorar muito mais que 1 minuto para ser criada, teremos que fazer algo a respeito. Mas se ela estiver sendo criada, em menos de 1 minuto, pode ser que o sistema já será viável logo de cara.

Ao fazer este sistema executar, teremos o resultado, que e visto no video abaixo:


Autor: Daniel Jose

 

Qual é o objetivo do código a seguir?

 17        struct st00
 18       {
 19           datetime dt;
 20           int      milisec;
 21           double   Bid,
 22                    Ask,
 23                    Last;
 24           long     Vol;
 25           uchar    flag;
 26       }st00 m_ArrayInfoTicks[];
 53      m_ArrayInfoTicks[m_ArrayCount].dt = macroRemoveSec ( StringToTime ( StringSubstr (szInfo, 0 , 19 ))); 
 54      m_ArrayInfoTicks[m_ArrayCount].milisec = ( int ) StringToInteger ( StringSubstr (szInfo, 20 , 3 ));   
Se os segundos foram removidos na linha 53, então os milissegundos e seu uso perdem todo o significado na linha 54.
No entanto, você os adiciona à estrutura.
Os eventos de cronômetro são gerados independentemente. E cada tique vem de acordo com um cronômetro, e não em milissegundos e segundos (que são excluídos).
Os milissegundos agora pesam no ar, como espaço extra na memória. E operações desnecessárias de preenchimento.
 
Além disso, você não resolveu outro problema que lhe permite reduzir a construção de uma barra de minutos.
Por exemplo, os horários destacados em vermelho e azul são os mesmos, sendo que o último preço pode ou não ser o mesmo.
Esses ticks podem ser comprimidos e reduzir bastante o tempo necessário para construir uma barra de minutos.
 449      2021.10 . 22        09 : 00 : 38.649      107900    107905                    6
 450      2021.10 . 22        09 : 00 : 38.651                      107900    1.00000000        88
 451      2021.10 . 22        09 : 00 : 38.651                      107895    5.00000000        88
 452      2021.10 . 22        09 : 00 : 38.651                      107890    5.00000000        88
 453      2021.10 . 22        09 : 00 : 38.651                      107885    3.00000000        88
 454      2021.10 . 22        09 : 00 : 38.651                      107880    15.00000000       88
 455      2021.10 . 22        09 : 00 : 38.651                      107880    3.00000000        88
 456      2021.10 . 22        09 : 00 : 38.651                      107875    16.00000000       88
 457      2021.10 . 22        09 : 00 : 38.651                      107870    2.00000000        88
 458      2021.10 . 22        09 : 00 : 38.654                      107875    1.00000000        88
 459      2021.10 . 22        09 : 00 : 38.654                      107875    1.00000000        88
 460      2021.10 . 22        09 : 00 : 38.654                      107880    1.00000000        88
 461      2021.10 . 22        09 : 00 : 38.659                      107880    2.00000000        88
 462      2021.10 . 22        09 : 00 : 38.659                      107885    2.00000000        88
 463      2021.10 . 22        09 : 00 : 38.660                      107885    1.00000000        88
 464      2021.10 . 22        09 : 00 : 38.660                      107890    3.00000000        88
 465      2021.10 . 22        09 : 00 : 38.662                      107885    3.00000000        88
 466      2021.10 . 22        09 : 00 : 38.662                      107880    3.00000000        88
 467      2021.10 . 22        09 : 00 : 38.662                      107875    2.00000000        88
 468      2021.10 . 22        09 : 00 : 38.662                      107895    3.00000000        88
 469      2021.10 . 22        09 : 00 : 38.662                      107900    1.00000000        88
 470      2021.10 . 22        09 : 00 : 38.664                      107880    1.00000000        88       
Porém, você removeu os segundos na linha 53.

53      m_ArrayInfoTicks[m_ArrayCount].dt = macroRemoveSec ( StringToTime ( StringSubstr (szInfo, 0 , 19 ))); 
54      m_ArrayInfoTicks[m_ArrayCount].milisec = ( int ) StringToInteger ( StringSubstr (szInfo, 20 , 3 ));   
E deixou os milissegundos na linha 54.
Isso impossibilita que você realize essa compressão com precisão. Não há vinculação de milissegundos a segundos - ela foi removida.
É claro que há uma baixa probabilidade de que o valor de milissegundos passe para o próximo segundo, e até mesmo continue nos próximos ticks. Mas ele está lá.
Há uma garantia de 100% de precisão somente ao passar de uma barra de minutos para a próxima - há uma vinculação de milissegundos a minutos.
 
Você precisa de milissegundos para compactar os ticks no futuro? Eu entendi corretamente?
Bem, "no futuro" - para mim - eu ainda não li mais nada. Para você, suponho, isso já está "no passado"...)))
Se for assim, concordo que os segundos podem ser removidos - a probabilidade de uma coincidência é extremamente baixa)))
 
Oh, um milagre! Se você comprimir os milissegundos, o tempo de formação da vela de minuto será 00:01:06. Contra 00:01:52 - sem compressão. Ganhamos 46 segundos!)))
 

Como resultado, com todas as edições.


Foram criadas 1153.809 posições de movimentação.

Ticks excluídos = 1066231

Verificação da velocidade de execução . 2023.12.02 01:52:21 ---- 2023.12.02 01:53:17

Hora de construir a primeira vela: 00:00:56 segundos.)))

Ganhamos 56 segundos!

Exatamente a metade disso.
 

Obrigado por seu excelente trabalho!

Tenho uma pergunta. É possível adicionar a opção de retrocesso ao replay? Quero dizer, voltar para as velas anteriores e reproduzir novamente.