EA Programing => MT4 Code Libary => Topic started by: admin 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 ได้ทำการเลือกมาให้หากเป็นจริงก็ให้ดำเนินการต่อหากเป็นเท็จก็ให้ข้ามไป
}
-
สงสัยครับ ??? ถ้าเราใช้
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)
-
สงสัยครับ ??? ถ้าเราใช้
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 เลยครับ
-
ขอถามต่อนะครับ
ถ้าต้องการเลือกเฉพาะ order ทีเปิดอยู่ ไม่นับ pending order
หรือ
ถ้าต้องการเลือกเฉพาะ pending order ที่เปิดอยู่ ไม่นับ orderที่เปิดอยู่
ไม่ทรายว่าทั้ง2แบบต้องเขียนยังไงครับ
-
ขอถามต่อนะครับ
ถ้าต้องการเลือกเฉพาะ 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)
แล้วแต่ว่าชอบเขียนแบบไหน
-
ขอบคุณมากๆครับ
ยังสงสัยอีกนิดครับ
ถ้า กำหนดเงื่อนไขตรวจสอบว่า ถ้าไม่มีการเปิด pending order ให้....(เปิดคำสั่งที่เรากำหนด)
เขียนยังไงครับ
-
ขอบคุณมากๆครับ
ยังสงสัยอีกนิดครับ
ถ้า กำหนดเงื่อนไขตรวจสอบว่า ถ้าไม่มีการเปิด pending order ให้....(เปิดคำสั่งที่เรากำหนด)
เขียนยังไงครับ
สร้างตัวแปรขึ้นมานับจำนวน pending ครับ
-
อย่างนี้ได้ไหมครับ...
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 )
เข้าสู่การเทรด...
รบกวนด้วยครับ...
-
ผิดครับ ต้องใส่แบบนี้
ขอถามต่อนะครับ
ถ้าต้องการเลือกเฉพาะ 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)
แล้วแต่ว่าชอบเขียนแบบไหน
-
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 ครับ
ถ้าไม่ใช่รบกวนช่วยยกตัวอย่างด้วยครับ
ขอบคุณครับ
-
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 ไปเข้าเงื่อนไขเพื่อใช้งานต่อครับ
-
ขอบคุณครับ ทุกท่านๆผมจะลองเขียนดู...