ตัวอย่าง EA ที่มีฟังก์ชันหลัก: OnInit(), OnDeinit(), OnTick()
Expert Advisor (EA) ใน MetaTrader 4 มีโครงสร้างพื้นฐานที่ประกอบด้วยฟังก์ชันหลัก 3 ฟังก์ชัน ได้แก่ OnInit(), OnDeinit(), และ OnTick() ฟังก์ชันเหล่านี้มีบทบาทสำคัญในการควบคุมการทำงานของ EA
1. OnInit()
ฟังก์ชัน OnInit() ถูกเรียกใช้เมื่อ EA ถูกเริ่มต้นหรือเมื่อมีการเปลี่ยนแปลงค่า input parameters ฟังก์ชันนี้ใช้สำหรับ:
- การกำหนดค่าเริ่มต้นให้กับตัวแปร
- การตรวจสอบความถูกต้องของ input parameters
- การเตรียมทรัพยากรที่จำเป็น เช่น การเปิดไฟล์หรือการเชื่อมต่อกับฐานข้อมูล
ตัวอย่างการใช้งาน:
// ฟังก์ชัน OnInit()
int OnInit()
{
Print("EA has been initialized");
return(INIT_SUCCEEDED);
}
2. OnDeinit()
ฟังก์ชัน OnDeinit() ถูกเรียกใช้เมื่อ EA ถูกหยุดการทำงานหรือถูกลบออกจากชาร์ต ฟังก์ชันนี้ใช้สำหรับ:
- การทำความสะอาดและคืนทรัพยากรที่ใช้
- การบันทึกข้อมูลหรือสถิติการเทรด
- การแสดงสรุปผลการทำงานของ EA
ตัวอย่างการใช้งาน:
// ฟังก์ชัน OnDeinit()
void OnDeinit(const int reason)
{
Print("EA has been deinitialized. Reason code = ", reason);
}
3. OnTick()
ฟังก์ชัน OnTick() เป็นหัวใจสำคัญของ EA ถูกเรียกใช้ทุกครั้งที่มีการเปลี่ยนแปลงราคา (tick) ฟังก์ชันนี้ใช้สำหรับ:
- การวิเคราะห์สภาวะตลาดปัจจุบัน
- การตัดสินใจเปิดหรือปิดออเดอร์
- การจัดการออเดอร์ที่เปิดอยู่
ตัวอย่างการใช้งาน:
// ฟังก์ชัน OnTick()
void OnTick()
{
// ตรวจสอบว่ามีออเดอร์เปิดอยู่หรือไม่
if(OrdersTotal() == 0)
{
// ตรวจสอบเงื่อนไขการเปิดออเดอร์
if(ShouldOpenOrder())
{
OpenOrder();
}
}
else
{
// ตรวจสอบเงื่อนไขการปิดออเดอร์
if(ShouldCloseOrder())
{
CloseOrder();
}
}
}
การทำงานร่วมกันของฟังก์ชันหลัก
ฟังก์ชันทั้งสามทำงานร่วมกันเพื่อควบคุมการทำงานของ EA:
- OnInit() ถูกเรียกเมื่อ EA เริ่มทำงาน เพื่อตั้งค่าเริ่มต้น
- OnTick() ถูกเรียกซ้ำๆ ตลอดการทำงานของ EA เพื่อตัดสินใจเทรด
- OnDeinit() ถูกเรียกเมื่อ EA หยุดทำงาน เพื่อทำความสะอาดและสรุปผล
การเขียน EA ที่มีประสิทธิภาพจำเป็นต้องเข้าใจการทำงานของฟังก์ชันเหล่านี้และใช้งานอย่างเหมาะสม เพื่อสร้าง EA ที่ทำงานได้อย่างถูกต้อง มีประสิทธิภาพ และสามารถจัดการกับสถานการณ์ต่างๆ ได้อย่างเหมาะสม
ตัวอย่างการใช้งานแบบสมบูรณ์
โดยต่อไปนี้เป็นตัวอย่างฉบับการใช้งานฉบับเต็ม
// ตัวแปร Global
int MagicNumber = 123456;
double LotSize = 0.1;
// ฟังก์ชัน OnInit()
int OnInit()
{
Print("EA has been initialized");
return(INIT_SUCCEEDED);
}
// ฟังก์ชัน OnDeinit()
void OnDeinit(const int reason)
{
Print("EA has been deinitialized. Reason code = ", reason);
}
// ฟังก์ชัน OnTick()
void OnTick()
{
// ตรวจสอบว่ามีออเดอร์เปิดอยู่หรือไม่
if(OrdersTotal() == 0)
{
// ตรวจสอบเงื่อนไขการเปิดออเดอร์
if(ShouldOpenOrder())
{
OpenOrder();
}
}
else
{
// ตรวจสอบเงื่อนไขการปิดออเดอร์
if(ShouldCloseOrder())
{
CloseOrder();
}
}
}
// ฟังก์ชันตรวจสอบเงื่อนไขการเปิดออเดอร์
bool ShouldOpenOrder()
{
// เพิ่มโลจิกการตรวจสอบเงื่อนไขที่นี่
return false;
}
// ฟังก์ชันตรวจสอบเงื่อนไขการปิดออเดอร์
bool ShouldCloseOrder()
{
// เพิ่มโลจิกการตรวจสอบเงื่อนไขที่นี่
return false;
}
// ฟังก์ชันเปิดออเดอร์
void OpenOrder()
{
int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, 0, "Buy Order", MagicNumber, 0, Blue);
if(ticket > 0)
{
Print("Buy order opened successfully. Ticket: ", ticket);
}
else
{
Print("Error opening buy order. Error code: ", GetLastError());
}
}
// ฟังก์ชันปิดออเดอร์
void CloseOrder()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
bool result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, White);
if(result)
{
Print("Order closed successfully. Ticket: ", OrderTicket());
}
else
{
Print("Error closing order. Error code: ", GetLastError());
}
}
}
}
}
FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง