วันอาทิตย์ที่ 21 พฤษภาคม พ.ศ. 2560

ฝึกเขียน EA ตัวอย่างที่ 4 Martingale (เบิ้ล Lot จะกว่าจะชนะ)

จุดประสงค์
เพื่อเรียนรู้วิธีการทบขนาด 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());
     
     }
     

  }


}

2 ความคิดเห็น:

  1. extern double Multiply=2; // กำหนดตัวคูณ
    extern int Range=50; // กำหนดระยะห่างระหว่าง Order (50 = 50 point = 5.0 pips)
    extern int Step=8; // กำหนดจำนวนขั้น

    ตอบลบ
  2. สุดยอดครับ .. ผมกำลังเริ่มหัดเขียนอยู่ครับ อยากจะขอคำแนะนำเพิ่มเติมครับ
    ถ้าผมต้องการนำผล lot ที่ได้มาลบกับผลรวมของ ออเดอร์ที่ออกก่อนหน้าโดยแยกเป็น Buy และ Sell ก่อน
    เช่น
    ถ้าในฝั่ง Buy ออเดอร์นี้ lot =0.4 แต่มีออเดอร์ในฝั่ง buy อยู่แล้ว 2 ออเดอร์ คือ 0.05 ,0.15 ดังนั้น lot ของออเดอร์นี้ = 0.4-0.2 = 0.2
    ประมาณนี้ครับ พอจะมีวิธีรึเปล่าครับ หากมีช่วยแนะนำด้วยนะครับ
    ขอบคุณครับ ^/|\^

    ตอบลบ