เพื่อเรียนรู้วิธีการทบขนาด Lot จนกว่า Profit จะกลับมาเป็นบวกแล้วปิด Order ทั้งหมด
หลักการของ EA ตัวอย่างนี้
- ใช้หลักการ Martingale
- เริ่มต้นโดยเปิด pending order ไว้ทั้ง Buy และ Sell จากนั้น
- รอจนกว่าเมื่อ Order ด้านใดด้านหนึ่งเปิด จากนั้นก็จะ Delete Order ฝั่งตรงข้าม
extern double Lot=0.1; extern double Multiply=2; extern int Range=50; extern int Step=8; int start() { OpenOrder(); CheckOrder(); return(0); } void OpenOrder() { if(OrdersTotal()==0) { for(int i=0;i<Step;i++) { if(i==0) { OrderSend(Symbol(),OP_SELLLIMIT,Lot,Bid+Point*(Range*(i+1)),3,0,0,"Exp20",0,0,Red); OrderSend(Symbol(),OP_BUYLIMIT,Lot,Ask-Point*(Range*(i+1)),3,0,0,"Exp20",0,0,Green); Sleep(1000); } if(i >0) { OrderSend(Symbol(),OP_SELLLIMIT,Lot*MathPow( Multiply,i) ,Bid+Point*(Range*(i+1)),3,0,0,"Exp2",0,0,Red); OrderSend(Symbol(),OP_BUYLIMIT,Lot*MathPow( Multiply,i),Ask-Point*(Range*(i+1)),3,0,0,"Exp2",0,0,Red); Sleep(1000); } } return (0); } } void CheckOrder() { int BuyOrder=0; int SellOrder=0; for(int i=0 ;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY) BuyOrder++; if(OrderType()==OP_SELL) SellOrder++; } if(BuyOrder > 0 || SellOrder >0) { if(BuyOrder >0) { DeletePending(2); SetTP(1); } if(SellOrder > 0) { DeletePending(1); SetTP(2); } } if(OrdersTotal() < Step) { DeleteOrder(); } } void DeletePending(int type) { for(int i=0 ;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(type==1) { if(OrderType()==OP_BUYLIMIT) { OrderDelete(OrderTicket()); } } if(type==2) { if(OrderType()==OP_SELLLIMIT) { OrderDelete(OrderTicket()); } } } } void SetTP(int type) { double MaxLot=0; double OpenPrice=0; int i; for( i=0 ;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(type==1) { if(OrderType()==OP_BUY) { if(OrderLots() > MaxLot) { MaxLot=OrderLots(); OpenPrice=OrderOpenPrice(); } } } if(type==2) { if(OrderType()==OP_SELL) { if(OrderLots() > MaxLot) { MaxLot=OrderLots(); OpenPrice=OrderOpenPrice(); } } } } double TP=0; for( i=0 ;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(type==1) { TP=OpenPrice+Point*Range; if(OrderType()==OP_BUY) { if(OrderTakeProfit()!=TP) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP,0,Blue); } } if(type==2) { TP=OpenPrice-Point*Range; if(OrderType()==OP_SELL) { if(OrderTakeProfit()!=TP) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP,0,Blue); } } } } void DeleteOrder() { for(int i=0 ;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT ) { OrderDelete(OrderTicket()); } } }
extern double Multiply=2; // กำหนดตัวคูณ
ตอบลบextern int Range=50; // กำหนดระยะห่างระหว่าง Order (50 = 50 point = 5.0 pips)
extern int Step=8; // กำหนดจำนวนขั้น
สุดยอดครับ .. ผมกำลังเริ่มหัดเขียนอยู่ครับ อยากจะขอคำแนะนำเพิ่มเติมครับ
ตอบลบถ้าผมต้องการนำผล lot ที่ได้มาลบกับผลรวมของ ออเดอร์ที่ออกก่อนหน้าโดยแยกเป็น Buy และ Sell ก่อน
เช่น
ถ้าในฝั่ง Buy ออเดอร์นี้ lot =0.4 แต่มีออเดอร์ในฝั่ง buy อยู่แล้ว 2 ออเดอร์ คือ 0.05 ,0.15 ดังนั้น lot ของออเดอร์นี้ = 0.4-0.2 = 0.2
ประมาณนี้ครับ พอจะมีวิธีรึเปล่าครับ หากมีช่วยแนะนำด้วยนะครับ
ขอบคุณครับ ^/|\^