1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MT4からLINEに通知を送る

Last updated at Posted at 2024-12-21

はじめに

MT4からLINEに通知を送る仕組みを作成していきます。

LINE Notify終了

LINE Notifyが2025年3月31日にサービスが終了します。

image.png

LINE Notifyの代替方法として、LINE公式アカウントから
メッセージを送信できるMessaging APIを使ってみます。

LINE messaging API

LINE Messaging APIは、LINEのプラットフォームを活用して
自動化されたメッセージ送受信や対話型のチャット機能を提供するためのAPIです。
これを使用すると、LINE上でチャットボットや通知システムを構築したり、
LINEを通じてさまざまなサービスを統合することができます。

手順

LINE Developers

「新規プロバイダー作成」をクリック
image.png

適当にプロバイダー名を命名し新規プロバイダーを作成
image.png

「Messaging API」をクリック
image.png

image.png

「LINE公式アカウントの作成」
image.png

image.png

image.png

image.png

image.png

image.png

image.png
image.png

image.png

image.png

image.png

image.png

チャンネルアクセストークンを取得
image.png

image.png

ユーザーIDを取得
image.png

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"
        }
    ]
}'

curlコマンドをたたきます
image.png

LINEにメッセージが通知されることを確認します。
image.png

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";

MT4に設置すると下記のようにLINEに通知が飛びます。
image.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?