はじめに
MT4からLINEに通知を送る仕組みを作成していきます。
LINE Notify終了
LINE Notifyが2025年3月31日にサービスが終了します。
LINE Notifyの代替方法として、LINE公式アカウントから
メッセージを送信できるMessaging APIを使ってみます。
LINE messaging API
LINE Messaging APIは、LINEのプラットフォームを活用して
自動化されたメッセージ送受信や対話型のチャット機能を提供するためのAPIです。
これを使用すると、LINE上でチャットボットや通知システムを構築したり、
LINEを通じてさまざまなサービスを統合することができます。
手順
LINE Developers
curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {"access token"}' \
-d '{
"to": "user_id",
"messages":[
{
"type":"text",
"text":"Hello, world1"
},
{
"type":"text",
"text":"Hello, world2"
}
]
}'
MT4からLINEに通知
下記がMT4からLINEに通知を送るインジケータです。
wininet.dllを使っています。
tet_mt4_to_line.mq4
#property copyright ""
#property link ""
#property version "1.00"
#property strict
#property indicator_chart_window
#define OPEN_TYPE_PRECONFIG 0 // use the configuration by default
#define FLAG_KEEP_CONNECTION 0x00400000 // do not terminate the connection
#define FLAG_PRAGMA_NOCACHE 0x00000100 // no cashing of the page
#define FLAG_RELOAD 0x80000000 // receive the page from the server when accessing it
#define SERVICE_HTTP 3 // the required protocol
#define DEFAULT_HTTPS_PORT 443
#define FLAG_SECURE 0x00800000 // use PCT/SSL if applicable (HTTP)
#define INTERNET_FLAG_SECURE 0x00800000
#define INTERNET_FLAG_KEEP_CONNECTION 0x00400000
#define HTTP_ADDREQ_FLAG_REPLACE 0x80000000
#define HTTP_ADDREQ_FLAG_ADD 0x20000000
#import "wininet.dll"
int InternetOpenW(string sAgent,int lAccessType,string sProxyName,string sProxyBypass,int lFlags);
int InternetConnectW(int hInternet,string ServerName, int nServerPort,string lpszUsername, string lpszPassword, int dwService,int dwFlags,int dwContext);
int HttpOpenRequestW(int hConnect, string Verb, string ObjectName, string Version, string Referer, string AcceptTypes, int dwFlags, int dwContext);
int HttpSendRequestW(int hRequest, string &lpszHeaders, int dwHeadersLength, uchar &lpOptional[], int dwOptionalLength);
int InternetCloseHandle(int hInet);
#import
input string access_token = "accecc_token";
input string user_id = "User ID";
int OnInit()
{
CallLineMessagingAPI("Hello World!!");
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
return(rates_total);
}
void CallLineMessagingAPI(string message) {
string sServerName = "api.line.me";
string sObjectName = "/v2/bot/message/push";
string headers = "";
string dataString = "{ \"to\": \"" +user_id + "\", \"messages\":[ {\"type\": \"text\",\"text\": \"" + message + "\"} ] }";
headers += "Content-Type: application/json\r\nAuthorization: Bearer {\" "+ access_token + "\"}";
uchar data[];
StringToCharArray(dataString, data, 0, -1, CP_UTF8);
int session = InternetOpenW("MetaTrader 4 Terminal", 0, "", "", 0);
int connect = InternetConnectW(session, sServerName, DEFAULT_HTTPS_PORT, "", "", SERVICE_HTTP, 0, 0);
int hRequest = HttpOpenRequestW(connect, "POST", sObjectName, "HTTP/1.1", NULL, NULL, (int)(FLAG_SECURE | FLAG_KEEP_CONNECTION | FLAG_RELOAD | FLAG_PRAGMA_NOCACHE), 0);
int hSend = HttpSendRequestW(hRequest, headers, StringLen(headers), data, ArraySize(data) - 1);
Closehandle(session, connect);
InternetCloseHandle(hRequest);
InternetCloseHandle(hSend);
}
void Closehandle(int session_, int connect_) {
//+---------------------------------------------------+
//| セッションを閉じる関数
//+---------------------------------------------------+
if(session_ > 0){
InternetCloseHandle(session_);
session_ = -1;
}
if(connect_ > 0) {
InternetCloseHandle(connect_);
connect_ = -1;
}
}
下記の箇所を自身の
アクセストークンとユーザIDに置き換えてください。
input string access_token = "accecc_token";
input string user_id = "User ID";