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

 

Artigo muito interessante. O principal benefício é ver um exemplo real de código OpenCL em ação. É muito útil ter esses exemplos quando você começa a usar o OpenCL. Obrigado.

No entanto, embora a comparação confirme o grande ganho esperado com o uso de GPUs, trata-se de uma estratégia muito específica, em que não há relação alguma entre as negociações. Provavelmente, é raro ver essa estratégia em negociações reais. Receio que, quando você começar a introduzir uma relação entre as negociações (um máximo de negociações abertas, apenas uma negociação por vez, aumento ou diminuição do lote após um vencedor/perdedor, etc.), a complexidade do código OpenCL fará com que você perca rapidamente os benefícios do ganho de velocidade. (Não tentei fazer isso pessoalmente, então posso estar errado).

O menos importante é que, para uma comparação adequada, o algoritmo "virtual" usado com GPUs também deve ser usado sem elas, o que permitiria medir o ganho líquido devido às GPUs. Como na abordagem do artigo, você não está apenas comparando CPU com GPU (serial com paralelo), mas também o"Strategy Tester" com o "virtual".

 
Olá,
O OpenCL ainda existe, pois dizem que a AMD parece não oferecer mais suporte a ele?

Há alguma solução alternativa, é necessário usar o Linux ou há algum outro método de agendamento de GPU para computação paralela que seja de fácil acesso?

Meus cumprimentos
 

Boa tarde.

Você pode me dizer uma maneira aproximada de conseguir a abertura de apenas uma transação por vez para comprar e também apenas uma para vender em seu código.

 
Sergey Seriy:

Boa tarde.

Você pode me dizer uma maneira aproximada de conseguir a abertura de apenas uma transação por vez para comprar e também apenas uma para vender em seu código.

Primeiramente, no kernel tester_step, você precisa adicionar mais um argumento que lhe permitirá obter o tempo de fechamento da transação (pode ser o índice da barra M1, onde a transação foi fechada, ou o tempo de manutenção da posição, expresso no número de barras M1) com indexação, como no buffer de resultados __global double *Res.

A seguir, dependendo de sua pergunta estar relacionada a um único teste ou à otimização:

1. teste. No loop em que o lucro total é resumido, você precisa adicionar condições que excluirão a sobreposição de posições abertas usando horários de fechamento (que serão retornados pelo tester_step finalizado).

2. otimização. Aqui, em vez do kernel find_patterns_opt, que resume os lucros, precisamos usar find_patterns, que simplesmente retornará os pontos de entrada. Levando em conta as condições de inadmissibilidade de abrir mais de uma negociação por vez, teremos de resumir o lucro no código mql5. No entanto, isso pode levar algum tempo (você deve tentar), porque, nesse caso, o que foi executado em paralelo será executado sequencialmente (o número de passagens de otimização é multiplicado pela profundidade da otimização). Outra opção de compromisso possível é adicionar um kernel que contará o lucro para uma passagem (levando em conta a condição do número de posições abertas simultaneamente), mas, com base em minha própria prática, posso dizer que é uma má ideia executar kernels "pesados". O ideal é se esforçar para manter o código do kernel o mais simples possível e executar o maior número possível deles.

 
Serhii Shevchuk:

Em primeiro lugar, no núcleo tester_step, precisamos adicionar mais um argumento que nos permitirá obter o tempo de fechamento de uma negociação (pode ser o índice da barra M1, onde a negociação foi fechada, ou o tempo de manutenção de uma posição expresso no número de barras de M1) com indexação, como no buffer de resultados __global double *Res.

Além disso, dependendo do fato de sua pergunta se referir a um único teste ou à otimização:

1. teste. No loop em que o lucro total é resumido, você precisa adicionar condições que excluirão a sobreposição de posições abertas usando os horários de fechamento (que serão retornados pelo tester_step finalizado).

2. otimização. Aqui, em vez do kernel find_patterns_opt, que resume os lucros, precisamos usar find_patterns, que simplesmente retornará os pontos de entrada. Levando em conta as condições de inadmissibilidade de abrir mais de uma negociação por vez, teremos de resumir o lucro no código mql5. No entanto, isso pode levar algum tempo (você deve tentar), porque, nesse caso, o que foi executado em paralelo será executado sequencialmente (o número de passagens de otimização é multiplicado pela profundidade da otimização). Outra opção de compromisso possível é adicionar um kernel que contará o lucro para uma passagem (levando em conta a condição do número de posições abertas simultaneamente), mas, com base em minha própria prática, posso dizer que é uma má ideia executar kernels "pesados". O ideal é se esforçar para manter o código do kernel o mais simples possível e executar o maior número possível deles.

Boa tarde.

Obrigado por sua resposta rápida. Eu estava interessado, em primeiro lugar, na resposta sobre otimização, como a ideia de aplicar o código na prática, a propósito, pensei que parcialmente eu teria que escrever no código mql. Muito obrigado pelo artigo, pois não há nada parecido com ele! Além disso, se modificarmos um pouco o tester_step (e o tester_step_opt), adicionando à condição de tempo p>open to buy (ou seja if(j>=maxbar || (TimeM1[j]>=tclose && p>open)) e para vender if(j>=maxbar || (TimeM1[j]>=tclose && p<open))), você terá uma estratégia para negociação de opções.

 

...Também acrescentarei algumas palavras ao meu comentário anterior sobre a estratégia de opções. Aqui, precisamos adicionar a variável Option Expiration Time (ao mesmo tempo, StopLoss e TakeProfit não são necessários para opções durante a otimização), portanto, modificamos o código em tester_opt_step da seguinte forma:

ulong tcloseDEATH=TimeM1[iO]+240*60*60;//adicionar variável de tempo de expiração, например 240 часов (т.е. 10 дней)



//...comentar mais sobre TP e SL, pois eles não são necessários para opções

/*if(p<=sl)
 {
 Res[idx]=sl-open;
 return;
 }
 else if(p>=tp)
 {
 Res[idx]=tp-open;
 return;
 }*/
// e adicione uma verificação do tempo de expiração (na expiração do VE, deve haver uma grande PERDA porque a opção não foi bem-sucedida).
              if(TimeM1[j]>=tcloseDEATH)
              {
               Res[idx]=sl*10-open; //há um alce GRANDE! (для примера в 10 раз больше установленного при оптимизации стоп-лосса)
               return;
              }

 
Boa tarde. Ao executar a otimização do OpenCL para o USDRUB de acordo com seu artigo, encontrei esse problema - os resultados da otimização são sempre positivos, sempre um lucro, ou seja, parece que há um estouro para uma variável do tipo int, na qual o resultado é gerado, enquanto que para o EURUSD a otimização funciona corretamente. Talvez seja também uma questão de cinco dígitos para o USDRUB. Você pode me dizer como corrigir esse problema?
 
Sergey Seriy:
Boa tarde. Ao executar a otimização do OpenCL para o USDRUB de acordo com seu artigo, encontrei esse problema - os resultados da otimização são sempre positivos, sempre um lucro, ou seja, parece que há um estouro para uma variável do tipo int, na qual o resultado é gerado, enquanto que para o EURUSD a otimização funciona corretamente. Talvez seja também uma questão de cinco dígitos para o USDRUB. Você poderia me dizer como corrigir esse problema?
...também anexamos capturas de tela
Arquivos anexados:
 

No artigo, você escreveu:

В нашем случае функция atomic_inc()  для начала запрещает доступ другим задачам к ячейке Count[0], затем увеличивает её значение на единицу, а предыдущее возвращает в виде результата.

Pelo que entendi, essa função funciona somente com uma matriz do tipo int, mas se eu tiver uma matriz de um tipo diferente, por exemplo, ushort, o que devo fazer?