
【TradingView(Webhook)】と【GoogleAppsScript】と【OANDA API】でFX自動売買する方法
こんにちは、rocky(@rockyFXtrader)です。
2021年1月25日からブログで無料公開しています。そちらをご覧ください。
有料noteは導入サポート用に一応残しておくだけなので、購入しないようにお願いします。
◆更新履歴
2019/09/18 新規投稿
2019/11/03 [ウェブアプリケーションとして導入]の英語表記を追記
修正箇所:見出し[2-3. Webアプリケーション公開]
2020/06/06 機能追加【NEW】(機能追加箇所は【NEW】で検索できます)
[注文]リトライ機能追加
[注文]利益確定注文・ストップロス注文・トレーリングストップ注文が設定できるように改修
[決済]利益確定注文・ストップロス注文・トレーリングストップ注文で決済された場合、スプレッドシートに決済結果が反映されるように決済履歴を取得するように改修
[決済]ポジション方向に関わらず、すべて決済できるように改修
[その他]市場クローズの時に注文が入った場合、スプレッドシートにNGと記載されるように改修
[その他]Discord通知に対応
[その他]LINE通知に対応
2021/01/25 記事をブログに移行したため、noteを有料サポート用に変更
TradingViewのアラート通知機能のWebhookを使ったFX自動売買をする方法をご紹介したいと思います。
◆概要
TradingViewで設定したアラート条件でFX(OANDA)自動売買ができます。
売買履歴がGoogleスプレッドシートに自動記入され、いつ・どんな注文/決済を出して・どのくらい損益が出たかということが簡単にわかるようになっています。
具体的に見てもらった方がわかりやすいと思ったので動画を撮りました。
この動画では画面更新が遅いため、アラートから注文まで2,3秒かかっているように見えるんですが、実際は1秒以内に注文されています。
◆仕様
赤枠は新規追加機能

