EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: be on มีนาคม 24, 2013, 04:19:00 pm
-
ผมทดลองเขียน ea แบบนี้ครับ ใ้ห้ ea pending ทั้ง buy stop และ sell stop ที่ระยะห่างจากราคาเปิดของแท่งเทียน (ผมเรียกว่า 1 ชุด)
เมื่อราคาวิ่งไปติดทางใดทางหนึ่ง ก็ให้ลบ pending อีกข้างหนึ่งออก
แต่ปัญหาคือ เมื่อราคาวิ่งต่อไปจนชน TP หรือ SL ภายในแท่งนั้น
ea กลับเปิดออเดอร์ต่ออีกภายในแท่งเดิม
ผมอยากให้ ea เปิดออเดอร์แค่ชุดเดียวต่อ 1 แท่ง ต้องแก้อย่างไรครับ
และถ้าอยากให้ปิดออเดอร์ที่เปิดไว้หลังจากเปลี่ยนแท่งใหม่หรือหมดเวลาที่กำหนด ต้องเขียนอย่างไรครับ
รบกวนขอ code ตัวอย่างด้วยครับ
ขอบคุณครับ
อันนี้เป็น code ที่ผมเขียนไว้ครับ
extern double Lots=0.5;
extern double StartHours = 6;
extern double EndHours = 8;
int start()
{
int total=OrdersTotal();
if(total==0)
if ((Hour()>StartHours)&&(Hour()<EndHours))
double closeprice;
closeprice=iClose( NULL,0,1);
{
OrderSend(Symbol(), OP_BUYSTOP, Lots, closeprice+200*Point, 3, closeprice, closeprice+400*Point, "ea", 4321, CurTime()+PERIOD_H1*60, Green);
OrderSend(Symbol(), OP_SELLSTOP, Lots, closeprice-200*Point, 3, closeprice, closeprice-400*Point, "ea", 1234, CurTime()+PERIOD_H1*60, Pink);
}
if(total==2)
{ int buy ,sell;
for(int i=0;i<total;i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY)
{ buy=buy+1;
}
if(OrderType()==OP_SELL)
{
sell=sell+1;
}
}
if(buy==1 || sell==1)
{
for( i=0;i<total;i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUYSTOP)
{ OrderDelete( OrderTicket());
}
if(OrderType()==OP_SELLSTOP)
{
OrderDelete( OrderTicket());
}
}
}
}
return (0);
}
-
ใช้ orderselect ตรวจสอบ history ก่อน ว่าออเดอร์ที่ปิด ชน tp/sl ไปก่อนหน้านี้นั่น เปิดที่แท่งไหน
ถ้าเป็นแท่งเดียวกัน ก็ไม่ต้องวาง pending ใหม่ครับ
-
ใช้ orderselect ตรวจสอบ history ก่อน ว่าออเดอร์ที่ปิด ชน tp/sl ไปก่อนหน้านี้นั่น เปิดที่แท่งไหน
ถ้าเป็นแท่งเดียวกัน ก็ไม่ต้องวาง pending ใหม่ครับ
ขอบคุณครับท่าน D_Diamond
แต่พอจะมีตัวอย่างไหมครับ ผมเขียนเองไม่เป็น
ขอบคุณครับ
-
แล้วอันนั้นใครเขียนละครับ ก็ใช้ orderselect เหมือนกัน แค่เปลี่ยนจาก MODE_TRADES เป็น MODE_HISTORY เองครับ
-
ตัวอย่างโค้ดครับ
ฟังก์ชั่นนี้เอาไว้ ตรวจดูว่า ออเดอร์ ที่เทรดเสีย ในแท่งนี้ iBarShift(Symbol(),PERIOD_M1,OrderCloseTime()) == 0
มีกี่ออเดอร์แล้ว ของผมถ้าเทรดเสียแท่งเดียวกัน 3 ครั้งจะหยุดเทรด
ของท่านก็เอา count ไปใช้ ถ้า count มากกว่า 0 แสดงว่าออเดอร์ปิดขาดทุน แท่งนี้
ถ้าจะเอาทั้ง tp sl ก็ลบ if ( OrderOpenPrice() > OrderClosePrice() ) ทิ้ง
int LastBarLoss(int type)
{
int count=0;
int total = OrdersHistoryTotal();
for (int po = total-1; po >=0; po--)
{
OrderSelect( po, SELECT_BY_POS, MODE_HISTORY );
if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic )
{
if ( OrderType()== type )
{
if ( OrderType()== OP_BUY )
{
if ( iBarShift(Symbol(),PERIOD_M1,OrderCloseTime()) == 0 )
{
if ( OrderOpenPrice() > OrderClosePrice() )
count++;
}
}
else if ( OrderType()== OP_SELL )
{
if ( iBarShift(Symbol(),PERIOD_M1,OrderCloseTime()) == 0 )
{
if ( OrderOpenPrice() < OrderClosePrice() )
count++;
}
}
}
}
}
return(count);
}
-
ขอบคุณครับท่าน D_Diamond
code ข้างบนผมเป็นคนเรียบเรียงเองครับ แต่จะให้ผมเขียนทั้งหมดผมเขียนไม่ได้ครับ
ผมอาศัยความเข้าใจหลักการทำงานเอาครับ แล้วก็เอา code ที่คนอื่นเขียนมารวมๆกันเอาครับ
ส่วน code orderselect ด้านบน admin ที่นี่เป็นคนเขียนไว้ครับ ผมค้นเจอแล้วจับมารวมๆกันครับ
ส่วน code ตัวอย่างที่ท่าน D_Diamond เขียนทิ้งไว้ให้ ผมขอไปทำความเข้าใจก่อนนะครับ ได้เรื่องยังไงจะกลับมาบอกครับ
ขอบคุณครับ
-
ผมลองเอาไปแปะแบบนี้ก่อน แล้วจะเขียนคำสั่งให้หยุดเทรดเพื่อรอไปเทรดครั้งต่อไปยังไงหรอครับ
รบกวนแนะนำด้วยครับ
ขอบคุณครับ
/////////////////////////////////////////////////////////////////
extern double Lots=0.5;
extern double StartHours = 15;
extern double EndHours = 17;
int start()
{
int total=OrdersTotal();
if(total==0)
if ((Hour()>StartHours)&&(Hour()<EndHours))
double closeprice;
closeprice=iClose( NULL,0,1);
{
OrderSend(Symbol(), OP_BUYSTOP, Lots, closeprice+200*Point, 3, closeprice, closeprice+400*Point, "ea", 4321, CurTime()+PERIOD_H1*60, Green);
OrderSend(Symbol(), OP_SELLSTOP, Lots, closeprice-200*Point, 3, closeprice, closeprice-400*Point, "ea", 1234, CurTime()+PERIOD_H1*60, Pink);
}
if(total==2)
{ int buy ,sell;
for(int i=0;i<total;i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY)
{ buy=buy+1;
}
if(OrderType()==OP_SELL)
{
sell=sell+1;
}
}
if(buy==1 || sell==1)
{
for( i=0;i<total;i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUYSTOP)
{ OrderDelete( OrderTicket());
}
if(OrderType()==OP_SELLSTOP)
{
OrderDelete( OrderTicket());
}
}
}
}
{
int type;
int count=0;
int total2 = OrdersHistoryTotal();
for (int po = total2-1; po >=0; po--)
{
OrderSelect( po, SELECT_BY_POS, MODE_HISTORY );
if (OrderSymbol() == Symbol() )
{
if ( OrderType()== type )
{
if ( OrderType()== OP_BUY )
{
if ( iBarShift(Symbol(),PERIOD_H1,OrderCloseTime()) == 0 )
{
count++;
}
}
else if ( OrderType()== OP_SELL )
{
if ( iBarShift(Symbol(),PERIOD_H1,OrderCloseTime()) == 0 )
{
count++;
}
}
}
}
}
return(count);
}
}
-
มันคงไม่หยุดเทรด เพราะท่านยังไม่ได้เอา count ไปใช้ตรงไหนเลยครับ
โพสก่อนผมบอกให้ท่านเอา count ไปใช้
วิธีใช้ก็ เอาไปดักไว้ก่อนเปิดออเดอร์ ถ้า count > 0 ไม่ต้องเปิด ถ้า count = 0 จึงเปิด
ส่วนที่ถามว่าจะรอเทรดครั้งต่อไปได้ยังไง
จากที่ผมบอกไปแล้วว่า count จะมากกว่า 0 ถ้ามีออเดอร์ที่ปิดไปก่อนนี้ ปิดในกราฟแท่งเดียวกัน
ดังนั้น พอกราฟเดินต่อไป มันจะเป็นคนละแท่งกัน count มันก็กลายเป็น 0 เอง แล้วมันก็จะเทรดต่อเองครับ
จากคำสั่งนี้ iBarShift(Symbol(),PERIOD_H1,OrderCloseTime())
หมายความว่าให้มันตรวจสอบ หาแท่งกราฟ 1H ว่าผ่านไปแล้วกี่แท่ง เทียบจากเวลาปิดออเดอร์
-
มันคงไม่หยุดเทรด เพราะท่านยังไม่ได้เอา count ไปใช้ตรงไหนเลยครับ
โพสก่อนผมบอกให้ท่านเอา count ไปใช้
วิธีใช้ก็ เอาไปดักไว้ก่อนเปิดออเดอร์ ถ้า count > 0 ไม่ต้องเปิด ถ้า count = 0 จึงเปิด
ส่วนที่ถามว่าจะรอเทรดครั้งต่อไปได้ยังไง
จากที่ผมบอกไปแล้วว่า count จะมากกว่า 0 ถ้ามีออเดอร์ที่ปิดไปก่อนนี้ ปิดในกราฟแท่งเดียวกัน
ดังนั้น พอกราฟเดินต่อไป มันจะเป็นคนละแท่งกัน count มันก็กลายเป็น 0 เอง แล้วมันก็จะเทรดต่อเองครับ
จากคำสั่งนี้ iBarShift(Symbol(),PERIOD_H1,OrderCloseTime())
หมายความว่าให้มันตรวจสอบ หาแท่งกราฟ 1H ว่าผ่านไปแล้วกี่แท่ง เทียบจากเวลาปิดออเดอร์
ขอบคุณครับ