ตัวอย่างการสร้างและใช้งาน Custom libraries
Custom libraries เป็นเครื่องมือที่มีประโยชน์มากในการพัฒนา EA ช่วยให้เราสามารถแยกส่วนโค้ดที่ใช้งานบ่อยออกมาเป็นไลบรารีแยกต่างหาก ทำให้โค้ดหลักอ่านง่ายขึ้น ลดการเขียนโค้ดซ้ำซ้อน และง่ายต่อการบำรุงรักษา
ข้อดีของการใช้ Custom libraries:
- ลดการเขียนโค้ดซ้ำซ้อน
- ทำให้โค้ดหลักอ่านง่ายและเข้าใจง่ายขึ้น
- ง่ายต่อการบำรุงรักษาและอัพเดทฟังก์ชันที่ใช้งานบ่อย
- สามารถแชร์ฟังก์ชันระหว่าง EA หรือ Indicator ต่างๆ ได้
ตัวอย่างการสร้าง Custom library:
เราจะสร้าง Custom library ชื่อ “TradingFunctions.mqh” ที่มีฟังก์ชันสำหรับการเทรดและการจัดการความเสี่ยง
// TradingFunctions.mqh
// Calculate position size based on risk percentage
double CalculatePositionSize(double riskPercentage, double stopLossPips)
{
double accountBalance = AccountBalance();
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double riskAmount = accountBalance * riskPercentage / 100;
double pipValue = tickValue / tickSize;
double positionSize = NormalizeDouble(riskAmount / (stopLossPips * pipValue), 2);
return MathFloor(positionSize / lotStep) * lotStep;
}
// Open a market order
int OpenMarketOrder(ENUM_ORDER_TYPE orderType, double lotSize, double stopLoss, double takeProfit, string comment)
{
int ticket = -1;
double price = (orderType == ORDER_TYPE_BUY) ? Ask : Bid;
ticket = OrderSend(_Symbol, orderType, lotSize, price, 3, stopLoss, takeProfit, comment, 0, 0, (orderType == ORDER_TYPE_BUY) ? clrGreen : clrRed);
if(ticket < 0) { Print("OrderSend failed with error #", GetLastError()); } return ticket; } // Close all open positions void CloseAllPositions() { for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == _Symbol)
{
bool result = OrderClose(OrderTicket(), OrderLots(), OrderType() == OP_BUY ? Bid : Ask, 3, clrYellow);
if(!result)
{
Print("OrderClose failed with error #", GetLastError());
}
}
}
}
}
// Calculate ATR-based stop loss in pips
double CalculateATRStopLoss(int ATR_Period, double ATR_Multiplier)
{
double atr = iATR(_Symbol, 0, ATR_Period, 0);
double stopLossPips = NormalizeDouble(atr * ATR_Multiplier / _Point, 1);
return stopLossPips;
}
ตัวอย่างการใช้งาน Custom library ใน EA:
ต่อไปนี้เป็นตัวอย่าง EA ที่ใช้งาน Custom library ที่เราสร้างขึ้น
#property copyright "forexduck.com"
#property link "https://www.forexduck.com"
#property version "1.00"
#property strict
// Include custom library
#include
// Input parameters
input double RiskPercentage = 1.0;
input int ATR_Period = 14;
input double ATR_Multiplier = 2.0;
// Global variables
int magicNumber = 123456;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Initialization code here
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Cleanup code here
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Check for open positions
if(PositionExists())
return;
// Simple moving average crossover strategy
double ma_fast = iMA(_Symbol, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 0);
double ma_slow = iMA(_Symbol, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
if(ma_fast > ma_slow)
{
// Bullish signal
double stopLossPips = CalculateATRStopLoss(ATR_Period, ATR_Multiplier);
double lotSize = CalculatePositionSize(RiskPercentage, stopLossPips);
double stopLossPrice = NormalizeDouble(Bid - stopLossPips * _Point, _Digits);
double takeProfitPrice = NormalizeDouble(Bid + stopLossPips * 2 * _Point, _Digits);
int ticket = OpenMarketOrder(ORDER_TYPE_BUY, lotSize, stopLossPrice, takeProfitPrice, "Buy Order");
if(ticket > 0)
Print("Buy order opened successfully");
}
else if(ma_fast < ma_slow) { // Bearish signal double stopLossPips = CalculateATRStopLoss(ATR_Period, ATR_Multiplier); double lotSize = CalculatePositionSize(RiskPercentage, stopLossPips); double stopLossPrice = NormalizeDouble(Ask + stopLossPips * _Point, _Digits); double takeProfitPrice = NormalizeDouble(Ask - stopLossPips * 2 * _Point, _Digits); int ticket = OpenMarketOrder(ORDER_TYPE_SELL, lotSize, stopLossPrice, takeProfitPrice, "Sell Order"); if(ticket > 0)
Print("Sell order opened successfully");
}
}
//+------------------------------------------------------------------+
//| Check if position exists |
//+------------------------------------------------------------------+
bool PositionExists()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == _Symbol && OrderMagicNumber() == magicNumber)
return true;
}
}
return false;
}
อธิบายองค์ประกอบของโค้ด:
- TradingFunctions.mqh:
- CalculatePositionSize(): คำนวณขนาดล็อตตามเปอร์เซ็นต์ความเสี่ยง
- OpenMarketOrder(): เปิดออเดอร์ตลาด
- CloseAllPositions(): ปิดทุกออเดอร์ที่เปิดอยู่
- CalculateATRStopLoss(): คำนวณ stop loss ตาม ATR
- EA ที่ใช้ Custom library:
- ใช้ฟังก์ชันจาก library ในการคำนวณขนาดล็อต, stop loss และเปิดออเดอร์
- ใช้กลยุทธ์ Moving Average Crossover อย่างง่าย
FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง