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 | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &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; 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; } } } }
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; } //--- }
Post correlati
- MQL5 Wizard: Creare Trading Signals con Morning/Evening Stars e MFI per MetaTrader 5
- MQL5 Wizard: Strategia di Trading con Dark Cloud Cover/Piercing Line e RSI
- MQL5 Wizard: Crea Trading Signals con 3 Corvi Neri/3 Soldati Bianchi e RSI
- MQL5 Wizard: Crea Expert Advisor per segnali di trading basati su Dark Cloud Cover e Piercing Line con CCI
- Utilizzare MQL5 Wizard per Trading con Dark Cloud Cover e Piercing Line