質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

4771閲覧

MQL(MT4)のインジケーターでLINE通知をできるようにしたい

nekojarashi

総合スコア2

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2020/08/10 07:17

前提・実現したいこと

MQL(MT4)のインジケーターで、LINE通知をできるようにコードを書いています。
下記のようにソースコードを作成しました。

データは送信できているようなのですが、LINE通知はできておらず、エラーが出てしまいます。
おそらくHttpSendRequestWのヘッダーの書き方が悪いのかなと思うのですが、解決策がわかりません。
コードの不備や解決策を知りたいです。

よろしくお願いします。

発生している問題・エラーメッセージ

MQL

1//Print("Data Send : toStr")コード部分です 2//Data Send : {"status":405,"message":"Method Not Allowed"}

該当のソースコード

MQL

1#import "wininet.dll" 2int InternetAttemptConnect(int x); 3int InternetOpenW(string &sAgent, int lAccessType, string &sProxyName, string &sProxyBypass, int lFlags); 4int InternetConnectW(int hInternet, string &szServerName, int nServerPort, string &lpszUsername, string &lpszPassword, int dwService, int dwFlags, int dwContext); 5int HttpOpenRequestW(int hConnect, string &Verb, string &ObjectName, string &Version, string &Referer, string &AcceptTypes, uint dwFlags, int dwContext); 6int HttpSendRequestW(int hRequest, string &lpszHeaders, int dwHeadersLength, uchar &lpOptional[], int dwOptionalLength); 7int HttpQueryInfoW(int hRequest, int dwInfoLevel, int &lpvBuffer[], int &lpdwBufferLength, int &lpdwIndex); 8int InternetReadFile(int hFile, uchar &sBuffer[], int lNumBytesToRead,int &lNumberOfBytesRead); 9int InternetCloseHandle(int hInet); 10#import 11 12//token⇒アクセストークン 13//message⇒通知内容 14 15string Linenotify(string token, string message){ 16 string headers; 17 int session = 0; int connect = 0; 18 int hRequest, hSend; 19 uchar post[]; 20 21 if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)){ 22 Print("DLL is not allowed"); 23 return(false); 24 } 25 26 string message1 = message + "\n" + IntegerToString(Period()); 27 28 ArrayResize(post, StringToCharArray("message=" + message1, post, 0, WHOLE_ARRAY, CP_UTF8) - 1); 29 30 string UserAgent = "HachiwareMT4"; 31 string nill = ""; 32 33 session = InternetOpenW(UserAgent, 0, nill, nill, 0); 34 if(session <= 0){ 35 if(session > 0) InternetCloseHandle(session); session = -1; 36 if(connect > 0) InternetCloseHandle(connect); connect = -1; 37 Print("Err CreateSession"); 38 return(NULL); 39 } 40 41 string host = "notify-api.line.me"; 42 connect = InternetConnectW(session, host, 0, nill, nill, SERVICE_HTTP, 0, 0); 43 if(connect <= 0){ 44 if(session > 0) InternetCloseHandle(session); session = -1; 45 if(connect > 0) InternetCloseHandle(connect); connect = -1; 46 Print("Err create Connect"); 47 return(NULL); 48 } 49 50 string Vers = "HTTP/1.1"; 51 string POST = "POST"; 52 string Object = "/api/notify.php"; 53 54 hRequest = HttpOpenRequestW(connect, POST, Object, Vers, nill, nill, FLAG_KEEP_CONNECTION|FLAG_RELOAD|FLAG_PRAGMA_NOCACHE, 0); 55 if(hRequest <= 0){ 56 if(session > 0) InternetCloseHandle(session); session = -1; 57 if(connect > 0) InternetCloseHandle(connect); connect = -1; 58 Print("Err OpenRequest"); 59 return(NULL); 60 } 61 62 headers = "Authorization: Bearer " + token + "\r\n"; 63 headers += "Content-Type: application/x-www-form-urlencoded\r\n"; 64 65 hSend = HttpSendRequestW(hRequest, headers, StringLen(headers), post, ArraySize(post)); 66 uchar ch[100]; 67 string toStr = ""; 68 int dwBytes; 69 while(InternetReadFile(hRequest, ch, 100, dwBytes)){ 70 if(dwBytes <= 0) break; 71 toStr = CharArrayToString(ch, 0, dwBytes); 72 } 73 74 if(hSend <= 0){ 75 Print("Err SendRequest"); 76 if(connect > 0) InternetCloseHandle(hRequest); 77 if(session > 0) InternetCloseHandle(session); session = -1; 78 if(connect > 0) InternetCloseHandle(connect); connect = -1; 79 } 80 81 InternetCloseHandle(hSend); 82 InternetCloseHandle(hRequest); 83 if(session > 0) InternetCloseHandle(session); session = -1; 84 if(connect > 0) InternetCloseHandle(connect); connect = -1; 85 86 Print("Data Send : toStr"); 87 return(hSend); 88} 89