◆ 売買トリガー:TradingViewのアラート(Webhook)
◆ 対応注文方法:成行注文、成行決済、利益確定注文【NEW】、ストップロス注文【NEW】、トレーリングストップ注文【NEW】
※ 現在は部分決済については対応していません
◆ 対応通貨ペア:OANDAで対応している全ての通貨ペア
◆ 対応枚数:OANDAの契約コースの取引枚数
◆ OANDA APIバージョン:v20
※ 2019年2月以前に口座開設された方はご確認ください
◆機能
◆ ドテン(売り買い):
例)売りポジションを持っていて、買いの注文が入った場合は、
売りポジションを一度決済した上で買いの注文を行う
◆ ナンピン:
例)売りポジションを持っていて、売りの注文が入った場合は
追加で売りの注文を行う。
※ 両建ては対応していません
◆ ポジション量による売買制限:
例)買い30,000通貨持っていて、制限を買い30,000通貨までに設定していた状態で買い注文が入っても注文されない。
※ スプレッドシートの注文履歴のSTATUSに[LIMIT]と残ります
◆ リトライ機能【NEW】:
為替等の流動性不足により約定できなかった場合、3回までリトライして注文を行う機能を追加。
※ ドテン売買で流動性不足により、注文できなかったケースがあったため
◆ 利益確定・ストップロス・トレーリングストップ注文【NEW】:
初期バージョンでは成行注文のみの対応だったが、それぞれの注文に対応。利益確定・ストップロスは価格指定・値幅指定可能。トレーリングストップはトレール幅指定。
※ 詳細は[3-2. メッセージの例]に記載
◆ 注文履歴管理(注文・決済・サマリ):
[orderシート]
アラート設定のメッセージ + 注文ステータス(STATUS) + OANDA注文結果指値(利益確定)・逆指値(ストップロス)・トレール幅列を追加【NEW】
[closeシート]
アラート設定のメッセージ + 決済ステータス(STATUS) + OANDA決済結果[summaryシート]
orderシートのOANDA注文結果 + closeシートのOANDA決済結果
◆ 決済履歴取得機能【NEW】:
TradingViewアラートでの注文・決済履歴はスプレッドシートに反映していたが、今回のバージョンアップで対応した利益確定・ストップロス・トレーリングストップ注文での決済はTradingViewアラートでの決済ではないため、スプレッドシートに反映できなかった。
そこで注文時に毎回、過去決済履歴取得する機能を追加し、利益確定・ストップロス・トレーリングストップ注文や手動で決済された場合にもスプレッドシートに反映されるように対応した。
※ この機能でスプレッドシートに反映された場合はsummaryシートのorderID・idはデータが入りませんのでご注意ください
◆ エラーメール通知(任意):
自動売買の処理が失敗した場合、指定したメールアドレスに
エラー内容を記載したメールを送ることができます。
◆ エラーログ記録:
自動売買の処理が失敗した場合、詳細なログがスプレッドシートに
記録されます。
[logシート]
◆ Discord通知【NEW】:
スプレッドシートに各種設定することで注文・決済内容をDiscordに通知させることができます。通知形式としては単純なテキストモードとembed(埋め込みメッセージ)モードに対応しています。
各項目名の変更や表示・非表示の選択が可能です。通知内容の追加やembedのみですが、通知タイトル・説明・URLの追加が可能です。
※ 設定方法については導入部分でご説明します
・Discord通知(テキストモード)サンプル
・Discord通知(embedモード)サンプル
◆ LINE通知【NEW】:
Discord同様にスプレッドシートに各種設定することで注文・決済内容をLINEに通知させることができます。
各項目名の変更や表示・非表示の選択が可能です。通知内容の追加も可能です。
◆前提条件
◆ TradingViewの有料アカウント
有料プランでしかアラートのWebhookを利用できないため
まだ申込していない方は以下のサイトから申込を進めてください。
◆ Gmailアカウント(無料)
GoogleAppsScriptを利用するため
◆ OANDA Japan [プロコース]の口座
自動売買するにはOANDA APIが必要であるため、API利用ができる
[プロコース]を申し込む必要がある。
※注意事項
※ 稀にTradingViewのアラートが遅れることがありますが、その場合でも注文・決済が通常通り実行されますのでご理解ください。
※ 雇用統計や急騰・急落等で数秒で数十pips変動がある場合は思わぬところで約定してしまう可能性がありますので、アラートをオフにしておくことをおすすめします。
※ 購入してくださる方が多い場合、サポートできる労力の関係で、値上げさせて頂く可能性がありますので、ご了承ください。
◆サポートについて
有料記事にお問い合わせ用googleフォームを載せています。
その他、twitterのDMでも受け付けます。
基本的に数日内に返信させていただきますが、平日は働いているため、ベストエフォートの対応となりますので、ご了承ください。
◆導入手順概要
プログラミングができない方でも導入できるように、既にプログラムが書かれた状態のスプレッドシートを配布します。
1. OANDA API情報の取得
2. Googleスプレッドシート操作
3. TradingViewアラート設定
1. OANDA API情報の取得
OANDA APIを使って注文するには「Account ID」と「Access Token(アクセストークン)」が必要です。詳しい手順は以下のサイトに記載しましたのでご確認ください。
「Account ID」と「Access Token(アクセストークン)」は後ほど利用しますので、コピーしておいてください。
2. Googleスプレッドシート操作
2-1. Googleスプレッドシートのコピー
スプレッドシートのURLにアクセスし、ログインしていない場合は赤枠の[ログイン]をクリックし、ログインしてください。
※ ログインしている方は次へ進んでください。
★ スプレッドシートのURLは有料記事にしているので、一番下に記載しています。

ログインできたら、右クリックから[コピーを作成]をクリックします。

画面下に以下のようなポップアップが表示されるので、[ファイルの場所を表示]をクリックします。ポップアップが消えてしまった場合は[マイドライブ]にコピーがありますので、[マイドライブ]をクリックします。

以下のような「OANDA-FX自動売買システム のコピー」ができていると思うので、赤枠の通り、[オーナー]が自分になっていることを確認します。
これで、他の人がアクセスできない、自分専用のスプレッドシートがコピーできたことになります。

2-2. 必要項目の入力
スプレッドシートをクリックして、開きます。

スプレッドシートの[set]シートを開いて、それぞれ内容を記入していきます。

Access Token:[1. OANDA API情報の取得]で取得したAccess Tokenを記入
accountID:[1. OANDA API情報の取得]で取得したaccountIDを記入
URL:以下のデモ口座か本番口座のURLを記入
デモ:api-fxpractice.oanda.com
本番:api-fxtrade.oanda.com
発注上限(買い):初期設定値は10000000(買い1000万通貨)
例)30000と設定して、買い30000通貨持っていた状態で買い注文をした場合、上限に達しているため、注文されない。
発注上限(売り):初期設定値は-10000000(売り1000万通貨)
例)-30000と設定して、売り30000通貨持っていた状態で売り注文をした場合、上限に達しているため、注文されない。
※ 売りの場合は-(マイナス)を必ず入れてください。
メールアドレス:エラー発生時のメール送付先
以下のように記入できたら次に進みます。
※ 以下はサンプルです

