Home - Plataforma - Criação de Expert Advisor no MetaTrader 3                      
 
CRIAÇÃO PASSO A PASSO DE UM "EXPERT ADVISOR" SIMPLES

Vamos criar um "Expert Advisor" que funciona com o indicador MACD e que utiliza profit-taking, trailing stop e mecanismos de proteção. No exemplo aqui apresentado, o trade é feito com a abertura e controle uma única posição.

Princípios do Trade System

  • Entrada

    • COMPRA ("Long"): O indicador MACD está abaixo de zero, começa a subir e é cruzado pela linha de sinal que vai ficando abaixo do MACD.
    • VENDA ("Short"): O indicador MACD está acima de zero, começa a cair e é cruzado pela linha de sinal que vai ficando acima do MACD.

  • Saída

    • COMPRA ("Long"): pela execução de um "take profit", "trailing stop" ou quando o MACD cruza sua linha de sinal (MACD está acima de zero, vai para baixo e é cruzado pela linha de sinal que vai ficando acima do MACD).
    • VENDA ("Short"): pela execução de um "take profit", "trailing stop" ou quando o MACD cruza sua linha de sinal (MACD está abaixo de zero, vai para cima e é cruzado pela linha de sinal que vai ficando abaixo do MACD).
Nota importante
Para excluir mudanças insignificantas do MACD ('hillocks' pequenos no gráfico) de nossa análise, nós introduzimos uma medida adicional para controlar o tamanho dos 'hillocks': o tamanho do MACD deve ser ao menos 5 unidades do preço mínimo (5*Point, que para USD/CHF = 0.0005 e para USD/JPY = 0.05).

PASSO 1: Criação do Expert Advisor

Aponte o mouse na seção "Expert Advisors" que está no "Navigator Window", pressione o botão direito do mouse e selecione a opção "Create a new Expert" no menu. O "wizard" do Expert Advisor pedirá que você preencha determinados dados. Na janela que está aparecendo, voce deve escrever o nome ("Name") do "Expert Advisor" - MACD Sample, autor ("Author") - indicate your name, o link (Link) - a link to your website, nas notas (Notes) - Test example of an MACD-based Expert Advisor. Você pode também indicar os valores default que você deseja usar para número lotes, "Stop Loss", "Take Profit" e o "Trailing Stop".

PASSO 2: Criando a estrutura principal do programa

Para se ter uma idéia da estrutura do nosso "Expert Advisor", vamos dar uma olhada na descrição abaixo:

  1. Verificação inicial
    • Verificar o gráfico, número de barras no gráfico
    • Verificar o valor de variáveis externas: Lots, S/L, T/P, T/S

  2. Ajustar as variáveis internas
  3. Verificando o dados da conta e de trading:
    • Verificar disponibilidade de saldo na conta etc...
    • É possível abrir uma posição de compra (BUY)?
    • abra a posição e saia

    • É possível abrir uma posição de venda (SELL)?
    • abra a posição e saia

    saindo do "Expert Advisor"...

  4. Controle das posições previamente abertas
    • se for uma posição de compra
    • - ela deve ser fechada?
      - o "trailing stop" deve ser alterado?

    • se for uma posição de venda
    • - ela deve ser fechada?
      - o "trailing stop" deve ser alterado?

A estrutura tornou-se relativamente simples, com 4 blocos principais.
Agora vamos gerar, passo a passo, os trechos de código para cada seção da estrutura:

  • Verificação inicial de dados
    Este pedaço de código vale para praticamente todos os Expert Advisors, necessitando apenas de poucas alterações.

    If Bars<200 Then Exit; // Se o número de barras for menor que 200, então "Exit"
    
    If TakeProfit<10 Then Exit; // Testar parâmetros errados. Nesse exemplo,
                                   "takeprofit" não pode ser menor que 10.
                  
  • Ajustar as vari´veis internas
    No código é muito frequente a necessidade de acessar e manipular indicadores e valores computados. Para simplificar o código e agilizar o acesso a esses dados, eles são inicializados em variáveis internas.

    MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);     // valor do MACD na barra corrente
    
    MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);    // valor do MACD na barra anterior
    
    SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); // valor do sinal do MACD na barra corrente
    
    SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);// valor do sinal do MACD na barra anterior
    
    MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);    // valor da média móvel barra corrente
    
    MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);   // valor da média móvel barra anterior
                  

    Agora, ao invés de usar a notação monstruosa iMACD(12,26,9,MODE_MAIN,0), nó pode simplificar e escrever o programa usando a variável MacdCurrent. Todas as variáveis usadas pelo Expert Advisor precisam ser preliminarmente declaradas, de acordo com a linguagem MetaQuotes II (MQL II). Sendo assim, nós declaramos essas variáveis no inío do programa:

    var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0);
    
    var: MaCurrent(0), MaPrevious(0);
                  

    MetaQuotes Language II introduz também o conceito de parâmetros, que podem ser inicializadas ou modificadas fora do programa, sem precisar de modificação no código-fonte do Expert Advisor, fornecendo, assim, maior flexibilidade. A variável MATrendPeriod é um parâmetro. Então, nós incluímos a sua declaração no início do programa.

    defines: MATrendPeriod(56);
                  
  • Verificando o dados da conta e de trading
    Para evitar que o programa execute ordens simultâneas, vamos incluir uma vamos introduzir a seguinte verificação:

    If TotalTrades<1 then   // verifica se há alguma trade, ordem aberta
    
    {
                  

    verificar: disponibilidade de saldo na conta etc. Antes de analisar o mercado é aconselhável verificar a situação da sua conta para ter certeza há saldo disponível para abrir uma posição.

    If FreeMargin<1000 then Exit;  // se estiver sem saldo - "Exit"
                  

    É possível abrir uma posição de compra (BUY)? Condição de entrada: MACD é menor do que zero, começa a subir e é cruzada pela linha de sinal. Então, o código em MQL II fica dessa forma (Note que nós estamos usando os valores do MACD que foram previamente armazenadas nas variáveis):

    If MacdCurrent<0 and MacdCurrent>SignalCurrent and
    
       MacdPrevious<SignalPrevious and              // verifica se um cruzamento existe
    
       Abs(MacdCurrent)>(MACDOpenLevel*Point) and   // se o MACD possui um mínimo 'hillock'
    
       MaCurrent>MaPrevious then                    // tendência compradora ('bull')
    
    {
    
       SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // enviando a ordem de compra
    
       Exit; // saindo
    };
                  

    Acima nós mencionamos um mé todo para monitorar o tamanho de 'hillocks' no MACD. A variável MACDOpenLevel é um parâmetro que pode ser modificado sem sem causar interferência no código do programa. No início do programa, nós inserimos a declaração desse parâmetro:

    defines: MACDOpenLevel(3), MACDCloseLevel(2);
                  

    É possível abrir uma posição de venda (SELL)? Condição de entrada: MACD está abaixo de zero, começa a cair e é cruzado pela sua linha de sinal. O código correspondente segue abaixo:

    If MacdCurrent>0 and MacdCurrent<SignalCurrent and
    
       MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and
    
       MaCurrent<MaPrevious then
    
       {
          // Enviando a ordem de venda
          SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED);
    
          Exit; // saindo
    
       };
    
       Exit;   // sem novas posição para abrir - apenas exit
    
    };
                  
  • Controle das posições previamente abertas

    for cnt=1 to TotalTrades
    
    {
    
       if OrderValue(cnt,VAL_TYPE)<=OP_SELL and   // é uma posição aberta?
    
          OrderValue(cnt,VAL_SYMBOL)=Symbol then  // é uma posição
                                                     do par ("cross") correspondente ao
                                                     gráfico que estamos trabalhando?
    
    {
                  

    cnt é uma variável usada apenas no loop e foi declarada no início do programa:

    var: cnt(0);
                  
    se é uma posição de compra ("long position")
    If OrderValue(cnt,VAL_TYPE)=OP_BUY then // se for uma posição de compra aberta
    
    {
                  
    Deve ser fechada? Condição para sair de uma posição de compra ("long position"): MACD estando acima de zero, começa a cair e é cruzado pela linha de sinal.
    If MacdCurrent>0 and MacdCurrent<SignalCurrent and
    
       MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then
    
       {
    
          CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
    
          Exit; // exit
    
    };
                  
    O "trailing stop"deve ser ajustado? Nós ajustamos o 'trailing stop' somente no caso de a posição já ter algum lucro que exceda o nível do 'trailing stop' em 'pips', e no caso do novo nível do stop ser melhor do que o anterior.
    If TrailingStop>0 then // se 'trailing stops' estão sendo usados...
    
    {
    
       If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(Point*TrailingStop) then
    
       {
    
          If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then
    
          {
    
             ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
    
                Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
    
             Exit;
    
          };
    
       };
    
    };
    
    };
                  

    else // caso contrário, é uma posição de venda ("short position")
    
    {
                  
    Ela deve ser fechada? Condição para sair de uma posição de venda ('short position'): MACD estando abaixo de zero, começa a subir e é cruzado pela linha de sinal.

    If MacdCurrent<0 and MacdCurrent>SignalCurrent and
    
       MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDCloseLevel*Point) then
    
       {
    
          CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
    
          Exit; // exit
    
       };
                  

    O "trailing stop"deve ser ajustado? Nós ajustamos o 'trailing stop' somente no caso de a posição já ter algum lucro que exceda o nível do 'trailing stop' em 'pips', e no caso do novo nível do stop ser melhor do que o anterior.

    If TrailingStop>0 then  // o programa verifica o 'trailing stop' configurado pelo usuário
    
    {
    
       If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then
       {
    
          If OrderValue(cnt,VAL_STOPLOSS)=0 or
    
             OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then
    
          {
    
             ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
    
                Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
    
             Exit;
    
           };
    
       };
    
    };
                  

    Fechando todos as chaves que ainda estão abertas:

        };
    
      };
    
    };
                  

PRÓXIMOS PASSOS:


FONTE: www.interbankfx.com
www.equipeforex.com

EquipeForex.Com © 2005 • Termos de uso e Política de Privacidade  Home  Mapa do site   Ajuda   Entre em contato
SourceForge.net Logo