Quantstart forex


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 17 de março de 2018.
Na entrada de hoje do Forex Trading Diary eu quero discutir o plano de longo prazo para o sistema de negociação forex. Além disso, quero descrever como usei o tipo de dados Decimal do Python para tornar os cálculos mais precisos.
Até o momento, experimentamos a OANDA Rest API para ver como comparado com a API fornecido pela Interactive Brokers. Também vimos como adicionar um elemento de replicação de portfólio básico como o primeiro passo para um sistema de backtesting baseado em eventos apropriado. Eu também tive alguns comentários úteis sobre os dois artigos anteriores (# 1 e # 2), o que sugere que muitos de vocês estão interessados ​​em mudar e ampliar o código.
Open Sourcing do Forex Trading System.
Pelas razões acima descritas, decidi optar por abrir o sistema de negociação forex. O que isto significa? Isso significa que todos os códigos atuais e futuros estarão disponíveis de graça, sob uma licença MIT open source liberal, no site de controle de versão Github no seguinte URL: https: // github / mhallsmoore / qsforex.
Para aqueles de vocês que usaram o git e o Github antes, você poderá clonar o retomado e começar a modificá-lo para seus próprios propósitos.
O QuantStart Automated Forex Trading System agora é open-source sob uma licença MIT liberal. Você pode encontrar o código mais recente no Github sob o repositório qsforex em https: // github / mhallsmoore / qsforex.
Para aqueles que são novos para o controle de versão de origem, você provavelmente quer ler sobre como o git (e o controle de versão em geral) funcionam com o fantástico ebook grátis Pro Git. Vale a pena passar algum tempo aprendendo sobre o controle de origem, pois isso irá poupar-lhe uma enorme quantidade de dor de cabeça futura se você gastar muito tempo programando e atualizando projetos!
O "início rápido" para um sistema Ubuntu é instalar o git:
Você precisará fazer um diretório para o projeto qsforex para viver e "clone" o projeto do site Github da seguinte maneira:
Neste ponto, você precisará criar um ambiente virtual no qual executar o código:
Você precisará instalar os requisitos (isso levará algum tempo!):
Finalmente, você precisará criar um link simbólico em seu ambiente virtual Python para permitir que você digite importar qsforex em seu código (e execute-o!):
Como mencionei nas entradas anteriores, você precisará criar as variáveis ​​de ambiente necessárias para suas credenciais de autenticação OANDA. Por favor, veja a entrada do diário nº 2 para obter instruções sobre como fazer isso.
Preste atenção ao README associado ao repo, pois contém instruções de instalação, um aviso legal e uma garantia sobre o uso do código.
Uma vez que o software está no modo "alfa", essas instruções se tornarão mais diretas à medida que o tempo avança. Em particular, vou tentar enrolar o projeto em um pacote Python para que ele possa ser facilmente instalado via pip.
Se você tiver alguma dúvida sobre o procedimento de instalação, então não hesite em me enviar um e-mail no mike @ quantstart.
Plano a longo prazo.
A "filosofia" do sistema de negociação forex, como no resto do site QuantStart, é tentar imitar o comércio da vida real tanto quanto possível em nosso backtesting. Isso significa incluir os detalhes que muitas vezes são excluídos de mais situações de teste de "pesquisa orientada". Latência, interrupções do servidor, automação, monitoramento, custos de transação realistas serão incluídos nos modelos para nos dar uma boa idéia de quão bem uma estratégia é susceptível de realizar.
Uma vez que teremos acesso a dados de ticks (timestamps de lance / pedido), poderemos incorporar o spread nos custos de transação. Nós também podemos modelar o deslizamento. É menos direto modelar o impacto do mercado, embora isso seja menos preocupante em menores montantes de negociação.
Além dos custos de transação, queremos modelar o gerenciamento de portfólio robusto usando sobreposições de risco e dimensionamento de posição.
Então, o que atualmente está incluído no Forex Trading System até à data?
Arquitetura dirigida por eventos - O sistema de negociação forex foi projetado como um sistema orientado a eventos desde o início, pois é assim que um sistema de negociação intradía será implementado em um ambiente ao vivo. Streaming de preços - Temos um objeto básico de transmissão de preços. Isso atualmente gerencia a assinatura de apenas um único par, mas podemos facilmente modificar isso para se inscrever em vários pares de moedas. Geração de sinal - Podemos incorporar estratégias de negociação (baseadas diretamente nos preços do tiquete passado e atual) usando o objeto Estratégia, que cria objetos do SignalEvent. Execução de Ordem - Temos um sistema de execução de ordens ingênuo que envia cjamente ordens do Portfolio para OANDA. Por "cegamente" quero dizer que não há gerenciamento de risco ou dimensionamento de posição sendo realizado, nem qualquer execução algorítmica que possa levar a custos de transação reduzidos. GBP Currency Base - Para manter as coisas simples, eu apenas escrevi o sistema para a moeda base do GBP. Este é talvez o aspecto mais importante a modificar dado quantos de vocês terão contas de prática denominadas em USD, EUR, CAD, JPY, AUD e NZD! GBP / USD Trading - Eu escolhi "o cabo" como o par de moedas para testar os objetos iniciais de Posição e Portfolio. Manter vários pares de moedas é um importante passo seguinte. Isso envolverá modificação na posição e nos cálculos do portfólio. Manipulação decimal - Qualquer sistema de comércio de produção deve lidar corretamente com cálculos de moeda. Em particular, os valores de moeda não devem ser armazenados como tipos de dados de ponto flutuante, uma vez que os erros de arredondamento serão acumulados. Por favor, veja este artigo fantástico sobre representações de ponto flutuante para mais detalhes. Negociação longa / curta - Entre entradas diárias # 2 e # 3 adicionei a capacidade de reduzir um par de moedas (ao contrário de apenas poder aguentar). Crucialmente, isso também é testado por unidade. Manipulação local de portfólio - Na minha opinião, realizar um backtest que infla o desempenho da estratégia devido a pressupostos irrealistas é irritante na melhor das hipóteses e extremamente inútil na pior das hipóteses! A introdução de um objeto de portfólio local que replica os cálculos OANDA significa que podemos verificar nossos cálculos internos ao realizar negociações de práticas, o que nos dá maior confiança quando usamos mais tarde esse mesmo objeto de portfólio para fazer backtesting em dados históricos. Testes unitários para posição / Portfolio - Embora eu não tenha mencionado isso diretamente nas entradas diárias # 1 e # 2, eu realmente escrevi alguns testes de unidade para os objetos Portfolio e Position. Uma vez que estes são tão cruciais para os cálculos da estratégia, é preciso estar extremamente confiante de que eles funcionam como esperado. Um benefício adicional desses testes é que eles permitem que o cálculo subjacente seja modificado, de modo que, se todos os testes ainda passam, podemos ter certeza de que o sistema geral continuará a se comportar conforme o esperado.
Nesta fase, o Forex Trading System está faltando a seguinte funcionalidade:
Manipulação de Slippage - O sistema está gerando um grande deslizamento devido à natureza de alta frequência dos dados de carrapatos fornecidos pela OANDA. Isso significa que o saldo da carteira calculado localmente não reflete o saldo calculado pela OANDA. Até que o ajuste correto do evento e o ajuste do deslizamento sejam realizados, isso significará que um backtest não refletirá corretamente a realidade. Múltiplas moedas básicas - atualmente estamos restritos a GBP. No mínimo, precisamos incluir as principais divisas - USD, EUR, CAD, AUD, JPY e NZD. Múltiplos pares de moedas - Da mesma forma, precisamos apoiar os principais pares de moedas além do "Cabo" (GBP / USD). Existem dois aspectos para isso. O primeiro é gerenciar corretamente os cálculos quando nem a base ou a cotação de um par de moedas é igual à moeda da denominação da conta. O segundo aspecto é apoiar várias posições para que possamos negociar um portfólio de pares de moedas. Gerenciamento de Riscos - Muitos testes de "pesquisa" ignoram completamente o gerenciamento de riscos. Infelizmente, isso geralmente é necessário para a brevidade ao descrever as regras de uma estratégia. Na realidade, devemos usar uma sobreposição de risco ao negociar, caso contrário, é extremamente provável que sofreremos uma perda substancial em algum momento. Isso não quer dizer que o gerenciamento de riscos possa evitar isso inteiramente, mas certamente o torna menos provável! Otimização de portfólio - Em um cenário institucional, teremos um mandato de investimento, que ditará um sistema robusto de gerenciamento de portfólio com várias regras de alocação. Em um ambiente varejo / pessoal, talvez desejemos usar uma abordagem de dimensionamento de posição, como o Critério de Kelly, para maximizar a nossa taxa de crescimento agendada a longo prazo. Estratégias robustas - Só demonstrei algumas estratégias de "brinquedo" geradoras de sinal aleatório simples até à data. Agora que estamos começando a criar um sistema de negociação forex intraday confiável, devemos começar a realizar algumas estratégias mais interessantes. As entradas futuras do diário concentrar-se-ão em estratégias tiradas de uma mistura de indicadores / filtros "técnicos", bem como modelos de séries temporais e técnicas de aprendizado de máquina. Implantação remota - Uma vez que estamos potencialmente interessados ​​em negociar 24 horas (pelo menos durante a semana!), Exigimos uma configuração mais sofisticada do que executar o backtester em uma máquina de desktop / laptop local em casa. É vital que criemos uma implantação de servidor remoto robusto do nosso sistema com redundância e monitoramento apropriados. Backtesting Histórico - Construímos o objeto Portfolio para nos permitir realizar backtesting realista. Neste estágio, estamos faltando um sistema histórico de armazenamento de dados de carrapatos. Nos artigos subsequentes, analisaremos a obtenção de dados históricos do carrapato e armazená-lo em um banco de dados apropriado, como o HDF5. Banco de dados de comércio - Eventualmente, gostaríamos de armazenar nossos negócios ao vivo em nosso próprio banco de dados. Isso nos permitirá realizar nossas próprias análises em dados de negociação ao vivo. Uma boa recomendação para um banco de dados relacional seria PostgreSQL ou MySQL. Monitoramento e alta disponibilidade - Como estamos considerando um sistema intradía de alta freqüência, devemos colocar um monitoramento abrangente e uma redundância de alta disponibilidade no local. Isso significa informar sobre o uso da CPU, uso de disco, E / S de rede, latência e verificar se qualquer script periódico está configurado para continuar sendo executado. Além disso, precisamos de uma estratégia de backup e restauração. Pergunte-se quais os planos de backup que você teria no lugar se você tivesse grandes posições abertas, em um mercado volátil e seu servidor de repente morreu. Acredite, isso acontece! Integração Multiple Broker / FIX - No momento estamos fortemente acoplados ao corretor OANDA. Como eu disse, isso é simplesmente porque eu encontrei sua API e achei que ela era uma oferta moderna. Há muitos outros corretores lá fora, muitos dos quais suportam o protocolo FIX. A adição de uma capacidade FIX aumentaria o número de corretores que poderiam ser usados ​​com o sistema. GUI Controle e Relatórios - Agora o sistema é completamente baseado em console / linha de comando. No mínimo, precisaremos de algum gráfico básico para exibir os resultados do backtest. Um sistema mais sofisticado incorporará estatísticas resumidas de negócios, métricas de desempenho de nível estratégico, bem como o desempenho geral do portfólio. Esta GUI poderia ser implementada usando um sistema de janelas multiplataforma, como Qt ou Tkinter. Também pode ser apresentado usando um front-end baseado na web, utilizando uma estrutura web como o Django.
Como pode ser visto, há muita funcionalidade no roteiro! Dito isto, cada nova entrada no diário (e potenciais contribuições da comunidade!) Moverá o projeto para a frente.
Tipos de dados decimais.
Agora que discutimos o plano de longo prazo, quero apresentar algumas das alterações que fiz no código desde a entrada do diário nº 2. Em particular, quero descrever como modifiquei o código para lidar com o tipo de dados Decimal em vez de usar o armazenamento em ponto flutuante. Esta é uma mudança extremamente importante, já que as representações de ponto flutuante são uma fonte substancial de erro de longo prazo em sistemas de gerenciamento de pedidos e portfólio.
O Python suporta nativamente representações decimais a uma precisão arbitrária. A funcionalidade está contida na biblioteca decimal.
Em particular, precisamos modificar todo valor que aparece em um cálculo de Posição para um tipo de dados Decimal. Isso inclui as unidades, a exposição, pips, lucro e lucro percentual. Isso garante que estamos no controle total de como os problemas de arredondamento são tratados quando se trata de representações de moeda que têm duas casas decimais de precisão. Em particular, precisamos escolher o método de arredondamento. O Python suporta alguns tipos diferentes, mas iremos com ROUND_HALF_DOWN, que arredondará para o inteiro mais próximo com os laços indo em direção a zero.
Aqui está um exemplo de como o código é modificado para lidar com tipos de dados decimais de suas representações de ponto flutuante anteriores. O seguinte é uma lista de position. py:
Observe que devemos fornecer Decimal com um argumento de string, em vez de um argumento de ponto flutuante. Isso ocorre porque uma string especifica precisamente a precisão do valor, enquanto que um tipo de ponto flutuante não.
Observe também que, quando começarmos a armazenar nossos negócios em um banco de dados relacional (conforme descrito acima no roteiro), teremos de garantir que mais uma vez usemos o tipo de dados correto. O PostgreSQL eo MySQL suportam uma representação decimal. É vital que utilizemos esses tipos de dados quando criamos nosso esquema de banco de dados, caso contrário, nos armaremos em erros de arredondamento que são extremamente difíceis de diagnosticar!
Para aqueles que estão interessados ​​em uma discussão mais profunda sobre essas questões, em matemática e informática, o assunto da Análise Numérica cobre problemas de ponto flutuante, entre muitos outros tópicos interessantes.
Nas entradas diárias subseqüentes, vamos discutir como apliquei testes de unidades ao código e como podemos estender o software para mais pares de moedas modificando os cálculos de posição.
Código completo do Python.
Uma vez que o código fonte completo para o projeto agora é de código aberto, sob uma licença MIT, ele sempre pode ser encontrado em https: // github / mhallsmoore / qsforex, com a documentação que o acompanha.
Se você quiser ler as outras entradas da série, siga os links abaixo:
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.

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 30 de junho de 2018.
Embora eu tenha gasto a maior parte deste mês pesquisando análises de séries temporais para a próxima série de artigos, também trabalhei no QSForex tentando melhorar a API um pouco.
Em particular, criei a interface para começar um novo backtest muito mais simples, encapsulando muito do código "boilerplate" em uma nova classe Backtest. Eu também modifiquei o sistema para ser totalmente executável com vários pares de moedas. Neste artigo, descreverei a nova interface e mostre o exemplo usual do Crossover de média móvel em GBP / USD e EUR / USD.
Nova interface Backtest.
Modifiquei a interface do backtest para que, ao invés de ter que criar um arquivo backtest. py personalizado como antes, você pode simplesmente criar uma instância do Backtest e preenchê-lo com seus componentes de negociação.
A melhor maneira de começar com a nova abordagem é dar uma olhada nos exemplos / diretório e abrir o mac. py:
Como você pode ver, é relativamente curto. Em primeiro lugar, o código importa os componentes necessários, nomeadamente o Backtest, SimulatedExecution, Portfolio, MovingAverageCrossStrategy e HistoricCSVPriceHandler.
Em segundo lugar, definimos os pares com os quais negociaremos e, em seguida, criamos um dicionário conhecido como strategy_params. Isso contém essencialmente quaisquer argumentos de palavras-chave que possamos desejar passar para a nossa estratégia. No caso de um Crossover de média móvel, precisamos passar os comprimentos da janela rolante. Esses valores são em termos de "carrapatos".
Finalmente, criamos uma instância do Backtest e passamos todos os objetos como parâmetros. Então, corremos o backtest em si.
Dentro do novo backtest. py chamamos esse método:
Executa o cálculo do backtest (por exemplo, a atualização do portfólio como o check-in), bem como a computação e saída do desempenho em equity. csv.
Como antes, ainda podemos produzir um gráfico da saída com o script backtest / output. py. Eu usarei esse script abaixo quando discutimos a implementação do par de moedas múltiplas.
Múltiplos pares de moedas.
Estamos finalmente no ponto em que podemos testar nossa primeira estratégia de negociação não trivial em dados de ticks de alta freqüência em vários pares de moedas!
Para conseguir isso, modifiquei a forma como o MovingAverageCrossStrategy é tratado. Para completar, coloquei a lista completa abaixo:
Essencialmente, criamos um dicionário de atributos attr_dict que armazena o número de tiques decorrentes e se a estratégia está "no" mercado para esse par específico.
Em calcule_signals, aguardamos que um TickEvent seja recebido e, em seguida, calculemos as médias móveis de movimentação simples para janelas curtas e longas. Uma vez que excedemos a janela curta para um par específico, a estratégia vai longa e sai da mesma maneira que antes, embora para cada par separadamente.
Utilizei 2 meses de dados para GBP / USD e EUR / USD e o backtest demora algum tempo para executar! Demora cerca de 10 a 15 minutos no meu sistema, incluindo o cálculo da redução.
No entanto, uma vez que o backtest está completo, podemos usar backtest / output. py para produzir o seguinte gráfico de desempenho:
Gráfico de desempenho do GBP / USD e EUR / USD MovingAverageCrossover para o período de abril de 2018 a maio de 2018.
Claramente, o desempenho não é excelente, pois a estratégia permanece quase inteiramente "subaquática" à medida que o tempo passa. Dito isto, não devemos esperar muito de uma estratégia tão básica em dados de ticks de alta freqüência. No futuro, iremos analisar abordagens muito mais sofisticadas para negociação nesta escala de tempo.
Espero que ele forneça um ponto de partida útil para o desenvolvimento de estratégias mais sofisticadas. Estou ansioso para ver o que os outros procuram no futuro próximo!
Próximos passos.
Nesta fase, há uma lista de problemas em Github que precisam de atenção. Eu vou estar trabalhando lentamente naqueles no próximo mês.
Em particular, eu gostaria de tornar o sistema muito mais rápido, pois permitirá que pesquisas de parâmetros sejam realizadas em um tempo razoável. Embora o Python seja uma ótima ferramenta, é uma desvantagem que é relativamente lento quando comparado ao C / C ++. Por isso, vou realizar muitos perfis para tentar melhorar a velocidade de execução tanto do backtest quanto do cálculo do desempenho.
Além disso, tive alguns comentários de pessoas sugerindo que gostariam de ver tipos de pedidos mais variados do que o Simple Market Order. Para a realização de estratégias apropriadas de HFT contra o OANDA, precisaremos usar Ordens Limites. Isso provavelmente exigirá uma reformulação de como o sistema atualmente executa negócios, mas permitirá que um universo muito maior de estratégias de negociação seja realizado.
Entre em contato com o mike @ quantstart se você tiver alguma sugestão, comentário ou relatório de erros. Estou sempre ansioso para ouvir como as pessoas acabaram usando QSForex e quais modificações foram feitas.
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.

Michael Halls-Moore mhallsmoore.
Informe ou bloqueie mhallsmoore.
Entre em contato com o suporte sobre o comportamento desse usuário.
Organizações.
Repositórios fixos.
QuantStart - Advanced Trading Infrastructure.
QuantStart Forex Backtesting e Live Trading.
Kit de ferramentas de modelagem hidrológico / hidráulico baseado em soluções para as equações de água rasa bidimensionais.
555 contribuições no último ano.
Atividade de contribuição Saltar para Solicitação de primeiro lance Primeira edição Primeiro repositório Unido ao GitHub.
Janeiro de 2018.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

Quantstart forex
Solicitações de envio 11.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
A QSForex é uma plataforma de negociação de backtesting e de negociação aberta de código aberto para uso nos mercados cambiais ("forex"), atualmente em um estado "alfa".
Ele foi criado como parte da série Forex Trading Diary no QuantStart para fornecer à comunidade comercial sistemática um motor de negociação robusto que permite a implementação e o teste direto da estratégia forex.
O software é fornecido sob uma licença permissiva "MIT" (veja abaixo).
Open-Source - QSForex foi lançado sob uma Licença MIT de código aberto extremamente permissiva, que permite o uso total em aplicativos comerciais e de pesquisa, sem restrições, mas sem garantia de qualquer tipo. Grátis - QSForex é completamente gratuito e não custa nada para baixar ou usar. Colaboração - Como o QSForex é de código aberto, muitos desenvolvedores colaboram para melhorar o software. Novos recursos são adicionados com freqüência. Todos os erros são rapidamente determinados e corrigidos. Desenvolvimento de Software - QSForex está escrito na linguagem de programação Python para suporte direto à plataforma cruzada. QSForex contém um conjunto de testes unitários para a maioria do seu código de cálculo e novos testes são constantemente adicionados para novos recursos. Arquitetura dirigida a eventos - O QSForex é completamente conduzido por eventos tanto para backtesting quanto para negociação ao vivo, o que leva a uma transição direta de estratégias de uma fase de pesquisa / teste para uma implementação de negociação ao vivo. Custos de transação - Os custos de spread são incluídos por padrão para todas as estratégias testadas anteriormente. Backtesting - QSForex possui backtesting de vários dias de multi-moeda multi-dia intradía. Negociação - O QSForex atualmente oferece suporte à negociação intradiária ao vivo usando a OANDA Brokerage API em um portfólio de pares. Métricas de desempenho - O QSForex atualmente oferece suporte a medição básica de desempenho e visualização de equidade através das bibliotecas de visualização Matplotlib e Seaborn.
Visite oanda / e configure uma conta para obter as credenciais de autenticação da API, que você precisará realizar uma negociação ao vivo. Explico como realizar isso neste artigo: https: // quantstart / articles / Forex-Trading-Diary-1-Automated-Forex-Trading-with-the-OANDA-API.
Clonar este repositório git em um local adequado em sua máquina usando o seguinte comando em seu terminal: git clone https: //github/mhallsmoore/qsforex. git. Alternativa, você pode baixar o arquivo zip do ramo mestre atual em https: //github/mhallsmoore/qsforex/archive/master. zip.
Crie um conjunto de variáveis ​​de ambiente para todas as configurações encontradas no arquivo settings. py no diretório raiz do aplicativo. Alternativamente, você pode "codificar" suas configurações específicas substituindo as chamadas os. environ. get (.) Por cada configuração:
Isso criará um novo ambiente virtual para instalar os pacotes. Supondo que você baixou o repositório QSForex git em um diretório de exemplo, como.
/ projects / qsforex / (altere este diretório abaixo para onde você instalou QSForex), então, para instalar os pacotes, você precisará executar os seguintes comandos:
Isso levará algum tempo, como NumPy, SciPy, Pandas, Scikit-Learn e Matplotlib devem ser compilados. Há muitos pacotes necessários para que isso funcione, então por favor dê uma olhada nestes dois artigos para obter mais informações:
Você também precisará criar um link simbólico do seu diretório de pacotes do site para seu diretório de instalação QSForex para poder chamar importar qsforex dentro do código. Para fazer isso, você precisará de um comando semelhante ao seguinte:
Certifique-se de mudar.
/ projects / qsforex para o diretório de instalação e.
/venv/qsforex/lib/python2.7/site-packages/ para o seu diretório de pacotes do site virtualenv.
Agora você poderá executar os comandos subseqüentes corretamente.
Nesta fase, se você simplesmente deseja realizar práticas ou negociação ao vivo, você pode executar o python trading / trading. py, que usará a estratégia de negociação padrão do TestStrategy. Isso simplesmente compra ou vende um par de moedas cada 5 vezes. É puramente para testar - não use isso em um ambiente de comércio ao vivo!
Se você deseja criar uma estratégia mais útil, basta criar uma nova classe com um nome descritivo, por exemplo, MeanReversionMultiPairStrategy e assegure-se de que ele tenha um método de calcule_signals. Você precisará passar esta classe a lista de pares, bem como a fila de eventos, como em trading / trading. py.
Por favor, consulte Strategy / Strategy. py para obter detalhes.
Para realizar qualquer backtesting, é necessário gerar dados de Forex simulados ou baixar dados de ticks históricos. Se você deseja simplesmente testar o software, a maneira mais rápida de gerar um exemplo de backtest é gerar alguns dados simulados. O formato de dados atual usado pelo QSForex é o mesmo que o fornecido pelo DukasCopy Historical Data Feed em https: // dukascopy / swiss / english / marketwatch / historical /.
Para gerar alguns dados históricos, verifique se a configuração CSV_DATA_DIR na settings. py é configurar para um diretório onde deseja que os dados históricos sejam exibidos. Você então precisa gerar generate_simulated_pair. py, que está no diretório / script. Ele espera um único argumento de linha de comando, que neste caso é o par de moedas no formato BBBQQQ. Por exemplo:
Nesta fase, o script é codificado para criar dados de um único mês para janeiro de 2018. Ou seja, você verá arquivos individuais, do formato BBBQQQ_YYYYMMDD. csv (por exemplo, GBPUSD_20180112.csv) aparecem em seu CSV_DATA_DIR para todos os dias úteis desse mês. Se você deseja alterar o mês / ano da saída de dados, simplesmente modifique o arquivo e re-execute.
Agora que os dados históricos foram gerados, é possível realizar um backtest. O arquivo backtest em si é armazenado no backtest / backtest. py, mas isso contém apenas a classe Backtest. Para realmente executar um backtest, você precisa instanciar esta classe e fornecer os módulos necessários.
A melhor maneira de ver como isso é feito é olhar para o exemplo de Implementação de Crossover em Moving Average no arquivo examples / mac. py e usá-lo como um modelo. Isso faz uso do MovingAverageCrossStrategy que é encontrado em strategy / strategy. py. Este padrão é negociar GBP / USD e EUR / USD para demonstrar uso de par de moedas múltiplas. Ele usa dados encontrados em CSV_DATA_DIR.
Para executar o exemplo backtest, simplesmente execute o seguinte:
Isso vai levar algum tempo. No meu sistema de desktop Ubuntu em casa, com os dados históricos gerados via generate_simulated_pair. py, leva cerca de 5-10 minutos para serem executados. Uma grande parte deste cálculo ocorre no final do backtest real, quando o drawdown está sendo calculado, então lembre-se de que o código não foi desligado! Deixe-o até a conclusão.
Se você deseja visualizar o desempenho do backtest, você pode simplesmente usar output. py para ver uma curva de equivalência patrimonial, retornos de período (ou seja, tick-to-tick) e uma curva de redução:
E é isso! Nesta fase, você está pronto para começar a criar os seus backtests modificando ou anexando estratégias em strategy / strategy. py e usando dados reais baixados da DukasCopy (https: // dukascopy / swiss / english / marketwatch / historical /).
Se você tiver dúvidas sobre a instalação, então fique à vontade para me enviar um e-mail no mike @ quantstart.
Se você tiver algum erro ou outros problemas que você acha que podem ser devido especificamente à base de código, sinta-se à vontade para abrir um problema Github aqui: https: // github / mhallsmoore / qsforex / issues.
Copyright (c) 2018 Michael Halls-Moore.
A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo, sem limitação, os direitos de uso, cópia, modificação, mesclagem , publicar, distribuir, sublicenciar e / ou vender cópias do Software e permitir que pessoas a quem o Software seja fornecido, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou porções substanciais do Software.
O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRAM", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, APTIDÃO PARA UM PROPÓSITO ESPECÍFICO E NÃO INFRACÇÃO. EM NENHUMA CIRCUNSTÂNCIA, OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENDO, DESTE OU RELACIONADO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NA PROGRAMAS.
A negociação de câmbio em margem comporta um alto nível de risco e pode não ser adequada para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você, bem como para você. Antes de decidir investir em divisas, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de que você possa sustentar uma perda de algum ou todo seu investimento inicial e, portanto, você não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à negociação cambial e procurar o aconselhamento de um consultor financeiro independente se tiver dúvidas.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

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 21 de janeiro de 2018.
Eu mencionei anteriormente no artigo QuantStart: 2018 In Review que eu estaria gastando algum escrito em 2018 sobre negociação forex automatizada.
Dado que eu mesmo geralmente realizo pesquisas em mercados de ações e futuros, pensei que seria divertido (e educativo!) Escrever sobre minhas experiências de entrar no mercado de divisas no estilo de um diário. Cada "entrada diária" tentará construir sobre todos aqueles antes, mas também deve ser relativamente autônoma.
Nesta primeira entrada do diário, descreverei como configurar uma nova conta de corretagem de prática com a OANDA, bem como a forma de criar um motor de negociação básico baseado em múltiplos processos que possa executar negócios automaticamente em uma configuração prática e ao vivo.
No ano passado, passamos muito tempo olhando o backtester baseado em eventos, principalmente para ações e ETFs. O que eu apresento abaixo é orientado para o forex e pode ser usado para negociação de papel ou negociação ao vivo.
Eu escrevi todas as instruções a seguir para o Ubuntu 14.04, mas elas devem ser facilmente traduzidas para Windows ou Mac OS X, usando uma distribuição Python, como Anaconda. A única biblioteca adicional usada para o mecanismo comercial Python é a biblioteca de solicitações, que é necessária para a comunicação HTTP para a API OANDA.
Uma vez que este é o primeiro post diretamente sobre o comércio cambial, e o código apresentado abaixo pode ser direto para um ambiente de negociação ao vivo, gostaria de apresentar as seguintes isenções:
Isenção de responsabilidade: a negociação de câmbio na margem possui um alto nível de risco e pode não ser adequada para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você, bem como para você. Antes de decidir investir em divisas, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de que você possa sustentar uma perda de algum ou todo seu investimento inicial e, portanto, você não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à negociação cambial e procurar o aconselhamento de um consultor financeiro independente se tiver dúvidas.
Este software é fornecido "tal como está" e quaisquer garantias expressas ou implícitas, incluindo, mas não limitado a, as garantias implícitas de comercialização e adequação para um propósito específico são negadas. Em nenhum caso, os regentes ou contribuidores serão responsáveis ​​por quaisquer danos diretos, indiretos, incidentais, especiais, exemplares ou conseqüentes (incluindo, mas não limitado a, aquisição de bens ou serviços de substituição, perda de uso, dados ou lucros, ou interrupção do negócio), no entanto, causou e em qualquer teoria da responsabilidade, seja no contrato, responsabilidade restritiva ou delito (incluindo negligência ou outra) decorrente de qualquer uso do software, mesmo que seja avisado da possibilidade de tal dano.
Configurando uma conta com OANDA.
A primeira pergunta que vem à mente é "Por que escolher OANDA?". Simplificando, depois de um pouco de Googling em torno de corretores de Forex que possuíam APIs, vi que a OANDA havia lançado recentemente uma API REST adequada que poderia ser facilmente comunicada com quase qualquer idioma de uma maneira extremamente direta. Depois de ler a documentação da API do desenvolvedor, eu decidi fazer uma tentativa, pelo menos com uma conta prática.
Para ser claro - não tenho relação anterior ou existente com a OANDA e estou fornecendo apenas esta recomendação com base em minha experiência limitada ao brincar com sua API prática e algum uso breve (para download de dados de mercado) enquanto empregado em um fundo anteriormente. Se alguém se deparou com outros corretores forex que também tenham uma API similarmente moderna, então eu ficaria feliz em dar-lhes um olhar também.
Antes de utilizar a API, é necessário se inscrever para uma conta prática. Para fazer isso, vá para o link de inscrição. Você verá a seguinte tela:
Você poderá fazer login com suas credenciais de login. Certifique-se de selecionar a guia "fxTradePractice" na tela de login:
Uma vez que você precisa fazer uma anotação da sua identificação da conta. Ele está listado abaixo do cabeçalho preto "Meus fundos" ao lado de "Primário". O meu é um número de 7 dígitos. Além disso, você também precisará gerar um token de API pessoal. Para fazer isso, clique em "Gerenciar Acesso da API" abaixo da guia "Outras Ações" no canto inferior esquerdo:
Nesta fase, você poderá gerar um token de API. Você precisará da chave para o uso mais tarde, então certifique-se de anotá-la também.
Agora você deseja iniciar o aplicativo FXTrade Practice, o que nos permitirá ver as ordens executadas e nosso (paper!) Profit & amp; perda.
Se você estiver executando um sistema Ubuntu, você precisará instalar uma versão ligeiramente diferente do Java. Em particular, a versão Oracle do Java 8. Se você não fizer isso, o simulador de prática não será carregado a partir do navegador. Executei esses comandos no meu sistema:
Agora você poderá iniciar o ambiente comercial da prática. Volte para o painel de controle OANDA e clique no link verde "Lançar FXTrade Practice". Ele abrirá uma caixa de diálogo Java perguntando se deseja executá-lo. Clique em "Executar" e a ferramenta FxTrade Practice será carregada. O meu padrão foi ajustado para um gráfico de velas de 15 minutos de EUR / USD com o Painel de Citações à esquerda:
Tela de prática OANDA fxTrade.
Neste ponto, estamos prontos para começar a projetar e codificar nosso sistema automatizado de trading forex contra a API OANDA.
Visão geral da arquitetura comercial.
Se você acompanha a série de backtester com base em eventos para ações e ETFs que eu criei no ano passado, você estará ciente de como esse sistema de negociação baseado em eventos funciona. Para aqueles que são novos para o software dirigido a eventos, eu sugeriria fortemente a leitura do artigo, a fim de obter informações sobre como eles funcionam.
Em essência, todo o programa é executado em um loop infinte while que só termina quando o sistema comercial é desligado. O mecanismo de comunicação central do programa é fornecido através de uma fila que contém eventos.
A fila é constantemente consultada para verificar novos eventos. Uma vez que um evento foi retirado do topo da fila, ele deve ser tratado por um componente apropriado do programa. Portanto, um feed de dados do mercado pode criar o TickEvent s que são colocados na fila quando um novo preço de mercado chega. Um objeto de estratégia gerador de sinal pode criar OrderEvent s que devem ser enviados para uma corretora.
A utilidade de tal sistema é dada pelo fato de que não importa qual ordem ou tipos de eventos são colocados na fila, pois eles sempre serão tratados corretamente pelo componente certo dentro do programa.
Além disso, diferentes partes do programa podem ser executadas em segmentos separados, o que significa que nunca há espera por nenhum componente específico antes de processar qualquer outro. Isso é extremamente útil em situações de negociação algorítmica, onde manipuladores de feed de dados de mercado e geradores de sinal de estratégia possuem características de desempenho muito diferentes.
O principal ciclo de negociação é dado pelo seguinte pseudo-código Python:
Como afirmamos acima, o código é executado em um loop infinito. Em primeiro lugar, a fila é polida para recuperar um novo evento. Se a fila estiver vazia, o loop simplesmente será reiniciado após um período de sono curto conhecido como "batimento cardíaco". Se um evento for encontrado, seu tipo é avaliado e, em seguida, o módulo relevante (seja a estratégia ou o manipulador de execução) é chamado a lidar com o evento e possivelmente gerar novos que voltem para a fila.
Os componentes básicos que criaremos para o nosso sistema comercial incluem o seguinte:
Manipulador de preços de transmissão - Isso manterá uma conexão de longa duração aberta aos servidores OANDAs e enviará dados de marca (por exemplo, lance / pedido) em toda a conexão para quaisquer instrumentos nos quais estamos interessados. Estratégia Gerador de Sinal - Isso levará uma seqüência de tiques eventos e use-os para gerar ordens de negociação que serão executadas pelo manipulador de execução. Manipulador de Execução - Executa um conjunto de eventos de ordem e depois os executa cegamente com OANDA. Eventos - Esses objetos constituem as "mensagens" que são transmitidas na fila de eventos. Exigimos apenas dois para esta implementação, nomeadamente o TickEvent e o OrderEvent. Ponto de entrada principal - O ponto de entrada principal também inclui o loop "trade" que pesquisa continuamente a fila de mensagens e envia mensagens para o componente correto. Isso geralmente é conhecido como "loop de eventos" ou "manipulador de eventos".
Vamos agora discutir a implementação do código em detalhes. Na parte inferior do artigo está a listagem completa de todos os arquivos de código fonte. Se você colocá-los no mesmo diretório e executar o python trading. py, você começará a gerar ordens, assumindo que você tenha preenchido o ID da sua conta e o token de autenticação da OANDA.
Implementação do Python.
É uma prática ruim armazenar senhas ou chaves de autenticação dentro de uma base de códigos, pois você nunca pode prever quem será, eventualmente, permitido o acesso a um projeto. Em um sistema de produção, nós armazenamos essas credenciais como variáveis ​​de ambiente com o sistema e, em seguida, consultamos esses "envvars" cada vez que o código é redistribuído. Isso garante que as senhas e os tokens de autenticação nunca sejam armazenados em um sistema de controle de versão.
No entanto, uma vez que estamos apenas interessados ​​em construir um sistema de comércio de "brinquedos" e não nos preocupamos com detalhes de produção neste artigo, em vez disso, separaremos estes tokens de autenticação em um arquivo de configurações.
No seguinte arquivo de configuração settings. py, temos um dicionário chamado AMBIENTES que armazena os pontos finais da API tanto para a API de transmissão de preços OANDA como para a API de negociação. Cada subdiretor contém três pontos de extremidade de API diferentes: real, prática e sandbox.
A API do sandbox é puramente para testar o código e verificar se não há erros ou erros. Não possui as garantias de tempo de atividade das APIs reais ou de prática. A API prática, em essência, oferece a capacidade de comércio de papel. Ou seja, ele fornece todos os recursos da API real em uma conta de prática simulada. A API real é apenas isso - é uma negociação ao vivo! Se você usa esse ponto final em seu código, ele será negociado contra o saldo da sua conta ao vivo. SEJA EXTREMAMENTE CUIDADOSO!
IMPORTANTE: quando negociar contra a prática, lembre-se de que um custo de transação importante, o impacto de mercado, não é considerado. Uma vez que nenhum negócio é realmente colocado no meio ambiente, esse custo deve ser contabilizado de outra maneira em outro lugar usando um modelo de impacto de mercado, se você deseja avaliar de forma realista o desempenho.
No seguinte, estamos usando a conta prática conforme a configuração DOMAIN. Precisamos de dois dicionários separados para os domínios, um para os componentes da API de transmissão e transmissão. Finalmente, temos ACCESS_TOKEN e ACCOUNT_ID. Eu preenchi os dois abaixo com IDs fofos, então você precisará usar o seu próprio, que pode ser acessado a partir da página da conta OANDA:
O próximo passo é definir os eventos que a fila usará para ajudar todos os componentes individuais a se comunicarem. Precisamos de dois: TickEvent e OrderEvent. O primeiro armazena informações sobre dados do mercado de instrumentos, como o (melhor) lance / pedido e o tempo de troca. O segundo é usado para transmitir ordens ao manipulador de execução e, portanto, contém o instrumento, o número de unidades a negociar, o tipo de ordem ("mercado" ou "limite") e o "lado" (ou seja, "comprar" e "vender" ).
Para o futuro do nosso código de eventos, vamos criar uma classe base chamada Evento e ter todos os eventos herdados disto. O código é fornecido abaixo em events. py:
A próxima classe que vamos criar irá lidar com a estratégia de negociação. Nesta demonstração, vamos criar uma estratégia bastante absurda que simplesmente receba todos os carrapatos do mercado e, em cada 5º tick, compra ou vende de maneira aleatória 10 mil unidades de EUR / USD.
Claramente, esta é uma "estratégia" ridícula. No entanto, é fantástico para fins de teste porque é direto codificar e entender. Em futuras entradas no diário, estaremos substituindo isso por algo significativamente mais emocionante que (espero) gire um lucro!
O arquivo strategy. py pode ser encontrado abaixo. Vamos trabalhar com isso e ver o que está acontecendo. Em primeiro lugar, importamos a biblioteca aleatória e o objeto OrderEvent de events. py. Precisamos da libação aleatória para selecionar uma ordem de compra ou venda aleatória. Precisamos do OrderEvent, pois é assim que o objeto de estratégia enviará ordens para a fila de eventos, que posteriormente será executada pelo manipulador de execução.
A classe TestRandomStrategy simplesmente leva o instrumento (neste caso EUR / USD), o número de unidades e a fila de eventos como um conjunto de parâmetros. Em seguida, cria um contador de tiques que é usado para contar quantas instâncias do TickEvent já viu.
A maior parte do trabalho ocorre no método calculate_signals, que simplesmente leva um evento, determina se é um TickEvent (ignore) e incrementa o contador de tiques. Em seguida, verifica se a contagem é divisível em 5 e, em seguida, compra ou vende aleatoriamente, com uma ordem de mercado, o número especificado de unidades. Certamente, não é a maior estratégia de negociação do mundo, mas será mais do que adequada para os nossos testes de API de corretagem da OANDA!
O próximo componente é o manipulador de execução. Esta classe é encarregada de atuar sobre as instâncias do OrderEvent e fazer solicitações ao corretor (neste caso, OANDA) de forma "burra". Ou seja, não há gerenciamento de risco ou sobreposição de construção de potfolio. O manipulador de execução simplesmente executará qualquer ordem que tenha sido dada.
Devemos passar todas as informações de autenticação para a classe Execution, incluindo o "domínio" (prática, real ou sandbox), o token de acesso e identificação da conta. Em seguida, criamos uma conexão segura com o httplib, um dos Pythons criados em bibliotecas.
A maior parte do trabalho ocorre em execute_order. O método requer um evento como um parâmetro. Em seguida, constrói dois dicionários - os cabeçalhos e os params. Esses dicionários serão corretamente codificados (parcialmente por urllib, outra biblioteca Python) para serem enviados como uma solicitação HTTP POST para a API OANDAs.
Passamos os parâmetros de cabeçalho do tipo de conteúdo e autorização, que incluem nossas informações de autenticação. Além disso, codificamos os parâmetros, que incluem o instrumento (EUR / USD), unidades, tipo de ordem e lado (compra / venda). Finalmente, fazemos o pedido e salvamos a resposta:
O componente mais complexo do sistema de negociação é o objeto StreamingForexPrices, que lida com as atualizações de preços de mercado da OANDA. Existem dois métodos: connect_to_stream e stream_to_queue.
O primeiro método usa a biblioteca de solicitações Python para se conectar a um soquete de transmissão com os cabeçalhos e parâmetros apropriados. Os parâmetros incluem o ID da conta e a lista de instrumentos necessários que devem ser ouvidos para atualizações (neste caso, é apenas EUR / USD). Observe a seguinte linha:
Isso diz que a conexão deve ser transmitida e, portanto, mantida aberta de uma maneira longa.
O segundo método, stream_to_queue, realmente tenta se conectar ao fluxo. Se a resposta não for bem sucedida (ou seja, o código de resposta não é HTTP 200), então simplesmente retornamos e saímos. Se for bem sucedido, tentamos carregar o pacote JSON retornado para um dicionário Python. Finalmente, convertemos o dicionário Python com o instrumento, lance / perguntar e timestamp em um TickEvent que é enviado para a fila de eventos:
Agora temos todos os principais componentes no local. O passo final é encerrar tudo o que escrevemos até agora em um programa "principal". O objetivo deste arquivo, conhecido como trading. py, é criar dois segmentos separados, um dos quais executa o manipulador de preços e o outro que administra o manipulador de negociação.
Por que precisamos de dois segmentos separados? Simplificando, estamos executando dois pedaços de código "separados", ambos em execução contínua. Se formássemos um programa não-threaded, o soquete de transmissão usado para as atualizações de preços nunca mais "liberaria" de volta para o caminho do código principal e, portanto, nunca realizaríamos nenhuma negociação. Da mesma forma, se corremos o loop de comércio (veja abaixo), nunca retornaríamos o caminho do fluxo para o soquete de transmissão de preços. Portanto, precisamos de múltiplos tópicos, um para cada componente, para que eles possam ser realizados de forma independente. Ambos se comunicarão entre si através da fila de eventos.
Vamos examinar isso um pouco mais. Criamos dois segmentos separados com as seguintes linhas:
Passamos o nome da função ou do método para o argumento de palavra-chave alvo e passamos uma iterável (como uma lista ou uma tupla) para o argumento de palavras-chave args, que passa esses argumentos para o método / função real.
Finalmente, começamos os dois tópicos com as seguintes linhas:
Assim, somos capazes de executar dois, efetivamente infinitos looping, segmentos de código independentemente, que ambos se comunicam através da fila de eventos. Observe que a biblioteca de threading do Python não produz um ambiente multi-core multi-core real devido à implementação do CPython do Python e do Bloqueio do Intérprete Global (GIL). Se você quiser ler mais sobre multithreading no Python, veja este artigo.
Vamos examinar o resto do código em detalhes. Em primeiro lugar, importamos todas as bibliotecas necessárias, incluindo Fila, encadeamento e tempo. Em seguida, importamos todos os arquivos de código acima. Pessoalmente, eu prefiro capitalizar quaisquer configurações, o que é um hábito que eu tirei do trabalho com o Django!
Depois disso, definimos a função comercial, que foi explicada em pseudocódigo Python acima. Um loop while infinito é executado (enquanto True:) que pesquisa continuamente a partir da fila de eventos e apenas ignora o loop se ele for encontrado vazio. Se um evento for encontrado, então é um TickEvent ou um OrderEvent e, em seguida, o componente apropriado é chamado para executá-lo. Nesse caso, é uma estratégia ou um manipulador de execução. O loop, em seguida, simplesmente dorme para "heartbeat" segundos (neste caso, 0,5 segundos) e continua.
Finalmente, definimos o ponto de entrada principal do código na função __main__. É bem comentado abaixo, mas vou resumir aqui. Em essência, instanciamos a fila de eventos e definimos os instrumentos / unidades. Em seguida, criamos a classe de transmissão de preços StreamingForexPrices e, posteriormente, o processador de execução Execução. Ambos recebem os detalhes de autenticação necessários fornecidos pela OANDA ao criar uma conta.
Em seguida, criamos a instância TestRandomStrategy. Finalmente, definimos os dois tópicos e depois os iniciamos:
Para executar o código, você simplesmente precisa colocar todos os arquivos no mesmo diretório e chamar o seguinte no terminal:
Note-se que, para parar o código nesta fase, é necessária uma dura matança do processo Python, através de "Ctrl-Z" ou equivalente! Eu não adicionei um tópico adicional para lidar com a procura do sys. exit () que seria necessário para parar o código com segurança. Uma maneira potencial de parar o código em uma máquina Ubuntu / Linux é digitar:
E depois passar a saída deste (um número de processo) para o seguinte:
Onde PROCESS_ID deve ser substituído pela saída de pgrep. Observe que esta não é particularmente boa prática!
Em artigos posteriores, estaremos criando um mecanismo de parada / início mais sofisticado que faz uso da supervisão do processo do Ubuntu para que o sistema comercial seja executado 24/7.
A saída após 30 segundos ou mais, dependendo da hora do dia em relação ao horário de negociação principal para EUR / USD, para o código acima, é dada abaixo:
As primeiras cinco linhas mostram os dados de marca JSON retornados de OANDA com os preços de lances / pedidos. Posteriormente, você pode ver a ordem de execução! saída, bem como a resposta JSON retornou da OANDA confirmando a abertura de um comércio de compra por 10.000 unidades de EUR / USD e o preço alcançado em.
Isso continuará funcionando indefinidamente até você matar o programa com um comando "Ctrl-Z" ou similar.
Qual é o próximo?
Em artigos posteriores, vamos realizar algumas melhorias tão necessárias, incluindo:
Estratégias reais - Estratégias forex adequadas que geram sinais lucrativos. Infraestrutura de produção - Implementação de servidor remoto e sistema de comércio monitorado 24/7, com capacidade de parada / início. Gerenciamento de portfólio e risco - Carteira e sobreposições de risco para todas as encomendas sugeridas da estratégia. Múltiplas estratégias - Construindo um portfólio de estratégias que se integram na sobreposição de gerenciamento de riscos.
Tal como acontece com o backtester baseado em eventos de ações, também precisamos criar um módulo forex backtesting. Isso nos permitirá realizar pesquisas rápidas e facilitar a implantação de estratégias.
settings. py (lembre-se de alterar ACCOUNT_ID e ACCESS_TOKEN!):
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.

Комментарии