Function OrderSelect()
โครงสร้าง
bool OrderSelect(int index, int select , int pool=MODE_TRADES)
int select คือ เราพูดถึง select ก่อน index เพราะค่า index มันขึ้นอยู่กับการเลือก select ซึ่งค่า select สามารถเลือกได้ 2 ค่า คือ
SELECT_BY_POS หมายถึง Order Number จะถูก return ค่าออกไป ในค่า Parameter index
SELECT_BY_TICKET หมายถึง ค่า ticket number จะถูก return ค่าออกไป
int index คือ ค่าซึ่งถูก return ค่าออกมาจากการเลือก select
pool คือ ข้อมูลที่เราต้องการจะเลือกเอามาจากชุดข้อมูลไหน ซึ่งมันขึ้นอยู่กับการเลือก select
ตัวแปร pool จะถูกใช้เมื่อ เราเลือก select เป็น SELECT_BY_POS
ตัวแปร pool จะไม่ถูกใช้หากเลือก select เป็น SELECT_BY_TICKET
ตัวแปร pool เลือกได้ 2 ค่า คือ
MODE_TRADES หมายถึง เลือก Order ที่เป็น open หรือ pending position
MODE_HISTORY หมายถึง Order ที่ปิดไปแล้ว หรือ Order ที่ลบไปแล้ว ที่เกิดขึ้นในอดีต
ก่อนจะเขียนโปรแกรมทั้งหมดมาทำความเข้าใจโครงสร้างแต่ละส่วนกันก่อน
for(int i = 1 ; i<= OrdersTotal(); i++)
{
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
//
//
}
}
จากบล็อคด้านบน เป็นวิธีการเลือก Order ครับ ซึ่งเขียนอยู่ในลูป For โดยเลือก Order ทั้งหมดผ่าน OrderTotal จากนั้นค่อยกรองเอาแต่ Order ที่ยังเปิดอยู่เท่านั้นผ่านเงื่อนไข if ซึ่งเมื้่อกรอง Order มาได้แล้วก็ขึ้นอยู่กับว่าเราต้องการจะเอาไปทำอะไรต่อ
ด้านล่างนี้เป็น Code ที่เอามาจากตัวอย่าง ในหนังสือ
int start() //
{
string Symb=Symbol(); // symbol
double Dist=1000000.0; // กำหนดระยะ
int Real_Order=-1; // -1 คือ Order ที่ไม่ใช่ market order
double Win_Price=WindowPriceOnDropped(); // หากลากไปที่ราคาไหน เก็บราคาไว้ในตัวแปร Win price
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // ดึงข้อมูลทั้งหมด
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // เลือกเฉพาะ Order ที่เปิดอยู่
{ //
//------------------------------------------------------ 3 --
if (OrderSymbol()!= Symb) continue; // ถ้า order ที่เปิดไม่ตรงกับ Symbol ของกราฟ ให้ข้ามไป
int Tip=OrderType(); //ดึงค่า Ordertype ใส่ใน Tip
if (Tip>1) continue; // ถ้า Tip > 1 แสดงว่าเป้น pending order ให้ข้ามไปดู order ใหม่
//------------------------------------------------------ 4 --
double Price=OrderOpenPrice(); // เก็บค่าราคาลงไปในตัวแปร Price
if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)< NormalizeDouble(Dist,Digits))// เงื่อนไข ถ้าราคาเปิด - ราคาที่เราเอาเมาส์ลาก script ไปวาง แล้วน้อยกว่า Dist
{
Dist=MathAbs(Price-Win_Price); //ให้กำหนดค่า dist ใหม่ = ค่าบวกของ Price - win_Price
Real_Order=Tip; // กำหนดค่า real_orde = Tip
int Ticket=OrderTicket(); // ดึงค่า OrderTicket มาใส่ใสนตัวแปร Ticket
double Lot=OrderLots(); // ดึงค่า จำนวน Lot มาใส่ใน Lot
}
//------------------------------------------------------ 5 --
} //จบเงื่อนไข If
} // จบ loop .
//--------------------------------------------------------------- 6 --
while(true) // ถ้าเป็นจริงให้ทำต่อไป
{
if (Real_Order==-1) // ถ้า real_Order = - 1
{
Alert("For ",Symb,"no market order aviable");
break; //
}
//--------------------------------------------------------- 7 --
switch(Real_Order) //By order type ใช้คำสั่ง switch ดูทางเลือก
{
case 0: double Price_Cls=Bid; // หาก Real_Order =0 ให้ดึงค่า Bid ใส่ตัวแปร Price_Cls
string Text="Buy "; // กำหนดค่า "Buy" เก็บไว้ในตัวแปร Text
break; // ออกจาก switch
case 1: Price_Cls=Ask; // หากเป็น 1 ดึงค่า Ask มาเก็บใน Price_Cls
Text="Sell "; // กำหนดค่า "Sell" ไว้ใน Text
}
Alert("Attempt to close",Text," ",Ticket,"Awaiting.."); // แจ้ง alert ว่ากำลังจะปิด Order
bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);//ส่งคำสั่งปิด Order ตามค่าตัวแปรที่เราเขียนโปรแกรม ถ้าปิดได้ จะ return true
//--------------------------------------------------------- 8 --
if (Ans==true) // หากปิดได้
{
Alert ("close order ",Text," ",Ticket);
break; // แจ้งปิด Order เลขที่
}
//--------------------------------------------------------- 9 --
}
//-------------------------------------------------------------- 10 --
Alert ("The script has finished operations -----------------------------");
return; // จบโปรแกรม
}
//-------------------------------------------------------------- 11 --
ที่มา https://book.mql4.com/trading/orderclose
ลอองไปหัดเขียนแล้วทำความเข้าใจดูนะครับ
ช่วยสอนเขียน คำสั่ง lock account id หน่อยครับ ถ้า account ไม่ตรงตามที่เรา ตั้งค่าไว้ ก็ไม่ให้ทำงานครับ
ตอบลบพอจะบอกคำสั่ง เงื่อนไขการเข้าออเด้อไม่ให้เข้าซ้ำกัน แต่ต่างทามเฟรมได้มั้ยครับ
ตอบลบเช่นถ้าหน้าจอกราฟอยู่ H1 ปกติผมจะใช้ Time[0] มาตัดเศษออก
แต่ถ้าอยู่ต่างทามเฟรมไปไม่เป็นเลยครับ
รบกวนนิดครับ
ขอบคุณครับ