L'autore dell'idea: ef91 (inizio della discussione correlata #62)
Autore del codice MQL5: Vladimir Karputov.
Questo EA attende che venga attivato un Take Profit (TP) o uno Stop Loss (SL), per poi aprire una posizione nella direzione opposta. Verifica se ci sono fondi sufficienti prima di inviare la richiesta di trade. Utilizza la funzione OnTradeTransaction.
Ad esempio, supponiamo di avere una posizione Buy aperta. Una volta che il TP o SL viene attivato, si apre una nuova posizione Sell. Successivamente, dopo l'attivazione di TP o SL, si apre una nuova posizione Buy.
La chiusura di un affare è monitorata nella funzione OnTradeTransaction:
//+------------------------------------------------------------------+//| Funzione TradeTransaction |//+------------------------------------------------------------------+voidOnTradeTransaction(constMqlTradeTransaction &trans, constMqlTradeRequest &request, constMqlTradeResult &result) { //--- ottieni il tipo di transazione come valore enumerativo ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- se la transazione è il risultato di un'aggiunta nella cronologia 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; elseif(deal_type==DEAL_TYPE_SELL) m_close_pos_type=POSITION_TYPE_BUY; else return; m_is_trade=true; } } elseif(deal_entry==DEAL_ENTRY_IN) { m_is_trade=false; } } } }
Controlla il volume prima di OrderSend (considerando l'apertura di una posizione Buy come esempio):
//+------------------------------------------------------------------+//| Apri posizione Buy |//+------------------------------------------------------------------+void OpenBuy(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); //--- controlla il volume prima di OrderSend per evitare errore "fondi insufficienti" (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("Buy -> falso. Codice risultato: ",m_trade.ResultRetcode(), ", descrizione del risultato: ",m_trade.ResultRetcodeDescription()); } else { Print("Buy -> vero. Codice risultato: ",m_trade.ResultRetcode(), ", descrizione del risultato: ",m_trade.ResultRetcodeDescription()); } } else { Print("Buy -> falso. Codice risultato: ",m_trade.ResultRetcode(), ", descrizione del risultato: ",m_trade.ResultRetcodeDescription()); } } else { m_is_trade=false; } } else { m_is_trade=false; } //--- }

Commento 0