Exemplo de desenvolvimento de uma estratégia de spread nos futuros da MICEX-RTS

MetaQuotes | 6 fevereiro, 2017

A MetaTrader 5 permite desenvolver e testar robôs que negociam simultaneamente em vários instrumentos. O testador de estratégia embutido na plataforma baixa automaticamente - a partir do servidor de negociação da corretora - o histórico de ticks e leva em conta as especificações do contrato, assim, o desenvolvedor não precisa fazer nada com suas mãos. Isto torna possível reproduzir com facilidade e confiança todas as condições do ambiente de negociação, até intervalos de milissegundos entre o surgimento de ticks em símbolos diferentes. Neste artigo, vamos mostrar como desenvolver e testar estratégias de spread em dois futuros da Bolsa de Valores de Moscou (MICEX-RTS).


Correlação inversa dos símbolos Si e RTS

Na MICEX-RTS, são negociados futuros tipo Si-M.Y e RTS-M.Y, eles estão bastante aparentados entre si. Neste caso, M.Y denota a data de expiração do contrato:

O Si é  um contrato de futuro para o dólar estadunidense/rublo ruso, enquanto o RTS é um contrato de futuro, para o RTS Index, denominado em dólares estadunidenses. Como o RTS Index inclui ações de empresas rusas, cujos preços são denominados em rublos, as flutuações USD/RUR são refletidas também nas flutuações do índice expresso em dólares estadunidenses. Nos gráficos destes instrumentos, você pode ver que, com o crescimento de um ativo, geralmente o segundo cai.


Para uma melhor visualização, traçamos em ambos gráficos o canal desvio padrão.


Calculamos a regressão linear entre Si e RTS

Nós podemos expressar a relação entre os dois instrumentos, utilizando uma equação de regressão linear da forma Y(X)=A(X)+B. Para verificar, escrevemos o script CalcShowRegression_script.mq5, ele pega duas matrizes de preços de fechamento, calcula os coeficientes e exibe o diagrama de distribuição com a linha de regressão, no gráfico.

Para calcular os coeficientes de regressão, é usada a função da biblioteca ALGLIB, a plotagem é feita pelas classes gráficas da Biblioteca padrão.



Construímos o indicador de spread entre o Si e o sintético

Obtivemos os coeficientes de regressão linear, e agora nós podemos construir um gráfico sintético da forma Y(RTS) = A*RTS+B. A diferença entre o ativo original e o sintético é chamada de spread. Esta diferença pode variar em cada barra, de valores positivos para negativos.

Para visualizar o spread, vamos escrever o indicador TwoSymbolsSpread_Ind.mql5, ele exibe o spread sob a forma de um gráfico de colunas sobre os dados para as últimas 500 barras. Os valores positivos de spread são plotados em azul, os negativos, em amarelo.

No Diário do Expert, o indicador atualiza e registra os coeficientes de regressão linear, após a abertura de cada nova barra. Ao fazer isto, ele aguarda o momento em que uma nova vela abre para ambos os instrumentos, isto é, o Si e o RTS. Assim, o indicador permite monitorar a exatidão dos cálculos.


Construímos o gráfico de regressão linear no gráfico de spread para as últimas 100 barras

O indicador de spread mostra que a diferença entre os futuros Si e o instrumento sintético muda periodicamente. Para avaliar a tendência atual, criamos um indicador SpreadRegression_Ind.mq5 (spread e regressão linear sobre ele), ele traça a linha de tendência no gráfico de spread. Os parâmetros de linha são calculados novamente por regressão linear. Colocamos ambos os indicadores no gráfico para depuração.

A linha de tendência vermelha muda sua inclinação de acordo com o valor do spread nas últimas 100 barras. Basicamente, agora temos, pelo menos, os dados necessários, para tentar construir um sistema de negociação.


Estratégia №1 — alteração da inclinação da regressão linear no gráfico de spread

No indicador TwoSymbolsSpread_Ind.mql5, os valores do spread são calculados como a diferença entre Si e Y(RTS)=A*RTS + B. Você pode facilmente verificar isso executando o indicador sob depuração (tecla F5).


Fazemos um EA simples que controle as alterações no ângulo de inclinação da regressão linear sobreposto no gráfico de spread. O ângulo de inclinação da linha não é nada mais que o coeficiente A na equação Y=A*X+B. No gráfico de spread, com uma tendência positiva A>0, com uma negativa A<0. Calculamos a regressão linear, nos últimos 100 valores do gráfico de spread. Eis parte do código a partir do Expert Advisor Strategy1_AngleChange_EA.mq5.

#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| tipo de estratégia de spread                                             |
//+------------------------------------------------------------------+
enum SPREAD_STRATEGY
  {
   BUY_AND_SELL_ON_UP,  // Buy 1-st, Sell 2-nd
   SELL_AND_BUY_ON_UP,  // Sell 1-st, Buy 2-nd
  };
//---
input int       LR_length=100;                     // número de barras para regressão no spread
input int       Spread_length=500;                 // número de barras para calcular o spread
input ENUM_TIMEFRAMES  period=PERIOD_M5;           // timeframe
input string    symbol1="Si-12.16";                // primeiro símbolo do par
input string    symbol2="RTS-12.16";               // segundo símbolo do par
input double    profit_percent=10;                 // lucro que fixamos em porcentagem
input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // tipo de estratégia de spread
//--- identificador dos indicadores
int ind_spreadLR,ind,ind_2_symbols;
//--- classe para negociações
CTrade trade;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- coeficiente A de inclinação da regressão linear no gráfico de spread Y(X)=A*X+B
   static double Spread_A_prev=0;
   if(isNewBar())
      PrintFormat("Nova barra %s foi aberta em %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- aguardamos até que os dados do indicador sejam atualizados, uma vez que ele funciona em dois símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- no gráfico de spread, obtemos o valor da regressão para as barras com índices 1 e 2 ("ontem" e "anteontem")
      double LRvalues[];
      double Spread_A_curr;
      int copied=CopyBuffer(ind_spreadLR,1,1,2,LRvalues);
      if(copied!=-1)
        {
         //--- coeficiente de regressão linear na última barra concluída ("de ontem")
         Spread_A_curr=LRvalues[1]-LRvalues[0];
         //--- se a inclinação da regressão mudar, o produto da atual e anterior será menor do que zero
         if(Spread_A_curr*Spread_A_prev<0)
           {
            PrintFormat("A linha LR mudou a inclinação, Spread_A_curr=%.2f, Spread_A_prev=%.2f: %s",
                        Spread_A_curr,Spread_A_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- se não houver posições abertas, entramos no mercado segundo os dois símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_A_curr-Spread_A_prev>0,strategy,symbol1,1,symbol2,1);
            //--- exitem posições abertas, por tanto fazemos a reversão
            else
               ReverseTrades(symbol1,symbol2);
           }
         //--- a inclinação da regressão não mudou, verificamos o lucro flutuante, talvez já esteja na hora de fechar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- ao atingir o nível necessário de lucro flutuante, fixamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
              }
           }
         //--- memorizamos a direção da tendência para comparar, na abertura da nova barra
         Spread_A_prev=Spread_A_curr;
        }
     }
  }

A fim de não fazer a suposição de o que é preciso comprar e o que vender, durante a uma mudança da tendência, simplesmente adicionamos no Expert Advisor um parâmetro externo que permite transformar as regras da negociação:

input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // tipo de estratégia de spread

Agora podemos começar a testar e depurar o Expert Advisor.


Teste da Estratégia de negociação №1

Para depurar a nova estratégia, é melhor usar o modo de teste visual. Para fazer isso, no menu Ferramentas-Opções-Depuração, defina todos os dados necessários:

  1. Símbolo
  2. Período
  3. Intervalo de teste
  4. Modo de negociação
  5. Tamanho do depósito
  6. Modo de geração de ticks

Para instrumentos bolsistas recomendamos escolher "Cada tick é baseado num tick real". Neste caso, o teste andará nos dados históricos registrados, e você obterá resultados, mais próximo do real, as condições de negociação.

O servidor de negociação MetaTrader 5 recolhe automaticamente todos os ticks que entram a partir da bolsa e envia para o terminal todo o histórico na primeira solicitação.


Neste modo de depuração, você pode visualmente passar por todo o teste e verificar os valores de todas as variáveis, ​​nos lugares apropriados, no seu código, usando pontos de interrupção. Os indicadores - a serem usados no robô de negociação - serão automaticamente carregados no gráfico, você não terá de fazer nada manualmente.


Depois que o código do EA é depurado, podemos otimizar os parâmetros.


Otimização da Estratégia de negociação №1

No Expert Advisor Strategy1_AngleChange_EA.mq5 existem vários parâmetros externos que podem ser selecionados por meio da otimização (destacado em amarelo):

input int       LR_length=100;                     // número de barras para regressão no spread
input int       Spread_length=500;                 // número de barras para calcular o spread
input double    profit_percent=10;                 // lucro que fixamos em porcentagem

input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // tipo de estratégia de spread

No entanto, neste caso, vamos otimizar apenas o parâmetro profit_percent para as duas variantes da estratégia, a fim de entender se há alguma diferença entre elas. Em outras palavras, fixamos o valor do parâmetro strategy e otimizamos segundo o parâmetro profit_percent de 0.2 a 3.0%, para ver o quadro geral das duas maneiras de negociar com a mudança na inclinação da linha.

Para a regra BUY_AND_SELL_ON_UP (compramos o primeiro ativo, vendemos o segundo), quando a inclinação da linha muda de negativo para positivo, a otimização não dá resultados muito bons. Em geral, este método de entrada no mercado não parece atraente, uma vez que temos perdas muitas vezes, ao testar no intervalo de 2 meses.


Quando se utiliza a regra SELL_AND_BUY_ON_UP (vendemos o primeiro ativo, compramos o segundo), os resultados de otimização são melhores, isto é, 5 de 15 otimizações mostram algum lucro.


A otimização foi realizada no histórico de 1 de agosto a 30 de setembro de 2016 (intervalo de dois meses). Em geral, ambas as variantes de negociação não parecem promissoras. Talvez o problema seja que, para abertura de posição, nós utilizamos um indicador que se atrasa muito, isto é, o declive da linha de tendência para as últimas 100 barras. Tentemos desenvolver a segunda variante da estratégia.


Estratégia №2 — alteração do signo do spread na barra concluída

Na segunda estratégia, vamos acompanhar as mudanças do signo do spread. Vamos olhar apenas para os valores das barras formadas, nomeadamente, na abertura da nova barra "hodierna". Se, na barra de "anteontem", o spread for negativo e, na barra de "ontem", for positivo, acreditamos que o spread virou para cima (UP). Novamente, no código, é deixada em aberto a possibilidade de negociar a mudança do spread em qualquer direção, isto é, podemos definir a direção de entrada utilizando o parâmetro strategy. Eis o bloco de código do Expert Advisor Strategy2_SpreadSignChange_EA.mq5:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- valor anterior do spread como a diferença Symbol1 e Y(Symbol2)=A*Symbol2+B
   static double Spread_prev=0;
   if(isNewBar())
      PrintFormat("Nova barra %s foi aberta em %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- aguardamos até que os dados do indicador sejam atualizados, uma vez que ele funciona em dois símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtemos os valores do spread para as barras com índices 1 e 2 ("ontem" e "anteontem")
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,1,2,SpreadValues);
      double Spread_curr=SpreadValues[1];
      if(copied!=-1)
        {
         //--- se o signo do spread mudar, o produto da atual e anterior será menor do que zero
         if(Spread_curr*Spread_prev<0)
           {
            PrintFormat("O spread mudou de signo, Spread_curr=%.2f, Spread_prev=%.2f: %s",
                        Spread_curr,Spread_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- se não houver posições abertas, entramos no mercado segundo os dois símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_curr>0,strategy,symbol1,1,symbol2,1);
            //--- há posições abertas, fazemos a reversão
            else
               ReverseTrades(symbol1,symbol2);
           }
         //--- o signo do spread não mudou, verificamos o lucro flutuante, talvez já esteja na hora de fechar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- atingido o nível necessário, fixamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
              }
           }
         //--- memorizamos o valor do spread para comparação na abertura da nova barra
         Spread_prev=Spread_curr;
        }
     }
  }

