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.
Files changed (233) hide show
  1. data/ChangeLog +24 -1
  2. data/README +0 -0
  3. data/base/shared_lib/moving_average.rb +34 -33
  4. data/base/shared_lib/system/cross.rb +76 -0
  5. data/base/shared_lib/system/position_manager.rb +160 -0
  6. data/base/shared_lib/system/signal.rb +347 -0
  7. data/html/css/datatable.css +4 -4
  8. data/html/css/default.css +57 -5
  9. data/html/css/treeview.css +205 -0
  10. data/html/img/bin_closed.png +0 -0
  11. data/html/img/bin_empty.png +0 -0
  12. data/html/img/button_add_small.gif +0 -0
  13. data/html/img/button_add_small_gray.gif +0 -0
  14. data/html/img/button_add_small_over.gif +0 -0
  15. data/html/img/button_mkcol.gif +0 -0
  16. data/html/img/button_mkcol_gray.gif +0 -0
  17. data/html/img/button_mkcol_over.gif +0 -0
  18. data/html/img/button_remove_small.gif +0 -0
  19. data/html/img/button_remove_small_gray.gif +0 -0
  20. data/html/img/button_remove_small_over.gif +0 -0
  21. data/html/img/button_rename.gif +0 -0
  22. data/html/img/button_rename_gray.gif +0 -0
  23. data/html/img/button_rename_over.gif +0 -0
  24. data/html/img/control_play.png +0 -0
  25. data/html/img/control_play_blue.png +0 -0
  26. data/html/img/folder.png +0 -0
  27. data/html/img/folder_brick.png +0 -0
  28. data/html/img/folder_user.png +0 -0
  29. data/html/{js/codepress/images → img}/line-numbers.png +0 -0
  30. data/html/img/page_white_ruby.png +0 -0
  31. data/html/img/sidebar_agent_edit.png +0 -0
  32. data/html/img/sidebar_agent_edit_over.png +0 -0
  33. data/html/img/sidebar_agent_edit_s.png +0 -0
  34. data/html/img/yui/treeview-sprite.gif +0 -0
  35. data/html/index.html +34 -18
  36. data/html/js/agent-editor/agent-editor-page.js +324 -0
  37. data/html/js/agent-editor/agent-editor.js +363 -0
  38. data/html/js/agent-editor/agent-list-tree.js +251 -0
  39. data/html/js/agent-selector.js +23 -28
  40. data/html/js/app.js +63 -91
  41. data/html/js/bt-create-page.js +25 -19
  42. data/html/js/container-min.js +1 -1
  43. data/html/js/container.js +944 -0
  44. data/html/js/edit_area/autocompletion.js +11 -13
  45. data/html/js/edit_area/edit_area.css +79 -40
  46. data/html/js/edit_area/edit_area.js +255 -226
  47. data/html/js/edit_area/edit_area_compressor.php +4 -4
  48. data/html/js/edit_area/edit_area_full.gz +0 -0
  49. data/html/js/edit_area/edit_area_full.js +31 -31
  50. data/html/js/edit_area/edit_area_full_with_plugins.gz +0 -0
  51. data/html/js/edit_area/edit_area_full_with_plugins.js +31 -31
  52. data/html/js/edit_area/edit_area_functions.js +448 -341
  53. data/html/js/edit_area/edit_area_loader.js +409 -397
  54. data/html/js/edit_area/elements_functions.js +120 -123
  55. data/html/js/edit_area/highlight.js +305 -197
  56. data/html/js/edit_area/images/goto.png +0 -0
  57. data/html/js/edit_area/images/help.png +0 -0
  58. data/html/js/edit_area/images/redo.png +0 -0
  59. data/html/js/edit_area/images/save.png +0 -0
  60. data/html/js/edit_area/images/search.png +0 -0
  61. data/html/js/edit_area/images/undo.png +0 -0
  62. data/html/js/edit_area/images/word_wrap.gif +0 -0
  63. data/html/js/edit_area/keyboard.js +5 -5
  64. data/html/js/edit_area/langs/bg.js +73 -0
  65. data/html/js/edit_area/langs/cs.js +2 -0
  66. data/html/js/edit_area/langs/de.js +2 -0
  67. data/html/js/edit_area/langs/dk.js +2 -0
  68. data/html/js/edit_area/langs/en.js +2 -0
  69. data/html/js/edit_area/langs/eo.js +2 -0
  70. data/html/js/edit_area/langs/es.js +2 -0
  71. data/html/js/edit_area/langs/fi.js +67 -0
  72. data/html/js/edit_area/langs/fr.js +2 -0
  73. data/html/js/edit_area/langs/hr.js +2 -0
  74. data/html/js/edit_area/langs/it.js +2 -0
  75. data/html/js/edit_area/langs/ja.js +2 -0
  76. data/html/js/edit_area/langs/mk.js +2 -0
  77. data/html/js/edit_area/langs/nl.js +2 -0
  78. data/html/js/edit_area/langs/pl.js +2 -0
  79. data/html/js/edit_area/langs/pt.js +2 -0
  80. data/html/js/edit_area/langs/ru.js +2 -0
  81. data/html/js/edit_area/langs/sk.js +2 -0
  82. data/html/js/edit_area/langs/zh.js +67 -0
  83. data/html/js/edit_area/manage_area.js +362 -205
  84. data/html/js/edit_area/plugins/charmap/langs/bg.js +12 -0
  85. data/html/js/edit_area/plugins/charmap/langs/zh.js +6 -0
  86. data/html/js/edit_area/plugins/test/langs/bg.js +10 -0
  87. data/html/js/edit_area/plugins/test/langs/zh.js +4 -0
  88. data/html/js/edit_area/reg_syntax/java.js +56 -0
  89. data/html/js/edit_area/reg_syntax/ruby.js +9 -9
  90. data/html/js/edit_area/reg_syntax.js +15 -13
  91. data/html/js/edit_area/regexp.js +36 -32
  92. data/html/js/edit_area/resize_area.js +43 -47
  93. data/html/js/edit_area/search_replace.js +29 -29
  94. data/html/js/edit_area/template.html +6 -4
  95. data/html/js/json-broker-client.js +23 -17
  96. data/html/js/result-page.js +107 -57
  97. data/html/js/rt-setting-page.js +38 -15
  98. data/html/js/sidebar.js +41 -27
  99. data/html/js/templates.js +167 -32
  100. data/html/js/utils.js +143 -7
  101. data/html/js/yui/treeview.js +3671 -0
  102. data/html/swf/chart.swf +0 -0
  103. data/html/test/agent_editor_spec.js +815 -0
  104. data/html/test/index.html +40 -0
  105. data/html/test/jsspec/JSSpec.css +224 -0
  106. data/html/test/jsspec/JSSpec.js +1549 -0
  107. data/html/test/jsspec/diff_match_patch.js +1 -0
  108. data/html/test/utils_spec.js +111 -0
  109. data/lib/jiji/agent/agent.rb +69 -12
  110. data/lib/jiji/agent/agent_manager.rb +18 -12
  111. data/lib/jiji/agent/agent_registry.rb +35 -121
  112. data/lib/jiji/collector.rb +16 -6
  113. data/lib/jiji/command.rb +46 -5
  114. data/lib/jiji/dao/file_system_dao.rb +158 -0
  115. data/lib/jiji/dao/timed_data_dao.rb +2 -0
  116. data/lib/jiji/dao/trade_result_dao.rb +1 -1
  117. data/lib/jiji/error.rb +24 -8
  118. data/lib/jiji/migration/migrator1_2_0.rb +67 -0
  119. data/lib/jiji/models.rb +82 -24
  120. data/lib/jiji/operator.rb +55 -51
  121. data/lib/jiji/output.rb +85 -29
  122. data/lib/jiji/output_manager.rb +84 -0
  123. data/lib/jiji/plugin/embedded/single_click_client.rb +2 -2
  124. data/lib/jiji/plugin/securities_plugin.rb +0 -1
  125. data/lib/jiji/process.rb +229 -208
  126. data/lib/jiji/process_manager.rb +190 -96
  127. data/lib/jiji/registry.rb +87 -19
  128. data/lib/jiji/server.rb +1 -0
  129. data/lib/jiji/service/agent_service.rb +147 -48
  130. data/lib/jiji/service/output_service.rb +37 -17
  131. data/lib/jiji/service/process_service.rb +3 -5
  132. data/lib/jiji/service/trade_result_service.rb +4 -5
  133. data/lib/jiji/util/file_lock.rb +4 -4
  134. data/lib/jiji/util/include_proxy.rb +17 -0
  135. data/lib/jiji/util/json_broker.rb +6 -4
  136. data/lib/jiji/util/util.rb +1 -1
  137. data/swf/chart/fx/chart/Chart.as +7 -0
  138. data/swf/chart/fx/chart/ui/graph/GraphManager.as +15 -2
  139. data/test/ProcessTest/agents/foo.rb +10 -0
  140. data/test/ProcessTest/conf/configuration.yaml +3 -0
  141. data/test/agent/agent_tests.rb +10 -0
  142. data/test/agent/test_AgentManager.rb +28 -12
  143. data/test/agent/test_AgentRegistry.rb +194 -99
  144. data/test/agent/test_PeriodicallyAgent.rb +1 -2
  145. data/test/agent/test_Permitter.rb +1 -2
  146. data/test/all_tests.rb +7 -19
  147. data/test/dao/dao_tests.rb +9 -0
  148. data/test/dao/test_FileSystemDao.rb +431 -0
  149. data/test/dao/test_RateDao.rb +5 -7
  150. data/test/dao/test_TradeResultDao.rb +1 -2
  151. data/test/migration/migration_tests.rb +10 -0
  152. data/test/migration/migrator1_2_0test_data/basic/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  153. data/test/migration/migrator1_2_0test_data/basic/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  154. data/test/migration/migrator1_2_0test_data/basic/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  155. data/test/migration/migrator1_2_0test_data/basic/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
  156. data/test/migration/migrator1_2_0test_data/basic/props.yaml +85 -0
  157. data/test/migration/migrator1_2_0test_data/illegal_props/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  158. data/test/migration/migrator1_2_0test_data/illegal_props/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  159. data/test/migration/migrator1_2_0test_data/illegal_props/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  160. data/test/migration/migrator1_2_0test_data/illegal_props/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
  161. data/test/migration/migrator1_2_0test_data/illegal_props/props.yaml +1 -0
  162. data/test/migration/migrator1_2_0test_data/no_outs/props.yaml +85 -0
  163. data/test/migration/migrator1_2_0test_data/no_props/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  164. data/test/migration/migrator1_2_0test_data/no_props/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  165. data/test/migration/migrator1_2_0test_data/no_props/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  166. data/test/migration/migrator1_2_0test_data/no_props/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
  167. data/test/migration/test_Migrator.rb +1 -1
  168. data/test/migration/test_Migrator1_0_3.rb +1 -1
  169. data/test/migration/test_Migrator1_1_0.rb +1 -1
  170. data/test/migration/test_Migrator1_2_0.rb +94 -0
  171. data/test/plugin/embedded/test_SingleClickClient.rb +1 -2
  172. data/test/plugin/plugin_tests.rb +8 -0
  173. data/test/plugin/test_Loader.rb +1 -1
  174. data/test/shared/rate.csv +144 -0
  175. data/test/shared/shared_tests.rb +9 -0
  176. data/test/shared/test_Cross.rb +144 -0
  177. data/test/shared/test_PositionManager.rb +285 -0
  178. data/test/shared/test_Signal.rb +65 -0
  179. data/test/test_Output.rb +28 -21
  180. data/test/test_OutputManager.rb +162 -0
  181. data/test/test_Output_registry.rb +6 -17
  182. data/test/test_Process.rb +434 -222
  183. data/test/test_ProcessManager.rb +458 -101
  184. data/test/test_utils.rb +71 -8
  185. data/test/util/test_BlockToSession.rb +1 -2
  186. data/test/util/test_CSV.rb +1 -2
  187. data/test/util/test_SynchronizeInterceptor.rb +1 -2
  188. data/test/util/util_tests.rb +9 -0
  189. metadata +127 -47
  190. data/html/js/agent-editor-page.js +0 -440
  191. data/html/js/codepress/codepress.css +0 -21
  192. data/html/js/codepress/codepress.html +0 -35
  193. data/html/js/codepress/codepress.js +0 -138
  194. data/html/js/codepress/engines/gecko.js +0 -293
  195. data/html/js/codepress/engines/khtml.js +0 -0
  196. data/html/js/codepress/engines/msie.js +0 -304
  197. data/html/js/codepress/engines/older.js +0 -0
  198. data/html/js/codepress/engines/opera.js +0 -260
  199. data/html/js/codepress/images/line-numbers.gif +0 -0
  200. data/html/js/codepress/index.html +0 -443
  201. data/html/js/codepress/languages/asp.css +0 -71
  202. data/html/js/codepress/languages/asp.js +0 -117
  203. data/html/js/codepress/languages/autoit.css +0 -13
  204. data/html/js/codepress/languages/autoit.js +0 -32
  205. data/html/js/codepress/languages/csharp.css +0 -9
  206. data/html/js/codepress/languages/csharp.js +0 -25
  207. data/html/js/codepress/languages/css.css +0 -10
  208. data/html/js/codepress/languages/css.js +0 -23
  209. data/html/js/codepress/languages/generic.css +0 -9
  210. data/html/js/codepress/languages/generic.js +0 -25
  211. data/html/js/codepress/languages/html.css +0 -13
  212. data/html/js/codepress/languages/html.js +0 -59
  213. data/html/js/codepress/languages/java.css +0 -7
  214. data/html/js/codepress/languages/java.js +0 -24
  215. data/html/js/codepress/languages/javascript.css +0 -8
  216. data/html/js/codepress/languages/javascript.js +0 -30
  217. data/html/js/codepress/languages/perl.css +0 -11
  218. data/html/js/codepress/languages/perl.js +0 -27
  219. data/html/js/codepress/languages/php.css +0 -12
  220. data/html/js/codepress/languages/php.js +0 -61
  221. data/html/js/codepress/languages/ruby.css +0 -10
  222. data/html/js/codepress/languages/ruby.js +0 -26
  223. data/html/js/codepress/languages/sql.css +0 -10
  224. data/html/js/codepress/languages/sql.js +0 -30
  225. data/html/js/codepress/languages/text.css +0 -5
  226. data/html/js/codepress/languages/text.js +0 -9
  227. data/html/js/codepress/languages/vbscript.css +0 -71
  228. data/html/js/codepress/languages/vbscript.js +0 -117
  229. data/html/js/codepress/languages/xsl.css +0 -15
  230. data/html/js/codepress/languages/xsl.js +0 -103
  231. data/html/js/codepress/license.txt +0 -458
  232. data/html/js/edit_area/images/Thumbs.db +0 -0
  233. 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
- #*sell_or_buy*:: 売りor買い
155
- #*count*:: 数量
156
- #*unit*:: 取引単位
157
- #*date*:: 取引日時
158
- #*rate*:: レート
159
- #*pair*:: 通貨ペア
160
- #*trader*:: 取引実行者
161
- #*operator*:: operator
162
- #*open_interest_no*:: 建玉番号
163
- #*order_no*:: 注文番号
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
- #*client*:: クライアント
288
- #*logger*:: ロガー
289
- #*money*:: 保証金
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
- #*count*:: 購入する数量
299
- #*return*:: Position
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
- #*count*:: 売却する数量
316
- #*return*:: Position
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
- @name = agent_name
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, @name )
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, @name )
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( agent_name, dir, scales=[] )
17
- @dir = "#{dir}/#{JIJI::Util.encode(agent_name).gsub(/\//, "_")}" # 「ベースディレクトリ/エージェント名/出力名」に保存する。
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? "#{d}/meta.yaml"
28
- props = YAML.load_file "#{d}/meta.yaml"
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:: 種別。:event,:graphのいずれかが指定可能
40
- #option:: 補足情報。以下が指定可能
41
- # -*グラフの場合*
42
- # --[:column_count] .. グラフのカラム数を整数値で指定する。(*必須*)
43
- # --「:graph_type」 .. グラフの種類を指定する。以下の値が指定可能。
44
- # ---"rate" .. レート情報に重ねて表示(移動平均線やボリンジャーバンド向け)。グラフは、ローソク足描画領域に描画される。
45
- # ---"zero_base" .. 0を中心線とした線グラフ(RCIやMACD向け)。グラフは、グラフ描画領域に描画される。
46
- # ---"line" .. 線グラフとして描画する。(デフォルト)。グラフは、グラフ描画領域に描画される。
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}/meta.yaml" ).writelock { |f|
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
@@ -40,9 +40,9 @@ module JIJI
40
40
  begin
41
41
  @session = create_session unless @session
42
42
  @session.request {|fx|
43
- #timeout( conf[:timeout] || 60 ) {
43
+ timeout( conf[:timeout] || 60 ) {
44
44
  yield fx
45
- #}
45
+ }
46
46
  }
47
47
  rescue Exception
48
48
  begin
@@ -31,7 +31,6 @@ module JIJI
31
31
 
32
32
  #プラグインを初期化します。プラグインの利用が開始される前に1度だけ呼び出されます。
33
33
  #引数として、ユーザーが入力したパラメータが渡されます。
34
- #プラグインの利用開始前に一度だけ呼ばれます。
35
34
  #props:: ユーザーが入力したパラメータ(JIJI::Plugin::Securities::Inputのkeyをキーとする設定値の配列)
36
35
  #logger:: ロガー
37
36
  def init_plugin( props, logger )