Sistema de Negociação Mecânica "Triângulo de Chuvashov's"

Genkov | 29 setembro, 2015


Introdução

O artigo lida com possibilidades de cálculo da localização das barras e intersecção de linhas de tendência com o tempo em perspectiva. As linhas de tendências tem o princípio de formação próxima de T, relacionadas com a construção do indicador DeMark (Tom DeMark) nos últimos intervalos.

O aplicativo oferecido pode ser integrado dentro de um sistema de negociação mais complexo, embora seja um Expert Advisor automatizado de pleno direito.


Princípios Básicos na Construção de Intersecção de Canais

A essência do padrão "Triângulo de Chuvashov" encontra-se na idéia de que temos sempre os dois últimos fractais de baixa e dois últimos de alta em qualquer ponto de todos os timeframes. Linhas de tendência são desenhadas através dos dois fractais de alta e dois de baixa.

Se estas 2 linhas se cruzam quando se delocam à direita formando um triângulo, então nós temos um padrão chamado "Triângulo de Chuvashov". O ponto de intersecção dessas duas linhas se cruzando é chamado de Ápice, totalizando 4 fractais de acordo com a sequência que ocorrem (esquerda para a direita).

Uma linha linha vertical é desenhada cruzando o segundo fractal esquerdo, também é desenhada uma linha vertical cruzando o Ápice (apex). O número de velas (candles) entre estas duas linhas verticais, incluindo as velas sobre as linhas, são divididas por 3 (arredondando), configuradas à esquerda do Ápice e uma terceira linha vertical é desenhada na vela atual.

A distância entre a vertical traçada no segundo fractal e a vertical na vela corrente ( 3ª linha vertical do meio) formam a atual área de rompimento.


Fig. 1. Desenhando o triângulo

Vamos partir para desenhar o triângulo.

Não podem existir múltiplas posições dos últimos 4 fractais, pois é impossível desenhar o triângulo ou ele acaba por ser demasiado curto ou longo.

Fig. 2. Exemplos de posições desfavorável dos fractais

Portanto, é necessário introduzir uma série de condições que são suficientes para desenhar o triângulo.

Lembrando, a numeração dos pontos de referência é realizada considerando que a "indexação dos elementos da série temporal é realizada para trás, do último ao primeiro, a barra atual que está sendo plotada é o último array com índice igual a 0". Segue então alguns requisitos de convergência das linhas do triângulo:

Estas condições adicionais foram consideradas no bloco de programa do padrão das condições de formação.


Fig. 3. Atual área de rompimento

Parece ser claro, vamos olhar para a Fig 3. Como podemos definir o número de barras, em que a intersecção das duas linhas irá ocorrer?

No momento do rompimento da linha, não se sabe ainda se este rompimento é real, embora já seja o momento de entrar no mercado! O bloco de cálculo da atual área de rompimento resolve este problema utilizando parâmetros de tempo, ou seja, define a intersecção das linhas de trabalho no intervalo de tempo.

Sabemos que cada barra aparece no gráfico depois de um certo tempo. Por exemplo, novas barras aparecerem no timeframe H1 a cada uma hora. Conhecendo a taxa de mudança de preço por unidade de tempo de cada uma das duas linhas, é possível calcular o tempo da intersecção. Sabendo qual a quantidade de tempo a partir da "base" do Triângulo até ao momento da intersecção (Ápice), é possível calcular o número de barras (unidades de tempo) antes da intersecção. A atual área de rompimento é definida no mesmo bloco.

O Expert Advisor foi projetado com uma base de bloco a bloco.

Os blocos funcionais mais frequentemente utilizados são tipicamente localizados no início do programa: abertura e fechamento de posições, as funções para desenhar os sinais e as linhas. O principal programa executável também contém blocos separados, tais como:

O fragmento dos blocos funcionais é mostrado abaixo.

// --------------------------------------------------------------------+
void Op_Sell_Ch()
  { 
  if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,2,Ask+SL_S*Point,
      Bid-TP_S*Point," ",Magic,0,Red)) 
      { Print("  SELL order open error  # ",GetLastError()); }
      return(0);
     }
// --------------------------------------------------------------------+
void Op_Buy_Ch()
  {
  if(!OrderSend(Symbol(),OP_BUY,Lots,Ask,2,Bid-SL_B*Point,
      Ask+TP_B*Point," ",Magic,0,Blue))
      { Print("  SELL order open error  # ",GetLastError()); }
      return(0);
     }
//+--------------------------------------------------------------------+
void Close_S_Ch()
  {
  if(!OrderClose(OrderTicket(),OrderLots(),Ask,2,Aqua))  
      {Print(" Cl.ord.# ",OrderTicket()," Error # ",GetLastError());}
      return(0);
     }
//+--------------------------------------------------------------------+

Os pontos de referência superior e inferior para a construção das linhas do triângulo são encontrados na classificação das barras através de um loop, conforme as regras da criação dos fractais.

A numeração dos pontos de referência é realizada considerando que "indexação dos elementos da série temporal é realizada para trás, do último ao primeiro. A barra atual que está sendo plotada é o último array com índice igual a 0".

// ====================================================================+
// (Fractais de alta e de baixa sendo procurados no bloco) ------------+
   for (i=M;i<=N;i++) // Pontos de referência (fractais) no loop de busca
    {//loop b
   // buscando por fractais de alta -----------------------------------+
   if(High[i]>High[i+1] && High[i]>High[i+2] && 
      High[i]>High[i-1] && High[i]>High[i-2])
     {// frac_b
      Tfnb++;   // contador 
   // ----------------------------  
     if(Tfnb==1)     
           {             // 1º fractal: preço, índice e tempo.
           TF1B=High[i]; Tf1b=i; timf1b=iTime(Symbol(),Period(),i); 
      }//-counter_1
   // ----------------------------
          if(Tfnb==2)    
           {//counter_2                       // preço, índice e tempo.
            TF2B=High[i]; Tf2b=i; timf2b=iTime(Symbol(),Period(),i); break;
           }//-counter_2
        // ----------------------------   
     }//-frac_b
    }//-b loop
// --------------------------------------------------------------------+
   for (i=M;i<=N;i++) // Pontos de referência (fractais) no loop de busca
    {//s loop
   // buscando por fractais de baixa ----------------------------------+
   if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && 
      Low[i]<Low[i-1] && Low[i]<Low[i-2])
     {// frac_s
      Tfns++; 
     if(Tfns==1)     
           {//counter_1                    // preço, índice e tempo
           TF1S=Low[i]; Tf1s=i; timf1s=iTime(Symbol(),Period(),i); 
           }//-counter_1
           if(Tfns==2)      
            {//counter_2                    // preço, índice e tempo.
            TF2S=Low[i]; Tf2s=i; timf2s=iTime(Symbol(),Period(),i); break;
           }//-counter_2
     }//-frac_s
    }//- loop s 
// ------------(Fractais de alta e de baixa buscando bloco)------------+

Lembrando novamente, a numeração dos pontos de referência é realizada considerando que a "indexação dos elementos da série temporal é realizada para trás, do último ao primeiro, a barra atual que está sendo plotada é o último array com índice igual a 0". As condições a seguir foram incluídas no bloco de convergência das linhas para formar o triângulo:

  1. Os primeiros fractais devem estar espaçados numa distância maior do que 20-30 pips;
  2. Os primeiros fractais da linha devem ser menores do que os segundos fractais de uma e outra;
  3. Todos os quatro pontos de referência são diferentes de "0", ou seja, eles têm valores reais;
  4. Parâmetros de tempo dos pontos de referência deve ser diferente de "0";
  5. O primeiro ponto de referência superior está abaixo do segundo superior e o primeiro ponto inferior é maior do que o segundo ponto inferior;
  6. A diferença entre as linhas dos segundos fractais não devem exceder a150 pips.

// ---------------------------------------------------------------------------+
   if((TF1B-TF1S)>25*Point && 
      Tf1b<=Tf2s && Tf1s<=Tf2b && 
      TF1B>0 && TF1S>0 && TF2B>0 && TF2S>0 && 
      timf1b!=0 && timf2b!=0 && timf1s!=0 && timf2s!=0 &&
      TF1B<TF2B && TF1S>TF2S && 
      (TF2B-TF2S)/Point<150)   
    {// condições para desenhar os triângulos
//===========================================================================+

Depois de cumprir as condições preliminares, calcular as taxas das variações de preços para as linhas de trabalho superiores e inferiores:

// --------------------------------------------------------------------------+
   // -   (Bloco de cálculo da taxa de mudança do preço) (pips superiores e inferiores por uma barra)
   if(TF1B!=TF2B) {RatePriceH=MathAbs((TF2B-TF1B)/(Tf2b-Tf1b));} // para a linha  superior
   if(TF1S!=TF2S) {RatePriceS=MathAbs((TF1S-TF2S)/(Tf2s-Tf1s));} // para a linha inferior 
   // Imprimir(" RatePriceS= ",RatePriceS); Imprimir(" RatePriceH= ",RatePriceH);
// -----------------------(Bloco de preço altera cálculo da taxa ------------+

Neste ponto, os 4 últimos fractais estão localizados de acordo com a condições de formação do triângulo, embora ainda não esteja claro o ponto do Ápice e onde a efetiva atual área de ruptura está localizada. O cálculo do Ápice (Apex) depende da localização do segundo fractal entre os últimos quatro formados (da esquerda para a direita no gráfico).

O ponto de partida da linha de trabalho deve ser definida como um ponto de intersecção de uma vertical traçada através do segundo fractal de alta, a linha inicia no 2º fractal (de alta) e define a direção no 4º fractal (de alta). A este respeito, o algoritmo do programa é ramificado em duas direções para cálculo da atual área de ruptura: 2º fractal de alta maior e 4ª fractal de alta menor.

Fragmentos da base de código relativos a uma das direções são mostrados abaixo. A segunda direção é calculada usando o mesmo algoritmo.

// жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 1. A linha de trabalho superior é maior do que a  inferior  жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ 
// - (Bloco de busca do ponto de intersecção da linha de trabalho) -----------------------------------------------------------+
// Se a linha de trabalho superior é maior do que a inferior - encontra o ponto de intersecção em 50 barras
   if(Tf2b>Tf2s && TF2B>TF1B && TF2S<TF1S)
    {// A linha de trabalho superior é nos fractais de alta
     // O preço de partida para o cálculo dos valores em cada barra da linha de trabalho superior 
     Starting_Price_H=TF2B-RatePriceH*(Tf2b-Tf2s); 
     // O preço de partida para o cálculo dos valores em cada barra da linha de trabalho superior 
     Starting_Price_S=TF2S;
     // o tempo para desenhar a linha vertical na base do triângulo
     time_starting=timf2s; 
     // ------------------------------------
    for(int k=1;k<=50;k++)
    {//50b loop
     PricB[k]=Starting_Price_H-RatePriceH*k;      // diminui taxa descendente 
     PricS[k]=Starting_Price_S+RatePriceS*k;      // soma taxa ascendente
                            //      Se os preços das projeções das linhas superiores e inferiores coincidem  
    if(PricB[k]<=PricS[k])  // Tornou-se menor do que a inferior, então existe a intersecção com a linha de trabalho 
     {//existe a intersecção
     P_Tria=PricB[k-1];                                        // Preço da interseção da linha de trabalho (-1) - deve ser uma barra menor
     cut_left=k;  break;                                       // Número de barras a partir da base até o ponto de interseção
     }//- existe uma intersecção
    }//-50b loop
// -------------------------------------- (Bloco de busca do ponto de interseção da linha de trabalho)+-----------------------+

Agora, podemos começar a calcular os parâmetros de tempo da atual área de rompimento:

// ---------------------------------------------------------------------------+
// - (Bloco de calcular intervalos de tempo para a atual área de rompimento)------------------+
// Apresenta duas limitações adicionais:
// 1. O Ápice (Apex)  não deve estar localizado mais do que 50 barras da base do triângulo
// 2. O Ápice (Apex)  não deve estar localizada a menos do que 15 barras da base do triângulo.
   if(cut_left<50 && cut_left>12)
    {//triângulo com todas as limitações
     time_Apex=timf2s+cut_left*T_period;                        // Tempo de formação do Ápice
     //  Dividir o número de barras por três, tomar 2/3 e arrendodar para o número inteiro maior
     // valor: MathRound(cut_left/3*2) - número de barras para atual área de rompimento
     time_bar_zona=time_starting+MathRound(cut_left/3*2)*T_period;          //tempo de área
     //     condições cumpridas para criação padrão, calculada a atual área de rompimento  
     PatternTch=true;                          // formado o padrão "Triângulo de Chuvashov"
     {//-triângulo com todas as limitações
// -----(Bloco de calcular intervalos de tempo para a atual área de rompimento)-----+

Agora, depois do padrão ter sido formado, o bloco de desenho do triângulo pode iniciar a sua operação:

// - (Bloco de desenho do triângulo após o padrão foi formado) -----------+
   if(PatternTch==true)
    {//existe um padrão
    Del_Frb(); Del_Frs();       // Excluir fractais superiores e inferiores anteriores
    CreateArrow_Frb(); CreateArrow_Frs();  // Desenhar fractais superiores e inferiores
    Create_Tr_H(); Create_Tr_S();       // Desenhar linhas de tendência superior e inferior
    CreateLzona(); CreateLbasis(); CreateLApex();    // Desenhar linhas verticais
    CreateTriangleH();               // Desenhar o triângulo pela linha superior,
    ObjectDelete("TRS");   // deletar o desenho do triângulo pela linha inferior
// -----(Bloco de desenho do triângulo após o padrão formado) --------+ 
A imagem abaixo mostra a operação do bloco de desenho padrão "Triângulo de Chuvashov" :

O bloco de abertura de posições, passando para a ação.

Se estiverem reunidas as condições para uma abertura de posição, o desenho do canal com a linha de trabalho superada pelo preço é calculado. O canal é criado.

StopLoss e TakeProfit serão calculados considerando-se os requisitos do sistema de gestão de dinheiro e a posição será aberta (neste caso, uma posição COMPRADA - veja a imagem abaixo).

No entanto, as posições podem ser abertos em ambos os sentidos, se estiverem reunidas as condições para a abertura em ambas as direções (veja a imagem abaixo).

O programa então controla o tempo de vida do padrão.

Se o tempo corrente excede o tempo do atual rompimento, o programa proibe a abertura de posições. Se o tempo corrente excede o Ápice, o programa elimina todos os desenhos padrão, limpando o gráfico dos sinais e linhas já desnecessárias.

Código do bloco de vida padrão é mostrado abaixo.

// - (Bloco definindo o tempo de vida do padrão) ------------------------+
// Se o tempo corrente exceder o tempo limite da atual área de rompimento, o padrão perde o seu poder
   if((TimeCurrent()-time_bar_zona)>=T_period)
    {
     PatternTch=false; // o padrão está desatualizado - proibir a abertura de posições
    }
    // após o tempo corrente exceder o Ápice
    if((TimeCurrent()-time_Apex)>=T_period) 
     {
      // deletar sinais padrão e linhas do gráfico 
      Del_Frs(); Del_Frb(); Del_TrLin();
      // deletar as linhas do canal tamanho do lucro pela linha de trabalho superior 
      ObjectDelete("Tr_B1h"); ObjectDelete("Tr_B1hh"); ObjectDelete("Tr_B1hs");ObjectDelete("Tr_B1s");
      // deletar as linhas do canal tamanho do lucro pela linha de trabalho inferior 
      ObjectDelete("Tr_S1s"); ObjectDelete("Tr_S1sh"); ObjectDelete("Tr_S1ss");ObjectDelete("Tr_S1h");
      // deletar as linhas verticais da atual área de rompimento
      ObjectDelete("L1");ObjectDelete("zona");ObjectDelete("Ap");
      ObjectDelete("TRH"); ObjectDelete("TRS");
     }
// ------(Bloco de definição de tempo de vida do padrão) -+

Os resultados desta operação do bloco são apresentados no lado direito da imagem anterior.

O Expert Advisor aqui apresentado mostrara resultado positivo como um sistema de negociação mecânico durante o teste automático:


A breve conclusão é a seguinte:

A técnica descrita pode ser utilizada por traders como um componente do sistema de negociação, mas filtros de abertura de posição devem ser adicionados como uma melhoria.

Os filtros propostos anteriormente aqui neste documento podem ser melhorados, tal como recomendado pelo autor da técnica Stanislav Chuvashov.


Notas para os arquivos anexados: