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
くる株・株ブログランキング
株・投資ランキング
スポンサーサイト



移動平均線用に計算します。

データ格納用の構造体です。

'移動平均線データ
Public Structure MovingAverageData

Dim day As Date '日付
Dim rate As Double '平均値

End Structure


算出するのは以下のロジックです。
前回作成した日足データを渡します。
日数毎で平均値を求めます。

'移動平均線算出
Private Function getMovingAverage(dailyData As List(Of DailyChartData), day As Integer) As Dictionary(Of Date, Double)

Dim averageData As New Dictionary(Of Date, Double) '日ごとの平均値を格納
Dim que = New Queue(Of Double)() '算出した平均値を一時的に格納
Dim averageDateData(day - 1) As Double '平均値の計算用

For Each tmpDailyData In dailyData

que.Enqueue(tmpDailyData.closeRate)

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

averageData.Add(tmpDailyData.day, que.Average)
que.Dequeue()
Next

Return averageData

End Function


以下でそれぞれの平均値を作成します。

'補助データの作成
Dim averageData_3 As Dictionary(Of Date, Double) = getMovingAverage(chartData, 3) '3日平均
Dim averageData_25 As Dictionary(Of Date, Double) = getMovingAverage(chartData, 25) '25日平均
Dim averageData_75 As Dictionary(Of Date, Double) = getMovingAverage(chartData, 27) '75日平均


ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
日足データを使ったバックテスト用ツールを作成します。

https://www.m2j.co.jp/market/historical.php
から、USD/JPYの日足データのCSVをダウンロードします。

1行目はデータに関係ないので、テキストエディタで消します。

ダイアログでファイルを選択し、CSVファイルから読み込んで内部変数に取得するプログラムです。

データを格納する構造体は以下になります。

'日足データ
Public Structure DailyChartData

Dim day As Date '日付
Dim openRate As Double '始値
Dim highPrice As Double '高値
Dim lowPrice As Double '安値
Dim closeRate As Double '終値

End Structure


データを取得するメソッドは以下になります。

Private Function DataLoad() As List(Of DailyChartData)

'ダイアログを表示してファイルパスを取得
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 List(Of DailyChartData)
Using parser = New FileIO.TextFieldParser(filePath, System.Text.Encoding.GetEncoding("Shift-JIS"))
parser.Delimiters = New String() {","}
While Not parser.EndOfData
Dim lineData As New DailyChartData
Dim fields() = parser.ReadFields()
With lineData
.day = CDate(fields(0))
.openRate = CDbl(fields(1))
.highPrice = CDbl(fields(2))
.lowPrice = CDbl(fields(3))
.closeRate = CDbl(fields(4))
End With
data.Add(lineData)
End While
End Using

Return data

End Function


ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
FX関係のツールを作ろうと思い、日足の過去データが取得できるサイトを探してみました。

https://www.tfx.co.jp/historical/fx/
https://www.m2j.co.jp/market/historical.php

ここでCSV形式でダウンロードできました。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
DMM.com証券のFX口座を開設したので、早速取引してみました。

良かった点
・スプレッド(USD/JP)が0銭~をうたっているだけあって、実際他の証券会社と比べて安目だった。

悪かった点
・Ajax?なのか、画面の操作がしにくかった。
・金額が上下したときの点滅がぴかぴかしてみにくい。
・返済注文がどこにあるかわからなかった。
 (子ウィンドウを大きくしないと返済操作が見えず、ないないーっとおろおろしてるうちに数千円損した)

まぁデザインなどの見た目や操作がちょっとイマイチでしたが、まぁ慣れでしょう。
レスポンスはADSL回線でもすんなりとは行きました。
ちかちかして見にくいのはちょっと・・・
あとはスプレッドが安いのはいいです。短期売買にはいいと思います。

しかし返済が行えずにおろおろしてるうちに数千円損したのは痛かった・・・
まぁ1万円のキャッシュバックがあるから今のところはプラスですけどね。


ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
FXの口座をもう1つ開設しました。マネーパートナーズ です。
口座開設後のログインで3000円、10万円以上の入金でさらに2000円もらえるので・・・。

証券会社をいくつか試してみて、使いやすさ、スプレッド、スワップなどを考慮して、どこを使うか決めたいと思います。
自分的には長期のスワップ狙いと思っているですが、ちょくちょくと試しているうちにギャンブルっ気がでてきてしまいますね・・・。やっぱり短期売買は楽しい。

ちなみに、iPhone用のFXチャートアプリ「Simplex FX」はマネーパートナーズ のレートを使っています。
これが無料なのにむちゃくちゃかっこいい画面です。(こんな感じ)
iPhone使いはぜひインストールしてみましょう。




ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
そろそろ再び円高にならないかなと思っていたりするので、そのときの為にFXの口座を開設しようと思います。
ド素人の考えですが、ドルがまた80円台になったら買いなんじゃないかなーと。

FXの証券会社を探してみたところ、口座を開設して1取引すればキャンペーンで10000円ほどもらえるところがあったりするみたいなので、実際メインで使うかどうかは別として、開設してみようと思います。

こことか

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング