前回までの投稿で、移動平均線をプロットするコードの書きながら、変数や関数の基本的な使い方を説明してきました。今回の投稿では、移動平均線を使った売買シグナルをチャート上に表示するコードを下記ながら、bool型変数について説明します。
なお、ここで説明する売買タイミングは、コードの書き方を説明するためのものです。この売買ルールでトレードすることを推奨する意図はありません。どんな売買手法もそうですが、自分でテストして検討することが大切で、そのためにコードの書き方を学ぶわけです。
ゴールデンクロスとデッドクロスとは
これまで説明してきた単純移動平均線は、市場のトレンドを視覚的に表す最もシンプルで多くの人々に使われているテクニカルテクニカル指標で、どんなトレードの入門書にも紹介される基本的中の基本です。
移動平均線を使った最もオーソドックスな売買手法は、短期の移動平均線が長期の移動平均線を下から上にクロスしたときに買い、短期の移動平均線が長期の移動平均線を上から下にクロスしたときに売る、というものです。
短期線が長期線を下から上にクロスすることをゴールデンクロスと言い、その逆に上から下にクロスすることをデッドクロスと言います。
この手法についてはいろんな賛否両論の議論がなされ、本やネット上でもい意見が発信されていますが、人のいうことを鵜呑みにするのではなく自分で検証することが大切です。
ここでは10日間単純移動平均線と100日間単純移動平均線をチャート上にプロットし、ゴールデンクロスが起こったら買いのシグナルをチャート上にプロット、デッドクロスが起こったら売りのシグナルをプロットするコードの書き方を解説していきます。
まずは移動平均線を二本プロットするコードに戻りましょう。
下記のコード例5は、例4の移動平均線コードからエンベロープ線を取り除いたものです。
(例5)
//@version=5
indicator(“移動平均2本”, overlay=true)
//移動平均の期間を設定
i_smaShort = input.int(defval=10, title=”Short SMA”)
i_smaLong = input.int(defval=100, title=”Long SMA”)
//移動平均線を計算
sma_short = ta.sma(source=close, length=i_smaShort)
sma_long = ta.sma(source=close, length=i_smaLong)
//移動平均線をプロット
plot(series=sma_short, color=color.green)
plot(series=sma_long, color=color.red)
買いのシグナル、ゴールデンクロスを定義する
ゴールデンクロスとなった時に買いシグナルをプロットするためには、まずはゴールデンシグナルを定義するコードを書く必要があります。
10日間(短期)移動平均線と100日間(長期)移動平均線のゴールデンクロスをもう少しプログラミング的な言葉で言い表すと下記のようになります。
・当日の10日間移動平均値は前日の100日間移動平均値よりも高い。
・前日の10日間移動平均値は前日の100日間移動平均値よりも低い、または同じ。
前日の短期移動平均と長期移動平均が全く同じこともあるので、「低い、または同じ」という定義にします。
これをコードで書くとどうなるかを考えてみます。
すでに例5のコードで、短期移動平均線は sma_short、長期移動平均線は sma_long という変数を宣言していますので、この変数を利用します。
当日の短期移動平均値が長期移動平均値より高い、というコードは、
sma_short > sma_long
と書き表すことができます。> 記号は、左側の値が右側の値より大きい、という意味です。
数値の大小を表す記号をまとめると下記のようになります。
| < | 左の値が右の値より小さい |
| > | 左の値が右の値より大きい |
| == | 左の値と右の値が同じ |
| <= | 左の値が右の値と同じ、または小さい |
| >= | 右の値が左の値と同じ、または大きい |
| != | 左の値と右の値が異なる |
それでは、1日前の短期移動平均が長期移動平均より小さい、または同じ、という条件をコードで表現してみましょう。
1日前の移動平均値を呼び出すためには、変数の後ろに[1]を付けます。
例えば短期移動平均の変数 sma_short の後ろに [1] をつけて、sma_short[1] のように表現します。
sma_short[2] とすると2日前の移動平均値を呼び出します。sma_short[10]とすると10日前の移動平均値を呼び出します。
なお、当日の移動平均値を呼び出すためには、sma_short[0] と書いても良いのですが、普通は[0]は省略してsma_shortと書いているのです。
「1日前の短期移動平均が長期移動平均以下(小さい、または同じ)」をコードで表現すると
sma_short[1] <= sma_long[1]
となります。
sma_short[1] < sma_long[1]
としてもコードとしては正しいのですが、こうすると前日の短期移動平均と長期移動平均が全く同じ場合、ゴールデンクロスを検知できなくなってしまいますので、<= とするほうが良いと思います。
ゴールデンクロスの定義である「当日の短期移動平均値が長期移動平均値より大きく、かつ、前日の短期移動平均値が長期移動平均値よりも小さいまたは同じ」をコードで書くと下記のようになります。
sma_short > sma_long and sma_short[1] <= sma_long[1]
このように、「当日の短期移動平均値が長期移動平均値より大きい」という1つ目の条件と、「前日の短期移動平均値が長期移動平均値より小さい、または同じ」という2つ目の条件を and でつなぎます。
条件1 and 条件2 のように、andをつかうと、条件1と条件2をともに満たした状況である、プログラミング的な表現で言うと、条件1と条件2がともにTrue である(真である)ということを表現します。
ちなみに、条件1と条件2のどちらかがTrue である、ということを表現したい場合は、
条件1 or 条件2 のように、or を使って表現することができます。
ここでは使いませんが、覚えておいてください。
そして、条件1と条件2がともにTrueである、という条件を変数として定義することができます。このように条件を満たしている状況 (True) であるか、条件を満たしていない状況 (False) なのかを定義する変数のことを bool変数と言います。
今回は、移動平均線のゴールデンクロスが起こったら買いシグナルにしたいと思っているので、
buyCondition という名前のbool変数を作ってみましょう。
buyCondition = sma_short > sma_long and sma_short[1] <= sma_long[1]
のように書くと、ゴールデンクロスが起こっている状態のときに「True」、起こっていないときは「false」という値がbuyCondition というbool変数に代入されます。
コードを日本語に直訳すると「buyConditionというbool変数を作り、当日の短期移動平均値が長期移動平均値より大きく、前日の短期移動平均値が長期移動平均値以下である場合にTrue (真) とする、そうでない場合はFalse(否)とする」
という意味になります。
売りのシグナル、デッドクロスを定義する
それでは売りのシグナルのデッドクロスのコードを書いてみましょう。
ゴールデンクロスの逆になりますので、下記のようなコードになります。
sellCondition = sma_short < sma_long and sma_short[1] >= sma_long[1]
日本語訳すると「sellCondition というbool変数を作り、当日の短期移動平均値が長期移動平均値より小さく、前日の短期移動平均が長期移動平均以上だった場合にTrue(真)とする、そうでない場合はFalse(否)とする」となります。
買いシグナルと売りシグナルをプロットする
buyCondition、sellCondition というbool変数を作っただけではチャート上には何も起こりません。buyCondition、sellConditionを売買シグナルとしてプロットするコードも書く必要があります。
ゴールデンクロスが起こったときにチャートの下に緑色で▲印を、デッドクロスが起こったときには
チャートの下に赤色で▼印をプロットするようにしましょう。
線ではなくて▲印や▼印をプロットするためにはplotshape()という変数を使います。三角印だけでなく、矢印、x印、四角印なども指定できます。
買いシグナルの変数buyConditionの条件に合致しているローソク足に▲印をつけるには、
plotshape(series=buyCondition, style=shape.triangleup, color=color.green, size=size.small, location=location.belowbar)
のように書きます。
plotshape()のカッコの中の引数について順番に説明します。
series=buyCondition は、bool変数であるbuyCondition の条件に合致しているとき(Trueのとき)、に所定の形をプロットすることを指定しています。
style=shape.triangleup は、プロットする形は「上向き三角形」▲とすることを指定しています。
shape.triangledownとすると「下向き三角形」▼になります。他にもいろんな形がありますがここでは省略します。詳細はPineエディタの右上の「・・・」をクリックして「リファレンスのポップアップ」を選択して詳細を確認してください。
color=color.green は色の指定です。plot()変数と同じです。
size=size.tiny は、プロットする▲印の大きさを指定します。他にもsize.small, size.normal, size.large, size.hugeがありますが、私はsize.tinyが一番見やすいと思います。
location=location.belowbar は、▲印をローソク足の下にプロットするよう指定しています。
sellConditionも同様に下向き三角形▼を赤色でプロットするコードを書いてみましょう。
plotshape(series=sellCondition, style=shape.triangledown, color=color.red, size=size.tiny, location=location.belowbar)
のように書くことができます。
それでは、移動平均線の売買シグナルをプロットするコードを完成させましょう。
(例6)
//@version=5
indicator(“移動平均2本”, overlay=true)
//移動平均線の期間を入力できるようにします
i_smaShort = input.int(defval=10, title=”Short SMA”)
i_smaLong = input.int(defval=100, title=”Long SMA”)
//移動平均線を計算します
sma_short = ta.sma(source=close, length=i_smaShort)
sma_long = ta.sma(source=close, length=i_smaLong)
//買いのシグナルを定義します
buyCondition = sma_short > sma_long and sma_short[1] <= sma_long[1]
//売りのシグナルを定義します
sellCondition = sma_short < sma_long and sma_short[1] >= sma_long[1]
//移動平均線をプロットします
plot(series=sma_short, color=color.green)
plot(series=sma_long, color=color.red)
//売買シグナルをプロットします
plotshape(series=buyCondition, style=shape.triangleup, color=color.green, size=size.tiny, location=location.belowbar)
plotshape(series=sellCondition, style=shape.triangledown, color=color.red, size=size.tiny, location=location.belowbar)
「チャートを更新」または「更新をチャートに反映」を押すと下記のように移動平均線と売買シグナルがプロットされます。

ただ、売買シグナルをプロットするだけではこの売買ストラテジーが過去の相場でどれだけ利益を出せていたかはわかりません。
次の投稿では、この売買戦略をバックテストするためのコードの書き方を解説していきます。