Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: ถ้าต้องการ close order ที่มากกว่า 0 จะทำยังไงครับ  (Read 14248 times)

AvatarFX

  • Jr. Member
  • **
  • Posts: 60
    • Make Money Online
ผมต้องการ close order ทุกรายการที่มากว่า 0 ไม่ทราบว่าจะเขียนยังไงครับ

ขอรบกวนอีกครั้งครับ
ขอบคุณมากครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
คุณก็ใส่ เงื่อนไข ตรวจสอบ profit เข้าไปใน code ไงครับ ถ้า เป้นจ่ิงค่อยหลุดไปปิด order

AvatarFX

  • Jr. Member
  • **
  • Posts: 60
    • Make Money Online
คุณAdmin ครับช่วยดู code ให้หน่อยนะครับ

จาก code ด้านล่าง คือผมต้องการปิด order ที่ profit มากกว่า 0 เมื่อ มีจำนวนการเปิด order ทั้งหมดมากกว่าหรือเท่า 10 order
โดยผมไปกำหนดที่ เงื่อนไขที่ บรรทัดที่เป็นสีแดง พอมันถึง 10 order ในครั้งแรก มันก็ปิดตามเงื่อนไขให้ครับ และจำนวน order
ก็ลดลงเหลือ 5 order แต่พอ order ไหน มี profit มากกว่า 0 มันดันปิดให้ ทั้งๆ ที่ยังไม่ถึง 10 order อ่ะครับ

ผมจึงอยากให้ Admin ช่วยแก้ไขให้มันปิด order เมื่อมีจำนวน order มากว่าหรือเท่ากับ 10 order ก่อน แล้วค่อยทำการ close อ่ะครับ

ขอบคุณมากครับ

if(OrdersTotal() >= 10)
{
   close();
   return(0);
}

void close()
{

while(OrdersTotal()>0)
{

for(int i=0;i<OrdersTotal();i++)


       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   
       int type   = OrderType();
               
       bool result =false;
       
      if(OrderProfit()>0)
       {
       
       switch(type)
          {
         
          case OP_BUY  : result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);
                         break;     
          case OP_SELL : result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);
                         break;
          case OP_BUYLIMIT  : result = OrderDelete(OrderTicket());
                         break;     
          case OP_SELLLIMIT : result = OrderDelete(OrderTicket());
                         break; 
          case OP_BUYSTOP  : result = OrderDelete(OrderTicket());
                         break;     
          case OP_SELLSTOP : result = OrderDelete(OrderTicket());
                         break; 
            }
        }
       
  }
}

return(0);
}

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
จากตรงนี้
if(OrdersTotal() >= 10)
   close();

เมื่อมีออเดอร์ครบ 10 ขึ้นไป ให้เริ่มปิด

ส่วนตรงนี้  while(OrdersTotal()>0)   แปลว่ามันจะปิดจนหมดทุกออเดอร์

ที่ว่ามันปิดเหลือ 5 ออเดอร์ คงเพราะ อีก 5 ที่เหลือ มันยังไม่ได้กำไร
แต่อีเอมันยังไม่หยุดทำงาน เพราะกำหนดไว้ว่าต้องปิดเหลือ 0 ดังนั้นมันก็จะรอปิด

วิธีแก้ขอแนะนำว่า  ให้ใส่สถานะไป 1อัน  ว่า  ปิดแล้ว / ยังไม่ปิด
พออีเอเริ่มปิดออเดอร์  ให้เปลี่ยนสถานะเป็น  ปิดแล้ว  มันก็จะปิดแค่รอบเดียวไม่ว่าจะเหลือกี่ออเดอร์  และหยุดการทำงาน

แล้วพอมีออเดอร์ 10 ออเดอร์ ให้เปลี่ยนสถานะกลับเป็น ยังไม่ปิด มันก็จะเช็กผลกำไรใหม่อีกทีครับ

AvatarFX

  • Jr. Member
  • **
  • Posts: 60
    • Make Money Online
จากตรงนี้
if(OrdersTotal() >= 10)
   close();

เมื่อมีออเดอร์ครบ 10 ขึ้นไป ให้เริ่มปิด

ส่วนตรงนี้  while(OrdersTotal()>0)   แปลว่ามันจะปิดจนหมดทุกออเดอร์

ที่ว่ามันปิดเหลือ 5 ออเดอร์ คงเพราะ อีก 5 ที่เหลือ มันยังไม่ได้กำไร
แต่อีเอมันยังไม่หยุดทำงาน เพราะกำหนดไว้ว่าต้องปิดเหลือ 0 ดังนั้นมันก็จะรอปิด

วิธีแก้ขอแนะนำว่า  ให้ใส่สถานะไป 1อัน  ว่า  ปิดแล้ว / ยังไม่ปิด
พออีเอเริ่มปิดออเดอร์  ให้เปลี่ยนสถานะเป็น  ปิดแล้ว  มันก็จะปิดแค่รอบเดียวไม่ว่าจะเหลือกี่ออเดอร์  และหยุดการทำงาน

แล้วพอมีออเดอร์ 10 ออเดอร์ ให้เปลี่ยนสถานะกลับเป็น ยังไม่ปิด มันก็จะเช็กผลกำไรใหม่อีกทีครับ

ืำทำยังไงครับ การใส่สถานะ ยังไม่ค่อยเข้าใจ จะใส่ตรงไหนหรือครับ
ยังไงช่วยแนะนำด้วยอ่ะครับ

ขอบคุณมากครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
เพิ่มตัวแปรมาตัวนึงครับ ตั้งชื่อะไรก็ได้ อย่างเช่นในโค้ดนั้นมี  bool result =false;   

false คือ ไม่จริง true คือ จริง

กรณีนี้ใช้ false แทนยังไม่ปิด true แทนปิดแล้ว ก็ได้ครับ  แล้วก้เอาไปวางดักไว้ก่อนจะปิดออเดอร์ 
พอมันมาตรวจพบว่า  ปิดแล้ว   ถึงจะเหลือกี่ออเดอร์  และได้กำไรตอนหลัง  มันก็จะไม่ปิด

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
เอาฟังก์ชั่น close  นี้ไปใส่แทนครับ มันจะหลุดจาก loop while เมื่อไม่มี Order ที่กำไรเป้น บวกครับ ยังไง loop while ก็เอาออกไม่ได้เพราะ code นี้พัฒนามาให้แก้เวลาสั่งปิดไปแล้ว Order ปิดไม่ได้ เวลากราฟวิ่งแรงๆๆ ให้สั่งซ้ำจนกว่าจะปิดได้ ครับไม่งั้นมันจะมี order ที่เหลือจากการที่โบรเกอร์ยังปิดให้เราไม่ได้ครับ
int close()
{
  int count;
while(OrdersTotal()>0)
{
      count=0;
for(int i=0;i<OrdersTotal();i++)

     
       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   
       int type   = OrderType();
               
       bool result =false;
       
      if(OrderProfit()>0)
       {        count=count+1;
           switch(type)
           {
         
          case OP_BUY  : result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,Pink);
                         break;     
          case OP_SELL : result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,Pink);
                         break;
       
            }
        }
       
  }
  if(count==0)
  {
     return(0);
 
  }
 
 
}

return(0);
}