EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: be on กุมภาพันธ์ 06, 2013, 04:37:35 pm
-
จากกระทู้นี้นะครับ
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);
}
}
}
}
รบกวนช่วยดูหรือแก้ไขให้หน่อยครับ
ขอบคุณครับ :-[ :-[
-
เหตุผลที่ปิดได้ไม่หมด เพราะเมื่อปิดไปครึ่งทาง 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 ในคราวเดียวกัน
แต่ถ้าต้องการตรวจสอบค่าอะไรทั่วไป ใช้ลำดับปกติเหมือนเดิมก็ได้
-
ขอบคุณท่าน hyperxeon ครับ
แต่ผมลองทำตามที่ท่านบอกแล้วครับ
พอผมมานั่ง backtest ย้อนหลังดูก็ยังเป็นเหมือนเดิมครับ คือ ปิดได้ไม่หมด ปิดได้แค่บ้างส่วนครับ
จะแก้อย่างไรดีครับ ??? ??? ???
-
ถ้าจะเอาให้ ปิดหมด ไม่มีเหลือ มีโอกาสแค่ครั้งเดียว ถ้าปิดไม่หมดจะปิดต่อไม่ได้
ต้อง ตรวจสอบว่า ปิดแล้วยัง ด้วยครับ
สมมุติมี 5 ออเดอร์ พอสั่งปิดออเดอร์ 1 จะต้องตรวจสอบก่อนว่ามันปิดแล้วจริง ถึงค่อยไปปิดออเดอร์ที่ 2
ไม่งั้นถ้ามันวืดปิดออเดอร์ไม่ได้ มันก็จะเหลือค้างอยู่แบบนั้น
จากโค้ดที่เขียนมาวางลูปผิดครับ ใช้ while ซ้อนกับ for
เอาแค่ while อย่างเดียวพอ แล้วตอนออกจากลูป ใช้ break; นะครับ ไม่ใช่ return
ที่คุณเขียนมาใช้ return มันจะจบการทำงานไปเลย ไม่วนลูป
ซึ่งก็หมายความว่า มันปิดแค่ออเดอร์เดียว แล้วกลับมาปิดใหม่ พอกำไรยังมากกว่า 5 อยู่ มันก็ปิดได้ แต่พอปิดจนกำไรเหลือน้อยกว่า 5 มันก็หยุด
-
ถ้าจะเอาให้ ปิดหมด ไม่มีเหลือ มีโอกาสแค่ครั้งเดียว ถ้าปิดไม่หมดจะปิดต่อไม่ได้
ต้อง ตรวจสอบว่า ปิดแล้วยัง ด้วยครับ
สมมุติมี 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);
}
}
-
ยังไม่ถูกครับ
1. ยังไม่มีการตรวจสอบกว่าปิดออเดอร์หรือยัง
แก้แบบนี้
if ( OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) )
2. เมื่อปิดออเดอร์แล้ว จำนวนออเดอร์ต้องลดลง
กลายเป็นแบบนี้
if ( OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) )
total-=1 ;
ถ้าไม่ได้ลดจำนวนออเดอร์ มันก็จะวนลูปอยู่นั่นไม่ยอมออก กลายเป็น mt4 ค้างไปเลย
แต่ของคุณออกจากลูปได้ เพราะคุณใส่ break;
ซึ่งผมบอกไปแล้วว่า break คือกการออกจากลูป
นั่นหมายความว่ามันไม่ได้วนลูป แต่ปิดออเดอร์เดียวจบ เหมือนเดิม
เหลือนิดเดียวแล้วลองอีกทีครับ
-
ผมลืมไปนิดเรื่องลูป 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 เสมอ ปิดไปแล้วมันก็เลื่อนมาเอง
เหมือนเราวางหนังสือซ้อนกัน แล้วดึงเล่มล่างสุดออกมา ไม่ว่าดึงออกมากี่ที ก็จะดึงเล่มล่างสุดได้เสมอ เล่มข้างบนจะค่อยๆเลื่อนลงมาเอง จนกว่ามันจะหมด
-
ผมลองแบบนี้ก็ไม่ได้ครับ
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);
}
............................................................................................
ไปไม่เป็นแล้วครับ
มึนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนน
ขอบคุณครับ
-
มันมีปัญหายังไงครับที่บอกว่า ไม่ได้
ผมลองแบคเทสก็ปิดหมดเกลี้ยงเป็นร้อยออเดอร์ไม่มีปัญหา
-
มันมีปัญหายังไงครับที่บอกว่า ไม่ได้
ผมลองแบคเทสก็ปิดหมดเกลี้ยงเป็นร้อยออเดอร์ไม่มีปัญหา
ของผมเป็นแบบนี้ครับ ที่ H1
ตอนที่ปิด ถ้านั่งดูสดๆ จะเห็นออเดอร์ข้างล่างที่เปิดก่อน ติดคาอยู่เต็มเลย
ขอบคุณครับ
-
ลองเซฟอีเอเป็นชื่อใหม่ครับ
-
ลองเซฟอีเอเป็นชื่อใหม่ครับ
ให้ผมใช้ Code ตัวไหนครับ
ขอบคุณครับ
-
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);
-
ทดลองเปลี่ยนชื่อใหม่ ตามที่ท่าน D_Diamond แนะนำ
ได้ละครับ
พอจะให้เหตุผลได้รึป่าวครับ ว่าเกิดอะไรขึ้น
ขอบคุณครับ
-
ผมก็ไม่รู้ครับว่ามันเป็นอะไร แต่เวลาผมแก้อีเอมีหลายครั้งที่มันเอ๋อ เขียนแล้วมันเทรดออกมาไม่เหมือนที่เขียน ทั้งที่มั่นใจว่าโค้ดไม่ผิดแน่ๆ
ปิดโปรแกรมก็แล้ว ลบไฟล์ทิ้งก็แล้ว แต่ก็ทำงานไม่ตรง ต้องเซฟชื่อใหม่เลยถึงจะหาย
หลังๆเวลาแก้อีเอเลยเซฟชื่อใหม่ตลอดครับ พอเสร็จค่อยลบอันที่ไม่เอาทิ้ง
-
ผมก็ไม่รู้ครับว่ามันเป็นอะไร แต่เวลาผมแก้อีเอมีหลายครั้งที่มันเอ๋อ เขียนแล้วมันเทรดออกมาไม่เหมือนที่เขียน ทั้งที่มั่นใจว่าโค้ดไม่ผิดแน่ๆ
ปิดโปรแกรมก็แล้ว ลบไฟล์ทิ้งก็แล้ว แต่ก็ทำงานไม่ตรง ต้องเซฟชื่อใหม่เลยถึงจะหาย
หลังๆเวลาแก้อีเอเลยเซฟชื่อใหม่ตลอดครับ พอเสร็จค่อยลบอันที่ไม่เอาทิ้ง
รับทราบครับ
ขอบคุณครับ
-
ผมก็ไม่รู้ครับว่ามันเป็นอะไร แต่เวลาผมแก้อีเอมีหลายครั้งที่มันเอ๋อ เขียนแล้วมันเทรดออกมาไม่เหมือนที่เขียน ทั้งที่มั่นใจว่าโค้ดไม่ผิดแน่ๆ
ปิดโปรแกรมก็แล้ว ลบไฟล์ทิ้งก็แล้ว แต่ก็ทำงานไม่ตรง ต้องเซฟชื่อใหม่เลยถึงจะหาย
หลังๆเวลาแก้อีเอเลยเซฟชื่อใหม่ตลอดครับ พอเสร็จค่อยลบอันที่ไม่เอาทิ้ง
ความรู้ใหม่...ดูดเก็บไว้ก่อน ;D ;D ;D