質問編集履歴
25
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,23 +1,13 @@
|
|
1
1
|
### 前提
|
2
2
|
|
3
|
-
価格の時系列データを任意の時間間隔に区切って、その区間における始まりの値(始値)・最も高かった値(高値)・最も安かった値(安値)・区間の終わりの値(終値)を出力するプログラムを作っています。
|
4
|
-
時系列データには、時刻・価格の順に並んでいます。時刻は、hhmmsstttttt(時・分・秒・1マイクロ秒)で表されていてttttttは1マイクロ秒になっています。
|
5
|
-
|
3
|
+
価格の時系列データ
|
6
4
|
|
7
5
|
### 実現したいこと
|
8
|
-
プログラムの最初に任意の時間間隔での変数を設定して、それに伴って始値等を出力するプログラムを作りたいのですが、どうコードで表現すれば良いのか分からない状態です。
|
6
|
+
プログラムの最初に任意の時間間隔での変数を設定して、それに伴って始値等を出力するプログラムを作りたいのですが、どうコードで表現すれば良いのか分からない状態です。
|
9
|
-
例えば、最初に時間間隔の変数(単位は秒)として、180(=3分)と設定すると、3分間隔の始値等が出力され、0.1(=100000マイクロ秒)と設定すると、100000マイクロ秒間隔の始値等が出力されるプログラムを作りたいです。
|
10
7
|
|
11
8
|
### 発生している問題・エラーメッセージ
|
12
9
|
|
13
|
-
①時系列データには時刻がとんでいる場合もあり、その場合でも始値等を出力したいです。
|
14
10
|
|
15
|
-
②任意の時間間隔での、時刻の更新がわからない。
|
16
|
-
この問題が一番理解できず、困っています。12桁の整数で表される時刻を、任意の時間間隔でどのように更新していくのかが分からないです。
|
17
|
-
分・秒は上限が59である一方、1マイクロ秒は上限が999999です。時間間隔の設定によっては、秒ごとに時刻を更新したり、1マイクロ秒ごとに時刻を更新しないといけません。これらをどう考えてコードにすればよいでしょうか。
|
18
|
-
### 該当のソースコード
|
19
|
-
プログラム自体を組むのがまだ慣れていないため、プログラムでやりたいことを紙に書き出して、とりあえずそれらをプログラム中にコメントとして記入しました。
|
20
|
-
プログラム中のコメントにある四本値とは前提のところに書いた、その区間における始まりの値(始値)・最も高かった値(高値)・最も安かった値(安値)・区間の終わりの値(終値)、を表しています。
|
21
11
|
|
22
12
|
(追記)
|
23
13
|
回答していただいた内容を元に、プログラムを書いてみました。
|
@@ -26,115 +16,7 @@
|
|
26
16
|
①時刻の出力がおかしい。
|
27
17
|
|
28
18
|
|
29
|
-
以下にプログラムと実行画面を記載します。
|
30
|
-
```Fortran
|
31
|
-
program test2
|
32
|
-
implicit none
|
33
|
-
!変数の定義
|
34
|
-
integer(8) :: time, time0, endtime, hh, mm, ss, tttttt,&
|
35
|
-
& hh0, mm0, ss0, tttttt0, hh_e, mm_e, ss_e, tttttt_e
|
36
|
-
real(8) :: interval, interval0, price, opening, high,&
|
37
|
-
& low, closing
|
38
19
|
|
39
|
-
!時間間隔の初期設定(単位は秒)
|
40
|
-
interval = 1 !ここでは1秒を表す
|
41
|
-
!時間間隔をマイクロ秒換算
|
42
|
-
interval0 = (interval)*1000000
|
43
|
-
|
44
|
-
!最初のデータの時刻・価格
|
45
|
-
open(17, file='tick.dat', status='old')
|
46
|
-
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)') hh, mm, ss, tttttt, price
|
47
|
-
|
48
|
-
!最初の時刻をマイクロ秒換算
|
49
|
-
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
50
|
-
|
51
|
-
!開始時刻の初期化(開始時刻は9時丁度に設定)(マイクロ秒換算にする)
|
52
|
-
hh0 = 09
|
53
|
-
mm0 = 00
|
54
|
-
ss0 = 00
|
55
|
-
tttttt0 = 00
|
56
|
-
!マイクロ秒換算
|
57
|
-
time0 = ((hh0*60+mm0)*60+ss0)*1000000+tttttt0
|
58
|
-
|
59
|
-
!ファイル先頭に戻る
|
60
|
-
rewind(17)
|
61
|
-
|
62
|
-
!ファイル終端まで繰り返し
|
63
|
-
do
|
64
|
-
!四本値の初期化
|
65
|
-
!最後に読んだデータを四本値へ代入
|
66
|
-
opening = price
|
67
|
-
high = price
|
68
|
-
low = price
|
69
|
-
closing = price
|
70
|
-
|
71
|
-
!終了時刻の決定
|
72
|
-
endtime = time0 + interval0
|
73
|
-
|
74
|
-
!最後に読んだデータの時刻が終了時刻を超えるまで繰り返し更新
|
75
|
-
do while (time < endtime)
|
76
|
-
!最後に読んだデータの時刻・価格
|
77
|
-
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)', end=98) hh, mm, ss, tttttt, price
|
78
|
-
|
79
|
-
!現時刻をマイクロ秒換算
|
80
|
-
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
81
|
-
|
82
|
-
!時刻が終了時刻を超えてしまった場合、ループを抜ける
|
83
|
-
if (time > endtime) then
|
84
|
-
exit
|
85
|
-
end if
|
86
|
-
|
87
|
-
!高値・安値を最後に読んだデータの価格で更新
|
88
|
-
if (high < price) then !高値の更新
|
89
|
-
high = price
|
90
|
-
end if
|
91
|
-
|
92
|
-
if (low > price) then !安値の更新
|
93
|
-
low = price
|
94
|
-
end if
|
95
|
-
|
96
|
-
!最後に読んだデータの価格を終値へ代入
|
97
|
-
closing = price !終値の更新
|
98
|
-
|
99
|
-
!現時刻を元に戻して表示
|
100
|
-
hh = (time / 1000000) / 3600
|
101
|
-
mm = mod((time / 1000000),3600) / 60
|
102
|
-
ss = mod((time / 1000000), 60)
|
103
|
-
tttttt = mod(time, 1000000)
|
104
|
-
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm, ss, tttttt
|
105
|
-
end do
|
106
|
-
|
107
|
-
!終了時刻を元に戻す
|
108
|
-
!終了時刻・四本値を出力
|
109
|
-
hh_e = (endtime / 1000000) / 3600
|
110
|
-
mm_e = mod((endtime / 1000000),3600) / 60
|
111
|
-
ss_e = mod((endtime / 1000000), 60)
|
112
|
-
tttttt_e = mod(endtime, 1000000)
|
113
|
-
|
114
|
-
print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
|
115
|
-
& f10.4, /, "終値:", f10.4)', hh_e, mm_e, ss_e, tttttt_e, opening, high, low, closing
|
116
|
-
print * !時刻の境目に空行を入れる
|
117
|
-
|
118
|
-
!開始時刻の更新
|
119
|
-
time0 = time0 + interval0
|
120
|
-
end do
|
121
|
-
|
122
|
-
!ファイル終端の時刻・価格の出力
|
123
|
-
!時刻を元に戻す
|
124
|
-
98 hh = (endtime / 1000000) / 3600
|
125
|
-
mm = mod((endtime / 1000000),3600) / 60
|
126
|
-
ss = mod((endtime / 1000000), 60)
|
127
|
-
tttttt = mod(endtime, 1000000)
|
128
|
-
|
129
|
-
print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
|
130
|
-
& f10.4, /, "終値:", f10.4)', hh, mm, ss, tttttt, opening, high, low, closing
|
131
|
-
|
132
|
-
close(17)
|
133
|
-
stop
|
134
|
-
end program test2
|
135
|
-
|
136
|
-
|
137
|
-
```
|
138
20
|
|
139
21
|
### 試したこと
|
140
22
|
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。
|
24
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -11,14 +11,6 @@
|
|
11
11
|
### 発生している問題・エラーメッセージ
|
12
12
|
|
13
13
|
①時系列データには時刻がとんでいる場合もあり、その場合でも始値等を出力したいです。
|
14
|
-
例:
|
15
|
-
090000000000 200.1
|
16
|
-
090100367167 200.2
|
17
|
-
090300429828 200.3
|
18
|
-
090400000000 200.4
|
19
|
-
・
|
20
|
-
・
|
21
|
-
のように9時2分がとんでいますが、この場合の1分間隔での始値等は、前の時刻の価格になります。この場合も出力したいです。
|
22
14
|
|
23
15
|
②任意の時間間隔での、時刻の更新がわからない。
|
24
16
|
この問題が一番理解できず、困っています。12桁の整数で表される時刻を、任意の時間間隔でどのように更新していくのかが分からないです。
|
@@ -143,26 +135,8 @@
|
|
143
135
|
|
144
136
|
|
145
137
|
```
|
146
|
-
|
138
|
+
|
147
|
-
1秒間隔で出力しているはずが、1秒を超えた値が混ざってしまっている。
|
148
|
-
(856702までを出力したい。)
|
149
|
-

|
150
|
-
ファイル終端の時刻は11時30分ちょうどだが、1秒足した時刻まで出力してしまっている。
|
151
|
-

|
152
139
|
### 試したこと
|
153
|
-
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
|
154
|
-
|
140
|
+
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。
|
155
|
-
①変数の定義
|
156
|
-
②任意の時間間隔の設定(単位:秒 60(=1分) 120(=2分))
|
157
|
-
③ファイルを読み込んで、最初の時刻での価格を取得。
|
158
|
-
取得した価格を始値・高値・安値に代入する。
|
159
|
-
④時刻・四本値を求めるために繰り返しの処理に入る。
|
160
|
-
→⑤最初の時刻・価格を読み込む。
|
161
|
-
→⑥②で設定した任意の時間間隔だけ時刻を進める。
|
162
|
-
→⑦⑥で進めた時刻が現時刻より大きいor同じ時、四本値を更新。
|
163
|
-
→⑧⑥で進めた時刻が現時刻より小さい時、その時点での四本値を出力。
|
164
|
-
・
|
165
|
-
・
|
166
|
-
・
|
167
141
|
|
168
142
|
|
23
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -145,6 +145,7 @@
|
|
145
145
|
```
|
146
146
|
実行画面(最初の時刻からデータを表示しています。)
|
147
147
|
1秒間隔で出力しているはずが、1秒を超えた値が混ざってしまっている。
|
148
|
+
(856702までを出力したい。)
|
148
149
|

|
149
150
|
ファイル終端の時刻は11時30分ちょうどだが、1秒足した時刻まで出力してしまっている。
|
150
151
|

|
22
コードの編集
test
CHANGED
File without changes
|
test
CHANGED
@@ -87,6 +87,7 @@
|
|
87
87
|
!現時刻をマイクロ秒換算
|
88
88
|
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
89
89
|
|
90
|
+
!時刻が終了時刻を超えてしまった場合、ループを抜ける
|
90
91
|
if (time > endtime) then
|
91
92
|
exit
|
92
93
|
end if
|
21
コードの編集・実行画面の編集
test
CHANGED
File without changes
|
test
CHANGED
@@ -31,11 +31,12 @@
|
|
31
31
|
回答していただいた内容を元に、プログラムを書いてみました。
|
32
32
|
実行はされますが、問題点が1つあります。
|
33
33
|
|
34
|
-
①
|
34
|
+
①時刻の出力がおかしい。
|
35
|
+
|
35
36
|
|
36
37
|
以下にプログラムと実行画面を記載します。
|
37
38
|
```Fortran
|
38
|
-
program test
|
39
|
+
program test2
|
39
40
|
implicit none
|
40
41
|
!変数の定義
|
41
42
|
integer(8) :: time, time0, endtime, hh, mm, ss, tttttt,&
|
@@ -49,7 +50,7 @@
|
|
49
50
|
interval0 = (interval)*1000000
|
50
51
|
|
51
52
|
!最初のデータの時刻・価格
|
52
|
-
open(17, file='k
|
53
|
+
open(17, file='tick.dat', status='old')
|
53
54
|
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)') hh, mm, ss, tttttt, price
|
54
55
|
|
55
56
|
!最初の時刻をマイクロ秒換算
|
@@ -86,6 +87,10 @@
|
|
86
87
|
!現時刻をマイクロ秒換算
|
87
88
|
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
88
89
|
|
90
|
+
if (time > endtime) then
|
91
|
+
exit
|
92
|
+
end if
|
93
|
+
|
89
94
|
!高値・安値を最後に読んだデータの価格で更新
|
90
95
|
if (high < price) then !高値の更新
|
91
96
|
high = price
|
@@ -105,7 +110,8 @@
|
|
105
110
|
tttttt = mod(time, 1000000)
|
106
111
|
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm, ss, tttttt
|
107
112
|
end do
|
113
|
+
|
108
|
-
!終了時刻を元に戻
|
114
|
+
!終了時刻を元に戻す
|
109
115
|
!終了時刻・四本値を出力
|
110
116
|
hh_e = (endtime / 1000000) / 3600
|
111
117
|
mm_e = mod((endtime / 1000000),3600) / 60
|
@@ -132,12 +138,15 @@
|
|
132
138
|
|
133
139
|
close(17)
|
134
140
|
stop
|
135
|
-
end program test
|
141
|
+
end program test2
|
142
|
+
|
136
143
|
|
137
144
|
```
|
138
145
|
実行画面(最初の時刻からデータを表示しています。)
|
139
146
|
1秒間隔で出力しているはずが、1秒を超えた値が混ざってしまっている。
|
147
|
+

|
148
|
+
ファイル終端の時刻は11時30分ちょうどだが、1秒足した時刻まで出力してしまっている。
|
140
|
-

|
141
150
|
### 試したこと
|
142
151
|
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
|
143
152
|
以下、プログラムの流れを考えて紙に書き出した内容です。
|
20
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -136,6 +136,7 @@
|
|
136
136
|
|
137
137
|
```
|
138
138
|
実行画面(最初の時刻からデータを表示しています。)
|
139
|
+
1秒間隔で出力しているはずが、1秒を超えた値が混ざってしまっている。
|
139
140
|

|
140
141
|
### 試したこと
|
141
142
|
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
|
19
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -68,6 +68,7 @@
|
|
68
68
|
|
69
69
|
!ファイル終端まで繰り返し
|
70
70
|
do
|
71
|
+
!四本値の初期化
|
71
72
|
!最後に読んだデータを四本値へ代入
|
72
73
|
opening = price
|
73
74
|
high = price
|
18
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -73,9 +73,6 @@
|
|
73
73
|
high = price
|
74
74
|
low = price
|
75
75
|
closing = price
|
76
|
-
|
77
|
-
!現時刻をマイクロ秒換算
|
78
|
-
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
79
76
|
|
80
77
|
!終了時刻の決定
|
81
78
|
endtime = time0 + interval0
|
17
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -108,7 +108,7 @@
|
|
108
108
|
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm, ss, tttttt
|
109
109
|
end do
|
110
110
|
!終了時刻を元に戻して出力
|
111
|
-
!時刻・四本値を出力
|
111
|
+
!終了時刻・四本値を出力
|
112
112
|
hh_e = (endtime / 1000000) / 3600
|
113
113
|
mm_e = mod((endtime / 1000000),3600) / 60
|
114
114
|
ss_e = mod((endtime / 1000000), 60)
|
16
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -107,7 +107,7 @@
|
|
107
107
|
tttttt = mod(time, 1000000)
|
108
108
|
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm, ss, tttttt
|
109
109
|
end do
|
110
|
-
!
|
110
|
+
!終了時刻を元に戻して出力
|
111
111
|
!時刻・四本値を出力
|
112
112
|
hh_e = (endtime / 1000000) / 3600
|
113
113
|
mm_e = mod((endtime / 1000000),3600) / 60
|
15
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -27,12 +27,11 @@
|
|
27
27
|
プログラム自体を組むのがまだ慣れていないため、プログラムでやりたいことを紙に書き出して、とりあえずそれらをプログラム中にコメントとして記入しました。
|
28
28
|
プログラム中のコメントにある四本値とは前提のところに書いた、その区間における始まりの値(始値)・最も高かった値(高値)・最も安かった値(安値)・区間の終わりの値(終値)、を表しています。
|
29
29
|
|
30
|
-
(追記
|
30
|
+
(追記)
|
31
31
|
回答していただいた内容を元に、プログラムを書いてみました。
|
32
|
-
実行はされますが、問題点が
|
32
|
+
実行はされますが、問題点が1つあります。
|
33
|
-
|
33
|
+
|
34
|
-
②マイクロ秒換算した時刻を元に戻すタイミングが分からない。(プログラム中に、ここで元に戻して出力するのかな、という位置にコメントしました。)
|
35
|
-
|
34
|
+
①価格が正しく更新されていない。
|
36
35
|
|
37
36
|
以下にプログラムと実行画面を記載します。
|
38
37
|
```Fortran
|
@@ -40,7 +39,7 @@
|
|
40
39
|
implicit none
|
41
40
|
!変数の定義
|
42
41
|
integer(8) :: time, time0, endtime, hh, mm, ss, tttttt,&
|
43
|
-
& hh0, mm0, ss0, tttttt0
|
42
|
+
& hh0, mm0, ss0, tttttt0, hh_e, mm_e, ss_e, tttttt_e
|
44
43
|
real(8) :: interval, interval0, price, opening, high,&
|
45
44
|
& low, closing
|
46
45
|
|
@@ -52,6 +51,9 @@
|
|
52
51
|
!最初のデータの時刻・価格
|
53
52
|
open(17, file='kakaku.dat', status='old')
|
54
53
|
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)') hh, mm, ss, tttttt, price
|
54
|
+
|
55
|
+
!最初の時刻をマイクロ秒換算
|
56
|
+
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
55
57
|
|
56
58
|
!開始時刻の初期化(開始時刻は9時丁度に設定)(マイクロ秒換算にする)
|
57
59
|
hh0 = 09
|
@@ -72,11 +74,11 @@
|
|
72
74
|
low = price
|
73
75
|
closing = price
|
74
76
|
|
77
|
+
!現時刻をマイクロ秒換算
|
78
|
+
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
79
|
+
|
75
80
|
!終了時刻の決定
|
76
81
|
endtime = time0 + interval0
|
77
|
-
|
78
|
-
!現時刻をマイクロ秒換算
|
79
|
-
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
80
82
|
|
81
83
|
!最後に読んだデータの時刻が終了時刻を超えるまで繰り返し更新
|
82
84
|
do while (time < endtime)
|
@@ -103,17 +105,17 @@
|
|
103
105
|
mm = mod((time / 1000000),3600) / 60
|
104
106
|
ss = mod((time / 1000000), 60)
|
105
107
|
tttttt = mod(time, 1000000)
|
106
|
-
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm
|
108
|
+
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm, ss, tttttt
|
107
109
|
end do
|
108
110
|
!現時刻を元に戻して出力
|
109
111
|
!時刻・四本値を出力
|
110
|
-
hh = (time / 1000000) / 3600
|
112
|
+
hh_e = (endtime / 1000000) / 3600
|
111
|
-
mm = mod((time / 1000000),3600) / 60
|
113
|
+
mm_e = mod((endtime / 1000000),3600) / 60
|
112
|
-
ss = mod((time / 1000000), 60)
|
114
|
+
ss_e = mod((endtime / 1000000), 60)
|
113
|
-
tttttt = mod(time, 1000000)
|
115
|
+
tttttt_e = mod(endtime, 1000000)
|
114
116
|
|
115
117
|
print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
|
116
|
-
& f10.4, /, "終値:", f10.4)', hh, mm, ss, tttttt, opening, high, low, closing
|
118
|
+
& f10.4, /, "終値:", f10.4)', hh_e, mm_e, ss_e, tttttt_e, opening, high, low, closing
|
117
119
|
print * !時刻の境目に空行を入れる
|
118
120
|
|
119
121
|
!開始時刻の更新
|
@@ -136,7 +138,7 @@
|
|
136
138
|
|
137
139
|
```
|
138
140
|
実行画面(最初の時刻からデータを表示しています。)
|
139
|
-

|
140
142
|
### 試したこと
|
141
143
|
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
|
142
144
|
以下、プログラムの流れを考えて紙に書き出した内容です。
|
14
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -29,11 +29,11 @@
|
|
29
29
|
|
30
30
|
(追記 2022年12月22日18:02)
|
31
31
|
回答していただいた内容を元に、プログラムを書いてみました。
|
32
|
-
実行はされますが、問題点が
|
32
|
+
実行はされますが、問題点が3つあります。
|
33
33
|
①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
|
34
34
|
②マイクロ秒換算した時刻を元に戻すタイミングが分からない。(プログラム中に、ここで元に戻して出力するのかな、という位置にコメントしました。)
|
35
35
|
③価格を更新しているはずが、更新されていない。
|
36
|
-
|
36
|
+
|
37
37
|
以下にプログラムと実行画面を記載します。
|
38
38
|
```Fortran
|
39
39
|
program test
|
13
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -39,27 +39,32 @@
|
|
39
39
|
program test
|
40
40
|
implicit none
|
41
41
|
!変数の定義
|
42
|
-
integer(8) :: time, time0, endtime, hh, mm, ss, tttttt
|
42
|
+
integer(8) :: time, time0, endtime, hh, mm, ss, tttttt,&
|
43
|
+
& hh0, mm0, ss0, tttttt0
|
43
|
-
real(8) :: interval, interval0, price, opening, high,
|
44
|
+
real(8) :: interval, interval0, price, opening, high,&
|
45
|
+
& low, closing
|
44
46
|
|
45
47
|
!時間間隔の初期設定(単位は秒)
|
46
|
-
interval =
|
48
|
+
interval = 1 !ここでは1秒を表す
|
47
49
|
!時間間隔をマイクロ秒換算
|
48
|
-
interval0 =(interval)*1000000
|
50
|
+
interval0 = (interval)*1000000
|
49
51
|
|
50
|
-
!最初のデータの時刻
|
52
|
+
!最初のデータの時刻・価格
|
51
53
|
open(17, file='kakaku.dat', status='old')
|
52
54
|
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)') hh, mm, ss, tttttt, price
|
53
55
|
|
54
|
-
|
55
|
-
!開始時刻の初期化(開始時刻は
|
56
|
+
!開始時刻の初期化(開始時刻は9時丁度に設定)(マイクロ秒換算にする)
|
57
|
+
hh0 = 09
|
58
|
+
mm0 = 00
|
59
|
+
ss0 = 00
|
60
|
+
tttttt0 = 00
|
61
|
+
!マイクロ秒換算
|
56
|
-
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
62
|
+
time0 = ((hh0*60+mm0)*60+ss0)*1000000+tttttt0
|
57
|
-
time0 = time
|
58
63
|
|
59
64
|
!ファイル先頭に戻る
|
60
65
|
rewind(17)
|
61
66
|
|
62
|
-
!ファイル
|
67
|
+
!ファイル終端まで繰り返し
|
63
68
|
do
|
64
69
|
!最後に読んだデータを四本値へ代入
|
65
70
|
opening = price
|
@@ -70,28 +75,46 @@
|
|
70
75
|
!終了時刻の決定
|
71
76
|
endtime = time0 + interval0
|
72
77
|
|
78
|
+
!現時刻をマイクロ秒換算
|
79
|
+
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
80
|
+
|
73
|
-
!最後に読んだデータの時刻が終了時刻を超えるまで繰り返し
|
81
|
+
!最後に読んだデータの時刻が終了時刻を超えるまで繰り返し更新
|
74
|
-
do while (time
|
82
|
+
do while (time < endtime)
|
75
|
-
!最後に読んだデータの時刻
|
83
|
+
!最後に読んだデータの時刻・価格
|
76
84
|
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)', end=98) hh, mm, ss, tttttt, price
|
77
85
|
|
86
|
+
!現時刻をマイクロ秒換算
|
87
|
+
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
88
|
+
|
78
|
-
!高値・安値を最後に読
|
89
|
+
!高値・安値を最後に読んだデータの価格で更新
|
79
|
-
if (high < price) then
|
90
|
+
if (high < price) then !高値の更新
|
80
91
|
high = price
|
81
92
|
end if
|
82
93
|
|
83
|
-
if (low > price) then
|
94
|
+
if (low > price) then !安値の更新
|
84
95
|
low = price
|
85
96
|
end if
|
86
97
|
|
87
98
|
!最後に読んだデータの価格を終値へ代入
|
88
|
-
closing = price
|
99
|
+
closing = price !終値の更新
|
89
100
|
|
101
|
+
!現時刻を元に戻して表示
|
102
|
+
hh = (time / 1000000) / 3600
|
103
|
+
mm = mod((time / 1000000),3600) / 60
|
104
|
+
ss = mod((time / 1000000), 60)
|
105
|
+
tttttt = mod(time, 1000000)
|
106
|
+
print '("時刻:", I2.2, I2.2, I2.2, I6.6)', hh, mm , ss, tttttt
|
90
107
|
end do
|
108
|
+
!現時刻を元に戻して出力
|
91
|
-
!時刻・
|
109
|
+
!時刻・四本値を出力
|
110
|
+
hh = (time / 1000000) / 3600
|
111
|
+
mm = mod((time / 1000000),3600) / 60
|
112
|
+
ss = mod((time / 1000000), 60)
|
92
|
-
|
113
|
+
tttttt = mod(time, 1000000)
|
114
|
+
|
93
|
-
print '("時刻:", I
|
115
|
+
print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
|
94
|
-
& f10.4, /, "終値:", f10.4)',
|
116
|
+
& f10.4, /, "終値:", f10.4)', hh, mm, ss, tttttt, opening, high, low, closing
|
117
|
+
print * !時刻の境目に空行を入れる
|
95
118
|
|
96
119
|
!開始時刻の更新
|
97
120
|
time0 = time0 + interval0
|
@@ -99,8 +122,13 @@
|
|
99
122
|
|
100
123
|
!ファイル終端の時刻・価格の出力
|
101
124
|
!時刻を元に戻す
|
125
|
+
98 hh = (endtime / 1000000) / 3600
|
126
|
+
mm = mod((endtime / 1000000),3600) / 60
|
127
|
+
ss = mod((endtime / 1000000), 60)
|
128
|
+
tttttt = mod(endtime, 1000000)
|
129
|
+
|
102
|
-
|
130
|
+
print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
|
103
|
-
& f10.4, /, "終値:", f10.4)',
|
131
|
+
& f10.4, /, "終値:", f10.4)', hh, mm, ss, tttttt, opening, high, low, closing
|
104
132
|
|
105
133
|
close(17)
|
106
134
|
stop
|
12
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -89,6 +89,7 @@
|
|
89
89
|
|
90
90
|
end do
|
91
91
|
!時刻・価格の出力
|
92
|
+
!時刻を元に戻す
|
92
93
|
print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
|
93
94
|
& f10.4, /, "終値:", f10.4)',endtime, opening, high, low, closing
|
94
95
|
|
@@ -97,6 +98,7 @@
|
|
97
98
|
end do
|
98
99
|
|
99
100
|
!ファイル終端の時刻・価格の出力
|
101
|
+
!時刻を元に戻す
|
100
102
|
98 print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
|
101
103
|
& f10.4, /, "終値:", f10.4)',endtime, opening, high, low, closing
|
102
104
|
|
11
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
回答していただいた内容を元に、プログラムを書いてみました。
|
32
32
|
実行はされますが、問題点が4つあります。
|
33
33
|
①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
|
34
|
-
②マイクロ秒換算した時刻を
|
34
|
+
②マイクロ秒換算した時刻を元に戻すタイミングが分からない。(プログラム中に、ここで元に戻して出力するのかな、という位置にコメントしました。)
|
35
35
|
③価格を更新しているはずが、更新されていない。
|
36
36
|
④時刻が米印で表示される。(出力形式が合ってない...?)
|
37
37
|
以下にプログラムと実行画面を記載します。
|
10
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
実行はされますが、問題点が4つあります。
|
33
33
|
①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
|
34
34
|
②マイクロ秒換算した時刻をどのタイミングでhhmmssttttttの形式に戻すか分からない。
|
35
|
-
③
|
35
|
+
③価格を更新しているはずが、更新されていない。
|
36
36
|
④時刻が米印で表示される。(出力形式が合ってない...?)
|
37
37
|
以下にプログラムと実行画面を記載します。
|
38
38
|
```Fortran
|
9
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -90,7 +90,7 @@
|
|
90
90
|
end do
|
91
91
|
!時刻・価格の出力
|
92
92
|
print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
|
93
|
-
& f10.4, /, "終値", f10.4)',endtime, opening, high, low, closing
|
93
|
+
& f10.4, /, "終値:", f10.4)',endtime, opening, high, low, closing
|
94
94
|
|
95
95
|
!開始時刻の更新
|
96
96
|
time0 = time0 + interval0
|
@@ -98,7 +98,7 @@
|
|
98
98
|
|
99
99
|
!ファイル終端の時刻・価格の出力
|
100
100
|
98 print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
|
101
|
-
& f10.4, /, "終値", f10.4)',endtime, opening, high, low, closing
|
101
|
+
& f10.4, /, "終値:", f10.4)',endtime, opening, high, low, closing
|
102
102
|
|
103
103
|
close(17)
|
104
104
|
stop
|
8
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
実行はされますが、問題点が4つあります。
|
33
33
|
①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
|
34
34
|
②マイクロ秒換算した時刻をどのタイミングでhhmmssttttttの形式に戻すか分からない。
|
35
|
-
③時刻を更新しているはずが、更新されていない。
|
35
|
+
③時刻・価格を更新しているはずが、更新されていない。
|
36
36
|
④時刻が米印で表示される。(出力形式が合ってない...?)
|
37
37
|
以下にプログラムと実行画面を記載します。
|
38
38
|
```Fortran
|
7
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -27,88 +27,86 @@
|
|
27
27
|
プログラム自体を組むのがまだ慣れていないため、プログラムでやりたいことを紙に書き出して、とりあえずそれらをプログラム中にコメントとして記入しました。
|
28
28
|
プログラム中のコメントにある四本値とは前提のところに書いた、その区間における始まりの値(始値)・最も高かった値(高値)・最も安かった値(安値)・区間の終わりの値(終値)、を表しています。
|
29
29
|
|
30
|
+
(追記 2022年12月22日18:02)
|
31
|
+
回答していただいた内容を元に、プログラムを書いてみました。
|
32
|
+
実行はされますが、問題点が4つあります。
|
33
|
+
①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
|
34
|
+
②マイクロ秒換算した時刻をどのタイミングでhhmmssttttttの形式に戻すか分からない。
|
35
|
+
③時刻を更新しているはずが、更新されていない。
|
36
|
+
④時刻が米印で表示される。(出力形式が合ってない...?)
|
37
|
+
以下にプログラムと実行画面を記載します。
|
30
38
|
```Fortran
|
31
39
|
program test
|
32
40
|
implicit none
|
33
41
|
!変数の定義
|
34
|
-
integer(8) :: time, time0
|
42
|
+
integer(8) :: time, time0, endtime, hh, mm, ss, tttttt
|
35
|
-
real(8) :: interval, price, opening, high, low, closing
|
43
|
+
real(8) :: interval, interval0, price, opening, high, low, closing
|
36
44
|
|
37
|
-
!
|
45
|
+
!時間間隔の初期設定(単位は秒)
|
38
|
-
interval = 60
|
46
|
+
interval = 60 !ここでは60秒なので1分を表す
|
47
|
+
!時間間隔をマイクロ秒換算
|
48
|
+
interval0 =(interval)*1000000
|
39
49
|
|
40
|
-
!
|
50
|
+
!最初のデータの時刻と価格
|
41
|
-
open(17, file='kakaku.dat', '
|
51
|
+
open(17, file='kakaku.dat', status='old')
|
42
|
-
read(17,
|
52
|
+
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)') hh, mm, ss, tttttt, price
|
43
53
|
|
44
|
-
!最初の価格を始値・高値・安値に代入
|
45
|
-
opening = price
|
46
|
-
high = price
|
47
|
-
low = price
|
48
54
|
|
49
|
-
!最初の時刻
|
55
|
+
!開始時刻の初期化(開始時刻はデータ最初の時刻)(マイクロ秒換算)
|
56
|
+
time = ((hh*60+mm)*60+ss)*1000000+tttttt
|
50
|
-
time0
|
57
|
+
time0 = time
|
51
58
|
|
52
|
-
!ファイル
|
59
|
+
!ファイル先頭に戻る
|
53
60
|
rewind(17)
|
54
61
|
|
55
|
-
!繰り返し
|
62
|
+
!ファイル最後まで繰り返し
|
56
63
|
do
|
57
|
-
!最初の時刻・価格を読み込む
|
58
|
-
read(17, '(I12.12, f10.4)', end=99, err=98) time, price
|
59
|
-
|
60
|
-
!任意の時間間隔で時刻を進める
|
61
|
-
|
62
|
-
|
63
|
-
!
|
64
|
+
!最後に読んだデータを四本値へ代入
|
64
|
-
|
65
|
-
|
66
|
-
!時刻が飛んでいるかの判定(飛んでいたら、前の時刻の終値を四本値に代入)
|
67
|
-
if () then
|
68
|
-
|
65
|
+
opening = price
|
69
|
-
|
66
|
+
high = price
|
70
|
-
|
67
|
+
low = price
|
71
|
-
|
72
|
-
print '("始値 :", f10.4, /, "高値 :", f10.4, /, "安値 :", &
|
73
|
-
& f10.4, /, "終値 :", f10.4)', opening, high, low, closing
|
74
|
-
end if
|
75
|
-
|
76
|
-
!高値の更新
|
77
|
-
if (high < price) then
|
78
|
-
high = price
|
79
|
-
end if
|
80
|
-
|
81
|
-
!安値の更新
|
82
|
-
if (low > price) then
|
83
|
-
low = price
|
84
|
-
end if
|
85
|
-
|
86
|
-
!終値の更新
|
87
68
|
closing = price
|
88
69
|
|
89
|
-
!時刻の
|
70
|
+
!終了時刻の決定
|
90
|
-
time
|
71
|
+
endtime = time0 + interval0
|
91
72
|
|
73
|
+
!最後に読んだデータの時刻が終了時刻を超えるまで繰り返し
|
74
|
+
do while (time > endtime)
|
75
|
+
!最後に読んだデータの時刻と価格
|
76
|
+
read(17, '(I2.2, I2.2, I2.2, I6.6, f10.4)', end=98) hh, mm, ss, tttttt, price
|
77
|
+
|
78
|
+
!高値・安値を最後に読み込んだデータの価格で更新
|
79
|
+
if (high < price) then !高値の更新
|
80
|
+
high = price
|
81
|
+
end if
|
82
|
+
|
83
|
+
if (low > price) then !安値の更新
|
84
|
+
low = price
|
85
|
+
end if
|
86
|
+
|
87
|
+
!最後に読んだデータの価格を終値へ代入
|
88
|
+
closing = price
|
89
|
+
|
90
|
+
end do
|
92
|
-
!
|
91
|
+
!時刻・価格の出力
|
92
|
+
print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
|
93
|
-
|
93
|
+
& f10.4, /, "終値", f10.4)',endtime, opening, high, low, closing
|
94
|
+
|
95
|
+
!開始時刻の更新
|
96
|
+
time0 = time0 + interval0
|
94
97
|
end do
|
95
98
|
|
96
|
-
98 print *, 'ERROR'
|
97
|
-
|
98
|
-
!
|
99
|
+
!ファイル終端の時刻・価格の出力
|
99
|
-
99 opening = price
|
100
|
-
high = price
|
101
|
-
low = price
|
102
|
-
closing = price
|
103
|
-
|
104
|
-
|
100
|
+
98 print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
|
105
|
-
& f10.4, /, "終値
|
101
|
+
& f10.4, /, "終値", f10.4)',endtime, opening, high, low, closing
|
106
102
|
|
107
103
|
close(17)
|
108
104
|
stop
|
109
105
|
end program test
|
106
|
+
|
110
107
|
```
|
111
|
-
|
108
|
+
実行画面(最初の時刻からデータを表示しています。)
|
109
|
+

|
112
110
|
### 試したこと
|
113
111
|
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
|
114
112
|
以下、プログラムの流れを考えて紙に書き出した内容です。
|
6
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -118,9 +118,9 @@
|
|
118
118
|
取得した価格を始値・高値・安値に代入する。
|
119
119
|
④時刻・四本値を求めるために繰り返しの処理に入る。
|
120
120
|
→⑤最初の時刻・価格を読み込む。
|
121
|
-
|
121
|
+
→⑥②で設定した任意の時間間隔だけ時刻を進める。
|
122
|
-
|
122
|
+
→⑦⑥で進めた時刻が現時刻より大きいor同じ時、四本値を更新。
|
123
|
-
|
123
|
+
→⑧⑥で進めた時刻が現時刻より小さい時、その時点での四本値を出力。
|
124
124
|
・
|
125
125
|
・
|
126
126
|
・
|
5
文章の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -111,5 +111,18 @@
|
|
111
111
|
|
112
112
|
### 試したこと
|
113
113
|
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
|
114
|
+
以下、プログラムの流れを考えて紙に書き出した内容です。
|
115
|
+
①変数の定義
|
116
|
+
②任意の時間間隔の設定(単位:秒 60(=1分) 120(=2分))
|
117
|
+
③ファイルを読み込んで、最初の時刻での価格を取得。
|
118
|
+
取得した価格を始値・高値・安値に代入する。
|
119
|
+
④時刻・四本値を求めるために繰り返しの処理に入る。
|
120
|
+
→⑤最初の時刻・価格を読み込む。
|
121
|
+
⑥②で設定した任意の時間間隔だけ時刻を進める。
|
122
|
+
⑦⑥で進めた時刻が現時刻より大きいor同じ時、四本値を更新。
|
123
|
+
⑧⑥で進めた時刻が現時刻より小さい時、その時点での四本値を出力。
|
124
|
+
・
|
125
|
+
・
|
126
|
+
・
|
114
127
|
|
115
128
|
|
4
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
### 実現したいこと
|
8
8
|
プログラムの最初に任意の時間間隔での変数を設定して、それに伴って始値等を出力するプログラムを作りたいのですが、どうコードで表現すれば良いのか分からない状態です。(1つの変数を変更するだけで、プログラムの出力を変えるイメージです。)
|
9
|
-
例えば、最初に時間間隔の変数(単位は秒)として、180(=3分)と設定すると、3分間隔の始値等が出力され、0.1(=100000マイクロ秒)と設定すると、1マイクロ秒間隔の始値等が出力されるプログラムを作りたいです。
|
9
|
+
例えば、最初に時間間隔の変数(単位は秒)として、180(=3分)と設定すると、3分間隔の始値等が出力され、0.1(=100000マイクロ秒)と設定すると、100000マイクロ秒間隔の始値等が出力されるプログラムを作りたいです。
|
10
10
|
|
11
11
|
### 発生している問題・エラーメッセージ
|
12
12
|
|
3
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
### 実現したいこと
|
8
8
|
プログラムの最初に任意の時間間隔での変数を設定して、それに伴って始値等を出力するプログラムを作りたいのですが、どうコードで表現すれば良いのか分からない状態です。(1つの変数を変更するだけで、プログラムの出力を変えるイメージです。)
|
9
|
-
例えば、最初に時間間隔の変数として、180(=3分)と設定すると、3分間隔の始値等が出力され、0.1(=1マイクロ秒)と設定すると、1マイクロ秒間隔の始値等が出力されるプログラムを作りたいです。
|
9
|
+
例えば、最初に時間間隔の変数(単位は秒)として、180(=3分)と設定すると、3分間隔の始値等が出力され、0.1(=100000マイクロ秒)と設定すると、1マイクロ秒間隔の始値等が出力されるプログラムを作りたいです。
|
10
10
|
|
11
11
|
### 発生している問題・エラーメッセージ
|
12
12
|
|
2
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
例:
|
15
15
|
090000000000 200.1
|
16
16
|
090100367167 200.2
|
17
|
-
09030042982
|
17
|
+
090300429828 200.3
|
18
18
|
090400000000 200.4
|
19
19
|
・
|
20
20
|
・
|
1
文章の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -13,8 +13,8 @@
|
|
13
13
|
①時系列データには時刻がとんでいる場合もあり、その場合でも始値等を出力したいです。
|
14
14
|
例:
|
15
15
|
090000000000 200.1
|
16
|
-
090100
|
16
|
+
090100367167 200.2
|
17
|
-
090300
|
17
|
+
090300429829 200.3
|
18
18
|
090400000000 200.4
|
19
19
|
・
|
20
20
|
・
|