MetaTrader 5 / エキスパート

cheduecoglioni - MetaTrader 5のためのエキスパート

ef91
1191
(22)

このアイディアの著者: ef91 (関連の議論は)

MQL5 コードの著者:Vladimir Karputov

このEA は、TP または SL がトリガするのを待ってから、反対方向にポジションを開きます。 トレードリクエストを送る前に十分な資金があるかどうか確認します。 OnTradeTransaction.

たとえば、買いのポジションがあります。 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;            }         }      }   } 

    OrderSend の前にボリュームを確認する(例として買いポジションを考慮します):

    //+------------------------------------------------------------------+ //| Open Buy position                                                | //+------------------------------------------------------------------+ void OpenBuy(double sl,double tp)   {    sl=m_symbol.NormalizePrice(sl);    tp=m_symbol.NormalizePrice(tp); //---OrderSend 前にボリュームをチェックして「not enough money」エラー (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(),                      ", description of result: ",m_trade.ResultRetcodeDescription());               }             else               {                Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),                      ", description of result: ",m_trade.ResultRetcodeDescription());               }            }          else            {             Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),                   ", description of result: ",m_trade.ResultRetcodeDescription());            }         }       else         {          m_is_trade=false;         }      }    else      {       m_is_trade=false;      } //---   } 

    MetaQuotes Ltdによってロシア語から翻訳されました。
    元のコード: https://www.mql5.com/ru/code/18294