MetaTrader5
MetaTrader 5用EAの使い方と取引の最適化
アイデアの作者: ef91(関連ディスカッションの始まり #62)MQL5コードの作者: Vladimir Karputov。このEAは、テイクプロフィット(TP)またはストップロス(SL)がトリガーされた後、反対方向にポジションを開きます。取引リクエストを送信する前に、十分な資金があるかどうかを確認します。例えば、買いポジションを保有している場合、TPまたはSLがトリガーされると、新たに売りポジションが開かれます。その後、再度TPまたはSLがトリガーされると、新しい買いポジションが開かれます。取引のクローズは「OnTradeTransaction」で監視されます://+------------------------------------------------------------------+
//| TradeTransaction関数 |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- 取引タイプを列挙値として取得
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- 取引が履歴に追加された結果かどうかを判定
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;
}
}
}
オーダー送信前にボリュームを確認(買いポジションを開く例として考えます)://+------------------------------------------------------------------+
//| 買いポジションをオープン |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
{
sl=m_symbol.NormalizePrice(sl);
tp=m_symbol.NormalizePrice(tp);
//--- オーダー送信前にボリュームをチェックして「資金不足」エラーを回避(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(),
", 結果の説明: ",m_trade.ResultRetcodeDescription());
}
else
{
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", 結果の説明: ",m_trade.ResultRetcodeDescription());
}
}
else
{
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", 結果の説明: ",m_trade.ResultRetcodeDescription());
}
}
else
{
m_is_trade=false;
}
}
else
{
m_is_trade=false;
}
//---
}
2017.08.10