Forex Algorithmic Trading: Um Conto Prático para Engenheiros
Publicados: 2022-03-11Como você deve saber, o mercado de câmbio (Forex ou FX) é usado para negociação entre pares de moedas. Mas você pode não estar ciente de que é o mercado mais líquido do mundo.
Alguns anos atrás, movido pela minha curiosidade, dei meus primeiros passos no mundo da negociação algorítmica Forex criando uma conta demo e jogando simulações (com dinheiro falso) na plataforma de negociação Meta Trader 4.
Depois de uma semana de 'negociação', quase dupliquei meu dinheiro. Estimulado por minha própria negociação algorítmica bem-sucedida, cavei mais fundo e, eventualmente, me inscrevi em vários fóruns de FX. Logo, eu estava passando horas lendo sobre sistemas de negociação algorítmicos (conjuntos de regras que determinam se você deve comprar ou vender), indicadores personalizados, humor do mercado e muito mais.
Meu primeiro cliente
Nessa época, coincidentemente, ouvi dizer que alguém estava tentando encontrar um desenvolvedor de software para automatizar um sistema de negociação simples. Isso foi nos meus tempos de faculdade, quando eu estava aprendendo sobre programação concorrente em Java (threads, semáforos e todo esse lixo). Eu pensei que esse sistema automatizado não poderia ser muito mais complicado do que meu trabalho avançado de ciência de dados, então perguntei sobre o trabalho e aceitei.
O cliente queria um software de negociação algorítmico construído com MQL4, uma linguagem de programação funcional usada pela plataforma Meta Trader 4 para realizar ações relacionadas a ações.
O papel da plataforma de negociação (Meta Trader 4, neste caso) é fornecer uma conexão com um corretor Forex. O corretor fornece uma plataforma com informações em tempo real sobre o mercado e executa suas ordens de compra/venda. Para leitores não familiarizados com a negociação Forex, aqui estão as informações fornecidas pelo feed de dados:
Através do Meta Trader 4, você pode acessar todos esses dados com funções internas, acessíveis em vários timeframes: a cada minuto (M1), a cada cinco minutos (M5), M15, M30, a cada hora (H1), H4, D1, W1, MN .
O movimento do Preço Atual é chamado de tick . Em outras palavras, um tick é uma mudança no preço Bid ou Ask para um par de moedas. Durante os mercados ativos, pode haver vários ticks por segundo. Durante os mercados lentos, pode haver minutos sem um carrapato. O carrapato é o batimento cardíaco de um robô do mercado de câmbio.
Quando você faz um pedido por meio dessa plataforma, você compra ou vende um determinado volume de uma determinada moeda. Você também define limites de stop-loss e take-profit. O limite de stop-loss é a quantidade máxima de pips (variações de preço) que você pode perder antes de desistir de uma negociação. O limite de lucro é a quantidade de pips que você acumulará a seu favor antes de sacar.
As especificações de negociação algorítmica do cliente eram simples: eles queriam um robô Forex baseado em dois indicadores. Como pano de fundo, os indicadores são muito úteis ao tentar definir um estado de mercado e tomar decisões de negociação, pois são baseados em dados anteriores (por exemplo, valor de preço mais alto nos últimos n dias). Muitos vêm embutidos no Meta Trader 4. No entanto, os indicadores nos quais meu cliente estava interessado vieram de um sistema de negociação personalizado.
Eles queriam negociar toda vez que dois desses indicadores personalizados se cruzassem, e apenas em um determinado ângulo.
Mãos em
Ao sujar as mãos, aprendi que os programas MQL4 têm a seguinte estrutura:
- [Diretivas do pré-processador]
- [Parâmetros Externos]
- [Variáveis globais]
- [Função de inicialização]
- [Função de desativação]
- [Iniciar Função]
- [Funções personalizadas]
A função start é o coração de todo programa MQL4, uma vez que é executada toda vez que o mercado se move (portanto, esta função será executada uma vez por tick). Este é o caso, independentemente do período de tempo que você está usando. Por exemplo, você poderia estar operando no timeframe H1 (uma hora), mas a função start seria executada milhares de vezes por timeframe.
Para contornar isso, forcei a função a ser executada uma vez por unidade de período:
int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...
Obtendo os valores dos indicadores:
// Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }
A lógica de decisão, incluindo a intersecção dos indicadores e seus ângulos:
int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }
Envio dos pedidos:
void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }
Se estiver interessado, você pode encontrar o código completo e executável no GitHub.

Backtesting
Depois de construir meu sistema de negociação algorítmico, eu queria saber: 1) se ele estava se comportando adequadamente e 2) se a estratégia de negociação Forex usada era boa.
Backtesting (às vezes escrito “back-testing”) é o processo de testar um determinado sistema (automatizado ou não) sob os eventos do passado. Em outras palavras, você testa seu sistema usando o passado como um proxy para o presente.
O MT4 vem com uma ferramenta aceitável para backtesting de uma estratégia de negociação Forex (hoje em dia, existem ferramentas mais profissionais que oferecem maior funcionalidade). Para começar, você configura seus prazos e executa seu programa sob uma simulação; a ferramenta simulará cada tick sabendo que para cada unidade ela deve abrir a um determinado preço, fechar a um determinado preço e atingir altos e baixos especificados.
Depois de comparar as ações do programa com os preços históricos, você terá uma boa noção se está ou não sendo executado corretamente.
Do backtesting, eu verifiquei a taxa de retorno do robô FX para alguns intervalos de tempo aleatórios; escusado será dizer que eu sabia que meu cliente não ia ficar rico com isso - os indicadores que ele escolheu, juntamente com a lógica de decisão, não eram rentáveis . Como exemplo, aqui estão os resultados da execução do programa na janela M15 para 164 operações:
Observe que nosso saldo (a linha azul) termina abaixo de seu ponto inicial.
Otimização de parâmetros e suas mentiras
Embora o backtesting tenha me deixado desconfiado da utilidade desse robô FX, fiquei intrigado quando comecei a brincar com seus parâmetros externos e notei grandes diferenças na taxa de retorno geral. Esta ciência em particular é conhecida como Otimização de Parâmetros .
Eu fiz alguns testes para tentar inferir o significado dos parâmetros externos na taxa de retorno e cheguei a algo assim:
Ou, limpo:
Você pode pensar (como eu) que deveria usar o Parâmetro A. Mas a decisão não é tão direta quanto pode parecer. Especificamente, observe a imprevisibilidade do Parâmetro A: para valores de erro pequenos, seu retorno muda drasticamente. Em outras palavras, é muito provável que o Parâmetro A superpreveja resultados futuros, uma vez que qualquer incerteza, qualquer mudança resultará em pior desempenho.
Mas, de fato, o futuro é incerto! E assim o retorno do Parâmetro A também é incerto. A melhor escolha, na verdade, é confiar na imprevisibilidade. Muitas vezes, um parâmetro com retorno máximo menor, mas previsibilidade superior (menor flutuação) será preferível a um parâmetro com retorno alto, mas previsibilidade ruim.
A única coisa que você pode ter certeza é que você não conhece o futuro do mercado, e pensar que sabe como o mercado vai se comportar com base em dados passados é um erro. Por sua vez, você deve reconhecer essa imprevisibilidade em suas previsões de Forex.
Isso não significa necessariamente que devemos usar o parâmetro B, porque mesmo os retornos mais baixos do parâmetro A têm um desempenho melhor do que o parâmetro B; isso é apenas para mostrar que a otimização de parâmetros pode resultar em testes que exageram os resultados futuros prováveis, e esse pensamento não é óbvio.
Considerações gerais de negociação algorítmica de Forex
Desde aquela primeira experiência de negociação algorítmica de Forex, construí vários sistemas de negociação automatizados para clientes, e posso dizer que sempre há espaço para explorar e mais análises de Forex a serem feitas. Por exemplo, eu recentemente construí um sistema baseado em encontrar os chamados movimentos de “Peixe Grande”; isto é, grandes variações de pips em minúsculas, minúsculas unidades de tempo. Este é um assunto que me fascina.
Construir seu próprio sistema de simulação FX é uma excelente opção para aprender mais sobre negociação no mercado Forex, e as possibilidades são infinitas. Por exemplo, você pode tentar decifrar a distribuição de probabilidade das variações de preços em função da volatilidade em um mercado (EUR/USD por exemplo), e talvez fazer um modelo de simulação de Monte Carlo usando a distribuição por estado de volatilidade, usando qualquer grau de precisão que você deseja. Vou deixar isso como um exercício para o leitor ansioso .
O mundo Forex pode ser esmagador às vezes, mas espero que este artigo tenha lhe dado alguns pontos sobre como começar sua própria estratégia de negociação Forex.
Leitura adicional
Hoje em dia, existe um vasto conjunto de ferramentas para construir, testar e melhorar as Automações do Sistema de Negociação: Trading Blox para teste, NinjaTrader para negociação, OCaml para programação, para citar alguns.
Li muito sobre o mundo misterioso que é o mercado de câmbio. Aqui estão alguns comentários que eu recomendo para programadores e leitores entusiastas:
- BabyPips: Este é o ponto de partida se você não sabe nada sobre negociação Forex.
- The Way of the Turtle, de Curtis Faith: Esta, na minha opinião, é a Bíblia Forex . Leia-o assim que tiver alguma experiência em negociação e conhecer algumas estratégias de Forex.
- Análise Técnica para o Profissional de Negociação – Estratégias e Técnicas para os Mercados Financeiros Globais Turbulentos de Hoje, por Constance M. Brown
- Programação de Expert Advisor – Criando Sistemas de Negociação Automatizados em MQL para Meta Trader 4, por Andrew R. Young
- Trading Systems – Uma Nova Abordagem para Desenvolvimento de Sistemas e Otimização de Portfólio, por Urban Jeckle e Emilio Tomasini: Muito técnico, muito focado em testes de câmbio.
- Uma Implementação Passo-a-Passo de um Sistema de Negociação de Moedas Multi-Agente, por Rui Pedro Barbosa e Orlando Belo: Este é muito profissional, descrevendo como você pode criar um sistema de negociação e plataforma de testes.