2-3. Webアプリケーション公開
[ツール]->[スクリプト エディタ]をクリックします。

スクリプトエディタ画面で[公開]->[ウェブアプリケーションとして導入]をクリックします。

すると以下のようなポップアップが表示されるので、以下のように選択し、[更新]をクリックします。
注意:ポップアップの表記が英語になる事象が発見されております。[]内に英語表記の場合の選択肢と以下に英語版キャプチャを記載しますので、英語表記の場合はご確認ください。
プロジェクトバージョン[Project version]:
New(コメントは任意)
次のユーザーとしてアプリケーションを実行[Execute the app as]:
自分[Me](自分のメールアドレス)
アプリケーションにアクセスできるユーザー[Who has access to the app]:
全員(匿名ユーザーを含む)[Anyone, even anonymous]
日本語表記
英語表記
※注意:この後、GoogleAppsScriptの承認作業が続きますが、Chromeのタブ等を切り替えるとポップアップが消えてしまうのでご注意ください。
承認作業の最後にある「許可」まで通して実施してください。
[許可を確認]をクリックします。

実行するアカウントを選択します。現在ログインしているアカウントをクリックします。

以下の画面が出た場合は[詳細]をクリックします。
※ 出なかった場合は次に進んでください

さらに下の赤枠をクリックします。
※ 他者のアプリではなく、自分のみ利用するアプリのため問題ありません

次にスクリプトに許可する確認する内容が表示されます。
自動売買システムでは以下の内容を自動で実行するため、許可が必要になっています。
・スプレッドシートへ自動記入
・OANDAへ自動注文
・エラーメールの送信
画面下の[許可]をクリックします。

許可をクリックすると、公開されたURLが表示されますのでコピーしておきましょう。TradingViewのWebhookのURL欄に入力します。

表示されなかった場合は、[公開]->[ウェブアプリケーションとして導入]をクリックし、[現在のウェブアプリケーションのURL]から確認できます。

これでGoogleAppsScriptの設定が終了になります。
お疲れさまでした。
3. TradingViewアラート設定
TradingViewアラートのアラート条件は大きく2つあります。
①プリセット:[交差],[より大きい],[チャネルに入る] 等
②Pineスクリプトで追加:Pineスクリプトで決めた条件
Webhook箇所については説明していきますが、それぞれのアラート設定方法については割愛させていただきます。②については以下で紹介していますので、任意で確認してください。
3-1. Webhookの設定
TradingViewのアラート設定画面を開いたら、以下の赤枠のように設定してください。詳細は画像下に記載しています。

