วันนี้เรามาพูดถึงสุดยอดของ Expert Advisor ตัวเล็กๆ ที่ช่วยให้เราสามารถนับจำนวนคำสั่งที่เปิดอยู่ได้อย่างมีประสิทธิภาพกันนะครับ
int OrdersCounter() { int counter=0; //--- for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) // ถ้าคำสั่งถูกเปิดโดย EA นี้ { //--- ตรวจสอบว่ามีการทำกำไรหรือไม่ /* สำหรับการซื้อ เท่านั้นเมื่อ StopLoss เท่ากับหรือสูงกว่า Open Price หมายเหตุ การใช้งานนี้ไม่เหมาะสำหรับคำสั่งรอดำเนินการ เพียงเหมาะกับการซื้อและขายเท่านั้น */ double XBreakeven = OrderType()==OP_BUY ? OrderStopLoss() >= OrderOpenPrice() : OrderStopLoss() <= OrderOpenPrice(); if(!XBreakeven) // ถ้าการทำกำไรและ trailing stop ยังไม่เกิดขึ้น { counter++; //นับตำแหน่ง } } return counter; }
เราจะนับเฉพาะคำสั่งที่ ไม่มี StopLoss อยู่เหนือหรือเท่ากับราคาที่เปิดสำหรับการซื้อ และต่ำกว่าราคาที่เปิดสำหรับการขาย กล่าวคือ เราจะนับคำสั่งทั้งหมดที่ยังไม่ถึงจุดทำกำไรหรือ trailing stop ยังไม่ได้ปกป้องราคาที่เปิด
double XBreakeven = OrderType()==OP_BUY ? OrderStopLoss() >= OrderOpenPrice() : OrderStopLoss() <= OrderOpenPrice(); if(!XBreakeven) // ถ้าการทำกำไรและ trailing stop ยังไม่เกิดขึ้น
จากนั้นเราจะสร้างตัวนับที่คืนค่าที่เราจะใช้เพื่อจำกัดจำนวนคำสั่งสูงสุด ซึ่งในกรณีนี้เราจะตั้งไว้ที่ 1 คำสั่งเท่านั้น
if(OrdersCounter()<MaximumOrders)
ดังนั้นเมื่อมีการทำกำไรเกิดขึ้น ฟังก์ชันนี้จะไม่รวมมันในการนับ ซึ่งเมื่อเรามีเพียงตำแหน่งเดียวในตัวอย่างนี้ มันจะคืนค่าเป็นศูนย์และเราก็สามารถเปิดคำสั่งขายใหม่ได้ต่อไป
นอกจากนี้ หากเราไม่ได้สร้างฟังก์ชันทำกำไรนี้ ก็จะไม่สามารถทำได้เลย
void BreakEvenFunction() { //--- for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { // สำหรับการซื้อ ถ้า Bid สูงกว่าราคาที่เปิด + จำนวน pips ที่ทำกำไร ในทางกลับกันสำหรับการขาย double xHybrid = OrderType()==OP_BUY ? (Bid>OrderOpenPrice()+BreakevenPips*_Point && OrderStopLoss()<OrderOpenPrice()) : (Ask<OrderOpenPrice()-BreakevenPips*_Point && OrderStopLoss()>OrderOpenPrice()); /* สำหรับการซื้อ เท่านั้นเมื่อ StopLoss เท่ากับหรือสูงกว่า Open Price ในทางกลับกันสำหรับการขาย */ if(xHybrid) { bool modfy = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrNONE); } } }
ลองใช้กันดูนะครับ!
ความคิดเห็น 0