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

Pineスクリプト入門#17MACDのバックテストに売買反転機能を加える

MACDを使ったストラテジーのPineスクリプトコード

前回の記事「トレーディングビュー(TradingView)Pineスクリプト入門#16|MACDと他のインジケーターを組み合わせたバックテスト」ではMACDとSMA200を使ったストラテジーを作成しました。

バックテストは作成したストラテジーが有効かどうか、どのくらいの利益が上げられるのか。といった結果にフォーカスしがちですが、得られた結果に対して多角的な視点で考察することが重要だと私は考えます。

今回のバックテストの結果はいまいちだったけど、他の市場ではどうなのか?他の時間軸ではどうなのか?ほかの指数と組み合わせた場合は?売買を反対にした場合は?など新たな気づきや新しいアイディアが生まれてくるはずです。

そこで、今回はストラテジーにボタン一つで売買を反転させる機能の付け加え方を解説します。

以下は前回作成したコードです。ここに売買反転機能を加えます。

//@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) 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)
strategy.entry("LongEntry", strategy.long, when = long_condition and close > SMA)
strategy.entry("ShortEntry", strategy.short, when = short_condition and close <= SMA)
    
//エグジット条件
if strategy.position_size > 0 and crossunder(MACD,signal)
    strategy.close_all()

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

// 確認用の表示 ------------------------------------------------
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のバックテストに売買反転機能を加える

変更箇所は「ポジショニング条件」「売買反転用」「エントリー条件」の3箇所です。

//変更箇所
//ポジショニング条件-------------------------------------------
SMA = sma(close, 200)
long_condition = crossover(MACD, signal) and strategy.position_size == 0 and close > SMA
short_condition = crossunder(MACD, signal) and strategy.position_size == 0 and close <= SMA

//売買反転用----------------------------------------------------
reverse = input(false, title="売買反転")
pos = iff(long_condition,1,iff(short_condition,-1,na))
possing = iff(reverse and pos == 1, -1, iff(reverse and pos == -1, 1,pos))

//エントリー条件-----------------------------------------------
strategy.entry("LongEntry", strategy.long, when=is_test and possing==1)
strategy.entry("ShortEntry", strategy.short, when=is_test and possing==-1)

それでは一つづつ解説していきます。

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

//ポジショニング条件-------------------------------------------
SMA = sma(close, 200)
long_condition = crossover(MACD, signal) and strategy.position_size == 0 and close > SMA
short_condition = crossunder(MACD, signal) and strategy.position_size == 0 and close <= SMA

エントリー条件に書いていたSMA200フィルターの部分をポジショニング条件に移動しました。

SMA = sma(close, 200)and close > SMAand close <= SMAの部分です。

なぜかというと後から設定する売買反転用の変数にポジショニング条件を全て代入する必要があり、エントリー条件にSMA200フィルターがあるとこの部分が反転に反映されません。

変更箇所:売買反転用

//売買反転用----------------------------------------------------
reverse = input(false, title="売買反転")
pos = iff(long_condition,1,iff(short_condition,-1,na))
possing = iff(reverse and pos == 1, -1, iff(reverse and pos == -1, 1,pos))

次に売買反転を加えます。

inputを使って設定画面から反転売買のON/OFFを設定できるようにします。

ポジショニング条件で設定した変数を新たに別の変数に数値として代入します。

long_conditionpos=1short_conditionpos=-1に設定します。

更にiffを使って別の変数に代入します。この部分が売買反転を判定する部分になります。

reverse=true且つpos=1ならpossing=-1reverse=true且つpos=-1ならpossing=1に設定するといったコードです。つまり、設定画面のreverseがONならposの値を反転させてpossingに渡すという意味になります。

この処理構造をわかりやすいように図にしてみました。

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

//エントリー条件-----------------------------------------------
strategy.entry("LongEntry", strategy.long, when=is_test and possing==1)
strategy.entry("ShortEntry", strategy.short, when=is_test and possing==-1)

売買反転用で設定した変数possingを使ってロングエントリーとショートエントリーを判定します。

strategy.entryの引数whenを使い、possing=1ならロングエントリー、possing=-1ならショートエントリーと設定します。

エントリーをpossingの値で判定しているので、売買反転用のコードでreverseがON(true)となっている場合、ポジショニング条件で設定した条件と逆になるわけです。

変更したストラテジーの実行結果

コードの変更は以上です。では作成したストラテジーを実行して確認してみましょう。

売買反転のON/OFF方法

ストラテジーの実行は「チャートに追加」をクリックします。売買反転のON/OFFは歯車マークをクリックし、設定画面の「売買反転」のチェックボックスで切り替えます。

売買反転のストラテジー実行結果

チャート上の青線はSMA200、青矢印はロングエントリー、赤矢印はショートエントリーを表しています。

画像を見てわかる通り、売買反転反転のON/OFFでエントリーが真逆になっていることが確認できました!

「MACDのバックテストに売買反転機能を加える」の解説は以上になります。

スポンサーリンク

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

コメント

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