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/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 =
|
8
|
-
this.pageManager =
|
9
|
-
this.dialog =
|
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
|
-
|
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
|
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 =
|
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
|
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
|
-
|
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
|
-
|
31
|
-
|
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¶m=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
|
-
"
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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"
|
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
|
-
|
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]/
|