มีท่านที่สนใจเรื่องการเขียน EA สำหรับช่วยเทรดฟอร์เร็กซ์ ส่งข่าวมาขอให้ช่วยอธิบายการในการเขียนคำสั่งสำหรับการทำ Trailing Stop Loss หลังจากที่เปิดคำสั่งซื้อ/ขาย (Order) ไปแล้ว ก็จะขออธิบายดูไม่แน่ใจว่าจะพอรู้เรื่องไหม
Trailing Stop Loss หรือเรียกสั้นๆ ว่า Trailing Stop เป็นการเลื่อนราคาตัดขาดทุน หรือ Stop Loss ตามราคาที่เคลื่อนไป โดยปรกติจะทำเพื่อปกป้องทุน หรือ บางครั้งก็ใช้เป็นเงื่อนไขในปิดคำสั่งซื้อ/ขาย ซึ่งใน EA ที่ผู้เขียนจัดทำส่วนใหญ่จะใช้เป็นเงื่อนไขในการปิดคำสั่ง กล่าวคือ เมื่อเราเลื่อน Stop Loss ตามราคาที่เคลื่อนไปตามทิศทางที่เราเปิดคำสั่งซื้อ/ขาย เมื่อถึงจุดหนึ่งปรากฏว่าราคาสวนกลับมาชน Stop Loss คำสั่งซื้อ/ขายนั้นๆ ก็จะถูกปิดไปอัตโนมัติ
ก่อนอื่น เรามาดูกันก่อนว่า เวลาที่เราเปิดคำสั่งซื้อ/ขายบน MT4 หรือ MT5 แต่ละครั้งมีราคาอะไรเกี่ยวข้องบ้าง ซึ่งถ้าดูจากไดอะล็อกข้างต้น จะพบว่ามีราคาที่เกี่ยวข้องกับการเปิดคำสั่งซื้อ/ขายแต่ละครั้ง จะมีอยู่ด้วยกัน 3 ราคา คือ
- ราคาที่ทำการเปิดคำสั่งซื้อ/ขาย หรือ Order Open Price
- ราคาเป้าหมายกำไร หรือ Take Profit : TP
- ราคาตัดขาดทุน หรือ 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 ของโปรแกรมเทรดทั้ง MT4 และ MT5 จะทำงานหลังจากที่ราคาเคลื่อนผ่าน ราคาที่ทำการเปิดคำสั่งซื้อ/ขายไปแล้ว โดยโปรแกรมเทรดจะทำการตรวจสอบเปรียบเทียบราคาปัจจุบัน ถ้าระยะห่างของทั้งสองราคามากกว่าค่าที่เรากำหนดไว้ โปรแกรมเทรดจะเลื่อนราคาตัดขาดทุน หรือ Stop loss ไปไว้ที่ ราคาปัจจุบัน ลบ ด้วยค่า Trailing Stop ที่ตั้งไว้ และจะทำการเลื่อน ราคาตัดขาดทุน ทุกครั้งที่ราคาปัจจุบันกับราคาตัดขาดทุนห่างกันมากกว่าค่า Tailing Stop ที่เราตั้งไว้
หลักการเขียน Trailing Stop ใน EA (Expert Advisor)
0. กำหนดค่า Points ที่จะใช้ทำ Trailing Stop
bool OrderSelect(
int index, // index or order ticket
int select, // flag
int pool=MODE_TRADES // mode
);
โดยที่
index
|
หมายถึง | ลำดับรายการหรือ ตัวบ่งชี้รายการ (Ticket) | |
select
|
หมายถึง | เงื่อนไขในการชี้รายการ
ซึ่งมี 2 ตัวเลือก
คือ
|
|
pool=MODE_TRADES
|
หมายถึง |
ระบุโหมดในการเปิดคำสั่งซื้อขายของรายการ
มีด้วยกัน 2
โหมด คือ
|
2. อ่านค่า ราคาปัจจุบันด้วยฟังก์ชัน iClose()
3. อ่านราคาที่เปิดคำสั่งซื้อขายของรายการที่ถูกเลือกด้วยคำสั่ง OrderOpenPrice() นำมาเปรียบเทียบกับราคาปัจจุบันที่อ่านจากฟังก์ชัน iClose() โดยแยกเป็น 2 กรณี
- กรณีของการซื้อ (BUY) ราคาปัจจุบันมากกว่า OrderOpenPrice() จะดำเนินการทำ Trailing Stop ต่อ
- กรณีของการขาย (SELL) ราคาปัจจุบัน น้อยกว่า OrderOpenPrice() จะดำเนินการทำ Trailing Stop ต่อ
- กรณีของการซื้อ (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
);
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 ไปให้ศึกษาด้วย