English Русский 中文 Español Deutsch 日本語
Sistema de Negociação mecânica "Chuvashov's Fork"

Sistema de Negociação mecânica "Chuvashov's Fork"

MetaTrader 4Sistemas de negociação | 21 setembro 2015, 09:07
1 063 1
Genkov
Genkov

"Estamos interessados nos valores mais recentes, a fim de produzir linhas de tendência"
Thomas DeMark

Introdução

Stanislav Chuvashov propôs uma técnica de negociação Forex usando o padrão "Chuvashov's Fork". Nesta técnica, a abordagem na análise do mercado tem algo em comum com a abordagem de Thomas DeMark, tem por objetivo desenhar as linhas de tendência no último intervalo de tempo mais próximo.


1. Um método para desenhar as linhas no padrão "Chuvashov's Fork".

Os indicadores fractais são usados para desenhar o padrão "Chuvashov's Fork" . A principal linha de tendência é desenhada ao ligar por dois fractais vizinhos (1 e 2), conforme mostrado no gráfico de preços (ver Figura abaixo). A principal linha de tendência de alta é desenhada com base nos fractais de baixa; a principal linha de tendência de baixa é elaborado com base em fractais de alta.


Figura 1. Desenhar o padrão "Chuvashov's Fork"

Devemos esperar até que um fractal semelhante ao 3 seja formado, após a principal linha de tendência quebrar na direção oposta. A linha lateral que passa nos fractais 2 e 3 em conjunto com a principal linha de tendência forma o padrão "Chuvashov's Fork" (CF). Este é o nome dado ao padrão pelo autor Stanislav Chuvashov.

O principal requisito para o padrão CF é que a linha lateral do garfo deva ser na direção da tendência. Os sinais são orignados no rompimento das linhas laterais: vender na tendência de alta e comprar na baixa.

Abaixo uma seqüência da formação do padrão "Fork do Chuvashov" como exemplificado, no EURUSD H1 ao longo de 4 dias consecutivos.


Figura 2. Formação do padrão "Chuvashov's Fork"

A Figura 2 mostra o surgimento do padrão "Chuvashov's Fork" (CF) sobre a tendência de alta, sugerindo o fim da tendência ou a tendência lateral. O EA abriu uma posição SELL.


Figura 3. Novo padrão CF

6 barras (horas) mais tarde, um novo padrão CF com um intervalo mais amplo emergiu (Fig. 3), confirmando o padrão anterior que sugeria a reversão da tendência ou lateralidade.

O EA fechou a posição SELL anterior no Take Profit e abriu uma nova posição SELL nas condições do padrão CF.


Figura 4. Padrão de confirmação CF

Figo. 4 mostra que, após a inversão da tendência em 11 de outubro, a tendência estava indo para baixo, sendo confirmado pelo padrão CF no início de 12 de outubro, direção de baixa.

No meio do dia, uma nova inversão da tendência começou a tomar forma, pois o preço caminhou para a linha CF lateral. Após o cruzamento da linha lateral, a posição SELL existente pode ser fechada e uma posição BUY pode ser aberta.


Figura 5. Inversão da tendência

Como pode ser visto na Fig. 5, a tendência manteve-se subindo no restante do dia 12 e início do dia 13 de outubro. Por volta meio do dia, um padrão CF para cima surgiu. Outra inversão da tendência começa a se mostrar no meio do dia 13 de outubro. Seguindo os sinais formados, o EA irá fechar a posição de compra e abrir uma posição SELL.

A sequência da formação dos padrões acima pode ser rastreada utilizando o testador de estratégia no modo de visualização a uma velocidade baixa, testando o arquivo Fork_Ch_ExpertH1_v2.mq4 anexado como um Expert Advisor.


Figura 6. Sinais de negociação

A Figura 6 fornece alguns esclarecimentos em termos de sinais para abrir e fechar as posições.


2. Algumas características do código proposto para "Chuvashov's Fork" em MQL4

A lista de variáveis, funções para abrir e fechar ordens, funções para desenhar marcas e linhas de tendência são deixados sem comentários no código abaixo e não são fornecidos no artigo, uma vez que podem ser encontrados nos programas para os arquivos anexados e são simples o suficiente para descobrir.

Note que algumas variáveis são incluídas na função Start() do programa principal, pois devem ser zeradas a cada tick.

Começamos com a procura para os últimos três fractais consecutivos, por exemplo, os situados ao longo de uma tendência de baixa. Neste caso, temos um garfo dirigido para baixo. Se houver um rompimento acima da linha lateral, uma posição de compra pode ser aberta.

