การเขียน 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
HFM Market Promotion

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

FOREXDUCK Logo

FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง

HFM Promotion