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

การใช้งาน Trailing Stop ใน MetaTrader 5 สำหรับเทรดเดอร์

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

โค้ดนี้สามารถนำไปใช้ได้ทั้งกรณีที่ใช้ Stop Loss หรือไม่ใช้ก็ได้

 

ความต้องการเบื้องต้น

  • คุณต้องเพิ่ม "Trade.mqh" เพื่อเข้าถึง CTrade class ที่ช่วยให้คุณจัดการกับตำแหน่งและคำสั่งได้
#include <Trade\Trade.mqh> // <<------------------------------------------ เพิ่ม "Trade.mqh" เพื่อเข้าถึง CTrade Class
  • คุณต้องตั้งค่าพารามิเตอร์ input เพื่อปรับระยะห่างของ Trailing ตามต้องการ ซึ่งไม่จำเป็นต้องทำ แต่สะดวกดี
input double Traling_Step = 3.0;
  • คุณต้องประกาศตัวแปรสำหรับ CTrade class โดยตั้งชื่อได้ตามใจ แต่ควรตั้งชื่อหลังจาก OnInit event handler
 
  • จากนั้นคุณต้องสร้าง if statement เพื่อตรวจสอบว่ามีตำแหน่งใด ๆ ที่กำลังเปิดอยู่หรือไม่ โดยเรียกใช้ฟังก์ชัน Check_TrailingStop(); สำหรับ ทุก ๆ tick ซึ่งสำคัญมากเพราะ EA ต้องทำงานได้อย่างราบรื่น ควรวาง statement นี้ไว้ที่ ด้านบนของ OnTick event handler เพื่อทำงานได้อย่างถูกต้อง
//+------------------------------------------------------------------+ //| ฟังก์ชันเริ่มต้นของ Expert | //+------------------------------------------------------------------+ int OnInit() { //--- สร้าง timer EventSetTimer(60); //--- return(INIT_SUCCEEDED); } CTrade trade; // <<------------------------------------------ ประกาศ class "CTrade" คุณสามารถเปลี่ยน "trade" เป็นชื่ออื่นได้
void OnTick() { if(PositionsTotal() > 0) { // เรียกใช้งานฟังก์ชัน trailing stop สำหรับทุก tick ถ้ามีตำแหน่งที่เปิดอยู่ Check_TralingStop(); } }

 

  • คุณต้องประกาศฟังก์ชันที่กำหนดเองชื่อ Check_TrailingStop(); (ในที่นี้ Check_TrailingStop สามารถตั้งชื่ออะไรก็ได้) เพื่อทำงานที่เหลือ ฟังก์ชันนี้จะวนผ่าน ตำแหน่งที่เปิดทั้งหมด และปรับ Trailing ตามระยะที่คุณต้องการ
void Check_TralingStop() { int totalPositions = PositionsTotal(); for(int count = 0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // รับหมายเลข Ticket ของตำแหน่งโดยใช้ 'index' ของตำแหน่ง if(PositionSelectByTicket(TicketNo)) { // เลือกตำแหน่งตามหมายเลข Ticket (เราก็เลือกหมายเลข Ticket แล้ว) if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { // ตรวจสอบประเภทตำแหน่ง double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); // <<-------------------รับ Stop Loss ปัจจุบันของตำแหน่ง double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()), _Digits); if(stopLoss < openPrice) { // ไม่มี Stop Loss เป็นจริง if(bidPrice > openPrice && trailingLevel > openPrice) { // ทำงานเพียงครั้งเดียวต่อแต่ละตำแหน่ง กำหนด SL แรก trade.PositionModify(ticket, trailingLevel, takeProfit); } if(bidPrice > openPrice && trailingLevel > stopLoss) { // ตรวจสอบว่าระดับ Trailing สูงกว่าระดับก่อนหน้า trade.PositionModify(ticket, trailingLevel, takeProfit); } } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()), _Digits); if(stopLoss < openPrice) { if(askPrice < openPrice && trailingLevel < openPrice) { // ทำงานเพียงครั้งเดียวต่อแต่ละตำแหน่ง กำหนด SL แรก trade.PositionModify(ticket, trailingLevel, takeProfit); } if(askPrice < openPrice && trailingLevel < stopLoss) { // ตรวจสอบว่าระดับ Trailing สูงกว่าระดับก่อนหน้า trade.PositionModify(ticket, trailingLevel, takeProfit); } } } } } }


 

     

     

     

     

     

     

     

     

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

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