unageanu-jiji 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ChangeLog CHANGED
@@ -1,2 +1,10 @@
1
- 2009--3-29
1
+
2
+ 2009-4-14
3
+ * 以下の不具合を修正。
4
+ - システムを再起動すると、動作中のエージェントが全て停止状態となる。
5
+ - リアルトレードで建玉にエージェント名が設定されない場合がある。
6
+ - リアルトレードで追加したエージェントのグラフ設定ができない。
7
+ - 月の初めに、取引一覧の範囲絞込みの初期値が不正な値になる。
8
+
9
+ 2009-3-29
2
10
  * 初版リリース
@@ -205,8 +205,8 @@ fx.ui.pages.TradeResultPage.prototype = {
205
205
  endDate = now.getTime()/1000;
206
206
 
207
207
  // フィールドにも設定しておく
208
- document.getElementById("subpage-trade_range-year").value = now.getFullYear();
209
- document.getElementById("subpage-trade_range-month").value = now.getMonth()+1;
208
+ document.getElementById("subpage-trade_range-year").value = start.getFullYear();
209
+ document.getElementById("subpage-trade_range-month").value = start.getMonth()+1;
210
210
  document.getElementById("subpage-trade_range-day").value = start.getDate();
211
211
  document.getElementById("subpage-trade_range-end-year").value = now.getFullYear();
212
212
  document.getElementById("subpage-trade_range-end-month").value = now.getMonth()+1;
data/lib/jiji/process.rb CHANGED
@@ -15,9 +15,10 @@ module JIJI
15
15
 
16
16
  # コンストラクタ
17
17
  # 再起動後の復元の場合、プロパティを指定しないこと。この場合設定ファイルからロードされる。
18
- def initialize( id, process_dir, agent_manager, props=nil, registry=nil, ignore_error=false )
19
-
18
+ def initialize( id, process_dir, agent_manager, logger, props=nil, registry=nil, rmt=false )
19
+
20
20
  is_recreate = props == nil
21
+ @logger = logger
21
22
  @registry = registry
22
23
  @id = id
23
24
  @agent_manager = agent_manager
@@ -43,20 +44,20 @@ module JIJI
43
44
  }
44
45
  @props["agents"] = [] unless @props.key? "agents"
45
46
  end
46
-
47
- # 新規作成の場合はエージェントをロード
48
- # 再起動後の再作成時は、アウトプロットのみ作成。
47
+
48
+ # RMTまたは新規作成の場合はエージェントをロード
49
+ # 再起動後の再作成時は、アウトプットのみ作成。
49
50
  @outputs = {}
50
- if !is_recreate
51
- load_agent(ignore_error)
51
+ if rmt || !is_recreate
52
+ load_agent(rmt) # リアル取引の再起動時は発生したエラーを無視する
52
53
  else
53
54
  if @props && @props["agents"]
54
55
  @props["agents"].each {|v|
55
- @outputs[v["id"]] = @registry.output( @id, v["id"] )
56
+ @outputs[v["id"]] = @registry.output( @id, v["name"] )
56
57
  }
57
58
  end
58
59
  end
59
-
60
+
60
61
  # 取引の有効状態を更新
61
62
  @agent_manager.operator.trade_enable =
62
63
  @props["trade_enable"] ? true : false
@@ -113,7 +114,6 @@ module JIJI
113
114
  end
114
115
 
115
116
  def []=(k,v)
116
- @props[k] = v
117
117
  if ( k == "agents" )
118
118
  # エージェントの設定が更新された
119
119
  # 削除対象を特定するため、登録済みエージェントのIDのセットを作成
@@ -124,13 +124,16 @@ module JIJI
124
124
  set.delete item["id"]
125
125
  }
126
126
  # Mapに含まれていないエージェントは削除
127
- set.each { |id| agent_manager.remove( id ) }
127
+ set.each { |id|
128
+ agent_manager.remove( id )
129
+ outputs.delete( id )
130
+ }
128
131
  end
129
132
  if ( k == "trade_enable" )
130
133
  # 取引の有効状態を更新
131
- @agent_manager.operator.trade_enable =
132
- @props["trade_enable"] ? true : false
134
+ @agent_manager.operator.trade_enable = v ? true : false
133
135
  end
136
+ @props[k] = v
134
137
  save_props
135
138
  end
136
139
  def [](k)
@@ -151,8 +154,9 @@ module JIJI
151
154
  attr :process_dir, true
152
155
  attr :agent_manager, true
153
156
  attr :outputs, true
157
+ attr :logger, true
154
158
  attr :registry, true
155
-
159
+
156
160
  private
157
161
 
158
162
  # 任意のエージェントの設定を更新する。
@@ -163,7 +167,8 @@ module JIJI
163
167
  a.agent.properties = props
164
168
  else
165
169
  agent = agent_manager.agent_registry.create( cl, props )
166
- agent_manager.add( id, agent )
170
+ agent_manager.add( id, agent, props["name"] )
171
+ @outputs[id] = agent.output
167
172
  end
168
173
  end
169
174
 
@@ -192,10 +197,14 @@ module JIJI
192
197
  agent_manager.add( v["id"], agent, v["name"] )
193
198
  @outputs[v["id"]] = agent.output
194
199
  rescue Exception
195
- raise $! unless ignore_error
200
+ unless ignore_error
201
+ raise $!
202
+ else
203
+ @logger.error $!
204
+ end
196
205
  # リアルトレードの場合、停止中にエージェントが破棄された場合を考慮し
197
206
  # エージェントの初期化で失敗しても無視し、出力先だけ作成
198
- @outputs[v["id"]] = @registry.output( @id, v["id"] )
207
+ @outputs[v["id"]] = @registry.output( @id, v["name"] )
199
208
  end
200
209
  }
201
210
  end
data/lib/jiji/registry.rb CHANGED
@@ -179,7 +179,7 @@ module JIJI
179
179
 
180
180
  # RMTプロセス
