こんにちは。
久しぶりに記事を書きます。
今回はfxの自動売買をする場合に使う方が多いであろうMQL4からLineにメッセージを送りたいと思います。
なんでpythonを使うんだろうと思う方もいるかもしれませんが、単純に簡単にできるからです。(MQL4だけでもできると思いますが、間違いなくpythonを使ったほうが簡単だと思います)
まあ、正直mt4をスマートフォンにインストールすれば状況を確認できるので、こんなことをする必要はないかもしれませんが、Lineのほうが見る頻度が高いという方は多いと思うので、書いていきます。
準備
今回Lineにメッセージを送るのにLineNotifyを利用します。受信であればmessaging api を使ったほうが良いですが、送信はNotyfyのほうが楽に行えます。
まず、以下のLineのページに行きます。
notify-bot.line.me
すると、このようなページになっていると思うので、ログインをします。
ログインができたら、マイページに移動します。
こんな感じのページになるので、トークンを発行します。
どこに送信するかを選べるので、選びます。
こだわりがなければ、1:1を選べばいいと思います。
トークン名は何でもいいのですが、今回はMT4にしました。
すると、トークンが表示されるので、どこかに取っておきましょう。
どうでもいいですが、モザイクをかけすぎました。
MQLとPythonの連携
連携方法についてはいろいろありますが、今回はテキストファイルで連携させたいと思います。
図にすると、こんな感じです。
簡単に説明すると、MQL4から、テキストファイルを書き出して、それをPythonで読んでやるということです。
MQLコード
#property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- string fileName = "Line.txt"; // /MQL4/Filesまたは/MQL4/tester/Files int fileHandle = FileOpen(fileName, FILE_WRITE | FILE_TXT); int randam = MathRand(); //乱数 //ファイルに書き込む FileWrite(fileHandle,"Number:"+(string)randam+"\nEx_pair:"+Symbol()+"\nPrice:"+DoubleToStr(Close[0])); FileClose(fileHandle); Sleep(60000); //60秒待機 } //+------------------------------------------------------------------+
今回は、とりあえず何かをLineに通知したいということで、1分毎に現在価格を通知してみます。
この、ファイルの書き出す場所はバックテスト時と、実際に動かす時で変わるので気を付けてください。
乱数を発生させるのは、ファイルを区別するためです。
書き出されたテキストは以下のようになります。
Number:25791 Ex_pair:GBPJPY Price:136.70600000
Pythonコード
import requests import time def PythonNotify(message): # 諸々の設定 line_notify_api = 'https://notify-api.line.me/api/notify' line_notify_token = 'dMX5a3Oz2FiCW9FUQ7P9aAXUvXa35QhcMp4One95Zsu' #メモしておいたアクセストークンを使う headers = {'Authorization': 'Bearer ' + line_notify_token} # メッセージ payload = {'message': ("\n"+message)} requests.post(line_notify_api, data=payload, headers=headers) number_pre=-1 while True: #ファイルパスは自分のものを使いましょう file = open("C:/Users/taibo/AppData/Roaming/MetaQuotes/Terminal/082F53F5881F3D6022DF806C3D307B50/MQL4/Files/Line.txt", 'r') data = file.read() # ファイル終端まで全て読む file.close() lines = data.split('\n') # 改行で区切る number = int(lines[0].strip("Number:")) #乱数部分 #乱数部分が異なるとき if(number!=number_pre): PythonNotify(lines[1]+"\n"+lines[2]) time.sleep(10) number_pre=number
こんな感じで、10秒毎にファイルにアクセスして、乱数の部分が違ったら、Lineに通知を送ります。
まとめ
今回はMQL4からPythonを通じてLineにメッセージを送ってみました。
今回送ったのは価格でしたが、実際に使うときは、注文の情報や利益の情報などをLineで送れると便利だと思います。
以上で終わります。