ภาษา MQL4 นั้นถูกออกแบบมาจากพื้นฐานของภาษา C++ ดังนั้นจึงสามารถใช้รูปแบบการเขียนโปรแกรมเช่นเดียวกันกับภาษา C++ ยกเว้น
- no address arithmetic;
- no goto operator;
- an anonymous enumeration can’t be declared;
- no multiple inheritance.
MQL4 คืออะไร
ก่อนที่จะมาเริ่มเขียน The First MQL4 เรามาลองดูส่วนหนึ่งของโค้ด EA กันก่อนครับ โดยดูตัวอย่างจากโค้ดด้านล่างนี้
int OnInit() {
return(INIT_SUCCEEDED);
}
มันคือการประกาศฟังก์ชั่น (Function) ครับ โดยในตัวอย่างเป็นการ Overwrite ฟังก์ชั่นที่ชื่อว่า OnInit ซึ่งมันคือเหตุการณ์ตอนเริ่มต้นของโปรแกรม หรือชื่อเต็มคือ Initialize Event (เหตุการณ์ หรือ Event คือสิ่งที่จะเกิดขึ้นในระหว่างที่โปรแกรมทำงาน โดยสังเกตุคีย์เวิร์ดคำว่า On… และตามด้วยชื่อเหตุการณ์ที่จะเข้ามาทำงาน ในตัวอย่างข้างต้นคือ On…Init)
ภาษาบ้าน ๆ คือ เมื่อโปรแกรมเริ่มทำงาน (หรือเมื่อ EA เริ่มทำงาน) จะเข้ามาทำงานในฟังก์ชั่น OnInit นั่นเอง
ใน MQL4 นั้นมี Event Function ในเรา Overwrite หลายตัวด้วยกันครับ อาทิเช่น
- OnStart
- OnInit
- OnDeinit
- OnTick
- OnTimer
- OnTester
- OnChartEvent
- OnCalculate
- …
โดยแต่ละฟังก์ชั่นนั้นจะเรียกใช้ในช่วงเหตุการณ์ที่ต่างกันออกไป ซึ่งในบทความนี้จะยังไม่ได้เจาะลึกอธิบาย แต่จะเป็นการปูพื้นให้กับผู้อ่านถึงการเขียนโปรแกรมกันก่อนครับ หากผู้อ่านเป็นโปรแกรมเมอร์อยู่แล้ว ก็สามารถข้ามบทความนี้ไปอ่านบทความอื่นได้เลยครับ
หากไม่ใช่โปรแกรมเมอร์อาจจะงง ว่าคำแต่ละคำในโค้ดที่เขียนไปข้างต้นหมายถึงอะไร เราลองมาดูโครงสร้างของฟังก์ชั่นในภาษา MQL4 กันก่อนครับ
void CloseOrder() {
}
มาเริ่มที่ตัวแรก ตรงตำแหน่งคำว่า void คือชนิดของตัวแปรในภาษา MQL4 ที่จะคืนค่ากลับออกมา หรือในภาษาโปรแกรมมิ่งจะเรียกว่า return data type ครับ
โดยถ้าเราไม่อยากให้มีอะไรคืนกลับออกมาจากการเรียกใช้งานฟังก์ชั่น CloseOrder ข้างต้นนี้ จะพิมพ์คำว่า void (แปลว่าว่างเปล่า) ลงไปครับ ตามตัวอย่าง
แต่ถ้าหากต้องการคืนตัวเลขจำนวนเต็มหล่ะ เช่นจะคืนค่าหมายเลขรายการทำธุรกรรม 134524 ก็จะต้องใส่เป็นชนิดตัวแปรจำนวนเต็ม int (Integer)
int CloseOrder() {
return 134524;
}
และถ้าหากต้องการคืนค่าจำนวนเงินที่เป็นทศนิยมหล่ะ 99.02 อะไรแบบนี้ ก็ใช้เป็น float หรือ double แทนครับ
double CloseOrder() {
return 99.02;
}
เรามาดูชนิดของตัวแปรในภาษา MQL4 จากทางเว็บไซต์ของผู้พัฒนากันครับ https://docs.mql4.com/basis/types
The basic data types are:
- integers (char, short, int, long, uchar, ushort, uint, ulong);
- logical (bool);
- literals (ushort);
- strings (string);
- floating-point numbers (double, float);
- color (color);
- date and time (datetime);
- enumerations (enum).
Complex data types are:
ต่อไปคือส่วนของชื่อฟังก์ชั่นครับ จากตัวอย่างชื่อฟังก์ชั่นคือ CloseOrder โดยหลักการตั้งชื่อตามมาตรฐานแล้วเค้าก็มีข้อห้ามกันนะครับ เช่น ห้ามขึ้นต้นด้วยตัวเลข, ห้ามใช้อักขระพิเศษ, หรือห้ามใช้คำสงวน ซึ่งข้อมูลตรงนี้คงต้องลองไปหาอ่านกันดูในบทความการเขียนโปรแกรมพื้นฐานทั่วไปนะครับ น่าจะคล้าย ๆ กัน
และส่วนต่อไปคือวงเล็ก () หลังชื่อฟังก์ชั่น จะเป็นพื้นที่ในส่วนของตัวแปรรับค่าจากภายนอกฟังก์ชั่น หรือที่เรียกว่าพารามิเตอร์ Parameter (ต่อจากนี้ไปขอย่อว่า param) ในตัวอย่างข้างบนนี้คือเป็นวงเล็บเปล่า แสดงว่าไม่รับค่าจากภายนอก แต่ถ้าหากรับค่าจากภายนอกมา เช่น รับค่าจำนวน Lot ที่จะปิดออเดอร์ และชนิดของสัญญา สามารถเขียนได้ดังนี้
void CloseOrder(double lots, int orderType) {
}
จากตัวอย่างภายในวงเล็บได้เพิ่ม params 2 ตัวชื่อว่า lots ชนิดข้อมูลเป็น double เพื่อเก็บจำนวนล็อตที่เป็นทศนิยม และ orderType ชนิดข้อมูลเป็น int เพื่อเก็บชนิดของสัญญาเป็นตัวเลขจำนวนเต็ม 0, 1, 2, 3, 4, 5 และ params ทั้งสองถูกแยกด้วยเครื่องหมายลูกน้ำ (,) หากมีแค่ param ตัวเดียวก็ไม่ต้องขั้น (,) แต่ถ้ามีมากกว่า 1 ก็ขั้น (,) ไปเรื่อย ๆ
จุดต่อมาคือเครื่องหมายปีกกาเปิดและปิด { และ } ซึ่งเป็นเสมือนขอบเขตพื้นที่ของฟังก์ชั่น โค้ดทั้งหมดภายในปีกกาจะถือว่าเป็นของฟังก์ชั่นทั้งหมด
และจุดสุดท้ายของพื้นฐานฟังก์ชั่นก็คือ return value โดยจะสัมพันธ์กับเนื้อหา return data type ที่ได้บอกไว้ด้านบน ลองมาดูตัวอย่างเพื่อความเข้าใจครับ
double CloseOrder() {
return 99.02;
}
สังเหตุตรงคำว่า return 99.02; นะครับ บรรทัดนี้จำเป็นต้องเขียนเนื่องจากฟังก์ชั่นถูกประกาศขึ้นมาว่าต้องคืนค่ากลับเป็น double ดังนั้นฟังก์ชั่นนี้ไม่ว่าจะทำงานอะไรข้างใน แต่สุดท้ายต้องคืนค่าตัวเลขทศนิยมกลับไปด้วยครับ แต่ถ้าเป็นการคืนค่าว่างเปล่าหล่ะ
void CloseOrder() {
}
ถ้าแบบนี้ก็ไม่ต้องใส่บรรทัด return ไปครับ เพราะฟังก์ชั่นถูกประกาศให้ไม่ต้องส่งค่ากลับออกไป
สำหรับบทความนี้ก็เป็นการพูดถึงเรื่อง Basic Syntax นะครับ หากใครอ่านแล้วยังงงอยู่ แสดงว่าไม่ได้มีพื้นฐานการเขียนโปรแกรม ลองไปเปิดหาอ่านบทความสอนเขียนโปรแกรมเบื้องต้นดูครับ ภาษาคอมพิวเตอร์อะไรก็ได้ เช่น C, C++, Java, PHP, Javascript ในบทความต่อไปจะเป็นการพูดถึงการเขียน EA พร้อมยกตัวอย่างประกอบ อาจจะไม่ได้อธิบายแบบ Basic ขนาดนี้นะครับ ลองเน้นดูตัวอย่างไปเรื่อย ๆ ก็น่าจะพอเดาบริบทได้ สำหรับมือใหม่เลยที่สนใจลองฝึกฝนตามบทความไป ก็อาจเขียนโปรแกรมได้เองโดยอัตโนมัติครับ