พอดีอยากเขียน EA เอาแบบว่า
ครั้งแรก sell หรือ buyก็ได้ tpสัก50, slสัก50
พร้อมเปิดออเดอร์ buy stop และ sell stop ณ จุดtp และจุด sl แต่ที่จุด sl lot จะเท่า 2*lotเดิม
และorderแรกถึงจุด tp ก็ปิด orderฝั่งตรงข้ามครับ
ยกตัวอย่างยากจัง
เช่น sell eu 1.4000, lot=0.1, tp 1.3950, sl 1.4050,
buy stop 1.4050, lot=0.2, tp 1.4100, sl 1.4000
sell stop 1.3950, lot=0.1 , tp 1.3900, sl 1.4000
--ถ้าราคาไหลมาฝั่ง ทำกำไรก็ (ตอนนี้ sell stop ที่ตั้งครั้งแรกทำงานแล้ว)
ลบ buy stop ทิ้ง และเปิด buy stop ที่ราคา 1.4000 lot=0.2 (จริงๆน่าจะเป็นการโมดิฟาย ราคาเฉยๆ)
และเปิดออเดอร์ sell stop, lot=0.1
buy stop 1.4000, lot=0.2, tp 1.4050, sl 1.3950
sell stop 1.3900, lot=0.1 , tp 1.3850, sl 1.3950
--ถ้าราคาไหลมาฝั่ง ขาดทุนก็ (ตอนนี้ buy stop ที่ตั้งครั้งแรกทำงานแล้ว)
ลบ sell stop ทิ้ง และเปิด sell stop ที่ราคา 1.4000 lot=0.4
และเปิด ออเดอร์ buy stop, lot=0.1
buy stop 1.4100, lot=0.1, tp 1.4150, sl 1.4050
sell stop 1.4000, lot=0.4 , tp 1.3950, sl 1.4050
งง นิดหน่อย ขอบคุณล่วงหน้านะครับ
int total; //กำหนดตัวแปร total เอาไวเก็บค่าจำนวน order ทั้งหมด
int ticket; // กำหนดตัวแปรไวเก็บค่า id ของ order
total=OrdersTotal(); ตรวจสอบจำนวน order ที่เปิดทั้งหมด
if(total ==0) // หากพบว่า order ที่เปิดเท่ากับ 0 ให้ทำการเปิด 3 order ตาม logic ที่คุณบอกมา
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,0.2,Bid+Point*50,3,Bid,Bid+Point*100,"test",777,0,Green); // เปิด Buystop order
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Point*50,Bid-Point*50,"test",777,0,Red); // เปิด sell order
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
ticket=OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-Point*50,3,Bid,Bid-Point*100,"test",777,0,Red); // เปิด sellstop order
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
}
int buystop=0; // ตัวแปรเก็บค่าเอาไวเก็บ จำนวน buystop order
int sellstop=0; // ตัวแปรเก็บค่าเอาไวเก็บ จำนวน sellstop order
if(total==2) // ถ้าจำนวน order ทั้งหมดเหลือ 2 หมายความเกิดการ take profit หรือไม่ก็ stop loss ต้องทำการตรวจสอบว่าเกิดอย่างไหน
{
for(int i=0 ;i<total;i++) // ตรวจสอบโดยดูว่าเลือก order ประเภทไหนมั้งใน account เรา
{ OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUYSTOP)
{
buystop=buystop+1; // ถ้าตรวเจอ buystop ก็ให้เพิ่มค่าตัวแปร buystop ไป 1
}
if(OrderType()==OP_SELLSTOP)
{
sellstop=sellstop+1; // ถ้าตรวเจอ sellstop ก็ให้เพิ่มค่าตัวแปร sellstop ไป 1
}
}
if((sellstop ==0 )&& (buystop==1)) // ถ้าเหลือ buystop เท่ากับ 1 แล้วsellstop เป็น 0 ตามที่คูณว่ามาคือเกิดการ takeprofit
{
for( i=0 ;i<total;i++)
{ OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUYSTOP)
{
OrderModify(OrderTicket(),Bid+Point*50,Bid,Bid+Point*100,0,Green); // แก้ไขorder ตามที่คุณบอก
}
}
ticket=OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-Point*50,3,Bid,Bid-Point*100,"test",777,0,Red); // เปิด sellstop ตามที่คุณบอก
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
Sleep(10000); // ตัวนี้ถ้าเกิดทดสอบโดย demo จะเป็นตัวหน่วงเวลารอ server ตอบรับการชื้อขายของเรา ใน backtest จะไม่ทำงาน
return (0); // สั่งจบโปรแกรมเริ่มต้นทำงานใหม่
}
if((sellstop ==1 )&& (buystop==0)) // หากเหลือ sellstop 1 buystop =0 ก็คือเกิดการ stoploss ตามที่คุณคิดไว
{
for( i=0 ;i<total;i++)
{ OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_SELLSTOP)
{
OrderDelete(OrderTicket()); //ทำการ delete sellstop ตามที่คุณบอก
}
}
ticket=OrderSend(Symbol(),OP_BUYSTOP,0.1,Bid+Point*50,3,Bid,Bid+Point*100,"test",777,0,Green); // เปิด buystop ตามที่บอกมา
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
ticket=OrderSend(Symbol(),OP_SELLSTOP,0.4,Bid-Point*50,3,Bid,Bid-Point*100,"test",777,0,Red); // เปิด sellstop ตามที่บอกมา
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
Sleep(10000);
return (0);
}
}
เอา code ไปลอง run ดูครับถ้ามีไรผิดพลาดก็โพสแจ้งในบรอด์นี้นะครับ