ผมเอา Code มาแปะให้ เพื่อให้เพื่อนๆได้ทำความเข้าใจว่าขั้นตอนในการเขียนมันมีหลักการเช็ค loop ยังไงบ้าง ผมเองตอนหัดเขียนใหม่ๆ ก็เจอปัญหาคือ มันส่ง Order ซ้ำ ลองเอา Code นี้ไปศึกษาดูนะครับ ผมไปเอามาจากตัวอย่างในหนังสือ แล้วพิมพ์หมายเหตุเป็นภาษาไทย เพื่อให้เข้าใจง่ายๆ ลองหัดเขียนแล้วเอาไปปรับใช้กันดูนะครับ
extern double TakeProfit = 250;
extern double Lots = 0.1;
extern double TrailingStop = 35.0;
int Crossed(double line1, double line2) // ไว้เช็ค up / down trend
{
static int last_direction = 0 ; // ค่า direction เริ่มต้น = 0
static int current_direction = 0;
//สร้างเงื่อนไข Cross
// ถ้า line 1 > line 2 ให้ค่า current direction = 1 หมายถึง up
if(line1>line2) current_direction = 1;
if(line1<line2) current_direction = 2; // down
// แก้ค่าตัวแปร ให้ curent = last direction
if(current_direction != last_direction)
{
last_direction = current_direction;
return(last_direction);
}
else
{
return(0);
}
}
//-----------------------------------------------------------------
int start()
{
int cnt,ticket ,total;
double shortEma , longEma;
if(Bars<100)
{
Print("bar Less than 100") ; // bar น้อยกว่า 100 ข้อมูลน้อยไป
}
// set ค่า EMA
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0); //set EMA 8
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
//ใช้ฟังก์ชั่น cross ที่เขียนไว้ก่อนหน้า เพื่อดู trend
int isCrossed = Crossed(shortEma , longEma);
//เช็ค Order ทั้งหมด
total = OrdersTotal();
if(total <1) // ถ้ายังไม่เปิด order
{
if(isCrossed ==1) //ถ้า up
{
//ส่ง Order
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"My EA",0,Green);
if(ticket>0) // ถ้าส่ง order ผ่าน
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))// เลือก order ได้ไหม
Print("Buy Order Opened : ",OrderOpenPrice()); //ถ้าได้ให้ print เลข Order
}
else // ถ้าไม่ได้
Print("error opening Buy");
return(0);
}
if(isCrossed == 2) // ถ้าลง เขียนเหมือน up
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"My EA",12345,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
//-------------------------------------------------------------------------------
// เช้ค Order
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) // ถ้าเป็น Order Buy or Sell
{
if(OrderType()==OP_BUY) // ถ้า Buy เปิดไว้ให้ปิด
{
if(isCrossed == 2) // สัญญา downมา
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // ปิด
return(0); // จบ
}
}
else // go to short position
{
// ถ้าขึ้น
if(isCrossed == 1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // ปิด long
return(0); // จบ
}
}
}
}
return;
}