หน้าแรก การเทรดด้วยระบบ โพสต์

EA สำหรับ MetaTrader 5: กลยุทธ์การเปิดและปิดออเดอร์อย่างชาญฉลาด

ไฟล์แนบ
18294.zip (1.98 KB, ดาวน์โหลด 0 ครั้ง)

ผู้เขียนแนวคิด: ef91 (อ่านแนวสนทนาได้ที่ )

ผู้เขียนโค้ด MQL5: Vladimir Karputov.

EA นี้ถูกออกแบบมาเพื่อรอให้ TP หรือ SL ถูกกระตุ้นก่อนที่จะเปิดตำแหน่งในทิศทางตรงข้าม โดยมันจะตรวจสอบว่ามีเงินเพียงพอก่อนที่จะส่งคำขอการเทรดผ่านฟังก์ชัน OnTradeTransaction.

ตัวอย่างเช่น หากเรามีตำแหน่ง Buy ที่เปิดอยู่ เมื่อ TP หรือ SL ถูกกระตุ้น ระบบจะเปิดตำแหน่ง Sell ใหม่ และต่อมาเมื่อ TP หรือ SL ถูกกระตุ้นอีกครั้ง ระบบจะเปิดตำแหน่ง Buy ใหม่.

การตรวจสอบการปิดธุรกรรมจะถูกจัดการใน 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;
           }
        }
     }
  }

ตรวจสอบขนาดล็อตก่อนการสั่งซื้อ (สมมติว่าจะเปิดตำแหน่ง Buy):

//+------------------------------------------------------------------+
//| เปิดตำแหน่ง Buy                                                 |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

//--- ตรวจสอบขนาดล็อตก่อน OrderSend เพื่อหลีกเลี่ยงข้อผิดพลาด "เงินไม่พอ" (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;
     }
//---
  }

    โพสต์ที่เกี่ยวข้อง

    ความคิดเห็น (0)