補足情報(FW/ツールのバージョンなど)

Version:5.00 build:2375です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

InternetConnectWの呼び出し時にHTTPSを指定して、
HttpOpenRequestWのフラグにINTERNET_FLAG_SECUREを追加で動きました。

MQL

1#define DEFAULT_HTTPS_PORT 443 2 3#define SERVICE_HTTP 3 4 5#define FLAG_SECURE 0x00800000 // use PCT/SSL if applicable (HTTP) 6#define FLAG_PRAGMA_NOCACHE 0x00000100 // asking wininet to add "pragma: no-cache" 7#define FLAG_KEEP_CONNECTION 0x00400000 // use keep-alive semantics 8#define FLAG_RELOAD 0x80000000 // retrieve the original item 9 10//token⇒アクセストークン 11//message⇒通知内容 12 13string Linenotify(string token, string message){ 14 string headers; 15 int session = 0; int connect = 0; 16 int hRequest, hSend; 17 uchar post[]; 18 19 if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)){ 20 Print("DLL is not allowed"); 21 return(false); 22 } 23 24 string message1 = message + "\n" + IntegerToString(Period()); 25 26 ArrayResize(post, StringToCharArray("message=" + message1, post, 0, WHOLE_ARRAY, CP_UTF8) - 1); 27 28 string UserAgent = "HachiwareMT4"; 29 string nill = ""; 30 31 session = InternetOpenW(UserAgent, 0, nill, nill, 0); 32 if(session <= 0){ 33 if(session > 0) InternetCloseHandle(session); session = -1; 34 if(connect > 0) InternetCloseHandle(connect); connect = -1; 35 Print("Err CreateSession"); 36 return(NULL); 37 } 38 39 string host = "notify-api.line.me"; 40 connect = InternetConnectW(session, host, DEFAULT_HTTPS_PORT, nill, nill, SERVICE_HTTP, 0, 0); 41 if(connect <= 0){ 42 if(session > 0) InternetCloseHandle(session); session = -1; 43 if(connect > 0) InternetCloseHandle(connect); connect = -1; 44 Print("Err create Connect"); 45 return(NULL); 46 } 47 48 string Vers = "HTTP/1.1"; 49 string POST = "POST"; 50 string Object = "/api/notify.php"; 51 52 hRequest = HttpOpenRequestW(connect, POST, Object, Vers, nill, nill, FLAG_SECURE|FLAG_KEEP_CONNECTION|FLAG_RELOAD|FLAG_PRAGMA_NOCACHE, 0); 53 if(hRequest <= 0){ 54 if(session > 0) InternetCloseHandle(session); session = -1; 55 if(connect > 0) InternetCloseHandle(connect); connect = -1; 56 Print("Err OpenRequest"); 57 return(NULL); 58 } 59 60 headers = "Authorization: Bearer " + token + "\r\n"; 61 headers += "Content-Type: application/x-www-form-urlencoded\r\n"; 62 63 hSend = HttpSendRequestW(hRequest, headers, StringLen(headers), post, ArraySize(post)); 64 uchar ch[100]; 65 string toStr = ""; 66 int dwBytes; 67 while(InternetReadFile(hRequest, ch, 100, dwBytes)){ 68 if(dwBytes <= 0) break; 69 toStr = CharArrayToString(ch, 0, dwBytes); 70 } 71 72 if(hSend <= 0){ 73 Print("Err SendRequest"); 74 if(connect > 0) InternetCloseHandle(hRequest); 75 if(session > 0) InternetCloseHandle(session); session = -1; 76 if(connect > 0) InternetCloseHandle(connect); connect = -1; 77 } 78 79 InternetCloseHandle(hSend); 80 InternetCloseHandle(hRequest); 81 if(session > 0) InternetCloseHandle(session); session = -1; 82 if(connect > 0) InternetCloseHandle(connect); connect = -1; 83 84 Print("Data Send : toStr"); 85 return(hSend); 86}

投稿2020/08/11 11:02

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekojarashi

2020/08/11 22:15

ありがとうございます、本当に助かりました。 URLがhttps なのに、http 接続をしてしまっていたのですね。 教えてくださり、本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問