Penulis ide:ef91 (awal diskusi terkait #62)
Penulis kode MQL5:Vladimir Karputov.
EA ini menunggu pemicu TP atau SL, kemudian membuka posisi di arah berlawanan. Sebelum mengirim permintaan trading, EA akan memeriksa apakah ada cukup dana. Ini dilakukan di OnTradeTransaction.
Contohnya, jika kita memiliki posisi Buy terbuka, saat TP atau SL terpenuhi, posisi Sell baru akan dibuka. Kemudian, setelah pemicu TP atau SL, posisi Buy baru akan dibuka.
Penutupan transaksi dipantau di OnTradeTransaction:
//+------------------------------------------------------------------+//| Fungsi TradeTransaction |//+------------------------------------------------------------------+voidOnTradeTransaction(constMqlTradeTransaction &trans, constMqlTradeRequest &request, constMqlTradeResult &result) { //--- ambil jenis transaksi sebagai nilai enumerasi ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- jika transaksi adalah hasil penambahan transaksi dalam riwayat 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; } } }
Periksa volume sebelum OrderSend (anggap membuka posisi Buy sebagai contoh):
//+------------------------------------------------------------------+//| Membuka posisi Buy |//+------------------------------------------------------------------+void OpenBuy(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); //--- periksa volume sebelum OrderSend untuk menghindari kesalahan "tidak cukup uang" (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 -> false. Hasil Retcode: ",m_trade.ResultRetcode(), ", deskripsi hasil: ",m_trade.ResultRetcodeDescription()); } else { Print("Buy -> true. Hasil Retcode: ",m_trade.ResultRetcode(), ", deskripsi hasil: ",m_trade.ResultRetcodeDescription()); } } else { Print("Buy -> false. Hasil Retcode: ",m_trade.ResultRetcode(), ", deskripsi hasil: ",m_trade.ResultRetcodeDescription()); } } else { m_is_trade=false; } } else { m_is_trade=false; } //--- }

Komentar 0