MyBanner

โฆษณา

วันพุธที่ 19 ธันวาคม พ.ศ. 2561

หลักการในการเขียนชุดคำสั่งทำ Trailing Stop Loss ใน EA สำหรับช่วยเทรด Forex




              มีท่านที่สนใจเรื่องการเขียน EA สำหรับช่วยเทรดฟอร์เร็กซ์ ส่งข่าวมาขอให้ช่วยอธิบายการในการเขียนคำสั่งสำหรับการทำ Trailing Stop Loss หลังจากที่เปิดคำสั่งซื้อ/ขาย (Order) ไปแล้ว ก็จะขออธิบายดูไม่แน่ใจว่าจะพอรู้เรื่องไหม

Trailing Stop Loss หรือเรียกสั้นๆ ว่า Trailing Stop เป็นการเลื่อนราคาตัดขาดทุน หรือ Stop Loss ตามราคาที่เคลื่อนไป โดยปรกติจะทำเพื่อปกป้องทุน หรือ บางครั้งก็ใช้เป็นเงื่อนไขในปิดคำสั่งซื้อ/ขาย ซึ่งใน EA ที่ผู้เขียนจัดทำส่วนใหญ่จะใช้เป็นเงื่อนไขในการปิดคำสั่ง กล่าวคือ เมื่อเราเลื่อน Stop Loss ตามราคาที่เคลื่อนไปตามทิศทางที่เราเปิดคำสั่งซื้อ/ขาย เมื่อถึงจุดหนึ่งปรากฏว่าราคาสวนกลับมาชน Stop Loss คำสั่งซื้อ/ขายนั้นๆ ก็จะถูกปิดไปอัตโนมัติ

ก่อนอื่น เรามาดูกันก่อนว่า เวลาที่เราเปิดคำสั่งซื้อ/ขายบน MT4 หรือ MT5 แต่ละครั้งมีราคาอะไรเกี่ยวข้องบ้าง ซึ่งถ้าดูจากไดอะล็อกข้างต้น จะพบว่ามีราคาที่เกี่ยวข้องกับการเปิดคำสั่งซื้อ/ขายแต่ละครั้ง จะมีอยู่ด้วยกัน 3 ราคา คือ 

  1. ราคาที่ทำการเปิดคำสั่งซื้อ/ขาย หรือ Order Open Price
  2. ราคาเป้าหมายกำไร หรือ Take Profit : TP
  3. ราคาตัดขาดทุน หรือ Stop Loss : SL

ซึ่งถ้าเรามาดูที่ชุดคำสั่งภาษา MQL ที่ใช้ในการเปิดคำสั่งซื้อ/ขาย ก็คือคำสั่ง OrderSend() ซึ่งจะมีรูปแบบชุดคำสั่งดังนี้

int  OrderSend(
               string   symbol,                          // symbol
                 int      cmd                              // operation
             double   volume,                          // volume
             double   price,                              // price
                 int      slippage,                         // slippage
             double   stoploss                         // stop loss
             double   takeprofit,                       // take profit
               string   comment=NULL,          // comment
                 int      magic=0,                        // magic number
            datetime expiration=0,                  // pending order expiration
               color    arrow_color=clrNONE  // color
          );

โดยที่


symbol หมายถึง ชื่อคู่เงินหรือสินทรัพย์


cmd หมายถึง คำสั่งในการเปิดการซื้อ/ขาย (Trade Operation) มี 6 คำสั่ง ประกอบด้วยคำสั่ง OP_BUY (0), OP_SELL (1), OP_BUYLIMIT (2), OP_SELLLIMIT (3), OP_BUYSTOP (4), OP_SELLSTOP (5)


volume หมายถึง ขนาดล็อตที่จะเปิดคำสั่งซื้อขาย (Lot size)


price หมายถึง ราคาที่เปิดคำสั่งซื้อ/ขาย


slippage หมายถึง จำนวนครั้งในการเปลี่ยนสูงสุดเมื่อราคาขณะนั้นไม่ตรงกับราคาที่ระบุในคำสั่ง


stoploss หมายถึง ราคาตัดขาดทุน


takeprofit หมายถึง ราคาเป้าหมายกำไร


comment=NULL หมายถึง หมายเหตุ ใส่เป็นค่า NULL ถ้าไม่ใส่ข้อความใดๆ แต่ปรกติจะใส่ชื่อเป็น EA


