การสร้างและใช้งาน Custom libraries

IUX Markets Bonus

ตัวอย่างการสร้างและใช้งาน Custom libraries

Custom libraries เป็นเครื่องมือที่มีประโยชน์มากในการพัฒนา EA ช่วยให้เราสามารถแยกส่วนโค้ดที่ใช้งานบ่อยออกมาเป็นไลบรารีแยกต่างหาก ทำให้โค้ดหลักอ่านง่ายขึ้น ลดการเขียนโค้ดซ้ำซ้อน และง่ายต่อการบำรุงรักษา

 

custom function สำหรับใช้งาน
custom function สำหรับใช้งาน

ข้อดีของการใช้ Custom libraries:

  1. ลดการเขียนโค้ดซ้ำซ้อน
  2. ทำให้โค้ดหลักอ่านง่ายและเข้าใจง่ายขึ้น
  3. ง่ายต่อการบำรุงรักษาและอัพเดทฟังก์ชันที่ใช้งานบ่อย
  4. สามารถแชร์ฟังก์ชันระหว่าง 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 ที่เราสร้างขึ้น

HFM Market Promotion

 



#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;
}

 

อธิบายองค์ประกอบของโค้ด:

  1. TradingFunctions.mqh:
    • CalculatePositionSize(): คำนวณขนาดล็อตตามเปอร์เซ็นต์ความเสี่ยง
    • OpenMarketOrder(): เปิดออเดอร์ตลาด
    • CloseAllPositions(): ปิดทุกออเดอร์ที่เปิดอยู่
    • CalculateATRStopLoss(): คำนวณ stop loss ตาม ATR
  2. EA ที่ใช้ Custom library:
    • ใช้ฟังก์ชันจาก library ในการคำนวณขนาดล็อต, stop loss และเปิดออเดอร์
    • ใช้กลยุทธ์ Moving Average Crossover อย่างง่าย
FOREXDUCK Logo

FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง

HFM Promotion