Início Negociação Sistemática Postagem

Como Fechar Ordens por Alvo ou Limite de Perda no MetaTrader 4

Anexo
34194.zip (995 bytes, Baixar 0 vezes)

Fala, galera! Hoje vamos falar sobre uma ferramenta que pode facilitar muito a sua vida como trader no MetaTrader 4: um robô que fecha ordens com base no alvo de lucro ou no limite de perda.

Esse Expert Advisor (EA) é super útil e tem apenas três entradas que você precisa configurar:

  1. Alvo de Lucro
  2. Limite de Perda
  3. Número Mágico
extern     double          inTargetProfitMoney      = 10;       // Alvo de Lucro ($)
extern     double          inCutLossMoney           = 0.0      // Limite de Perda ($)
extern     int             inMagicNumber            = 0        // Número Mágico


Quando você executar esse EA, ele chamará a função OnInit(). Nela, vamos verificar se as entradas e variáveis estão devidamente inicializadas.

int OnInit()
  {
    //---
    if(inTargetProfitMoney <= 0)
       {
        Alert("Entrada inválida");
        return(INIT_PARAMETERS_INCORRECT);
     }

     inCutLossMoney = MathAbs(inCutLossMoney) * -1;

    //---
    return(INIT_SUCCEEDED);
  }


Agora, toda vez que houver uma movimentação de preço (tick), a função OnTick() será chamada.

void OnTick()
  {
    //---

    double   tFloating = 0.0;
    int tOrder   = OrdersTotal();
    for(int i=tOrder-1; i>=0; i--)
       {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
          {
            if(OrderMagicNumber() == inMagicNumber)
               {
                tFloating    += OrderProfit()+OrderCommission() + OrderSwap();
           }
        }
     }

    if(tFloating >= inTargetProfitMoney || (tFloating <= inCutLossMoney && inCutLossMoney < 0))
     {
      fCloseAllOrders();
     }

  }

Na função OnTick, vamos continuar calculando o lucro ou a perda total e, se necessário, fechar todas as ordens que atingirem o alvo ou o limite de perda.

void fCloseAllOrders()
  {
    double   priceClose = 0.0;
    int tOrders = OrdersTotal();
    for(int i=tOrders-1; i>=0; i--)
       {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
          {
            if(OrderMagicNumber() == inMagicNumber && (OrderType() == OP_BUY || OrderType() == OP_SELL))
               {
                priceClose = (OrderType()==OP_BUY)?MarketInfo(OrderSymbol(), MODE_BID):MarketInfo(OrderSymbol(), MODE_ASK);
                if(!OrderClose(OrderTicket(), OrderLots(), priceClose, slippage, clrGold))
              {
                   Print("AVISO: Falha ao Fechar");
              }
           }
        }
     }
  }


Para mais informações e troca de conhecimentos sobre códigos MQL4, junte-se ao nosso grupo no Telegram: t.me/codeMQL


Publicações relacionadas

Comentário (0)