Multi Trading System.
Este sistema de negociação baseia-se na análise do castiçal de múltiplos pares de moedas ao mesmo tempo. A EA determina o melhor par de moedas entre vários pares para abrir um par no final da vela, e abre um comércio na direção necessária. Pode simultaneamente analisar até 10 pares de moedas. Pode funcionar 24/4 e não perderá um forte movimento em nenhum dos pares de moedas (se estiver habilitado nas configurações). É possível ajustar o número de pedidos abertos por vez, de modo que não faça muitos ou muito poucos negócios. A EA também apresenta a mudança da perda de parada para o ponto de equilíbrio. Os métodos de negociação arriscada não são usados aqui.
Recomendações para otimização: como esta é uma EA multi-moeda, não pode ser otimizada para múltiplos pares de moedas simultaneamente. Mas a otimização funciona no par selecionado (se a EA deveria abrir uma negociação em outro par de moedas, simplesmente não o abriria no testador, mas na negociação ao vivo abriria o comércio). Por isso, é necessário selecionar manualmente os pares de moedas (adicionados à lista) um a um e testar as configurações separadamente. Ou troque apenas o par de moedas atuais durante a negociação ao vivo (desative a opção 'Opção de negociação múltipla').
Criando um conselheiro especialista multi-moeda Multi-System.
Introdução.
Eu acredito que há alguns comerciantes que comercializam mais de um símbolo comercial e usam estratégias múltiplas. Esta abordagem não só permite que você potencialmente aumente seu lucro, mas também minimize o risco de redução substancial em relação ao gerenciamento eficiente de dinheiro. Ao criar um Expert Advisor, o primeiro passo natural na verificação da eficiência da estratégia do programa é a otimização para determinar os melhores parâmetros de entrada.
Com os valores dos parâmetros identificados, os Consultores Especialistas estarão tecnicamente prontos para negociação. No entanto, isso deixaria uma questão importante sem resposta. O que os resultados dos testes seriam como se um comerciante pudesse juntar todas as suas estratégias em um único Consultor Especializado? A percepção de que o levantamento de vários símbolos ou estratégias pode, em algum momento, se sobrepor e resultar em uma redução horrível total ou mesmo uma chamada de margem pode às vezes ser uma surpresa desagradável.
Este artigo introduz um conceito de criação de um consultor especialista multi-sistema multi-sistema que nos permitirá encontrar uma resposta a esta importante questão.
1. Estrutura do consultor especialista.
Em termos gerais, a estrutura do Expert Advisor é a seguinte:
Fig. 1. Estrutura do consultor especialista multi-sistema multi-moeda.
Como você pode ver, o programa é baseado em um loop for. Cada estratégia é organizada em um loop em que cada iteração é responsável por negociar cada símbolo separadamente. Aqui, você pode organizar em linhas um número ilimitado de estratégias. Importante é que seu computador tenha recursos suficientes para "processar" esse programa.
Você deve ter em mente que só pode haver uma posição para cada símbolo negociado no MetaTrader 5. Essa posição representa a soma de lotes de Compra e Venda previamente executadas. Portanto, o resultado do teste multi-estratégia para um símbolo não será idêntico à soma de resultados de teste separados das mesmas estratégias para o mesmo símbolo.
Para uma consideração mais detalhada da estrutura do Consultor Especial, tomaremos 2 estratégias, cada uma das quais comercializa dois símbolos:
Comprar: o preço da oferta atinge a faixa mais baixa do indicador Bollinger Bands calculado com base no preço baixo.
Fechamento: o preço da oferta atinge a faixa mais baixa do indicador Bollinger Bands calculado com base no preço alto. Vender: O preço da oferta atinge a faixa superior do indicador Bollinger Bands calculado com base no preço alto.
Fechamento: o preço de oferta atinge a faixa superior do indicador Bollinger Bands calculado com base no preço baixo. Restrição: apenas um acordo pode ser executado em qualquer barra.
Comprar: o bar anterior é de baixa (fechar e lt; aberto) e o preço de Ask atinge a alta do bar anterior.
Fechar: por Stop Loss ou Take Profit. Vender: o bar anterior é otimista (fechar e gt; aberto) e o preço da compra atinge a baixa do bar anterior.
Fechar: por Stop Loss ou Take Profit. Restrição: apenas um acordo pode ser executado em qualquer barra.
Para ser independente dos novos tiques para um símbolo em que o Consultor Especialista será testado ou que irá trocar, é aconselhável usar a função OnTimer () para negociação em modo multi-moeda.
Para este propósito, ao inicializar o Expert Advisor, especificamos a freqüência de geração de um evento para a chamada de cálculo do programa usando a função EventSetTimer () e, após a desinitialização, usamos a função EventKillTimer () para indicar ao terminal que interrompa a geração de eventos:
Em vez de EventSetTimer (), você também pode usar EventSetMillisecondTimer (), onde a freqüência é definida com precisão em milissegundos, mas você não deve usá-lo por meio de chamadas de cálculo de programa muito frequentes.
Para acessar as configurações de conta, posição e símbolo, bem como as funções de negociação, usaremos as classes CAccountInfo, CPositionInfo, CSymbolInfo e CTrade, respectivamente. Vamos incluí-los no Expert Advisor:
Como o Expert Advisor é baseado em loops, precisaremos criar arrays para seus parâmetros externos. Vamos primeiro criar constantes iguais ao número de símbolos para cada estratégia:
Em seguida, criamos parâmetros externos. Usando constantes, determinamos tamanhos de arrays para os quais serão copiados. Além disso, criamos alças de indicadores e outras variáveis globais.
Um exemplo para um símbolo de estratégia А é fornecido abaixo:
Para ter a possibilidade de desativar a negociação de um certo símbolo, criamos uma variável booleana IsTrade_A0 que será colocada no início dos loops.
2. Inicialização do Consultor Especialista.
Primeiro, vamos obter os valores necessários para todas as estratégias, p. alavancagem. Uma vez que a alavancagem é aplicada à conta de negociação e não tem nada a ver com uma estratégia ou um símbolo, não é necessário copiar seu valor para os arrays:
Em seguida, copiamos variáveis externas para arrays.
Se qualquer parâmetro externo for definido pelo tipo que exigirá a conversão para outro, isso pode ser feito de maneira mais conveniente ao copiar para arrays.
Nesse caso, podemos ver que BBPeriod_A0 foi criado como uint para evitar que o usuário estabeleça um valor negativo. Aqui, nós o convertemos em int e copiamos para a matriz que também foi criada como int. Caso contrário, o compilador dará um aviso se você tentar inserir o parâmetro do tipo uint no identificador do indicador.
Vamos ver ainda se o símbolo negociado está disponível no Market Watch e se ele já foi usado mais de uma vez dentro de uma estratégia:
Se os símbolos foram selecionados corretamente, verifique se há erros nos parâmetros de entrada para cada um deles, crie alças de indicadores, obtenha os dados necessários para o cálculo do lote e, se necessário, faça outras coisas como definidas pela estratégia dada.
Implementaremos as ações acima mencionadas dentro de um loop for.
Em seguida, estabelecemos os parâmetros para as operações de negociação da estratégia A usando o objeto Trade_A da classe CTrade.
O mesmo procedimento é repetido para cada estratégia, ou seja,
Copie variáveis externas para arrays;
Finalmente, seria bom verificar se um e o mesmo símbolo são usados em várias estratégias (um exemplo para duas estratégias é fornecido abaixo):
3. Trading "For" Loops.
A estrutura de loops dentro da função OnTimer () é a seguinte:
Se um Conselheiro Especialista em símbolo único com base em uma única estratégia tem uma condição em que todos os cálculos subseqüentes precisam ser interrompidos, usamos o operador de retorno. No nosso caso, precisamos terminar a iteração atual e proceder à próxima iteração do símbolo. Para este fim, é melhor usar o operador continuar.
Se você quiser aprimorar seu Expert Advisor multi-estratégia, adicionando uma estratégia com um loop for que contém uma condição para o encerramento de todos os cálculos subseqüentes, você pode usar o seguinte padrão:
Depois de criar a estrutura dos loops, nós simplesmente inserimos nos códigos de outros EAs e, em seguida, substituímos algumas variáveis por elementos de matriz.
Por exemplo, alteramos a variável predefinida _Symbol para Symbol_A [i] ou _Point para Point_A [i]. Os valores dessas variáveis são típicos do símbolo dado e, portanto, foram copiados para arrays após a inicialização.
Por exemplo, vamos encontrar o valor do indicador:
Para implementar o fechamento de uma posição de compra, escreveremos o seguinte código:
Abertura de uma posição de compra:
Lembre-se de encerrar a geração do evento do temporizador e apagar os alças do indicador na desinitialização.
4. Resultados do teste.
Quando o Consultor Especialista está pronto, testamos cada estratégia e cada símbolo separadamente e comparamos os resultados do teste com os obtidos no modo de teste ao negociar todas as estratégias e símbolos simultaneamente.
Assume-se que o usuário já identificou os valores ótimos dos parâmetros de entrada.
Abaixo estão as configurações do Strategy Tester:
Fig. 2. Configurações do testador de estratégia.
Resultados da estratégia A, EURUSD:
Fig. 3. Resultados do teste para a estratégia A, EURUSD.
Resultados da estratégia A, GBPUSD:
Fig. 4. Resultados do teste para a estratégia A, GBPUSD.
Resultados da estratégia B, AUDUSD:
Fig. 5. Resultados do teste para a estratégia В, AUDUSD.
Resultados da estratégia B, EURJPY:
Fig. 6. Resultados do teste para a estratégia В, EURJPY.
Resultados de teste para todas as estratégias e símbolos:
Fig. 7. Resultados do teste para todas as estratégias e símbolos.
Conclusão.
Como resultado, temos uma estrutura conveniente e simples do consultor especialista multi-sistema multi-currency em que você pode colocar praticamente qualquer uma das suas estratégias.
Esse consultor especialista permite que você avalie melhor a eficiência da negociação usando todas as suas estratégias. Também pode ser útil no caso de apenas um consultor especialista poder trabalhar em uma determinada conta. O código-fonte do Consultor Especial é anexado ao artigo para facilitar o estudo das informações acima.
Traduzido do russo pela MetaQuotes Software Corp.
Multi-Moedas Pairs Martingale System.
Isso é EA usando a estratégia de martingale e de média.
Esta estratégia é de baixo risco e alta rentabilidade do que a martingal normal.
Fraqueza de Martingale é que os lotes de pedidos aumentam a um ritmo acelerado, mas também reduz o lucro se o primeiro lote for pequeno.
Portanto, para alcançar baixo risco e alta rentabilidade, negociando muitos pares de moedas em paralelo, enquanto pequeno primeiro lote.
Como usar.
Esta EA não funciona com as configurações padrão.
Você pode trocar apenas os símbolos especificados na segunda captura de tela (não é possível trocar um par de moedas diferentes no testador de estratégia).
Ao fazer isso, você pode trocar vários pares de moedas em uma única janela de gráfico.
Expectativa matemática na negociação Forex Multicurrency.
Alguns comerciantes de divisas usam a mesma estratégia de negociação para todas as moedas, enquanto outros usam estratégias inteiramente diferentes dependendo dos pares de moedas que estão sendo negociados. Ou, os comerciantes podem usar múltiplas estratégias com vários pares de divisas, para aumentar os lucros, reduzindo o risco de redução resultante de excesso de concentração em uma única estratégia.
Os assessores especializados (EA) permitem otimizar os parâmetros de entrada, mas eles não tornam mais fácil juntar estratégias separadas em um único sistema. E, o teste pode mostrar um risco aumentado de remoções sobrepostas ou correlacionadas quando diferentes estratégias forex são combinadas.
Usando algoritmos, um sistema comercial pode verificar pares de moedas e executar operações específicas de acordo com os parâmetros de entrada. Uma multi-moeda, EA multi-sistema pode ser criada para avaliar todas as estratégias comerciais lado a lado. Isso pode ser útil no caso de uma única EA ter permissão para acessar uma determinada conta.
Pode ser um desafio desenvolver um sistema de comércio forex que funcione bem em diferentes pares de moedas sob uma variedade de condições. A maioria dos sistemas amplamente conhecidos para negociação multi-moeda baseiam-se em estratégias de tendência, como as fugas do canal Donchian, e são projetadas para lucrar com tendências a muito longo prazo. No entanto, uma estratégia de múltiplas moedas deve mostrar claramente uma "vantagem" vencedora sobre os horizontes de horário típicos para os comerciantes de forex.
Por exemplo, para que um sistema funcione bem com EUR / USD e USD / JPY, os sinais devem ter uma alta probabilidade de sucesso, apesar da volatilidade e correção potencial entre os dois pares. E, os negócios devem se tornar vencedores durante períodos de tempo razoavelmente curtos. Caso contrário, a negociação de pares correlacionados pode criar um risco de excesso de concentração e redução excessiva.
Existem muitas oportunidades lucrativas na negociação dos quatro principais pares de moedas e # 8212; EUR / USD, GBP / USD, USD / JPY e USD / CHF. Tenho desfrutado de um bom sucesso usando uma estratégia baseada na Expectativa Matemática (ME). Use-me para analisar dados e detectar oportunidades comerciais abrangentes e calcular pontos de entrada / saída para negociar os quatro principais pares de moedas.
A expectativa matemática prevê a probabilidade de um comércio forex ganhar.
Uma EA bem programada pode usar as ferramentas ME para ajudar a construir sistemas que funcionam em vários pares de moedas. Ajudei a desenvolver um par de sistemas que funcionam em tempo real e mostram rentabilidade a longo prazo através de back-testing.
Recentemente, os comerciantes tornaram-se mais conscientes das desvantagens que surgem ao usar técnicas de mineração de dados para testar e testar estratégias para sistemas de negociação forex. Métodos alternativos de desenvolvimento de sistemas como System Parameter Permutation (SPP) estão agora disponíveis e podem ajudar os comerciantes a evitar a questão do viés de mineração de dados.
Se for feito com cuidado, SPP ou mineração de dados ajudará a construir um conjunto de indicadores de boa qualidade para gerar sinais nos quatro principais pares de moedas. Então, o consultor especialista calcula a expectativa matemática para ver se o comércio provavelmente será lucrativo ou não.
Finalmente, é uma questão de especificar filtros e testes para encontrar estratégias precisas que consistentemente resultem em sinais lucrativos e lucrativos. Os pontos de entrada e saída são calculados pelo sistema de negociação mecânica usando a expectativa matemática ajustada pela volatilidade atual.
Calculando a expectativa matemática de sucesso.
Expectativa Matemática (ME) é uma estatística que mede o maior lucro temporário que um comércio experimentou durante todo o tempo que permaneceu aberto. Foi popularizado pela primeira vez sob as regras de posicionamento e gerenciamento de dinheiro Optimal-F desenvolvidas por Ralph Vince. A equação é:
Expectativa matemática = MFE - MAE.
A ferramenta de expectativa matemática oferece aos comerciantes de Forex de várias moedas uma "vantagem" preditiva no desenvolvimento de sistemas vencedores. ME é definido de acordo com os conceitos de Excursão Favorável Máxima (MFE) e Excursão Adversa Máxima (MAE). O valor de ME pode ser calculado em tempo real pelo sistema de negociação mecânica.
A excursão favorável máxima é o maior saldo em um comércio favorável antes que um comércio forex seja fechado, independentemente do preço de fechamento final durante o período, seja diariamente, por hora ou minuciosamente. O MFE é o maior saldo positivo alcançado enquanto o comércio estava aberto.
A Excursão adversa máxima é a maior perda não realizada ou temporária durante uma negociação, independentemente de o comércio ter sido fechado como um perdedor ou não. MAE é o menor saldo negativo no comércio enquanto estava aberto.
Para quantificar e analisar o ME de um determinado par forex, os comerciantes podem simplesmente calcular MFE médio e MAE médio para um grande número de trades passados. A expectativa matemática é igual a Excursão favorável máxima menos Excursão adversa máxima.
Se o MFE médio for maior que o MAE médio, a expectativa matemática é positiva. Quanto maior a relação entre MFE e MAE para um determinado par de moedas, mais favorável é a perspectiva de um comércio potencial.
Estratégias de negociação forex Multicurrency com base na Expectativa Matemática.
Ao negociar EUR / USD, GBP / USD, USD / JPY e USD / CHF com uma estratégia de várias moedas com base na Expectativa Matemática, esta métrica geralmente é positiva e geralmente alta, e similar entre os vários pares de moedas.
É importante evitar avaliar o tamanho da posição, ou regras de saída de comércio ou qualquer outro parâmetro enquanto o consultor especialista analisa os pontos de entrada. Esses parâmetros podem ser definidos de forma independente pelo sistema de negociação mecânica baseado em ME ajustado para a volatilidade, conforme discutido mais adiante neste artigo.
Depois de determinar o ponto de entrada e a direção do comércio, o sistema de negociação mecânica calcula os valores de MFE e MAE geralmente em primeiro lugar a 10 bar além do preço de entrada, depois 15 barras além, depois 20 barras além do preço de entrada.
Além de sinalizar pontos de entrada, o ME também mostra se a vantagem do comércio forex é melhor depois de abrir a posição, ou em algum intervalo médio depois de estar na posição.
Minha estratégia de negociação de múltiplas moedas mais simples usa gráficos diários e depende de uma combinação de três regras baseadas em preços, e apenas alguns parâmetros que usam a expectativa matemática para prever o sucesso.
As regras para negócios longos e curtos são as seguintes:
Comércio longo (e fechar um curto comércio) quando:
Fechar & gt; Anterior Próximo.
Abrir & gt; Anterior Baixo.
Anterior Fechar & gt; Prior Close.
Comércio curto (e fechar um longo comércio) quando:
Fechar & lt; Anterior Próximo.
Abrir & lt; Anterior Alto.
Anterior Próximo & lt; Prior Close.
Esse sistema reverte o comércio quando o sinal muda. Então, se o sistema tiver uma posição "longa" aberta quando um sinal "curto" for recebido, o sistema fechará a posição longa e, em vez disso, ficará curto. Da mesma forma, se o sistema tiver um # & # 8220; curto & # 8221; posição quando um & # 8220; longo & # 8221; o nível é recebido, ele irá fechar o curto e ir imediatamente.
Outro parâmetro deste sistema é o disparador de parada-perda que é definido em um valor apenas um pouco mais do que o intervalo verdadeiro médio de quinze dias ou vinte dias (ATR). Esse valor é atualizado sempre que um novo sinal é recebido na mesma direção.
No entanto, se houver novos sinais na mesma direção, o meu sistema não adiciona novas posições, já que descobriu que as retiradas superam os lucros adicionais ao fazê-lo.
Finalmente, no que diz respeito ao tamanho da posição, o sistema aloca um máximo de 2% do patrimônio da conta para um único comércio de ME alto. Se houver múltiplos sinais em vários pares de moedas, os cálculos ME estão mostrando correlação entre os sinais, o tamanho total da posição não será mais de 2% do patrimônio.
Resultados de negociação.
Este sistema simples de negociação de divisas de múltiplas moedas mostrou resultados decentes na negociação real, e back-testing em um período de vinte anos mostra que teria obtido resultados lucrativos por pelo menos dezesseis dos vinte anos testados. Ele mostrou uma relação de recompensa a risco de cerca de 1,7 e porcentagem de vencedor em torno de 45%, enquanto o fator de lucro foi de quase 1,4.
Ainda assim, as reduções podem ser demoradas - a retirada mais longa observada em back-testing foi superior a 1000 dias. A proporção de lucro para retirada ao usar esta estratégia é semelhante à das ações de compra e retenção e, durante o teste de back-testing, a proporção foi de aproximadamente 0,35 com um retorno total de mais de 500% durante um período de vigência de vinte anos, teste.
Gerenciamento de risco para estratégias de negociação de múltiplas moedas usando ME.
Ao conhecer os valores médios de MFE e MAE, um comerciante de forex pode programar um sistema mecânico de múltiplas moedas para sair de uma negociação em um alvo de lucro ou ponto de stop-loss determinado pela adição de um número calculado de pips além dos valores de Excursão Favorável Máxima ou Excursão Máxima.
Em média, para ganhar ao longo do tempo, o sistema de negociação forex deve atingir o objetivo de lucro com mais freqüência do que toca o nível de saída stop-loss.
Por exemplo, se meu sistema estiver vendo um MAE médio de 35 pips e um MFE médio de 55 pips, há uma oportunidade negociável. O alvo de lucro pode ser projetado para 50 pips, que é 5 pips menor que MFE, e a saída stop-loss pode ser configurada em 30 pips, o que é 5 pips além do MAE.
No que diz respeito ao design do sistema, é importante programar o sistema de negociação para definir metas de lucro e pontos de parada de perda de acordo com a volatilidade em vez de definir um número fixo de pips.
A volatilidade ajuda a determinar os pontos de saída para o comércio de moedas múltiplas.
Como mencionado anteriormente, um sistema de negociação mecânica pode facilmente usar o Average True Range (ATR) como uma ferramenta dependente da volatilidade para calcular MAE e MFE para definir pontos de saída. O sistema determina o preço de entrada mais ou menos uma porcentagem do ATR que é viável de acordo com a análise ME. Para ter uma amostra suficientemente grande, geralmente configurei o ATR para calcular os 15 ou 20 intervalos de tempo anteriores.
Por exemplo, durante um mercado quando o EUR / USD está movendo uma média de cerca de 100 pips por dia, o sistema deve calcular pontos de lucro alvo e pontos de stop-loss com base na volatilidade atual e na análise de ME.
Então, se um comércio se mover em uma direção favorável para 55 pips, e se o ATR atual for 85 pips, o movimento não é relatado como 55 pips; Em vez disso, o MFE é relatado como 64,7% de ATR.
Ao longo do tempo, vi que o MFE para os quatro principais pares de moedas EUR / USD, GBP / USD, USD / JPY e USD / CHF parece flutuar em torno de um valor de MFE de cerca de 60% de ATR e MAE médio em torno de 40 % de ATR para a entrada típica após 15 períodos de tempo.
Para ajustar os resultados da negociação forex de acordo com a volatilidade, o sistema de negociação mecânica pode definir os objetivos de lucro e os pontos de parada em diferentes níveis. Por exemplo, o sistema pode definir o ponto de saída do objetivo de lucro em 55% do valor ATR longe do ponto de entrada, não no valor total de MFE de 60%.
E, a volatilidade pode exigir a definição dos pontos de saída stop-loss a 45% do valor ATR além do ponto de entrada, não em 40% da ATR. Ainda assim, é provável que este sistema atinja os níveis de lucro alvo com mais frequência do que os níveis de stop-loss, e os vencedores devem ser maiores, desde que os lucros alvo sejam maiores do que as perdas de paradas.
Para todas as negociações, o número calculado de pips para lucros-alvo e stop-loss sempre baseia-se na volatilidade apenas no momento da negociação, conforme reflete a ATR.
Quando surge um sinal, o sistema de negociação verifica o valor da ATR atual e, em seguida, calcula o número exato de pips para atingir o lucro alvo e os níveis de stop-loss.
Por exemplo, suponha que haja um sinal longo em EUR / USD, e o ATR atual seja de 100 pips. Assim, o ponto de lucro alvo será de 55 pips sobre o preço de entrada (55% do valor ATR). E, o stop-loss será de 45 pips sob o preço de entrada (45% da ATR).
Mais alguns pensamentos sobre Expectativa Matemática.
A expectativa matemática é geralmente menor para os negócios "curtos", e alguns comerciantes viram ME aumentar até dezesseis barras depois do aberto, depois decaem-se durante as elevações de preços em até oitenta barras após a abertura.
Para negociações "longas", o ME geralmente tem uma vida útil mais longa, com valores que podem aumentar rapidamente até o trigésimo período de tempo e, em seguida, continuam lentamente até cerca de 75 períodos de tempo. Usando este sistema, minha duração média do comércio é de cerca de 25 dias.
A melhor vantagem ao negociar EUR / USD, GBP / USD, USD / JPY e USD / CHF parece acumular cerca de 30 períodos de tempo. Se o movimento favorável continua em frente a esse ponto médio, então é provável que algum tipo de viés fundamental no mercado esteja prolongando o movimento.
Em resumo, esta estratégia básica de negociação forex de múltiplas moedas aproveita um ME positivo e alto compartilhado entre os quatro principais pares de moedas. As entradas, metas de lucro e pontos de stop-loss são todos baseados em ME.
Quando os indicadores de expectativa matemática estão prevendo sucesso, os quatro principais pares de moedas e # 8212; EUR / USD, GBP / USD, USD / JPY e USD / CHF - podem ser negociados com sucesso juntos ou separadamente.
QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 22 de abril de 2018.
Ontem, eu publiquei algumas mudanças importantes para o software QSForex. Essas mudanças aumentaram a utilidade do sistema significativamente até o ponto em que está quase pronto para back-test de dados de tiques de vários dias em uma variedade de pares de moedas.
As seguintes alterações foram postadas no Github:
Mais modificações nos objetos de Posição e Portfolio, a fim de permitir a negociação de múltiplos pares de moedas, bem como moedas que não estão denominadas na moeda da conta. Por isso, uma conta de decomposição em GBP agora pode negociar EUR / USD, por exemplo. Revisão completa da forma como a Posição e o Portfolio calculam abre, fecha, adições e remoções de unidades. O objeto Posição agora executa o "levantamento pesado", deixando um objeto de Carteira relativamente magra. Adição da primeira estratégia não trivial, ou seja, a estratégia de Crossover de média móvel bem conhecida com um par de médias móveis simples (SMA). Modificação para backtest. py para torná-lo de um único thread e determinista. Apesar do meu otimismo de que uma abordagem multi-threaded não fosse muito prejudicial para a precisão da simulação, achei difícil obter resultados de backtesting satisfatórios com uma abordagem multi-threaded. Introduziu um script de saída baseado em Matplotlib muito básico para visualizar a curva de equidade do portfólio. A geração da curva de equidade está em estágio inicial e ainda requer muito trabalho.
Como mencionei na entrada anterior, para aqueles que não estão familiarizados com a QSForex e estão chegando a esta série de diários forex pela primeira vez, sugiro fortemente ter uma leitura das seguintes entradas diárias para acelerar o software:
Bem como a página Github para QSForex:
Suporte de Moedas Múltiplas.
Uma característica que eu continuamente estava discutindo nessas entradas do diário é a capacidade de suportar múltiplos pares de moedas.
Nesta fase, agora modifiquei o software para permitir diferentes denominações de contas, já que anteriormente a GBP era a moeda codificada. Também é possível negociar outros pares de moedas, exceto aqueles que consistem em uma base ou uma cotação no iene japonês (JPY). O último é devido ao tamanho do tiquetaque caclulado nas moedas do JPY.
Para conseguir isso, modifiquei como o lucro é calculado quando as unidades são removidas ou a posição está fechada. Aqui está o snippet atual para calcular pips, no arquivo position. py:
Se fecharmos a posição para realizar um ganho ou perda, precisamos usar o seguinte snippet para close_position, também no arquivo position. py:
Em primeiro lugar, obtemos a oferta e pedimos preços tanto para o par de moedas quanto para o par de moedas "quote / home". Por exemplo, para uma conta denominada em GBP, onde estamos negociando EUR / USD, devemos obter preços para "USD / GBP", pois EUR é a moeda base e USD é a cotação.
Nesta fase, verificamos se a posição em si é uma posição longa ou curta e, em seguida, calcula o "preço de remoção" apropriado e cite / home "remove price", que são fornecidos por remove_price e qh_close, respectivamente.
Em seguida, atualizamos os preços atuais e médios dentro da posição e, finalmente, calculamos o P & amp; L, multiplicando os pips, o preço de remoção / home e, em seguida, o número de unidades que estamos encerrando.
Eliminamos completamente a necessidade de discutir "exposição", que era uma variável redundante. Esta fórmula fornece corretamente o P & amp; L contra qualquer troca de par de moedas (não denominadas em JPY).
Revisão de Manejo de Posição e Carteira.
Além da capacidade de trocar vários pares de moedas, também aperfeiçoei como a Posição e a Carteira "compartilham" a responsabilidade de abrir e fechar posições, bem como adicionar e subtrair unidades.
Em particular, mudei muito do código de tratamento de posição que estava em portfolio. py em position. py. Isso é mais natural, pois a posição deve ser cuidar de si mesma e não delegá-la ao portfólio!
Em particular, os métodos add_units, remove_units e close_position foram criados ou aprimorados:
Nos últimos dois, você pode ver como a nova fórmula para o cálculo do lucro é implementada.
Muitas das funcionalidades da classe Portfolio foram assim reduzidas. Em particular, os métodos add_new_position, add_position_units, remove_position_units e close_position foram modificados para ter em conta o fato de que o trabalho de cálculo está sendo feito no objeto Position:
Em essência, todos eles (além de add_new_position) simplesmente verificam se a posição existe para esse par de moedas e, em seguida, chame o método de Posição correspondente, tendo em conta o lucro, se necessário.
Estratégia de Crossover Média em Movimento.
Nós discutimos a estratégia de Crossover de média móvel antes do QuantStart, no contexto da negociação de ações. É uma estratégia de indicador de cama de teste muito útil porque é fácil replicar os cálculos manualmente (pelo menos em freqüências mais baixas!), Para verificar se o backtester está se comportando como deveria.
A idéia básica da estratégia é a seguinte:
São criados dois filtros de média móvel simples separados, com diferentes períodos de lookback, de uma série temporal específica. Os sinais para comprar o recurso ocorrem quando a média móvel de lookback mais curta excede a média móvel de lookback mais longa. Se a média mais longa exceder a média mais curta, o ativo é vendido de volta.
A estratégia funciona bem quando uma série temporal entra em um período de forte tendência e, em seguida, inverte lentamente a tendência.
A implementação é direta. Em primeiro lugar, fornecemos um método calc_rolling_sma que nos permite utilizar de forma mais eficiente o cálculo de SMA do período de tempo anterior para gerar o novo, sem precisar recalcular completamente o SMA em cada etapa.
Em segundo lugar, geramos sinais em dois casos. No primeiro caso, geramos um sinal se o SMA curto exceder o SMA longo e não é longo o par de moedas. No segundo caso, geramos um sinal se o SMA longo exceder o SMA curto e já estamos longos.
Eu configurei a janela padrão para ser 500 carrapatos para o SMA curto e 2.000 tiques para o SMA longo. Obviamente, em uma configuração de produção, esses parâmetros seriam otimizados, mas eles funcionam bem para nossos fins de teste.
Single-Threaded Backtester.
Outra mudança importante foi modificar o componente backtesting para ser um único thread, em vez de multi-threaded.
Eu fiz essa mudança porque estava tendo dificuldade em sincronizar os segmentos para executar de uma maneira que ocorreria em um ambiente ao vivo. Isso significava basicamente que os preços de entrada e saída eram muito pouco realistas, muitas vezes (virtuais) horas após o recibo real ter sido recebido.
Por isso, eu incorporei a transmissão de objetos do TickEvent para o loop backtesting, como você pode ver no seguinte trecho de backtest. py:
Observe a linha ticker. stream_next_tick (). Isso é chamado antes de uma votação da fila de eventos e, como tal, sempre garantirá que um novo evento de marcação tenha chegado antes que a fila seja consultada novamente.
Em particular, isso significa que um sinal é executado à medida que novos dados do mercado chegam, mesmo que haja um atraso no processo de pedidos devido ao deslizamento.
Eu também estabeleci um valor de max_iters que controla quanto tempo o loop de backtesting continua. Na prática, isso precisará ser bastante grande ao lidar com múltiplas moedas em vários dias, mas eu defini-lo como um valor padrão que permite dados de um único dia de um par de moedas.
O método stream_next_tick da classe do manipulador de preços é semelhante ao stream_to_queue, exceto que ele chama o método iterator next () manualmente, em vez de executar o tick streaming em um loop for:
Observe que ele pára após o recebimento de uma exceção StopIteration. Isso permite que o código seja retomado em vez de falhar na exceção.
Saída Matplotlib.
Eu também criei um script de saída Matplotlib muito básico para exibir a curva de equidade. output. py atualmente vive no diretório backtest do QSForex e é fornecido abaixo:
Observe que existe uma nova variável settings. py agora chamada OUTPUT_RESULTS_DIR, que deve ser configurada em suas configurações. Eu o tenho apontando para um diretório temporário em outro lugar no meu sistema de arquivos, pois não quero adicionar acidentalmente nenhum resultado de back-up de ações à base do código!
A curva de equidade funciona com um valor de saldo adicionado a uma lista de dicionários, com um dicionário correspondente a um carimbo de horário.
Uma vez que o back-test é concluído, a lista de dicionários é convertida em um Pandas DataFrame e o método to_csv é usado para produzir equity. csv.
Este script de saída, em seguida, lê no arquivo e traça a coluna de saldo do subsequente DataFrame.
Você pode ver o trecho dos métodos append_equity_row e output_results da classe Portfolio abaixo:
Toda vez que o sign_signal é chamado, o método anterior é chamado e acrescenta o valor do timestamp / balance ao membro de equidade.
No final do backtest, é chamado o resultado, que simplesmente converte a lista de dicionários para um DataFrame e, em seguida, as saídas para o diretório OUTPUT_RESULTS_DIR especificado.
Infelizmente, esta não é uma maneira particularmente apropriada de criar uma curva de equidade, pois isso ocorre apenas quando um sinal é gerado. Isto significa que não leva em consideração P & amp; L não realizados.
Embora seja assim que ocorre a negociação real (você realmente não ganhou dinheiro até fechar uma posição), significa que a curva de equidade permanecerá completamente plana entre as atualizações do saldo. Pior ainda, o Matplotlib irá padronizar a interpolação linear entre esses pontos, proporcionando assim a falsa impressão do P e amp; L não realizado.
A solução para este problema é criar um rastreador P & amp; L não realizado para a classe Posição que atualiza corretamente em cada marca. Isso é um pouco mais computacionalmente caro, mas permite uma curva de capital mais útil. Este recurso está planejado para uma data posterior!
Próximos passos.
A próxima grande tarefa para o QSForex é permitir backtesting de vários dias. Atualmente, o objeto HistoricCSVPriceHandler apenas carrega um valor de um dia do DukasCopy para todos os pares de moedas especificados.
Para permitir o teste de vários dias, será necessário carregar e transmitir cada dia de forma sequencial para evitar o preenchimento de RAM com todo o histórico de dados do tick. Isso exigirá uma modificação de como o método stream_next_tick funciona. Uma vez que isso seja concluído, isso permitirá um backtesting de estratégia de longo prazo em múltiplos pares.
Outra tarefa é melhorar o resultado da curva de equidade. Para calcular qualquer uma das métricas de desempenho usuais (como a Relação Sharpe), precisaremos calcular os retornos percentuais em um determinado período de tempo. No entanto, isso requer que nós armazenemos os dados do tick em barras para calcular um retorno para um determinado período de tempo.
Esse binning deve ocorrer em uma freqüência de amostragem que é semelhante à freqüência de negociação ou a Ratio Sharpe não refletirá o verdadeiro risco / recompensa da estratégia. Este binning não é um exercício trivial, pois existem muitos pressupostos que geram um "preço" para cada caixa.
Uma vez que estas duas tarefas estão completas, e dados suficientes foram adquiridos, estaremos em condições de testar uma ampla gama de estratégias de Forex baseadas em dados de marca e produzir curvas de patrimônio líquido da maioria dos custos de transação. Além disso, será extremamente fácil testar essas estratégias na conta de negociação de papel de prática fornecida pela OANDA.
Isso deve permitir que você tome decisões muito melhores sobre se executar uma estratégia em comparação com um sistema de backtesting mais "orientado para a pesquisa".
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.
Comments
Post a Comment