Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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".
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.
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.
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:
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?
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?