TradingViewアラートからMetaTraderで自動売買を行う(EA)
ねくすこです。(@tenten1091)
今回は、TradingViewのアラートを元にMT4で注文を行う手順を紹介します。
■概要
webhook受信サーバーを立て、
受信したアラートをソケット通信でEAに送信、注文を行います。
TradingViewのPineスクリプト、アラートの設定について
ある程度知っていることを前提としています。
◆用意するもの
・MetaTrader4
・TradingViewアカウント
◆用意するもの(コードから実行する場合)
・Python 3.x
・Flaskパッケージ
■使用するプロジェクト
コードを含むプロジェクト一式は
GitLabからダウンロード、もしくはCloneして下さい。
mql4
┣ experts
┃ ┗ alert_example.mq4
┗ include
┗ socket-library-mt4-mt5.mqh
python
┣ ngrok_auth.bat ngrok認証バッチ
┣ ngrok_run.bat ngrok実行バッチ
┣ python_build.bat server.exe作成バッチ
┣ sender.py アラート送信コード
┣ server.py webhookサーバーコード
┣ server.exe webhookサーバー実行ファイル
┗ setting.ini 各種設定ファイル
プロジェクトの構成は上記のようになっています。
MQL4でソケット通信を行うライブラリをこちらから拝借しています。
■使用方法
◆使用方法(サーバー編)
pythonディレクトリ以下のserver.exeを起動します。
ソースコードから実行する場合はコマンドからserver.pyを実行して下さい。
server.exeはpythonのコードを実行形式にしたものです。
pyinstallerを使用して作成しています(python_build.bat参照)
※上記のプロセスは開いたままで下記の手順に進んで下さい。
◆使用方法(サーバー公開編)
上記で起動したサーバーをngrokを使用し外部に公開します。
手動で外部公開を行える方は読み飛ばしてください。
こちらからアカウントを作成後、
Windows用の実行ファイルをダウンロードし、
ngrok.exeをpythonディレクトリ以下に配置します。
[ngrok]
TOKEN = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
setting.iniを開き、Authページに表示されている認証トークンを貼り付け、
ngrok_auth.batを実行して認証を行います。
※認証は一度行ってしまえばその端末では2度目以降は必要ありません。
ngrok_run.batを実行して先ほどのサーバーの外部公開を行います。
Accountの項目が表示されていれば認証が通っています。
Forwardingの項目がサーバーのURLになります。
※上記のプロセスは開いたままで下記の手順に進んで下さい。
◆使用方法(アラート設定編)
TradingViewの各アラートの設定の
アラートアクション → Webhook URL にチェックを付け、
{サーバーのURL}/webhookと入力します。
この状態でアラートが発生するとサーバーで受信を行います。
アラート本文のフォーマットについては下記の通りです。
項目
・alert = アラート名
・order = 注文タイプ(long short longclose shortclose)
項目=値 , 項目=値 のように設定します。
例1
alert = test, order = long (Long:1 Short:0)
alert = test, order = long (Long:2 Short:0)
alert = test, order = longclose (Long:0 Short:0)
例2
alert = test, order = long (Long:1 Short:0)
alert = test, order = short (Long:0 Short:1)
alert = test, order = shortclose (Long:0 Short:0)
closeオーダーが来るとその方向のポジションを全て閉じます。
反対オーダーが来ると逆のポジションを全て閉じてドテンします。
微妙な仕様ですが、PineでオーダーIDを管理するのが難しいのでこうなっています。
◆使用方法(MT4編)
MT4の『ファイル → データフォルダを開く』から
MQL4 → Experts に alert_example.mq4 を配置、
MQL4 → Include に socket-library-mt4-mt5.mqh を配置します。
『ツール → オプション』のエキスパートアドバイザから
DLLの使用を許可するにチェックを入れOKを押します。
※Windows標準のws2_32.dll、kernel32.dllを使用しています。
ナビゲーターからalert_exampleを選び、
全般からDLLの使用を許可するにチェックを入れます。
パラメーターの入力からパラメーターを入力してOKを押します。
各パラメーターの詳細は下記の通りです。
Magic : EAのID
Slippage : 許容スリッページ
Lot : ロット数
AlertName: アラート名
Host : ソケット通信で使用するIP
Port : ソケット通信で使用するポート番号
アラート名にはアラート設定のalert項目に対応した名前を入れます。
複数EAを起動させる場合はMagicとAlertNameをそれぞれ固有のものにして下さい。
チャートに適応後、alert_exampleの初期化ログが表示され、
サーバー側の画面にconnection : 127.0.0.1 XXXXXの文字が出力されます。
EAを起動した後にサーバーを起動させても接続は行いません。
この状態で同名のアラートが発生するとその本文にあった注文を行います。
■テスト方法
Chrome拡張機能のTalend API Testerなどを使用すると
注文のテストを行えます。
APIテストページに飛んだ後、
上記の赤枠部分を入力してSendボタンを押すとサーバーにPOSTリクエストが飛び、注文が行えます。
■あとがき
ここで紹介しているコードはTradingView→MT4での
最低限の取引が行えるレベルのものになります。
Pineのv4ではPlotしたものをアラート本文に含めることができるため、
アラートの項目でLotやTakeProfit、StopLossなど対応すればもう少し複雑な取引なども行えると思います。
そこまでするならMQLで書けばよいとも思いますが・・・
致命的なエラーに分類されるものが発生した場合はEAを終了させています。
※alert_example.mq4 の ErrorHandlingの中で分類しています。
それなりにエラーハンドリングを行っていますが、
どんな時に発生するエラーなのか分からないものも含まれているため、
全てをカバーはできていないと思います。
今回はMQL4、MT4用のコードになっていますが、
MQL4の中では大した処理は行っていないためMQL5への移植もそこまで難しくはないと思います。