Open Forex4you Account

Server รัน EA 1000 / ปี

สั่งชื้อคู่มือการโปรแรกม MQL4

Author Topic: คำสั่ง OrderSelect()  (Read 50057 times)

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
คำสั่ง OrderSelect()
« on: ตุลาคม 12, 2010, 04:59:14 am »
คำสั่ง ในการเลือก Order หรือ OrderSelect เป็นคำสั่งที่มีประโยชน์มากแล้วใช้แทบทุกครั้งที่เราจะกระทำการใดๆๆกับ Order ที่เราเปิดหรือปิดไปแล้ว
เช่น ในการปิด Order การแก้ไข SL TP หรือ การเรียกดูข้อมูลของ Order ทั้ง Order ที่เปิด อยู่หรือ Order ที่เรา close position ไปเรียบร้อยแล้ว

รูปแบบ ของ OrderSelect

OrderSelect( int index, int select, int pool)

int index ตรงนี้คือค่าของแหน่งที่ Order อยู่ ตรงนี้เราสามารถใช้ตำแหน่งหรือค่า ticket ของ order ก็ได้ครับ
int  select คือวิธีการที่ใช้เลือก order ครับมี 2 แบบคือ SELECT_BY_POS หรือ  SELECT_BY_TICKET คือการเลือกโดยตำแหน่งที่ order อยู่กับเลือกโดยใช้ ticket number ของ

Order

int pool คือโหมดในการทำงาน  มี 2 แบบคือ MODE_TRADE คือทำงานเพื่อเลือก order ที่กำลังเปิดอยู่  กับ  MODE_HISTORY คือ ทำงานเพื่อเลือก order ที่ปิดไปแล้ว

วิธีการใช้
การเลือกโดยการใช้ตำแหน่ง (SELECT_BY_POS) เราใช้วิธีนี้มากที่สุดกว่า 95 % ของการเลือกทั้งหมด
การเลือกโดยตำแหน่งที่ order อยู่เช่น ในขณะนี้เราเปิด Order อยู่ 3 Order คือ

1 BUY  0.1 lot
2 SELL 0.1 lot
3 BUY  0.1 lot

เราต้องการเลือก Order ที่ 2 SELL 0.1 lot เพื่อที่จำทำการใดๆๆกับ Order นี้ต่อไปเราก็ต้องเขียน Code OrderSelect ดังต่อไปนี้
OrderSelect( 1,SELECT_BY_POS,MODE_TRADE) ;
เหตุผลที่ตำแหน่งของ int index เป็น 1 เพระาคอมพิวเตอร์จะเริ่มทำงานที่ดัชนีแรกคือ 0 ดังนั่นแหน่งต่างๆๆของ order จะต้องลบด้วย 1 เสมอ

แต่ในความเป็นจริงตอนที่ EA ทำงานเราไม่สามารถระบุตำแหน่งเองลงไปได้เราต้องใช้ loop ในการช่วยชี้ตำแหน่งให้กับโปรแกรม และใช้คำสั่ง OrderTotal() ในการบอกให้ EA ทราบถึงค่าสุดท้ายของ loop

for(int i=0;i<OrderTotal();i++)
{
   OrderSelect( i,SELECT_BY_POS,MODE_TRADE) ;
   ให้เราเงื่อนไขเพื่อตรวจสอบ Order ที่ EA ได้ทำการเลือกมาให้หากเป็นจริงก็ให้ดำเนินการต่อหากเป็นเท็จก็ให้ข้ามไป



}

TvT

  • Full Member
  • ***
  • Posts: 133
Re: คำสั่ง OrderSelect()
« Reply #1 on: มิถุนายน 06, 2011, 08:14:06 am »
สงสัยครับ ??? ถ้าเราใช้
for(int i=0;i<OrderTotal();i++)
{
 OrderSelect( i,SELECT_BY_POS,MODE_TRADE) ;
 ให้เราเงื่อนไขเพื่อตรวจสอบ Order ที่ EA ได้ทำการเลือกมาให้หากเป็นจริงก็ให้ดำเนินการต่อหากเป็นเท็จก็ให้ข้ามไป
}
1.ระบบจะวนไปเรื่อยจนครบทุกตัวหรือวนจนเจอเท่านั้นครับ เช่นผมมีทั้ง buylimit และ buy ไว้จะอ่านทั้งสองตัวเลยรึป่าว
2.แล้วสามารถแยก buylimit และ buy ได้หรือไม่ โดยใช้ if (ordertype=OP_BUY)//(oderstype=OP_BUTLIMIT)

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: คำสั่ง OrderSelect()
« Reply #2 on: มิถุนายน 06, 2011, 10:58:12 am »
สงสัยครับ ??? ถ้าเราใช้
for(int i=0;i<OrderTotal();i++)
{
 OrderSelect( i,SELECT_BY_POS,MODE_TRADE) ;
 ให้เราเงื่อนไขเพื่อตรวจสอบ Order ที่ EA ได้ทำการเลือกมาให้หากเป็นจริงก็ให้ดำเนินการต่อหากเป็นเท็จก็ให้ข้ามไป
}
1.ระบบจะวนไปเรื่อยจนครบทุกตัวหรือวนจนเจอเท่านั้นครับ เช่นผมมีทั้ง buylimit และ buy ไว้จะอ่านทั้งสองตัวเลยรึป่าว
2.แล้วสามารถแยก buylimit และ buy ได้หรือไม่ โดยใช้ if (ordertype=OP_BUY)//(oderstype=OP_BUTLIMIT)
มันจะวนไปเรื่อยยๆจนครบทุก Order ครับ ถ้าเราต้องการข้อมูลของ BuyLimit ก็ใส่เงื่อนไขที่คุณว่าในบรรทัดที่ถัดจาก OrderSelet นั่นหละครับ ถ้าเราต้องการว่าหากได้ค่าที่ต้องการแล้วให้ จบการทำงานเลยก็กำหนดค่า i ให้เป้ฯเท็จเพื่อออกจาก loop เลยครับ

toonrx09

  • Newbie
  • *
  • Posts: 36
Re: คำสั่ง OrderSelect()
« Reply #3 on: กรกฎาคม 26, 2012, 02:09:51 pm »
ขอถามต่อนะครับ

ถ้าต้องการเลือกเฉพาะ order ทีเปิดอยู่ ไม่นับ pending order

หรือ

ถ้าต้องการเลือกเฉพาะ pending order ที่เปิดอยู่ ไม่นับ orderที่เปิดอยู่

ไม่ทรายว่าทั้ง2แบบต้องเขียนยังไงครับ

hyperxeon

  • Newbie
  • *
  • Posts: 11
Re: คำสั่ง OrderSelect()
« Reply #4 on: กรกฎาคม 27, 2012, 01:05:26 pm »
ขอถามต่อนะครับ

ถ้าต้องการเลือกเฉพาะ order ทีเปิดอยู่ ไม่นับ pending order

หรือ

ถ้าต้องการเลือกเฉพาะ pending order ที่เปิดอยู่ ไม่นับ orderที่เปิดอยู่

ไม่ทรายว่าทั้ง2แบบต้องเขียนยังไงครับ
ถ้าเฉพาะ Order ที่เปิดอยู่
if(OrderType() == OP_BUY || OrderType() == OP_SELL)

