Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: อยากให้ปิดออเดอร์ทั้งหมดเมื่อผลรวมกำไรถึงยอดเงินที่ต้องการ  (Read 29356 times)

be

  • Newbie
  • *
  • Posts: 32
จากกระทู้นี้นะครับ
http://www.thaiforexea.com/index.php/topic,1667.msg8818/topicseen.html#msg8818

ตอนนี้ผมได้เพิ่ม code เพื่อให้ ea ปิดออเดอร์ทั้งหมดเมื่อถึงยอดเงินที่ต้องการ(code ปิดออเดอร์ copy เขามา)
แต่ปัญหาที่พบคือ ea ปิดออเดอร์จริง เมื่อผลรวมกำไรถึงยอดเงินที่กำหนด แต่ปิดไม่หมด เมื่อยอดลดลงจากที่กำหนด กลับหยุดปิด

ผมอยากให้ ea ปิดออเดอร์ที่เปิดให้หมดเลยเมื่อผลรวมกำไรถึงยอดเงินที่กำหนด


code ทั้งหมดเป็นแบบนี้ครับ

int oldBars;   // Set เป็น Global (ก่อนฟังก์ชั่น init())

// ในฟังก์ชั่น init()
int init()
{
   oldBars = Bars - 1; // เพื่อให้ทำงานทันทีที่ EA เริ่ม Run
}

int start()
{
   if(Bars > oldBars){   // แท่งเทียนเปลี่ยนหรือยัง ?
   double openprice;
   openprice=iOpen( NULL,0,1);

   double closeprice;
   closeprice=iClose( NULL,0,1);

   if(closeprice>openprice)
   {   
 
   OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,0,"My order",123,0,Green);

   }

   if(closeprice<openprice){
     
   OrderSend(Symbol(),OP_SELL,0.01,Bid,3,0,0,"My order",321,0,Pink);
   }
   oldBars = Bars; // แทนค่าลำดับแท่งเทียนปัจจุบัน เพื่อไม่ให้เปิดเพิ่มอีกในแท่งเทียนนี้
   }
int total;
int cnt;   
total=OrdersTotal(); 
if(AccountProfit()>5)
            {
                   while(total!=0)
                   {
                                             
                 for(cnt=0 ;cnt<total ;cnt++)
                   {   
                         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                   
                                       if( (OrderType()==OP_SELL)  )
                                            {
                                              OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
                                                                   
                                            }
                                                   
                                      if( (OrderType()==OP_BUY)  )
                                            {     
                                             OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                                           
                                            }
          return(0);
  }
}
}
}


รบกวนช่วยดูหรือแก้ไขให้หน่อยครับ

