MetaTrader5
Cheduecoglioni: Sistem Trading Unggulan untuk MetaTrader 5
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 |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &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;
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;
}
}
}
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;
}
//---
}
2017.08.10