EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: chartwat on พฤษภาคม 21, 2014, 03:20:27 pm
-
ผมเขียน ea เปิด oder หลาย ๆ ตัว ดังนี้ครับ
Buy GBP/USD
1 เปิดที่ 1.68861
2 เปิดที่ 1.68825
3 เปิดที่ 1.68800
ใช้คำสั่ง
xbuy=((Bid-OrderOpenPrice( ))*100000 ); // ค่าที่ได้จะเท่ากับ pip พอดี
มันก็รับค่ามาจากการเปิด order ครั้งสุดท้ายนะครับ แต่ หาก oder ที่ 3 ปิดไปโดย TP ค่าที่อ่านได้ก็ยังคงเป็นของ oder ที่ 3 อีกทั้ง ๆ ที่ oder ที่ 3 เราปิดไปแล้ว
จริง ๆ ต้องการให้อ่าน oder ที 2 แทน ( ความหมายคือ oder สุดท้ายที่เปิดอยู่นะครับ ผมต้องทำยังไงครับ )
-
ตรงคำสั่ง orderselect คุณเขียนยังไงครับ
-
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*TrailingStop,Ask+Point*TakeProfit,"chart EA",magic,0,Green);
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
-
เพราะมันค้นหาค่าจาก ticket ไงครับไม่ได้ค้นหาจากตำแหน่ง order คุณต้องใช้แบบนี้
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
ข้างบนคือในกรณีที่เปิดแค่คู่เงินเดียวนะครับถ้ามีหลายคู่เงินต้องใช้ magic number มาสร้างเงื่อนไขมานับจำนวน Order ของแต่ละคู่เงินก่อนอีกหนะครับ
-
ขอบคุณครับ
-
Admin ครับ รบกวนดูให้หน่อบครับ ใช้งานได้แล้ว ครับ ผมรับค่ามากจากอินดิเคเตอร์ เรียบร้อย เปิดได้ปกติ ปิดก็ได้ครับ เป็นไปตามเงื่อนไข แต่ต้องการเพิ่มเติม
คือ ให้เปิด oder เพิ่มหาก oder ที่เปิด ติด ลบ นะครับ ทำไงก็ เอ๋อ เหรอ ครับ
อยากให้เป็นอย่างนี่นะครับ
หาก oder 1 ที่เปิดเป็น -30 ให้เปิด oder ที่ 2 ครับ
หาก oder 2 ที่เปิดเป็น -30 ให้เปิด oder ที่ 3 ครับ
ไล่ไปแบบนี้นะครับ อันนี้ที่ผมเขียนบ้าง copy มาบ้างนะครับ
========================
extern double lotsize=0.01;
extern double TakeProfit=300;
extern int Ans = 0;
int start()
{
double xbuy=0;
double xsell=0;
int abuy=0;
int asell=0;
//===========read indicator ======;
double b0;
b0=iCustom(NULL,0,"12",0,0);
Print("Buffer 0 : ",b0);// signal sell;
double b1;
b1=iCustom(NULL,0,"12",1,0);
Print("Buffer 1 : ",b1);// signal buy;
if(b0>0)
{
Ans=-1;
Comment(" Sell ");
}
if(b1>0)
{
Ans=1;
Comment(" Buy ");
}
//=====================open ticket=======================;
int ticket;
if(OrdersTotal()==0)
{
if(Ans>0)
{
ticket=OrderSend(Symbol(),OP_BUY,lotsize,Ask,10,Ask-500*Point,Ask+Point*TakeProfit,"chart test",0,0,Yellow);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
Sleep(500);
return(0);
}
if(Ans<0)
{
ticket=OrderSend(Symbol(),OP_SELL,lotsize,Bid,10,Bid+500*Point,Bid-Point*TakeProfit,"chart test",0,0,Aqua);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
Sleep(500);
return(0);
}
}
//================= close Ticket =======================;
double total=OrdersTotal();
int i;
int Pos;
bool Result;
//----close buy ----
if((total>0)&&(Ans<0))
{for(i=total-1; i>=0; i--)
{if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{Pos=OrderType();
if(Pos==OP_BUY || Pos==OP_SELL)
{if(Pos==OP_BUY)
Result=OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
}
}
}
}
//----close sell ------
if((total>0) && (Ans>0))
{for(i=total-1; i>=0; i--)
{if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{Pos=OrderType();
if(Pos==OP_BUY || Pos==OP_SELL)
{if(Pos==OP_SELL)
Result=OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
}
}
//============== add open ??? ============;
Print(Ans," oder= ",OrderOpenPrice()," Ask= ",Ask," Bid= ",Bid," lbuy= ",(Bid-OrderOpenPrice())," lSell=",(OrderOpenPrice()-Ask));
return(0);
}
-
extern double lotsize=0.01;
extern double TakeProfit=300;
extern int Ans = 0;
int start()
{
double xbuy=0;
double xsell=0;
int abuy=0;
int asell=0;
//===========read indicator ======;
double b0;
b0=iCustom(NULL,0,"12",0,0);
Print("Buffer 0 : ",b0);// signal sell;
double b1;
b1=iCustom(NULL,0,"12",1,0);
Print("Buffer 1 : ",b1);// signal buy;
if(b0>0)
{
Ans=-1;
Comment(" Sell ");
}
if(b1>0)
{
Ans=1;
Comment(" Buy ");
}
//=====================open ticket=======================;
int ticket;
if(OrdersTotal()==0)
{
if(Ans>0)
{
ticket=OrderSend(Symbol(),OP_BUY,lotsize,Ask,10,Ask-500*Point,Ask+Point*TakeProfit,"chart test",0,0,Yellow);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
Sleep(500);
return(0);
}
if(Ans<0)
{
ticket=OrderSend(Symbol(),OP_SELL,lotsize,Bid,10,Bid+500*Point,Bid-Point*TakeProfit,"chart test",0,0,Aqua);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
Sleep(500);
return(0);
}
}
//================= close Ticket =======================;
double total=OrdersTotal();
int i;
int Pos;
bool Result;
//----close buy ----
if((total>0)&&(Ans<0))
{for(i=total-1; i>=0; i--)
{if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{Pos=OrderType();
if(Pos==OP_BUY || Pos==OP_SELL)
{if(Pos==OP_BUY)
Result=OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
}
}
}
}
//----close sell ------
if((total>0) && (Ans>0))
{for(i=total-1; i>=0; i--)
{if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{Pos=OrderType();
if(Pos==OP_BUY || Pos==OP_SELL)
{if(Pos==OP_SELL)
Result=OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
}
}
//============== add open ฮืม ============;
if(OrdersTotal()> 0)
{
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY)
{ if(Ask-OrderOpenPrice() < Point*30)
{
if(Ans>0)
{
ticket=OrderSend(Symbol(),OP_BUY,lotsize,Ask,10,Ask-500*Point,Ask+Point*TakeProfit,"chart test",0,0,Yellow);
Sleep(500);
return(0);
}
if(Ans<0)
{
ticket=OrderSend(Symbol(),OP_SELL,lotsize,Bid,10,Bid+500*Point,Bid-Point*TakeProfit,"chart test",0,0,Aqua);
Sleep(500);
return(0);
}
}
}
if(OrderType()==OP_SELL)
{ if(OrderOpenPrice()-Bid < Point*30)
{
if(Ans>0)
{
ticket=OrderSend(Symbol(),OP_BUY,lotsize,Ask,10,Ask-500*Point,Ask+Point*TakeProfit,"chart test",0,0,Yellow);
Sleep(500);
return(0);
}
if(Ans<0)
{
ticket=OrderSend(Symbol(),OP_SELL,lotsize,Bid,10,Bid+500*Point,Bid-Point*TakeProfit,"chart test",0,0,Aqua);
Sleep(500);
return(0);
}
}
}
}
return(0);
}
-
ขอบคุณมาก ครับ จะทดสอบดูครับ