ถ้าเฉพาะ Pending order
if(OrderType() != OP_BUY && OrderType() != OP_SELL)
หรือ
if(OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT || OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
แล้วแต่ว่าชอบเขียนแบบไหน

toonrx09

  • Newbie
  • *
  • Posts: 36
Re: คำสั่ง OrderSelect()
« Reply #5 on: กรกฎาคม 29, 2012, 05:26:12 pm »
ขอบคุณมากๆครับ

ยังสงสัยอีกนิดครับ
 
ถ้า กำหนดเงื่อนไขตรวจสอบว่า ถ้าไม่มีการเปิด pending order  ให้....(เปิดคำสั่งที่เรากำหนด)

 เขียนยังไงครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: คำสั่ง OrderSelect()
« Reply #6 on: กรกฎาคม 30, 2012, 09:58:25 am »
ขอบคุณมากๆครับ

ยังสงสัยอีกนิดครับ
 
ถ้า กำหนดเงื่อนไขตรวจสอบว่า ถ้าไม่มีการเปิด pending order  ให้....(เปิดคำสั่งที่เรากำหนด)

 เขียนยังไงครับ

สร้างตัวแปรขึ้นมานับจำนวน pending ครับ

toonrx09

  • Newbie
  • *
  • Posts: 36
Re: คำสั่ง OrderSelect()
« Reply #7 on: กรกฎาคม 30, 2012, 11:38:01 am »
อย่างนี้ได้ไหมครับ...

 double sum;
    double sum1;
   
      for(int a=0;a<OrdersTotal();a++)

         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         
         
             sum=sum+OP_BUYSTOP;
             sum1=sum1+OP_SELLSTOP;
             
     
         if(OrdersTotal()==2 && sum ==0 && sum1 == 0 )

                 เข้าสู่การเทรด...

รบกวนด้วยครับ...



D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: คำสั่ง OrderSelect()
« Reply #8 on: กรกฎาคม 30, 2012, 12:28:58 pm »
ผิดครับ ต้องใส่แบบนี้

ขอถามต่อนะครับ

ถ้าต้องการเลือกเฉพาะ order ทีเปิดอยู่ ไม่นับ pending order

หรือ

ถ้าต้องการเลือกเฉพาะ pending order ที่เปิดอยู่ ไม่นับ orderที่เปิดอยู่

ไม่ทรายว่าทั้ง2แบบต้องเขียนยังไงครับ
ถ้าเฉพาะ Order ที่เปิดอยู่
if(OrderType() == OP_BUY || OrderType() == OP_SELL)

ถ้าเฉพาะ Pending order
if(OrderType() != OP_BUY && OrderType() != OP_SELL)
หรือ
if(OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT || OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
แล้วแต่ว่าชอบเขียนแบบไหน

toonrx09

  • Newbie
  • *
  • Posts: 36
Re: คำสั่ง OrderSelect()
« Reply #9 on: กรกฎาคม 30, 2012, 12:49:45 pm »
  if(OrderType() == OP_BUY || OrderType() == OP_SELL)
         if (OP_BUY == 1)
           OrderSend(Symbol(),OP_BUYSTOP,Lots,OrderOpenPrice()+(gap*Point),3,0,0,"buystop",1234,0,Green);
 
อย่างนี้ได้ไหมครับ
คือต้องการ ดูว่า ถ้า มีorder buy เท่ากับ 1 ก็ให้เปิด buystop ครับ

ถ้าไม่ใช่รบกวนช่วยยกตัวอย่างด้วยครับ

ขอบคุณครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: คำสั่ง OrderSelect()
« Reply #10 on: กรกฎาคม 30, 2012, 01:07:48 pm »
  if(OrderType() == OP_BUY || OrderType() == OP_SELL)
         if (OP_BUY == 1)
           OrderSend(Symbol(),OP_BUYSTOP,Lots,OrderOpenPrice()+(gap*Point),3,0,0,"buystop",1234,0,Green);
 
อย่างนี้ได้ไหมครับ
คือต้องการ ดูว่า ถ้า มีorder buy เท่ากับ 1 ก็ให้เปิด buystop ครับ

ถ้าไม่ใช่รบกวนช่วยยกตัวอย่างด้วยครับ

ขอบคุณครับ
ทำแบบนั่นไม่ได้ครับ ค่า OP_BUY เป้นตัวแปรสงวนที่ MT4 เก็บไวใช้จะเอามานับจำนวนของ Order ไม่ได้ครับ ต้องใช้วิธีที่คุณ D-Dimond บอกนั่นหละครับใช้ตัวแปรเก็บจำนวนและชนิดของ Order ก่อนจากนั่นค่อยใช้ เงื่อนไขตรวจสอบเพื่อนนำไปเปิด order แบบที่คุณต้องการต่อ

 int buy,sell,buystop,buylimit,sellstop,selllimit;
      for(int i=0;i<OrdersTotal();i++)
    {   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
       if(OrderType()==OP_SELL)       
          sell++;       
      if(OrderType()==OP_SELLSTOP)           
          sellstop++;
      if(OrderType()==OP_SELLLIMIT)       
          selllimit++;
      if(OrderType()==OP_BUY)
          buy++;
      if(OrderType()==OP_BUYSTOP)
          buystop++;
      if(OrderType()==OP_BUYLIMIT)
          buylimit++;
     }

จากนั่นให้เอาค่า  buy buystop buylimit sell sellstop selllimt  ไปเข้าเงื่อนไขเพื่อใช้งานต่อครับ





toonrx09

  • Newbie
  • *
  • Posts: 36
Re: คำสั่ง OrderSelect()
« Reply #11 on: กรกฎาคม 30, 2012, 01:28:39 pm »
ขอบคุณครับ ทุกท่านๆผมจะลองเขียนดู...