2013年07月25日
第2回 極大値極小値の表示
(1) 極大値の表示
Set sr = ch.SeriesCollection("高値")
sr.HasDataLabels = True
sr.DataLabels.Position = xlLabelPositionAbove
極大値はDataLabelsオブジェクトで表示します。
高値のSeriesオブジェクトのHasDataLabelsプロパティをTrueにします。
ローソク足の上に表示するためDataLabels.Position = xlLabelPositionAboveとします。
v = sr.Values
極大値配列 = 極大値配列算出(v, 最小間隔)
For i = 1 To UBound(v)
  If 極大値配列(i) = "極大値" Then
    sr.DataLabels(i).Text = v(i)
  Else
    sr.DataLabels(i).Text = ""
  End If
Next
各 DataLabels の Text に価格をセットします。極大値でないものは""をセットします。
(2) 極大値の算出
Private Function 極大値配列算出(データ配列, 最小間隔)
n = UBound(データ配列)
ReDim a(1 To n)
For i = 1 To n
  開始行 = i - 最小間隔
  終了行 = i + 最小間隔
  If 開始行 < 1 Then 開始行 = 1
  If 終了行 > n Then 終了行 = n
  For j = 開始行 To 終了行
   If データ配列(j) > データ配列(i) Then Exit For
  Next j
  If j > 終了行 Then a(i) = "極大値"
Next i
極大値配列算出 = a
End Function
極大値配列を算出する関数です。
入力引数はデータ配列と最小間隔です。
出力は極大値配列です。該当配列要素に"極大値"とセットされます。
近傍で最大のものが極大値になります。近傍の半径を最小間隔で与えています。
データ配列は高値配列です。
フォントサイズ = sr.DataLabels.Font.Size
チャート幅 = ch.Axes(xlCategory).Width
最小間隔 = Fix(フォントサイズ * 3 / (チャート幅 / 実表示本数)) + 1
If 最小間隔 < 6 Then 最小間隔 = 6
2つの極大値が重ならないように最小間隔を計算しています。"103.734" "1.34153" 等の数値を考えると極大値の最大文字数は7文字となります。その後半部分は3文字になります。最小間隔の計算においてフォントサイズ * 3をおこなっているのはそのためです。最後に最小間隔が小さくなり過ぎないように最小の最小間隔を6としています。最小間隔は近傍半径なので近傍直径は11になります。11=(6-1)*2+1です。
(3) 極小値の表示
Set sr = ch.SeriesCollection("安値")
sr.HasDataLabels = True
sr.DataLabels.Position = xlLabelPositionBelow
極大値と同様です。安値配列を対象としていることとローソク足の下に表示するため DataLabels.Position = xlLabelPositionBelow としているのが相違点です。
(4) 極小値の計算
Private Function 極小値配列算出(データ配列, 最小間隔)
n = UBound(データ配列)
ReDim a(1 To n)
For i = 1 To n
  開始行 = i - 最小間隔
  終了行 = i + 最小間隔
  If 開始行 < 1 Then 開始行 = 1
  If 終了行 > n Then 終了行 = n
 For j = 開始行 To 終了行
   If データ配列(j) < データ配列(i) Then Exit For
  Next j
  If j > 終了行 Then a(i) = "極小値"
Next i
極小値配列算出 = a
End Function
極小値配列を算出する関数です。
入力引数はデータ配列と最小間隔です。
出力は極小値配列です。該当配列要素に"極小値"とセットされます。
データ配列は安値配列です。
計算方法は極大値と同様です。
エクセルファイルです。
    ダウンロード
前へ   次へ
Set sr = ch.SeriesCollection("高値")
sr.HasDataLabels = True
sr.DataLabels.Position = xlLabelPositionAbove
極大値はDataLabelsオブジェクトで表示します。
高値のSeriesオブジェクトのHasDataLabelsプロパティをTrueにします。
ローソク足の上に表示するためDataLabels.Position = xlLabelPositionAboveとします。
v = sr.Values
極大値配列 = 極大値配列算出(v, 最小間隔)
For i = 1 To UBound(v)
  If 極大値配列(i) = "極大値" Then
    sr.DataLabels(i).Text = v(i)
  Else
    sr.DataLabels(i).Text = ""
  End If
Next
各 DataLabels の Text に価格をセットします。極大値でないものは""をセットします。
(2) 極大値の算出
Private Function 極大値配列算出(データ配列, 最小間隔)
n = UBound(データ配列)
ReDim a(1 To n)
For i = 1 To n
  開始行 = i - 最小間隔
  終了行 = i + 最小間隔
  If 開始行 < 1 Then 開始行 = 1
  If 終了行 > n Then 終了行 = n
  For j = 開始行 To 終了行
   If データ配列(j) > データ配列(i) Then Exit For
  Next j
  If j > 終了行 Then a(i) = "極大値"
Next i
極大値配列算出 = a
End Function
極大値配列を算出する関数です。
入力引数はデータ配列と最小間隔です。
出力は極大値配列です。該当配列要素に"極大値"とセットされます。
近傍で最大のものが極大値になります。近傍の半径を最小間隔で与えています。
データ配列は高値配列です。
フォントサイズ = sr.DataLabels.Font.Size
チャート幅 = ch.Axes(xlCategory).Width
最小間隔 = Fix(フォントサイズ * 3 / (チャート幅 / 実表示本数)) + 1
If 最小間隔 < 6 Then 最小間隔 = 6
2つの極大値が重ならないように最小間隔を計算しています。"103.734" "1.34153" 等の数値を考えると極大値の最大文字数は7文字となります。その後半部分は3文字になります。最小間隔の計算においてフォントサイズ * 3をおこなっているのはそのためです。最後に最小間隔が小さくなり過ぎないように最小の最小間隔を6としています。最小間隔は近傍半径なので近傍直径は11になります。11=(6-1)*2+1です。
(3) 極小値の表示
Set sr = ch.SeriesCollection("安値")
sr.HasDataLabels = True
sr.DataLabels.Position = xlLabelPositionBelow
極大値と同様です。安値配列を対象としていることとローソク足の下に表示するため DataLabels.Position = xlLabelPositionBelow としているのが相違点です。
(4) 極小値の計算
Private Function 極小値配列算出(データ配列, 最小間隔)
n = UBound(データ配列)
ReDim a(1 To n)
For i = 1 To n
  開始行 = i - 最小間隔
  終了行 = i + 最小間隔
  If 開始行 < 1 Then 開始行 = 1
  If 終了行 > n Then 終了行 = n
 For j = 開始行 To 終了行
   If データ配列(j) < データ配列(i) Then Exit For
  Next j
  If j > 終了行 Then a(i) = "極小値"
Next i
極小値配列算出 = a
End Function
極小値配列を算出する関数です。
入力引数はデータ配列と最小間隔です。
出力は極小値配列です。該当配列要素に"極小値"とセットされます。
データ配列は安値配列です。
計算方法は極大値と同様です。
エクセルファイルです。
    ダウンロード
前へ   次へ
【このカテゴリーの最新記事】
-
no image