Discussão do artigo "Usando OpenCL para testar padrões de candles" - página 2

 
Aleksey Vyazmikin:

E outra pergunta: quanto tempo leva para transferir/preparar os dados para a placa de vídeo? Ouvi uma opinião de que não faz sentido usar o OpenCL para a placa de vídeo em negociações reais devido às perdas de tempo na transferência de dados para processamento.

A Figura 8 mostra a saída dos intervalos de tempo entre os pontos de controle no código do programa para o console do terminal. Vou reproduzi-la aqui:

Horários

Onde:

  • OpenCL init - inicialização do dispositivo OpenCL e criação de kernels a partir de recursos
  • OpenCL buffering - cópia de buffers OHLC para a memória da placa de vídeo (histórico semestral, período M1)
  • Execução total do OpenCL - execução (execução de vários kernels com leitura de resultados, etc...)
  • As ordens de teste do OpenCL e de preparação do OpenCL são os estágios de execução que a execução total do OpenCL inclui

O carregamento de dados no array (buffering na figura) levou 26,6 ms (talvez eu tenha precisado carregar ou sincronizar algo), o carregamento dos mesmos dados na memória da placa de vídeo levou 8,7 ms.

Sim, se você correr com dados grandes para frente e para trás várias vezes, poderá perder muito tempo. Portanto, precisamos criar o algoritmo de forma que a cópia de/para a memória da GPU seja minimizada. Quero modificar o código para testar o histórico de ticks em um futuro próximo. Os volumes serão maiores nesse caso. Será interessante ver o tempo de cópia nesse caso.

Até o momento, o processo mais caro é a inicialização. Ele leva 316 ms. Mas isso pode ser feito uma vez se usarmos os mesmos kernels daqui para frente.


 
Serhii Shevchuk:

A Figura 8 mostra a saída dos intervalos de tempo entre os pontos de controle no código do programa para o console do terminal. Vou reproduzi-la aqui:

Onde:

  • OpenCL init - inicialização do dispositivo OpenCL e criação de kernels a partir de recursos
  • OpenCL buffering - cópia de buffers OHLC para a memória da placa de vídeo (histórico semestral, período M1)
  • Execução total do OpenCL - execução (execução de vários kernels com leitura de resultados, etc...)
  • As ordens de teste do OpenCL e de preparação do OpenCL são os estágios de execução que a execução total do OpenCL inclui

O carregamento de dados no array (buffering na figura) levou 26,6 ms (talvez eu tenha precisado carregar ou sincronizar algo), o carregamento dos mesmos dados na memória da placa de vídeo levou 8,7 ms.

Sim, se você correr com dados grandes para frente e para trás várias vezes, poderá perder muito tempo. Portanto, precisamos criar o algoritmo de forma que a cópia de/para a memória da GPU seja minimizada. Quero modificar o código para testar o histórico de ticks em um futuro próximo. Os volumes serão maiores nesse caso. Será interessante ver o tempo de cópia nesse caso.

Até o momento, o processo mais caro é a inicialização. Ele leva 316 ms. Mas isso pode ser feito uma vez se usarmos os mesmos kernels.


Obrigado, muito informativo! No entanto, como isso se compara a um processador?

De qualquer forma, para muitas estratégias que funcionam por abertura de barra, isso pode ser útil se você precisar fazer cálculos complexos, por exemplo, adaptação automática ao mercado, tanto na inicialização quanto uma vez por dia.

 
Aleksey Vyazmikin:

Obrigado, muito informativo! Entretanto, como isso se compara a um processador?

De qualquer forma, para muitas estratégias que funcionam na abertura de barras, ele pode ser útil se você precisar fazer cálculos complexos, por exemplo, adaptação automática ao mercado, tanto na inicialização quanto uma vez por dia.

No final do artigo, há tabelas de comparação de desempenho. O EA é otimizado no testador de estratégia e, em seguida, os resultados obtidos e o tempo gasto são comparados com o que foi obtido pelo testador OpenCL. Ponto 3, "Comparação de desempenho".

Na profundidade de teste de 9 meses no modo "OHLC on M1", o testador OpenCL gerencia no máximo 1 segundo ao otimizar dois parâmetros de 100 etapas cada (10.000 passagens).

Essa otimização pode ser realizada pelo menos a cada minuto em 60 pares, o que já pode ser chamado de adaptação automática ao mercado, se entendi corretamente o que você quis dizer.

 
Serhii Shevchuk:

Há tabelas de comparação de desempenho no final do artigo. O EA é otimizado no testador de estratégia e, em seguida, os resultados obtidos e o tempo gasto são comparados com o que foi obtido pelo testador OpenCL. Ponto 3, "Comparação de desempenho".

Na profundidade de teste de 9 meses no modo "OHLC on M1", o testador OpenCL gerencia no máximo 1 segundo ao otimizar dois parâmetros de 100 etapas cada (10.000 passagens).

Essa otimização pode ser realizada pelo menos a cada minuto em 60 pares, o que já pode ser chamado de adaptação automática ao mercado, se eu entendi corretamente o que você está falando.

Eu vi a tabela, a questão está em uma iteração (o resultado de uma passagem) tanto para a CPU quanto para a GPU, pois há preparação e transferência de dados. No entanto, esse é obviamente um tópico útil, é uma pena que nem todos possam usá-lo devido à sua simplicidade.

 
Estou correto ao afirmar que, se houver um farm de GPUs com várias placas, os cálculos serão realizados em todas as placas?
 
kogriv:
Estou correto ao afirmar que, se houver um farm de GPU de várias placas, o cálculo será feito em todas as placas?

Infelizmente, o MT5 suporta apenas um dispositivo de GPU.

 
Aleksey Vyazmikin:

Infelizmente, o MT5 suporta apenas um dispositivo de GPU.

Vários dispositivos podem ser usados.

Cabe ao desenvolvedor decidir quais dispositivos usar e como usá-los.

 
Renat Fatkhullin:

Vários dispositivos podem ser usados.

O desenvolvedor decide quais dispositivos usar e como usá-los.

Se não me engano, você escreveu anteriormente que apenas um dispositivo pode ser usado por vez - escolher qual deles, sim, você pode, algo mudou?

Não estamos falando de agentes, pois, pelo que entendi, cada um pode usar um dispositivo, mas, novamente, não está claro como vincular um agente a um dispositivo específico...
 

Artigo muito interessante!

Infelizmente, sua solução não oferece 'otimização genética'.
Mas isso poderia ser facilmente adicionado, mesmo que exceda as opções e os benefícios do usuário em comparação com o MQ5. O Mq5 tem apenas uma opção - genética ou tudo ou lenta.

Tudo o que você precisa fazer
1) Criar uma tabela dos resultados com suas combinações de parâmetros,
2) classificá-los de acordo com os resultados,
3) dividir em, por exemplo 5 ou (n definido pelo usuário) seções,
4) selecionar aleatoriamente as combinações de parâmetros de cada seção,
5) alterar um valor para essas combinações de parâmetros selecionadas,
6) verificar se essa combinação já foi testada (depois voltar para 4)
7) testar.
8) Comece novamente em 1), a menos que um critério de interrupção tenha sido atingido.

Apenas uma combinação é selecionada da pior seção, duas da próxima melhor, depois três e assim por diante.
Assim, a densidade das otimizações é mais alta na melhor seção e, como todas as seções têm sempre o mesmo tamanho entre si (1/5 ou 1/n), os limites da seção se deslocam, resultando em um aumento adicional da densidade nos melhores resultados.

Você também pode permitir que o usuário determine: Outra combinação deve ser testada de seção para seção - ou seja, 1, 2, 3, 4, 5 na 5ª seção superior - ou duas - 1, 3, 5, 7, 9 - ou ainda mais para aumentar ainda mais a densidade na melhor seção?

Talvez você possa introduzir algo muito interessante e útil?
Se você fizer uma análise de cluster das combinações de parâmetros em cada seção da tabela, não poderá (apenas) selecionar as combinações aleatoriamente, mas seletivamente:
a) no meio entre os melhores valores de dois clusters - para explorar o vale entre eles
b) no meio entre duas combinações tão diferentes quanto possível de um mesmo cluster - para encontrar um novo melhor valor, um novo topo.
Isso provavelmente melhorará significativamente a qualidade dos resultados da otimização genética. Você teria que experimentar!

Análise de cluster

Artigo muito interessante!

Infelizmente, sua solução não oferece "otimização genética".
Mas você pode adicioná-la facilmente, mesmo que ela exceda os recursos e as vantagens do usuário em comparação com o MQ5. O Mq5 tem apenas uma opção, genética, completa ou lenta.

Tudo o que você precisa fazer é.
1) Criar uma tabela de resultados com suas combinações de parâmetros,
2) Classificá-los por resultados,
3) Dividi-los em, por exemplo, 5 ou (n definido pelo usuário) seções,
4) Em seguida, selecionar aleatoriamente as combinações de parâmetros de cada seção,
5) Alterar o valor dessas combinações de parâmetros selecionadas,
6) Verificar se essa combinação já foi testada (em seguida, voltar para 4)
7) Testar.
8) Reinicie a partir de 1) se o critério de abortar não for atingido.

Apenas uma combinação é selecionada da pior seção, duas combinações são selecionadas da melhor, depois três e assim por diante.
Portanto, a densidade de otimizações é mais alta na melhor seção e, como todas as seções têm sempre o mesmo tamanho entre si (1/5 ou 1/n), os limites da seção se deslocam, levando a um aumento adicional na densidade dos melhores resultados.

Além disso, o usuário também poderia determinar se outra combinação de seção para seção - ou seja, 1, 2, 3, 4, 5 na 5ª seção superior - ou duas - 1, 3, 5, 7, 9 - ou até mais, seria testada para aumentar ainda mais a densidade na melhor seção.

Talvez você possa apresentar algo muito interessante e útil?
Se você também fizer uma análise de cluster das combinações de parâmetros em cada seção da tabela, poderá não apenas (apenas) escolher combinações aleatoriamente, mas também especificamente:
a) no meio do caminho entre os melhores valores de dois clusters - compreender o vale entre eles
b) no meio do caminho entre duas combinações maximamente diferentes do mesmo cluster - encontrar um novo melhor valor, um novo topo.
Isso provavelmente melhoraria significativamente a Você terá que tentar!

Análise de cluster


PS: Além da minha proposta, você gostaria de acrescentar que também poderia desenvolver uma apresentação dos resultados na forma de clusters?
O Strategy Tester sempre mostra apenas os resultados de todo o intervalo de uma variável; seria muito mais informativo se fosse possível ver, por exemplo, três clusters e, para cada cluster, o respectivo melhor valor (quanto maior, melhor), sua dispersão (quanto maior, melhor) e as estatísticas dos parâmetros individuais (máximo, mínimo, médio, desvio padrão (quanto maior, melhor). Isso facilita a visualização de onde as combinações de parâmetros mais robustas provavelmente estarão e onde os melhores valores mais aleatórios poderão estar.

PS: Além da minha sugestão, você poderia acrescentar que também poderia desenvolver uma apresentação dos resultados na forma de clusters?
O Strategy Tester sempre mostra apenas os resultados de toda a gama de variáveis, mas seria muito mais informativo se você pudesse ver, por exemplo, três clusters e, para cada cluster, o melhor valor (quanto maior, melhor), sua variação (quanto maior, melhor) e as estatísticas dos parâmetros individuais (máximo, mínimo, média, desvio padrão (quanto maior, melhor). Isso facilita encontrar as combinações mais confiáveis de parâmetros e os melhores valores aleatórios.


PPS: por acaso, encontrei este artigo: "Optimizing OpenCL Kernels
for Iterative Statistical Applications on GPUs"
que se encaixaria na minha sugestão :)

Por acaso, encontrei este artigo: "Otimização de kernels de OpenCL
para aplicativos estatísticos iterativos em GPUs"
que se encaixaria na minha sugestão :).



Cluster analysis - Wikipedia
Cluster analysis - Wikipedia
  • en.wikipedia.org
Cluster analysis itself is not one specific algorithm, but the general task to be solved. It can be achieved by various algorithms that differ significantly in their understanding of what constitutes a cluster and how to efficiently find them. Popular notions of clusters include groups with small distances between cluster members, dense areas...
 

Great article!!!

Congratulations, @decanium !

Serhii Shevchuk
Serhii Shevchuk
  • www.mql5.com
Produto publicado This is a convenient tool for measuring the number of points between prices. It support magnetizing to OHLC prices. Calculates profit considering specified lot size and spread (optionally). It counts the number of bars between specified point and the time difference between them. Calculates the slope angle from the...