search
LoginSignup
0
Help us understand the problem. What are the problem?

posted at

updated at

【v15】マージしたチャートデータからテクニカル指標を計算する(SMA6,SMA12,SMA24編)

はじめに

過去記事は「auカブコム証券のkabuステーションREST APIに関する記事一覧」。

18番目の記事で過去データと最新データをマージしたファイルが出来たので、その終値からテクニカル指標を計算して表示します。
まずは、最も簡単な感じの単純移動平均(5分足の6本、12本、24本)です。

ロジック

SMA6なら、カレント位置と過去5本の平均を計算するだけです。
2重ループでも大して時間はかかりませんが、7番目以降は自分price[cur]を足して、6個前price[cur-6]を引きます。

			ChartInfo ci = chartList.get(i);
			if (cnt6 < 6) {
				sum6 += ci.closePrice;
				cnt6++;
			} else {
				sum6 += ci.closePrice - chartList.get(i - 6).closePrice;
			}

実行結果

2022/05/07 05:00:00,26876.67,26830.83,26818.54
2022/05/07 05:05:00,26870.83,26837.92,26821.67
2022/05/07 05:10:00,26866.67,26843.33,26822.50
2022/05/07 05:15:00,26860.00,26848.33,26823.96
2022/05/07 05:20:00,26856.67,26856.67,26825.83
2022/05/07 05:25:00,26849.17,26860.83,26827.71
2022/05/07 05:30:00,26850.00,26863.33,26830.21
2022/05/07 05:35:00,26848.33,26859.58,26832.71
2022/05/07 05:40:00,26849.17,26857.92,26835.42
2022/05/07 05:45:00,26846.67,26853.33,26836.04
2022/05/07 05:50:00,26842.50,26849.58,26835.21
2022/05/07 06:00:00,26835.00,26842.08,26835.21

ここで、05:50まではざっとチャート画面と比較してだいたい合っていますが、06:00がチャート画面と異なります。

2022/05/07 06:00:00,26830.00,26840.42,26835.62

SMA6が5違うということは、きっと05:55も計算に入っているのだろう・・・ということで、ChartData.txtをテキストエディタで編集して、05:50:00と同じ値で追加します。

再度実行すると、ほぼ同じ値となります。
なお、チャート画面の05:55を確認したら、4本値は空欄で、SMAだけ表示されていて、こちらも同じ値でした。

2022/05/07 05:50:00,26842.50,26849.58,26835.21
2022/05/07 05:55:00,26839.17,26844.17,26836.25
2022/05/07 06:00:00,26830.83,26840.42,26835.63

chart_20220507

※5/7の翌営業日→5/9

追記:05:55が抜けているチャートデータをflag=3で埋める。

マージされたCSVはそのままとする。
05:50:00が存在し、05:55:00が存在しない場合は、flag=3として05:50:00の値をコピーする。

可能性としては、他の時刻でも抜ける場合があるが、いまターゲットとしている対象ではまず有り得ないことと、テストケースが多数あるため、対応する必要が出てくるまで何もしない。

実行結果の確認のため、終値とflagも追加する。
4/26は元々存在した場合、5/7は後からコピーした場合。

2022/04/26 05:50:00,26835,1,26830.83,26818.33,26768.96
2022/04/26 05:55:00,26830,1,26830.83,26821.25,26775.00
2022/04/26 06:00:00,26825,1,26832.50,26821.67,26783.96

2022/05/07 05:50:00,26825,2,26842.50,26849.58,26835.21
2022/05/07 05:55:00,26825,3,26839.17,26844.17,26836.25
2022/05/07 06:00:00,26800,2,26830.83,26840.42,26835.63

追記:2重ループ版

作成する順番が逆だが、2重ループ版で作成し、同じ条件の出力結果を比較して検算する。

			ChartInfo ci = chartList.get(i);
			System.out.printf("%s,%d,%d", ci.date, ci.closePrice, ci.flag);
			if (i >= 5) {
				int sum = 0;
				int cnt = 0;
				for (int j = i; j > i - 6; j--) {
					ChartInfo ci2 = chartList.get(j);
					sum += ci2.closePrice;
					cnt++;
				}
				System.out.printf(",%.2f", ((double) sum / cnt));
			}

追記:ソースをarchiveブランチへ移動

最新版に移行し、もう使われることはないので、アーカイブする。

githubソース

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0
Help us understand the problem. What are the problem?