Inicio Trading Sistemático Publicación

Cheduecoglioni: Tu Asesor Experto para MetaTrader 5

Archivos adjuntos
18294.zip (1.98 KB, Descargar 2 veces)

Autor de la idea: ef91 (inicio de la discusión relacionada )

Autor del código MQL5: Vladimir Karputov.

Este sistema de trading espera a que se active un TP (Take Profit) o un SL (Stop Loss) y, a continuación, abre una posición en la dirección opuesta. Antes de enviar la solicitud de operación, verifica si hay suficiente capital disponible. Esto se maneja dentro de la función OnTradeTransaction.

Por ejemplo, si tenemos una posición de compra abierta y se activa el TP o SL, se abrirá una nueva posición de venta. Después de esto, al activarse el TP o SL, se abrirá de nuevo una posición de compra.

La monitorización del cierre de operaciones se gestiona en OnTradeTransaction:

//+------------------------------------------------------------------+
//| Función TradeTransaction                                           |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- Obtener el tipo de transacción como valor de enumeración
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- Si la transacción es el resultado de una adición al historial
   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;
           }
        }
     }
  }

Verificar volumen antes de OrderSend (considerando la apertura de una posición de compra como ejemplo):

//+------------------------------------------------------------------+
//| Abrir posición de compra                                          |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

//--- verificar volumen antes de OrderSend para evitar error de "no hay suficiente dinero" (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 de resultado: ",m_trade.ResultRetcode(),
                     ", descripción del resultado: ",m_trade.ResultRetcodeDescription());
              }
            else
              {
               Print("Compra -> verdadero. Código de resultado: ",m_trade.ResultRetcode(),
                     ", descripción del resultado: ",m_trade.ResultRetcodeDescription());
              }
          }
        else
           {
            Print("Compra -> falso. Código de resultado: ",m_trade.ResultRetcode(),
                  ", descripción del resultado: ",m_trade.ResultRetcodeDescription());
           }
        }
      else
        {
         m_is_trade=false;
        }
     }
   else
     {
      m_is_trade=false;
     }
//---
  }

Publicaciones relacionadas

Comentarios (0)