ตัวอย่างการตั้งค่า Stoploss และ Take Profit
การตั้งค่า Stoploss
// ฟังก์ชันสำหรับตั้งค่า Stop Loss
bool SetStopLoss(int ticket, double slDistance)
{
if(!OrderSelect(ticket, SELECT_BY_TICKET))
{
Print("Error selecting order ", ticket, ". Error: ", GetLastError());
return false;
}
string symbol = OrderSymbol();
int digits = (int)MarketInfo(symbol, MODE_DIGITS);
double point = MarketInfo(symbol, MODE_POINT);
double stopLoss;
if(OrderType() == OP_BUY)
{
stopLoss = NormalizeDouble(OrderOpenPrice() - slDistance * point, digits);
}
else if(OrderType() == OP_SELL)
{
stopLoss = NormalizeDouble(OrderOpenPrice() + slDistance * point, digits);
}
else
{
Print("Invalid order type");
return false;
}
bool result = OrderModify(ticket, OrderOpenPrice(), stopLoss, OrderTakeProfit(), 0, CLR_NONE);
if(!result)
{
Print("Error setting Stop Loss for order ", ticket, ". Error: ", GetLastError());
}
else
{
Print("Stop Loss set successfully for order ", ticket);
}
return result;
}
คำอธิบายละเอียดของฟังก์ชัน SetStopLoss():
- วัตถุประสงค์: ฟังก์ชัน SetStopLoss() ใช้สำหรับตั้งค่าหรือปรับเปลี่ยน Stop Loss ของออเดอร์ที่มีอยู่แล้ว โดยกำหนดระยะห่างจากราคาเปิด
- พารามิเตอร์:
- ticket (int): หมายเลขออเดอร์ที่ต้องการตั้งค่า Stop Loss
- slDistance (double): ระยะห่างของ Stop Loss จากราคาเปิด ในหน่วยของจุด (points)
- การทำงานภายใน: a) เลือกออเดอร์ด้วย OrderSelect() ตาม ticket ที่ระบุ b) ดึงข้อมูลสำคัญของสัญลักษณ์ (symbol) เช่น จำนวนทศนิยม (digits) และขนาดของจุด (point) c) คำนวณราคา Stop Loss โดยพิจารณาประเภทของออเดอร์ (Buy หรือ Sell):
- สำหรับ Buy: Stop Loss = ราคาเปิด – ระยะห่าง
- สำหรับ Sell: Stop Loss = ราคาเปิด + ระยะห่าง d) ใช้ OrderModify() เพื่อปรับเปลี่ยนค่า Stop Loss ของออเดอร์
- การจัดการข้อผิดพลาด:
- ตรวจสอบการเลือกออเดอร์สำเร็จหรือไม่
- ตรวจสอบประเภทของออเดอร์ว่าถูกต้องหรือไม่ (Buy หรือ Sell เท่านั้น)
- แสดงข้อความแจ้งเตือนเมื่อเกิดข้อผิดพลาดในการตั้งค่า Stop Loss
- ผลลัพธ์:
- คืนค่า true ถ้าการตั้งค่า Stop Loss สำเร็จ
- คืนค่า false ถ้าเกิดข้อผิดพลาดในขั้นตอนใดก็ตาม
- ข้อควรระวัง:
- ต้องแน่ใจว่า slDistance ที่กำหนดไม่ต่ำกว่าค่า StopLevel ขั้นต่ำของโบรกเกอร์
- ควรคำนึงถึง spread ในการคำนวณ Stop Loss เพื่อป้องกันการ stop out ทันที
การตั้งค่า Takeprofit
// ฟังก์ชันสำหรับตั้งค่า Take Profit
bool SetTakeProfit(int ticket, double tpDistance)
{
if(!OrderSelect(ticket, SELECT_BY_TICKET))
{
Print("Error selecting order ", ticket, ". Error: ", GetLastError());
return false;
}
string symbol = OrderSymbol();
int digits = (int)MarketInfo(symbol, MODE_DIGITS);
double point = MarketInfo(symbol, MODE_POINT);
double takeProfit;
if(OrderType() == OP_BUY)
{
takeProfit = NormalizeDouble(OrderOpenPrice() + tpDistance * point, digits);
}
else if(OrderType() == OP_SELL)
{
takeProfit = NormalizeDouble(OrderOpenPrice() - tpDistance * point, digits);
}
else
{
Print("Invalid order type");
return false;
}
bool result = OrderModify(ticket, OrderOpenPrice(), OrderStopLoss(), takeProfit, 0, CLR_NONE);
if(!result)
{
Print("Error setting Take Profit for order ", ticket, ". Error: ", GetLastError());
}
else
{
Print("Take Profit set successfully for order ", ticket);
}
return result;
}
ฟังก์ชัน SetTakeProfit() ใช้สำหรับตั้งค่า Take Profit ให้กับออเดอร์ที่มีอยู่แล้ว โดยมีรายละเอียดดังนี้:
- วัตถุประสงค์:
- เพื่อกำหนดจุด Take Profit ใหม่ให้กับออเดอร์ที่เปิดอยู่แล้ว
- ช่วยในการจัดการความเสี่ยงและกำหนดเป้าหมายกำไรที่ต้องการ
- พารามิเตอร์:
- ticket (int): หมายเลขออเดอร์ที่ต้องการตั้งค่า Take Profit
- tpDistance (double): ระยะห่างของ Take Profit จากราคาเปิด ในหน่วย point
- การทำงานของฟังก์ชัน: a) เลือกออเดอร์ด้วย OrderSelect() ตาม ticket ที่ระบุ b) ดึงข้อมูลเกี่ยวกับสัญลักษณ์ (symbol) และความละเอียดของทศนิยม (digits) c) คำนวณค่า Take Profit:
- สำหรับออเดอร์ Buy: TP = ราคาเปิด + ระยะห่างที่กำหนด
- สำหรับออเดอร์ Sell: TP = ราคาเปิด – ระยะห่างที่กำหนด d) ใช้ OrderModify() เพื่อแก้ไขออเดอร์และตั้งค่า Take Profit ใหม่ e) ตรวจสอบผลลัพธ์และแสดงข้อความแจ้งเตือนที่เหมาะสม
- ค่าที่ส่งคืน:
- true: หากการตั้งค่า Take Profit สำเร็จ
- false: หากมีข้อผิดพลาดเกิดขึ้น
- ข้อควรระวัง:
- ต้องแน่ใจว่า tpDistance ที่กำหนดเป็นไปตามกฎของโบรกเกอร์ (เช่น ระยะห่างขั้นต่ำจากราคาปัจจุบัน)
- ควรตรวจสอบค่า error ที่ส่งกลับมาเสมอในกรณีที่การตั้งค่าไม่สำเร็จ
การเปิดออเดอร์พร้อมตั้งค่า Stoploss และ TakeProfit
// ฟังก์ชันสำหรับเปิดออเดอร์พร้อมตั้งค่า Stop Loss และ Take Profit
int OpenOrderWithSLTP(string symbol, int type, double volume, double price, double slDistance, double tpDistance, string comment = "")
{
double stopLoss = 0, takeProfit = 0;
int digits = (int)MarketInfo(symbol, MODE_DIGITS);
double point = MarketInfo(symbol, MODE_POINT);
if(type == OP_BUY)
{
stopLoss = NormalizeDouble(price - slDistance * point, digits);
takeProfit = NormalizeDouble(price + tpDistance * point, digits);
}
else if(type == OP_SELL)
{
stopLoss = NormalizeDouble(price + slDistance * point, digits);
takeProfit = NormalizeDouble(price - tpDistance * point, digits);
}
else
{
Print("Invalid order type");
return -1;
}
int ticket = OrderSend(symbol, type, volume, price, 3, stopLoss, takeProfit, comment, 0, 0, CLR_NONE);
if(ticket < 0)
{
Print("Error opening order: ", GetLastError());
}
else
{
Print("Order opened successfully. Ticket: ", ticket);
}
return ticket;
}
แน่นอนครับ ผมจะอธิบายฟังก์ชัน OpenOrderWithSLTP() อย่างละเอียด
ฟังก์ชัน OpenOrderWithSLTP() ใช้สำหรับเปิดออเดอร์พร้อมกับตั้งค่า Stop Loss และ Take Profit ในคราวเดียว โดยมีรายละเอียดดังนี้:
- วัตถุประสงค์:
- เพื่อเปิดออเดอร์ใหม่พร้อมกับกำหนด Stop Loss และ Take Profit ทันที
- ช่วยลดขั้นตอนการทำงานและความเสี่ยงจากการลืมตั้งค่า SL/TP
- พารามิเตอร์:
- symbol (string): สัญลักษณ์คู่สกุลเงินที่ต้องการเทรด
- type (int): ประเภทของออเดอร์ (OP_BUY หรือ OP_SELL)
- volume (double): ขนาดของล็อต
- price (double): ราคาที่ต้องการเปิดออเดอร์
- slDistance (double): ระยะห่างของ Stop Loss จากราคาเปิด ในหน่วย point
- tpDistance (double): ระยะห่างของ Take Profit จากราคาเปิด ในหน่วย point
- comment (string, ตัวเลือก): ข้อความประกอบออเดอร์
- การทำงานของฟังก์ชัน: a) ดึงข้อมูลเกี่ยวกับสัญลักษณ์ (symbol) และความละเอียดของทศนิยม (digits) b) คำนวณค่า Stop Loss และ Take Profit:
- สำหรับออเดอร์ Buy: SL = ราคาเปิด – ระยะห่าง SL TP = ราคาเปิด + ระยะห่าง TP
- สำหรับออเดอร์ Sell: SL = ราคาเปิด + ระยะห่าง SL TP = ราคาเปิด – ระยะห่าง TP c) ใช้ OrderSend() เพื่อเปิดออเดอร์พร้อมกับตั้งค่า SL และ TP d) ตรวจสอบผลลัพธ์และแสดงข้อความแจ้งเตือนที่เหมาะสม
- ค่าที่ส่งคืน:
- ticket (int): หมายเลขออเดอร์ที่เปิดสำเร็จ
- -1: หากมีข้อผิดพลาดเกิดขึ้น
- ข้อควรระวัง:
- ต้องแน่ใจว่า slDistance และ tpDistance ที่กำหนดเป็นไปตามกฎของโบรกเกอร์
- ควรตรวจสอบค่า error ที่ส่งกลับมาเสมอในกรณีที่การเปิดออเดอร์ไม่สำเร็จ
- ระวังการใช้ slippage (ค่า 3 ในตัวอย่าง) ให้เหมาะสมกับสภาพตลาด
ฟังค์ชั่นตั้งค่า Stoploss และ Takeprofit ตาม Risk Reward Ratio
// ฟังก์ชันสำหรับตั้งค่า Stop Loss และ Take Profit แบบ Risk-Reward Ratio
bool SetSLTPByRiskReward(int ticket, double riskPercent, double rewardRatio)
{
if(!OrderSelect(ticket, SELECT_BY_TICKET))
{
Print("Error selecting order ", ticket, ". Error: ", GetLastError());
return false;
}
double accountBalance = AccountBalance();
double lotSize = OrderLots();
string symbol = OrderSymbol();
int digits = (int)MarketInfo(symbol, MODE_DIGITS);
double point = MarketInfo(symbol, MODE_POINT);
double tickValue = MarketInfo(symbol, MODE_TICKVALUE);
double riskAmount = accountBalance * riskPercent / 100;
double slDistance = riskAmount / (lotSize * tickValue);
double tpDistance = slDistance * rewardRatio;
double stopLoss, takeProfit;
if(OrderType() == OP_BUY)
{
stopLoss = NormalizeDouble(OrderOpenPrice() - slDistance * point, digits);
takeProfit = NormalizeDouble(OrderOpenPrice() + tpDistance * point, digits);
}
else if(OrderType() == OP_SELL)
{
stopLoss = NormalizeDouble(OrderOpenPrice() + slDistance * point, digits);
takeProfit = NormalizeDouble(OrderOpenPrice() - tpDistance * point, digits);
}
else
{
Print("Invalid order type");
return false;
}
bool result = OrderModify(ticket, OrderOpenPrice(), stopLoss, takeProfit, 0, CLR_NONE);
if(!result)
{
Print("Error modifying order ", ticket, ". Error: ", GetLastError());
}
else
{
Print("Order ", ticket, " modified successfully");
}
return result;
}
ฟังก์ชัน SetSLTPByRiskReward() ใช้สำหรับตั้งค่า Stop Loss และ Take Profit ตาม Risk-Reward Ratio ที่กำหนด โดยมีรายละเอียดดังนี้:
- วัตถุประสงค์:
- เพื่อกำหนด Stop Loss และ Take Profit ให้กับออเดอร์ที่มีอยู่แล้ว โดยคำนวณจากเปอร์เซ็นต์ความเสี่ยงของบัญชีและอัตราส่วนผลตอบแทนต่อความเสี่ยง (Risk-Reward Ratio)
- ช่วยในการจัดการความเสี่ยงและกำหนดเป้าหมายกำไรที่สอดคล้องกับกลยุทธ์การบริหารเงินทุน
- พารามิเตอร์:
- ticket (int): หมายเลขออเดอร์ที่ต้องการตั้งค่า SL/TP
- riskPercent (double): เปอร์เซ็นต์ความเสี่ยงของบัญชีที่ยอมรับได้สำหรับการเทรดนี้
- rewardRatio (double): อัตราส่วนผลตอบแทนต่อความเสี่ยงที่ต้องการ
- การทำงานของฟังก์ชัน: a) เลือกออเดอร์ด้วย OrderSelect() ตาม ticket ที่ระบุ b) ดึงข้อมูลเกี่ยวกับบัญชี, ออเดอร์, และสัญลักษณ์ (symbol) c) คำนวณจำนวนเงินที่ยอมรับความเสี่ยงได้ (riskAmount) จากยอดเงินในบัญชีและเปอร์เซ็นต์ความเสี่ยงที่กำหนด d) คำนวณระยะห่างของ Stop Loss (slDistance) โดยใช้ riskAmount และขนาดล็อต e) คำนวณระยะห่างของ Take Profit (tpDistance) โดยใช้ slDistance คูณด้วย rewardRatio f) คำนวณค่า Stop Loss และ Take Profit ตามประเภทของออเดอร์ (Buy หรือ Sell) g) ใช้ OrderModify() เพื่อแก้ไขออเดอร์และตั้งค่า SL/TP ใหม่ h) ตรวจสอบผลลัพธ์และแสดงข้อความแจ้งเตือนที่เหมาะสม
- ค่าที่ส่งคืน:
- true: หากการตั้งค่า SL/TP สำเร็จ
- false: หากมีข้อผิดพลาดเกิดขึ้น
- ข้อควรระวัง:
- ต้องแน่ใจว่า riskPercent ที่กำหนดเหมาะสมกับกลยุทธ์การบริหารความเสี่ยงของคุณ
- ควรตรวจสอบว่า SL/TP ที่คำนวณได้เป็นไปตามกฎของโบรกเกอร์ (เช่น ระยะห่างขั้นต่ำจากราคาปัจจุบัน)
- ควรตรวจสอบค่า error ที่ส่งกลับมาเสมอในกรณีที่การตั้งค่าไม่สำเร็จ
FOREXDUCK (นามปากกา) นักเขียนของเรามีประสบการณ์การเงินการลงทุนกว่า 10 ปี มีความเชี่ยวชาญในการวิเคราะห์ตลาด Forex และคริปโต โดยเฉพาะการวิเคราะห์ทางเทคนิค รวมถึงเทคนิคต่าง