181
181
  r.register( :rmt_process ) {
182
- c = JIJI::Process.new("rmt", r.process_dir, r.agent_manager("rmt",true), nil, r, true)
182
+ c = JIJI::Process.new("rmt", r.process_dir, r.agent_manager("rmt",true), r.process_logger("rmt"), nil, r, true)
183
183
  c.observer_manager = r.rmt_observer_manager
184
184
  c.collector = r.rmt_collector
185
185
  c
@@ -187,8 +187,7 @@ module JIJI
187
187
  # バックテストプロセス
188
188
  r.register( :backtest_process, :model=>:multiton_initialize ) {|c,p,id, props|
189
189
  # 既存のバックテストを読み込む場合、プロパティはnil
190
- # このときエージェントの初期化で失敗しても無視する。(テスト実行後にエージェントが書き換えられた場合に起こりえる。)
191
- c = JIJI::Process.new(id, r.process_dir, r.agent_manager(id,false), props, r, props == nil)
190
+ c = JIJI::Process.new(id, r.process_dir, r.agent_manager(id,false), r.process_logger(id), props, r, false)
192
191
  c.observer_manager = r.backtest_observer_manager(id)
193
192
  c.collector = r.backtest_collector(id,
194
193
  Time.at( c["start_date"]), Time.at( c["end_date"]))
data/lib/jiji/server.rb CHANGED
@@ -22,8 +22,7 @@ module JIJI
22
22
 
23
23
  param[:Logger] = registry[:server_logger]
24
24
  param[:DocumentRoot] = File.expand_path( "#{__FILE__}/../../../html" )
25
-
26
- param[:Logger].info( File.expand_path( "#{__FILE__}/../../../html" ) )
25
+ param[:Logger].info( "document root: #{ param[:DocumentRoot] }" )
27
26
 
28
27
  start_callback_org = param[:StartCallback]
29
28
  param[:StartCallback] = proc {
data/test/test_Process.rb CHANGED
@@ -22,34 +22,34 @@ class ProcessTest < RUNIT::TestCase
22
22
  def setup
23
23
  @dir = File.dirname(__FILE__) + "/ProcessTest.tmp"
24
24
  FileUtils.mkdir_p @dir
25
+
26
+ @logger = Logger.new STDOUT
27
+
28
+ # レジストリ
29
+ @registry_mock = Object.new
30
+ class << @registry_mock
31
+ def output( agent_name, dir )
32
+ return ["from_registry"]
33
+ end
34
+ end
25
35
  end
26
36
 
27
37
  def teardown
28
38
  FileUtils.rm_rf @dir
29
39
  end
30
40
 
41
+ # 基本動作のテスト
31
42
  def test_basic
32
43
 
33
44
  # 新規に作成
34
- agent_mng = JIJI::AgentManager.new( "aaa", RegistryMock.new, Logger.new(STDOUT))
35
- agent_mng.operator = Struct.new(:trade_enable).new(true)
36
- agent_mng.conf = CONF
37
- agent_mng.conf.set( [:agent,:safe_level], 0)
45
+ agent_mng = new_agent_mang
38
46
 
39
- registry_mock = Object.new
40
- class << registry_mock
41
- def output( agent_name, dir )
42
- output = JIJI::Output.new( agent_name, "#{dir}/out" )
43
- return output
44
- end
45
- end
46
- agent_mng.registry = registry_mock
47
-
48
- p1 = JIJI::Process.new( "1", @dir, agent_mng, {} )
47
+ p1 = JIJI::Process.new( "1", @dir, agent_mng, @logger, {}, @registry_mock )
49
48
  assert_equals p1.id, "1"
50
49
  assert_equals p1.props, {"agents"=>[]}
51
50
  assert_equals p1["x"], nil
52
51
  assert_equals p1.agent_manager, agent_mng
52
+ assert_equals p1.outputs, {}
53
53
 
54
54
  p1["x"] = "xxx"
55
55
  assert_equals p1["x"], "xxx"
@@ -92,6 +92,7 @@ class ProcessTest < RUNIT::TestCase
92
92
  assert_equals agent_mng.get("aaa").agent.properties, {"x"=>30, "y"=>40 }
93
93
  assert_equals agent_mng.get("bbb").agent.cl, "testclass2@foo.rb"
94
94
  assert_equals agent_mng.get("bbb").agent.properties, {"x"=>30, "y"=>41 }
95
+ assert_equals p1.outputs, { "aaa"=>["out1","out2"], "bbb"=>["out1","out2"] }
95
96
 
96
97
  # 変更
97
98
  agents = [
@@ -118,6 +119,7 @@ class ProcessTest < RUNIT::TestCase
118
119
  assert_equals agent_mng.get("aaa").agent.properties, {"x"=>50, "y"=>40 }
119
120
  assert_equals agent_mng.get("bbb").agent.cl, "testclass2@foo.rb"
120
121
  assert_equals agent_mng.get("bbb").agent.properties, {"x"=>60, "y"=>41 }
122
+ assert_equals p1.outputs, { "aaa"=>["out1","out2"], "bbb"=>["out1","out2"] }
121
123
 
122
124
  # 削除
123
125
  agents = [
@@ -135,10 +137,12 @@ class ProcessTest < RUNIT::TestCase
135
137
  assert_equals agent_mng.get("aaa").agent.cl, "testclass@foo.rb"
136
138
  assert_equals agent_mng.get("aaa").agent.properties, {"x"=>50, "y"=>41 }
137
139
  assert_equals agent_mng.get("bbb"), nil
140
+ assert_equals p1.outputs, { "aaa"=>["out1","out2"] }
138
141
 
139
-
140
- # 再読み込み / ファイルに保存された設定値が読み込まれる。
141
- p1 = JIJI::Process.new( "1", @dir, agent_mng, nil, registry_mock )
142
+ # RMTモードで再読み込み
143
+ # ファイルに保存された設定値が読み込まれる。また、エージェントがインスタンス化される
144
+ agent_mng = new_agent_mang
145
+ p1 = JIJI::Process.new( "1", @dir, agent_mng, @logger, nil, @registry_mock, true )
142
146
  assert_equals p1.id, "1"
143
147
  assert_equals p1.agent_manager, agent_mng
144
148
  assert_equals p1["x"], "xxx"
@@ -148,16 +152,168 @@ class ProcessTest < RUNIT::TestCase
148
152
  assert_equals agent_mng.get("bbb"), nil
149
153
  assert_equals p1["trade_enable"], false
150
154
  assert_equals p1.agent_manager.operator.trade_enable, false
155
+ assert_equals p1.outputs, { "aaa"=>["out1","out2"] }
156
+
157
+ # バックテストモードで再読み込み
158
+ # ファイルに保存された設定値が読み込まれるが、エージェントはインスタンス化されない
159
+ agent_mng = new_agent_mang
160
+ p1 = JIJI::Process.new( "1", @dir, agent_mng, @logger, nil, @registry_mock, false )
161
+ assert_equals p1.id, "1"
162
+ assert_equals p1.agent_manager, agent_mng
163
+ assert_equals p1["x"], "xxx"
164
+ assert_equals p1["agents"], agents
165
+ assert_equals agent_mng.get("aaa"), nil
166
+ assert_equals agent_mng.get("bbb"), nil
167
+ assert_equals p1["trade_enable"], false
168
+ assert_equals p1.agent_manager.operator.trade_enable, false
169
+ assert_equals p1.outputs, { "aaa"=> ["from_registry"] }
151
170
 
152
171
  # 別のプロセスを作成 / 設定値は別途保持される。
153
- p2 = JIJI::Process.new( "2", @dir, agent_mng, {}, registry_mock )
172
+ agent_mng = new_agent_mang
173
+ p2 = JIJI::Process.new( "2", @dir, agent_mng, @logger, {}, @registry_mock )
154
174
  assert_equals p2.id, "2"
155
175
  assert_equals p2.agent_manager, agent_mng
156
176
  assert_equals p2["x"], nil
157
177
  assert_equals p2["agents"], []
178
+ assert_equals p2.outputs, { }
179
+
180
+ # 作成の段階でエージェントを指定する
181
+ agent_mng = new_agent_mang
182
+ p3 = JIJI::Process.new( "3", @dir, agent_mng, @logger, {"agents"=>agents}, @registry_mock )
183
+ assert_equals p3.id, "3"
184
+ assert_equals p3.agent_manager, agent_mng
185
+ assert_equals p3["x"], nil
186
+ assert_equals p3["agents"], agents
187
+ assert_equals agent_mng.get("aaa").agent.cl, "testclass@foo.rb"
188
+ assert_equals agent_mng.get("aaa").agent.properties, {"x"=>50, "y"=>41 }
189
+ assert_equals agent_mng.get("bbb"), nil
190
+ assert_equals p3.outputs, { "aaa"=>["out1","out2"] }
158
191
 
159
192
  end
160
193
 
194
+ # エージェントの作成でエラーになった場合のテスト
195
+ def test_error
196
+ agents = [
197
+ {"id"=>"aaa",
198
+ "name"=>"テストエージェント1",
199
+ "class"=>"testclass@foo.rb",
200
+ "class_name" => "testclass",
201
+ "file_name" => "foo.rb",
202
+ "description" => "説明",
203
+ "property_def" => {"id"=>"x", "default"=>85 },
204
+ "properties" => {"x"=>50, "y"=>41 }}
205
+ ]
206
+
207
+ # RMTで生成時にエラー
208
+ # 再起動で失敗するのを防ぐため、エラーはログに出力された後、無視される。
209
+ agent_mng = new_agent_mang
210
+ p1 = JIJI::Process.new( "1", @dir, agent_mng, @logger, {"agents"=>agents}, @registry_mock, true )
211
+
212
+ error_registry = RegistryMock.new
213
+ class << error_registry
214
+ def create(*args); raise "test"; end
215
+ end
216
+ # 再作成
217
+ agent_mng = new_agent_mang(error_registry)
218
+ p1 = JIJI::Process.new( "1", @dir, agent_mng, @logger, nil, @registry_mock, true )
219
+ assert_equals p1.id, "1"
220
+ assert_equals p1.agent_manager, agent_mng
221
+ assert_equals p1["agents"], agents
222
+ assert_equals agent_mng.get("aaa"), nil
223
+ assert_equals agent_mng.get("bbb"), nil
224
+ assert_equals p1["trade_enable"], nil
225
+ assert_equals p1.agent_manager.operator.trade_enable, false
226
+ assert_equals p1.outputs, { "aaa"=>["from_registry"] }
227
+
228
+ # RMTでエージェントの追加時にエラー
229
+ agents << {"id"=>"bbb",
230
+ "name"=>"テストエージェント4",
231
+ "class"=>"testclass2@foo.rb",
232
+ "class_name" => "testclass",
233
+ "file_name" => "foo.rb",
234
+ "description" => "説明2aaaaaa",
235
+ "property_def" => {"id"=>"x", "default"=>85 },
236
+ "properties" => {"x"=>60, "y"=>41 }}
237
+ begin
238
+ p1["agents"] = agents
239
+ fail
240
+ rescue
241
+ end
242
+
243
+ # RMTでエージェントのプロパティ更新時にエラー
244
+ agents2 = [
245
+ {"id"=>"aaa",
246
+ "name"=>"テストエージェント1",
247
+ "class"=>"testclass@foo.rb",
248
+ "class_name" => "testclass",
249
+ "file_name" => "foo.rb",
250
+ "description" => "説明",
251
+ "property_def" => {"id"=>"x", "default"=>85 },
252
+ "properties" => {"x"=>50, "y"=>41 }}
253
+ ]
254
+ error_registry = RegistryMock.new
255
+ class << error_registry
256
+ def create( cl, property )
257
+ a = Agent.new( cl, property )
258
+ class << a
259
+ def properties=(props)
260
+ raise "test"
261
+ end
262
+ end
263
+ return a
264
+ end
265
+ end
266
+ agent_mng = new_agent_mang(error_registry)
267
+ p1 = JIJI::Process.new( "2", @dir, agent_mng, @logger, {"agents"=>agents2}, @registry_mock, true )
268
+ assert_equals p1["agents"], agents2
269
+ assert_equals agent_mng.get("aaa").agent.cl, "testclass@foo.rb"
270
+ assert_equals agent_mng.get("aaa").agent.properties, {"x"=>50, "y"=>41 }
271
+ assert_equals agent_mng.get("bbb"), nil
272
+ assert_equals p1.outputs, { "aaa"=>["out1","out2"] }
273
+
274
+ begin
275
+ p1["agents"] = [
276
+ {"id"=>"aaa",
277
+ "name"=>"テストエージェント1",
278
+ "class"=>"testclass@foo.rb",
279
+ "class_name" => "testclass",
280
+ "file_name" => "foo.rb",
281
+ "description" => "説明",
282
+ "property_def" => {"id"=>"x", "default"=>85 },
283
+ "properties" => {"x"=>50, "y"=>31 }}
284
+ ]
285
+ fail
286
+ rescue
287
+ end
288
+ assert_equals p1["agents"], agents2
289
+ assert_equals agent_mng.get("aaa").agent.cl, "testclass@foo.rb"
290
+ assert_equals agent_mng.get("aaa").agent.properties, {"x"=>50, "y"=>41 }
291
+ assert_equals agent_mng.get("bbb"), nil
292
+ assert_equals p1.outputs, { "aaa"=>["out1","out2"] }
293
+
294
+ # バックテストでエージェント生成時にエラー
295
+ error_registry = RegistryMock.new
296
+ class << error_registry
297
+ def create; raise "test"; end
298
+ end
299
+ agent_mng = new_agent_mang(error_registry)
300
+ begin
301
+ JIJI::Process.new( "1", @dir, agent_mng, @logger, {"agents"=>agents}, @registry_mock, false )
302
+ fail
303
+ rescue
304
+ end
305
+ end
306
+
307
+ # エージェントマネージャを再作成する
308
+ def new_agent_mang( agent_registory=RegistryMock.new )
309
+ agent_mng = JIJI::AgentManager.new( "aaa", agent_registory, Logger.new(STDOUT))
310
+ agent_mng.operator = Struct.new(:trade_enable).new(true)
311
+ agent_mng.conf = CONF
312
+ agent_mng.conf.set( [:agent,:safe_level], 0)
313
+ agent_mng.registry = @registry_mock
314
+ return agent_mng
315
+ end
316
+
161
317
  class Agent
162
318
  include JIJI::Agent
163
319
 
@@ -174,6 +330,9 @@ class ProcessTest < RUNIT::TestCase
174
330
  def properties=( properties )
175
331
  @properties = properties
176
332
  end
333
+ def output
334
+ ["out1","out2"]
335
+ end
177
336
  attr :cl, true
178
337
  end
179
338
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unageanu-jiji
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaya Yamauchi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-26 00:00:00 -07:00
12
+ date: 2009-04-08 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency