Autor da ideia: ef91 (início da discussão relacionada #62)
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
- MACD Sample: Um Guia Prático para o Expert Advisor no MetaTrader 5
- Baixe Todo o Histórico de Ticks de um Símbolo no MetaTrader 5
- MasterMind 2: O Robô de Trading para MetaTrader 4 que Você Precisa Conhecer
- Trader Automático: RSI e MFI com Otimização Automática para MetaTrader 4
- Altarius_RSI&Stoh: O EA que Combina RSI e Estocástico para MetaTrader 4