EA Programing > MT4 Code Libary

คำสั่ง OrderSelect()

(1/3) > >>

admin:
คำสั่ง ในการเลือก 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:
สงสัยครับ ??? ถ้าเราใช้
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:

--- Quote from: TvT 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)

--- End quote ---
มันจะวนไปเรื่อยยๆจนครบทุก Order ครับ ถ้าเราต้องการข้อมูลของ BuyLimit ก็ใส่เงื่อนไขที่คุณว่าในบรรทัดที่ถัดจาก OrderSelet นั่นหละครับ ถ้าเราต้องการว่าหากได้ค่าที่ต้องการแล้วให้ จบการทำงานเลยก็กำหนดค่า i ให้เป้ฯเท็จเพื่อออกจาก loop เลยครับ

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

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

หรือ

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

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

hyperxeon:

--- Quote from: toonrx09 on กรกฎาคม 26, 2012, 02:09:51 pm ---ขอถามต่อนะครับ

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

หรือ

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

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

--- End quote ---
ถ้าเฉพาะ 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)
แล้วแต่ว่าชอบเขียนแบบไหน

นำร่อง

[0] ดัชนีข้อความ

[#] หน้าถัดไป

Go to full version