トレーディングビュー(TradingView)Pineスクリプト入門#16|MACDと他のインジケーターを組み合わせたバックテスト

スポンサーリンク
Pineスクリプト入門#16MACDと他のインジケーターを組み合わせたバックテスト

PineスクリプトでMACDを使ったバックテスト

前回の記事でこれまでPineスクリプト入門の記事で解説してきたコードを使って、MACDを使ったストラテジーを作成しました。

実際の取引にはMACDのみで取引きする方は少なく、高値、安値などのチャートの値動きや他のインジケーターを組み合わせることがほとんどだと思います。

今回は前回の記事で作成したコードを改良して、MACDと他のインジケーターを組み合わせたストラテジーの作成方法を解説します。以下が前回作成したコードです。

//@version=4
strategy("MACD backtest", overlay=false, default_qty_type=strategy.fixed, default_qty_value=1, currency=currency.JPY)

//期間設定用入力値------------------------------------------------
startYear = input(2000, minval = 1900, maxval = 2100, title = "開始 年")
startMonth = input(01, minval = 01, maxval = 12, title = "開始 月")
startDay = input(01, minval = 01, maxval = 31, title = "開始 日")
endYear = input(2020, minval = 1900, maxval = 2100, title = "終了 年")
endMonth = input(01, minval = 01, maxval = 12, title = "終了 月")
endDay = input(01, minval = 01, maxval = 31, title = "終了 日")
//開始日時-------------------------------
test_start = timestamp(startYear, startMonth, startDay, 00, 00)
//終了日時------------------------------------------------
test_end = timestamp(endYear, endMonth, endDay, 00, 00)
//テスト期間の指定------------------------------------------------
is_test = test_start <= time and time <= test_end

//売買方向の設定----------------------------------------------
direction = input(0, title="売買方向", minval = -1, maxval = 1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long ))

//インプット設定-----------------------------------------------
fast_len = input(12, title="短期")
slow_len = input(26, title="長期")
signal_len = input(9, title="シグナル")

//MACD---------------------------------------------------------
MACD = ema(close, fast_len) - ema(close, slow_len)
signal = ema(MACD, signal_len)

//ポジショニング条件-------------------------------------------
long_condition = crossover(MACD, signal)
short_condition = crossunder(MACD, signal)

//エントリー条件-----------------------------------------------
if (is_test)
    if (long_condition)
        strategy.entry("LongEntry", strategy.long)

    if (short_condition)
        strategy.entry("ShortEntry", strategy.short)

// 確認用の表示 ------------------------------------------------
p1 = plot(MACD, color=color.red, title="MACDline")
p2 = plot(signal, color=color.blue, title="signalline")
plot(0, color=color.white, title="baseline")

//ライン間の背景色変更-----------------------------------------
fill(p1, p2, color = MACD > signal ? color.green : color.white, transp = 70)

MACDと移動平均線を組み合わせたバックテスト

SMA200でトレンドを判断し、売買方向を決定する

単純移動平均線のSMA200をフィルターとして使います。

SMA200よりも価格が上にある場合、上昇トレンドと判断して買いのみでエントリー。

SMA200よりも価格が下にある場合は、下降トレンドと判断して売りのみでエントリー。

エントリー、エグジット方法は変更せず、MACDとシグナルのクロスで行うストラテジーを作成します。

以下が変更した箇所のコードになります。

//コード変更箇所
//ポジショニング条件-------------------------------------------
long_condition = crossover(MACD, signal) and strategy.position_size == 0 and is_test
short_condition = crossunder(MACD, signal) and strategy.position_size == 0 and is_test

//エントリー条件-----------------------------------------------
SMA = sma(close, 200)
if close > SMA
    if (long_condition)
        strategy.entry("LongEntry", strategy.long)
else
    if (short_condition)
        strategy.entry("ShortEntry", strategy.short)
    
//エグジット条件
if strategy.position_size > 0 and crossunder(MACD,signal)
    strategy.close_all()

if strategy.position_size < 0 and crossover(MACD,signal)
    strategy.close_all()

変更箇所:ポジショニング条件

変更箇所は2つ。

strategy.position_size == 0を追加。

 エグジット条件に使うため、ポジション状態を定義します。

is_testを追加。

 前回はエントリー条件の部分に記述していましたが、ここに書くほうがコードがわかりやすいので変更しました。

変更箇所:エントリー条件

この変更点がSMA200でトレンドを判断する部分です。

SMA = sma(close, 200)でSMA200を表す変数を作成。if close > SMAでSMA200よりも終値が上にある場合、long_conditionの条件で買いエントリー。else分岐を使ってSMA200よりも終値が上以外にあるの場合は、short_conditionの条件で売りエントリー。

if文について詳しく知りたい方は、トレーディングビュー(TradingView)Pineスクリプト入門#14|「if文」の書き方を参考にしてみてください。

strategy.entryの補足:引数にwhenを使う

SMA200のフィルターをif~elseを使って書きましたが、strategy.entryの引数にwhenを使えば同じ処理をすることができます。

下のコードはwhenを使った場合です。

//whenを使ったエントリー例
//エントリー条件-----------------------------------------------
SMA = sma(close, 200)
strategy.entry("LongEntry", strategy.long, when = long_condition and close > SMA)
strategy.entry("ShortEntry", strategy.short, when = short_condition and close <= SMA)

whenstrategy.entryのオプションパラメータで条件がTrueの場合発注、Falseの場合は発注しません。

引数にwhenを使えばif文を省略できる場合もあるので、whenを使ったほうがコードがすっきりするかもしれません。

変更箇所:エグジット条件

//エグジット条件
if strategy.position_size > 0 and crossunder(MACD,signal)
    strategy.close_all()

if strategy.position_size < 0 and crossover(MACD,signal)
    strategy.close_all()

新たに追加した条件です。これまではMACDとシグナルのクロスでドテン決済していましたが、SMA200のフィルターがあることでどちらかの売買エントリーしか実行できず、この決済方法ができなくなりました。

従って、エグジット条件を新たに追記する必要があります。

エグジットの条件はMACDとシグナルのクロスで実行しますが、前回と異なり同時にエントリーは実行しません。strategy.close_all()はすべてのポジションを決済する関数です。

コードの実行結果

作成したストラテジーを実行してみましょう。

青線(SMA200)よりも上で価格が推移しているときは買いのみのエントリー(青矢印)、価格が青線よりも下で推移しているときは売りのみでエントリー(赤矢印)していることが確認できました。

ちなみにコードではoverlay=falseとしていますが上の画像ではSMA200がチャート上に表示されています。これはインジケーターをスクリプトから追加せず、上部のメニューバーからSMAを追加しています。スクリプトに影響を与えずにチャート上にインジケーターを表示させることができます。

次の記事ではボタン一つで売買条件を反転させる方法を解説しています。良ければこちらも参考にしてみてください。

トレーディングビューPineスクリプト入門#17|MACDのストラテジーに売買反転機能を加える⇒

口座とアカウントを作成する

トレーディングビューイメージ

Trading View

トレーディングビューはPineスクリプトでバックテストを行う以外にも、自分のオリジナルインジケーターを作成したり、世界中のトレーダーが作成したオリジナルのインジケーターを使うことも可能です。

FX、株、ETF、コモディティなど国内外問わず様々な銘柄に対応しています。

OANDA JAPAN

OANDA JAPANはトレーディングビューを使って直接取引できる数少ないFX業者です。他にもMT4、MT5にも対応しています。

Pineスクリプト入門の記事では、プログラミング初心者でも理解できるように一つづつ丁寧に解説しています。Pineスクリプトを触ったことがない方でもPineスクリプト入門#1から順にみていただければ、今回作成したバックテストのコードも作成することができます。興味のある方は是非、他の記事もご覧ください。

コメント

タイトルとURLをコピーしました