pypy.com/

Python、Unity、FX自動化などを勉強しています。あと、コーラと車も好きです。そこらへんについて、たまに記事を書きます。

MQL4でPythonを使ってLineにメッセージを送る

こんにちは。
久しぶりに記事を書きます。

今回はfxの自動売買をする場合に使う方が多いであろうMQL4からLineにメッセージを送りたいと思います。

なんでpythonを使うんだろうと思う方もいるかもしれませんが、単純に簡単にできるからです。(MQL4だけでもできると思いますが、間違いなくpythonを使ったほうが簡単だと思います)

まあ、正直mt4をスマートフォンにインストールすれば状況を確認できるので、こんなことをする必要はないかもしれませんが、Lineのほうが見る頻度が高いという方は多いと思うので、書いていきます。

準備

今回Lineにメッセージを送るのにLineNotifyを利用します。受信であればmessaging api を使ったほうが良いですが、送信はNotyfyのほうが楽に行えます。

まず、以下のLineのページに行きます。
notify-bot.line.me
すると、このようなページになっていると思うので、ログインをします。
f:id:SaidaTaisei:20200306220837p:plain


ログインができたら、マイページに移動します。
f:id:SaidaTaisei:20200306221335p:plain


こんな感じのページになるので、トークンを発行します。
f:id:SaidaTaisei:20200306221848p:plain


どこに送信するかを選べるので、選びます。

こだわりがなければ、1:1を選べばいいと思います。

トークン名は何でもいいのですが、今回はMT4にしました。
f:id:SaidaTaisei:20200306222232p:plain


すると、トークンが表示されるので、どこかに取っておきましょう。

どうでもいいですが、モザイクをかけすぎました。
f:id:SaidaTaisei:20200306223130p:plain

MQLとPythonの連携

連携方法についてはいろいろありますが、今回はテキストファイルで連携させたいと思います。

図にすると、こんな感じです。

簡単に説明すると、MQL4から、テキストファイルを書き出して、それをPythonで読んでやるということです。
f:id:SaidaTaisei:20200306224250p:plain

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に通知を送ります。

Line側

これをPythonとMT4で実行すると、以下のようになります。
f:id:SaidaTaisei:20200307000616j:plain


一分ごとに送られていることが確認できます。

まとめ

今回はMQL4からPythonを通じてLineにメッセージを送ってみました。

今回送ったのは価格でしたが、実際に使うときは、注文の情報や利益の情報などをLineで送れると便利だと思います。

以上で終わります。