Autor de la idea: ef91 (inicio de la discusión relacionada #62)
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
- Procesamiento Visual de Órdenes: Mejora tu Trading en MetaTrader 4
- MACD y Línea de Señal: Estrategia para MetaTrader 4
- Señales de Trading con Patrón Hammer/Hanging Man y Estocástico en MetaTrader 5
- Crea tu Asesor Experto: Señales de Trading con Líneas de Reunión y Estocástico en MQL5
- Gestión Automática de Órdenes Pendientes con RSI en MetaTrader 4