ตัวอย่างการใช้งาน global variables และ input parameters

IUX Markets Bonus

ตัวอย่างการใช้งาน global variables และ input parameters

ในการพัฒนา Expert Advisor (EA) สำหรับ MetaTrader 4, การใช้ global variables และ input parameters มีบทบาทสำคัญในการสร้าง EA ที่มีความยืดหยุ่นและปรับแต่งได้ ทั้งสองส่วนนี้มีลักษณะและการใช้งานที่แตกต่างกัน

ตัวอย่างการใช้งาน global variables และ input parameters
ตัวอย่างการใช้งาน global variables และ input parameters

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();
    }
}

 

ฟังก์ชันนี้ทำหน้าที่ดังนี้:

  1. กำหนดตัวแปรกลอบอล (global variables) สามตัว:
    • g_LastOrderTicket: เก็บเลขที่คำสั่งล่าสุด
    • g_TotalProfit: เก็บผลกำไรรวม
    • g_LastTradeTime: เก็บเวลาเปิดคำสั่งล่าสุด
  2. ฟังก์ชัน OnTick() จะทำงานทุกครั้งที่มีการเปลี่ยนแปลงของราคา
  3. ภายในฟังก์ชัน มีการตรวจสอบว่ามีคำสั่งเปิดอยู่หรือไม่ โดยใช้ OrdersTotal() > 0
  4. ถ้ามีคำสั่งเปิดอยู่ และสามารถเลือกคำสั่งแรกได้ (OrderSelect(0, SELECT_BY_POS)), จะทำการอัพเดตตัวแปรกลอบอล:
    • อัพเดตเลขที่คำสั่งล่าสุด
    • เพิ่มผลกำไรของคำสั่งปัจจุบันเข้าไปในผลกำไรรวม
    • อัพเดตเวลาเปิดคำสั่งล่าสุด
HFM Market Promotion

ฟังก์ชันนี้ช่วยในการติดตามข้อมูลการเทรดล่าสุดและผลกำไรรวม ซึ่งสามารถนำไปใช้ในการตัดสินใจเทรดหรือแสดงผลข้อมูลได้ต่อไป

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

ฟังก์ชันนี้ทำหน้าที่ดังนี้:

  1. กำหนดค่า input parameters:
    • StopLoss: ระยะ Stop Loss เป็นจำนวนจุด (default: 50)
    • TakeProfit: ระยะ Take Profit เป็นจำนวนจุด (default: 100)
    • LotSize: ขนาดล็อตในการเทรด (default: 0.1)
  2. ฟังก์ชัน OnTick() จะทำงานทุกครั้งที่มีการเปลี่ยนแปลงของราคา
  3. มีการตรวจสอบเงื่อนไข OpenNewOrder() (ซึ่งไม่ได้แสดงในโค้ดนี้ แต่คาดว่าเป็นฟังก์ชันที่ตรวจสอบว่าควรเปิดออเดอร์ใหม่หรือไม่)
  4. ถ้าเงื่อนไขเป็นจริง จะทำการเปิดคำสั่งซื้อ (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.

ความแตกต่างที่สำคัญ

  1. การเปลี่ยนแปลงค่า:
    • Global Variables: เปลี่ยนแปลงได้ในระหว่างการทำงานของ EA
    • Input Parameters: เปลี่ยนแปลงไม่ได้หลังจาก EA เริ่มทำงาน
  2. การปรับแต่ง:
    • Global Variables: ต้องแก้ไขโค้ดเพื่อเปลี่ยนค่าเริ่มต้น
    • Input Parameters: ปรับแต่งได้จากหน้า input ของ EA โดยไม่ต้องแก้ไขโค้ด
  3. การใช้งาน:
    • 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);
}

  1. Global Variables:
    • g_LastTradeTime: เก็บเวลาของการเทรดล่าสุด
    • g_TotalProfit: เก็บผลกำไร/ขาดทุนรวม
  2. Input Parameters:
    • StopLoss: ระยะ Stop Loss (จุด)
    • TakeProfit: ระยะ Take Profit (จุด)
    • RiskPercent: เปอร์เซ็นต์ความเสี่ยงต่อเงินทุน
    • MAPeriod: จำนวนช่วงเวลาสำหรับ Moving Average
  3. OnInit() Function:
    • ทำงานเมื่อ EA เริ่มต้น
    • บันทึกเวลาเริ่มต้นใน g_LastTradeTime
    • ตรวจสอบความถูกต้องของ input parameters
    • คืนค่า INIT_SUCCEEDED หากทุกอย่างถูกต้อง
  4. OnTick() Function:
    • ทำงานทุกครั้งที่มีการเปลี่ยนแปลงราคา
    • คำนวณค่า Moving Average
    • ถ้าไม่มีออเดอร์เปิดอยู่:
      • เปิดคำสั่งซื้อถ้าราคาอยู่เหนือ MA
      • คำนวณขนาด Lot ตามความเสี่ยงที่กำหนด
      • บันทึกเวลาเทรดล่าสุด
    • ถ้ามีออเดอร์เปิดอยู่:
      • อัพเดทกำไร/ขาดทุนรวมใน g_TotalProfit
  5. CalculateLotSize() Function:
    • คำนวณขนาด Lot ตามเปอร์เซ็นต์ความเสี่ยงที่กำหนด
    • ใช้ข้อมูลตลาดและบัญชีในการคำนวณ
    • ปรับขนาด Lot ให้อยู่ในช่วงที่อนุญาต
  6. OnDeinit() Function:
    • ทำงานเมื่อ EA ถูกปิดหรือถอดออก
    • แสดงผลกำไร/ขาดทุนรวมทั้งหมด

โค้ดนี้เป็น EA ที่ใช้กลยุทธ์การเทรดแบบง่ายๆ โดยเปิดคำสั่งซื้อเมื่อราคาอยู่เหนือ Moving Average และจัดการความเสี่ยงโดยคำนวณขนาด Lot ตามเปอร์เซ็นต์ความเสี่ยงที่กำหนด EA นี้ยังมีการจัดการข้อมูลกำไร/ขาดทุนและเวลาเทรดล่าสุดด้วย

FOREXDUCK Logo

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

HFM Promotion