magic=0 หมายถึง เป็นตัวเลขเฉพาะ ใส่ 0 ถ้าไปม่ใส่ค่าใดๆ โดยปรกตินักพัฒนา EA จะใส่เป็นเลขประจำตัวของตัว EA (ผู้พัฒนา EA ตั้งขึ้นเอง)


expiration=0 หมายถึง ระยะเวลาหมดอายุของคำสั่ง (ใช้ในกรณี ค่า cmd ตั้งแต่ 2 ขึ้นไป)


arrow_color=clrNONE หมายถึง สีของลูกศรชี้ตำแหน่งราคาที่ซื้อบนหน้าจอกราฟ ใส่เป็น clrNONE ถ้าไปม่ต้องการกำหนดสีเป็นสีอื่นๆ


จากรายละเอียดเกี่ยวกับชุดคำสั่งภาษา MQL4 สำหรับเปิดคำสั่งซื้อ/ขายในข้างต้น จะสังเกตเห็นว่ามีราคาที่เกี่ยวข้องกับการเปิดคำสั่งซื้อ/ขาย หรือ Order อยู่ด้วยกัน 3 ราคา คือ ราคาที่ทำการเปิดคำสั่งซื้อ/ขาย (price), ราคาตัดขาดทุน (stoploss) และราคาเป้าหมายกำไร (takeprofit) โดยราคาที่เราสนใจ ณ ตอนนี้ คือ ราคาตัดขาดทุน หรือ Stop Loss ซึ่งถ้าเราทำการเปิดคำสั่งซื้อ/ขาย ไม่ว่าจะเป็นบน MT4 หรือ MT5 บนหน้าจอกราฟของโปรแกรมเทรด จะมีเส้นแสดงราคาที่เกี่ยวข้องกับการเปิดคำสั่งซื้อ/ขาย ปรากฏอยู่ ถ้าเราไม่ได้ระบุ stop loss และ take profit ไว้ เส้นแสดงราคาของคำสั่งซื้อ/ขายจะมีเพียงเส้นเดียว แต่ถ้าระบุราคาทั้งสองอย่างหลังไว้ด้วย จำนวนเส้นแสดงราคาของคำสั่งซื้อ/ขายก็จะมีเพิ่มขึ้น อย่างในภาพตัวอย่างถัดเป็นตัวอย่างของการเปิดคำสั่งซื้อ (BUY) และระบุ Stop loss ไว้ บนหน้าจอกราฟของโปรแกรมเทรด ก็จะมีเส้นแสดงราคาที่เกี่ยวข้องปรากฏขึ้น 2 เส้นดังรูป


การทำ Trailing Stop บนโปรแกรมเทรด


บนโปรแกรมเทรด ทั้งบน MT4 และ MT5 จะอนุญาตให้เราทำการสั่งให้โปรแกรมเทรดทำ Trailing Stop บนหน้าจอกราฟของโปรแกรมได้ โดยสามารถทำได้ 2 วิธี คือ

วิธีแรก ให้ทำการวางลูกศรของเมาส์บนเส้นราคาตัดขาดทุน หรือ stoploss ของคำสั่งซื้อ/ขาย แล้วคลิกปุ่มขวาของเมาส์ จากนั้นเลือกที่หัวข้อ Trailing Stop จากเมนูที่ปรากฏขึ้น และเลือกระยะในการเลื่อนราคาตัดขาดทุนจากเมนูย่อยที่ปรากฏขึ้นดังตัวอย่างในรูปถัดไป



วิธีที่สอง ทำได้โดยการคลิปุ่มขวาของเมาส์บนรายการคำสั่งซื้อ/ขายที่ต้องการทำ Trailing Stop ในตารางที่อยู่ด้านล่างของโปรแกรมเทรด แล้วเลือกที่หัวข้อ Trailing Stop จากนั้นเลือกระยะ Trailing Stop จากเมนูย่อยที่ปรากฏขึ้น ดังรูป


กลไกการทำงานของระบบ Trailing Stop ของโปรแกรมเทรด

