กองทุน SPDR GOLD SHARES
ถือทองก่อนหน้า
ถือทองล่าสุด
0.00
*หน่วยตัน / ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
สถิติกองทุน SPDR
ราคาทองคำแท่ง 96.5%
ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
ครั้งที่
ราคาก่อนหน้า
ราคาล่าสุด
0
(หน่วย บาท*) / อัปเดตล่าสุดเมื่อวันที่ 13 ก.ค. 2566 เวลา 13:04 น.
สถิติราคาทองคำ ไทย

การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 4 การเขียนคำสั่งที่เกี่ยวกับ Order ของ EA Forex

  • 13 replies
  • 23,065 views
*

iRuler

  • 1,282
   การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 4 การเขียนคำสั่งที่เกี่ยวกับ Order ของ EA Forex

การเขียนคำสั่งเกี่ยวกับ order ของ EA Forex มีสองกลุ่มนะครับ คือ instance order มี sell และ buy เป็น order ที่เราต้องการเปิด sell หรือ buy ณ ราคาปัจจุบันนะครับ ส่วน pending order มี sell stop, sell limit, buy stop และ buy limit
รายละเอียดเรื่อง order นี่ผมไม่พูดถึงแล้วนะครับ เพราะถือเป็นพื้นฐานเลยในวงการ forex เรามาดูคำสั่งที่ใช้เปิด order กันเลยนะครับนั่นก็คือ OrderSend() นั่นเอง โดยรูปแบบคำสั่งจะเป็นแบบนี้:

โค๊ด [Select]
int  OrderSend(
   string   symbol,              // symbol
   int      cmd,                 // operation
   double   volume,              // volume
   double   price,               // price
   int      slippage,            // slippage
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // comment
   int      magic=0,             // magic number
   datetime expiration=0,        // pending order expiration
   color    arrow_color=clrNONE  // color
   );
ตัวอย่างการเรียกใช้คำสั่งนะครับ สมมติว่าเราต้องการเปิด buy ที่คู่เงิน EURUSD ที่ราคาปัจจุบัน ขนาด 0.5 ล็อต slippage 5 และไม่ระบุ stoploss ไม่ระบุ takeprofit จะได้แบบนี้
โค๊ด [Select]
int ticket=OrderSend("EURUSD",OP_BUY,0.5,Ask,5,0,0,"Test buy order",1234,0,clrBlue);

   if(ticket>0)
     {
      int factor=1;
      if(Digits==5 || Digits==3)
         factor=10;

      double TP = 100*Point*factor;
      double SL = 50*Point*factor;

      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-SL,Ask+TP,0,clrNONE))
           {
            Print("OrderTicket#",OrderTicket(),", has been modified succesfully!");
           }
         else
           {
            Print("Warnning! OrderTicket#",OrderTicket()," Cannot set TakeProfit and StopLoss");
           }
        }
      else
        {
         Print("Warnning! OrderTicket#",ticket," Cannot set TakeProfit and StopLoss");
        }
     }
   else
     {
      Print("Cannot open order!",GetLastError());
     }
คำสั่ง OrderSend จะคืนค่ากลับมาเป็นหมายเลข ticket ในกรณีที่เปิด order สำเร็จนะครับ แต่ถ้าเปิด order ไม่สำเร็จจะคือค่ากลับมาเป็น -1 ครับ โดยเราสามารถใช้ GetLastError() เพือระบุสาเหตุจริงๆ อีกทีว่าทำไมถึงเปิดไม่สำเร็จครับ
และเราก็สามารถตรวจสอบได้ครับว่าเราเปิด order สำเร็จหรือไม่
ผมอธิบายเพิ่มเติมโค้ดข้างบนนะครับ
ถ้า EA ของเรารันอยู่บนโบรคเกอร์ 5 จุด (หรือ 3 จุด เช่น USD/JPY) ตัวแปร factor จะมีค่าเป็น 10 นอกเหนือจากนั้นให้ factor มีค่าเป็น 1 แทน โดยที่ตัวแปร factor นี้ผมจะเอามาใช้ในการคำนวณราคา takeprofit และ stoploss นะครับ
เหตุที่ผมทำแบบนี้เพราะว่าผมต้องการให้เวลากำหนด tp หรือ sl เราจะได้ระบุเป็น pip เสมอครับ คือถ้าผมไม่ทำแบบนี้เวลาเราอยากตั้ง tp 100pip ถ้าเรารันโบรค 5 จุด แทนที่เราจะป้อน 100 เราต้องป้อน 1000 แทนไงครับ
ส่วน Point เป็นจุดทศนิยมของโบรคครับ ถ้าโบรค 5 จุด ตัวแปร Point จะมีค่า 0.00001 ดังนั้นจังได้แบบนี้

TP = 100*Point*factor
ถ้าโบรค 5 จุด จะได้ 100*0.00001*10 = 0.01000
ถ้าโบรค 4 จุด จะได้ 100*0.0001*1     = 0.0100

จะเห็นว่าได้ค่าเท่ากันเลยครับ

ลืมบอกไปครับว่าคำสั่ง OrderSend ผมถึงไม่ใส่ stoploss และ takeprofit ครับ เพราะว่าให้รองรับ account ประเภท ECN ด้วยครับ เพราะบางโบรคเกอร์ จะไม่ยอมให้เราส่ง sl และ tp ไปพร้อมกับการเปิด order ครับ
ผมเลยส่งคำสั่งไปก่อน ถ้าเปิดสำเร็จแล้วค่อยมาตั้ง tp กับ sl อีกทีโดยใช้คำสั่ง OrderModify() ครับ
ซึ่งก่อนจะไปถึงคำสั่ง OrderModify() ผมขออธิบายคำสั่ง OrderSelect() ก่อนนะครับ คือใน mt4 ถ้าเราต้องการเล่นกับ order ไหนเราต้องบอกให้ mt4 ดึงค่าต่างๆ ของ order นั้นขึ้นมาให้เราก่อนนั่นเองครับ
โดยเรามีวิธีเลือกได้ 2 แบบครับ คือระบุหมายเลข ticket หรือระบุ ลำดับของ order ครับ ในโค้ดข้างบน เราได้หมายเลข ticket จากคำสั่ง OrderSend() มาแล้ว ดังนั้นการเรียกใช้จึงเป็นแบบนี้
โค๊ด [Select]
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
สั้นๆ ง่ายๆ แต่ถ้าอยากอ่านเพิ่มเติมก็ตามไปอ่านได้
ที่นี่ ครับ

คำสั่ง OrderModify()
เราจะเอาไว้แก้ไข order นะครับ จากตัวอย่างโค้ดข้างบน ผมใช้คำสั่งนี้แก้ไข tp และ sl ให้เป็น 100 และ 50 ตามลำดับนะครับ ในกรณีนี้เราทำการแก้ไข order ที่เปิดไปแล้วดังนั้นเราจะแก้ไขได้เฉพาะ
tp และ sl นะครับ แต่ถ้าเป็น order ประเภท pending เราสารมาถแก้ไข ราคาเปิด และ เวลาหมดอายุ ได้อีกด้วยครับ ตัวอย่างเช่นต้องการตั้งแก้ไข pending order ให้ไปรอเปิดที่ราคา 1.5450 sl 1.5400 และ tp 1.5600:
โค๊ด [Select]
OrderModify(OrderTicket(),1.5450,1.5400,1.5600,0,clrNONE)

คำสั่ง OrderModify() กับการทำ Trailing Stop
Let Profit Run หลายคนคงเคยได้ยินประโยคนี้มาแล้วแน่ๆ เรามาปลด จุด takeprofit แล้วเลื่อนจุด stoploss วิ่งตามราคาดีกว่า
การทำ trailing stop เราจะกำหนดระยะห่างจากราคาปัจจุบัน และ ราคาของจุด stoploss ก็พูดง่ายๆ มันก็คือจุด stoploss นั่นแหละครับ และระยะ step คือผมไม่รู้จะอธิบายยังไงดี เอาเป็นว่าไปดูรูปประกอบดีกว่า น่าจะทำให้เข้าใจมากขึ้นนะครับ
สมมติว่าเราเปิด order buy ตามรูปที่ 1 แล้วตั้งให้ trailing ที่ 60pips โดย trailling ทีละ 10 pips นะครับ ซึ่งในช่วงที่ราคาตลอดห่างจากราคาเปิดยังไม่ถึง 70pips (trailing+trailing step; 60+10) เราจะยังไม่ทำอะไร เราจะรอจนกว่า ระยะห่างที่ว่านี้
เกิน 70pips ก่อน

และในเวลาต่อมา ราคาวิ่งขึ้นไป ห่างจากราคาเปิดมากกว่า 70pips ตามรูปที่ 2 นะครับ ตอนนี้เราจะแก้ไข จุด stoploss ของเรา ให้ห่างจากราคาตลาด 60pips ครับ ก็จะได้ตามรูปที่ 3
ขึ้นตอนการ trailing ที่บอกนี้เป็นการ trailing ครั้งแรกหลังจากเปิด order นะครับ โดยผมจะเทียบ ราคาตลาดกับ ราคาเปิดของ order ครับ หลังจาก trailing ครั้งแรกแล้ว แทนที่ผมจะเทียบกับ ราคาเปิด
ผมจะเทียบกับ stoploss ปัจจุบันแทนครับ เพราะในตอนแรกหลังจากเปิด order เสร็จ เรายังไม่รู้ว่าราคาตลาดจะวิ่งไปในทิศทางที่เราคาดไว้หรือเปล่า ถ้าหากเราเริ่ม trailing เลยเนี้ย มันจะกลายเป็นการลดระยะ sl ของ order แทนครับ กลายเป็นลดโอกาส win ไปซะอย่างนั้น


รูปที่ 4 การ trailing โดยเทียบกับ StopLoss ปัจจุบันของ Order


ในการจัดการ order หลายๆ order เราจะใช้ loop มาช่วยนะครับ เราจะตรวจสอบ ticket ทีละตัวๆ ว่าตรงกับคู่เงินที่ ea ของเราทำงานอยู่หรือไม่ โดยคำสั่ง OrdersTotal() จะเป็นตัวบอกจำนวน order ทั้งหมดใน account ของเรานะครับ
ตัวอย่างข้างล่างคือโค้ดในการแสดงรายละเอียดเบื้องต้นของ order แต่ละ order นะครับ คำสั่ง OrderMagicNumber() คือตัวเลขที่เราใส่ไปในคำสั่ง OrderSend() ตอนเปิด order นั่นเองครับ



ผลลัพธ์ที่ได้ในหน้า Expert:

เรานำโค้ดข้างบนนี้มาแก้ไขให้ปิด order ที่เปิดอยู่ และลบ order ที่ pending ไว้
ในการปิด order ที่เปิดอยู่นั้น เราต้องเช็คก่อนว่า order นั้นเป็น BUY หรือ SELL ถ้าเป็น BUY ต้องใช้ราคา Bid ในการปิด order แต่ถ้าเป็น SELL เราต้องใช้ราคา Ask


ทีนี้เราก็สามารถจัดการ order ต่างๆ ในมือกันได้แล้วนะครับ การเขียนคำสั่งที่เกี่ยวกับ Order ของ EA Forex จำไว้อย่างหนึ่งว่าถ้าเรารันอีเอตัวเดียวกัน คู่เงินเหมือนกัน แต่อยู่คนละกราฟ เราต้องเปลี่ยน MagicNumber ให้ต่างกันด้วยนะครับ

หัวข้อที่เกี่ยวข้องกับการเขียน EA Forex

การเขียน EA Forex บทที่ 1 : การเขียนEA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 1 ปูพื้นฐานกันก่อน Forex EAตัวแรก

การเขียน EA Forex บทที่ 2 : การเขียน EA Forex การสร้าง EA นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 2 อ่านค่าจาก Indicator forex

การเขียน EA Forex บทที่ 3 : การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 3 การเขียนคำสั่งพื้นฐานที่เกี่ยวกับ Account

การเขียน EA Forex บทที่ 4 : การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 4 การเขียนคำสั่งที่เกี่ยวกับ Order ของ EA Forex

การเขียน EA Forex บทที่ 5 :การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 5 การเขียน EA forex เพื่อให้การแสดงผลบนกราฟ

การเขียน EA Forex บทที่ 6 : การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 6 สร้าง EA Forex ให้เปิด Order จากเส้น EMA

การเขียน EA Forex บทที่ 7 :การเขียน EA Forex นั้นง่ายใครๆ ก็เขียนได้ - ตอนที่ 7 การทดสอบ Back Test EA Forex 99.00 %

VPS Forex สำหรับ รัน Forex EA :ถ้าจะใช้ VPS forex รัน EA แนะนำที่นี่ครับ SocialVPS.Net ค่า Ping ต่ำและราคาถูกมากครับ

และสุดท้าย Myfxbook :อย่าลืมเอา Port ของท่าน ใส่ ใน Myfxbook เพื่อติดตามผลนะครับ



*

sornsawan

พอดีผมเขียนEa แบบส่งคำสั่งแมนวลออเดอร์ครับแล้วถ้าผมต่องการส่งคำสั่ง Pending แต่อยากจะใส่ราคาที่หน้ากราฟต้องเขียนคำสั่งแบบไหนหรอครับ
พอจะมีวิธีมั้ยครับ รบกวนด้วยครับ
(TH)** (TH)**

*

iRuler

  • 1,282
อ้างจาก: sornsawan ที่ 23, พฤศจิกายน  2017, 11:40:59 PM
พอดีผมเขียนEa แบบส่งคำสั่งแมนวลออเดอร์ครับแล้วถ้าผมต่องการส่งคำสั่ง Pending แต่อยากจะใส่ราคาที่หน้ากราฟต้องเขียนคำสั่งแบบไหนหรอครับ
พอจะมีวิธีมั้ยครับ รบกวนด้วยครับ
(TH)** (TH)**


ลองใช้ CEdit ดูครับ
https://www.mql5.com/en/docs/standardlibrary/controls/cedit
บวกกับปุ่มคลิกเอาก็ได้
https://www.mql5.com/en/docs/standardlibrary/controls/cbutton

*

sornsawan

ขอขอบพระคุณเป็นอย่างสูงครับ
(TH)** (TH)** (TH)**

*

isuccess


*

isuccess

พอจะมีตัวอย่างโค้ดของ คำสั่ง OrderModify() กับการทำ Trailing Stop มั้ยครับ

*

iRuler

  • 1,282
อ้างจาก: isuccess ที่ 28, พฤษภาคม  2018, 06:49:31 PM
พอจะมีตัวอย่างโค้ดของ คำสั่ง OrderModify() กับการทำ Trailing Stop มั้ยครับ

เอาไปดัดแปลงเอานะครับ


*

isuccess

อ้างจาก: iRuler ที่ 28, พฤษภาคม  2018, 07:58:55 PM
อ้างจาก: isuccess ที่ 28, พฤษภาคม  2018, 06:49:31 PM
พอจะมีตัวอย่างโค้ดของ คำสั่ง OrderModify() กับการทำ Trailing Stop มั้ยครับ

เอาไปดัดแปลงเอานะครับ




ขอคุณมากๆเลยครับ
แต่ไม้บาย trailing ทำงานดีครับ ไม้เชล ไม่ยอมทำงาน
ผมลองแนบ file มาให้ดูให้หน่อยครับว่ามันผิดตรงไหน

*

iRuler

  • 1,282
อ้างจาก: isuccess ที่ 28, พฤษภาคม  2018, 09:37:04 PM
อ้างจาก: iRuler ที่ 28, พฤษภาคม  2018, 07:58:55 PM
อ้างจาก: isuccess ที่ 28, พฤษภาคม  2018, 06:49:31 PM
พอจะมีตัวอย่างโค้ดของ คำสั่ง OrderModify() กับการทำ Trailing Stop มั้ยครับ

เอาไปดัดแปลงเอานะครับ




ขอคุณมากๆเลยครับ
แต่ไม้บาย trailing ทำงานดีครับ ไม้เชล ไม่ยอมทำงาน
ผมลองแนบ file มาให้ดูให้หน่อยครับว่ามันผิดตรงไหน


แก้ function init() ให้เป็นแบบนี้ก่อน

โค๊ด [Select]

int OnInit()
  {
      CreateButtons();
      ToolTips_Text("Lot_00000_btn");
      ToolTips_Text("Buy_00000_btn");
      ToolTips_Text("Sell_0000_btn");
      ToolTips_Text("Close_Buy_btn");
      ToolTips_Text("Close_Sel_btn");
      ToolTips_Text("Close_All_btn");
      ToolTips_Text("Stop Trade_btn");
      ToolTips_Text("Start Trade_btn");
      ToolTips_Text("Tp Refresh_btn");

      ObjectCreate("Lot_Edit",OBJ_EDIT,ChartWindowFind(),0,0);
      ObjectSet("Lot_Edit",OBJPROP_CORNER,Corner);
      ObjectSet("Lot_Edit",OBJPROP_XSIZE,Button_Width-040);
      ObjectSet("Lot_Edit",OBJPROP_YSIZE,Font_Size*2.8);
      ObjectSet("Lot_Edit",OBJPROP_XDISTANCE,075);
      ObjectSet("Lot_Edit",OBJPROP_YDISTANCE,030);
      ObjectSetText("Lot_Edit","0.01",13,Font_Type,Font_Color);

      if(Digits==3 || Digits==5)
         factor=10.0;
      else
         factor=1.0;

   return(INIT_SUCCEEDED);
  }

*

isuccess

อ้างจาก: iRuler ที่ 29, พฤษภาคม  2018, 08:33:25 AM
อ้างจาก: isuccess ที่ 28, พฤษภาคม  2018, 09:37:04 PM
อ้างจาก: iRuler ที่ 28, พฤษภาคม  2018, 07:58:55 PM
อ้างจาก: isuccess ที่ 28, พฤษภาคม  2018, 06:49:31 PM
พอจะมีตัวอย่างโค้ดของ คำสั่ง OrderModify() กับการทำ Trailing Stop มั้ยครับ

เอาไปดัดแปลงเอานะครับ




ขอคุณมากๆเลยครับ
แต่ไม้บาย trailing ทำงานดีครับ ไม้เชล ไม่ยอมทำงาน
ผมลองแนบ file มาให้ดูให้หน่อยครับว่ามันผิดตรงไหน


แก้ function init() ให้เป็นแบบนี้ก่อน

โค๊ด [Select]

int OnInit()
  {
      CreateButtons();
      ToolTips_Text("Lot_00000_btn");
      ToolTips_Text("Buy_00000_btn");
      ToolTips_Text("Sell_0000_btn");
      ToolTips_Text("Close_Buy_btn");
      ToolTips_Text("Close_Sel_btn");
      ToolTips_Text("Close_All_btn");
      ToolTips_Text("Stop Trade_btn");
      ToolTips_Text("Start Trade_btn");
      ToolTips_Text("Tp Refresh_btn");

      ObjectCreate("Lot_Edit",OBJ_EDIT,ChartWindowFind(),0,0);
      ObjectSet("Lot_Edit",OBJPROP_CORNER,Corner);
      ObjectSet("Lot_Edit",OBJPROP_XSIZE,Button_Width-040);
      ObjectSet("Lot_Edit",OBJPROP_YSIZE,Font_Size*2.8);
      ObjectSet("Lot_Edit",OBJPROP_XDISTANCE,075);
      ObjectSet("Lot_Edit",OBJPROP_YDISTANCE,030);
      ObjectSetText("Lot_Edit","0.01",13,Font_Type,Font_Color);

      if(Digits==3 || Digits==5)
         factor=10.0;
      else
         factor=1.0;

   return(INIT_SUCCEEDED);
  }





ขอบคุณมากๆครับ แก้แล้ว แต่ยังเป็นเหมือนเดิมครับ

*

iRuler

  • 1,282
ผมดูโค้ดแล้วงงๆ นะครับ ไม่รู้ว่าหลักการทำงานมันเป้นยังไง มีหลายส่วนของโค้ดที่น่าจะเขียนให้กระชับได้กว่านี้นะครับ
ลองปรับๆ ดู บางทีเพราะโค้ดที่ซับซ้อนเกินไปมันอาจทำงานไม่ตรง logic ของเราที่คิดไว้

(TH)**

*

isuccess

อ้างจาก: iRuler ที่ 30, พฤษภาคม  2018, 08:27:31 PM
ผมดูโค้ดแล้วงงๆ นะครับ ไม่รู้ว่าหลักการทำงานมันเป้นยังไง มีหลายส่วนของโค้ดที่น่าจะเขียนให้กระชับได้กว่านี้นะครับ
ลองปรับๆ ดู บางทีเพราะโค้ดที่ซับซ้อนเกินไปมันอาจทำงานไม่ตรง logic ของเราที่คิดไว้

(TH)**

ขอบคุณคร้าบ....ผมก็ลอกๆเขามาแปะๆเอาครับ แฮ่ๆๆๆ