Sponsored Ads

วันอังคารที่ 4 กรกฎาคม พ.ศ. 2560

การปิด Order แบบ Auto ผ่่านการใช้ OrderSelect()

จากตอนที่แล้ว เราได้พูดถึงเรื่องการใช้ OrderClose() ไว้เพื่อใช้ปิด Order แต่ตอนนี้เราจะมาพูดถึงกาารใช้ฟังก์ชั่น OrderSelect() ไว้เพื่อเลือก Order ที่เราต้องการเอง โดยไม่ต้องมานั่งจดเลข Ticket

Function OrderSelect()


โครงสร้าง 

bool OrderSelect(int index, int select , int pool=MODE_TRADES) 

int select คือ เราพูดถึง select ก่อน index เพราะค่า index มันขึ้นอยู่กับการเลือก select  ซึ่งค่า select สามารถเลือกได้ 2 ค่า คือ 

SELECT_BY_POS  หมายถึง Order Number จะถูก return ค่าออกไป ในค่า Parameter index  
SELECT_BY_TICKET หมายถึง ค่า ticket number จะถูก return ค่าออกไป 

int index คือ ค่าซึ่งถูก return ค่าออกมาจากการเลือก select  

pool  คือ ข้อมูลที่เราต้องการจะเลือกเอามาจากชุดข้อมูลไหน ซึ่งมันขึ้นอยู่กับการเลือก select 

ตัวแปร pool จะถูกใช้เมื่อ เราเลือก select เป็น SELECT_BY_POS 

ตัวแปร pool จะไม่ถูกใช้หากเลือก select เป็น SELECT_BY_TICKET

ตัวแปร pool เลือกได้ 2 ค่า คือ 

MODE_TRADES  หมายถึง เลือก Order ที่เป็น open หรือ pending position 

MODE_HISTORY หมายถึง Order ที่ปิดไปแล้ว หรือ Order ที่ลบไปแล้ว ที่เกิดขึ้นในอดีต 


ก่อนจะเขียนโปรแกรมทั้งหมดมาทำความเข้าใจโครงสร้างแต่ละส่วนกันก่อน

for(int i = 1 ; i<= OrdersTotal(); i++)
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true)
      {
           //
          //
       }
   }

จากบล็อคด้านบน เป็นวิธีการเลือก Order ครับ ซึ่งเขียนอยู่ในลูป For โดยเลือก Order ทั้งหมดผ่าน OrderTotal จากนั้นค่อยกรองเอาแต่ Order ที่ยังเปิดอยู่เท่านั้นผ่านเงื่อนไข if  ซึ่งเมื้่อกรอง Order มาได้แล้วก็ขึ้นอยู่กับว่าเราต้องการจะเอาไปทำอะไรต่อ


ด้านล่างนี้เป็น Code ที่เอามาจากตัวอย่าง ในหนังสือ


int start()                                     //
  {
   string Symb=Symbol();                      // symbol
   double Dist=1000000.0;                     // กำหนดระยะ
   int Real_Order=-1;                         // -1 คือ Order ที่ไม่ใช่ market order
   double Win_Price=WindowPriceOnDropped();     // หากลากไปที่ราคาไหน เก็บราคาไว้ในตัวแปร Win price
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)         // ดึงข้อมูลทั้งหมด
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) //  เลือกเฉพาะ Order ที่เปิดอยู่
        {                                      //
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // ถ้า order ที่เปิดไม่ตรงกับ Symbol ของกราฟ ให้ข้ามไป
         int Tip=OrderType();                 //ดึงค่า Ordertype ใส่ใน Tip
         if (Tip>1) continue;                   // ถ้า Tip > 1 แสดงว่าเป้น pending order ให้ข้ามไปดู order ใหม่
         //------------------------------------------------------ 4 --
         double Price=OrderOpenPrice();       // เก็บค่าราคาลงไปในตัวแปร Price
         if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)<  NormalizeDouble(Dist,Digits))// เงื่อนไข ถ้าราคาเปิด - ราคาที่เราเอาเมาส์ลาก script ไปวาง แล้วน้อยกว่า Dist
           {
            Dist=MathAbs(Price-Win_Price);      //ให้กำหนดค่า dist ใหม่   = ค่าบวกของ Price - win_Price
            Real_Order=Tip;                   // กำหนดค่า real_orde = Tip
            int Ticket=OrderTicket();         // ดึงค่า OrderTicket มาใส่ใสนตัวแปร Ticket
            double Lot=OrderLots();           // ดึงค่า จำนวน Lot มาใส่ใน Lot
           }
         //------------------------------------------------------ 5 --
        }                                      //จบเงื่อนไข If
     }                                         // จบ loop .
//--------------------------------------------------------------- 6 --
   while(true)                                 // ถ้าเป็นจริงให้ทำต่อไป
     {
      if (Real_Order==-1)                     // ถ้า real_Order = - 1
        {
         Alert("For ",Symb,"no market order aviable");
         break;                                 //
        }
      //--------------------------------------------------------- 7 --
      switch(Real_Order)                       //By order type ใช้คำสั่ง switch ดูทางเลือก
        {
         case 0: double Price_Cls=Bid;        // หาก Real_Order =0 ให้ดึงค่า Bid ใส่ตัวแปร Price_Cls
            string Text="Buy ";          // กำหนดค่า "Buy" เก็บไว้ในตัวแปร Text
            break;                         // ออกจาก switch
         case 1: Price_Cls=Ask;               // หากเป็น 1 ดึงค่า Ask มาเก็บใน Price_Cls
            Text="Sell ";                // กำหนดค่า "Sell" ไว้ใน Text
        }
      Alert("Attempt to close",Text," ",Ticket,"Awaiting.."); // แจ้ง alert ว่ากำลังจะปิด Order
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);//ส่งคำสั่งปิด Order ตามค่าตัวแปรที่เราเขียนโปรแกรม ถ้าปิดได้ จะ return true
      //--------------------------------------------------------- 8 --
      if (Ans==true)                            // หากปิดได้
        {
         Alert ("close order ",Text," ",Ticket);
         break;                                 // แจ้งปิด Order เลขที่
        }
      //--------------------------------------------------------- 9 --

     }
//-------------------------------------------------------------- 10 --
   Alert ("The script has finished operations  -----------------------------");
   return;                                      // จบโปรแกรม
  }
//-------------------------------------------------------------- 11 --

ที่มา https://book.mql4.com/trading/orderclose

ลอองไปหัดเขียนแล้วทำความเข้าใจดูนะครับ










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

  1. ช่วยสอนเขียน คำสั่ง lock account id หน่อยครับ ถ้า account ไม่ตรงตามที่เรา ตั้งค่าไว้ ก็ไม่ให้ทำงานครับ

    ตอบลบ
  2. พอจะบอกคำสั่ง เงื่อนไขการเข้าออเด้อไม่ให้เข้าซ้ำกัน แต่ต่างทามเฟรมได้มั้ยครับ

    เช่นถ้าหน้าจอกราฟอยู่ H1 ปกติผมจะใช้ Time[0] มาตัดเศษออก
    แต่ถ้าอยู่ต่างทามเฟรมไปไม่เป็นเลยครับ
    รบกวนนิดครับ
    ขอบคุณครับ

    ตอบลบ