質問編集履歴

25

文章の修正

2023/01/09 05:41

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,23 +1,13 @@
1
1
  ### 前提
2
2
 
3
- 価格の時系列データを任意の時間間隔に区切って、その区間における始まりの値(始値)・最も高かった値(高値)・最も安かった値(安値)・区間の終わりの値(終値)を出力するプログラムを作っています。
4
- 時系列データには、時刻・価格の順に並んでいます。時刻は、hhmmsstttttt(時・分・秒・1マイクロ秒)で表されていてttttttは1マイクロ秒になっています。
5
- (例: 090101100000 150.1)
3
+ 価格の時系列データ
6
4
 
7
5
  ### 実現したいこと
8
- プログラムの最初に任意の時間間隔での変数を設定して、それに伴って始値等を出力するプログラムを作りたいのですが、どうコードで表現すれば良いのか分からない状態です。(1つの変数を変更するだけで、プログラムの出力を変えるイメージです。)
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

文章の修正

2022/12/27 01:36

投稿

noob_programmer
noob_programmer

スコア0

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
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/f20f20c0-a5aa-4274-8e61-c6612cc0de21.png)
150
- ファイル終端の時刻は11時30分ちょうどだが、1秒足した時刻まで出力してしまっている。
151
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/4237c35d-d998-4673-ba63-26c66c96fe12.png)
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

文章の修正

2022/12/23 07:41

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -145,6 +145,7 @@
145
145
  ```
146
146
  実行画面(最初の時刻からデータを表示しています。)
147
147
  1秒間隔で出力しているはずが、1秒を超えた値が混ざってしまっている。
148
+ (856702までを出力したい。)
148
149
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/f20f20c0-a5aa-4274-8e61-c6612cc0de21.png)
149
150
  ファイル終端の時刻は11時30分ちょうどだが、1秒足した時刻まで出力してしまっている。
150
151
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/4237c35d-d998-4673-ba63-26c66c96fe12.png)

22

コードの編集

2022/12/23 07:39

投稿

noob_programmer
noob_programmer

スコア0

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

コードの編集・実行画面の編集

2022/12/23 07:38

投稿

noob_programmer
noob_programmer

スコア0

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='kakaku.dat', status='old')
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
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/f20f20c0-a5aa-4274-8e61-c6612cc0de21.png)
148
+ ファイル終端の時刻は11時30分ちょうどだが、1秒足した時刻まで出力してしまっている。
140
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/fd0d88fe-40d8-4c7d-9819-ee2a916fe54a.png)
149
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/4237c35d-d998-4673-ba63-26c66c96fe12.png)
141
150
  ### 試したこと
142
151
  とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
143
152
  以下、プログラムの流れを考えて紙に書き出した内容です。

20

文章の追加

2022/12/23 06:56

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -136,6 +136,7 @@
136
136
 
137
137
  ```
138
138
  実行画面(最初の時刻からデータを表示しています。)
139
+ 1秒間隔で出力しているはずが、1秒を超えた値が混ざってしまっている。
139
140
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/fd0d88fe-40d8-4c7d-9819-ee2a916fe54a.png)
140
141
  ### 試したこと
141
142
  とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。

19

文章の追加

2022/12/23 06:18

投稿

noob_programmer
noob_programmer

スコア0

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

文章の修正

2022/12/23 05:52

投稿

noob_programmer
noob_programmer

スコア0

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

文章の追加

2022/12/23 05:47

投稿

noob_programmer
noob_programmer

スコア0

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

文章の修正

2022/12/23 05:46

投稿

noob_programmer
noob_programmer

スコア0

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

文章の追加

2022/12/23 05:01

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -27,12 +27,11 @@
27
27
  プログラム自体を組むのがまだ慣れていないため、プログラムでやりたいことを紙に書き出して、とりあえずそれらをプログラム中にコメントとして記入しました。
28
28
  プログラム中のコメントにある四本値とは前提のところに書いた、その区間における始まりの値(始値)・最も高かった値(高値)・最も安かった値(安値)・区間の終わりの値(終値)、を表しています。
29
29
 
30
- (追記 2022年12月22日18:02)
30
+ (追記
31
31
  回答していただいた内容を元に、プログラムを書いてみました。
32
- 実行はされますが、問題点が3つあります。
32
+ 実行はされますが、問題点がつあります。
33
- ①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
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 , ss, tttttt
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
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-22/84cdef14-3b60-4159-b2b9-408761fb72db.png)
141
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-23/fd0d88fe-40d8-4c7d-9819-ee2a916fe54a.png)
140
142
  ### 試したこと
141
143
  とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
142
144
  以下、プログラムの流れを考えて紙に書き出した内容です。

14

文章の修正

2022/12/23 03:14

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -29,11 +29,11 @@
29
29
 
30
30
  (追記 2022年12月22日18:02)
31
31
  回答していただいた内容を元に、プログラムを書いてみました。
32
- 実行はされますが、問題点が4つあります。
32
+ 実行はされますが、問題点が3つあります。
33
33
  ①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
34
34
  ②マイクロ秒換算した時刻を元に戻すタイミングが分からない。(プログラム中に、ここで元に戻して出力するのかな、という位置にコメントしました。)
35
35
  ③価格を更新しているはずが、更新されていない。
36
- ④時刻が米印で表示される。(出力形式が合ってない...?)
36
+
37
37
  以下にプログラムと実行画面を記載します。
