MQL4 : ส่งรูป Chart ไป Line Notify

Attaphon One
5 min readJun 14, 2020

สวัสดีครับ นานๆ เจอกันครั้งกับการเขียน Expert Advisor ( EA ) วันนี้ขอเสนอวิธีการส่งรูปภาพ Chart ไปที่ LINE Notify คิดว่าบทความนี้น่าจะตอบโจทย์คนที่ใช้ indicator ประหลาดๆ บน MT4 Desktop แล้วขี้เกียจ remote เข้าไปดูใน VPS เลยสั่ง Expert Advisor ส่ง LINE หน้า Chart มาให้ดูหน่อย….

หลักการในการส่งรูปกราฟไปที่ LINE Notify มี 2 Step ง่ายๆ

  1. Capture รูป Chart
  2. ส่งรูป Chart ด้วย cURL

แต่เราต้องเข้าใจการทำงานของ cURL กันก่อน …

cURL คืออะไร

เจ้าโปรแกรม cURL คือเครื่องมือที่เอาไว้รับส่งข้อมูลไปที่ Server ผ่าน protocal ต่างๆได้เช่น FTP, HTTP, HTTPS ใครอยากศึกษาเพิ่มเติม ลองเข้าไปดู link นี้ครับ อธิบายตั้งแต่ติดตั้งถึงการใช้งานเลย

เรามาลองตรวจสอบว่า เครื่องคอมพิวเตอร์ของเรา มันใช้งาน cURL ได้รึเปล่า

  1. เข้าไปที่ CMD ( หน้า command prompt ของ window )
  2. พิมพ์ curl — — version ( ตามรูป )
ตรวจสอบ cURL ในคอมพิวเตอร์ ด้วยคำสั่ง curl — — version

ถ้าได้ผลลัพธ์แสดงเป็น version ของ cURL ดังรูป แสดงว่าเครื่องคอมเราลง cURL ไว้เรียบร้อยแล้ว ขั้นตอนต่อมา เราจะลองใช้ cURL ในการส่งไฟล์รูปในคอมพิวเตอร์ของเรา ไปที่ LINE Notify กัน ด้วยคำสั่ง format แบบนี้

นี่เป็นคำสั่งลองส่งรูปไปที่ LINE Notify โดยเราต้องใส่ Parameter 3 ตัว ตามที่ไฮไลต์สีแดงไว้นะครับ

  1. LINE_TOKEN_KEY : ใส่ Token เพื่อทำ Authentication กับ LINE Notify
  2. MESSAGE_LINE : ใส่ข้อความที่เราจะส่ง LINE ไปพร้อมกับรูป
  3. PICTURE_PATH : ใส่ path ที่อยู่ของรูป ( ดูรูปตัวอย่างข้างล่างครับ )

ส่วนใครที่ยังไม่มี LINE Notify Token ของเข้าไปดูวิธีการขอจาก Link ที่แปะมาให้และอย่าลืมเชิญ bot LINE Notify เข้ากลุ่มด้วยนะ ตามรายละเอียดใน Link นี้

ขอแปะคำสั่งอีกที เปลี่ยนค่าตัวแปรในช่วงที่มีปีกกานะครับ {{ … }}

curl -X POST -H “Authorization: Bearer {{LINE_TOKEN_KEY}}” -F “message={{MESSAGE_LINE}}” -F “imageFile=@{{PICTURE_PATH}}” https://notify-api.line.me/api/notify

รูปตัวอย่าง การส่งรูปไป LINE Notify ด้วยโปรแกรม CMD เราลองเอาคำสั่งมา Run ดู จะได้ response กลับมาว่า {“status”:200,”message”:”ok”} แสดงว่าส่งไปที่ LINE Server สำเร็จ

ลองไปดูที่ LINE ว่ารูปถูกส่งมาจริง ก็จะลุยเขียน Expert Advisor ต่อครับ

Note : หากพบปัญหาว่า รูปไม่ขึ้นที่ LINE นะครับ เช็คตามนี้ครับ

  1. ใส่ LINE Notify Token ถูกต้องรึเปล่า
  2. ใส่ Path ของรูปตาม Format ถูกต้องรึเปล่า (เช่น @/Users/a/Desktop/a.jpg)
  3. เพิ่ม bot LINE Notify เข้าไปในกลุ่ม LINE รึยัง

ถ้าทำขั้นตอนนี้ผ่านแล้ว เรามาดูส่วนการสร้าง Expert Advisor กันต่อได้

วาง cURL ให้ Expert Advisor ใช้งาน

เมื่อผ่านขั้นตอน Verify ส่งรูปด้วย cURL เรียบร้อย เราจะเริ่มมาดูส่วนของ Expert Advisor กัน ซึ่งโครงสร้างการทำงานมีขั้นตอนดังนี้

  1. สั่งให้ Expert Advisor ทำการ Capture หน้า Chart
  2. เรียกใช้ cURL.exe เพื่อส่งรูป Chart ไปที่ Line Notify

ส่วนสำคัญอย่าลืม ! เราต้องไปดาวน์โหลดโปรแกรม cURL แล้วไฟล์นี้ไปวางที่ Common Folder ของ MT4 program เพื่อให้ Expert Advisor ไปเรียกใช้งาน

เข้าไป Download ที่เวปนี้เลย (ใช้ version 32 bit ก็ได้ )

เมื่อ Download เสร็จ ให้เราUnZip ไฟล์ออกมา แล้วคัดลอก curl ทั้ง folder ไปวางไว้ที่โฟลเดอร์ Common ซึ่งอยู่ภายในโฟลเดอร์ที่เราลงโปรแกรม MT4 ครับ

Note : ใครไม่แน่ใจ ว่าโฟลเดอร์ Common อยู่ตรงใหนของคอมพิวเตอร์ของเรา ให้ทำตามขั้นตอนนี้ครับ

1.เข้าไปที่โปรแกรม MT4 เลือกแทป File แล้วเลือก Open Data Folder

2. โปรแกรมจะเปิดหน้าต่างตามรูปขึ้นมา ให้เราไปกดที่ Terminal

3. เราจะเจอโฟลเดอร์ชื่อ Common ให้กดเข้าไปเพื่อวางไฟล์ curl เพื่อใช้งาน

Expert Advisor Code

ให้คัดลอก code นี้ไปสร้าง EA ตัวใหม่ในโปรแกรม MetaEditor เลยครับ

#import "shell32.dll"
int ShellExecuteW(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd);
#import
extern string LineToken = "<<LINE TOKEN>>";
extern string Message = "Send Picture to LINE";
int ScreenWidth = 1366;
int ScreenHeight = 768;
string Path_Picture = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Files\\ssLine.png";
string Path_cURL = TerminalInfoString(TERMINAL_COMMONDATA_PATH)+"\\curl\\bin\\curl.exe";
string FileName = "ssLine.png";
//+----------------------------------------------------------------+
//| Expert initialization function |
//+----------------------------------------------------------------+
int OnInit()
{
CreateButton("BSEND","CAP_PICz",130,30,120,60);
return(INIT_SUCCEEDED);
}
//+----------------------------------------------------------------+
//| Expert deinitialization function |
//+----------------------------------------------------------------+
void OnDeinit(const int reason){}
//+----------------------------------------------------------------+
//| Expert tick function |
//+----------------------------------------------------------------+
void OnTick(){}
//+----------------------------------------------------------------+
//| ChartEvent function |
//+----------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(CHARTEVENT_OBJECT_CLICK && sparam=="BSEND")
{
CapPicSendLine(LineToken,Message,Path_Picture,Path_cURL); Sleep(100);
ObjectSetInteger(0,"BSEND",OBJPROP_STATE,false);
}
}
//+----------------------------------------------------------------+
//| Capture Picture and Send to Line Notify function |
//+----------------------------------------------------------------+
void CapPicSendLine(string token,string message,string p_picture,string path_curl)
{
ChartScreenShot(0,FileName,ScreenWidth,ScreenHeight,ALIGN_RIGHT); string
linebody = " -X POST -H \"Authorization: Bearer " +token+ "\"" ;
linebody+= " -F \"message=" + message + "\"" ;
linebody+= " -F \"imageFile=@"+ p_picture + "\"" ;
linebody+= " https://notify-api.line.me/api/notify" ;
ShellExecuteW(NULL,"Open",path_curl,linebody,NULL,NULL);
}
//+---------------------------------------------------------------+
//| Create Button function |
//+---------------------------------------------------------------+
void CreateButton(string objname,string message,int x,int y,int xsize,int ysize)
{
ObjectCreate(0,objname,OBJ_BUTTON,0,0,0);
ObjectSetInteger(0,objname,OBJPROP_CORNER,1);
ObjectSetInteger(0,objname,OBJPROP_XDISTANCE,x);
ObjectSetInteger(0,objname,OBJPROP_YDISTANCE,y);
ObjectSetInteger(0,objname,OBJPROP_XSIZE,xsize);
ObjectSetInteger(0,objname,OBJPROP_YSIZE,ysize);
ObjectSetString(0,objname,OBJPROP_TEXT,message);
}

อธิบายการทำงานของ code นะครับ

  1. เรา import shell32.dll เข้ามาใน EA เพื่อเรียกใช้ ShellExecuteW() ซึ่งเป็นฟังก์ชั่นที่เรียกเปิด cURL.exe มาใช้งานใน EA เราได้
  2. สร้างตัวแปรมาไว้เก็บค่า LINE Token , message ส่ง Line ส่วนนี้สามารถปรับค่าเป็นของตัวเองได้
  3. ใน OnInit() เราสั่งให้ EA สร้างปุ่ม Button ขี้นมาปุ่มหนึ่ง เอาไว้กดเรียกใช้ฟังก์ชั่นที่จะส่ง LINE ในขั้นตอนต่อไป
  4. ใน CapPicSendLine() เราสั่งให้ EA save รูปหน้า Chart ด้วยคำสั่ง ChartScreenShot() ชื่อรูป ssLine.png จากนั้น จึงเรียกใช้ฟังก์ชั่น ShellExecuteW() เพื่อเรียก cURL.exe มารันคำสั่ง เพื่อส่งข้อความและรูปไปยัง LINE Notify
  5. วางฟังก์ชัน CapPicSendLine() ไว้ใน OnChartEvent() เพื่อที่เวลากดปุ่มก็จะส่งรูปไปที่ LINE ทุกครั้ง

หลังจาก Compile code เสร็จ Expert Advisor พร้อมใช้งานแล้ว อย่าลืมไปตั้งค่า Options ในโปรแกรม MT4 ให้สามารถส่งข้อมูลไปยัง Line Notify ตามรูปนี้ครับ

สำคัญ *** ต้อง Add https://notify-api.line.me/api/notify เข้าไปใน WebRequest list ด้วยนะครับ ไม่งั้นจะส่งรูปไป LINE ไม่ได้

ลองเอา Expert Advisor ไปใช้งาน

เมื่อเราเอา Expert Advisor มาวางบนกราฟคู่เงินสักตัว จะมีปุ่มที่ชื่อ CAP_PICz เกิดขึ้นอยู่ด้านขวาบนของหน้ากราฟ เราทดสอบโดยการกดปุ่มนั้นครับ แล้วรูปหน้ากราฟจะส่งไปที่กลุ่ม Line ที่เราตั้ง bot LINE NOTIFY ไว้

ผลลัพธ์ ลองมาดูในไลน์ครับ

จากตัวอย่าง Expert Advisor นี้ ท่านผู้อ่านสามารถเขียน Condition เพิ่มเติม แล้วเรียกฟังก์ชัน CapPicSendLine() เพื่อส่ง Line ตามเงื่อนไขต่างๆ ตามการออกแบบของท่านเอง

สุดท้ายนี้…ขอขอบคุณความรู้จากกลุ่ม [MQL Cafe Thailand สอนเขียน EA ฟรี] ที่เป็นต้นทางความรู้ที่นำมาเขียนบทความนี้ครับ

--

--