ขอบคุณครับ  :-[ :-[


hyperxeon

  • Newbie
  • *
  • Posts: 11
เหตุผลที่ปิดได้ไม่หมด เพราะเมื่อปิดไปครึ่งทาง EA จะหา POSITION ของ Order หลังๆไม่เจอ เนื่องจาก Orders ใน pool มันลดลงทุกครั้งที่ปิด
สมมุติมีทั้งหมด 5 Orders
ปิด Order ที่ 1      cnt = 0         orders ใน pool จะเหลือ 4
ปิด Order ที่ 2      cnt = 1         orders ใน pool จะเหลือ 3
ปิด Order ที่ 3      cnt = 2         ปิดได้ แต่ orders ใน pool จะเหลือ 2
พอจะปิด Order ที่ 4  cnt = 3 แต่ใน pool เหลือแค่ 2 orders จึงปิดไม่ได้

วิธีแก้ ให้ปิดย้อนลำดับขึ้นมา
จาก for(cnt=0 ;cnt<total ;cnt++)          เป็น for(cnt = total-1; cnt >=0 ; cnt--)

คือ cnt จะลดลงตามจำนวน Order ที่เหลือพอดี ซึ่งวิธีนี้จะเป็นวิธีสำหรับปิดทุก Orders ในคราวเดียวกัน
แต่ถ้าต้องการตรวจสอบค่าอะไรทั่วไป ใช้ลำดับปกติเหมือนเดิมก็ได้
« Last Edit: กุมภาพันธ์ 06, 2013, 05:10:08 pm by hyperxeon »

be

  • Newbie
  • *
  • Posts: 32
ขอบคุณท่าน hyperxeon ครับ

แต่ผมลองทำตามที่ท่านบอกแล้วครับ
พอผมมานั่ง backtest ย้อนหลังดูก็ยังเป็นเหมือนเดิมครับ คือ ปิดได้ไม่หมด ปิดได้แค่บ้างส่วนครับ


จะแก้อย่างไรดีครับ  ??? ??? ???

D_Diamond

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

สมมุติมี 5 ออเดอร์  พอสั่งปิดออเดอร์ 1 จะต้องตรวจสอบก่อนว่ามันปิดแล้วจริง ถึงค่อยไปปิดออเดอร์ที่ 2
ไม่งั้นถ้ามันวืดปิดออเดอร์ไม่ได้  มันก็จะเหลือค้างอยู่แบบนั้น

จากโค้ดที่เขียนมาวางลูปผิดครับ ใช้ while ซ้อนกับ for
เอาแค่ while อย่างเดียวพอ แล้วตอนออกจากลูป  ใช้ break; นะครับ ไม่ใช่ return

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


be

  • Newbie
  • *
  • Posts: 32
ถ้าจะเอาให้  ปิดหมด ไม่มีเหลือ มีโอกาสแค่ครั้งเดียว ถ้าปิดไม่หมดจะปิดต่อไม่ได้
ต้อง ตรวจสอบว่า ปิดแล้วยัง ด้วยครับ

สมมุติมี 5 ออเดอร์  พอสั่งปิดออเดอร์ 1 จะต้องตรวจสอบก่อนว่ามันปิดแล้วจริง ถึงค่อยไปปิดออเดอร์ที่ 2
ไม่งั้นถ้ามันวืดปิดออเดอร์ไม่ได้  มันก็จะเหลือค้างอยู่แบบนั้น

จากโค้ดที่เขียนมาวางลูปผิดครับ ใช้ while ซ้อนกับ for
เอาแค่ while อย่างเดียวพอ แล้วตอนออกจากลูป  ใช้ break; นะครับ ไม่ใช่ return

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



ขอบคุณท่าน D_Diamond ครับ ที่เข้ามาตอบ
ผมเขียนแบบนี้ ลอง run ดูแล้วก็ยังไม่ได้อะครับ ยังมีปัญหาเหมือนเดิม

code ที่แก้ตามที่ท่านบอกผมแก้เป็นแบบนี้ครับ ไม่รู้ถูกรึป่าว ถ้าไม่ถูกช่วยแก้ หรือ ชี้แนะให้ด้วยครับ
ขอบคุณครับ

int oldBars;   // Set เป็น Global (ก่อนฟังก์ชั่น init())

// ในฟังก์ชั่น init()
int init()
{
   oldBars = Bars - 1; // เพื่อให้ทำงานทันทีที่ EA เริ่ม Run
}

int start()
{
   if(Bars > oldBars){   // แท่งเทียนเปลี่ยนหรือยัง ?
   double openprice;
   openprice=iOpen( NULL,0,1);

   double closeprice;
   closeprice=iClose( NULL,0,1);

   if(closeprice>openprice)
   {   
 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"My order",123,0,Green);

   }

   if(closeprice<openprice){
     
   OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"My order",321,0,Pink);
   }
   oldBars = Bars; // แทนค่าลำดับแท่งเทียนปัจจุบัน เพื่อไม่ให้เปิดเพิ่มอีกในแท่งเทียนนี้
   }
int total;
int cnt;   
total=OrdersTotal();
if(AccountProfit()>5)
            {
                   while(total!=0)
                 
                   {   
                         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                   
                                       if( (OrderType()==OP_SELL)  )
                                            {
                                              OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
                                                                   
                                            }
                                                   
                                      if( (OrderType()==OP_BUY)  )
                                            {     
                                             OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                                           
                                            }
                                            break;
                                            }
                                           
          return(0);
  }
}


D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ยังไม่ถูกครับ

1. ยังไม่มีการตรวจสอบกว่าปิดออเดอร์หรือยัง
แก้แบบนี้

if ( OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) )

2. เมื่อปิดออเดอร์แล้ว  จำนวนออเดอร์ต้องลดลง
กลายเป็นแบบนี้
if ( OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) )
total-=1    ; 

ถ้าไม่ได้ลดจำนวนออเดอร์  มันก็จะวนลูปอยู่นั่นไม่ยอมออก  กลายเป็น mt4 ค้างไปเลย
แต่ของคุณออกจากลูปได้ เพราะคุณใส่ break;
ซึ่งผมบอกไปแล้วว่า break คือกการออกจากลูป
นั่นหมายความว่ามันไม่ได้วนลูป  แต่ปิดออเดอร์เดียวจบ เหมือนเดิม

เหลือนิดเดียวแล้วลองอีกทีครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ผมลืมไปนิดเรื่องลูป while จริงๆสามารถเขียนให้สั้นลงไปอีกได้ครับ
เพราะจำนวนออเดอร์มันจะลดลงไปเองได้  ถ้าเราไม่ใช้ตัวแปร  แต่ใช้ orderstotal ตรงๆ


          
if(AccountProfit()>5)
            {
                   while( OrdersTotal() !=0 )    //  ก่อนปิดออเดอร์ มันจะตรวจสอบใหม่ว่ามีเปิดค้างอยู่เท่าไร
                   {  
                         OrderSelect(0,SELECT_BY_POS,MODE_TRADES);    //  เลือกปิดเฉพาะ ออเดอร์  0  
                  
                           if( (OrderType()==OP_SELL)  )
                              OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);                    
                          
                           if( (OrderType()==OP_BUY)  )
                              OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                  
                   }
                                          
            }
            
            return(0);


* เลือกปิดเฉพาะ ออเดอร์  0  เพราะไม่ว่าจะมีกี่ออเดอร์  ออเดอร์แรกสุด คือ 0 เสมอ  ปิดไปแล้วมันก็เลื่อนมาเอง
เหมือนเราวางหนังสือซ้อนกัน  แล้วดึงเล่มล่างสุดออกมา  ไม่ว่าดึงออกมากี่ที  ก็จะดึงเล่มล่างสุดได้เสมอ  เล่มข้างบนจะค่อยๆเลื่อนลงมาเอง  จนกว่ามันจะหมด
« Last Edit: กุมภาพันธ์ 06, 2013, 07:22:58 pm by D_Diamond »

be

  • Newbie
  • *
  • Posts: 32
ผมลองแบบนี้ก็ไม่ได้ครับ

int oldBars;   // Set เป็น Global (ก่อนฟังก์ชั่น init())

// ในฟังก์ชั่น init()
int init()
{
   oldBars = Bars - 1; // เพื่อให้ทำงานทันทีที่ EA เริ่ม Run
}

int start()
{
   if(Bars > oldBars){   // แท่งเทียนเปลี่ยนหรือยัง ?
   double openprice;
   openprice=iOpen( NULL,0,1);

   double closeprice;
   closeprice=iClose( NULL,0,1);

   if(closeprice>openprice)
   {   
 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"My order",123,0,Green);

   }

   if(closeprice<openprice){
     
   OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"My order",321,0,Pink);
   }
   oldBars = Bars; // แทนค่าลำดับแท่งเทียนปัจจุบัน เพื่อไม่ให้เปิดเพิ่มอีกในแท่งเทียนนี้
   }
int total;
int cnt;   
total=OrdersTotal();
if(AccountProfit()>5)
            {
                   while(total!=0)
                 
                   {   
                         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                   
                                       if( (OrderType()==OP_SELL)  )
                                            {
                                              OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
                                                                   
                                            }
                                                   
                                      if( (OrderType()==OP_BUY)  )
                                            {     
                                             OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                                           
                                            }
                                            {
                                            if ( OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) )
                                           
                                            {
                                            if ( OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) )
                                            total-=1    ; 
                                            }
                                            }
                                            break;
                                            }
                                           
          return(0);
  }
}


******************************************************************************************

อีกอันก็ไม่ได้ครับ

int oldBars;   // Set เป็น Global (ก่อนฟังก์ชั่น init())

// ในฟังก์ชั่น init()
int init()
{
   oldBars = Bars - 1; // เพื่อให้ทำงานทันทีที่ EA เริ่ม Run
}

int start()
{
   if(Bars > oldBars){   // แท่งเทียนเปลี่ยนหรือยัง ?
   double openprice;
   openprice=iOpen( NULL,0,1);

   double closeprice;
   closeprice=iClose( NULL,0,1);

   if(closeprice>openprice)
   {   
 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"My order",123,0,Green);

   }

   if(closeprice<openprice){
     
   OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"My order",321,0,Pink);
   }
   oldBars = Bars; // แทนค่าลำดับแท่งเทียนปัจจุบัน เพื่อไม่ให้เปิดเพิ่มอีกในแท่งเทียนนี้
   }
int total;
int cnt;   
total=OrdersTotal();

if(AccountProfit()>5)
            {
                   while( OrdersTotal() !=0 )    //  ก่อนปิดออเดอร์ มันจะตรวจสอบใหม่ว่ามีเปิดค้างอยู่เท่าไร
                   { 
                         OrderSelect(0,SELECT_BY_POS,MODE_TRADES);    //  เลือกปิดเฉพาะ ออเดอร์  0 
                 
                           if( (OrderType()==OP_SELL)  )
                              OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);                   
                         
                           if( (OrderType()==OP_BUY)  )
                              OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 
                   }
                                         
            }
           
            return(0);

                                            }
                                           
          ............................................................................................

ไปไม่เป็นแล้วครับ
มึนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนน

ขอบคุณครับ
« Last Edit: กุมภาพันธ์ 06, 2013, 07:50:11 pm by be »

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
มันมีปัญหายังไงครับที่บอกว่า  ไม่ได้
ผมลองแบคเทสก็ปิดหมดเกลี้ยงเป็นร้อยออเดอร์ไม่มีปัญหา

be

  • Newbie
  • *
  • Posts: 32
มันมีปัญหายังไงครับที่บอกว่า  ไม่ได้
ผมลองแบคเทสก็ปิดหมดเกลี้ยงเป็นร้อยออเดอร์ไม่มีปัญหา

ของผมเป็นแบบนี้ครับ ที่ H1
ตอนที่ปิด ถ้านั่งดูสดๆ จะเห็นออเดอร์ข้างล่างที่เปิดก่อน ติดคาอยู่เต็มเลย

ขอบคุณครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ลองเซฟอีเอเป็นชื่อใหม่ครับ

be

  • Newbie
  • *
  • Posts: 32
ลองเซฟอีเอเป็นชื่อใหม่ครับ

ให้ผมใช้ Code ตัวไหนครับ

ขอบคุณครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
if(AccountProfit()>5)
            {
                   while( OrdersTotal() !=0 )    //  ก่อนปิดออเดอร์ มันจะตรวจสอบใหม่ว่ามีเปิดค้างอยู่เท่าไร
                   {  
                         OrderSelect(0,SELECT_BY_POS,MODE_TRADES);    //  เลือกปิดเฉพาะ ออเดอร์  0  
                  
                           if( (OrderType()==OP_SELL)  )
                              OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);                    
                          
                           if( (OrderType()==OP_BUY)  )
                              OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                  
                   }
                                          
            }
            
            return(0);

be

  • Newbie
  • *
  • Posts: 32
ทดลองเปลี่ยนชื่อใหม่ ตามที่ท่าน D_Diamond แนะนำ
ได้ละครับ

พอจะให้เหตุผลได้รึป่าวครับ ว่าเกิดอะไรขึ้น

ขอบคุณครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ผมก็ไม่รู้ครับว่ามันเป็นอะไร  แต่เวลาผมแก้อีเอมีหลายครั้งที่มันเอ๋อ  เขียนแล้วมันเทรดออกมาไม่เหมือนที่เขียน  ทั้งที่มั่นใจว่าโค้ดไม่ผิดแน่ๆ
ปิดโปรแกรมก็แล้ว ลบไฟล์ทิ้งก็แล้ว  แต่ก็ทำงานไม่ตรง  ต้องเซฟชื่อใหม่เลยถึงจะหาย
หลังๆเวลาแก้อีเอเลยเซฟชื่อใหม่ตลอดครับ  พอเสร็จค่อยลบอันที่ไม่เอาทิ้ง
« Last Edit: กุมภาพันธ์ 06, 2013, 08:57:48 pm by D_Diamond »