Em primeiro lugar, como de costume, fazemos a depuração do robô de negociação no modo de teste visual, e, depois, executamos a otimização de acordo com o parâmetro profit_percent, como para a primeira estratégia. Resultados:



Como vemos, para a segunda estratégia, a regra "Vendemos o primeiro ativo e compramos o segundo" dá os mesmos resultados decepcionantes de teste como para o primeiro. Ao acontecer isto, a regra de "Vendemos o primeiro ativo e compramos o segundo" dá mais perdas, em todas as otimizações.

Vamos tentar fazer a terceira variante da estratégia.


Estratégia №3 — alteração do signo do spread na barra atual com confirmação em N ticks

As duas estratégias anteriores trabalhavam apenas com a abertura da barra, ou seja, analisavam a alteração apenas nas barras totalmente concluídas. Vamos agora tentar trabalhar dentro da barra atual. Vamos analisar as alterações no spread a cada tick, e, se, na barra anterior concluída e a barra atual em desenvolvimento, os signos do spread forem diferentes, julgamos que a direção do spread mudou.

Nós também exigimos que a alteração no sinal do spread fiquem estáveis nos últimos N ticks, é assim como estamos tentando nos livrar de sinais falsos. Para fazer isso, adicionamos ao Expert Advisor o parâmetro externo ticks_for_trade= 10. Se, nos últimos 10 ticks, o signo do spread for negativo e o signo da barra anterior for positiva, entramos no mercado. Esta é a função OnTick() do Expert Advisor Strategy3_SpreadSignOnTick_EA.mq5.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(isNewBar())
      PrintFormat("Nova barra %s foi aberta em %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- aguardamos até que os dados do indicador sejam atualizados, uma vez que ele funciona em dois símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtemos o valor do spread na barra atual ("hoje") e anterior ("ontem")
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,0,2,SpreadValues);
      double Spread_curr=SpreadValues[1]; // spread na barra atual em desenvolvimento
      double Spread_prev=SpreadValues[0]; // spread na barra anterior concluída
      if(copied!=-1)
        {
         //--- se a alteração no sinal do spread permanecer nos últimos ticks ticks_for_trade
         if(SpreadSignChanged(Spread_curr,Spread_prev,ticks_for_trade))
           {
            PrintFormat("O spread mudou de signo, Spread_curr=%.2f, Spread_prev=%.2f: %s",
                        Spread_curr,Spread_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- no gráfico, mostramos os valores dos últimos ticks ticks_for_trade para ambos os dois símbolos
            ShowLastTicksComment(ticks_for_trade);
            //--- se não houver posições abertas, entramos no mercado segundo os dois símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_curr>0,strategy,symbol1,1,symbol2,1);
            //--- há posições abertas, fazemos a reversão
            else
               ReverseTrades(Spread_curr>0,positionstype,symbol1,symbol2);
           }
         //--- o signo do spread não mudou, verificamos o lucro flutuante, talvez já esteja na hora de fechar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- ao atingir o nível necessário de lucro flutuante, fixamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
               positionstype=0;
              }
           }
        }
     }
   }

