MetaTrader5
การใช้งาน Trailing Stop ใน MetaTrader 5 สำหรับเทรดเดอร์
โค้ดนี้สามารถนำไปใช้ได้ทั้งกรณีที่ใช้ 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); } } } } } }
2024.04.05