トレンドをつかむためのカウンティングプログラム

金融のデータ分析でOpen、High、Low、Close、Volumeのデータに対応したデータに対して、トレンドをつかむためのカウンティング機能を実装しました。

```Trade.cls

Function Counting(ByRef DOHLCV_Last As Variant, ByRef DOHLCV_Previous As Variant) As Long
'#####################################################################################################################################################
'関数  :   Counting
'機能  :   以下によってカウンティング結果を算出する。(値が大きい場合上昇トレンド、値が小さい場合は下落トレンド)
'          また、以下について、大きくない程度の変化率(0.5%)に留まる場合は、カウントは「0」とする。
'          陽線 +1 ⇔ 陰線 -1
'          終値が前日比プラス +1 ⇔ 終値が前日比マイナス -1
'          高値が切り上がっている +1 ⇔ 高値が切り上がっていない -1
'          安値が切り上がっている +1 ⇔ 安値が切り上がっていない -1
'          [特別カウント]
'          大陽線は更に+1 ⇔ 大陰線は更に-1 (ローソク足の実体が大きい ⇒ 当日の終値 - 当日の始値が 3%上昇もしくは下落)
'          窓開け上方+1  ⇔ 窓開け下方-1
'
'返り値:   カウンティング結果を返す
'#####################################################################################################################################################
 
 Const Multiplier = 1.005
 Const SpecialMultiplier = 1.03
 Const MinusMultiplier = 0.995
 Const MinusSpecialMultiplier = 0.97
 Const OPENPRICE = 1
 Const HIGHPRICE = 2
 Const LOWPRICE = 3
 Const CLOSEPRICE = 4
 Dim CountingOutcome As Long
 
 
 CountingOutcome = 0


 '陽線 +1 ⇔ 陰線 -1
 '[特別カウント] 大陽線は更に+1 ⇔ 大陰線は更に-1
 If DOHLCV_Last(OPENPRICE).Value * Multiplier < DOHLCV_Last(CLOSEPRICE).Value Then
     If DOHLCV_Last(OPENPRICE).Value * SpecialMultiplier < DOHLCV_Last(CLOSEPRICE).Value Then
         CountingOutcome = CountingOutcome + 2
     Else
         CountingOutcome = CountingOutcome + 1
     End If
 ElseIf DOHLCV_Last(OPENPRICE).Value * MinusMultiplier > DOHLCV_Last(CLOSEPRICE).Value Then
     If DOHLCV_Last(OPENPRICE).Value * MinusSpecialMultiplier > DOHLCV_Last(CLOSEPRICE).Value Then
         CountingOutcome = CountingOutcome - 2
     Else
         CountingOutcome = CountingOutcome - 1
     End If
 End If
Debug.Print ("OPENPRICE: " & DOHLCV_Last(OPENPRICE).Value * Multiplier)
Debug.Print ("CLOSEPRICE: " & DOHLCV_Last(CLOSEPRICE).Value)
 
 '終値が前日比プラス +1 ⇔ 終値が前日比マイナス -1
 If DOHLCV_Previous(CLOSEPRICE).Value * Multiplier < DOHLCV_Last(CLOSEPRICE).Value Then
     CountingOutcome = CountingOutcome + 1
 ElseIf DOHLCV_Previous(CLOSEPRICE).Value * MinusMultiplier > DOHLCV_Last(CLOSEPRICE).Value Then
     CountingOutcome = CountingOutcome - 1
 End If
 

 '高値が切り上がっている +1 ⇔ 高値が切り上がっていない -1
 If DOHLCV_Previous(HIGHPRICE).Value * Multiplier < DOHLCV_Last(HIGHPRICE).Value Then
     CountingOutcome = CountingOutcome + 1
 ElseIf DOHLCV_Previous(HIGHPRICE).Value * MinusMultiplier > DOHLCV_Last(HIGHPRICE).Value Then
     CountingOutcome = CountingOutcome - 1
 End If
 
 
 '安値が切り上がっている +1 ⇔ 安値が切り上がっていない -1
 If DOHLCV_Previous(LOWPRICE).Value * Multiplier < DOHLCV_Last(LOWPRICE).Value Then
     CountingOutcome = CountingOutcome + 1
 ElseIf DOHLCV_Previous(LOWPRICE).Value * MinusMultiplier > DOHLCV_Last(LOWPRICE).Value Then
     CountingOutcome = CountingOutcome - 1
 End If
 
 
 '[特別カウント]窓開け上方+1  ⇔ 窓開け下方-1
 If DOHLCV_Previous(HIGHPRICE).Value * Multiplier < DOHLCV_Last(LOWPRICE).Value Then
     CountingOutcome = CountingOutcome + 1
 ElseIf DOHLCV_Last(LOWPRICE).Value * MinusMultiplier > DOHLCV_Previous(HIGHPRICE).Value Then
     CountingOutcome = CountingOutcome - 1
 End If
 
 Counting = CountingOutcome
    
End Function
```
```StandardModule.bas
Public Function Counting(ByRef DOHLCV_Last As Variant, _
                         ByRef DOHLCV_Previous As Variant) As Long
    Dim Trade As Object: Set Trade = New TradeClass
    Counting = Trade.Counting(DOHLCV_Last, DOHLCV_Previous)
End Function

```