Discussão do artigo "Usando OpenCL para testar padrões de candles"

 

Novo artigo Usando OpenCL para testar padrões de candles foi publicado:

Neste artigo, estudaremos um algoritmo para criar um testador de modelos de candles, em linguagem OpenCL, no modo "OHLC em M1". Além disso, compararemos sua velocidade com a do testador de estratégia embutido, no modo de otimização rápida e lenta.

Para garantir que a implementação do testador em OpenCL funcione corretamente, é preciso apoiar-se em algo. Por isso, primeiro escreveremos um EA em MQL5, compararemos seus resultados de teste e de otimização - de um testador regular - com os de um testador criado em OpenCL.

O objeto do teste será um EA simples operando com os seguintes modelos de candles (que doravante chamaremos de padrões).
  • Pinbar de baixa
  • Pinbar de alta
  • Engolfamento de baixa
  • Engolfamento de alta

A estratégia será simples:

  • Pinbar de baixa ou pinbar de alta — venda
  • Pinbar de alta ou pinbar de baixa — compra
  • Número de posições abertas — ilimitado
  • Tempo máximo de bloqueio da posição aberta — limitado, definido pelo usuário
  • Níveis de Take Profit e Stop Loss são fixos, e definidos pelo usuário.

A presença do padrão será verificada em barras totalmente fechadas. Em outras palavras, quando surge uma nova barra, procuraremos um padrão nas três anteriores.

As condições para encontrar o padrão serão as seguintes:

Pinbar

Autor: Serhii Shevchuk

 

Autor, obrigado pelo artigo! Acho que você escolheu esse TC específico para demonstração por um motivo, pois ele faz um paralelo perfeito. Entretanto, esse é um nicho muito restrito.

No artigo, você se distanciou bastante da universalidade em direção à particularidade. Está claro que o objetivo é demonstrar as possibilidades potenciais. Mas há pouco para aplicá-las às suas próprias necessidades.

Eu gostaria de ver exemplos de tradução de diferentes códigos MQL em códigos OpenCL. Talvez isso esteja contido nos artigos vinculados no início do seu artigo.

 
Os símbolos personalizados podem ajudar a eliminar as trocas e as comissões ao comparar os resultados dos testadores.
 
O arquivo OCLDefines.mqh está faltando apenas para mim? :-)
 
Denis Kirichenko:
O arquivo OCLDefines.mqh está faltando apenas para mim? :-)

Obrigado por sua atenção. Vamos corrigi-lo, mas entendo que já a partir de segunda-feira. Aqui está o código-fonte:

//+------------------------------------------------------------------+
//| define|
//+------------------------------------------------------------------+
//--- configurando um erro de tempo de execução
#define  SET_ERR(c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- definir um erro de tempo de execução passando o nome da função e o número da linha por meio do parâmetro
#define  SET_ERRx(c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- configurando um erro do usuário
#define  SET_UERR(err,c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- definir um erro de usuário passando o nome da função e o número da linha por meio do parâmetro
#define  SET_UERRx(err,c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- chamadas de função para trabalhar com OpenCL
#define _BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags) \
      if(BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferCreate(buffer_index,size_in_bytes,flags) \
      if(BufferCreate(buffer_index,size_in_bytes,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _Execute(kernel_index,work_dim,work_offset,work_size) \
      if(Execute(kernel_index,work_dim,work_offset,work_size,__FUNCTION__,__LINE__)==false) return false
#define _SetArgument(kernel_index,arg_index,value) \
      if(SetArgument(kernel_index,arg_index,value,__FUNCTION__,__LINE__)==false) return false
#define _SetArgumentBuffer(kernel_index,arg_index,buffer_index) \
      if(SetArgumentBuffer(kernel_index,arg_index,buffer_index,__FUNCTION__,__LINE__)==false) return false
#define _KernelCreate(k,src) \
      if(KernelCreate(k,src,__FUNCTION__,__LINE__)==false) break

//--- Erros do usuário 
#define  UERR_NONE                0     // Nenhum erro
#define  UERR_NO_OCL              1     // O objeto COpenCL não existe
#define  UERR_GET_MEMORY_SIZE     2     // Erro ao obter o tamanho da memória
#define  UERR_KERNEL_CREATE       3     // Erro ao criar um kernel
#define  UERR_SET_BUF_COUNT       4     // Erro ao definir o número de buffers
#define  UERR_DOUBLE_NOT_SUPP     5     // Não suportado por double
#define  UERR_BUFFER_CREATE       6     // Erro de criação de buffer
#define  UERR_BUFFER_FROM_ARRAY   7     // Erro ao criar um buffer a partir de uma matriz
#define  UERR_BUFFER_READ         8     // Erro de leitura de buffer
#define  UERR_BUFFER_WRITE        9     // Erro de gravação no buffer
#define  UERR_SET_ARGUMENT        10    // Erro na configuração do argumento
#define  UERR_SET_ARGUMENT_BUFFER 11    // Erro ao definir o buffer como argumento
#define  UERR_EXECUTE             12    // Erro de execução do kernel
#define  UERR_NO_ENOUGH_MEM       13    // Não há memória livre

//--- Erros do testador
#define  UERR_TESTER_ERROR_FIRST  256
#define  SET_UERRt(err,c)         SET_UERR(UERR_TESTER_ERROR_FIRST+err,c)
//+------------------------------------------------------------------+
 
fxsaber:
Os símbolos personalizados podem ajudar a eliminar as trocas e as comissões ao comparar os resultados dos testadores.

Sim, mas isso está ainda mais distante do mundo real. A menos que seja para depuração.

 
O artigo é realmente impressionante. É uma pena que esse seja o caso quando não se quer comparar a quantidade de gasto mental e o resultado útil.
 

Parabéns, você escreveu um ótimo artigo!

O código do artigo será citado e você elevou muito o nível para seus colegas que escreverão artigos sobre computação paralela em negociação.

 
fxsaber:

No artigo, você se afastou bastante do universal para o particular.

Isso é apenas o começo. A universalidade está à frente. A mensagem oculta do artigo é que nem tudo é tão simples. Você não pode simplesmente converter código serial em código paralelo. Você precisa escrever em paralelo desde o início.

Se a comunidade estiver interessada, publicarei meus próximos desenvolvimentos nesse sentido.

[Excluído]  
Serhii Shevchuk:

Isso é apenas o começo. A versatilidade está à frente. A mensagem oculta do artigo é que nem tudo é tão simples. Você não pode simplesmente converter código serial em código paralelo. Você precisa escrever código paralelo desde o início.

Se a comunidade estiver interessada, publicarei meus futuros desenvolvimentos nesse sentido.

a comunidade está muito interessada, "Afftar fishi ischo!!!1111".

um tópico muito importante em termos de aceleração de otimização/testes, especialmente para algoritmos de aprendizado de máquina

 

Artigo muito útil!

É claro que eu gostaria de ver mais exemplos simples de tradução de código MQL comum em código OpenCL, na forma de funções prontas com comentários para os iniciantes.

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