English Русский 中文 Español Deutsch 日本語
Caça de tendências

Caça de tendências

MetaTrader 4Negociação | 4 fevereiro 2016, 14:48
793 0
Eryomin Sergey
Eryomin Sergey

Alerta

A informação contida nesse artigo é exclusivamente meu ponto de vista. Como um autor eu não induzo você a agir de acordo com o algoritmo descrito nesse artigo. Além do mais, aviso também que você poderá sofrer possíveis perdas resultantes do uso dessa informação.


Introdução

O artigo contém uma descrição de um método de negociação - acúmulo de volume de negociações lucrativas. Suponho que somente negociações lucrativas podem ser acumuladas. O artigo explica a maneira otimizada para implementar isso e contém um código de EA que ajuda a executar tais negociações corretamente.


Conceito do algoritmo

Acumular o volume de uma negociação lucrativa permite que seja obtido o lucro máximo do movimento de mercado que encontrarmos. Mas o volume deve ser acumulado de modo que não resulte no aumento de riscos. Um dos algoritmos como o de acúmulo de volume é descrito neste artigo.

Primeiro precisamos de um ponto de referência - o primeiro negócio principal. O negócio principal deve ter um volume maior do que cada negócio auxiliar. Suponha que o volume do negócio principal é de 0,2 lotes, o volume dos negócios auxiliares deve ser de 0,1 lote. Trailing Stop Loss (Parar Perdas Móvel) é usada para todas as negociações, por exemplo, 50 pontos. Quando o lucro da negociação principal alcança mais de 100 pontos, o Stop Loss (Parar Perdas) será de +50. Neste momento um negócio de 0,1 lote é aberto na mesma direção com Parar Perdas de -50 pontos. Se o preço voltar, ambos negócios serão fechados pelo pedido Stop Loss. O lucro obtido será igual a 50 pontos de 0,2 lotes, perda de -50 pontos de 0,1 lote. O lucro total será igual a 50 pontos de 0,1 lote. Desse modo a proteção contra perdas é alcançada enquanto o volume de negociações aumenta.

Se uma negociação continua a se mover na direção necessária, quando o lucro das negociações auxiliares alcançar +50 pontos, o Stop Loss Móvel é ativado. Quando um lucro de 200 pontos é alcançado na negociação principal e aquele de 100 pontos na negociação auxiliar, mais uma negociação auxiliar será aberta. O SL novamente é igual a -50. E assim por diante.

Esse método bem simples permite que seja ganho bom lucro do acúmulo de lotes. Ao mesmo tempo os riscos são minimizados. Na verdade o risco aqui é somente perder parte do negócio principal, isto é, risco de que o primeiro negócio auxiliar retorne perda. Mas isso não é um risco de perda, é um risco de não obter o lucro total.

O TrailingStopLoss padrão permite negócios móveis somente se há lucro. Mas se for feito em negócios auxiliares antes do lucro necessário ser obtido, a rentabilidade de tal abordagem ao acúmulo de lotes pode ser aumentada. Você pode fazer isso e também otimizar a abertura de pedidos auxiliares com os recursos do MQL4.


Implementação

O Expert Advisor escrito para esse propósito é baseado no EA descrito no artigo "Especulação Confortável". Nesse artigo o EA combinou funções: ele faz o papel de um jogo de treino e uma ferramenta para abrir negócios. Para essa negociação a função de um jogo foi removida. Assim o Expert Advisor desenha duas setas em uma tabela - para cima e para baixo. A retirada de uma delas é um sinal para abrir negociações em uma direção necessária. Por exemplo, ao remover uma seta para baixo, uma seta para cima permanece em uma tabela. Para o EA isso é um sinal para abrir um pedido de Compra e colocar um número de pedidos de Buy Stop (Parar Vendas) pendente.

Um pedido de mercado é o pedido principal aqui. Pedidos pendentes possuem a função de pedidos auxiliares que possuem lote menor do que o principal. Para o cálculo de "frequência" de negócios auxiliares, abertura e sua quantidade, dois pontos são usados. A primeira é o objetivo final, Obter Lucros (Take Profit). É igual para todos os pedidos (principal e auxiliar). O segundo ponto é uma etapa para abrir pedidos pendentes. Dependendo do objetivo final do EA, ele calcula quantas ordens pode colocar no intervalo do preço atual para o nível de Obter Lucros.

Por exemplo, se usarmos o Obter Lucros igual a 400 pontos e a etapa para abertura de pedidos for 100 pontos (por padrão), 4 pedidos serão abertos ao Comprar. O primeiro é Comprar no Preço de Venda, o pedido principal. O segundo é um Parar Compras auxiliar no Preço de Venda + 100 pontos. O terceiro é um Parar Compras auxiliar no Preço de Venda + 200 pontos. O quarto é um Parar Compras auxiliar no Preço de Venda +300 pontos. Obter Lucros para todos os pedidos será igual a Preço de Venda +400 pontos, isto é, para o primeiro pedido ele será de 400 pontos, para o segundo, 300, para o terceiro, 200, e para o quarto de 100.

TrailingStopLoss para o negócio principal somente funciona se um lucro necessário for obtido (por padrão 50 pontos). Para negócios auxiliares ele funciona do momento de abertura (isto é, Stop Loss pode ser rastreado para a área de perda). O nível de Stop Loss Móvel é igual para todas as negociações. Além do mais, o Stop Loss Móvel é um nível de Stop Loss para negócios auxiliares.

Se o pedido principal for fechado, os pedidos remanescentes pendentes serão excluídos. Depois disso, duas setas serão desenhadas novamente na tabela. Isso indica a prontidão do EA para abrir negociações novamente.

Tudo isso pode parecer demorado, mas pode facilmente ser implementado na prática. Vamos analisar o código do EA.

//+------------------------------------------------------------------+
//|                                                   take_trend.mq4 |
//|                                       Copyright © 2008, FXRaider |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, FXRaider"
extern int gap=20;            //level at which arrows are placed 
extern int TP=400;            //Take Profit level
extern int SL=0;              //Stop Loss level
extern double Lots1=0.2;      //lot of a main trade
extern double Lots2=0.1;      //lot of auxiliary trades 
extern int slippage=2;        //level of acceptable requote
extern int MagicNumber1=5345; //magic number of the main trade
extern int MagicNumber2=4365; //magic number of auxiliary trades
extern int Open_Step=100;     //step for opening auxiliary trades
 
extern bool UseTrailing = true; //enabling/disabling T-SL
extern int TrailingStop = 50;   //Trailing Stop Loss level
extern int TrailingStep = 1;    //Trailing Stop Loss step
int start()
  {
//------------------------------       
//+----------------------------------------------------------------------------------------------+
//|                              searching open orders for a pair                                |
    int pos_sell=0;
  for (int i_op_sell=OrdersTotal()-1; i_op_sell>=0; i_op_sell--) 
  { 
   if (!OrderSelect(i_op_sell,SELECT_BY_POS,MODE_TRADES)) break; 
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1   
   &&(OrderType()==OP_SELL))
   {
    pos_sell=1; break;   
   } 
  }
    
    int pos_buy=0;
  for (int i_op_buy=OrdersTotal()-1; i_op_buy>=0; i_op_buy--) 
  { 
   if (!OrderSelect(i_op_buy,SELECT_BY_POS,MODE_TRADES)) break; 
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1
   &&(OrderType()==OP_BUY))
   {
    pos_buy=1; break;   
   } 
  }    
//|                              searching open orders for a pair                                |
//+----------------------------------------------------------------------------------------------+  
//+------------------------------------------------------------------------------------+
//|                                 working with objects                               |  
 
//+----------------------------------------------------------+
//|                    deleting objects                      | 
  if(iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))>0
     ||ObjectGet("down",OBJPROP_PRICE1)!=Open[0]-gap*Point) 
    {
     ObjectDelete("down"); 
    }  
  if(iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))>0
    ||ObjectGet("up",OBJPROP_PRICE1)!=Open[0]+gap*Point)            
    { 
     ObjectDelete("up"); 
    } 
//|                    deleting objects                      |   
//+----------------------------------------------------------+ 
 
//+----------------------------------------------------------+
//|                   drawing objects                        |   
   if((ObjectFind("down") != 0&&ObjectFind("up") != 0) //if no objects
   &&!pos_sell&&!pos_buy)                              //if no open orders
   {
     ObjectCreate("down", OBJ_ARROW, 0, Time[0], Open[0]-gap*Point); //draw a down arrow
     ObjectSet("down", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("down", OBJPROP_ARROWCODE, 234);
     ObjectSet("down", OBJPROP_COLOR, Red);
 
     ObjectCreate("up", OBJ_ARROW, 0, Time[0], Open[0]+gap*Point); //draw an up arrow
     ObjectSet("up", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("up", OBJPROP_ARROWCODE, 233);
     ObjectSet("up", OBJPROP_COLOR, Blue);
   }    
//|                   drawing objects                        |
//+----------------------------------------------------------+   
      
//|                                 working with objects                               |   
//+------------------------------------------------------------------------------------+
 
   
 
 
//+----------------------------------------------------------------------------------------------+ 
//|                                deleting unnecessary orders                                   | 
int cnt_del; 
if(pos_buy==0)
{               
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) 
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;     
    if(OrderSymbol()==Symbol())
    {
     if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); 
    }
  } 
 } 
 
if(pos_sell==0)
{               
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) 
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;     
    if(OrderSymbol()==Symbol())
    { 
    if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); 
    }
  } 
 }  
//|                                deleting unnecessary orders                                   |
//+----------------------------------------------------------------------------------------------+  
 
  
//+------------------------------------------------------------------------------------+ 
//|                                   opening trades                                   |
double sl_buy, sl_sell;
 if(!SL)
 { 
  sl_buy=0;
  sl_sell=0;
 }
 else
 {
  sl_buy=Ask-SL*Point;
  sl_sell=Bid+SL*Point;
 }
 int stop_positions=MathFloor(TP/Open_Step-1);
 int i, open_step_2;
  if(
     ObjectGet("up", OBJPROP_PRICE1)==Open[0]+gap*Point
     &&iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))==0
     &&ObjectFind("down") != 0
     &&ObjectFind("up") == 0
     &&!pos_buy  
     )
     {
      OrderSend(Symbol(),OP_BUY, Lots1,Ask,slippage,sl_buy,Ask+TP*Point,"take_trend",MagicNumber1,0,Blue); 
      for(i=stop_positions;i>=0; i--) 
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_BUYSTOP, Lots2,
       Ask+open_step_2*Point,slippage,
       0,Ask+TP*Point,"take_trend",MagicNumber2,0,Blue);
      }          
     }
  if(
     ObjectGet("down", OBJPROP_PRICE1)==Open[0]-gap*Point
     &&iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))==0
     &&ObjectFind("up") != 0
     &&ObjectFind("down") == 0
     &&!pos_sell
     )
     {
      OrderSend(Symbol(),OP_SELL, Lots1,Bid,slippage,sl_sell,Bid-TP*Point,"take_trend",MagicNumber1,0,Red);
      for(i=stop_positions;i>=0; i--) 
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_SELLSTOP, Lots2,
       Bid-open_step_2*Point,slippage,
       0,Bid-TP*Point,"take_trend",MagicNumber2,0,Red);
      }        
     }
//|                                   opening trades                                   |  
//+------------------------------------------------------------------------------------+   
 
 
//+-------------------------------------------------------------------------------------------------+ 
//|                                      trail of open orders                                       |
if (UseTrailing)
{ 
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;       
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
//|                                      trail of open orders                                       |
//+-------------------------------------------------------------------------------------------------+
     
   return(0);
  }
//+------------------------------------------------------------------+

O código inclui todos os comentários necessários.

Variáveis.

gap – level, on which arrows are placed;
TP– Take Profit level;
SL – Stop Loss level;
Lots1 – lot of a main trade;
Lots2 – lot of auxiliary trades;
slippage – level of acceptable requote;
MagicNumber1 – magic number of the main trade;
MagicNumber2 – magic number of auxiliary trades;
Open_Step – step for opening auxiliary trades;


UseTrailing – enabling/disabling T-SL;
TrailingStop – Trailing Stop Loss level;
TrailingStep – Trailing Stop Loss step.

Quando o Expert Advisor for anexado a uma tabela, ele desenha duas setas:


A seta restante permanecerá na tabela até o próximo candelabro:

Imediatamente após uma das setas ser removida o EA abre negociações:


Como pode ver, a seta restante não é mostrada na imagem - como ela foi escrita anteriormente, foi removida no próximo candelabro e as setas não aparecem até que todas as negociações estejam fechadas. Logo que o lucro da primeira negociação alcançar o nível necessário, o T-SL começa a funcionar (ele sempre funciona em negociações auxiliares). Nesse exemplo somente a primeira negociação é fechada ao abortar. Junto a isso, todos os outros pedidos são removidos:



Conclusão

Para concluir, eu gostaria de adicionar que o nível de Stop Loss Móvel, Take Profit e o nível para abrir negociações auxiliares deveria ser escolhido para cada par individualmente. Também, deve ser notado que para o uso eficiente do nível de negociações auxiliares a abertura deve ser maior do que o nível de T-SL. Na negociação principal é recomendado o uso de um lote de tamanho maior do que as negociações auxiliares.

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

Arquivos anexados |
take_trend.mq4 (8.22 KB)
Expert Advisors baseado em sistemas de trading populares e alquimia da otimização de robô de trading Expert Advisors baseado em sistemas de trading populares e alquimia da otimização de robô de trading
Esse artigo trata do algoritmo de implementação dos sistemas de negociação mais simples. O artigo será útil para investidores iniciantes e desenvolvedores de EA.
MetaEditor : Modelos como um local para se apoiar MetaEditor : Modelos como um local para se apoiar
Pode ser novidade para muitos de nossos leitores que todas as preparações para escrever um EA podem ser feitas uma vez e então usadas continuamente.
Expert Advisors baseado em sistemas de trading populares e alquimia da otimização de robô de trading (Parte II) Expert Advisors baseado em sistemas de trading populares e alquimia da otimização de robô de trading (Parte II)
Nesse artigo o autor continua a analisar algoritmos de implementação dos sistemas de negociação mais simples e descreve alguns detalhes relevantes da utilização dos resultados de otimização. O artigo será útil para investidores iniciantes e desenvolvedores de EA.
Especulação confortável Especulação confortável
Esse artigo descreve o método para criar uma ferramenta para a especulação (scalping) confortável. Entretanto, tal abordagem a uma abertura de negócios pode ser aplicada a qualquer negociação.