หลังจากที่เราทำการกำหนดค่าของการทำ Trailing Stop  ของคำสั่งซื้อ/ขายที่เราเปิดไว้ตามวิธีการข้างต้นแล้ว กลไกการทำงานของระบบ Trailing Stop ของโปรแกรมเทรดทั้ง MT4 และ MT5 จะทำงานหลังจากที่ราคาเคลื่อนผ่าน ราคาที่ทำการเปิดคำสั่งซื้อ/ขายไปแล้ว โดยโปรแกรมเทรดจะทำการตรวจสอบเปรียบเทียบราคาปัจจุบัน ถ้าระยะห่างของทั้งสองราคามากกว่าค่าที่เรากำหนดไว้ โปรแกรมเทรดจะเลื่อนราคาตัดขาดทุน หรือ Stop loss ไปไว้ที่ ราคาปัจจุบัน ลบ ด้วยค่า Trailing Stop ที่ตั้งไว้ และจะทำการเลื่อน ราคาตัดขาดทุน ทุกครั้งที่ราคาปัจจุบันกับราคาตัดขาดทุนห่างกันมากกว่าค่า Tailing Stop ที่เราตั้งไว้

หลักการเขียน Trailing Stop ใน EA (Expert Advisor)

เท่าที่ผู้เขียนพยายามค้นหาชุดคำสั่งภาษา MQL ที่ทำหน้าที่เกี่ยวกับ Trailing Stop ปรากฏว่าไม่มีชุดคำสั่งสำหรับงานดังกล่าวโดยเฉพาะ ดังนั้นเราจะต้องเขียนฟังก์ชันสำหรับงานนี้ขึ้นมาเอง โดยใส่ฟังก์ชันดังกล่าวไว้ใส่ใน ฟังก์ชัน OnTick() ของต้นฉบับโปรแกรมของ EA ซึ่งฟังก์ชัน Ontick() จะเป็นฟังก์ชันที่ถูกเรียกขึ้นมาทำงานโดยโปรแกรมเทรดทุกครั้งที่ราคามีการเปลี่ยนแปลง ซึ่งมีหลักการคร่าวๆ ดังนี้

0. กำหนดค่า Points ที่จะใช้ทำ Trailing Stop

1. ทำการเลือกรายการของคำสั่งซื้อ/ขายที่เปิดไว้ ที่จะทำ Trailing Stop ด้วยฟังก์ชัน OrderSelect() ซึ่งมีรูปแบบชุดคำสั่งดังนี้

bool  OrderSelect(
              int     index,                               // index or order ticket
              int     select,                               // flag
              int     pool=MODE_TRADES  // mode
   );

โดยที่



index
หมายถึง ลำดับรายการหรือ ตัวบ่งชี้รายการ (Ticket)


select
หมายถึง เงื่อนไขในการชี้รายการ ซึ่งมี 2 ตัวเลือก คือ
  • SELECT_BY_POS ระบุตำแหน่งรายการด้วยตัวเลขลำดับรายการ
  • SELECT_BY_TICKET ระบุตำแหน่งรายการด้วยค่าเฉพาะที่เรียกว่า ticket


pool=MODE_TRADES
หมายถึง
ระบุโหมดในการเปิดคำสั่งซื้อขายของรายการ มีด้วยกัน 2 โหมด คือ
  • MODE_TRADES (default) รายการเทรดปรกติ
  • MODE_HISTORY รายการเทรดในประวัติ


2. อ่านค่า ราคาปัจจุบันด้วยฟังก์ชัน iClose()

3. อ่านราคาที่เปิดคำสั่งซื้อขายของรายการที่ถูกเลือกด้วยคำสั่ง OrderOpenPrice() นำมาเปรียบเทียบกับราคาปัจจุบันที่อ่านจากฟังก์ชัน iClose() โดยแยกเป็น 2 กรณี

  • กรณีของการซื้อ (BUY) ราคาปัจจุบันมากกว่า OrderOpenPrice() จะดำเนินการทำ Trailing Stop ต่อ 
  • กรณีของการขาย (SELL) ราคาปัจจุบัน น้อยกว่า OrderOpenPrice() จะดำเนินการทำ Trailing Stop ต่อ
แต่ถ้าไม่ตรงกับเงื่อนไขข้างต้น จะยังไม่ทำอะไรที่เกี่ยวกับ Trailing Stop

4. ในกรณีที่มีการระบุราคาตัดขาดทุน หรือ Stop Loss ไว้ในคำสั่งซื้อ/ขาย จะทำการอ่านค่าราคาตัดขาดทุนดังกล่าว ออกมาด้วยฟังก์ชัน OrderStopLoss() นำมาเปรียบเทียบกับราคาปัจจุบัน โดยแบ่งเป็น 2 กรณี
  • กรณีของการซื้อ (BUY) จะนำราคาปัจจุบัน ลบด้วย OrderStopLoss()
  • กรณีของการขาย (SELL) จะนำ OrderStopLoss() ลบด้วย ราคาปัจจุบัน
