ตัวอย่างการใช้งาน global variables และ input parameters
ในการพัฒนา Expert Advisor (EA) สำหรับ MetaTrader 4, การใช้ global variables และ input parameters มีบทบาทสำคัญในการสร้าง EA ที่มีความยืดหยุ่นและปรับแต่งได้ ทั้งสองส่วนนี้มีลักษณะและการใช้งานที่แตกต่างกัน
Global Variables
Global variables เป็นตัวแปรที่สามารถเข้าถึงได้จากทุกส่วนของ EA ใช้สำหรับเก็บข้อมูลที่ต้องใช้ร่วมกันระหว่างฟังก์ชันต่างๆ
ลักษณะสำคัญ:
- ประกาศนอกฟังก์ชัน
- ค่าสามารถเปลี่ยนแปลงได้ระหว่างการทำงานของ EA
- ใช้เก็บสถานะหรือข้อมูลที่ต้องใช้ตลอดการทำงานของ EA
ตัวอย่างการใช้งาน:
int g_LastOrderTicket = 0;
double g_TotalProfit = 0;
datetime g_LastTradeTime = 0;
void OnTick()
{
// ใช้และอัพเดท global variables
if(OrdersTotal() > 0 && OrderSelect(0, SELECT_BY_POS))
{
g_LastOrderTicket = OrderTicket();
g_TotalProfit += OrderProfit();
g_LastTradeTime = OrderOpenTime();
}
}
ฟังก์ชันนี้ทำหน้าที่ดังนี้:
- กำหนดตัวแปรกลอบอล (global variables) สามตัว:
g_LastOrderTicket
: เก็บเลขที่คำสั่งล่าสุดg_TotalProfit
: เก็บผลกำไรรวมg_LastTradeTime
: เก็บเวลาเปิดคำสั่งล่าสุด
- ฟังก์ชัน
OnTick()
จะทำงานทุกครั้งที่มีการเปลี่ยนแปลงของราคา - ภายในฟังก์ชัน มีการตรวจสอบว่ามีคำสั่งเปิดอยู่หรือไม่ โดยใช้
OrdersTotal() > 0
- ถ้ามีคำสั่งเปิดอยู่ และสามารถเลือกคำสั่งแรกได้ (
OrderSelect(0, SELECT_BY_POS)
), จะทำการอัพเดตตัวแปรกลอบอล:- อัพเดตเลขที่คำสั่งล่าสุด
- เพิ่มผลกำไรของคำสั่งปัจจุบันเข้าไปในผลกำไรรวม
- อัพเดตเวลาเปิดคำสั่งล่าสุด
ฟังก์ชันนี้ช่วยในการติดตามข้อมูลการเทรดล่าสุดและผลกำไรรวม ซึ่งสามารถนำไปใช้ในการตัดสินใจเทรดหรือแสดงผลข้อมูลได้ต่อไป
Input Parameters
Input parameters เป็นตัวแปรที่สามารถกำหนดค่าได้จากภายนอก EA โดยผู้ใช้ ช่วยให้ EA มีความยืดหยุ่นและปรับแต่งได้โดยไม่ต้องแก้ไขโค้ด
ลักษณะสำคัญ:
- ประกาศด้วยคำสั่ง input ก่อนฟังก์ชัน OnInit()
- ค่าไม่สามารถเปลี่ยนแปลงได้ระหว่างการทำงานของ EA
- แสดงในหน้าต่าง inputs เมื่อแนบ EA กับชาร์ต
ตัวอย่างการใช้งาน:
input int StopLoss = 50;
input int TakeProfit = 100;
input double LotSize = 0.1;
void OnTick()
{
if(OpenNewOrder())
{
int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3,
Bid - StopLoss * Point,
Ask + TakeProfit * Point,
"Buy Order", 0, 0, Green);
}
}
ฟังก์ชันนี้ทำหน้าที่ดังนี้:
- กำหนดค่า input parameters:
StopLoss
: ระยะ Stop Loss เป็นจำนวนจุด (default: 50)TakeProfit
: ระยะ Take Profit เป็นจำนวนจุด (default: 100)LotSize
: ขนาดล็อตในการเทรด (default: 0.1)
- ฟังก์ชัน
OnTick()
จะทำงานทุกครั้งที่มีการเปลี่ยนแปลงของราคา - มีการตรวจสอบเงื่อนไข
OpenNewOrder()
(ซึ่งไม่ได้แสดงในโค้ดนี้ แต่คาดว่าเป็นฟังก์ชันที่ตรวจสอบว่าควรเปิดออเดอร์ใหม่หรือไม่) - ถ้าเงื่อนไขเป็นจริง จะทำการเปิดคำสั่งซื้อ (Buy Order) โดยใช้ฟังก์ชัน
OrderSend()
กับพารามิเตอร์ดังนี้:- Symbol(): สัญลักษณ์คู่สกุลเงินปัจจุบัน
- OP_BUY: เปิดคำสั่งซื้อ
- LotSize: ขนาดล็อตที่กำหนดไว้
- Ask: ราคา Ask ปัจจุบัน
- 3: Slippage ที่ยอมรับได้
- Bid – StopLoss * Point: ระดับ Stop Loss
- Ask + TakeProfit * Point: ระดับ Take Profit
- “Buy Order”: ข้อความอธิบายคำสั่ง
- 0, 0: เวลาหมดอายุและราคาหมดอายุ (ไม่ใช้ในที่นี้)
- Green: สีของคำสั่งบนกราฟ
ฟังก์ชันนี้จะเปิดคำสั่งซื้อใหม่เมื่อเงื่อนไข OpenNewOrder()
เป็นจริง โดยใช้ค่า Stop Loss และ Take Profit ที่กำหนดไว้ในค่า input parameters.
ความแตกต่างที่สำคัญ
- การเปลี่ยนแปลงค่า:
- Global Variables: เปลี่ยนแปลงได้ในระหว่างการทำงานของ EA
- Input Parameters: เปลี่ยนแปลงไม่ได้หลังจาก EA เริ่มทำงาน
- การปรับแต่ง:
- Global Variables: ต้องแก้ไขโค้ดเพื่อเปลี่ยนค่าเริ่มต้น
- Input Parameters: ปรับแต่งได้จากหน้า input ของ EA โดยไม่ต้องแก้ไขโค้ด
- การใช้งาน:
- Global Variables: เหมาะสำหรับเก็บข้อมูลที่เปลี่ยนแปลงตลอดการทำงานของ EA
- Input Parameters: เหมาะสำหรับค่าคงที่ที่ต้องการให้ผู้ใช้ปรับแต่งได้
ตัวอย่างการใช้งานแบบสมบูรณ์
// Global variables
int g_LastTradeTime = 0;
double g_TotalProfit = 0;
// Input parameters
input int StopLoss = 50;
input int TakeProfit = 100;
input double RiskPercent = 1;
input int MAPeriod = 20;
// OnInit function
int OnInit()
{
// ใช้ global variable เพื่อเก็บเวลาเริ่มต้น EA
g_LastTradeTime = (int)TimeLocal();
// ตรวจสอบความถูกต้องของ input parameters
if(StopLoss <= 0 || TakeProfit <= 0 || RiskPercent <= 0 || MAPeriod <= 0) { Print("Invalid input parameters"); return INIT_PARAMETERS_INCORRECT; } return INIT_SUCCEEDED; } // OnTick function void OnTick() { // ใช้ input parameters ในการคำนวณ double ma = iMA(Symbol(), 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); if(OrdersTotal() == 0) { // เปิดออเดอร์ใหม่ถ้าราคาอยู่เหนือ MA if(Bid > ma)
{
double lotSize = CalculateLotSize(RiskPercent, StopLoss);
int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3,
Bid - StopLoss*Point, Bid + TakeProfit*Point,
"Buy Order", 0, 0, Green);
if(ticket > 0)
{
g_LastTradeTime = (int)TimeLocal();
Print("Buy order opened. Ticket: ", ticket);
}
}
}
else
{
// อัพเดท global variable สำหรับกำไร/ขาดทุนรวม
g_TotalProfit = 0;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
g_TotalProfit += OrderProfit();
}
}
}
}
// ฟังก์ชันคำนวณขนาด Lot ตาม Risk Percent
double CalculateLotSize(double riskPercent, int stopLoss)
{
double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
double accountBalance = AccountBalance();
double riskAmount = accountBalance * riskPercent / 100;
double lotSize = NormalizeDouble(riskAmount / (stopLoss * tickValue), 2);
lotSize = MathMax(minLot, MathMin(maxLot, lotSize));
return NormalizeDouble(lotSize, 2);
}
// OnDeinit function
void OnDeinit(const int reason)
{
Print("EA deinitialized. Total profit: ", g_TotalProfit);
}
- Global Variables:
g_LastTradeTime
: เก็บเวลาของการเทรดล่าสุดg_TotalProfit
: เก็บผลกำไร/ขาดทุนรวม
- Input Parameters:
StopLoss
: ระยะ Stop Loss (จุด)TakeProfit
: ระยะ Take Profit (จุด)RiskPercent
: เปอร์เซ็นต์ความเสี่ยงต่อเงินทุนMAPeriod
: จำนวนช่วงเวลาสำหรับ Moving Average
- OnInit() Function:
- ทำงานเมื่อ EA เริ่มต้น
- บันทึกเวลาเริ่มต้นใน
g_LastTradeTime
- ตรวจสอบความถูกต้องของ input parameters
- คืนค่า INIT_SUCCEEDED หากทุกอย่างถูกต้อง
- OnTick() Function:
- ทำงานทุกครั้งที่มีการเปลี่ยนแปลงราคา
- คำนวณค่า Moving Average
- ถ้าไม่มีออเดอร์เปิดอยู่:
- เปิดคำสั่งซื้อถ้าราคาอยู่เหนือ MA
- คำนวณขนาด Lot ตามความเสี่ยงที่กำหนด
- บันทึกเวลาเทรดล่าสุด
- ถ้ามีออเดอร์เปิดอยู่:
- อัพเดทกำไร/ขาดทุนรวมใน
g_TotalProfit
- อัพเดทกำไร/ขาดทุนรวมใน
- CalculateLotSize() Function:
- คำนวณขนาด Lot ตามเปอร์เซ็นต์ความเสี่ยงที่กำหนด
- ใช้ข้อมูลตลาดและบัญชีในการคำนวณ
- ปรับขนาด Lot ให้อยู่ในช่วงที่อนุญาต
- OnDeinit() Function:
- ทำงานเมื่อ EA ถูกปิดหรือถอดออก
- แสดงผลกำไร/ขาดทุนรวมทั้งหมด
โค้ดนี้เป็น EA ที่ใช้กลยุทธ์การเทรดแบบง่ายๆ โดยเปิดคำสั่งซื้อเมื่อราคาอยู่เหนือ Moving Average และจัดการความเสี่ยงโดยคำนวณขนาด Lot ตามเปอร์เซ็นต์ความเสี่ยงที่กำหนด EA นี้ยังมีการจัดการข้อมูลกำไร/ขาดทุนและเวลาเทรดล่าสุดด้วย
FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง