(1)概要
(2)plot関数
(3)change関数・iff関数
(4)input関数
(5)security関数、相関係数インジケータ
(6)fill関数
(7)bgcolor関数
(8)複数行を一括でコメントアウトできる?
(9)line.new関数・line.set関数、ピボット・インジケータ
(10)関数宣言(カスタム関数)、ピボット・ハイ・ロー・インジケータ
(11)ジグザグ(ZigZag)インジケータ
(12)平均足バー・マルチタイムフレーム(MTF)
(13)ストラテジー・バックテストの概要
(14)ストラテジー・サンプル「EMAクロス+固定TP/SL」
(15)ストラテジーの「最適化」をめぐるTradingViewとMetaTraderの違い
(16)Security関数のgapsとlookaheadとは?
(17)アラート条件の設定:alertcondition
はじめに
今回はPineScript入門ガイドの14回目です。前回は、TradingViewのストラテジーとバックテストの概要をご紹介しました。今回は具体的なストラテジーのサンプルの第1回目として、最も基本的で、かつ応用しやすいサンプルとして、「EMAクロスでエントリー、固定pipsの利確とストップロス」のストラテジーをご紹介したいと思います。(なお次回は続編として、このストラテジーの「最適化」に関する記事を書く予定です。)
「EMAクロスでエントリー、固定pipsの利確とストップ」のサンプル・ストラテジー
このサンプル・ストラテジーのロジック、およびバックテストの前提は、以下の通りです。
- 短期EMA(25期間)と長期EMA(75期間)のゴールデン・クロスで買いエントリー
- 短期EMA(25期間)と長期EMA(75期間)のデッド・クロスで売りエントリー
- 利確は、70pips固定
- ロスカット(損切り)は、50pis固定
- 短期EMAおよび長期EMAの期間、利確pips、ロスカットpips、およびバックテストの開始日・終了日は、入力項目として後で変更可能とします
- バックテストの前提:
- 対象通貨ペア・時間足:ユーロドル・1時間足
- 対象期間: 2019年1月1日~2019年12月31日までの1年間
- 基準通貨:円
- 初期資金:100,000円
- オーダーサイズ:1,000通貨
- 手数料:1,000通貨のオーダーの1往復(エントリー・決済)で60円
- ピラミッディング:無し
- スリッページ:無し
このサンプル・ストラテジーを、上記の条件を前提としてバックテストをした結果は、以下の通りです。
このサンプル・ストラテジーのスクリプトは、以下の通りです。
//@version=4 strategy("EMA cross & fixed TP/SL", overlay=true) startyear = input(2019) //-----(A) startmonth = input(1) endyear = input(2020) endmonth = input(1) backtestStart = timestamp(startyear, startmonth, 1, 00, 00) //-----(B) backtestEnd = timestamp(endyear, endmonth, 1, 00, 00) isBacktest = backtestStart <= time and time <= backtestEnd //-----(C) fastEMAperiod = input(25) slowEMAperiod = input(75) takeProfit = input(700) stopLoss = input(500) fastEMA = ema(close, fastEMAperiod) slowEMA = ema(close, slowEMAperiod) p1 = plot(fastEMA,color=color.red) p2 = plot(slowEMA,color=color.blue) longCondition = crossover(fastEMA, slowEMA) //-----(D) if (isBacktest) if (longCondition) strategy.entry("My Long Entry Id", strategy.long) //-----(E) strategy.exit("ExitLong", "My Long Entry Id", profit = takeProfit, loss = stopLoss) //-----(F) shortCondition = crossunder(fastEMA, slowEMA) if (isBacktest) if (shortCondition) strategy.entry("My Short Entry Id", strategy.short) strategy.exit("ExitShort", "My Short Entry Id", profit = takeProfit, loss = stopLoss)
(A) startyear = input(2019)
バックテストの対象期間の開始年をインプット項目として設定します。以下、開始月、終了年、終了月も同様です。
(B) backtestStart = timestamp(startyear, startmonth, 1, 00, 00)
バックテストの対象期間の開始年月日を、2019年1月1日0時0分で設定します。以下、終了年月日も同様です。
(C) isBacktest = backtestStart <= time and time <= backtestEnd
シミュレーションが、上記で設定したバックテストの対象期間か否かを、ブーリアン型(True/False)の変数で返します。
(D) longCondition = crossover(fastEMA, slowEMA)
ロング(買い)の条件を、ブーリアン型(True/False)の変数で返します。ショート(売り)の条件設定も同様です。
(E) strategy.entry(“My Long Entry Id”, strategy.long)
strategy.entryは、ポジションの保有を指示する関数です。
引数は、以下の通りです。
strategy.entry(id, long, qty, limit, stop, oca_name, oca_type, comment, when, alert_message)
- id (string) :省略不可能で、注文の識別子です。識別子を指定する事で注文の変更やキャンセルが可能となります。
- long (bool) :省略不可能で、市場ポジションの方向: ‘true’ または ‘strategy.long’ はロングです。’false’ または ‘strategy.short’ はショートです。
- qty (float) :省略可能で、トレードのロット数です。デフォルト値は ‘NaN’ です。
- limit (float) :省略可能で、注文の指値価格です。指定した場合、注文の種類は ‘imit’ または ‘stop-limit’ です。
- stop (float) :省略可能で、注文の逆指値価格です。指定した場合、注文の種類は ‘stop’ または ‘stop-limit’ です。
(F) strategy.exit(“ExitLong”, “My Long Entry Id”, profit = takeProfit, loss = stopLoss) //—–(F)
strategy.exitは、特定のエントリーまたはすべてのポジションの決済を指示する関数です。
引数は、以下の通りです。
strategy.exit(id, from_entry, qty, qty_percent, profit, limit, loss, stop, trail_price, trail_points, trail_offset, oca_name, comment, when, alert_message)
- id (string) :省略不可能で、注文の識別子です。識別子を指定する事で注文の変更やキャンセルが可能となります。
- from_entry (string) :省略可能。エグジットする特定のエントリー注文のIDを指定します。
- qty (float) :省略可能。トレードを終了するロット数です。デフォルト値は ‘NaN’ です。
- profit (float) :省略可能。利益目標 をティックで指定します。デフォルト値は ‘NaN’ です。
- limit (float) :省略可能。利益目標を特定の価格で指定します。デフォルト値は’NaN’です。
- loss (float) :省略可能。損切幅をティックで指定します。デフォルト値は ‘NaN’ です。
- stop (float) :省略可能。損切価格を指定します。デフォルト値は ‘NaN’ です。
次回は、今回のバックテストの結果の分析と、変数の値を変えて「最適化」をすることについて、MetaTrader(MT4, MT5)の機能と比較してまとめたいと思います。