◆ アラートアクション
Webhook URL:チェックを入れる
Webhook URL入力欄:「2-3. Webアプリケーション公開」で取得した
GoogleAppsScriptウェブアプリのURLを入力
◆ メッセージ
カンマ区切りで注文内容を指定しています。詳しくは下記の「3-2. メッセージの例」を参考にしてください。
・注文の場合
例1){"request":"ORDER","instrument":"EUR_USD","units":"10000","type":"MARKET"}
例2){"request":"ORDER","instrument":"EUR_USD","units":"-100000","type":"MARKET","takeProfitOnFill":{"price":"1.11"},"stopLossOnFill":{"price":"1.12"}}
例3)
{"request":"ORDER","instrument":"EUR_USD","units":"-100000","type":"MARKET","trailingStopLossOnFill":{"distance":"0.001"}}
・決済の場合
例1)
{"request":"CLOSE","instrument":"EUR_USD","closePositions":"SHORT"}
例2)
{"request":"CLOSE","instrument":"EUR_USD","closePositions":"ALL"}
◆ 各種パラメータ
request:注文 or 決済リクエスト
ORDER:注文
CLOSE:決済
instrument:通貨ペア
TradingViewに表示されている通貨ペアの間に_(アンダースコア)を入れた表示なります。代表的なものは例として以下に記載しています。
USD_JPY:ドル円
EUR_USD:ユーロドル
EUR_JPY:ユーロ円
GBP_JPY:ポンド円
AUD_JPY:豪ドル円
units:注文枚数(※ マイナスで売り、マイナスなしで買い)
10000:1万通貨買い
-10000:1万通貨売り
その他、任意の枚数を指定できます。
type:注文方法
MARKET:成行
takeProfitOnFill:利益確定注文【NEW】
price:価格指定
distance:値幅(※pipsではありません)
例1)USD_JPYが100円の場合に買いエントリーでtakeProfitOnFillをdistance:0.1とした場合、利益確定が100.1(100+0.1)円となります。
例2)EUR_USDが1.1の場合に買いエントリーでtakeProfitOnFillをdistance:0.1とした場合、利益確定が1.2(1.1+0.1)となります。
例3)USD_JPYが100円の場合に売りエントリーでtakeProfitOnFillをdistance:0.1とした場合、利益確定が99.9(100-0.1)円となります。
stopLossOnFill:ストップロス注文【NEW】
price:価格指定
distance:値幅(※pipsではありません)
例1)USD_JPYが100円の場合に買いエントリーでstopLossOnFillをdistance:0.1とした場合、ストップロスが99.9(100-0.1)円となります。
例2)EUR_USDが1.1の場合に買いエントリーでstopLossOnFillをdistance:0.1とした場合、ストップロスが1.0(1.1-0.1)となります。
例3)USD_JPYが100円の場合に売りエントリーでstopLossOnFillをdistance:0.1とした場合、ストップロスが100.1(100+0.1)円となります。
trailingStopLossOnFill:トレーリングストップ注文【NEW】
distance:値幅(※pipsではありません)
例1)USD_JPYが100円の場合に買いエントリーでtrailingStopLossOnFillをdistance:0.1とした場合、値幅0.1円のトレーリングストップとなります。
例2)EUR_USDが1.1の場合に買いエントリーでtrailingStopLossOnFillをdistance:0.1とした場合、値幅0.1のトレーリングストップとなります。
closePositions:決済ポジション
LONG:買いポジションを決済
SHORT:売りポジションを決済
ALL:買い売りポジションを決済【NEW】
※ ALLは対象の通貨ペアの売買方向関係なく決済します
3-2. メッセージの例
◆ 注文の場合
例1)注文・ドル円・10000通貨(1万通貨買い)・成行
{"request":"ORDER","instrument":"USD_JPY","units":"10000","type":"MARKET"}
例2)注文・ユーロドル・-100000通貨(10万通貨売り)・成行
{"request":"ORDER","instrument":"EUR_USD","units":"-100000","type":"MARKET"}
例3)注文・ドル円・100000通貨(10万通貨買い)・成行・利益確定109.0【NEW】
{"request":"ORDER","instrument":"USD_JPY","units":"100000","type":"MARKET","takeProfitOnFill":{"price":"109.0"}}
例4)注文・ドル円・100000通貨(10万通貨買い)・成行・ストップロスの値幅0.1【NEW】
{"request":"ORDER","instrument":"USD_JPY","units":"100000","type":"MARKET","stopLossOnFill":{"distance":"0.1"}}
例5)注文・ドル円・100000通貨(10万通貨買い)・成行・トレーリングストップ値幅0.1【NEW】
{"request":"ORDER","instrument":"USD_JPY","units":"100000","type":"MARKET","trailingStopLossOnFill":{"distance":"0.1"}}
例6)注文・ユーロドル・-100000通貨(10万通貨売り)・成行・利益確定の値幅0.001・ストップロスの値幅0.001【NEW】
{"request":"ORDER","instrument":"EUR_USD","units":"-100000","type":"MARKET","takeProfitOnFill":{"distance":"0.001"},"stopLossOnFill":{"distance":"0.001"}}
◆ 決済の場合
例1)決済・ドル円・買いポジション決済
{"request":"CLOSE","instrument":"USD_JPY","closePositions":"LONG"}
例2)決済・ユーロドル・売りポジション決済
{"request":"CLOSE","instrument":"EUR_USD","closePositions":"SHORT"}
例3)決済・ユーロドル・売り買いポジション決済【NEW】
{"request":"CLOSE","instrument":"EUR_USD","closePositions":"ALL"}
メッセージの入力が完了して、[保存]したら、設定は完了です。
お疲れさまでした。
4. Discord通知設定(任意)【NEW】
Discord通知設定を行っていきます。不要の人は読み飛ばしてください。
※ Discordサーバが不安定なのか、たまに通知できないことがございますのでご了承ください。通知に失敗した場合のリトライ機能はついておりますが、それでも通知できないことが稀にございます。
大きく分けて、Discord側の設定とスプレッドシート側の設定があります。
4-1. Discord側の設定
4-2. スプレッドシート側の設定
[discord]シートを開き、Discord側で取得したWebhookURLを入力します。

