การสร้างและใช้งาน 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 ที่เราสร้างขึ้น

 YWO 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 อย่างง่าย
 Exness Promotion
PNFPB Install PWA using share icon

For IOS and IPAD browsers, Install PWA using add to home screen in ios safari browser or add to dock option in macos safari browser