เพื่อเรียนรู้วิธีการทบขนาด 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
ประมาณนี้ครับ พอจะมีวิธีรึเปล่าครับ หากมีช่วยแนะนำด้วยนะครับ
ขอบคุณครับ ^/|\^