unageanu-jiji 1.1.4 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +24 -1
- data/README +0 -0
- data/base/shared_lib/moving_average.rb +34 -33
- data/base/shared_lib/system/cross.rb +76 -0
- data/base/shared_lib/system/position_manager.rb +160 -0
- data/base/shared_lib/system/signal.rb +347 -0
- data/html/css/datatable.css +4 -4
- data/html/css/default.css +57 -5
- data/html/css/treeview.css +205 -0
- data/html/img/bin_closed.png +0 -0
- data/html/img/bin_empty.png +0 -0
- data/html/img/button_add_small.gif +0 -0
- data/html/img/button_add_small_gray.gif +0 -0
- data/html/img/button_add_small_over.gif +0 -0
- data/html/img/button_mkcol.gif +0 -0
- data/html/img/button_mkcol_gray.gif +0 -0
- data/html/img/button_mkcol_over.gif +0 -0
- data/html/img/button_remove_small.gif +0 -0
- data/html/img/button_remove_small_gray.gif +0 -0
- data/html/img/button_remove_small_over.gif +0 -0
- data/html/img/button_rename.gif +0 -0
- data/html/img/button_rename_gray.gif +0 -0
- data/html/img/button_rename_over.gif +0 -0
- data/html/img/control_play.png +0 -0
- data/html/img/control_play_blue.png +0 -0
- data/html/img/folder.png +0 -0
- data/html/img/folder_brick.png +0 -0
- data/html/img/folder_user.png +0 -0
- data/html/{js/codepress/images → img}/line-numbers.png +0 -0
- data/html/img/page_white_ruby.png +0 -0
- data/html/img/sidebar_agent_edit.png +0 -0
- data/html/img/sidebar_agent_edit_over.png +0 -0
- data/html/img/sidebar_agent_edit_s.png +0 -0
- data/html/img/yui/treeview-sprite.gif +0 -0
- data/html/index.html +34 -18
- data/html/js/agent-editor/agent-editor-page.js +324 -0
- data/html/js/agent-editor/agent-editor.js +363 -0
- data/html/js/agent-editor/agent-list-tree.js +251 -0
- data/html/js/agent-selector.js +23 -28
- data/html/js/app.js +63 -91
- data/html/js/bt-create-page.js +25 -19
- data/html/js/container-min.js +1 -1
- data/html/js/container.js +944 -0
- data/html/js/edit_area/autocompletion.js +11 -13
- data/html/js/edit_area/edit_area.css +79 -40
- data/html/js/edit_area/edit_area.js +255 -226
- data/html/js/edit_area/edit_area_compressor.php +4 -4
- data/html/js/edit_area/edit_area_full.gz +0 -0
- data/html/js/edit_area/edit_area_full.js +31 -31
- data/html/js/edit_area/edit_area_full_with_plugins.gz +0 -0
- data/html/js/edit_area/edit_area_full_with_plugins.js +31 -31
- data/html/js/edit_area/edit_area_functions.js +448 -341
- data/html/js/edit_area/edit_area_loader.js +409 -397
- data/html/js/edit_area/elements_functions.js +120 -123
- data/html/js/edit_area/highlight.js +305 -197
- data/html/js/edit_area/images/goto.png +0 -0
- data/html/js/edit_area/images/help.png +0 -0
- data/html/js/edit_area/images/redo.png +0 -0
- data/html/js/edit_area/images/save.png +0 -0
- data/html/js/edit_area/images/search.png +0 -0
- data/html/js/edit_area/images/undo.png +0 -0
- data/html/js/edit_area/images/word_wrap.gif +0 -0
- data/html/js/edit_area/keyboard.js +5 -5
- data/html/js/edit_area/langs/bg.js +73 -0
- data/html/js/edit_area/langs/cs.js +2 -0
- data/html/js/edit_area/langs/de.js +2 -0
- data/html/js/edit_area/langs/dk.js +2 -0
- data/html/js/edit_area/langs/en.js +2 -0
- data/html/js/edit_area/langs/eo.js +2 -0
- data/html/js/edit_area/langs/es.js +2 -0
- data/html/js/edit_area/langs/fi.js +67 -0
- data/html/js/edit_area/langs/fr.js +2 -0
- data/html/js/edit_area/langs/hr.js +2 -0
- data/html/js/edit_area/langs/it.js +2 -0
- data/html/js/edit_area/langs/ja.js +2 -0
- data/html/js/edit_area/langs/mk.js +2 -0
- data/html/js/edit_area/langs/nl.js +2 -0
- data/html/js/edit_area/langs/pl.js +2 -0
- data/html/js/edit_area/langs/pt.js +2 -0
- data/html/js/edit_area/langs/ru.js +2 -0
- data/html/js/edit_area/langs/sk.js +2 -0
- data/html/js/edit_area/langs/zh.js +67 -0
- data/html/js/edit_area/manage_area.js +362 -205
- data/html/js/edit_area/plugins/charmap/langs/bg.js +12 -0
- data/html/js/edit_area/plugins/charmap/langs/zh.js +6 -0
- data/html/js/edit_area/plugins/test/langs/bg.js +10 -0
- data/html/js/edit_area/plugins/test/langs/zh.js +4 -0
- data/html/js/edit_area/reg_syntax/java.js +56 -0
- data/html/js/edit_area/reg_syntax/ruby.js +9 -9
- data/html/js/edit_area/reg_syntax.js +15 -13
- data/html/js/edit_area/regexp.js +36 -32
- data/html/js/edit_area/resize_area.js +43 -47
- data/html/js/edit_area/search_replace.js +29 -29
- data/html/js/edit_area/template.html +6 -4
- data/html/js/json-broker-client.js +23 -17
- data/html/js/result-page.js +107 -57
- data/html/js/rt-setting-page.js +38 -15
- data/html/js/sidebar.js +41 -27
- data/html/js/templates.js +167 -32
- data/html/js/utils.js +143 -7
- data/html/js/yui/treeview.js +3671 -0
- data/html/swf/chart.swf +0 -0
- data/html/test/agent_editor_spec.js +815 -0
- data/html/test/index.html +40 -0
- data/html/test/jsspec/JSSpec.css +224 -0
- data/html/test/jsspec/JSSpec.js +1549 -0
- data/html/test/jsspec/diff_match_patch.js +1 -0
- data/html/test/utils_spec.js +111 -0
- data/lib/jiji/agent/agent.rb +69 -12
- data/lib/jiji/agent/agent_manager.rb +18 -12
- data/lib/jiji/agent/agent_registry.rb +35 -121
- data/lib/jiji/collector.rb +16 -6
- data/lib/jiji/command.rb +46 -5
- data/lib/jiji/dao/file_system_dao.rb +158 -0
- data/lib/jiji/dao/timed_data_dao.rb +2 -0
- data/lib/jiji/dao/trade_result_dao.rb +1 -1
- data/lib/jiji/error.rb +24 -8
- data/lib/jiji/migration/migrator1_2_0.rb +67 -0
- data/lib/jiji/models.rb +82 -24
- data/lib/jiji/operator.rb +55 -51
- data/lib/jiji/output.rb +85 -29
- data/lib/jiji/output_manager.rb +84 -0
- data/lib/jiji/plugin/embedded/single_click_client.rb +2 -2
- data/lib/jiji/plugin/securities_plugin.rb +0 -1
- data/lib/jiji/process.rb +229 -208
- data/lib/jiji/process_manager.rb +190 -96
- data/lib/jiji/registry.rb +87 -19
- data/lib/jiji/server.rb +1 -0
- data/lib/jiji/service/agent_service.rb +147 -48
- data/lib/jiji/service/output_service.rb +37 -17
- data/lib/jiji/service/process_service.rb +3 -5
- data/lib/jiji/service/trade_result_service.rb +4 -5
- data/lib/jiji/util/file_lock.rb +4 -4
- data/lib/jiji/util/include_proxy.rb +17 -0
- data/lib/jiji/util/json_broker.rb +6 -4
- data/lib/jiji/util/util.rb +1 -1
- data/swf/chart/fx/chart/Chart.as +7 -0
- data/swf/chart/fx/chart/ui/graph/GraphManager.as +15 -2
- data/test/ProcessTest/agents/foo.rb +10 -0
- data/test/ProcessTest/conf/configuration.yaml +3 -0
- data/test/agent/agent_tests.rb +10 -0
- data/test/agent/test_AgentManager.rb +28 -12
- data/test/agent/test_AgentRegistry.rb +194 -99
- data/test/agent/test_PeriodicallyAgent.rb +1 -2
- data/test/agent/test_Permitter.rb +1 -2
- data/test/all_tests.rb +7 -19
- data/test/dao/dao_tests.rb +9 -0
- data/test/dao/test_FileSystemDao.rb +431 -0
- data/test/dao/test_RateDao.rb +5 -7
- data/test/dao/test_TradeResultDao.rb +1 -2
- data/test/migration/migration_tests.rb +10 -0
- data/test/migration/migrator1_2_0test_data/basic/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/basic/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/basic/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/basic/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
- data/test/migration/migrator1_2_0test_data/basic/props.yaml +85 -0
- data/test/migration/migrator1_2_0test_data/illegal_props/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/illegal_props/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/illegal_props/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/illegal_props/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
- data/test/migration/migrator1_2_0test_data/illegal_props/props.yaml +1 -0
- data/test/migration/migrator1_2_0test_data/no_outs/props.yaml +85 -0
- data/test/migration/migrator1_2_0test_data/no_props/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/no_props/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/no_props/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
- data/test/migration/migrator1_2_0test_data/no_props/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
- data/test/migration/test_Migrator.rb +1 -1
- data/test/migration/test_Migrator1_0_3.rb +1 -1
- data/test/migration/test_Migrator1_1_0.rb +1 -1
- data/test/migration/test_Migrator1_2_0.rb +94 -0
- data/test/plugin/embedded/test_SingleClickClient.rb +1 -2
- data/test/plugin/plugin_tests.rb +8 -0
- data/test/plugin/test_Loader.rb +1 -1
- data/test/shared/rate.csv +144 -0
- data/test/shared/shared_tests.rb +9 -0
- data/test/shared/test_Cross.rb +144 -0
- data/test/shared/test_PositionManager.rb +285 -0
- data/test/shared/test_Signal.rb +65 -0
- data/test/test_Output.rb +28 -21
- data/test/test_OutputManager.rb +162 -0
- data/test/test_Output_registry.rb +6 -17
- data/test/test_Process.rb +434 -222
- data/test/test_ProcessManager.rb +458 -101
- data/test/test_utils.rb +71 -8
- data/test/util/test_BlockToSession.rb +1 -2
- data/test/util/test_CSV.rb +1 -2
- data/test/util/test_SynchronizeInterceptor.rb +1 -2
- data/test/util/util_tests.rb +9 -0
- metadata +127 -47
- data/html/js/agent-editor-page.js +0 -440
- data/html/js/codepress/codepress.css +0 -21
- data/html/js/codepress/codepress.html +0 -35
- data/html/js/codepress/codepress.js +0 -138
- data/html/js/codepress/engines/gecko.js +0 -293
- data/html/js/codepress/engines/khtml.js +0 -0
- data/html/js/codepress/engines/msie.js +0 -304
- data/html/js/codepress/engines/older.js +0 -0
- data/html/js/codepress/engines/opera.js +0 -260
- data/html/js/codepress/images/line-numbers.gif +0 -0
- data/html/js/codepress/index.html +0 -443
- data/html/js/codepress/languages/asp.css +0 -71
- data/html/js/codepress/languages/asp.js +0 -117
- data/html/js/codepress/languages/autoit.css +0 -13
- data/html/js/codepress/languages/autoit.js +0 -32
- data/html/js/codepress/languages/csharp.css +0 -9
- data/html/js/codepress/languages/csharp.js +0 -25
- data/html/js/codepress/languages/css.css +0 -10
- data/html/js/codepress/languages/css.js +0 -23
- data/html/js/codepress/languages/generic.css +0 -9
- data/html/js/codepress/languages/generic.js +0 -25
- data/html/js/codepress/languages/html.css +0 -13
- data/html/js/codepress/languages/html.js +0 -59
- data/html/js/codepress/languages/java.css +0 -7
- data/html/js/codepress/languages/java.js +0 -24
- data/html/js/codepress/languages/javascript.css +0 -8
- data/html/js/codepress/languages/javascript.js +0 -30
- data/html/js/codepress/languages/perl.css +0 -11
- data/html/js/codepress/languages/perl.js +0 -27
- data/html/js/codepress/languages/php.css +0 -12
- data/html/js/codepress/languages/php.js +0 -61
- data/html/js/codepress/languages/ruby.css +0 -10
- data/html/js/codepress/languages/ruby.js +0 -26
- data/html/js/codepress/languages/sql.css +0 -10
- data/html/js/codepress/languages/sql.js +0 -30
- data/html/js/codepress/languages/text.css +0 -5
- data/html/js/codepress/languages/text.js +0 -9
- data/html/js/codepress/languages/vbscript.css +0 -71
- data/html/js/codepress/languages/vbscript.js +0 -117
- data/html/js/codepress/languages/xsl.css +0 -15
- data/html/js/codepress/languages/xsl.js +0 -103
- data/html/js/codepress/license.txt +0 -458
- data/html/js/edit_area/images/Thumbs.db +0 -0
- data/test/plugin/test_gem/a/lib/jiji_plugin_test.rb +0 -6
data/lib/jiji/operator.rb
CHANGED
@@ -9,7 +9,7 @@ require 'uuidtools'
|
|
9
9
|
module JIJI
|
10
10
|
|
11
11
|
#==オペレーター
|
12
|
-
class Operator
|
12
|
+
class Operator #:nodoc:
|
13
13
|
|
14
14
|
#===コンストラクタ
|
15
15
|
#*money*:: 保証金
|
@@ -129,13 +129,12 @@ module JIJI
|
|
129
129
|
attr :conf, true
|
130
130
|
end
|
131
131
|
|
132
|
-
|
133
|
-
|
134
132
|
#==ポジション
|
135
133
|
class Position
|
136
134
|
|
137
|
-
|
135
|
+
#売り/買い区分:売り
|
138
136
|
SELL = 0
|
137
|
+
#売り/買い区分:買い
|
139
138
|
BUY = 1
|
140
139
|
|
141
140
|
#状態:注文中
|
@@ -151,18 +150,18 @@ module JIJI
|
|
151
150
|
|
152
151
|
#===コンストラクタ
|
153
152
|
#
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
153
|
+
#sell_or_buy:: 売りor買い
|
154
|
+
#count:: 数量
|
155
|
+
#unit:: 取引単位
|
156
|
+
#date:: 取引日時
|
157
|
+
#rate:: レート
|
158
|
+
#pair:: 通貨ペア
|
159
|
+
#trader:: 取引実行者
|
160
|
+
#operator:: operator
|
161
|
+
#open_interest_no:: 建玉番号
|
162
|
+
#order_no:: 注文番号
|
164
163
|
def initialize( position_id, sell_or_buy, count, unit, date, rate, pair,
|
165
|
-
trader, operator, open_interest_no="", order_no="" )
|
164
|
+
trader, operator, open_interest_no="", order_no="" ) #:nodoc:
|
166
165
|
@position_id = position_id
|
167
166
|
@sell_or_buy = sell_or_buy
|
168
167
|
@count = count
|
@@ -186,19 +185,19 @@ module JIJI
|
|
186
185
|
@swap_time += 60*60*24 if date > @swap_time
|
187
186
|
end
|
188
187
|
|
189
|
-
def _commit
|
188
|
+
def _commit #:nodoc:
|
190
189
|
raise "illegal state" if @state != STATE_START
|
191
190
|
@state = STATE_FIXED
|
192
191
|
@fix_date = @current_date
|
193
192
|
@fix_rate = @current_rate
|
194
193
|
end
|
195
194
|
|
196
|
-
def lost
|
195
|
+
def lost #:nodoc:
|
197
196
|
@state = STATE_LOST
|
198
197
|
end
|
199
198
|
|
200
199
|
#===現在価格を更新
|
201
|
-
def next(rates)
|
200
|
+
def next(rates) #:nodoc:
|
202
201
|
return if @state == STATE_FIXED
|
203
202
|
rate = rates[@pair]
|
204
203
|
@current_rate = @sell_or_buy == BUY ? rate.bid : rate.ask
|
@@ -216,15 +215,15 @@ module JIJI
|
|
216
215
|
|
217
216
|
@current_date = rates.time
|
218
217
|
end
|
219
|
-
|
220
|
-
def [](key)
|
218
|
+
|
219
|
+
def [](key) #:nodoc:
|
221
220
|
@info[key]
|
222
221
|
end
|
223
|
-
def []=(key, value)
|
222
|
+
def []=(key, value) #:nodoc:
|
224
223
|
@info[key] = value
|
225
224
|
end
|
226
225
|
|
227
|
-
def values
|
226
|
+
def values #:nodoc:
|
228
227
|
{
|
229
228
|
:position_id => position_id,
|
230
229
|
:raw_position_id => raw_position_id,
|
@@ -243,14 +242,14 @@ module JIJI
|
|
243
242
|
}
|
244
243
|
end
|
245
244
|
|
246
|
-
# クライアント
|
247
|
-
attr :operator
|
245
|
+
# クライアント
|
246
|
+
attr :operator #:nodoc:
|
248
247
|
|
249
248
|
# 一意な識別子
|
250
249
|
attr_reader :position_id
|
251
250
|
# プラグインが返す識別子
|
252
251
|
attr :raw_position_id, true
|
253
|
-
|
252
|
+
|
254
253
|
# 売りか買いか?
|
255
254
|
attr_reader :sell_or_buy
|
256
255
|
# 状態
|
@@ -276,17 +275,17 @@ module JIJI
|
|
276
275
|
attr_reader :swap
|
277
276
|
# 通貨ペア
|
278
277
|
attr_reader :pair
|
279
|
-
#
|
278
|
+
# 取引を行ったエージェント名
|
280
279
|
attr_reader :trader
|
281
280
|
end
|
282
281
|
|
283
282
|
#==リアル取引用オペレーター
|
284
|
-
class RmtOperator < Operator
|
283
|
+
class RmtOperator < Operator #:nodoc:
|
285
284
|
|
286
285
|
#===コンストラクタ
|
287
|
-
|
288
|
-
|
289
|
-
|
286
|
+
#client:: クライアント
|
287
|
+
#logger:: ロガー
|
288
|
+
#money:: 保証金
|
290
289
|
def initialize( client, logger, trade_result_dao, trade_enable=true, money=nil )
|
291
290
|
super(trade_result_dao,money)
|
292
291
|
@client = client
|
@@ -295,8 +294,8 @@ module JIJI
|
|
295
294
|
end
|
296
295
|
|
297
296
|
#===購入する
|
298
|
-
|
299
|
-
|
297
|
+
#count:: 購入する数量
|
298
|
+
#return:: Position
|
300
299
|
def buy(count, pair=:EURJPY, trader="")
|
301
300
|
id = nil
|
302
301
|
if @trade_enable
|
@@ -312,8 +311,8 @@ module JIJI
|
|
312
311
|
end
|
313
312
|
|
314
313
|
#===売却する
|
315
|
-
|
316
|
-
|
314
|
+
#count:: 売却する数量
|
315
|
+
#return:: Position
|
317
316
|
def sell(count, pair=:EURJPY, trader="")
|
318
317
|
id = nil
|
319
318
|
if @trade_enable
|
@@ -346,46 +345,51 @@ module JIJI
|
|
346
345
|
end
|
347
346
|
end
|
348
347
|
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
#
|
348
|
+
#===オペレータ
|
349
|
+
#取引を行うためのクラスです。
|
350
|
+
#エージェントのプロパティとして設定されるので、エージェント内では以下のコードで取引を実行できます。
|
351
|
+
#
|
352
|
+
# sell_position = operator.sell(1, :EURJPY) # 売り
|
353
|
+
# buy_position = operator.buy(1, :EURJPY) # 買い
|
354
|
+
# operator.commit( sell_position ) # 決済
|
355
|
+
#
|
353
356
|
class AgentOperator
|
354
|
-
def initialize( operator, agent_name )
|
357
|
+
def initialize( operator, agent_name ) #:nodoc:
|
355
358
|
@operator = operator
|
356
|
-
@
|
359
|
+
@agent_name = agent_name
|
357
360
|
@positions = {}.taint
|
358
361
|
end
|
359
362
|
|
360
|
-
|
363
|
+
#====購入します。
|
361
364
|
#count:: 購入する数量
|
362
|
-
#pair::
|
363
|
-
#return:: ポジション
|
365
|
+
#pair:: 通貨ペアコード 例) :EURJPY
|
366
|
+
#return:: ポジション(JIJI::Position)
|
364
367
|
def buy(count, pair=:EURJPY)
|
365
|
-
p = @operator.buy( count, pair, @
|
368
|
+
p = @operator.buy( count, pair, @agent_name )
|
366
369
|
@positions[p.position_id] = p
|
367
370
|
return p
|
368
371
|
end
|
369
372
|
|
370
|
-
|
373
|
+
#====売却します。
|
371
374
|
#count:: 売却する数量
|
372
|
-
#pair::
|
373
|
-
#return:: ポジション
|
375
|
+
#pair:: 通貨ペアコード 例) :EURJPY
|
376
|
+
#return:: ポジション(JIJI::Position)
|
374
377
|
def sell(count, pair=:EURJPY)
|
375
|
-
p = @operator.sell( count, pair, @
|
378
|
+
p = @operator.sell( count, pair, @agent_name )
|
376
379
|
@positions[p.position_id] = p
|
377
380
|
return p
|
378
381
|
end
|
379
382
|
|
380
|
-
|
383
|
+
#===取引を確定します。
|
384
|
+
#position:: ホジション(JIJI::Position)
|
381
385
|
def commit(position)
|
382
386
|
@operator.commit(position)
|
383
387
|
@positions.delete position.position_id
|
384
388
|
end
|
385
|
-
|
389
|
+
|
386
390
|
#建て玉
|
387
391
|
attr_reader :positions
|
388
|
-
|
392
|
+
attr :agent_name, true
|
389
393
|
end
|
390
394
|
|
391
395
|
end
|
data/lib/jiji/output.rb
CHANGED
@@ -8,43 +8,85 @@ require 'fileutils'
|
|
8
8
|
|
9
9
|
module JIJI
|
10
10
|
|
11
|
-
|
11
|
+
#===グラフデータの出力先を作成するためのクラス
|
12
|
+
#エージェントでグラフを描画するには、JIJI::Output#getを呼び出してJIJI::GraphOutを取得し、グラフデータを出力します。
|
13
|
+
#
|
14
|
+
# # output から出力先を作成。
|
15
|
+
# @out = output.get( "移動平均線", :graph, {
|
16
|
+
# :column_count=>2, # データ数は2
|
17
|
+
# :graph_type=>:line, # 線グラフ
|
18
|
+
# :lines=>[30,40,50], # 30,40,50のメモリを描く
|
19
|
+
# :colors=>["#779999","#557777"] # デフォルトのグラフの色
|
20
|
+
# })
|
21
|
+
# ...(略)
|
22
|
+
#
|
23
|
+
# # グラフのデータを出力。
|
24
|
+
# # 出力先作成時にデータ数は2としているので、2つのデータを指定可能。
|
25
|
+
# @out.put( 33, 39 )
|
26
|
+
# @out.put( 45, 43 )
|
27
|
+
# @out.put( 60, 69 )
|
28
|
+
#
|
12
29
|
class Output
|
13
30
|
|
31
|
+
#プロパティファイル名
|
32
|
+
PROPERTIES_FILE_NAME = "properties.yaml" #:nodoc:
|
33
|
+
#メタ情報ファイル名
|
34
|
+
META_FILE_NAME = "meta.yaml" #:nodoc:
|
35
|
+
|
14
36
|
include Enumerable
|
15
37
|
|
16
|
-
def initialize(
|
17
|
-
@dir = "#{dir}/#{
|
38
|
+
def initialize( agent_id, dir, scales=[] ) #:nodoc:
|
39
|
+
@dir = "#{dir}/#{agent_id}" # 「ベースディレクトリ/エージェントID/出力名」に保存する。
|
18
40
|
FileUtils.mkdir_p @dir
|
19
41
|
|
20
42
|
@outs = {}
|
21
43
|
@scales = scales
|
44
|
+
@agent_id = agent_id
|
22
45
|
|
23
46
|
# 既存データの読み込み
|
24
47
|
DirLock.new( @dir ).writelock {
|
25
48
|
Dir.glob( "#{@dir}/*" ) {|d|
|
49
|
+
meta = "#{d}/#{META_FILE_NAME}"
|
26
50
|
next unless File.directory? d
|
27
|
-
next unless File.exist?
|
28
|
-
props = YAML.load_file
|
51
|
+
next unless File.exist? meta
|
52
|
+
props = YAML.load_file meta
|
29
53
|
@outs[props[:name]] =
|
30
54
|
create_output( d, props[:name], props[:type].to_sym, props )
|
31
55
|
}
|
32
56
|
}
|
57
|
+
|
58
|
+
# 名前の読み込み
|
59
|
+
file = properties_file
|
60
|
+
if File.exist? file
|
61
|
+
properties = YAML.load_file(file)
|
62
|
+
@agent_name = properties[:agent_name]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
#エージェント名を設定する
|
67
|
+
def agent_name=(name) #:nodoc:
|
68
|
+
@agent_name = name
|
69
|
+
FileLock.new( properties_file ).writelock { |f|
|
70
|
+
f.write( YAML.dump({:agent_name=>name}) )
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
#エージェント名を取得する
|
75
|
+
def agent_name #:nodoc:
|
76
|
+
@agent_name
|
33
77
|
end
|
34
78
|
|
35
|
-
|
36
|
-
# 対応する出力先がなければ新規に作成。
|
79
|
+
#====グラフの出力先オブジェクトを取得します。
|
37
80
|
#
|
38
81
|
#name:: 名前(UIでの表示名)
|
39
|
-
#type:: 種別。:
|
40
|
-
#option::
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
# --「:colors」 .. グラフの色を「#FFFFFF」形式の文字列の配列で指定する。指定を省略した場合「0x557777」で描画される。
|
82
|
+
#type:: 種別。:graph を指定してください。
|
83
|
+
#option:: 補足情報。以下が指定可能です
|
84
|
+
# - 「:column_count」 .. グラフのカラム数を整数値で指定します。(<b>必須</b>)
|
85
|
+
# - 「:graph_type」 .. グラフの種類を指定します。以下の値が指定可能です。
|
86
|
+
# - :rate .. レート情報に重ねて表示(移動平均線やボリンジャーバンド向け)。グラフは、ローソク足描画領域に描画される。
|
87
|
+
# - :zero_base .. 0を中心線とした線グラフ(RCIやMACD向け)。グラフは、グラフ描画領域に描画される。
|
88
|
+
# - :line .. 線グラフとして描画する。(デフォルト)。グラフは、グラフ描画領域に描画される。
|
89
|
+
# - 「:colors」 .. グラフの色を「#FFFFFF」形式の文字列の配列で指定します。指定を省略した場合「0x557777」で描画されます。
|
48
90
|
#return:: 出力先
|
49
91
|
def get( name, type=:graph, options={} )
|
50
92
|
raise "illegal Name. name=#{name}" if name =~ /[\x00-\x1F\x7F\\\/\r\n\t]/
|
@@ -62,24 +104,33 @@ module JIJI
|
|
62
104
|
end
|
63
105
|
|
64
106
|
# 出力先を列挙する
|
65
|
-
def each( &block )
|
107
|
+
def each( &block ) #:nodoc:
|
66
108
|
@outs.each( &block )
|
67
109
|
end
|
68
110
|
|
111
|
+
# 出力先をが存在するか評価する
|
112
|
+
def exist?( name ) #:nodoc:
|
113
|
+
@outs.key? name
|
114
|
+
end
|
115
|
+
|
116
|
+
|
69
117
|
# 現在時刻を設定する
|
70
|
-
def time=(time)
|
118
|
+
def time=(time) #:nodoc:
|
71
119
|
@time = time
|
72
120
|
@outs.each_pair {|k,v|
|
73
121
|
v.time = time
|
74
122
|
}
|
75
123
|
end
|
76
124
|
# 現在時刻
|
77
|
-
attr_reader :time
|
125
|
+
attr_reader :time #:nodoc:
|
78
126
|
# スケール
|
79
|
-
attr :scales, true
|
127
|
+
attr :scales, true #:nodoc:
|
128
|
+
# エージェントID
|
129
|
+
attr_reader :agent_id #:nodoc:
|
130
|
+
|
80
131
|
private
|
81
132
|
# 出力先を作る
|
82
|
-
def create_output( sub_dir, name, type, options )
|
133
|
+
def create_output( sub_dir, name, type, options ) #:nodoc:
|
83
134
|
case type
|
84
135
|
when :event
|
85
136
|
EventOut.new( sub_dir, name, options )
|
@@ -89,10 +140,14 @@ module JIJI
|
|
89
140
|
raise "unkown output type."
|
90
141
|
end
|
91
142
|
end
|
143
|
+
#プロパティ情報ファイルのパスを取得する
|
144
|
+
def properties_file #:nodoc:
|
145
|
+
"#{@dir}/#{PROPERTIES_FILE_NAME}"
|
146
|
+
end
|
92
147
|
end
|
93
148
|
|
94
|
-
|
95
|
-
class BaseOut
|
149
|
+
#===出力先の基底クラス
|
150
|
+
class BaseOut #:nodoc:
|
96
151
|
|
97
152
|
include Enumerable
|
98
153
|
|
@@ -121,7 +176,7 @@ module JIJI
|
|
121
176
|
|
122
177
|
#設定値をファイルに出力
|
123
178
|
def save
|
124
|
-
FileLock.new("#{@dir}
|
179
|
+
FileLock.new("#{@dir}/#{JIJI::Output::META_FILE_NAME}" ).writelock { |f|
|
125
180
|
f.write( YAML.dump(@options) )
|
126
181
|
}
|
127
182
|
end
|
@@ -134,7 +189,7 @@ module JIJI
|
|
134
189
|
end
|
135
190
|
|
136
191
|
# イベントデータの出力先
|
137
|
-
class EventOut < BaseOut
|
192
|
+
class EventOut < BaseOut #:nodoc:
|
138
193
|
# ログを書き込む
|
139
194
|
def put( type, message )
|
140
195
|
@dao << JIJI::Dao::BasicTimedData.new(
|
@@ -145,18 +200,19 @@ module JIJI
|
|
145
200
|
end
|
146
201
|
end
|
147
202
|
|
148
|
-
|
203
|
+
#===グラフデータの出力先
|
149
204
|
class GraphOut < BaseOut
|
150
205
|
# コンストラクタ
|
151
|
-
def initialize( dir, name, options, scales=[] )
|
206
|
+
def initialize( dir, name, options, scales=[] ) #:nodoc:
|
152
207
|
@scales = scales
|
153
208
|
super( dir, name, options )
|
154
209
|
end
|
155
|
-
|
210
|
+
#====グラフデータを出力します。
|
211
|
+
#numbers:: グラフデータ
|
156
212
|
def put( *numbers )
|
157
213
|
@dao << JIJI::Dao::BasicTimedData.new( numbers << @time.to_i, @time)
|
158
214
|
end
|
159
|
-
def aggregators
|
215
|
+
def aggregators #:nodoc:
|
160
216
|
list = @scales.map{|s| JIJI::Dao::AvgAggregator.new s}
|
161
217
|
list << JIJI::Dao::RawAggregator.new
|
162
218
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
require 'jiji/util/util'
|
3
|
+
require "jiji/dao/timed_data_dao"
|
4
|
+
require 'yaml'
|
5
|
+
require 'jiji/util/fix_yaml_bug'
|
6
|
+
require 'jiji/util/file_lock'
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
module JIJI
|
10
|
+
|
11
|
+
# Outputのマネージャ
|
12
|
+
class OutputManager
|
13
|
+
|
14
|
+
#コンストラクタ
|
15
|
+
#registry:: レジストリ
|
16
|
+
def initialize( registry )
|
17
|
+
@registry = registry
|
18
|
+
end
|
19
|
+
|
20
|
+
#指定されたプロセスのOutputを列挙する
|
21
|
+
#process_id:: プロセスID
|
22
|
+
def each( process_id )
|
23
|
+
map = get_process_map( process_id )
|
24
|
+
map.each_pair {|k,v|
|
25
|
+
yield v
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
#指定されたプロセスの指定エージェントのOutputを生成する
|
30
|
+
#すでに作成済みであればそれをそのまま返す。
|
31
|
+
#process_id:: プロセスID
|
32
|
+
#agent_id:: エージェントID
|
33
|
+
def create( process_id, agent_id )
|
34
|
+
map = get_process_map( process_id )
|
35
|
+
unless map.key?( agent_id )
|
36
|
+
map[agent_id] = @registry.output( process_id, agent_id )
|
37
|
+
end
|
38
|
+
return map[agent_id]
|
39
|
+
end
|
40
|
+
|
41
|
+
#指定されたプロセスの指定エージェントのOutputを取得する
|
42
|
+
#process_id:: プロセスID
|
43
|
+
#agent_id:: エージェントID
|
44
|
+
def get( process_id, agent_id )
|
45
|
+
map = get_process_map( process_id )
|
46
|
+
unless map.key?( agent_id )
|
47
|
+
raise UserError.new( JIJI::ERROR_NOT_FOUND, "agent not found. id=#{agent_id}")
|
48
|
+
end
|
49
|
+
return map[agent_id]
|
50
|
+
end
|
51
|
+
|
52
|
+
#指定されたプロセスの指定エージェントのOutputを削除する
|
53
|
+
#process_id:: プロセスID
|
54
|
+
#agent_id:: エージェントID
|
55
|
+
def delete( process_id, agent_id )
|
56
|
+
map = get_process_map( process_id )
|
57
|
+
unless map.key?( agent_id )
|
58
|
+
raise UserError.new( JIJI::ERROR_NOT_FOUND, "agent not found. id=#{agent_id}")
|
59
|
+
end
|
60
|
+
FileUtils.rm_rf "#{@registry.output_dir(process_id)}/#{agent_id}"
|
61
|
+
map.delete(agent_id)
|
62
|
+
end
|
63
|
+
|
64
|
+
# 指定のプロセスに対応するoutputを取得する。
|
65
|
+
def get_process_map( process_id )
|
66
|
+
load_output( process_id )
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def load_output( process_id )
|
71
|
+
# 既存データの読み込み
|
72
|
+
map = {}
|
73
|
+
dir = @registry.output_dir(process_id)
|
74
|
+
Dir.glob( "#{dir}/*" ) {|d|
|
75
|
+
properties_file = "#{d}/#{JIJI::Output::PROPERTIES_FILE_NAME}"
|
76
|
+
next unless File.directory? d
|
77
|
+
next unless File.exist? properties_file
|
78
|
+
agent_id = File.basename( d )
|
79
|
+
map[agent_id] = @registry.output( process_id, agent_id )
|
80
|
+
}
|
81
|
+
map
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|