//+------------------------------------------------------------------+
//| Gold_Sell_EA.mq5 |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade; // เรียกใช้งานคลาส CTrade สำหรับส่งคำสั่ง
//--- ตั้งค่าตัวแปร (Inputs) ที่สามารถปรับแก้ได้บนหน้าต่าง MT5
input double InpLotSize = 0.01; // ขนาด Lot
input int InpTrailingStop = 500; // ระยะ Trailing Stop (เป็นค่า Point, 500 points = 50 pips)
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 1. ดึงค่า Point และราคาปัจจุบันของสัญลักษณ์ที่รันอยู่ (เช่น XAUUSD)
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 2. เงื่อนไขการเปิดออเดอร์ Sell
// ในตัวอย่างนี้จะใช้เงื่อนไขแบบง่าย: หากยังไม่มีออเดอร์เปิดอยู่เลย ให้เปิด Sell 1 ไม้
if(PositionsTotal() == 0)
{
// คำสั่ง Sell: (Lot, สัญลักษณ์, ราคาเข้า(Bid), SL, TP, คอมเมนต์)
// กำหนด SL และ TP เป็น 0 ไปก่อน แล้วเดี๋ยวให้ Trailing Stop จัดการ
trade.Sell(InpLotSize, _Symbol, bid, 0.0, 0.0, "Sell XAUUSD Initialized");
}
// 3. เรียกใช้งานฟังก์ชัน Trailing Stop ทุกครั้งที่ราคาขยับ (Tick)
ManageTrailingStop(point);
}
//+------------------------------------------------------------------+
//| Function สำหรับจัดการ Trailing Stop ขา Sell |
//+------------------------------------------------------------------+
void ManageTrailingStop(double point)
{
// วนลูปเช็คออเดอร์ทั้งหมดที่เปิดอยู่
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i); // ดึงหมายเลข Ticket
// เช็คว่าเป็นออเดอร์ของคู่เงินที่เรากำลังรัน EA อยู่หรือไม่
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
// เช็คว่าเป็นฝั่ง Sell หรือไม่
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT); // ราคา Ask ปัจจุบัน
double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); // ราคาตอนเปิดไม้
double currentSL = PositionGetDouble(POSITION_SL); // ค่า SL ปัจจุบัน
// คำนวณหาค่า SL ใหม่ ตามระยะ Trailing Stop (ฝั่ง Sell: ราคาปัจจุบัน + ระยะ)
double newSL = currentPrice + (InpTrailingStop * point);
// เงื่อนไข: ถ้าราคาปัจจุบันลงมาต่ำกว่า (ราคาเปิด - ระยะ Trailing Stop) แสดงว่ามีกำไรเพียงพอให้ขยับ SL
if(currentPrice < openPrice - (InpTrailingStop * point))
{
// ถ้ายก SL ครั้งแรก (currentSL == 0) หรือ SL ใหม่ต่ำกว่า SL เดิม (ล็อคกำไรได้มากขึ้น)
if(currentSL == 0.0 || newSL < currentSL)
{
// ส่งคำสั่งปรับค่า SL ใหม่ ส่วน TP ใช้ค่าเดิม
trade.PositionModify(ticket, newSL, PositionGetDouble(POSITION_TP));
}
}
}
}
}
}
คำอธิบาย โค้ดตัวอย่าง MQL5: Sell Order + Trailing Stop
SymbolInfoDouble(_Symbol, SYMBOL_BID / SYMBOL_ASK): ใช้สำหรับดึงราคาซื้อและขายปัจจุบันของทองคำแบบเรียลไทม์ การส่งคำสั่ง Sell จะต้องจับคู่กับราคา Bid ส่วนการคำนวณ Trailing Stop ขา Sell (ซื้อคืน) จะอ้างอิงจากราคา Ask
PositionsTotal() == 0: เป็นเงื่อนไขสมมติสำหรับตัวอย่างนี้ หมายความว่า EA จะทำงานเมื่อพอร์ตว่างเปล่าเท่านั้น ป้องกันไม่ให้โรบอทยิงคำสั่งรัวๆ ในการใช้งานจริง คุณสามารถนำลอจิกอินดิเคเตอร์มาแทนที่บรรทัดนี้ได้
การแปลงค่า Point: สินทรัพย์แต่ละประเภทมีจุดทศนิยมไม่เท่ากัน (XAUUSD ส่วนใหญ่มักมี 2 หรือ 3 ตำแหน่ง) ตัวแปร point จะช่วยปรับสเกลของค่า InpTrailingStop ให้ถูกต้องโดยอัตโนมัติ
เงื่อนไข newSL < currentSL: เป็นหัวใจของ Trailing Stop ฝั่ง Sell ฟังก์ชันจะคอยเช็คและอนุญาตให้ขยับ Stop Loss ตามลงมาเพื่อรักษาหน้าทุนหรือล็อคกำไรเท่านั้น จะไม่มีการขยับถอยกลับขึ้นไปเด็ดขาดเมื่อราคาสวิงสวนทางกลับมา