การเขียน function Trailingstop

IUX Markets Bonus

Trailing Stop เป็นเทคนิคการจัดการความเสี่ยงที่ช่วยปกป้องกำไรที่ได้มาแล้ว โดยการปรับ Stop Loss ให้เคลื่อนที่ตามราคาที่เปลี่ยนแปลงไปในทิศทางที่เป็นประโยชน์ต่อการเทรด ต่อไปนี้เป็นตัวอย่างการใช้งาน Trailing Stop ใน MQL4:

การใช้ฟังค์ชั่น trailingstop
การใช้ฟังค์ชั่น trailingstop

ฟังก์ชัน Trailing Stop พื้นฐาน

 


void ApplyTrailingStop(int ticket, int trailingPoints)
{
    if(!OrderSelect(ticket, SELECT_BY_TICKET))
    {
        Print("Error selecting order ", ticket, " for trailing stop. Error: ", GetLastError());
        return;
    }
    
    double newSL;
    
    if(OrderType() == OP_BUY)
    {
        newSL = NormalizeDouble(Bid - trailingPoints * Point, Digits);
        if(newSL > OrderStopLoss())
        {
            if(!OrderModify(ticket, OrderOpenPrice(), newSL, OrderTakeProfit(), 0, CLR_NONE))
            {
                Print("Error modifying buy order ", ticket, ". Error: ", GetLastError());
            }
        }
    }
    else if(OrderType() == OP_SELL)
    {
        newSL = NormalizeDouble(Ask + trailingPoints * Point, Digits);
        if(newSL < OrderStopLoss() || OrderStopLoss() == 0)
        {
            if(!OrderModify(ticket, OrderOpenPrice(), newSL, OrderTakeProfit(), 0, CLR_NONE))
            {
                Print("Error modifying sell order ", ticket, ". Error: ", GetLastError());
            }
        }
    }
}


  • วัตถุประสงค์:
    • ปรับ Stop Loss อัตโนมัติเพื่อปกป้องกำไรที่เกิดขึ้นแล้ว
    • รักษาระยะห่างคงที่ระหว่างราคาปัจจุบันกับ Stop Loss
  • พารามิเตอร์ที่รับเข้ามา:
    • หมายเลขออเดอร์ (Ticket)
    • ระยะห่างของ Trailing Stop (ในหน่วย points)
  • ขั้นตอนการทำงาน:
    • a) เลือกออเดอร์ตามหมายเลข Ticket ที่ระบุ
    • b) ตรวจสอบประเภทของออเดอร์ (Buy หรือ Sell)
    • c) คำนวณ Stop Loss ใหม่ตามราคาปัจจุบันและระยะห่างที่กำหนด
    • d) เปรียบเทียบ Stop Loss ใหม่กับ Stop Loss ปัจจุบัน
    • e) ถ้าจำเป็นต้องปรับ Stop Loss ให้ทำการแก้ไขออเดอร์
  • การคำนวณ Stop Loss ใหม่:
    • สำหรับออเดอร์ Buy: Stop Loss ใหม่ = ราคา Bid ปัจจุบัน – ระยะห่างที่กำหนด
    • สำหรับออเดอร์ Sell: Stop Loss ใหม่ = ราคา Ask ปัจจุบัน + ระยะห่างที่กำหนด
  • เงื่อนไขในการปรับ Stop Loss:
    • สำหรับออเดอร์ Buy: ปรับเมื่อ Stop Loss ใหม่สูงกว่า Stop Loss ปัจจุบัน
    • สำหรับออเดอร์ Sell: ปรับเมื่อ Stop Loss ใหม่ต่ำกว่า Stop Loss ปัจจุบัน หรือยังไม่มีการตั้ง Stop Loss
  • การจัดการข้อผิดพลาด:
    • ตรวจสอบความสำเร็จในการเลือกออเดอร์
    • ตรวจสอบความสำเร็จในการแก้ไขออเดอร์
    • บันทึกข้อผิดพลาด (ถ้ามี) เพื่อการตรวจสอบภายหลัง
  • ข้อควรระวัง:
    • ต้องแน่ใจว่าระยะห่างที่กำหนดเป็นไปตามกฎของโบรกเกอร์
    • ควรคำนึงถึงค่า spread ในการคำนวณ Stop Loss ใหม่
    • การเรียกใช้ฟังก์ชันนี้บ่อยเกินไปอาจส่งผลต่อประสิทธิภาพของระบบ
  • การใช้งานที่แนะนำ:
    • เรียกใช้ฟังก์ชันนี้ในฟังก์ชัน OnTick() เพื่อตรวจสอบและปรับ Stop Loss อย่างต่อเนื่อง
    • อาจเพิ่มเงื่อนไขเพื่อจำกัดความถี่ในการปรับ Stop Loss เช่น ตรวจสอบทุกๆ 1 นาที
  • ประโยชน์:
    • ช่วยปกป้องกำไรที่เกิดขึ้นแล้วโดยอัตโนมัติ
    • ลดความเสี่ยงจากการกลับตัวของราคาอย่างรวดเร็ว
    • ช่วยให้นักเทรดสามารถปล่อยให้กำไรวิ่งต่อไปได้โดยไม่ต้องคอยปรับ Stop Loss ด้วยตนเอง
  • ข้อจำกัด:
    • อาจทำให้ออกจากตลาดเร็วเกินไปในช่วงที่ราคามีความผันผวนสูง
    • ไม่เหมาะกับทุกสภาวะตลาดหรือทุกกลยุทธ์การเทรด

การใช้งาน Trailing Stop ในฟังก์ชัน OnTick()

 



void OnTick()
{
    for(int i = 0; i < OrdersTotal(); i++)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
            {
                ApplyTrailingStop(OrderTicket(), 50); // Trailing Stop 50 pips
            }
        }
    }
}

  • วัตถุประสงค์:
    • เพื่อตรวจสอบและปรับ Trailing Stop สำหรับออเดอร์ที่เปิดอยู่ทุกครั้งที่มีการเปลี่ยนแปลงของราคา
  • ขั้นตอนการทำงาน:
    • a) ตรวจสอบว่าสามารถทำการเทรดได้หรือไม่
    • b) วนลูปผ่านทุกออเดอร์ที่เปิดอยู่
    • c) เลือกออเดอร์แต่ละรายการ
    • d) ตรวจสอบเงื่อนไขของออเดอร์ (เช่น สัญลักษณ์, ประเภทออเดอร์)
    • e) ใช้งาน Trailing Stop กับออเดอร์ที่ตรงตามเงื่อนไข
  • เงื่อนไขที่ควรตรวจสอบ:
    • สัญลักษณ์ของออเดอร์ตรงกับที่ต้องการหรือไม่
    • ประเภทของออเดอร์ (Buy หรือ Sell)
    • Magic Number (ถ้ามีการใช้งาน)
    • ระยะเวลาที่ออเดอร์เปิดอยู่
    • กำไร/ขาดทุนปัจจุบันของออเดอร์
  • การเรียกใช้ฟังก์ชัน Trailing Stop:
    • ส่งหมายเลข Ticket ของออเดอร์
    • กำหนดระยะห่างของ Trailing Stop (อาจเป็นค่าคงที่หรือคำนวณตามเงื่อนไข)
  • ข้อควรระวัง:
    • ตรวจสอบความถี่ในการปรับ Trailing Stop เพื่อไม่ให้กระทบต่อประสิทธิภาพ
    • พิจารณาใช้ตัวแปร static เพื่อจำกัดความถี่ในการปรับ (เช่น ทุก 1 นาที)
    • ระวังการใช้งานในช่วงที่ตลาดมีความผันผวนสูง
  • ประโยชน์ของการใช้ Trailing Stop ใน OnTick():
    • ปรับ Stop Loss อย่างต่อเนื่องตามการเคลื่อนไหวของราคา
    • ช่วยปกป้องกำไรที่เกิดขึ้นโดยอัตโนมัติ
    • สามารถปรับเปลี่ยนกลยุทธ์ได้ตามสภาวะตลาด
  • ข้อจำกัด:
    • อาจทำให้ออกจากตลาดเร็วเกินไปในบางสถานการณ์
    • ต้องระวังการใช้งานทรัพยากรของระบบมากเกินไป

Trailing Stop แบบขั้นบันได (Step Trailing Stop)

 


void ApplyStepTrailingStop(int ticket, int trailingPoints, int stepPoints)
{
    if(!OrderSelect(ticket, SELECT_BY_TICKET))
    {
        Print("Error selecting order ", ticket, " for step trailing stop. Error: ", GetLastError());
        return;
    }
    
    double newSL;
    
    if(OrderType() == OP_BUY)
    {
        newSL = NormalizeDouble(Bid - trailingPoints * Point, Digits);
        if(newSL > OrderStopLoss() + stepPoints * Point)
        {
            if(!OrderModify(ticket, OrderOpenPrice(), newSL, OrderTakeProfit(), 0, CLR_NONE))
            {
                Print("Error modifying buy order ", ticket, ". Error: ", GetLastError());
            }
        }
    }
    else if(OrderType() == OP_SELL)
    {
        newSL = NormalizeDouble(Ask + trailingPoints * Point, Digits);
        if(newSL < OrderStopLoss() - stepPoints * Point || OrderStopLoss() == 0)
        {
            if(!OrderModify(ticket, OrderOpenPrice(), newSL, OrderTakeProfit(), 0, CLR_NONE))
            {
                Print("Error modifying sell order ", ticket, ". Error: ", GetLastError());
            }
        }
    }


  • แนวคิดพื้นฐาน:
    • Trailing Stop แบบขั้นบันไดปรับ Stop Loss เป็นระยะๆ แทนที่จะปรับทุกจุดเหมือน Trailing Stop พื้นฐาน
    • ช่วยลดการปรับ Stop Loss บ่อยเกินไป ซึ่งอาจเป็นประโยชน์ในตลาดที่มีความผันผวน
  • พารามิเตอร์สำคัญ:
    • ระยะห่างของ Trailing Stop (เช่น 50 pips)
    • ขนาดของขั้นบันได (เช่น 10 pips)
  • หลักการทำงาน:
    • เริ่มต้นด้วยการตั้ง Stop Loss เหมือน Trailing Stop ปกติ
    • ปรับ Stop Loss ใหม่เมื่อราคาเคลื่อนที่ไปตามทิศทางที่เป็นกำไรเกินกว่าขนาดของขั้นบันได
  • ขั้นตอนการทำงาน:
    • a) ตรวจสอบราคาปัจจุบัน
    • b) คำนวณระยะห่างระหว่างราคาปัจจุบันกับ Stop Loss ปัจจุบัน
    • c) ถ้าระยะห่างมากกว่าระยะห่างของ Trailing Stop บวกกับขนาดของขั้นบันได ให้ปรับ Stop Loss
  • ตัวอย่างการทำงาน (สำหรับออเดอร์ Buy):
    • ราคาเปิด: 1.2000
    • ระยะห่างของ Trailing Stop: 50 pips
    • ขนาดของขั้นบันได: 10 pips
    • Stop Loss เริ่มต้น: 1.1950
    • เมื่อราคาขึ้นไปถึง 1.2060, Stop Loss จะถูกปรับเป็น 1.2010
    • ครั้งต่อไป Stop Loss จะถูกปรับเมื่อราคาขึ้นไปถึง 1.2070
  • ข้อดี:
    • ลดความถี่ในการปรับ Stop Loss เมื่อเทียบกับ Trailing Stop แบบปกติ
    • อาจช่วยลดการถูกปิดออเดอร์เร็วเกินไปในตลาดที่มีความผันผวน
    • ลดภาระการประมวลผลของระบบ
  • ข้อเสีย:
    • อาจทำให้เสียกำไรมากขึ้นเมื่อราคากลับตัวอย่างรวดเร็ว เมื่อเทียบกับ Trailing Stop แบบปกติ
    • การตั้งค่าขนาดของขั้นบันไดที่ไม่เหมาะสมอาจทำให้ไม่ได้ประโยชน์จาก Trailing Stop เท่าที่ควร
  • การปรับใช้:
    • สามารถปรับขนาดของขั้นบันไดตามความผันผวนของตลาด
    • อาจใช้ร่วมกับตัวบ่งชี้ทางเทคนิคเพื่อปรับขนาดของขั้นบันไดแบบไดนามิก
  • ข้อควรระวัง:
    • ต้องแน่ใจว่าขนาดของขั้นบันไดไม่ใหญ่เกินไปจนทำให้เสียประโยชน์ของ Trailing Stop
    • ควรทดสอบย้อนหลังเพื่อหาค่าที่เหมาะสมสำหรับแต่ละคู่สกุลเงินและกรอบเวลา
  • การประยุกต์ใช้ขั้นสูง:
    • ปรับขนาดของขั้นบันไดตามความผันผวนของตลาด (เช่น ใช้ค่า ATR)
    • ใช้ขนาดขั้นบันไดที่แตกต่างกันในแต่ละช่วงของกำไร
    • รวมกับเงื่อนไขอื่นๆ เช่น แนวรับแนวต้าน หรือแนวโน้มของตลาด

 

Trailing Stop ที่ใช้ตัวบ่งชี้ทางเทคนิค

ในตัวอย่างนี้ เราจะใช้ Moving Average เป็นเส้น Trailing Stop

 



void ApplyMATrailingStop(int ticket, int maPeriod, int maShift)
{
    if(!OrderSelect(ticket, SELECT_BY_TICKET))
    {
        Print("Error selecting order ", ticket, " for MA trailing stop. Error: ", GetLastError());
        return;
    }
    
    double maValue = iMA(NULL, 0, maPeriod, maShift, MODE_SMA, PRICE_CLOSE, 0);
    
    if(OrderType() == OP_BUY)
    {
        if(maValue > OrderStopLoss())
        {
            if(!OrderModify(ticket, OrderOpenPrice(), maValue, OrderTakeProfit(), 0, CLR_NONE))
            {
                Print("Error modifying buy order ", ticket, ". Error: ", GetLastError());
            }
        }
    }
    else if(OrderType() == OP_SELL)
    {
        if(maValue < OrderStopLoss() || OrderStopLoss() == 0)
        {
            if(!OrderModify(ticket, OrderOpenPrice(), maValue, OrderTakeProfit(), 0, CLR_NONE))
            {
                Print("Error modifying sell order ", ticket, ". Error: ", GetLastError());
            }
        }
    }
}

  • แนวคิดพื้นฐาน:
    • ใช้ Moving Average (MA) เป็นเส้นอ้างอิงสำหรับการปรับ Stop Loss
    • แทนที่จะใช้ระยะห่างคงที่, Stop Loss จะถูกปรับตาม MA
  • พารามิเตอร์สำคัญ:
    • ประเภทของ MA (เช่น Simple, Exponential, Weighted)
    • ช่วงเวลาของ MA (เช่น 20 periods, 50 periods)
    • ระยะเวลา (Timeframe) ที่ใช้คำนวณ MA
  • หลักการทำงาน:
    • คำนวณค่า MA สำหรับแท่งเทียนปัจจุบัน
    • ใช้ค่า MA เป็นจุดอ้างอิงในการตั้ง Stop Loss
  • ขั้นตอนการทำงาน:
    • a) คำนวณค่า MA ล่าสุด
    • b) เปรียบเทียบค่า MA กับ Stop Loss ปัจจุบัน
    • c) ปรับ Stop Loss ให้สอดคล้องกับค่า MA ตามทิศทางของออเดอร์
  • การปรับ Stop Loss:
    • สำหรับออเดอร์ Buy:
      • ถ้า MA สูงกว่า Stop Loss ปัจจุบัน, ปรับ Stop Loss ขึ้นมาที่ค่า MA
    • สำหรับออเดอร์ Sell:
      • ถ้า MA ต่ำกว่า Stop Loss ปัจจุบัน, ปรับ Stop Loss ลงมาที่ค่า MA
  • ข้อดี:
    • มีความยืดหยุ่นมากกว่า Trailing Stop แบบระยะห่างคงที่
    • สามารถปรับตัวตามแนวโน้มของตลาดได้ดี
    • ลดโอกาสการถูกปิดออเดอร์เร็วเกินไปในช่วงที่ราคาผันผวน
  • ข้อเสีย:
    • อาจตอบสนองช้าในตลาดที่มีการเปลี่ยนแปลงอย่างรวดเร็ว
    • การเลือกพารามิเตอร์ของ MA ที่ไม่เหมาะสมอาจทำให้ประสิทธิภาพลดลง
  • การปรับใช้:
    • สามารถใช้ MA หลายเส้นร่วมกัน (เช่น MA ระยะสั้นและระยะยาว)
    • ปรับช่วงเวลาของ MA ตามความผันผวนของตลาด
  • ข้อควรระวัง:
    • MA อาจไม่เหมาะสมในทุกสภาวะตลาด โดยเฉพาะในตลาดแนวขวาง
    • ควรทดสอบกับข้อมูลย้อนหลังเพื่อหาพารามิเตอร์ที่เหมาะสม
  • การประยุกต์ใช้ขั้นสูง:
    • ใช้ MA ร่วมกับตัวบ่งชี้อื่นๆ เช่น Bollinger Bands หรือ ATR
    • ปรับความไวของ MA ตามสภาพตลาด (เช่น ใช้ MA ระยะสั้นในตลาดผันผวน)
    • ใช้ MA เป็นเพียงส่วนหนึ่งของเงื่อนไขในการปรับ Stop Loss
  • ตัวอย่างการทำงาน:
    • ออเดอร์ Buy เปิดที่ราคา 1.2000
    • MA(20) ปัจจุบันอยู่ที่ 1.1980
    • เมื่อราคาเพิ่มขึ้น และ MA(20) เคลื่อนที่ขึ้นมาที่ 1.2020
    • Stop Loss จะถูกปรับขึ้นมาที่ 1.2020
 YWO Promotion

การใช้งาน Trailing Stop ช่วยในการจัดการความเสี่ยงและปกป้องกำไรที่ได้มาแล้ว อย่างไรก็ตาม ควรทดสอบอย่างละเอียดก่อนนำไปใช้งานจริง เนื่องจาก Trailing Stop ที่แคบเกินไปอาจทำให้ออกจากตลาดเร็วเกินไปในช่วงที่ราคาผันผวน

 Exness Promotion
PNFPB Install PWA using share icon

For IOS and IPAD browsers, Install PWA using add to home screen in ios safari browser or add to dock option in macos safari browser