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.
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) //+------------------------------------------------------------------+
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.
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.
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.
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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).A estratégia será simples:
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:
Autor: Serhii Shevchuk