アフィリエイト広告を利用しています

広告

posted by fanblog

広告

posted by fanblog
2013年08月01日
第12回 一目均衡表


(1) 一目均衡表の計算式

転換線=9日間の中間値
基準線=26日間の中間値
先行スパン1=(転換値+基準値)÷2を25日先にシフト
先行スパン2 =52日間の中間値を25日先にシフト
遅行スパン=終値を25日前にシフト

雲=先行スパン1と先行スパン2で囲まれた領域
中間値=(その期間の最高値+その期間の最安値)÷2
「25日先にシフト」は「当日を含めて26日先にシフト」と同じ意味
「25日前にシフト」は「当日を含めて26日前にシフト」と同じ意味

(2) 画像をシフト

Private Sub シフトして余白期間作成(ch, シフト期間)

For Each sr In ch.SeriesCollection
  v = sr.Values
  n = UBound(v)
  For i = 1 To n - シフト期間
    v(i) = v(i + シフト期間)
    If sr.HasDataLabels Then sr.DataLabels(i).Text = sr.DataLabels(i + シフト期間).Text
  Next i
  For i = i To n
    v(i) = Empty
    If sr.HasDataLabels Then sr.DataLabels(i).Text = ""
  Next i
  sr.Values = v
Next sr

v = ch.Axes(xlCategory).CategoryNames
n = UBound(v)
For i = 1 To n - シフト期間
  v(i) = v(i + シフト期間)
Next i
For i = i To n
  v(i) = ""
Next i
ch.Axes(xlCategory).CategoryNames = v

End Sub


一目均衡表は25日先までのグラフを表示するので既に描画したローソク足やX軸等を25日分、左にシフトします。空白になる25日分の series オブジェクトの values の各要素には Empty をセットします。

(3) 雲の描画

Sub 雲描画(ch, 先行スパン1配列, 先行スパン2配列)

n = UBound(先行スパン1配列)
ReDim 差分配列(1 To n, 1 To 1)

For i = 1 To n
   差分配列(i, 1) = 先行スパン1配列(i, 1) - 先行スパン2配列(i, 1)
Next i

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlAreaStacked
sr.Values = 先行スパン2配列
sr.Name = "先行スパン2-2"
sr.Format.Fill.Visible = False

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlAreaStacked
sr.Values = 差分配列
sr.Name = "雲"
sr.Format.Fill.ForeColor.RGB = RGB(192, 192, 192)

End Sub


積み上げ面グラフを使って雲を表示します。

先行スパン1配列から先行スパン2配列を引いた差分配列を作ります。プラスの数値とマイナスの数値が混在していますが、そのまま使えます。

最初に先行スパン2配列をChartType = xlAreaStacked で表示します。Format.Fill.Visible = False で先行スパン2の領域を非表示にします。
次に差分配列をChartType = xlAreaStacked で表示します。先行スパン2の上に「先行スパン1と先行スパン2の差分」が積み上がったグラフが作成されますが、土台のグラフである先行スパン2を非表示にしたため雲の部分のみが表示されます。

(4) 一目均衡表の計算

(4-1) メーンルーチン

Private Sub 一目均衡表算出(データ配列, 実表示本数, シフト期間, 転換線配列, 基準線配列, 先行スパン1配列, 先行スパン2配列, 遅行スパン配列)

終了行 = UBound(データ配列, 1)

ReDim 転換線配列(1 To 実表示本数, 1 To 1)
ReDim 基準線配列(1 To 実表示本数, 1 To 1)
ReDim 先行スパン1配列(1 To 実表示本数, 1 To 1)
ReDim 先行スパン2配列(1 To 実表示本数, 1 To 1)
ReDim 遅行スパン配列(1 To 実表示本数, 1 To 1)

開始行 = 終了行 - 実表示本数 + 1
開始行 = 開始行 + シフト期間

j = 1
For i = 開始行 To 終了行
   転換線配列(j, 1) = 期間中間値算出(データ配列, 転換線期間, i)
   基準線配列(j, 1) = 期間中間値算出(データ配列, 基準線期間, i)
   j = j + 1
Next i

j = 1
For i = 開始行 - 先行期間 + 1 To 終了行
   先行スパン1配列(j, 1) = (期間中間値算出(データ配列, 転換線期間, i) + 期間中間値算出(データ配列, 基準線期間, i)) / 2
   先行スパン2配列(j, 1) = 期間中間値算出(データ配列, 先行スパン2期間, i)
   j = j + 1
Next i

j = 1
For i = 開始行 + 遅行期間 - 1 To 終了行
   遅行スパン配列(j, 1) = データ配列(i, データの終値)
   j = j + 1
Next i

End Sub


(4-2) 中間値の計算

Private Function 期間中間値算出(データ配列, 周期, 終了行)

期間 = 周期
開始行 = 終了行 - 期間 + 1
If 開始行 < 1 Then 開始行 = 1

高値 = データ配列(終了行, データの高値)
安値 = データ配列(終了行, データの安値)

For i = 開始行 To 終了行 - 1
If 高値 < データ配列(i, データの高値) Then 高値 = データ配列(i, データの高値)
If 安値 > データ配列(i, データの安値) Then 安値 = データ配列(i, データの安値)
Next i

期間中間値算出 = (高値 + 安値) / 2

End Function


(5) 一目均衡表の表示

Sub 一目均衡表表示(ch, データ配列, 実表示本数)

シフトして余白期間作成 ch, 先行期間 - 1

一目均衡表算出 データ配列, 実表示本数, 先行期間 - 1, 転換線配列, 基準線配列, 先行スパン1配列, 先行スパン2配列, 遅行スパン配列

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 転換線配列
sr.Name = "転換線"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 基準線配列
sr.Name = "基準線"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 先行スパン1配列
sr.Name = "先行スパン1"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 先行スパン2配列
sr.Name = "先行スパン2"

Set sr = ch.SeriesCollection.NewSeries
sr.ChartType = xlLine
sr.Values = 遅行スパン配列
sr.Name = "遅行スパン"

雲描画 ch, 先行スパン1配列, 先行スパン2配列

End Sub


(6) プロパティシートの設定



B8セルをTRUEにすると一目均衡表が表示されます。



エクセルファイルです。

    ダウンロード


前へ   次へ


Posted by vbafan at 13:10 | この記事のURL
この記事のURL

×

この広告は30日以上新しい記事の更新がないブログに表示されております。