Início Negociação Sistemática Postagem

Cheduecoglioni: Um EA Inovador para o MetaTrader 5

Anexo
18294.zip (1.98 KB, Baixar 0 vezes)

Autor da ideia: ef91 (início da discussão relacionada )

Autor do código MQL5: Vladimir Karputov.

O EA (Expert Advisor) aguarda a ativação de um TP (Take Profit) ou SL (Stop Loss) para abrir uma posição na direção oposta. Antes de enviar um pedido de negociação, ele verifica se há capital suficiente disponível.

Por exemplo, se tivermos uma posição de compra aberta e o TP ou SL for acionado, uma nova posição de venda será aberta. Após o acionamento do TP ou SL, uma nova posição de compra será aberta.

A monitorização do fechamento da operação ocorre na função OnTradeTransaction:

//+------------------------------------------------------------------+
//| Função TradeTransaction                                                |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- obter o tipo de transação como valor de enumeração 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- se a transação for resultado da adição da transação no histórico
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      long     deal_time         =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_time=HistoryDealGetInteger(trans.deal,DEAL_TIME);
        }
      else
         return;
      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
        {
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)
              {
               if(deal_type==DEAL_TYPE_BUY)
                  m_close_pos_type=POSITION_TYPE_SELL;
               else if(deal_type==DEAL_TYPE_SELL)
                  m_close_pos_type=POSITION_TYPE_BUY;
               else
                  return;
               m_is_trade=true;
              }
         }
         else if(deal_entry==DEAL_ENTRY_IN)
           {
            m_is_trade=false;
           }
        }
     }
  }

Verifique o volume antes do OrderSend (considerando a abertura de uma posição de compra como exemplo):

//+------------------------------------------------------------------+
//| Abrir posição de compra                                                |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

//--- verifique o volume antes do OrderSend para evitar erro de "fundos insuficientes" (CTrade)
   double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),InpLots,m_symbol.Ask(),ORDER_TYPE_BUY);

   if(check_volume_lot!=0.0)
     {
      if(check_volume_lot>=InpLots)
        {
         if(m_trade.Buy(InpLots,NULL,m_symbol.Ask(),sl,tp))
           {
            if(m_trade.ResultDeal()==0)
              {
               Print("Compra -> falso. Código do Resultado: ",m_trade.ResultRetcode(),
                     ", descrição do resultado: ",m_trade.ResultRetcodeDescription());
              }
              }else
              {
               Print("Compra -> verdadeiro. Código do Resultado: ",m_trade.ResultRetcode(),
                     ", descrição do resultado: ",m_trade.ResultRetcodeDescription());
              }
         }
         else
         {
            Print("Compra -> falso. Código do Resultado: ",m_trade.ResultRetcode(),
                  ", descrição do resultado: ",m_trade.ResultRetcodeDescription());
           }
        }
      else
        {
         m_is_trade=false;
        }
     }
   else
     {
      m_is_trade=false;
     }
//---
  }

    Publicações relacionadas

    Comentário (0)