การเรียกใช้ indicator ใน MQL5
LINK: กลับไปที่หน้าสารบัญ
เนื้อหาในตัวอย่างนี้
- การเรียกใช้ MA (SMA, EMA, MMA, LMA)
- การส่งคำสั่งเปิดออเดอร์ BUY/SELL
การเปิด IDE โปรแกรมสำหรับเขียน EA
ขั้นตอนที่ 1 คลิกที่ปุ่ม IDE ในโปรแกรม MT5 ดังที่แสดงในรูปด้านล่าง
ขั้นตอนที่ 2 สร้าง EA ใหม่
ตรงส่วน Property ด้านบน คือข้อมูลของ EA ที่จะแสดงให้ผู้ใช้งานเห็นเมื่อทำการติดตั้งโปรแกรม ดังรูปตัวอย่างด้านล่าง
int OnInit() — คือฟังก์ชันที่จะทำงานเป็นฟังก์ชันแรก และจะทำงานแค่ครั้งเดียวตอนเริ่มต้นเท่านั้น โดยจะเริ่มทำงานเมื่อ user ทำการติดตั้ง EA หรือ MT5 ทำการ Reconnect Server
int OnDeinit(const int reason) — คือฟังก์ชันที่จะทำงานเมื่อ EA ถูกถอนการติดลบ
void OnTick() — คือฟังก์ชันที่จะทำงานทุกครั้ง เมื่อราคาในกราฟขยับ ซึ่งฟังก์ชันนี้จะเป็นฟังก์ชันหลัก ในการเขียนโปรแกรมของเรา คล้ายๆ กับฟังก์ชัน main() ในภาษาอื่นๆ
ส่วนด้านล่างของฟังก์ชัน OnTick() เราสามารถเขียนฟังก์ชันอื่นๆ ที่เราต้องการเข้าไปได้
เริ่มเขียนโค้ด
โค้ดทั้งหมดของโปรแกรมมีดังนี้
อธิบายโค้ด
เริ่มแรก เราต้อง import libraries สำหรับเทรดเข้ามาในโปรแกรมก่อน โดยใช้คำสั่ง 2 บรรทัดนี้
#include <Trade\Trade.mqh>
CTrade trade;
ต่อมาคือพื้นที่สำหรับประกาศตัวแปร Global ซึ่งฟังก์ชันทั้งหมดในโปรแกรมนี้จะสามารถเรียกใช้งาน ตัวแปรเหล่านี้ได้ และเปลี่ยนค่าได้ ซึ่งในตัวอย่างนี้ผมสร้างเอาไว้ตัวเดียวคือ
datetime LOR;
โดยตัวแปรนี้ผมจะเอาไว้เก็บค่าเวลาล่าสุดที่ EA ส่งออเดอร์ไป เพื่อป้องกันไม่ให้ EA ส่งคำสั่งหลายรอบในแท่งเทียนอันเดิม จากนั้นก็กำหนดค่าเริ่มต้นให้มันในฟังก์ชัน OnInit() ดังนี้
LOR = iTime(NULL,0,0);
หมายความว่าให้ LOR เก็บค่าเวลาของแท่งเทียนปัจจุบัน ณ เวลาที่ติดตั้งโปรแกรม ดังนั้น EA จะไม่ยิงออเดอร์จนกว่าจะขึ้นแท่งเทียนอันใหม่
ขั้นต่อไปคือขั้นตอนสำคัญที่จำเป็นสำหรับ EA ทุกตัว นั่นคือการอ่านค่า Bid-Ask ถ้าใครเคยเขียนภาษา MQL4 มาก่อน เรื่องนี้จะไม่จำเป็นเลย เพราะเราสามารถเรียกใช้ตัวแปร bid-ask ได้เลย ซึ่งโปรแกรมมันจะไปดึงราคา bid-ask มาให้โดยอัตโนมัติ
แต่ในภาษา MQL5 นั้นตัวแปร bid-ask ไม่ได้ถูกสงวนไว้เป็นตัวแปรแทนราคา Bid-Ask เราจึงไม่สามารถเรียกใช้งานมันได้โดยตรง และจำเป็นต้องประกาศขึ้นมาก่อนดังนี้
//Get the bid-ask price
double Ask, Bid;
Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
ต่อไปเราจะพยายามเรียกใช้งานฟังก์ชัน Moving Average กันครับ ซึ่งสามารถเรียกใช้งานได้ดังนี้
//Define property of MA
int MADef1 = iMA(_Symbol,_Period,950,0,MODE_EMA,PRICE_CLOSE);
int MADef2 = iMA(_Symbol,_Period,1000,0,MODE_EMA,PRICE_CLOSE);
ถ้าใครอยากได้โหมดอื่นก็เปลี่ยนตรง MODE_EMA ให้เป็นอย่างอื่นนะครับ เช่น
MODE_SMA, MODE_SMMA, MODE_LWMA
แต่สังเกตุเห็นความผิดปกติของคำสั่งนี้ไหมครับ นั่นก็คือมันมีชนิดเป็น int ซึ่งหมายความว่าฟังก์ชันนี้จะคืนค่าออกมาเป็นตัวเลขจำนวนเต็มเท่านั้น แต่ค่า moving average มันคือค่าเฉลี่ยของราคาซึ่งเป็นจุดทศนิยม ซึ่งในภาษา MQL4 จะเห็นได้ชัดเจนว่าฟังก์ชันนี้จะคืนค่ากลับมาเป็น double
แล้วทำไมฟังก์ชัน MA ใน MQL5 ถึงคืนค่าเป็น int สงสัยกันไหมครับ?
นั่นเป็นเพราะว่าค่าที่คืนกลับมา ไม่ใช่ค่า MA นั่นเอง แต่เป็นค่าที่เรียกว่า handles หรือพูดง่ายๆ มันเป็นตัวแทนที่เอาไว้เรียกใช้ MA ในภายหลังนั้นเอง
แล้วเราจะดึงค่า MA ออกมาจากตัวแปร handles นี้ได้ยังไงล่ะ?
วิธีการก็คือ การสร้างตัวแปรอาเรย์ขึ้นมา แล้วกำหนดประเภทตัวแปรให้เป็น Series จากนั้น ใช้คำสั่ง CopyBuffer ดังนี้
//Create an array for keep several price
double A950[], A1000[];
//Sort the price array from the current candles downwards
ArraySetAsSeries(A950,true);
ArraySetAsSeries(A1000,true);
//Define MA, line-1, current bar, 3 bars, store result
CopyBuffer(MADef1, 0, 0, 3, A950);
CopyBuffer(MADef2, 0, 0, 3, A1000);
ซึ่งความหมายของคำสั่ง CopyBuffer มีดังนี้
int CopyBuffer(
int indicator_handle, // indicator handle
int buffer_num, // indicator buffer number
int start_pos, // start position
int count, // amount to copy
double buffer[] // target array to copy
);
buffer_num ก็คือค่าที่ต้องการดึงออกมาจาก indicator หรือก็คือค่าเส้น (line) ต่างๆ ที่เราเห็นจาก indicator นั่นเอง ซึ่ง indicator แต่ละตัวก็จะมีจำนวนเส้นแตกต่างกันไป โดยใน MA นั้นจะมีอยู่แค่เส้นเดียว ดังนั้นเราจึงใส่ค่าเป็น 0 ก็คือให้อ่านค่าเส้นที่ 1 ของ indicator
start_pos คือตำแหน่งที่จะเริ่มอ่าน โดยตำแหน่ง 0 ก็คือแท่งปัจจุบัน ถ้าเป็น 1 ก็คือย้อนหลังไป 1 แท่ง
count คือจำนวนค่า MA ที่จะทำการอ่านออกมา อย่างเช่นถ้าใส่ 3 ก็คือ เราจะดึงค่า MA ย้อนหลังไปอีก 3 แท่ง นับจากแท่งปัจจุบัน
buffer[] คือตัวแปรอาเรย์ ที่เอาไว้รับค่าจาก MA ออกมา
ตัวอย่างการนำไปใช้งานก็อย่างเช่น
A950[0] //คือค่า MA ของแท่งปัจจุบัน
A950[1] //คือค่า MA ของแท่งก่อนหน้า
ส่วนที่เหลือก็เป็นคำสั่งเทรด ดังนี้
trade.Sell(0.01,NULL,Bid,SL,TP,OCM); //คำสั่งส่งออเดอร์ Sell
trade.Buy(0.01,NULL,Ask,SL,TP,OCM); //คำสั่งส่งออเดอร์ Buy
0.01 คือค่า lot size
NULL คือให้ส่งออเดอร์ไปที่ Symbol ปัจจุบันที่รัน EA อยู่
Bid คือราคาซื้อทันทีสำหรับออเดอร์ Sell ส่วน Ask คือราคาซื้อทันทีของออเดอร์ Buy
SL/TP ก็คือ SL และ TP ของออเดอร์ ถ้าไม่มีหรือไม่ได้กำหนดเอาไว้ก็ใส่ 0
OCM คือคอมเม้นท์ของออเดอร์
ทดสอบ EA
เมื่อเราเขียน EA เสร็จแล้ว เราสามารถเอามันมารันทดสอบกับข้อมูลจริงย้อนหลังได้เลย โดยทำตามขั้นตอนดังนี้
ขั้นตอนแรก คลิก Compile EA
ถ้าโปรแกรมของเราเขียนถูกต้องทั้งหมด เวลาคอมไพล์ก็จะเห็นข้อความประมาณนี้
ถ้าใครคอมไพล์ได้แบบนี้ หมายความว่า EA พร้อมสำหรับรันจริงแล้ว แต่ก่อนจะเอาไปรันจริง เราควรจะเอาไปรันทดสอบ หรือที่เรียกว่า back test ดูก่อนนะ
ส่วนใครที่คอมไพล์ไม่ผ่าน ก็ต้องกลับไปแก้ error ให้เสร็จเรียบร้อยก่อน จนกว่าจะคอมไพล์ผ่าน
ขั้นตอนที่ 2 เปิดโปรแกรมทดสอบใน MT5
หากใครต้องการดูผลการรันด้วย (การเทรดจริงๆ ในหน้ากราฟ) ให้ติ๊กตรง Visual mode with the display … ที่ผมวงกลมเอาไว้
สรุป
ในบทความนี้ได้แนะนำการสร้าง EA การเขียน EA และการทดสอบ EA รวมทั้งการเรียกใช้งาน indicator Moving Average และการส่งออเดอร์ ซึ่งถือเป็นพื้นฐานของการเขียน EA ที่ทุกคนจำเป็นต้องใช้ และเป็นการปูพื้นฐาน สำหรับการศึกษาการเขียน MQL5 ในอนาคต
LINK: กลับไปที่หน้าสารบัญ