はじめに
自動売買の状況をスマホのLINEに送って確認したい!チャート情報やエントリー状況をLINEで確認できると、一切PC前にいなくてもEAがエントリーした時とその状況をスマホから確認できちゃうので便利ですよね。
という事で、今回はMT4(MQL4)で「ShellExecuteW」を使ってバッチを起動しLINEにメッセージを送る&イメージを送るインジケータを作る方法について記載しています。
結局、なんとか作りたいものは作れたのですがプログラミングを少しかじった程度の私では中々に苦戦しました。
LINEにメッセージを送るのは簡単
まず、LINEにメッセージを送るだけであれば比較的簡単です。私はEAではなくインジケータで作りましたがどちらでも行けると思います。
LINE関連のプログラムなんて組んだことが無かったので、どうやってLINEにメッセージを送るんだって感じの手探りでした。MT4からLINEに直接メッセージ送れないよなぁと調べていくと、どうやら
MT4 → LINE Developers → スマホ側のLINE
という感じで、LINE Developersでチャネルを作成しないといけないみたいです。チャネルを作成すると「チャネルアクセスコード」と「ユーザーID」の2つの情報が得られるので、この2の情報を使ってMT4からLINE Developersで作ったチャネルにメッセージを送ります。
そうすると、LINE Developersで作ったチャネルからは自動でスマホ側のLINEにメッセージを送ってくれるといった仕組みです。
こんな感じでチャネルを作りました。
LINE Developersでのチャネル作成方法やLINE送信のソースコードは「さくてんFX」様のサイトで詳細に解説されていましたのでほぼほぼつまづく事なく実装できました。
「さくてんFX」様、めちゃくちゃ参考になりました。有難うございました!!
LINEにメッセージを送る時にハマった事
LINEにメッセージを送る際、唯一ハマったことがあります。
それは、CRYPT_E_NO_REVOCATION_CHECK (0x80092012)「失効の関数は証明書の失効を確認できませんでした。」というエラーが出てLINEにメッセージを送信できなかったことです。
検索しても、証明書関連の解決策が出てきて『自分は証明書とか特に発行してないしなー』という感じでしたが、原因がわかりました。
原因は、ウィルス対策ソフトでした。例外のWEBサイトに『https://api.line.me/*』を追加する事で解決できました。
LINEにイメージを送る
さあ、メッセージは簡単に送れたし次はチャートのイメージキャプチャーもLINEに送っちゃおうかな?と意気揚々と機能を実装していきます。
以下実装の流れです。
LINEに送信するイメージを用意する
まずはチャートのイメージキャプチャーを撮ろうという事で、調べましたがこれは簡単でした。
ChartScreenShot(0,OrderTicket() + "-S.png",400,400,ALIGN_RIGHT);
上記コードだけでチャートのイメージキャプチャーが準備できちゃいます。
こんな感じです。イメージファイルは特にパスを指定していなければ「MQL4\Files」に作られます。
作られたイメージをLINEに送る
さぁーて、後は作られたイメージをLINEに送るだけ!簡単簡単!と調べました。
ただ、「MQL LINE 画像送信」等で調べましたが実装方法が中々見つからない。見つかったとしても全て有料記事でした。1つですが有料記事も確認しましたが、残念だったのが「LINE Notify」で送る方法という事でした。
これがなぜ残念?かというと、実は「LINE Notify」はもうすぐサービス終了します。
ですので、「LINE Notify」で実装しても残り僅かの命・・・。であれば、「LINE Notify」の代替方法としてLINE公式が推奨している「Messaging API」を使ってLINEにイメージを送るしかない!と思いました。
そして、ここからが苦行のはじまりです。
「Messaging API」を使ってLINEにイメージを送る
まず、「Messaging API」はメッセージ送信の時も使ったので少しはわかります。なので、イメージ送信も簡単だろうと甘い考えを持っていました。
set "JSON_DATA={\"to\":\"%GROUP_ID%\",\"messages\":[{\"type\":\"text\",\"text\":\"%MESSAGE%\"}]}"
curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d "%JSON_DATA%" https://api.line.me/v2/bot/message/push
メッセージ送信がこんな感じです。
修正必要な箇所を見やすくすると、こう。
//テキスト送信の場合
{
"type": "text",
"text": %MESSAGE%
}
この「type」をimageにして、「text」の部分をイメージファイルに置き換えるぐらいで行けるんだろうぐらいの感じです。
が!どうやら「Messaging API」はイメージをそのまま送信する事ができないようです。イメージを送信するには、イメージURLが必要との事でした。どういう事かというとこんな感じにしないといけないそう。
//イメージ送信の場合
{
"type": "image",
"originalContentUrl": "https://example.com/original.jpg",
"previewImageUrl": "https://example.com/preview.jpg"
}
これ3つでワンセットです。『originalContentUrl』と『previewImageUrl』は同じURLでOKです。
でもイメージURLって?さっき作ったイメージをネットにアップしないといけないの?
まさしくその通りです。め、面倒そう!ですがいいサービスが見つかりました。
イメージをネット上にアップする
MT4からイメージをネット上にアップするってできるの・・・?
GoogleドライブはイメージURLできないし・・・と思いながら調べているとバッチリの無料サービスが!
Gyazoというサービスです。
そして、このGyazoの何がいいのかというとAPIがある事でした。
このAIPを使って、MT4から自動でイメージをGyazoにアップできるという感じです。ただ、GyazoのAPIの使い方も中々検索でヒットしなかったので、ダメもとでChatGPTに聞いてみたら見事にアップしてくれるソースコードを回答してくれました!
@echo off
:: Gyazo APIエンドポイント
set GYAZO_API_URL=https://upload.gyazo.com/api/upload
:: Gyazoのアクセストークン(Gyazoアカウントから取得して置き換えてください)
set ACCESS_TOKEN=YOUR_ACCESS_TOKEN
:: アップロードする画像ファイルのパス(フルパスで指定してください)
set IMAGE_PATH=path\to\your\image.png
:: curlコマンドを使用して画像をアップロード
curl -X POST %GYAZO_API_URL% ^
-F "access_token=%ACCESS_TOKEN%" ^
-F "imagedata=@%IMAGE_PATH%" ^
-o response.json
:: アップロード結果を表示
echo アップロード結果:
type response.json
pause
ChatGPTを使ったバッチファイルの一例です。このバッチファイルからGyazoのAPIを使って画像をアップしたものがこちら。
ちゃんとアップされていますね。これでイメージURL(https://i.gyazo.com/XXXXX.png)の準備ができました。
イメージURLを取得する
次に、イメージURLを取得していきます。これは、先ほどのバッチファイルのソースを見てもらうとわかりますが「-o response.json」でURL情報等を「response.json」に書き出していますのでそれを参照する必要があります。
「response.json」ファイルの中身はこんな感じになっており、
{"type":"png","thumb_url":"https://thumb.gyazo.com/thumb/XX.jpg","created_at":"2025-01-29T02:31:50+0000","alt_text":"","image_id":"XX","permalink_url":"https://gyazo.com/XX","url":"https://i.gyazo.com/XX.png"}
“url”:”の所のイメージURLが欲しい感じです。で、この文字列を検索してURLを取得してくれるコードは「jq」コマンドを使いました。
jqはJSONを解析するための強力なCLIツールで、簡単に必要な情報を取得できます。
:: jqコマンドを使って画像URLを取得(%RESPONSE_FILE%の中身はresponse.json)
for /f "delims=" %%i in ('jq -r ".url" %RESPONSE_FILE%') do set IMAGE_URL=%%i
「jq」のインストール方法等は、ネットで調べるかChatGPTに『jqをダウンロードしてインストールする方法を教えて』と聞けば簡単にインストールできます。
jqのハマりポイント
私の環境が悪かったのかもしれないので、jqが問題なく使えれば飛ばしてください。
私がハマった事象としてはjqをインストールした後、テストでバッチを直に実行するとjqが見つかるのですが、MT4から「ShellExecuteW」でバッチを実行すると、以下のようにjqが見つかりません。(コマンドが無効)
これは多分環境変数の問題ですが、私が知識不足だったため原因はよくわかりませんでした。ですので、「MQL4\Files」直下にjq.exeを設置し、さらにバッチファイル内で以下のようにパスを通すという力業で問題を解決しました。
set PATH=%PATH%;C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\xxx\MQL4\Files
- jq.exeを「MQL4\Files」直下にコピー
- バッチファイル内でパスを通す
という2つの事をしてようやくjqでイメージURLを取得する事ができました。
LINEにイメージを送る
最後は、イメージURLを使ってLINEにイメージを送ります。
コマンドの一例です。
set "JSON_DATA={\"to\":\"%GROUP_ID%\",\"messages\":[{\"type\":\"image\",\"originalContentUrl\":\"%IMAGE_URL%\",\"previewImageUrl\":\"%IMAGE_URL%\"}]}"
curl -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d "%JSON_DATA%" https://api.line.me/v2/bot/message/push
無事、LINEに送れました。
LINEにイメージを送る時にハマった事
LINEにメッセージを送る際にもハマりましたが忘れていました。
また、CRYPT_E_NO_REVOCATION_CHECK (0x80092012)「失効の関数は証明書の失効を確認できませんでした。」というエラーが出てあれ?となりました。
こちらも原因は、ウィルス対策ソフトでした。例外のWEBサイトに『https://upload.gyazo.com/*』を追加する事で解決できました。
※LINEだけではなくGyazoも追加しないとダメですよね!
さいごに
以上が、『MT4からLINEにイメージを送る方法でハマった件』です。
「LINE Notify」のサービスが終了する事もあり、「Messaging API」で回り道をした感もありますがタイミング的には良かった(Messaging API一択だった)かなと思います。
ハマりポイントがいくつもあって2日間は調べながら作りました。要所でChatGPTが活躍してくれたのもあって何とか実装までたどり着く事ができました。
ソースコードのフル公開も考えましたが、参考にさせて頂いたコードが多いのと調査・作業時間等も膨らんだので今回はポイントでの解説とさせて頂きました。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント