การใช้คำสั่งในการซื้อขายใน MQL4
บทเรียน: การใช้คำสั่งในการซื้อขายใน MQL4
คลิ๊กเพื่อดูคลิปวีดีโอที่มีรายละเอียดมากกว่าบทความนี้ (ดูได้เฉพาะสมาชิก)
วัตถุประสงค์ของบทเรียน:
หลังจากจบบทเรียนนี้ ผู้เรียนจะสามารถใช้คำสั่งต่างๆ ใน MQL4 เพื่อเปิดคำสั่งซื้อขาย ตั้งค่า Stop Loss และ Take Profit รวมถึงตรวจสอบและปิดคำสั่งซื้อขายที่เปิดไว้ได้อย่างมีประสิทธิภาพ
ทำความเข้าใจเรื่อง Pips
ในต่างประเทศจะนิยมใช้หน่วยเป็น Pips เนื่องจากค่าที่พูดถึงจะมีค่าเท่ากันไม่ว่าจะใช้งานกับบัญชีประเภทต่างๆ หรือโบรกที่แตกต่างกัน เช่น ทองคำของโบรก A มีทศนิยม 3 จุด, โบรก B มีทศนิยม 2 จุด หากพูดกันโดยอ้างอิงหน่วยเป็นจุด (Points) ระยะจะไม่เท่ากัน เพราะหากคิดหน่วยเป็นจุดจะมีการคำนวณจากตัวเลขหลักขวามือสุด มูลค่าที่ได้จึงไม่เหมือนกัน
ตัวอย่างล่างนี้สมมุติว่าเป็นการพูดถึงการเคลื่อนไหวของราคาของเทรดเดอร์สองคนที่ใช้บัญชีที่มีทศนิยมของสินค้าตัวเดียวกันแต่มีทศนิยมแตกต่างกัน:
ตัวอย่างที่ 1 : ราคาทองคำของโบรก A 1950.150 ถ้าราคาเคลื่อนไหวจาก 1950.150 ไปเป็น 1950.151 จะถือว่าเคลื่อนไหว 1 Point
ตัวอย่างที่ 2 : ราคาทองคำของโบรก B 1950.15 ถ้าราคาเคลื่อนไหวจาก 1950.15 ไปเป็น 1950.16 จะถือว่าเคลื่อนไหว 1 Point
ตัวอย่างการนับแบบ Points ของบัญชีที่มีทศนิยมไม่เท่ากัน
- โบรก A ทศนิยม 3 จุด : ถ้าราคาเคลื่อนไหวจาก 1950.150 ไปที่ 1950.200 นั่นคือ 50 Points
- โบรก B ทศนิยม 2 จุด : ถ้าราคาเคลื่อนไหวจาก 1950.15 ไปที่ 1950.20 นั่นคือ 5 Points
จากตัวอย่างข้างต้นจะเห็นความแตกต่างระหว่างบัญชีที่มีจำนวนทศนิยมที่แตกต่างกันทั้งที่เป็นสินค้าเดียวกัน แต่หากมีการคำนวณโดยอ้างอิงหน่วยเป็น Pips ก็จะได้ผลลัพธ์ออกมาตรงกัน ตามหลักการคิดค่าแบบ Pips ข้างล่างนี้:
5 ตำแหน่งทศนิยม: Pip คือการเคลื่อนไหวที่ตำแหน่งทศนิยมที่ 4
3 ตำแหน่งทศนิยม: Pip คือการเคลื่อนไหวที่ตำแหน่งทศนิยมที่ 2
2 ตำแหน่งทศนิยม: Pip คือการเคลื่อนไหวที่ตำแหน่งทศนิยมที่ 2
1 ตำแหน่งทศนิยม: Pip คือการเคลื่อนไหวที่ตำแหน่งทศนิยมที่ 1
ตัวอย่างการนับเป็น Points
- โบรก A ทศนิยม 3 จุด : ถ้าราคาเคลื่อนไหวจาก 1950.150 ไปที่ 1950.200 นั่นคือ 50 Points
- โบรก B ทศนิยม 2 จุด : ถ้าราคาเคลื่อนไหวจาก 1950.15 ไปที่ 1950.20 นั่นคือ 5 Points
ตัวอย่างการนับเป็น Pips:
- โบรก A ทศนิยม 3 จุด : ถ้าราคาเคลื่อนไหวจาก 1950.150 ไปที่ 1950.200 นั่นคือ 5 Pips
- โบรก B ทศนิยม 2 จุด : ถ้าราคาเคลื่อนไหวจาก 1950.15 ไปที่ 1950.20 นั่นคือ 5 Pips
จากตัวอย่างข้างต้นจะเห็นความแตกต่างระหว่าง Points และ Pips ดังนี้ 10 Points = 1 Pips
สุดท้ายในการใช้เครื่องมือ Crosshair ใน MT4 หรือ MT5 หน่วยที่ได้ออกมานั้นจะเป็น Points ไม่ใช่ Pips แม้ว่าจะเขียนไว้ที่กราฟเป็น Pips ก็ตาม ซึ่งเป็นสิ่งที่ผู้เทรดควรทราบเพื่อไม่ให้สับสนในการคำนวณ
ทำความเข้าใจเรื่อง _Point
_Point ในหัวข้อนี้ ไม่ใช่ Points ที่เป็นหน่วยวัดการเคลื่อนที่ของราคา ดังนั้นจึงต้องแยกความหมายของสองคำนี้ให้ออก
_Point คือ มูลค่าของการเคลื่อนที่ของราคาต่อจุด ซึ่งเป็นหน่วยที่เล็กที่สุดที่ใช้ในการวัดการเคลื่อนไหวของราคาในสินทรัพย์ทางการเงิน เช่น คู่เงินหรือทองคำ มูลค่านี้อาจแตกต่างกันไปตามประเภทของสินค้าและประเภทของบัญชีเทรด
ตัวอย่างเช่น:
– ในการซื้อขายทองคำ มูลค่าของการเคลื่อนที่ต่อ 1 Points อาจหมายถึงการเคลื่อนไหวของราคา 0.01 ดอลลาร์ต่อออนซ์ หากราคาเคลื่อนที่ไป 100 จุด หมายถึงการเคลื่อนไหวของราคา 1 ดอลลาร์ เป็นต้น
– ในการซื้อขายคู่เงิน (เช่น EUR/USD) 1 Point อาจหมายถึงการเคลื่อนไหวของราคา 0.0001 ดอลลาร์
การเข้าใจ _Point จะช่วยให้ผู้เทรดสามารถคำนวณการเคลื่อนไหวของราคาในหน่วยที่เล็กที่สุดได้ ทำให้สามารถกำหนดระดับราคาที่แม่นยำได้มากขึ้น เช่น การตั้งค่า Stop Loss และ Take Profit ให้เหมาะสมกับการเคลื่อนไหวของราคาในตลาด
การคำนวณราคา (คูณด้วย _Point)
หากต้องการคำนวณราคาจริงจากจำนวนจุดที่ราคาจะเคลื่อนไหว จะต้อง คูณ จำนวนจุดด้วยค่า _Point เพื่อแปลงจำนวนจุดนั้นเป็นราคาจริงที่เกี่ยวข้อง ตัวอย่างเช่น:
ในการเขียนโปรแกรม สามารถใช้ได้ 2 แบบ คือ Point หรือ _Point ทั้งสองให้ผลลัพธ์ออกมาเหมือนกัน แล้วแต่จะเลือกใช้
double stopLoss = askPrice - 50 * _Point;
หรือ
double stopLoss = askPrice - 50 * Point;
ในกรณีนี้:
50 * _Pointแปลงจำนวน 50 จุด (pips) เป็นราคาจริง (ในหน่วยของราคา เช่น 0.50 ดอลลาร์สำหรับทองคำ)- ดังนั้น, ค่าที่คำนวณได้จากการคูณนี้จะถูกนำไปใช้เป็นราคาที่แท้จริงในการตั้งค่า Stop Loss
การคำนวณจำนวนจุด (หารด้วย _Point)
หากมีการเคลื่อนไหวของราคาและต้องการรู้ว่าการเคลื่อนไหวนั้นเท่ากับกี่จุด (pips) จะต้อง หาร การเปลี่ยนแปลงของราคาด้วยค่า Point เพื่อแปลงราคานั้นเป็นจำนวนจุด ตัวอย่างเช่น:
double priceMovement = currentPrice - previousPrice;
double pointsMoved = priceMovement / _Point;
ในกรณีนี้:
priceMovement / _Pointจะแปลงการเคลื่อนไหวของราคาจริง (เช่น 0.50 ดอลลาร์) เป็นจำนวนจุด (pips) ที่ราคาเคลื่อนไหว- ผลลัพธ์ที่ได้คือจำนวนจุดที่ราคาขยับ
สรุป:
- คูณด้วย _Point เมื่อต้องการแปลงจำนวนจุดเป็นราคาจริง (จากจุดไปเป็นดอลลาร์หรือหน่วยราคาอื่น ๆ)
- หารด้วย _Point เมื่อต้องการแปลงการเคลื่อนไหวของราคาเป็นจำนวนจุด (จากดอลลาร์หรือหน่วยราคาไปเป็นจุด)
ราคา Ask และ ราคา Bid คืออะไร
ในการซื้อขายในตลาดการเงินจะมีราคาที่เกี่ยวข้องกับการเทรดอยู่ 2 ราคาหลัก คือ ราคา Ask และ ราคา Bid
ราคา Ask คือราคาที่โบรกเกอร์ต้องการขายสินทรัพย์ หากเทรดเดอร์ต้องการเปิดออเดอร์ Buy ออเดอร์นั้นจะได้ออเดอร์ที่ราคา Ask
ราคา Bid คือราคาที่โบรกเกอร์ยินดีซื้อสินทรัพย์ หากเทรดเดอร์ต้องการเปิดออเดอร์ Sell ออเดอร์นั้นจะได้ออเดอร์ที่ราคา Bid
กลไกของตลาดทำให้การซื้อขายเกิดขึ้นระหว่างโบรกเกอร์และเทรดเดอร์ ซึ่งหมายความว่าเมื่อผู้เทรดทำการซื้อ ผู้เทรดจะซื้อตามราคา Ask ที่โบรกเกอร์เสนอ และเมื่อผู้เรียนทำการขาย ผู้เรียนจะขายตามราคา Bid ที่โบรกเกอร์ยินดีซื้อ
ตัวอย่างเช่น หากราคา Ask ของทองคำอยู่ที่ 1900.50 USD ต่อออนซ์ และราคา Bid อยู่ที่ 1900.20 USD ต่อออนซ์:
– หากเทรดเดอร์ต้องการซื้อทองคำ เทรดเดอร์จะต้องจ่ายที่ราคา 1900.50 USD (Ask)
– หากเทรดเดอร์ต้องการขายทองคำ เทรดเดอร์จะได้รับเงินที่ราคา 1900.20 USD (Bid)
ส่วนต่างระหว่างราคา Ask และ Bid เรียกว่า สเปรด (Spread) ซึ่งสะท้อนถึงค่าธรรมเนียมที่เทรดเดอร์ต้องจ่ายให้กับโบรกเกอร์ในการเปิดออเดอร์แต่ละครั้ง เมื่อเปิดออเดอร์ เทรดเดอร์จะติดลบทันทีเนื่องจากค่าสเปรดที่เป็นต้นทุนในการเทรด ค่าสเปรดนี้จะคงอยู่จนกว่าออเดอร์จะถูกปิด
หัวข้อ 1: การเปิดคำสั่งซื้อขายด้วยคำสั่ง OrderSend()
1.1 คำสั่ง OrderSend() คืออะไร?
คำสั่ง OrderSend() เป็นฟังก์ชันหลักใน MQL4 ที่ใช้ในการส่งคำสั่งซื้อขายไปยังตลาด เพื่อเปิดการซื้อหรือขายคู่สกุลเงินหรือสินทรัพย์อื่นๆ
1.2 รูปแบบการใช้งาน OrderSend()
int ticket = OrderSend(
string symbol, // สัญลักษณ์ของคู่สกุลเงิน เช่น "EURUSD"
int cmd, // คำสั่งซื้อขาย: 0=Buy, 1=Sell
double volume, // ปริมาณการซื้อขาย เช่น 0.1 lot
double price, // ราคาที่ต้องการซื้อหรือขาย
int slippage, // ค่า Slippage ที่ยอมรับได้
double stoploss, // ระดับ Stop Loss
double takeprofit, // ระดับ Take Profit
string comment, // ข้อความแสดงความคิดเห็นที่แนบมากับคำสั่ง
int magic, // หมายเลขเฉพาะของ EA (ใช้แยกแยะคำสั่งของ EA ต่างๆ)
datetime expiration, // วันหมดอายุของคำสั่ง (ใช้กับ Pending Orders)
color arrow_color // สีของลูกศรที่แสดงบนกราฟเมื่อเปิดคำสั่ง
);
1.3 ตัวอย่างการเปิดคำสั่งซื้อ (Buy Order)
double lotSize = 0.1;
double askPrice = MarketInfo("EURUSD", MODE_ASK);
double stopLoss = askPrice - 50 * Point;
double takeProfit = askPrice + 50 * Point;
int ticket = OrderSend(
"EURUSD", // สัญลักษณ์ของคู่เงิน ใส่ NULL หมายถึงสินค้าปัจจุบันที่เปิดกราฟอยู่
OP_BUY, // คำสั่งซื้อ
lotSize, // ขนาด Lot
askPrice, // ราคาที่จะซื้อ
3, // ค่า Slippage ที่ยอมรับได้
stopLoss, // ระดับ Stop Loss
takeProfit, // ระดับ Take Profit
"My EA Order", // ข้อความความคิดเห็น
0, // หมายเลขเฉพาะของ EA
0, // ไม่มีวันหมดอายุ
Blue // สีของลูกศร
);
ในทางปฎิบัติการเขียนโปรแกรมมักจะนิยมเขียนการเรียกใช้ฟังก์ชัน OrderSend() เป็นแบบบรรทัดเดียว เพื่อให้โค้ดดูง่ายและลดจำนวนบรรทัดลง
ตัวอย่างของการเปิดออเดอร์ Buy
string ea_name "Scalping EA";
int magic_number=12345678;
int slippage = 3;
double lotSize = 0.1;
double stopLoss = Ask- 50 * Point;
double takeProfit = Ask+ 50 * Point;
int ticket = OrderSend(NULL,OP_BUY,lotSize,Ask,slippage,stopLoss,takeProfit,ea_name ,magic_number,0,Blue);
ตัวอย่างของการเปิดออเดอร์ Sell
string ea_name = "Scalping EA";
int magic_number = 12345678;
int slippage = 3;
double lotSize = 0.1;
double stopLoss = Bid + 50 * Point;
double takeProfit = Bid - 50 * Point;
int ticket = OrderSend(NULL, OP_SELL, lotSize, Bid, slippage, stopLoss, takeProfit, ea_name,magic_number, 0, Red);
หัวข้อ 2: การตั้งค่า Stop Loss และ Take Profit
2.1 ความสำคัญของ Stop Loss และ Take Profit
Stop Loss และ Take Profit เป็นเครื่องมือสำคัญในการจัดการความเสี่ยง โดย Stop Loss ใช้เพื่อจำกัดการขาดทุนที่อาจเกิดขึ้น ส่วน Take Profit ใช้เพื่อกำหนดระดับราคาที่จะปิดคำสั่งซื้อขายเมื่อได้กำไรตามที่ต้องการ
เทรดเดอร์ที่มีประสบการณ์สูงอาจนิยาม Stop Loss ว่าเป็นการปกป้องทุนสำหรับการเทรดในอนาคต ส่วน Take Profit อาจมองว่าเป็นความเสี่ยงที่อาจทำให้พลาดโอกาสทำกำไรหรือแม้กระทั่งกลายเป็นการขาดทุน หากตั้งระยะห่างจากราคาปัจจุบันมากเกินไป
2.2 การคำนวณระดับ Stop Loss และ Take Profit
– Stop Loss: คำนวณจากระดับราคาที่ต่ำกว่าราคาซื้อ (สำหรับคำสั่งซื้อ) หรือต่ำกว่าราคาขาย (สำหรับคำสั่งขาย)
– Take Profit: คำนวณจากระดับราคาที่สูงกว่าราคาซื้อ (สำหรับคำสั่งซื้อ) หรือสูงกว่าราคาขาย (สำหรับคำสั่งขาย)
2.3 ตัวอย่างการตั้งค่า Stop Loss และ Take Profit
double stopLoss = askPrice - 50 * Point; // ตั้ง Stop Loss ห่างจากราคา 50 จุด
double takeProfit = askPrice + 50 * Point; // ตั้ง Take Profit ห่างจากราคา 50 จุด
หัวข้อ 3: การตรวจสอบสถานะคำสั่งซื้อขายด้วยคำสั่ง OrderSelect()
3.1 คำสั่ง OrderSelect() คืออะไร?
OrderSelect() เป็นฟังก์ชันที่ใช้ในการเลือกและเข้าถึงออเดอร์ (คำสั่งซื้อขาย) ที่ผู้เรียนเปิดหรือปิดในบัญชีการเทรดของผู้เรียน เปรียบเสมือนการบอกโปรแกรมว่า “เฮ้! ฉันต้องการดูข้อมูลของออเดอร์นี้หน่อย”
การทำงานของ OrderSelect()
เมื่อผู้เรียนต้องการตรวจสอบหรือตรวจสอบข้อมูลของออเดอร์ใดๆ เช่น ต้องการดูว่าผู้เรียนเปิดออเดอร์นี้ที่ราคาเท่าไร ใช้ขนาดลอต (Lot Size) เท่าไร หรือจะทำอะไรกับออเดอร์นี้ เช่น ปิดออเดอร์หรือแก้ไข Stop Loss/Take Profit ผู้เรียนต้องใช้ OrderSelect() เพื่อบอกโปรแกรมว่าให้เลือกออเดอร์นั้นมาก่อน
วิธีเลือกออเดอร์
มีสองวิธีหลักในการใช้ OrderSelect() เพื่อเลือกออเดอร์ที่ต้องการ:
- เลือกตามลำดับที่เปิด (SELECT_BY_POS):
- ใช้วิธีนี้เมื่อผู้เรียนต้องการเลือกออเดอร์โดยอิงตามลำดับที่เปิดในรายการ เช่น ออเดอร์แรก ออเดอร์ที่สอง เป็นต้น เหมือนกับการเลือกหนังสือจากชั้นหนังสือตามตำแหน่งที่วางอยู่
- เลือกตามหมายเลขคำสั่ง (SELECT_BY_TICKET):
- ใช้วิธีนี้เมื่อผู้เรียนรู้หมายเลขคำสั่ง (Ticket Number) ของออเดอร์ที่ต้องการเลือก เปรียบเสมือนการรู้รหัสหนังสือและค้นหาโดยตรงตามรหัสนั้น
3.2 รูปแบบการใช้งาน OrderSelect()
bool selected = OrderSelect(
int index, // หมายเลขคำสั่ง หรือดัชนีของคำสั่ง
int select, // ตัวเลือกการเลือก: SELECT_BY_POS หรือ SELECT_BY_TICKET
int pool=MODE_TRADES // เลือกจากคำสั่งที่เปิดอยู่ (MODE_TRADES) หรือคำสั่งที่ปิดแล้ว (MODE_HISTORY)
);
3.3 ตัวอย่างการตรวจสอบสถานะคำสั่งซื้อขาย
if(OrderSelect(ticket, SELECT_BY_TICKET)) {
double orderProfit = OrderProfit(); // ดึงข้อมูลกำไรจากคำสั่งซื้อขาย
Print("Current Profit: ", orderProfit);
}
หัวข้อ 4: การปิดคำสั่งซื้อขายด้วยคำสั่ง OrderClose()
4.1 คำสั่ง OrderClose() คืออะไร?
OrderClose() เป็นฟังก์ชันที่ใช้ในการปิดออเดอร์ (คำสั่งซื้อขาย) ที่ผู้เรียนได้เปิดไว้ในบัญชีการเทรดของผู้เรียน เปรียบเสมือนการบอกโปรแกรมว่า “ฉันต้องการหยุดการเทรดนี้และรับหรือหยุดการขาดทุนตามราคาตลาดปัจจุบัน”
การทำงานของ OrderClose()
เมื่อผู้เรียนเปิดออเดอร์ Buy หรือ Sell แล้ว และต้องการปิดออเดอร์นั้นเพื่อทำกำไรหรือหยุดการขาดทุน ผู้เรียนจะใช้ OrderClose() ในการปิดออเดอร์ ฟังก์ชันนี้จะปิดออเดอร์ที่เปิดอยู่ ณ ราคาตลาดปัจจุบัน โดยผู้เรียนสามารถเลือกว่าจะปิดออเดอร์ทั้งหมดหรือเพียงบางส่วนของจำนวนลอตที่เปิดอยู่
วิธีการใช้ OrderClose()
ในการใช้ OrderClose() ผู้เรียนต้องบอกโปรแกรมว่า:
- หมายเลขคำสั่ง (Ticket Number): หมายเลขที่ไม่ซ้ำกันของออเดอร์ที่ผู้เรียนต้องการปิด
- จำนวนลอต (Lot Size): จำนวนลอตที่ผู้เรียนต้องการปิด หากผู้เรียนเปิดไว้ 1 ลอต ผู้เรียนสามารถเลือกที่จะปิด 0.5 ลอตหรือทั้งหมดได้
- ราคา (Price): ราคาที่ต้องการปิดออเดอร์ ซึ่งปกติจะใช้ราคาตลาดปัจจุบัน
- Slippage: ค่าสลิปเพจที่ผู้เรียนยอมรับได้หากราคาตลาดมีการเปลี่ยนแปลงเล็กน้อยระหว่างการปิดออเดอร์
- สีของลูกศร: สีที่จะแสดงบนกราฟเพื่อระบุจุดที่ผู้เรียนปิดออเดอร์ (เป็นเพียงเครื่องหมายที่ใช้ในการแสดงผลบนกราฟ)
4.2 รูปแบบการใช้งาน OrderClose()
bool result = OrderClose(
int ticket, // หมายเลขคำสั่งซื้อขาย
double lots, // ขนาด Lot ที่ต้องการปิด
double price, // ราคาที่ต้องการปิด
int slippage, // ค่า Slippage ที่ยอมรับได้
color Arrow_Color // สีของลูกศรที่แสดงบนกราฟเมื่อปิดคำสั่ง
);
4.3 ตัวอย่างการปิดคำสั่งซื้อขาย
// สมมติว่าผู้เรียนต้องการปิดออเดอร์ที่มีหมายเลข Ticket 123456
int ticket = 123456;
double lots = 1.0; // จำนวน Lot size ที่ต้องการปิด สมมุติเปิดออเดอร์ที่ 1 Lot ถ้าใส่ 0.5 ก็หมายถึงปิดออเดอร์ไปครึ่งหนึ่ง
double price = Bid; // ใช้ราคาตลาดปัจจุบันสำหรับออเดอร์ Sell
int slippage = 3; // ยอมรับสลิปเพจ 3 จุด
bool closed = OrderClose(ticket, lots, price, slippage, Red);
if (closed) {
Print(“ออเดอร์ถูกปิดเรียบร้อยแล้ว”);
} else {
Print(“ไม่สามารถปิดออเดอร์ได้”);
}
if(closed) {
Print("Order closed successfully.");
} else {
Print("Failed to close order.");
}
}
หากต้องการปิดออเดอร์นั้นไปเลยโดยไม่กำหนดค่า Lot size ก็ใช้คำสั่งนี้
bool closed = OrderClose(ticket, OrderLots(), price, slippage, Red);
บทสรุป:
ในบทเรียนนี้ ผู้เรียนได้เรียนรู้วิธีการใช้คำสั่งหลักๆ ใน MQL4 เพื่อจัดการคำสั่งซื้อขายในตลาด ไม่ว่าจะเป็นการเปิดคำสั่งซื้อขายด้วย OrderSend() การตั้งค่า Stop Loss และ Take Profit รวมถึงการตรวจสอบและปิดคำสั่งซื้อขายด้วย OrderSelect() และ OrderClose() ความเข้าใจในหัวข้อนี้จะเป็นพื้นฐานสำคัญในการพัฒนา EA ที่สามารถทำงานในตลาดได้อย่างมีประสิทธิภาพ
เนื้อหาของบทความนี้ทั้งหมด จะดูได้เฉพาะสมาชิกที่สมัครเรียนเท่านั้น
หากต้องการสมัครเข้าเรียนสามารถติดต่อได้ที่ช่องทางติดต่อสอบถามได้ที่ด้านล่างของเว็บนี้