EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: AvatarFX on เมษายน 25, 2012, 03:04:55 pm
-
ผมต้องการ close order ทุกรายการที่มากว่า 0 ไม่ทราบว่าจะเขียนยังไงครับ
ขอรบกวนอีกครั้งครับ
ขอบคุณมากครับ
-
คุณก็ใส่ เงื่อนไข ตรวจสอบ profit เข้าไปใน code ไงครับ ถ้า เป้นจ่ิงค่อยหลุดไปปิด order
-
คุณ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);
}
-
จากตรงนี้
if(OrdersTotal() >= 10)
close();
เมื่อมีออเดอร์ครบ 10 ขึ้นไป ให้เริ่มปิด
ส่วนตรงนี้ while(OrdersTotal()>0) แปลว่ามันจะปิดจนหมดทุกออเดอร์
ที่ว่ามันปิดเหลือ 5 ออเดอร์ คงเพราะ อีก 5 ที่เหลือ มันยังไม่ได้กำไร
แต่อีเอมันยังไม่หยุดทำงาน เพราะกำหนดไว้ว่าต้องปิดเหลือ 0 ดังนั้นมันก็จะรอปิด
วิธีแก้ขอแนะนำว่า ให้ใส่สถานะไป 1อัน ว่า ปิดแล้ว / ยังไม่ปิด
พออีเอเริ่มปิดออเดอร์ ให้เปลี่ยนสถานะเป็น ปิดแล้ว มันก็จะปิดแค่รอบเดียวไม่ว่าจะเหลือกี่ออเดอร์ และหยุดการทำงาน
แล้วพอมีออเดอร์ 10 ออเดอร์ ให้เปลี่ยนสถานะกลับเป็น ยังไม่ปิด มันก็จะเช็กผลกำไรใหม่อีกทีครับ
-
จากตรงนี้
if(OrdersTotal() >= 10)
close();
เมื่อมีออเดอร์ครบ 10 ขึ้นไป ให้เริ่มปิด
ส่วนตรงนี้ while(OrdersTotal()>0) แปลว่ามันจะปิดจนหมดทุกออเดอร์
ที่ว่ามันปิดเหลือ 5 ออเดอร์ คงเพราะ อีก 5 ที่เหลือ มันยังไม่ได้กำไร
แต่อีเอมันยังไม่หยุดทำงาน เพราะกำหนดไว้ว่าต้องปิดเหลือ 0 ดังนั้นมันก็จะรอปิด
วิธีแก้ขอแนะนำว่า ให้ใส่สถานะไป 1อัน ว่า ปิดแล้ว / ยังไม่ปิด
พออีเอเริ่มปิดออเดอร์ ให้เปลี่ยนสถานะเป็น ปิดแล้ว มันก็จะปิดแค่รอบเดียวไม่ว่าจะเหลือกี่ออเดอร์ และหยุดการทำงาน
แล้วพอมีออเดอร์ 10 ออเดอร์ ให้เปลี่ยนสถานะกลับเป็น ยังไม่ปิด มันก็จะเช็กผลกำไรใหม่อีกทีครับ
ืำทำยังไงครับ การใส่สถานะ ยังไม่ค่อยเข้าใจ จะใส่ตรงไหนหรือครับ
ยังไงช่วยแนะนำด้วยอ่ะครับ
ขอบคุณมากครับ
-
เพิ่มตัวแปรมาตัวนึงครับ ตั้งชื่อะไรก็ได้ อย่างเช่นในโค้ดนั้นมี bool result =false;
false คือ ไม่จริง true คือ จริง
กรณีนี้ใช้ false แทนยังไม่ปิด true แทนปิดแล้ว ก็ได้ครับ แล้วก้เอาไปวางดักไว้ก่อนจะปิดออเดอร์
พอมันมาตรวจพบว่า ปิดแล้ว ถึงจะเหลือกี่ออเดอร์ และได้กำไรตอนหลัง มันก็จะไม่ปิด
-
เอาฟังก์ชั่น 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);
}