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/html/js/sidebar.js CHANGED
@@ -4,9 +4,9 @@ namespace( "fx.ui" )
4
4
  fx.ui.SideBar = function() {
5
5
 
6
6
  this.elementId = null // @Inject
7
- this.processServiceStub = null; //@Inject
8
- this.pageManager = null; //@Inject
9
- this.dialog = null; // @Inject
7
+ this.processServiceStub = container.Inject;
8
+ this.pageManager = container.Inject;
9
+ this.dialog = container.Inject;
10
10
 
11
11
  this.menu = new util.MenuBar( "menu", "left", "sidebar" );
12
12
 
@@ -55,7 +55,6 @@ fx.ui.SideBar.prototype = {
55
55
  var m = page.match( /sidebar\_(.*)/ );
56
56
  if ( m ) {
57
57
  var m2 = m[1].match( /result_(.*)/ );
58
- var m3 = m[1].match( /agent_edit_(.*)/ );
59
58
  if ( m2 ) {
60
59
  if ( m2[1] == "rmt" ) {
61
60
  this.menu.to( "result", {
@@ -75,11 +74,6 @@ fx.ui.SideBar.prototype = {
75
74
  }
76
75
  }
77
76
  }
78
- } else if ( m3 ) {
79
- this.menu.to( "agent_edit", {
80
- id:m3[1],
81
- menuId: m[1]
82
- } );
83
77
  } else {
84
78
  this.menu.to( m[1], params );
85
79
  }
@@ -126,31 +120,48 @@ fx.ui.SideBar.prototype = {
126
120
  }, function(){} ); // TODO
127
121
  },
128
122
 
123
+ restart : function( processId ) {
124
+ var self = this;
125
+ this.processServiceStub.restart( processId, null, function(p) {
126
+ // 削除
127
+ self._remove( processId );
128
+ // 追加
129
+ self.add( p.id );
130
+ }, function(error, detail){
131
+ self.dialog.show( "warn", {
132
+ message : fx.template.Templates.btcreate.start.error.evaluate({
133
+ "error":(String(error) + "\n" + String(detail["backtrace"])).escapeHTML()})
134
+ });
135
+ });
136
+ },
137
+
129
138
  remove : function( processId ) {
130
139
  var self = this;
131
140
  this.dialog.show( "input", {
132
- message : "バックテストを削除します。よろしいですか?",
141
+ message : fx.template.Templates.sidebar.del.msg,
133
142
  buttons : [
134
- { type:"ok",
135
- alt: fx.template.Templates.common.button.ok,
143
+ { type:"ok",
144
+ alt: fx.template.Templates.common.button.ok,
136
145
  key: "Enter",
137
146
  action: function(dialog){
138
147
  self.processServiceStub.delete_test( processId, function(p) {
139
- var tmp = [];
140
- for ( var i=0,n=self.runnings.length;i<n;i++ ) {
141
- if ( self.runnings[i] != processId ) tmp.push( self.runnings[i] );
142
- }
143
- self.runnings = tmp;
144
-
145
- var div = document.getElementById( "process_" + processId);
146
- div.parentNode.removeChild(div);
147
-
148
+ self._remove( processId );
148
149
  }, function(){} ); // TODO
149
150
  } },
150
151
  { type:"cancel", alt: fx.template.Templates.common.button.cancel, key: "Esc" }
151
152
  ]
152
153
  } );
153
154
  },
155
+ _remove : function( processId ) {
156
+ // 削除
157
+ var tmp = [];
158
+ for ( var i=0,n=this.runnings.length;i<n;i++ ) {
159
+ if ( this.runnings[i] != processId ) tmp.push( this.runnings[i] );
160
+ }
161
+ this.runnings = tmp;
162
+ var div = document.getElementById( "process_" + processId);
163
+ div.parentNode.removeChild(div);
164
+ },
154
165
 
155
166
  add : function( processId ){
156
167
  var self = this;
@@ -178,6 +189,7 @@ fx.ui.SideBar.prototype = {
178
189
  var e = document.getElementById( "process_" + p.id + "_progress" );
179
190
  var state = document.getElementById( "process_" + p.id + "_state" );
180
191
  var name = document.getElementById( "process_" + p.id + "_name" );
192
+ var restart = document.getElementById( "process_" + p.id + "_restart" );
181
193
 
182
194
  if ( p.state == "RUNNING" && p.progress < 100 ) {
183
195
  e.style.display = "block";
@@ -191,6 +203,7 @@ fx.ui.SideBar.prototype = {
191
203
  state.innerHTML = this.stateToDisplayName( p.state );
192
204
  } else {
193
205
  e.style.display = "none";
206
+ restart.style.display = "inline"
194
207
  state.innerHTML = this.stateToDisplayName( p.state == "RUNNING" ? "FINISHED" : p.state );
195
208
  // 実行結果へのリンクを有効化する。
196
209
  name.innerHTML = '<a href="javascript:fx.app.sideBar.to( \'sidebar_result_' + p.id + '\' );">' + p.name.escapeHTML() + "</a>";
@@ -216,16 +229,17 @@ fx.ui.SideBar.prototype = {
216
229
  * 状態の文字列を表示用の名前に変換する。
217
230
  */
218
231
  stateToDisplayName : function(state) {
232
+ var tmp = fx.template.Templates.sidebar.processState;
219
233
  if( state == "WAITING" ) {
220
- return "待機中";
234
+ return tmp.waiting;
221
235
  } else if( state == "RUNNING" ) {
222
- return "実行中";
236
+ return tmp.running;
223
237
  } else if( state == "CANCELED" ) {
224
- return "中止";
238
+ return tmp.canceled;
225
239
  } else if( state == "FINISHED" ) {
226
- return "完了";
240
+ return tmp.finished;
227
241
  } else if( state == "ERROR_END" ) {
228
- return "<span class='error'>エラー終了</span>";
242
+ return tmp.errorEnd;
229
243
  }
230
244
  }
231
245
  }
@@ -233,7 +247,7 @@ fx.ui.SideBar.prototype = {
233
247
  // トレード状態表示
234
248
  fx.ui.TradeEnable = function(elementId){
235
249
  this.elementId = elementId; //@Inject
236
- this.processServiceStub = null; //@Inject
250
+ this.processServiceStub = container.Inject;
237
251
  }
238
252
  fx.ui.TradeEnable.prototype = {
239
253
  init: function() {
data/html/js/templates.js CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  // ネームスペース
3
- namespace( "fx.template" )
4
-
3
+ namespace( "fx" );
4
+ namespace( "fx.template" );
5
5
  fx.template.Templates = {
6
6
  common: {
7
7
  loading : '<img src="./img/loading.gif" alt="loading.." title="loading.." />',
@@ -15,27 +15,91 @@ fx.template.Templates = {
15
15
  update : "更新",
16
16
  add : "追加",
17
17
  del : "削除",
18
+ fileAdd : "ファイルを追加",
19
+ mkcol : "ディレクトリを追加",
20
+ rename : "選択したファイル/ディレクトリの名前を変更",
18
21
  save : "保存",
19
22
  ok : "OK",
20
23
  cancel: "キャンセル",
21
24
  yes : "はい",
22
25
  no: "いいえ"
26
+ },
27
+ column : {
28
+ name : "名前",
29
+ update : "最終更新日時",
30
+ profitOrLoss : "損益",
31
+ swap : "スワップ",
32
+ sellOrBuy : "売/買",
33
+ state : "状態",
34
+ pair : "通貨ペア",
35
+ rate : "レート",
36
+ fixRate : "決済レート",
37
+ count : "数量",
38
+ trader : "エージェント",
39
+ date : "取引日時",
40
+ fixDate : "決済日時",
41
+ totalProfitOrLoss: "損益合計",
42
+ totalSwap : "累計スワップ",
43
+ tradeSummary : "取引回数/約定済み",
44
+ winRate : "勝率",
45
+ maxProfit: "最大利益",
46
+ maxLoss: "最大損失",
47
+ avgProfitOrLoss:"平均損益",
48
+ profitRatio:"損益率"
49
+ },
50
+ sell : "売",
51
+ buy : "買",
52
+ positionState : {
53
+ order: "注文中",
54
+ having: "所有中",
55
+ settle: "決済注文中",
56
+ settled: "決済済",
57
+ lost: "ロスト",
58
+ unknown: "不明"
59
+ },
60
+ item : {
61
+ file: "ファイル",
62
+ directory: "ディレクトリ"
63
+ },
64
+ errorMsg : {
65
+ notFound: new Template("#{name}が見つかりませんでしました。"),
66
+ alreadyExist: "名前が重複しています。",
67
+ isNotFile: "ファイルではありません",
68
+ isNotFolder: "フォルダではありません",
69
+ illegalName: new Template("#{name}名が不正です。半角英数字、および「_+-#!~[]().'{}」のみ使用可能です。"),
70
+
71
+ systemError : "内部エラーが発生しました。",
72
+ serverError : "サーバーでエラーが発生しました。",
73
+ notSelected : "エージェントが選択されていません。",
74
+ deleteConfirm:"削除します。よろしいですか?",
75
+ selectAgent : "エージェントを選択してください。",
76
+ notInput : "値が入力されていません。",
77
+ notNumber : "数値を入力してください。",
78
+ outOfRange : "値が範囲外です。",
79
+ tooLong : "値が長すぎます。",
80
+ illegalChar:"使用できない文字が含まれています。",
81
+ illegalFormat : "値のフォーマットが不正です。",
82
+ dupricateName : "名前が重複しています。",
83
+ emptyName : "名前が入力されていません。",
84
+ illegalAgentSetting: "エージェントの設定に問題があります。",
85
+ illegalDate : "開始日または終了日が不正です。",
86
+ illegalStartDate : "開始日が入力されていないか、フォーマットが不正です。",
87
+ illegalEndDate : "終了日が入力されていないか、フォーマットが不正です。"
23
88
  }
24
89
  },
25
90
  agentSelector: {
26
- error : new Template( '<div class="problem">※#{error}</div>#{msg}')
91
+ defaultName : "名称未設定エージェント",
92
+ error : new Template( '<div class="problem">※#{error}</div>#{msg}'),
93
+ addMsg : "追加するエージェントを選択してください。"
94
+ + '<div style="margin-top:10px;border: 1px solid #FFFFFF;">'
95
+ + ' <div id="agent_class_list"></div>'
96
+ + '</div>'
27
97
  },
28
98
  agentEditor: {
29
- topicPath: {
30
- agent: "エージェント:エージェントの作成/編集",
31
- sharedLib: "エージェント:共有ライブラリの作成/編集"
32
- },
33
- desc: {
34
- agent: "※エージェントを作成・編集します。一覧からファイルを選択して編集、または追加ボタンから追加して下さい。<br/>"
35
- + "※改変後のコードは次にエージェントを使用した場合に有効になります。",
36
- sharedLib: "※共有ライブラリを作成・編集します。一覧からファイルを選択して編集、または追加ボタンから追加して下さい。<br/>"
37
- + "※改変後のコードは次にライブラリのクラスや関数を使用した場合に有効になります。"
38
- },
99
+ topicPath: "エージェント:作成/編集",
100
+ desc: "※エージェントまたは共有ライブラリを作成・編集します。ツリーからファイルをダブルクリックして編集して下さい。"
101
+ + "エージェントの作り方は<a href='http://unageanu.sakura.ne.jp/jiji/?page=agent&param=a_agent_0' target='_blank'>こちら。</a><br/>"
102
+ + "※改変後のコードは次にエージェントや共有ライブラリのAPIを使用した場合に有効になります。",
39
103
  saved : {
40
104
  error : new Template(
41
105
  '<span class="problem">※コンパイルエラー</span> <span style="color: #FF3366;">( #{now} ) <br/>' +
@@ -44,30 +108,32 @@ fx.template.Templates = {
44
108
  },
45
109
  dosave : "未保存のデータがあります。保存しますか?",
46
110
  add : {
111
+ prefix : {
112
+ add : "追加する",
113
+ rename : "新しい"
114
+ },
47
115
  error : new Template(
48
116
  '<div class="problem">※#{error}</div>'
49
117
  ),
50
118
  body : new Template(
51
- "追加するファイル名を入力してください。<br/>" +
119
+ "#{prefix}#{type}名を入力してください。<br/>" +
52
120
  '<form action="javascript:void(0);" name="file_name_input_form">' +
53
121
  ' <input id="file_name_input" name="file_name_input" type="text"' +
54
122
  ' style="width:360px;margin-top:10px;" value="#{text}" />'+
55
- '</form>'),
56
- errormsgs : {
57
- no : "ファイル名が入力されていません。",
58
- illegalChar : "ファイル名が不正です。半角英数字、および「-_*+-#![]()?\.」のみ使用可能です。",
59
- conflict : "ファイル名が重複しています。"
60
- }
123
+ '</form>')
61
124
  },
62
125
  remove: {
63
- body : "ファイルを削除します。削除したファイルは復元できません。<br/>よろしいですか?"
126
+ body : "ファイルを削除します。削除したファイルは復元できません。<br/>よろしいですか?",
127
+ error: new Template("<span class='problem'>※ファイルまたはフォルダの削除に失敗しました。" +
128
+ "<pre style='width:350px;height:200px;overflow:scroll;font-size:11px;font-weight:normal'>#{error}</pre>" +
129
+ "</span>")
64
130
  },
65
131
  defaultFileName: "( ファイルを選択してください。 )",
66
- fileList : {
67
- column : {
68
- name : "名前",
69
- update : "最終更新日時"
70
- }
132
+ tree : {
133
+ node : new Template(
134
+ '<div id="agent_tree_node_#{id}" class="node #{type} #{selected}">' +
135
+ ' <span class="name">#{name}</span>'+
136
+ '</div>')
71
137
  }
72
138
  },
73
139
  agentPropertyEditor: {
@@ -123,8 +189,34 @@ fx.template.Templates = {
123
189
  '</div>' )
124
190
  },
125
191
  sidebar : {
192
+ del : {
193
+ msg : "バックテストを削除します。よろしいですか?"
194
+ },
195
+ processState : {
196
+ waiting : "待機中",
197
+ running : "実行中",
198
+ canceled : "中止",
199
+ finished : "完了",
200
+ errorEnd : "<span class='error'>エラー終了</span>"
201
+ },
126
202
  process : new Template (
127
- ' <div class="name"><span id="process_#{id}_name">#{name} </span><span class="process_delete"><a href="javascript:fx.app.sideBar.remove(\'#{id}\');" id="process_#{id}_delete">[削除]</a></span></div>' +
203
+ ' <div class="name">' +
204
+ ' <span id="process_#{id}_name">#{name}</span>' +
205
+ ' <span class="process_restart">' +
206
+ '<a href="javascript:fx.app.sideBar.restart(\'#{id}\');" id="process_#{id}_restart" style="display:none;padding-left:2px;" title="再実行" alt="再実行">' +
207
+ '<img src="./img/control_play.png" title="再実行" alt="再実行" ' +
208
+ ' onmouseover="this.src=\'./img/control_play_blue.png\'" ' +
209
+ ' onmouseout="this.src=\'./img/control_play.png\'" />' +
210
+ '</a>' +
211
+ '</span>' +
212
+ '<span class="process_delete">' +
213
+ '<a href="javascript:fx.app.sideBar.remove(\'#{id}\');" id="process_#{id}_delete" title="削除" alt="削除">' +
214
+ '<img src="./img/bin_closed.png" title="削除" alt="削除"' +
215
+ ' onmouseover="this.src=\'./img/bin_empty.png\'"' +
216
+ ' onmouseout="this.src=\'./img/bin_closed.png\'" />' +
217
+ '</a>' +
218
+ '</span>' +
219
+ ' </div>' +
128
220
  ' <div class="detail">'+
129
221
  ' <div class="date">#{date}</div>' +
130
222
  ' <div class="state" id="process_#{id}_state">状態:#{state}</div>' +
@@ -136,6 +228,10 @@ fx.template.Templates = {
136
228
  ' </div>')
137
229
  },
138
230
  btcreate : {
231
+ calendar : {
232
+ start: "開始日",
233
+ end: "終了日"
234
+ },
139
235
  dateSummary : {
140
236
  notSelect: "※開始日、終了日を選択して下さい。",
141
237
  selected: new Template('<table class="values small" style="width:360px;" cellspacing="0" cellpadding="0">' +
@@ -145,17 +241,46 @@ fx.template.Templates = {
145
241
  error: "<span class='problem'>※開始日、終了日の設定が不正です。</span>"
146
242
  },
147
243
  start : {
244
+ msg : "バックテストを開始します。よろしいですか?<br/>",
245
+ success: new Template("※開始しました。( #{dateStr} )"),
148
246
  error: new Template("<span class='problem'>※テストの開始に失敗しました。" +
149
247
  "<pre style='width:350px;height:200px;overflow:scroll;font-size:11px;font-weight:normal'>#{error}</pre>" +
150
248
  "</span>")
151
249
  }
152
250
  },
153
251
  rtsetting : {
252
+ topicPath: "リアルトレード:設定",
154
253
  apply: {
254
+ msg : "設定を反映します。よろしいですか?<br/>",
255
+ success: new Template("※設定を反映しました。( #{dateStr} )"),
155
256
  error: new Template("<span class='problem'>※設定の反映に失敗しました。" +
156
257
  "<pre style='width:350px;height:200px;overflow:scroll;font-size:11px;font-weight:normal'>#{error}</pre>" +
157
258
  "</span>")
158
- }
259
+ },
260
+ update : {
261
+ op : {
262
+ add: "追加",
263
+ update: "更新",
264
+ remove: "削除"
265
+ },
266
+ errorDetail : new Template("#{name}の#{operation}に失敗しました : #{cause}\n"),
267
+ error: new Template("<span class='problem'>※設定の更新に失敗しました。" +
268
+ "<pre style='width:350px;height:200px;overflow:scroll;font-size:11px;font-weight:normal'>#{error}</pre>" +
269
+ "</span>")
270
+ }
271
+ },
272
+ result : {
273
+ topicPath: {
274
+ real : "リアルトレード:状況を見る" ,
275
+ backtest: "バックテスト:結果を見る:"
276
+ },
277
+ aggregate : {
278
+ unknownAgent : "(不明)"
279
+ },
280
+ tradeEnable : {
281
+ yes: "する",
282
+ no: "しない"
283
+ }
159
284
  },
160
285
  submenu : {
161
286
  info : {
@@ -224,11 +349,17 @@ fx.template.Templates = {
224
349
  '<tr><td class="label small" >#{pair}</td><td class="value">#{value}</td></tr>' )
225
350
  },
226
351
  graph : {
352
+ noAgent : '<div style="margin:10px 0px 0px 0px;">( グラフはありません。)</div>',
227
353
  agent : new Template(
228
- ' <div class="agent">#{agentName}</div>'+
229
- ' <table class="graphs" cellspacing="0" cellpadding="0">' +
354
+ ' <div class="agent" id="output_#{id}">#{agentName} #{remove}</div>'+
355
+ ' <table id="output_t_#{id}" class="graphs" cellspacing="0" cellpadding="0">' +
230
356
  ' #{items}'+
231
357
  ' </table>'),
358
+ remove : new Template('<span class="output_delete">' +
359
+ '<a href="javascript:void(0);" id="output_#{id}_delete" title="グラフを削除" alt="グラフを削除">[グラフを削除]' +
360
+ '</a>' +
361
+ '</span>'),
362
+ removeMsg : "グラフを削除します。よろしいですか?",
232
363
  item : new Template(
233
364
  ' <tr>' +
234
365
  ' <td>' +
@@ -236,7 +367,11 @@ fx.template.Templates = {
236
367
  ' <label for="submenu-graph_checked_#{id}" title="#{name}">#{name}</label>' +
237
368
  ' </td>' +
238
369
  ' <td class="color">#{colors}</td>'+
239
- ' </tr>' )
370
+ ' </tr>' ),
371
+ noGraphItem :
372
+ ' <tr>' +
373
+ ' <td>( グラフはありません。)</td>' +
374
+ ' </tr>'
240
375
  }
241
376
  }
242
- }
377
+ }
data/html/js/utils.js CHANGED
@@ -239,8 +239,8 @@ util.Button = function( id, imgName, action, alt, accesskey, enable, prefix, suf
239
239
  if (accesskey) { this.a.accessKey = accesskey; }
240
240
  this.n.appendChild( this.a );
241
241
  this.img = document.createElement("img");
242
- if (alt) {
243
- this.img.alt = accesskey ? alt + "( " +accesskey+ " )" : alt;
242
+ if (alt) {
243
+ this.img.alt = accesskey ? alt + "( " +accesskey+ " )" : alt;
244
244
  this.img.title = this.img.alt;
245
245
  }
246
246
  this.img.src = prefix + this.imgName + suffix;
@@ -392,13 +392,13 @@ util.BasicTable = {
392
392
  self.table.subscribe("rowMouseoverEvent", self.table.onEventHighlightRow);
393
393
  self.table.subscribe("rowMouseoutEvent", self.table.onEventUnhighlightRow);
394
394
  self.table.subscribe("rowClickEvent", self.table.onEventSelectRow);
395
-
395
+
396
396
  // リサイザーを強制的に利用可にする。
397
397
  var res = document.getElementsByClassName("yui-dt-resizer", self.elementId);
398
398
  for ( var i=0,n=res.length;i<n;i++ ) {
399
399
  res[i].style.height = "19px";
400
400
  }
401
-
401
+
402
402
  // ローディングを作成
403
403
  this.table_elm = document.getElementById(self.elementId);
404
404
  this.loading_elm = document.createElement('div');
@@ -417,7 +417,7 @@ util.BasicTable = {
417
417
  this.table.deleteRows( 0, this.length() );
418
418
  }
419
419
  this.table.addRows(data);
420
- if ( this.sortBy ) {
420
+ if ( this.sortBy ) {
421
421
  this.table.sortColumn( this.table.getColumn( this.sortBy) );
422
422
  }
423
423
  },
@@ -449,6 +449,9 @@ util.fillZero = function( number, size ) {
449
449
  return str+number;
450
450
  }
451
451
 
452
+ /**
453
+ * リスナ
454
+ */
452
455
  util.Listener = function() {
453
456
  this.listener = {};
454
457
  }
@@ -470,10 +473,18 @@ util.Listener.prototype = {
470
473
  }
471
474
  return this.listener[type];
472
475
  },
473
- fire : function( type, event ) {
476
+ fire : function( type, event, f ) {
474
477
  var list = this.getListeners(type);
475
478
  for( var i=0,n=list.length;i<n;i++ ) {
476
- list[i].call( null, event );
479
+ if ( f ) {
480
+ if ( typeof f == "function" ) {
481
+ f.call( null, list[i], event );
482
+ } else {
483
+ list[i][f]( event );
484
+ }
485
+ } else {
486
+ list[i].call( null, event );
487
+ }
477
488
  }
478
489
  }
479
490
  }
@@ -749,6 +760,131 @@ util.ColorPicker.prototype = {
749
760
  // return this.evaluate_org( object );
750
761
  //}
751
762
 
763
+ /***
764
+ * パス文字列の操作
765
+ */
766
+ util.PathUtils = {
767
+ /**
768
+ * 末尾の"/"以降の名前を取得する
769
+ */
770
+ basename : function(path) {
771
+ if (!path) return "";
772
+ var i = path.lastIndexOf("/");
773
+ if (i < 0 ) return path;
774
+ if (i+1 >= path.length ) return "";
775
+ return path.substring( i+1 );
776
+ },
777
+ /**
778
+ * 末尾の"/"以前の名前を取得する
779
+ */
780
+ dirname : function(path) {
781
+ if (!path) return "";
782
+ var i = path.lastIndexOf("/");
783
+ if (i <= 0 ) return "";
784
+ return path.substring( 0, i );
785
+ },
786
+ /**
787
+ * 指定ディリクトリ配下のファイル/フォルダであるか評価する
788
+ * @param path {String} 評価対象のパス
789
+ * @param dir {String} 親ディレクトリ
790
+ * @return {Boolean} 親ディレクトリの配下の要素であればtrue
791
+ */
792
+ isChild : function( path, dir ) {
793
+ return path.startsWith( dir + "/" );
794
+ },
795
+ /**
796
+ * パスの配列を探索し、親とその子が含まれていれば、親だけを残す。
797
+ * @param paths {Array:String} パスの配列
798
+ * @return {Array:String} 親のみのパス
799
+ */
800
+ normarize : function(paths) {
801
+ var result = [];
802
+ paths = paths.sortBy( function( value ) { return value.length; } );
803
+ for ( var j=0;j<paths.length;j++ ) {
804
+ var isChild = false;
805
+ for ( var i=0;i<result.length;i++ ) {
806
+ if ( util.PathUtils.isChild( paths[j], result[i] ) ) {
807
+ isChild = true;
808
+ break;
809
+ }
810
+ }
811
+ if (!isChild) result.push( paths[j] );
812
+ }
813
+ return result;
814
+ }
815
+ }
816
+
817
+ /**基本の例外ハンドラ*/
818
+ util.BasicExceptionHandler = function( error, detail, option ) {
819
+ // エラーコードがない場合はメッセージをそのまま積む。
820
+ if ( !detail.code ) return error;
821
+ switch ( detail.code ) {
822
+ case "not_found":
823
+ return fx.template.Templates.common.errorMsg.notFound.evaluate( option );
824
+ case "already_exist":
825
+ return fx.template.Templates.common.errorMsg.alreadyExist;
826
+ case "is_not_file":
827
+ return fx.template.Templates.common.errorMsg.isNotFile;
828
+ case "is_not_folder":
829
+ return fx.template.Templates.common.errorMsg. isNotFolder;
830
+ case "illegal_name":
831
+ return fx.template.Templates.common.errorMsg.illegalName.evaluate( option );
832
+ case "illegal_arguments":
833
+ case "fatal":
834
+ return fx.template.Templates.common.errorMsg.systemError;
835
+ case "not_connected":
836
+ return fx.template.Templates.common.errorMsg.serverError;
837
+ default:
838
+ return error;
839
+ }
840
+ }
841
+
842
+ // クリックタイマー
843
+ util.ClickTimer = function( id, callback ) {
844
+ this.id = null;
845
+ this.elm = document.getElementById( id );
846
+ this.buff = [];
847
+ this.timer = null;
848
+ this.clicked = false;
849
+ this.callback = callback;
850
+ var self = this;
851
+ Event.observe(document.getElementById( id ), 'mouseup', function(ev) { // prototype.jsに依存
852
+ self.onClicked( ev );
853
+ });
854
+ }
855
+ util.ClickTimer.prototype = {
856
+ onClicked : function(ev) {
857
+ if ( !this.timer ) {
858
+ this.buff.push( true );
859
+ var self = this;
860
+ this.timer = window.setInterval(function ( ) {
861
+ self.check();
862
+ }, 250);
863
+ } else {
864
+ this.clicked = true;
865
+ }
866
+ },
867
+ check : function() {
868
+ this.buff.push( this.clicked );
869
+ this.clicked = false;
870
+ if ( this.isEnd() ) {
871
+ try {
872
+ if ( this.callback ) this.callback.call( null, this.buff.slice( 0, this.buff.length-1 ) );
873
+ } finally {
874
+ window.clearTimeout( this.timer );
875
+ this.timer = null;
876
+ this.buff = [];
877
+ }
878
+ }
879
+ },
880
+ isEnd : function() {
881
+ if (this.buff.length <= 2) return false;
882
+ for( var i=0,n=this.buff.length-1; i<2; i++ ) {
883
+ if ( this.buff[n-i] == true ) return false;
884
+ }
885
+ return true;
886
+ }
887
+ }
752
888
 
753
889
  /**制御文字*/
754
890
  util.CONTROLL_CODE = /[\x00-\x1F\x7F]/