前回までで、チャートから基本的なテクニカル指標の計算をExcel VBAをする方法を紹介しました。
今回からはもう一歩踏み込んで、テクニカル指標からトレードの判断をする方法を解説していきます。
今回は、VBAで単純移動平均線(SMA)のゴールデンクロスとデッドクロスを判定するコードを紹介します。
前準備
単純移動平均線の計算
この記事では、下の記事でSMAの算出まで終わっていることを前提として解説します。
ExcelVBAで単純移動平均線(SMA)を計算するSMAの算出方法が分からない方は上記の記事でSMAを計算してから、この先に進んでください。
シートの準備
シートの名前はSheet1であることを前提としたプログラムとなります。シート名が違う場合は、ご自身の環境に合わせてプログラムを変更してください。
A~H列までは、単純移動平均線の計算まで完了していれば、準備が完了していると思います。
今回紹介するプログラムでは、
ゴールデンクロスが発生した日時の行のI列に「1」を入力し
デッドクロスが発生した日時の行のJ列に「1」を入力します。
1行目のI列に「ゴールデンクロス」、J列に「デッドクロス」を記載しておいてください。
ゴールデンクロスとデッドクロスを判定するプログラムコード
今回は短期と中期のゴールデンクロスとデットクロスの判定をするプログラムです。
プログラムコードは2つのプロシージャからなります。下記のプログラムをコピー&ペーストしてF5でプログラムを実行するとゴールデンクロスの判定結果がI列に、デットクロスの判定結果がJ列に貼り付けられます。
- トレードルールのメインのプロシージャ(TradeRule)
- 2つの線がクロスしたことを判定するプロシージャ(CrossOver)
Sub TradeRule()
'定数の定義
Const FIRSTROW As Long = 2 'データ開始の行
Const CloseP_C As Long = 5 '終値の列数
Const SMA_S_C As Long = 6 '短期の単純移動平均線を出力する列
Const SMA_M_C As Long = 7 '中期の単純移動平均線を出力する列
Const SMA_L_C As Long = 8 '長期の単純移動平均線を出力する列
'変数の定義
Dim chartData As Variant 'チャートデータを格納する配列
Dim LastRow As Long '最終行を格納する変数
'アクティブワークシートの設定(シート名が、Sheet1のとき。シート名が違う場合は変更して下さい)
Worksheets("Sheet1").Select
'変数の初期化
LastRow = Cells(Cells(Rows.Count, 1).Row, 1).End(xlUp).Row '最終行の取得
'過去の計算データクリア
Range(Cells(FIRSTROW, SMA_L_C + 1), Cells(Rows.Count, SMA_L_C + 2)).Clear
'チャートデータの取得(年月日から終値のデータを取得)
chartData = Range(Cells(FIRSTROW, 1), Cells(LastRow, SMA_L_C))
'短期と中期のゴールデンクロスを判定しその結果を出力(1ならゴールデンクロス)
Range(Cells(FIRSTROW, SMA_L_C + 1), Cells(LastRow, SMA_L_C + 1)) = CrossOver(chartData, SMA_S_C, SMA_M_C)
'短期と中期のデッドクロスを判定しその結果を出力(1ならデッドクロス)
Range(Cells(FIRSTROW, SMA_L_C + 2), Cells(LastRow, SMA_L_C + 2)) = CrossOver(chartData, SMA_M_C, SMA_S_C)
End Sub
'2つの線がクロスオーバーしたかを判定する
Function CrossOver(chartData, Line1Num, Line2Num)
'変数の定義
Dim CDRowNum As Long
Dim RowNum As Long
Dim Result As Variant
'チャートデータの行方向の要素数の取得
CDRowNum = UBound(chartData, 1)
'結果を代入する配列の要素数の決定
ReDim Result(1 To CDRowNum, 1)
For RowNum = 2 To CDRowNum
If chartData(RowNum - 1, Line1Num) <> "" And chartData(RowNum - 1, Line2Num) <> "" Then
If chartData(RowNum - 1, Line1Num) < chartData(RowNum - 1, Line2Num) And chartData(RowNum, Line1Num) > chartData(RowNum, Line2Num) Then
Result(RowNum, 0) = 1
End If
End If
Next RowNum
CrossOver = Result
End Function
TradeRuleの概要
メインのプロシージャです。
定数はシートの列の位置を規定しています。列位置が変わってもここの数値を変更するだけで正常に動きます。
分析するデータが張り付けられているシート(Sheet1)をアクティブにしています。シート名を変更したときは、ここを変更してください。
既に計算データがあること想定して、データをクリアしています。
分析するデータの最終行もここで取得・設定しています。
分析するデータをセルから配列に格納しています。
CrossOverを呼び出して、ストキャスティクスの計算を実行し結果をシートに張り付けています。
CrossOverの概要
Line1がLine2を下から上に抜けたら「1」を配列に格納します。。
まずはチャートの行方向のデータ数を取得しています。
For文の中の1つめのif文では、価格データがあるかどうかを確認しています。
2つ目のifでは、ひとつ前の価格がLine1Numの方がLine2Numより小さくて、現在の価格がLine1Numの方がLine2Numより大きいかの判定を行います。
イメージは下の図の交差したのかの判定です。
まとめ
紹介したプログラムを使って日経225のSMAの短期と中期のゴールデンクロスとデットクロスの判定した結果をグラフにしました。
赤が短期のSMA、青が中期のSMAです。
ゴールデンクロスは青色の棒グラフ、デッドクロスは赤色の棒グラフとしています。
(値は1のため2軸で棒グラフで1となっています。)
ゴールデンクロスしている日は、ゴールデンクロスの青色の棒グラフが表示されているのが分かると思います。
デッドクロスしている日は、デッドクロスの赤色の棒グラフが表示されているのが分かると思います。
テクニカル分析の多くは、このCrossOverで判定できます。
他の指標を使ったテクニカル分析でもCrossOverを使って売買の判定ができます。