MetaTrader5
Cheduecoglioni - EA Hebat untuk MetaTrader 5
Penulis Idea: ef91 (awal perbincangan berkaitan #62)
Penulis Kod MQL5: Vladimir Karputov.
EA ini menunggu TP atau SL untuk diaktifkan, dan selepas itu membuka posisi dalam arah yang bertentangan. Ia akan memeriksa sama ada terdapat cukup dana sebelum menghantar permintaan dagangan melalui OnTradeTransaction.
Contohnya, kita mempunyai posisi Buy yang terbuka. Setelah TP atau SL diaktifkan, posisi Sell baru akan dibuka. Kemudian, selepas TP atau SL diaktifkan, posisi Buy baru juga akan dibuka.
Penutupan urus niaga dipantau melalui OnTradeTransaction:
//+------------------------------------------------------------------+
//| Fungsi TradeTransaction |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- dapatkan jenis transaksi sebagai nilai enumerasi
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- jika transaksi adalah hasil tambahan transaksi dalam sejarah
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 pembukaan posisi Buy sebagai contoh):
//+------------------------------------------------------------------+
//| Buka posisi Buy |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
{
sl=m_symbol.NormalizePrice(sl);
tp=m_symbol.NormalizePrice(tp);
//--- semak volume sebelum OrderSend untuk mengelakkan ralat "tidak cukup wang" (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. Result Retcode: ",m_trade.ResultRetcode(),
", keterangan hasil: ",m_trade.ResultRetcodeDescription());
}
else
{
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", keterangan hasil: ",m_trade.ResultRetcodeDescription());
}
}
else
{
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", keterangan hasil: ",m_trade.ResultRetcodeDescription());
}
}
else
{
m_is_trade=false;
}
}
else
{
m_is_trade=false;
}
//---
}
2017.08.10