FC2ブログ
現役プログラマー村健の、投資に役立つプログラムを作るための勉強ブログです。 自動売買、システムトレードに挑戦!します。 勉強と習得の成果を記録です。
本ブログについて
本ブログは、プログラマー観点で投資への対費用効果を上げるために何ができるか?を考えていくブログです。
基本的には、ツール作成・公開、投資に関わるプログラム情報、最終的には 完全なる自動売買を目指しています。

現在、HPの方で現在作成中のツールや発注ロジックなどを公開中です。
ゴールデンクロスを検出するプログラムを作りました。
ついでにデータの保持に可用性持たせるため、構造体ではなくListを使うように変更しました。

メイン処理の抜粋

'データの読み込み
Dim chartData As SortedDictionary(Of Date, Dictionary(Of String, Object)) = DataLoad()
If chartData Is Nothing Then
MsgBox("データ読み込みエラー")
Return
End If

'補助データの作成
'移動平均
_SetMovingAverage(chartData, 3) '3日平均
_SetMovingAverage(chartData, 25) '25日平均
_SetMovingAverage(chartData, 75) '75日平均
'ゴールデンクロス



'データ読み込み
Private Function DataLoad() As SortedDictionary(Of Date, Dictionary(Of String, Object))

'ダイアログを表示してファイルパスを取得
Dim filePath As String
Dim dialog As New OpenFileDialog
Dim result As DialogResult = dialog.ShowDialog()
If result = System.Windows.Forms.DialogResult.OK Then
filePath = dialog.FileName
Else
Return Nothing
End If

'ファイルを開いてCSVデータを取得する
Dim data As New SortedDictionary(Of Date, Dictionary(Of String, Object))
Using parser = New FileIO.TextFieldParser(filePath, System.Text.Encoding.GetEncoding("Shift-JIS"))
parser.Delimiters = New String() {","}
While Not parser.EndOfData
Dim lineData As New Dictionary(Of String, Object)
Dim fields() = parser.ReadFields()
With lineData
.Add(_DATANAME_OPEN_RATE, CDbl(fields(1)))
.Add(_DATANAME_HIGH_PRICE, CDbl(fields(2)))
.Add(_DATANAME_LOW_PRICE, CDbl(fields(3)))
.Add(_DATANAME_CLOSE_RATE, CDbl(fields(4)))
End With
data.Add(CDate(fields(0)), lineData)
End While
End Using

Return data

End Function



'移動平均線算出
Private Sub _SetMovingAverage(dailyData As SortedDictionary(Of Date, Dictionary(Of String, Object)), day As Integer)

Dim que = New Queue(Of Double)() '算出した平均値を一時的に格納
Dim dataColName As String = String.Format(_DATANAME_MOVING_AVERAGE, day)
For Each tmpDailyKey In dailyData.Keys

que.Enqueue((dailyData(tmpDailyKey))(_DATANAME_CLOSE_RATE))

'平均値算出日数に達していない場合
If que.Count < day Then
dailyData(tmpDailyKey).Add(dataColName, 0) 'この日のデータは0値として格納
Continue For
End If

dailyData(tmpDailyKey).Add(dataColName, que.Average)
que.Dequeue()
Next

End Sub



'ゴールデンクロス
'0:何もなし、1:ゴールデンクロス、-1:デッドクロス
Private Sub _SetGoldenCloss(dailyData As SortedDictionary(Of Date, Dictionary(Of String, Object)), minDay As Integer, bigDay As Integer)

'大小の関係がおかしければ
If minDay >= bigDay Then
Throw New Exception()
End If

Dim dataColName As String = String.Format(_DATANAME_GOLDENCROSS, minDay, bigDay)
Dim beforeMinDayPrice As Double = 0
Dim afterMinDayPrice As Double = 0
Dim beforeBigDayPrice As Double = 0
Dim afterBigDayPrice As Double = 0

For Each tmpDailyKey In dailyData.Keys

beforeMinDayPrice = afterMinDayPrice
beforeBigDayPrice = afterBigDayPrice

afterMinDayPrice = (dailyData(tmpDailyKey))(String.Format(_DATANAME_MOVING_AVERAGE, minDay))
afterBigDayPrice = (dailyData(tmpDailyKey))(String.Format(_DATANAME_MOVING_AVERAGE, bigDay))

'0値は無効としてスルー
If beforeMinDayPrice = 0 OrElse afterMinDayPrice = 0 OrElse beforeBigDayPrice = 0 OrElse afterBigDayPrice = 0 Then
dailyData(tmpDailyKey).Add(dataColName, 0)
Continue For
End If

'ゴールデンクロス
'デッドクロス
If afterMinDayPrice >= afterBigDayPrice AndAlso beforeMinDayPrice < beforeBigDayPrice Then
dailyData(tmpDailyKey).Add(dataColName, 1)
ElseIf afterMinDayPrice <= afterBigDayPrice AndAlso beforeMinDayPrice > beforeBigDayPrice Then
dailyData(tmpDailyKey).Add(dataColName, -1)
Else
dailyData(tmpDailyKey).Add(dataColName, 0)
End If

Next

End Sub

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
https://investprogrammers.blog.fc2.com/tb.php/299-8cda24ea
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック