Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: สอบถามการเช็คออเดอร์ที่เปิดไม่ได้  (Read 22667 times)

Redbull

  • Full Member
  • ***
  • Posts: 138
รบกวนสอบถามครับ...
ผมลองเขียนอีเอ ประมาณว่าตั้งเวลาเปิดออเดอร์หลายคู่เงินพร้อมๆ กัน...
ปัญหา คือ บางครั้งมันก็เปิดออเดอร์ครบ บางครั้งก็เปิดไม่ครบทุกคู่ครับ...
ไม่ทราบว่าพอจะมีวิธีแก้ไขไหมครับ เช่น ตรววจสอบว่ามีคำสั่งเปิดออเดอร์ 10 คู่เงิน โดยจะต้องเปิดจนกว่าจะครบทุกคู่ อะไรประมาณนี้ครับ...

ตัวอย่าง code คำสั่งเปิดออเดอร์ครับ
 
    if(Hour()==hour && Minute()==minute)
  {
OrderSend ("AUDCAD",OP_SELL,LOT_No.1,Bid,3,0,0," ",0,0,red);
OrderSend ("AUDCHF",OP_BUY,LOT_No.2,Ask,3,0,0," ",0,0,Green);
OrderSend ("AUDGBP",OP_BUY,LOT_No.2,Ask,3,0,0," ",0,0,Green);
OrderSend ("EURUSD",OP_SELL,LOT_No.1,Bid,3,0,0," ",0,0,Green);

ขอบคุณมากมายล่วงหน้ครับ... ;D ;D ;D

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
สร้างตัวแปรมาเก็บ OrderID เพื่อตรวจสอบว่าเปิดออเดอร์ติดหรือเปล่า ถ้าไม่ติด ให้เปิดใหม่ ครับ

int ticket;

ticket = OrderSend ("AUDCAD",OP_SELL,LOT_No.1,Bid,3,0,0," ",0,0,red);

ถ้าเปิดติดจะได้เลข orderid เก็บอยู่ในตัวแปร ticket

if ( ticket = 0 )  เอาใหม่

Redbull

  • Full Member
  • ***
  • Posts: 138
สร้างตัวแปรมาเก็บ OrderID เพื่อตรวจสอบว่าเปิดออเดอร์ติดหรือเปล่า ถ้าไม่ติด ให้เปิดใหม่ ครับ

int ticket;

ticket = OrderSend ("AUDCAD",OP_SELL,LOT_No.1,Bid,3,0,0," ",0,0,red);

ถ้าเปิดติดจะได้เลข orderid เก็บอยู่ในตัวแปร ticket

if ( ticket = 0 )  เอาใหม่
ขอบคุณคุณครู D_Diamond ครับ...รวดเร็วทันใจดีแท้  ;D ;D
ขอถามเพิ่มอีกนิดนะครับ เพื่อให้แน่ใจ (แอบเห็นว่าคุณครูอยู่ในบอร์ดพอดี..อิ อิ)
if ( ticket = 0 )  เอาใหม่
ตรง "เอาใหม่" นี่ หมายถึง code เปิดออเดอร์  OrderSend ("AUDCAD",OP_SELL,LOT_No.1,Bid,3,0,0," ",0,0,red); ใช่ไหมครับ......

ขอบคุณครับ...

phoenicis

  • Newbie
  • *
  • Posts: 27
int ticket = 0;
while (ticket == 0)
{
//open orders
ticket = ordersend...................................................
}

ไม่ก็

while(true)
{
int ticket = ordersend(...................................................);
if (ticket > 0) break;
}
« Last Edit: สิงหาคม 08, 2012, 04:17:06 pm by phoenicis »

Redbull

  • Full Member
  • ***
  • Posts: 138
ขอบคุณทั้งสองท่านครับ...(ถูกขโมยอีเอทั้งคู่เลย..อะ..ล้อเล่นครับ..)
ยัง งงๆ ก๊งๆ อยู่...
เดี๋ยวขอลองก่อนนะครับ...ติดตรงไหน จะรบกวนอีกครั้งครับ...
ขอบพระคุณมากมายครับ... ;D ;D ;D

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
เขียนให้ดูเป็นตัวอย่างครับ  กรณีเทรดหลายคู่แบบนี้ผมจะใช้ array ช่วย
ส่วน while ต้องใช้คู่กับ for เพราะมีหลายออเดอร์ ต้องวยลูป 2 ชั้น
ชั้นที่ 1 วนลูปจนเปิดออเดอร์ได้ ชั้นที่ 2 วนลูปเปลี่ยนคู่

เริ่มจากสร้าง array ไว้ในส่วนของ global

   string symbol[4];   // อันนี้ไว้เก็บ symbol pair ที่เราจะเลือกเทรด
   int command[4];   // อันนี้ไว้เก็บคำสั่ง buy หรือ sell ในแต่ละ pair

ต่อด้วยกำหนดค่าพื้นฐานไว้ในฟังก์ชั่น init() ก่อน ตามนี้

   symbol[0] = "USDCAD" ;
   command[0] = OP_SELL ;
   symbol[1] = "USDCHF" ;
   command[1] = OP_BUY ;
   symbol[2] = "GBPUSD" ;
   command[2] = OP_BUY ;
   symbol[3] = "EURUSD" ;
   command[3] = OP_SELL ;

ต่อไปในส่วนโค้ดที่ใช้เทรดก็เขียนตามนี้

for ( int i=0;i<=3;i++ )
   {
      int ticket = 0;                        // กำหนด ticket เป็น 0 ไว้ข้างใน for เพื่อให้มันกลับเป็น 0 ทุกครั้งก่อนเทรด
      double price = MarketInfo(symbol,MODE_BID);                                    //  ตรงนี้เป็นราคาของแต่ละคู่  ต้องใช้ marketinfo ไม่สามารถเรียก Bid หรือ Ask ได้ตรงๆ
      if ( command == OP_BUY ) price = MarketInfo(symbol,MODE_ASK);     //  ต้องเปลี่ยนราคามาใช้ Ask ถ้าเป็นคำสั่ง Buy
      
      while(ticket==0)    // วนลูปจนกว่าจะเทรดได้
         {
            ticket = OrderSend (symbol,command,LOT,price,3,0,0," ",0,0,CLR_NONE);   //  ถ้าเทรดได้แล้ว ticket จะไม่เป็น 0 ออกจากลูปไปเทรดคู่ถัดไป  ตามลูป for ต่อ  หากยังเทรดไม่ได้จะค้างอยู่ใน while ไม่ออกไปไหน
         }
   }
« Last Edit: สิงหาคม 08, 2012, 10:35:31 pm by D_Diamond »

Redbull

  • Full Member
  • ***
  • Posts: 138
ขอบคุณคุณครู D_Diamond ครับ...
ผมลองทำตามใน reply แรกที่คุณครูแนะนำ..
เสร็จแล้วลองเทสไป 7 - 8 รอบ ออเดอร์เปิดครบครับ ยังไม่เจอปัญหาอะไรครับ..
ขอบพระคุณมากมายครับ... ;D ;D ;D

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ปัญหามันจะมีอยู่ 2 ที่ครับ

1. Bid กับ Ask ถ้าเรียกตรงๆไม่ผ่าน Marketinfo จะใช้ได้กับโบรก market execution อย่าง roboforex เพราะจะเปิดออเดอร์ได้โดยไม่อ้างอิงราคา  
แต่ถ้าเป็น instant execution อย่าง insta จะเปิดออเดอร์ได้แค่ 1 คู่ คือคู่ที่ใช้อีเอเท่านั้น คู่อื่นเทรดไม่ได้ เพราะอ้างอิงราคาไม่ตรงกัน

2. ถ้าเปิดออเดอร์ติดหมดในคราวเดียว มันก็จะไม่วนลูป เราจะไม่รู้ว่าโค้ดถูกหรือเปล่า  ต้องทดสอบไปเรื่อยๆจนเปิดออเดอร์ติดมั่งไม่ติดมั่ง  แล้วมันวนกลับมาสั่งเทรดใหม่จนครบได้

3. ถ้าโบรกที่ symbol ไม่เหมือนปกติ ก็จะเทรดไม่ได้ เช่น tradefort จะเป็น EURUSDf ไม่ใช่ EURUSD แบบนี้จะเทรดไม่ได้ซักคู่

ตรงนี้แก้แบบนี้
ใช้สร้าง input อันนึงไว้ป้อนตัวอักษรต่อท้าย symbol

extern string Symbol_suffix = "f" ;

แล้วเอามันแทรกเพิ่มในคำสั่ง ordersend

ticket = OrderSend (symbol+Symbol_suffix,command,LOT,price,3,0,0," ",0,0,CLR_NONE);

4. ถ้าเป็นอีเอเขียนแค่นี้มันจะเทรดเพิ่มไปเรื่อยๆ ไม่มีหยุด  ต้องทำเป็นสคริปมันจะเทรดครั้งเดียวครบทุกคู่แล้วหยุดเลย
« Last Edit: สิงหาคม 08, 2012, 10:41:38 pm by D_Diamond »

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
ที่เปิดไม่ครบ เพราะว่า ใน 1 วินาที แต่ละโบรคให้ ea ทำงานได้กี่ครั้ง อย่างเช่น exness ใน 1 วิได้ 3 ครั้งทีนี้ท่านส่งไปทั้งหมดยี่สิบกว่าคู่มันเลยไม่เปิดให้
ลองใส่ sleep(500) ระหว่างคำสั่งเปิดก็ได้ครับ ถ้าไม่อยู่ในช่วงกราฟวิ่งแรงๆ ต้อง requote  เปิดได้ครบ ชัวร์

Redbull

  • Full Member
  • ***
  • Posts: 138
ที่เปิดไม่ครบ เพราะว่า ใน 1 วินาที แต่ละโบรคให้ ea ทำงานได้กี่ครั้ง อย่างเช่น exness ใน 1 วิได้ 3 ครั้งทีนี้ท่านส่งไปทั้งหมดยี่สิบกว่าคู่มันเลยไม่เปิดให้
ลองใส่ sleep(500) ระหว่างคำสั่งเปิดก็ได้ครับ ถ้าไม่อยู่ในช่วงกราฟวิ่งแรงๆ ต้อง requote  เปิดได้ครบ ชัวร์
อ๋อ..มันเป็นอย่างนี้นี่เอง...ความรู้ใหม่ อิ อิ
ถึงว่าผมลองที่ thinkforex มันเปิดได้ปกติ..
แต่คนอื่นเปิดไท่ได้..
ว่าแต่ เราจะรู้ได้ไงครับ ว่าแต่ละโบรกรคให้ ea ทำงานได้กี่ครั้งต่อ 1 วินาที...
ขอบพระคุณมากมายครับ... ;D ;D ;D

Redbull

  • Full Member
  • ***
  • Posts: 138
ปัญหามันจะมีอยู่ 2 ที่ครับ

1. Bid กับ Ask ถ้าเรียกตรงๆไม่ผ่าน Marketinfo จะใช้ได้กับโบรก market execution อย่าง roboforex เพราะจะเปิดออเดอร์ได้โดยไม่อ้างอิงราคา  
แต่ถ้าเป็น instant execution อย่าง insta จะเปิดออเดอร์ได้แค่ 1 คู่ คือคู่ที่ใช้อีเอเท่านั้น คู่อื่นเทรดไม่ได้ เพราะอ้างอิงราคาไม่ตรงกัน

2. ถ้าเปิดออเดอร์ติดหมดในคราวเดียว มันก็จะไม่วนลูป เราจะไม่รู้ว่าโค้ดถูกหรือเปล่า  ต้องทดสอบไปเรื่อยๆจนเปิดออเดอร์ติดมั่งไม่ติดมั่ง  แล้วมันวนกลับมาสั่งเทรดใหม่จนครบได้

3. ถ้าโบรกที่ symbol ไม่เหมือนปกติ ก็จะเทรดไม่ได้ เช่น tradefort จะเป็น EURUSDf ไม่ใช่ EURUSD แบบนี้จะเทรดไม่ได้ซักคู่

ตรงนี้แก้แบบนี้
ใช้สร้าง input อันนึงไว้ป้อนตัวอักษรต่อท้าย symbol

extern string Symbol_suffix = "f" ;

แล้วเอามันแทรกเพิ่มในคำสั่ง ordersend

ticket = OrderSend (symbol+Symbol_suffix,command,LOT,price,3,0,0," ",0,0,CLR_NONE);

4. ถ้าเป็นอีเอเขียนแค่นี้มันจะเทรดเพิ่มไปเรื่อยๆ ไม่มีหยุด  ต้องทำเป็นสคริปมันจะเทรดครั้งเดียวครบทุกคู่แล้วหยุดเลย

โทษทีครับ ผมเพิ่งเห็น Reply คุณครู...กำลังจะกลับมาถามปัญหานี้พอดีเลยครับ..
คือตอนเขียนและเทสมันปกติดีครับ เพราะเทสกับ ThinkForex...
แต่พอมาเทสกับโบรกอื่น ไม่ได้ครับ...อย่างที่คุณครูบอกครับ "ถ้าเป็น instant execution อย่าง insta จะเปิดออเดอร์ได้แค่ 1 คู่ คือคู่ที่ใช้อีเอเท่านั้น" อย่างนี้มีทางแก้ไขไหมครับ...
ส่วนโบรกที่ symbol ไม่เหมือนปกติ เห็นตัวอย่างที่คุณครูให้มาแล้ว ข้อนี้ไม่น่ามีปัญหาครับ...
ผมแนบ code ที่ลองเขียนมาด้วย..ยังไงรบกวนแนะนำด้วยครับว่าควรปรับปรุงตรงไหนบ้าง...
ขอบคุณครับ..

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ต้องใช้ marketinfo ตามโค้ดตัวอย่างที่ผมเขียนให้ดูครับ

Redbull

  • Full Member
  • ***
  • Posts: 138
ต้องใช้ marketinfo ตามโค้ดตัวอย่างที่ผมเขียนให้ดูครับ
อ๋อ...เดี๋ยวจะลองดูครับ...
ขอบคุณครับ... ;D ;D ;D