38
38
  ```Fortran
39
39
  program test

13

文章の修正

2022/12/23 03:09

投稿

noob_programmer
noob_programmer

スコア0

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, low, closing
44
+ real(8) :: interval, interval0, price, opening, high,&
45
+ & low, closing
44
46
 
45
47
  !時間間隔の初期設定(単位は秒)
46
- interval = 60 !ここでは60なので1分を表す
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 > endtime)
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 '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
115
+ print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, /, "安値:",&
94
- & f10.4, /, "終値:", f10.4)',endtime, opening, high, low, closing
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
- 98 print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
130
+ print '("時刻:", I2.2, I2.2, I2.2, I6.6, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
103
- & f10.4, /, "終値:", f10.4)',endtime, opening, high, low, closing
131
+ & f10.4, /, "終値:", f10.4)', hh, mm, ss, tttttt, opening, high, low, closing
104
132
 
105
133
  close(17)
106
134
  stop

12

文章の追加

2022/12/22 10:11

投稿

noob_programmer
noob_programmer

スコア0

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

文章の追加

2022/12/22 10:10

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -31,7 +31,7 @@
31
31
  回答していただいた内容を元に、プログラムを書いてみました。
32
32
  実行はされますが、問題点が4つあります。
33
33
  ①end=98でファイル終端を検知しているはずが、無限ループしてしまう。
34
- ②マイクロ秒換算した時刻をどのタイミングでhhmmssttttttの形式に戻すか分からない。
34
+ ②マイクロ秒換算した時刻を元に戻すタイミングが分からない。(プログラム中に、ここに戻して出力るのかな、とう位置にコメントしました
35
35
  ③価格を更新しているはずが、更新されていない。
36
36
  ④時刻が米印で表示される。(出力形式が合ってない...?)
37
37
  以下にプログラムと実行画面を記載します。

10

文章の修正

2022/12/22 09:09

投稿

noob_programmer
noob_programmer

スコア0

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

文章の追加

2022/12/22 09:07

投稿

noob_programmer
noob_programmer

スコア0

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

文章の追加

2022/12/22 09:03

投稿

noob_programmer
noob_programmer

スコア0

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

文章の追加

2022/12/22 09:02

投稿

noob_programmer
noob_programmer

スコア0

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 !ここでは60秒としているので1分を表す
46
+ interval = 60 !ここでは60秒ので1分を表す
47
+ !時間間隔をマイクロ秒換算
48
+ interval0 =(interval)*1000000
39
49
 
40
- !ファイル読み込み
50
+ !最初データの時刻と価格
41
- open(17, file='kakaku.dat', '(I12.12, f10.4)')
51
+ open(17, file='kakaku.dat', status='old')
42
- read(17, file='kakaku.dat', '(I12.12, f10.4)')
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
- !最初の時刻をtime0に代入
55
+ !開始時刻の初期化(開始時刻はデータ最初の時刻)(マイクロ秒換算)
56
+ time = ((hh*60+mm)*60+ss)*1000000+tttttt
50
- time0 = time
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
- opening = price
65
+ opening = price
69
- high = price
66
+ high = price
70
- low = price
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
- time0 = 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
- print '(I12.12, f10.4)', time, price
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
- print '("始値 :", f10.4, /, "高値 :", f10.4, /, "安値 :", &
100
+ 98 print '("時刻:", I12.12, /, "始値:", f10.4, /, "高値:", f10.4, "安値:",&
105
- & f10.4, /, "終値 :", f10.4)', opening, high, low, closing
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
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-22/84cdef14-3b60-4159-b2b9-408761fb72db.png)
112
110
  ### 試したこと
113
111
  とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。やりたいことは、漠然としてわかったいるのですがそれをどう表現したらよいのか分からないです。特に、時刻をどう扱いプログラムしていけばよいのかが悩みの種です。
114
112
  以下、プログラムの流れを考えて紙に書き出した内容です。

6

文章の追加

2022/12/22 04:55

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -118,9 +118,9 @@
118
118
   取得した価格を始値・高値・安値に代入する。
119
119
  ④時刻・四本値を求めるために繰り返しの処理に入る。
120
120
  →⑤最初の時刻・価格を読み込む。
121
-  ⑥②で設定した任意の時間間隔だけ時刻を進める。
121
+ ⑥②で設定した任意の時間間隔だけ時刻を進める。
122
-  ⑦⑥で進めた時刻が現時刻より大きいor同じ時、四本値を更新。
122
+ ⑦⑥で進めた時刻が現時刻より大きいor同じ時、四本値を更新。
123
-  ⑧⑥で進めた時刻が現時刻より小さい時、その時点での四本値を出力。
123
+ ⑧⑥で進めた時刻が現時刻より小さい時、その時点での四本値を出力。
124
124
   ・
125
125
   ・
126
126
   ・

5

文章の追加

2022/12/22 04:54

投稿

noob_programmer
noob_programmer

スコア0

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

文章の修正

2022/12/22 04:05

投稿

noob_programmer
noob_programmer

スコア0

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

文章の修正

2022/12/22 04:03

投稿

noob_programmer
noob_programmer

スコア0

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

文章の修正

2022/12/22 03:42

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
  例:
15
15
  090000000000 200.1
16
16
  090100367167 200.2
17
- 090300429829 200.3
17
+ 090300429828 200.3
18
18
  090400000000 200.4
19
19
 
20
20
 

1

文章の修正

2022/12/22 03:42

投稿

noob_programmer
noob_programmer

スコア0

test CHANGED
File without changes
test CHANGED
@@ -13,8 +13,8 @@
13
13
  ①時系列データには時刻がとんでいる場合もあり、その場合でも始値等を出力したいです。
14
14
  例:
15
15
  090000000000 200.1
16
- 090100000000 200.2
16
+ 090100367167 200.2
17
- 090300000000 200.3
17
+ 090300429829 200.3
18
18
  090400000000 200.4
19
19
 
20
20