ผู้เขียนแนวคิด: ef91 (อ่านแนวสนทนาได้ที่ #62)
ผู้เขียนโค้ด 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; } //--- }
โพสต์ที่เกี่ยวข้อง
- Ilan 1.6 Dynamic HT: ระบบเทรดอัจฉริยะสำหรับ MetaTrader 5
- สร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณซื้อขายจาก Morning/Evening Stars + MFI
- สร้าง Expert Advisor ด้วย MQL5 Wizard สำหรับสัญญาณการเทรด Bullish Harami/Bearish Harami และ RSI
- ใช้ MQL5 Wizard สร้าง Expert Advisor ด้วยสัญญาณเทรด Morning/Evening Stars + Stochastic
- การสร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณการเทรดจาก Morning/Evening Stars + RSI