とりあえず、これでDiscord通知はされるようになりました。あとはモードや表示/非表示、本文などの設定なので任意で行ってください。
4-2-1. モードと表示名・表示/非表示

◆ 機能の◆ Discord通知で説明したとおり、Discord通知にはtextモードとembed(埋め込みメッセージ)モードがあります。embedの方が情報量を多く付与できる、見栄えが良いという特徴がありますが、好みによると思いますので、プルダウンから選択してください。ちなみにデフォルトではtextモードが選択されています。
また、表示項目に対して表示/非表示を選択することができます。もちろん非表示にすれば、その項目は通知されない仕組みになっています。
グループ内に通知する場合、損益などは通知させたくないなどあれば、プルダウンから非表示を選択してください。
さらに表示名も変更することができます。例えば[通貨ペア]を[銘柄]に変更すれば、表示名が[銘柄]と通知されます。あくまで表示名が変わるだけですのでご注意ください。
4-2-2. embedと本文

embedモードを選択した場合はembedタイトル・説明・URLを利用することができます。
埋め込みメッセージ内にタイトルを追加でき、そのタイトルに対するURLが設定可能で、その下に説明がくるようになります。
※ embedタイトルなどを表示させたくない場合は空白にしていただければ消えます。
本文についてはtext/embedモード共通の項目です。通知内容の一番下に表示される内容です。embed同様に不要な場合は空白にしていただければ消えます。
5. LINE通知設定(任意)【NEW】
LINE通知設定を行っていきます。不要の人は読み飛ばしてください。
※ LINE通知で失敗したことがないため、リトライ機能は実装していません。通知されたり、されなかったりと不安定な場合はお問い合わせください。
大きく分けて、LINE側の設定とスプレッドシート側の設定があります。
5-1. LINE側の設定
5-2. スプレッドシート側の設定
[LINE]シートを開き、LINE側で取得したトークンを入力します。

とりあえず、これでLINE通知はされるようになりました。あとは表示/非表示、本文などの設定なので任意で行ってください。
5-2-1. 表示名・表示/非表示と本文

表示項目に対して表示/非表示を選択することができます。もちろん非表示にすれば、その項目は通知されない仕組みになっています。
グループ内に通知する場合、損益などは通知させたくないなどあれば、プルダウンから非表示を選択してください。
さらに表示名も変更することができます。例えば[通貨ペア]を[銘柄]に変更すれば、表示名が[銘柄]と通知されます。あくまで表示名が変わるだけですのでご注意ください。
本文については通知内容の一番下に表示される内容です。
※ 本文を表示させたくない場合は空白にしていただければ消えます。
◆動作確認
TradingViewアラートが発生し、注文・決済がなされ、エラーメールが出ていなければ、基本的に問題なく処理されている可能性が高いです。
スプレッドシートへの自動記入、OANDAの取引画面で実際に注文・決済されていない場合はエラーメールもしくはスプレッドシートの[log]シートを確認してください。
もし、原因が不明な場合は以下のお問い合わせフォームから問い合わせていただくか、TwitterのDMでお問い合わせください。
※ サポート対象外・GoogleAppsScriptが分かる人のみ
アラートと同様のリクエストを変数に入れて、テストするスクリプトもスクリプトエディタ内に用意しています。「testProject.gs」を開いて任意のjsonのコメントアウトを外して、実行してください。
◆ その他
記事の内容、テキスト、画像等の無断転載・無断使用を固く禁じます。
Unauthorized copying prohibited.
◆お問い合わせ
◆ Googleフォーム
◆ Twitter
FAQ
Q:ポジションがない時に決済しようとするとエラーになりますか?
A:エラーになりません。
Q:同じ通貨ペアで同タイミングで注文・決済された場合、どうなりますか?
A:検証したところ、決済処理がエラーになります。ただし、確証がないため、同タイミングで注文・決済が出ないようにすることを推奨します。
◆ 実装予定
複数ロジックに対応するために、idを付与して、そのidのみ決済できるようにする。
※ 現在は通貨ペアごとの決済
"clientExtensions": {
"comment": "New idea for trading",
"id": "my_order_100",
"tag": "strategy_9"
}
ここから先は
¥ 10,000

この記事が気に入ったらチップで応援してみませんか?