Neste EA, nós adicionamos a função ShowLastTicksComment(), ela exibe, no gráfico, no momento em que surge o sinal, os valores dos últimos N ticks para ambos os símbolos. Desta forma, podemos testar visualmente a estratégia e ver as alterações dos ticks com uma precisão de milissegundos.

Executamos as mesmas variantes de otimização, como nas estratégias anteriores, e obtemos os seguintes resultados:

"Compramos o primeiro ativo e vendemos o segundo"


"Vendemos o primeiro ativo e compramos o segundo"


Os resultados, ao realizar essa otimização tão simples, não melhoraram muito.


Estratégia №4 — atingimento, pelo spread, do valor especificado em porcentagem

Criamos a quarta, a última estratégia para negociar o spread. Vai ser tão simples como as três anteriores, isto é, o sinal de negocião surge quando o spread é - a partir do preço do primeiro ativo - o valor definido spread_delta em porcentagem. O manipulador dos ticks entrantes OnInit() mudou um pouco, eis o código a partir do EA Strategy4_SpreadDeltaPercent_EA.mq5.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(isNewBar())
      PrintFormat("Nova barra %s foi aberta em %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- aguardamos até que os dados do indicador sejam atualizados, uma vez que ele funciona em dois símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtemos o valor do spread na barra atual ("hoje")
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,0,1,SpreadValues);
      double Spread_curr=SpreadValues[0]; // spread na barra atual em desenvolvimento
      if(copied!=-1)
        {
         MqlTick tick;
         SymbolInfoTick(symbol1,tick);
         double last=tick.last;
         double spread_percent=Spread_curr/last*100;
         //--- se o spread em % atingir o valor spread_delta
         if(MathAbs(spread_percent)>=spread_delta)
           {
            PrintFormat("O spread atingiu %.1f%% (%G) %s",
                        spread_percent,TimeToString(TimeCurrent(),TIME_SECONDS),
                        Spread_curr);
            //--- se não houver posições abertas, entramos no mercado segundo os dois símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_curr,strategy,symbol1,1,symbol2,1);
            //--- há posições abertas, fazemos a reversão
            else
               ReverseTrades(Spread_curr,positionstype,symbol1,symbol2);
           }
         //--- o spread está dentro do nível aceitável, verificamos o lucro flutuante, talvez já esteja na hora de fechar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- ao atingir o nível necessário de lucro flutuante, fixamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
               positionstype=0;
              }
           }
        }
     }
  }

Do mesmo modo, vamos fechar a posição, após atingir a porcentagem definida profit_percent=2, desta vez para torná-la fixa. Executamos a otimização segundo o parâmetro spread_delta no intervalo de 0.1 a 1%.

"Compramos o primeiro ativo e vendemos o segundo"


"Vendemos o primeiro ativo e compramos o segundo"


Desta vez, a primeira regra "Compramos o primeiro ativo e vendemos o segundo" parece muito melhor do que a segunda. A otimização nas outras configurações pode ser feita por você sozinho.


MetaTrader 5 — ambiente de desenvolvimento de estratégias de negociação

Neste artigo, nós abordamos 4 estratégias simples para negociar no spread. Os resultados de teste e otimização apresentados por este sistema não devem ser tomados como um padrão a seguir, uma vez que eles foram obtidos num intervalo limitado e podem ser um tanto aleatórios. Neste artigo, mostramos quão confortável é verificar e depurar as ideias de negociação, na MetaTrader 5.

Para os desenvolvedores de sistemas de negociação automatizados, na MetaTrader 5, o testador oferece as seguintes possibilidades convenientes:

O testador de estratégias de negociação, neste artigo, foi usado como uma ferramenta de pesquisa e procura da direção certa, isto foi feito sob a forma de otimização num parâmetro para obter rapidamente conclusões qualitativas. Você pode adicionar novas regras, modificar as já existentes e expor a otimização total os EAs obtidos. Para acelerar a grande quantidade de cálculos, use a rede global de computação em nuvem MQL5 Cloud Network, ela é especialmente concebida para a plataforma MetaTrader 5


Observações necessárias sobre as estratégias

Normalmente, ao procurar símbolos para compor o spread, elas não usam os valores absolutos do preço, mas sim os de o incremento. Eu seja, em vez de uma série Close[i], elas calculam Delta[i]=Close[i]-Close[i-1].

Para uma negociação equilibrada, você deve selecionar o volume para cada símbolo do spread. No artigo, durante o teste, foram usados apenas volumes de 1 lote, em cada símbolo.

Ao realizar o teste, são usadas as configurações atuais nas especificações dos contratos do Si e RTS. Deve notar-se que:


A metodologia para o cálculo pode ser encontrada no site MOEX — http://fs.moex.com/files/3244. É por isso que devemos ter em mente que, no testador de estratégias, os resultados da otimização vão depender da taxa de câmbio no momento do teste. No artigo, são utilizadas capturas de tela dos resultados da otimização, realizada a 25 de outubro de 2016.

O código é escrito para trabalhar em condições de perfeito desempenho, isto é, sem processamento de resultados de envio de ordens, não são processados erros associados à perda de conexão, não são tidas em conta as comissões, não há derrapagem.

Para futuros, a liquidez e a extensão do conteúdo dos gráficos melhoram perto do tempo de expiração do contrato. No código, não há manipulação explícita da situação, quando, num símbolo, aparecem cotações e, no segundo, são ignoradas barras inteiras (na bolsa de valores, nesse momento, não foram levadas a cabo negociações por qualquer motivo). Embora os próprios indicadores, utilizados no EA, estão à espera da sincronização de barras, em ambos os símbolos, para calcular o valor do spread, são registrados esses eventos no log.

Não é abordada a análise estatística dos desvios de spread a partir dos valores médios para criar regras de negociação mais confiáveis.

Não é usada a analise do livro de ofertas, já que o fluxo de ordens não é emulado, no testador da MetaTrader 5.

Nota: os indicadores - a serem utilizados neste artigo - recalculam dinamicamente os coeficientes de regressão linear para a criação de gráficos de spread e linhas de tendência. Por conseguinte, ao finalizar o teste, a forma dos gráficos e valores dos indicadores atualmente vão ser diferentes daqueles que estavam durante o teste.

Execute os indicadores anexados ou Expert Advisors no modo de teste visual, para ver como isso acontece no modo de tempo real.


Artigos relacionados:


Programas utilizados no artigo:

#
 Nome
Tipo
Descrição
1
CalcShowRegression_script.mq5
Script
Calcula os coeficientes de regressão linear e exibe um gráfico de dispersão com uma linha de tendência (é usada a classe SGraphice e a função a partir da Alglib)
2
TwoSymbolsSpread_Ind.mql5
Indicador
Indicador que desenha um histograma de spread em dois símbolos
3
SpreadRegression_Ind.mq5
Indicador Indicador que desenha um gráfico de spread e uma linha de regressão nele
4
Strategy1_AngleChange_EA.mq5
Expert Advisor
Estratégia №1. Negociação com base na alteração do signo do coeficiente A da regressão linear, na equação Y=A*X+B. Análise e aberturas de posição apenas ao abrir uma nova barra
5
Strategy2_SpreadSignChange_EA.mq5 Expert Advisor Estratégia №2. Negociação com base na alteração do signo no valor do spread. Análise e aberturas de posição apenas ao abrir uma nova barra
6
Strategy3_SpreadSignOnTick_EA.mq5
Expert Advisor
Estratégia №3. Negociação com base na alteração do signo no valor do spread. Análise e aberturas de posição dentro da barra atual, a alteração no sinal deve permanecer nos últimos N ticks
7 Strategy4_SpreadDeltaPercent_EA.mq5 
Expert Advisor
Estratégia №4. Negociação com base no atingimento do valor especificado em porcentagem do spread Análise e aberturas de posição dentro da barra atual, no primeiro tick adequado.