// ===================================================================
// Loop para procurar os últimos três fractais consecutivos (caso de COMPRA)
// Encontra-se ao longo da tendência de baixa para construção do Chuvashov's Fork 
// ==================================================================+
   for (i=M;i<=N;i++)
    {//loop
    if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1] && High[i]>High[i-2])
     {
      VFN++; // Contador do fractal encontrado.

      if(VFN==1) // f1
      { Vnf1=i;                // Armazena o número da Máxima de preço da barra no fractal encontrado.
        VMF1=High[i];          // Armazena o valor da Máxima do preço do primeiro fractal encontrado.
        tim1=iTime(NULL,0,i);  // Armazena o tempo do segundo ponto de referência.
      } //-f1 

    // --------------------------------------------------------------+
      if(VFN==2)                // Se o segundo fractal for encontrado, armazena os seguintes valores:  Max[i], candlestick no.[i], time[i]:
      { VMF2=High[i];           // Armazena o valor da Máxima de preço do 2º fractal encontrado.
        if(VMF2>VMF1)           // Se o valor da Máxima de preço do 2º fractal é mais elevado do que a do primeiro fractal (isto é, direcionado para baixo),
        { Vnf2=i;               // Armazena o número da Máxima de preço da barra no fractal encontrado. 
          tim2=iTime(NULL,0,i); // armazena o tempo do segundo ponto de referência.
        }
      }
    // --------------------------------------------------------------+
    if(VFN==3)                // Se o terceiro fractal for encontrado, armazena os seguintes valores:  Max[i], candlestick no.[i], time[i]:
    { 
      VMF3=High[i];             // Armazena o valor da Máxima de preço do 3ª fractal encontrado.
      if(VMF3>VMF2)             // Se o valor da Máxima de preço do 3ª fractal é mais elevado do que a do segundo fractal,
       {Vnf3=i;                 // Armazena o número da Máxima de preço da barra do 3º fractal.
        tim3=iTime(NULL,0,i);   // Armazena o tempo do 3º ponto de referência.
       }
    }
// ------------------------------------------------------------------+
   if(VFN==3) break; // Todas os três fractais são encontrados, sair do loop.
// ------------------------------------------------------------------+ 
    }                 
   }//-loop 

No loop acima, verificou-se três fractais encontrados na forma especificada, isto é, o primeiro fractal é menor do que o segundo e o segundo fractal é menor do que o terceiro fractal. Os 3º e 2º fractais são pontos de referência na construção da linha de tendência principal e formam a base da mesma.

No entanto, o terceiro fractal (seu valor) pode vir a ser menor do que a projeção da linha de tendência principal sobre a linha vertical do primeiro fractal:


Figura 7. Refinamento da localização do ponto de referência

Por isso, apresentamos uma série de operadores para refinar a localização do ponto de referência 3 em conformidade com os requisitos padrão de construção.

// ------------------------------------------------------------------+
   if(VMF3>VMF2 && VMF2>VMF1)
    {  
    // Vamos definir se a linha de tendência lateral (2) é MAIOR do que a projeção da linha PRINCIPAL (1)
    // Linha de tendência? Para este efeito, calcula-se o valor do preço da projeção da linha de tendência PRINCIPAL (1) 
    // sobre a linha vertical de valor máximo dO 1ª fractal:
    V_down1=((VMF3-VMF2)/(Vnf3-Vnf2));      // velocidade descendente da linha de tendência PRINCIPAL (1) ao longo da Barra 1
    PricePrL1_1f=VMF2-(Vnf2-Vnf1)*V_down1;  // preço da projeção da linha de tendência PRINCIPAL (1) na vertical do primeiro fractal.
    // Agora comparar o valor do preço do primeiro fractal com o preço da projeção da linha de tendência PRINCIPAL (1)
    // na vertical do valor da máxima do preço do primeiro fractal, e se a máxima do preço do primeiro fractal é maior do que o preço da projeção da
    // linha de tendência PRINCIPAL (1) no mesmo fractal, então os requisitos para a construção do Chuvashov's Fork são atendidos.      
    if(VMF1>PricePrL1_1f) // Se o padrão para a abertura de uma posição Buy surgiu
     {     
     V_down2=((VMF2-VMF1)/(Vnf2-Vnf1));  // velocidade descendente da linha de tendência lateral ao longo da Barra 1.     
     PricePrL2_1b=VMF1-Vnf1*V_down2;     // preço da projeção da linha de tendência Lateral (2) na 1ª BARRA atual.
     PricePrL1_1b=VMF2-Vnf1*V_down1;     // Preço da projeção da (1) linha de tendência PRINCIPAL na atual 1ª barra
     // Tenha em mente que o padrão para a abertura de uma posição Buy surgiu
     patternBuy = true; patternSell = false;   // padrão para a abertura de uma posição Buy surgiu
     // desenha marcas e linhas do padrão "Chuvashov's Fork"
     DelLine(); CreateLine(); CreateArrow();   // desenha marcas e linhas excluída anteriormente
     }
    }
// ==================================================================+    

Se o preço máximo do primeiro fractal é maior do que o preço da projeção da linha de tendência PRINCIPAL (1) no mesmo fractal, então os requisitos de construção do padrão Chuvashov's Fork foram alcançados.

Assim, o padrão "Chuvashov's Fork" foi determinado e podemos desenhar as respectivas marcas do padrão e linhas no gráfico.

Agora devemos determinar as condições e os parâmetros da abertura da posição BUY .

// ==================================================================+    
//                    Abertura de posições BUY                       +
// ==================================================================+
   if(OrdersTotal()<1) // colocamos uma (ou 2..3..etc.) ordens  
    {  //abertura de posição
// ------------------------------------------------------------------+
   if(patternBuy==true)
    { // padrão Buy

Seria melhor se a faixa de preço nas últimas 25 barras fosse pelo menos 50 pontos.

Vamos adicionar mais condições, por exemplo, uma média móvel de 150 período ao longo das últimas 24 ou 48 horas (barras) será direcionada para baixo e a distância do preço será 89 pontos menor a partir deste indicador (nível Fibo89s).

 // Primeira condição adicional - faixa de preço nas últimas 25 barras é pelo menos 50 pontos.
if((High[iHighest(Symbol(),Period(),MODE_HIGH,25,0)]-Low[iLowest(Symbol(),Period(),MODE_LOW,25,0)])>=50*Point)
  {// faixa de preço
   // 2ª condição,  se o preço é menor do que 89 pip, abaixo do nível da Ma144 (MA de 12 ao quadrado) 
  if(Bid<Ma144_1-89*Point &&       // preço é menor do que o nível Fibo89s    
     (Ma144_1-Ma144_48)<0)         // inclinação Ma144 é negativa
   {//2ª condição adicional 

A principal condição para abrir uma posição é o cruzamento da linha lateral padrão pelo preço.

Por exemplo, pode ser a seguinte:

if((High[1]>PricePrL2_1b ||                          // Máxima do preço do candlestick é maior do que a projeção lateral de 1ª Barra
    Close[1]>PricePrL2_1b ||                         // Qualquer candlestick fechado acima da projeção de 1ª barra
    (Open[1]<Close[1] && Close[1]>PricePrL2_1b) ||   // candlestick branco cruzou a projeção da 1ª barra
    Bid>PricePrL2_1b) && Bid<PricePrL2_1b+3*Point)   // não pode ser maior do que 3 pips do preço da projeção da 1ª barra
   {

Além disso, nós definimos os parâmetros do Stop Loss e Take Profit. Definir o Stop Loss igual ao valor do preço mínimo ao longo do intervalo, a partir de "0" barra até a barra do 2º fractal, ou seja, no nível da Mínima de preço do 1º fractal. Definir Take Profit no nível igual a 0,6 da variação do preço.

Uma vez que esta estratégia pressupõe o rastreamento por fractais menores da tendência de alta, vamos definir o Take Profit para ser maior do que duas faixas de preços mínimos, por exemplo, 100 - 200 pontos.

  {// Abrir uma posição Buy.
   //Calcular Stop Loss como o valor da Mínima de preço ao longo do intervalo a partir de "0" barra até a barra do 2º fractal.
  SL_B=(Bid-Low[iLowest(Symbol(),Period(),MODE_LOW,Vnf2,0)])/Point;
  if(SL_B<StopLevel) SL_B=Bid-(StopLevel+2)*Point; // se SL_B é menor do que StopLevel
  TP_B=120;
  Print("  OP_BUY Chuvashov's Fork","  VMF1 = ",VMF1," < ",PricePrH1_1f);
  Op_Buy_Ch();
  return;
  }//- abertura da posição Buy  

A busca dos últimos três fractais consecutivos situadas ao longo a tendência de alta é baseado nos fractais de baixa, todo o processo de fazer um padrão ascendente segue a lógica do padrão realizado numa tendência de baixa.

//+=======================================================================+
//                   RASTREAMENTO da abertura de posições                 +
//+=======================================================================+
for (i=OrdersTotal()-1; i>=0; i--)        // Faz um loop para a seleção de ordens BUY 
   {//loop para selecionar um posição Buy
  if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {Print("Order selection error = ", GetLastError()); }
   if(OrderType()==OP_BUY )                // se a ordem Buy for colocada
    { //2-type_Buy

Se um padrão de tendência de alta surgiu enquanto uma posição BUY estava aberta, significa que o preço retornou e começou a ir para baixo. A posição BUY deve ser fechada.

//+=======================================================================+
//|  Condições para fechar posições BUY                                   +
//+=======================================================================+
   if(patternSell==true)         //  um padrão para a abertura de uma posição Sell surgiu
    { 
    Print("Fechando a posição BUY com surgimento do padrão oposto" );
    Close_B_Ch();         // Fechar a posição SELL
    return; 
    }
//+=======================================================================+

Processo de modificação da posição BUY que está aberta.

Ele é dividido em 3 fases. Na primeira fase, chamamos a Stop Loss mais próximo de "perda-zero". Na segunda etapa, quando o preço atinge um lucro positivo igual ou superior ao Stop Loss, movemos o Stop Loss para o nível da abertura de posição.

// ---- 1ª fase ------------------------------------------ 1ª etapa ---+
    // A primeira etapa da modificação: quando o preço atinge o lucro 
    // igual ao valor do Stop Loss, movemos SL_B pela metade do valor de Stop Loss 
    // ou seja, mais perto do nível de abertura. (+StopLevel)
   if((Bid-OrderOpenPrice())>SL_B*Point        // Se a diferença entre o preço e o valor de abertura é >SL_B
       && OrderStopLoss()<OrderOpenPrice())    // e se Stop Loss é menor que o nível de abertura posição.
    {// modif-1
     OrderModify(OrderTicket(),                // ordem #. 
     OrderOpenPrice(),                         // Preço de abertura. 
     OrderStopLoss()+(SL_B/2)*Point,           // Novo valor de Stop Loss.
     OrderTakeProfit()+1*Point,                // Novo valor de Take Profit.
     0,                                        // Deferido o tempo de expiração.
     Red);                                     // Cores das marcas modificadas (traços).
     return;
    }//-modif-1
// --- fim da 1ª etapa    -----------------------------------------------------+
// ---- 2º estágio ------------------------------------------ 2ª etapa ---+
    // A segunda etapa da modificação: quando o preço atinge o lucro 
    // igual ao valor Stop Loss, movemos SL_B para nível 'zero perda', 
    // ou seja, no nível de abertura da posição (+StopLevel). 
   if((Bid-OrderOpenPrice())>SL_B*Point        // Se a diferença entre o preço e o valor de abertura de posição é >SL_B
       && OrderStopLoss()<OrderOpenPrice())    // e se Stop Loss é menor do que o nível de abertura da posição
    {// modif-1
     OrderModify(OrderTicket(),                // ordem #. 
     OrderOpenPrice(),                         // Preço de abertura. 
     OrderStopLoss()+(SL_B+StopLevel)*Point,   // Novo valor de Stop Loss. 
     OrderTakeProfit()+1*Point,                // Novo valor de Take Profit.
     0,                                        // Deferido o tempo de expiração.
     Magenta);                                 // A cores das marcas de modificação (traços).
     return;
    }//-modif-1
// --- fim da 2ª etapa   -----------------------------------------------------+

Quando o preço atinge o lucro maior do que 1.5 vezes o valor do Stop Loss, desenhamos SL_B ao fractal inferior mais próximo que deve ser maior do que o Stop Loss anterior, e mais adiante, os ascendentes fractais de baixa da tendência de alta.

// ---- 3º estágio --------------------------------------- 3ª etapa --------+
   //  Quando o preço atinge o lucro maior do que 1.5 vezes o valor do Stop Loss
   //  desenha SL_B ao fractal inferior mais próximo que deve ser maior do que o Stop Loss anterior
   if((Bid-OrderOpenPrice())>=(SL_B+SL_B/2)*Point  // se a diferença entre o preço e o valor de abertura é >SL_B+SL_B/2
       && OrderStopLoss()>=OrderOpenPrice())       // e se Stop Loss já está no nível 'perda zero'. 
    {// modif2
     // move SL_B ao nível  mais próximo do fractal inferior,
     // para essa finalidade, encontrar o fractal inferior mais próximo:
    for (k=3;k<=24;k++)
     {//loop-Рњ
     if(Low[k]<Low[k+1] && Low[k]<Low[k+2] && Low[k]<Low[k-1] && Low[k]<Low[k-2])
      { // fractal Low
      VlFl_L=Low[k];             // valor da Miníma de preço do fractal mais próximo
     if(VlFl_L>OrderStopLoss())  // fractal que deve ser maior do que o Stop Loss anterior
      {// fractal maior do que SL_B
      tim1_L=iTime(NULL,0,k);    // tempo deste fractal
         ///  string Time1_L=TimeToStr(tim1_L,TIME_DATE|TIME_MINUTES); 
         ///  Print("  Modif-2 ====== ","  Fractal = ","Frak"+k,VlFl_L,"  time = ",Time1_L);           
      // move o  Stop Loss ao nivel da Mínima de preço do fractal formado 
      OrderModify(OrderTicket(),            // ordem # 
      OrderOpenPrice(),                     // abertura de preço 
      VlFl_L+2*Point,                       // novo valor do Stop Loss. // em 'perda zero'
      OrderTakeProfit()+1*Point,            // Novo valor do Take Profit.
      0,                                    // Deferido o tempo de expiração da ordem.
      Aqua);                                // Cores das setas do Stop Loss e/ou modficação do Take Profit 
      if(VlFl_L!=0)  break;                 // se o fractal é encontrado, sair do loop
      return;
// --- fim da 3ª etapa--------------------------------------------------------+

Conclusão

Uma breve conclusão é que os exemplos introduzidos no EA produzem os mesmos resultados positivos quando testados por diferentes corretoras.

A técnica descrita pode ser utilizada pelos operadores como componente de um sistema de negociação. No entanto, precisa ser melhor desenvolvida em termos de filtros para a abertura de posições. Os filtros propostos neste documento podem ser melhorados, tal como recomendado pelo autor da técnica, Stanislav Chuvashov.

As recomendações podem ser encontrados em 17 aulas gratuitas, por Stanislav Chuvashov (em russo).

Notas para os arquivos anexados:

  • Fork_Ch_ExpertH1_v1.mq4 - MTS "Chuvashov's Fork
  • Fork_Ch_MTS_v2.mq4 - MTS "Chuvashov's Fork" sem comentários no texto do programa.


Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1352

Arquivos anexados |
Fork_Ch_MTS_v2.mq4 (23.6 KB)
Últimos Comentários | Ir para discussão (1)
Thiago Ferreira
Thiago Ferreira | 22 set 2015 em 15:52
Interessante. Já operei desta maneira e irei voltar a operar. Vou estudar mais sobre isso assim que possível.
Barras sintéticas - Uma Nova Dimensão para Exibição de Informações Gráficas dos Preços Barras sintéticas - Uma Nova Dimensão para Exibição de Informações Gráficas dos Preços
A principal desvantagem dos métodos tradicionais para a exibição de informações dos preços utilizando as barras e as velas japonesas é que estão vinculadas ao período de tempo. Estes métodos eram ideais ao momento em que foram criados, mas hoje com os movimentos do mercado demasiadamente rápidos, os preços exibidos no gráfico desta forma não contribuem para uma resposta rápida ao novo movimento. O método de exibição dos gráficos de preços proposto não tem esta desvantagem e oferece um layout muito familiar.
Usando Layouts e Containers para Controles de GUI: A Classe CBox Usando Layouts e Containers para Controles de GUI: A Classe CBox
Este artigo apresenta um método alternativo de criação de GUI (Interface Gráfica do Usuário) baseado em layouts e containers, usando um gerenciador de layout - a classe CBox. A classe CBox é um controle auxiliar que atua como um container para controles essenciais em um painel de GUI. Ele pode gerar o design gráfico dos painéis facilmente, e, em alguns casos, reduzir o tempo de codificação.
Kit do Trader: Biblioteca Drag Trade Kit do Trader: Biblioteca Drag Trade
O artigo descreve a Biblioteca Drag Trade que fornece uma funcionalidade à negociação visual. A biblioteca pode ser facilmente integrado praticamente em qualquer Expert Advisor. Seu Expert Advisor pode ser transformado de semi-automático num sistema de negociação e de informação automatizado quase sem esforço, apenas adicionando algumas linhas de código.
Análise Fractal dos Movimentos Conjuntos de Moedas Análise Fractal dos Movimentos Conjuntos de Moedas
O quanto independente são as cotações das moedas? São os seus movimentos coordenados ou não? O movimento de uma moeda sugere o movimento de outra? O artigo tenta resolver esta questão usando uma dinâmica não-linear e métodos geométricos fractais.