ถ้าผลที่ได้มากกว่าจำนวน Points ที่จะทำ Trailing Stop ที่ระบุในข้อ 0 จะดำเนินการทำ Trailing Stop ต่อ แต่ถ้าน้อยกว่า จะยังไม่ทำอะไร

5. ทำการหาราคาตัดขาดทุนในตำแหน่งใหม่ โดยแบ่งเป็น 2 กรณีเช่นกันคือ
  • กรณีของการซื้อ (BUY) จะนำราคาปัจจุบัน ลบด้วย จำนวน Points ที่จะทำ Trailing Stop ที่กำหนดไว้ใน ข้อ 0 
  • กรณีของการขาย (SELL) จะนำราคาปัจจุบัน บวกด้วย จำนวน Points ท่ี่จะทำ Trailling Stop
ซึ่งผลที่ได้จะเป็นราคาที่เราจะนำมาระบุเป็นราคาตัดขาดทุน

6. ทำการปรับปรุงคำสั่งซื้อ/ขาย ที่กำลังทำ Trailing Stop โดยนำราคาที่ได้ มาระบุในช่อง Stop Loss ของคำสั่ง OrderModify() ของ MQL ซึ่งมีรูปแบบชุดคำสั่งดังนี้

bool  OrderModify(
            int        ticket,            // ticket
        double     price,             // price
        double     stoploss,        // stop loss
        double     takeprofit,     // take profit
       datetime   expiration,    // expiration
         color      arrow_color  // color
   );

โดยที่



ticket หมายถึง
ตัวบ่งชี้รายการ (Ticket) สร้างอัตโนมัติโดยโปรแกรมเทรด


arrow_color หมายถึง สีของเส้นราคา Stop Loss
ในบรรดาพารามิเตอร์ทั้งหมด มีพารามิเตอร์ stoploss และ arrow_color เท่านั้น ที่เป็นค่าที่ต้องระบุใหม่ ค่าพารามิเตอร์ expiration จะใส่ค่าปริยายคือ 0 ไว้ ส่วนค่าพารามิเตอร์อื่นๆ สามารถอ่านได้จากรายการคำสั่งซื้อ/ขาย (Order) ที่เรากำลังทำ Trailing Stop โดย พารามิเตอร์ ticket จะอ่านด้วยคำสั่ง OrderTicket(), พารามิเตอร์ price จะอ่านด้วยคำสั่ง OrderOpenPrice(), พารามิเตอร์ takeprofit จะอ่านด้วยคำสั่ง OrderTakeProfit() เวลาเขียนชุดคำสั่ง จะสามารถเขียนได้ดังตัวอย่างนี้

      ….
      if (!OrderModify( OrderTicket(),
                                    OrderOpenPrice(),
                                    ราคาตัดขาดทุน,
                                    OrderTakeProfit(),
                                    0,
                                    Red))
      {
              Print("OrderModify error ",GetLastError());
      }
       …..
ปิดท้าย

ในทางปฏิบัติ จะมีวิธีการในการหาราคาตัดขาดทุนแบบอื่นๆ ที่ไม่ได้กำหนดเป็นจำนวน Points ตายตัวดังรายละเอียดที่กล่าวมา เราสามารถหา ราคาตัดขาดทุน ที่จะทำ Trailing Stop ได้อีกหลายวิธี เช่น ใช้วิธีการอ่านค่าจากอินดิเคเตอร์บางตัว หรือใช้วิธีนับแท่งราคา เป็นต้น สำหรับใน EA ที่ผู้เขียนจัดทำให้ลองศึกษา จะใช้วิธีอ่านค่าจากอินเตอร์เคเตอร์ที่ชื่อว่า Fractal นำมาเปรียบเทียบหาราคาตัดขาดทุนที่เหมาะสมสำหรับการทำ Trailing Stop และใช้วิธีนับแท่งราคาโดยนำราคาสูงสุดต่ำสุดของแท่งราคามาเปรียบเทียบหาราคาตัดขาดทุนที่เหมาะสมสำหรับการทำ Trailing Stop เป็นอีกวิธีการหนึ่ง ซึ่งทุกท่านสามารถดาวน์โหลด EA ที่ผู้เขียนทำไว้ไปศึกษาได้ เพราะผู้เขียนได้แถมต้นฉบับโปรแกรม หรือ source code ของ EA ไปให้ศึกษาด้วย

Adz2you.