// ネームスペース namespace( "fx.ui.pages" ) // 結果画面 fx.ui.pages.ResultPage = function() { this.elementPrefix = null; this.elementId = null; // @Inject this.processServiceStub = null; //@Inject // 現在表示中のプロセスID // toで画面遷移したタイミングで設定される。 this.currentProcessId = null; this.submenu = null; this.dialog = null; // @Inject this.topicPath = null; // @Inject } fx.ui.pages.ResultPage.prototype = { /** * ページを初期化する。 * ページ作成時に一度だけ呼び出すこと。 */ initialize: function( ) { this.submenu = new util.MenuBar( "submenu", "submenu", "submenu", this.pageManager ); var self = this; this.submenu.initialize( null, function() { var m = this.id.match( /submenu\_(.*)/ ); if ( m ) { self.submenu.to( m[1], {id:self.currentProcessId} ); } } ); }, /** * このページから画面を移動する際に呼び出される。 * 戻り値としてfalseを返すと遷移をキャンセルする。 */ from : function(toId) { // ページを非表示 document.getElementById(this.elementId).style.display = "none"; this.topicPath.set( "" ); return true; }, /** * このページに画面を移動すると呼び出される。 */ to : function( fromId, param ) { this.currentProcessId = param["id"]; // チャートの初期化準備 var swf = util.getSwf( "chart" ); var date = this.currentProcessId == "rmt" ? null : param.end ; if ( fromId != "result" ) { // チャートが未ロードの場合 // チャートのロード完了コールバックを受け取ってから初期化。 var self = this; var global = function() { return this; }(); global.onChartLoaded = function() { swf.initializeChart( self.currentProcessId, null, null, date ); delete global.onChartLoaded; // 登録した関数は消しておく。 } } else { // すでにロードされている場合、APIだけ呼び出す swf.initializeChart( this.currentProcessId, null, null, date ); } // ページを表示 document.getElementById(this.elementId).style.display = "block"; // 初期化 var msg = document.getElementById("bt-create_msg"); msg.innerHTML = ""; msg.style.display = "none"; this.submenu.to( "trade", param ); if ( param["id"] == "rmt" ) { this.topicPath.set( "リアルトレード:状況を見る" ); } else { this.topicPath.set( "バックテスト:結果を見る:" + param["name"] ); } } } // ログ画面 fx.ui.pages.LogResultPage = function() { this.elementId = null; // @Inject this.outputServiceStub = null; //@Inject var self = this; this.updateButton = new util.Button("subpage-log__update", "update", function() { self.update(); }); this.updateButton.setEnable( true ); } fx.ui.pages.LogResultPage.prototype = { /** * このページから画面を移動する際に呼び出される。 * 戻り値としてfalseを返すと遷移をキャンセルする。 */ from : function(toId) { // ページを非表示 document.getElementById(this.elementId).style.display = "none"; return true; }, /** * このページに画面を移動すると呼び出される。 */ to : function( fromId, param ) { // ページを表示 document.getElementById(this.elementId).style.display = "block"; this.currentProcessId = param.id; this.update(); }, update: function() { var logEl = document.getElementById( "subpage-log_log" ); logEl.innerHTML= fx.template.Templates.common.loading; this.outputServiceStub.get_log( this.currentProcessId, function( log ) { logEl.innerHTML = "
" + log + ""; }, function(){} ); // TODO } } //トレード結果画面 fx.ui.pages.TradeResultPage = function() { this.elementId = null; // @Inject this.tradeResultServiceStub = null; //@Inject this.dialog = null; // @Inject var self = this; this.tradeListTable = new fx.ui.TradeListTable( "subpage-trade__list" ); this.tradeListTable.initialize(); this.agentResultListTable = new fx.ui.AgentResultListTable( "subpage-trade__agent-list" ); this.agentResultListTable.initialize(); this.updateButton = new util.Button("subpage-trade__update", "update", function() { self.update(); }); this.updateButton.setEnable( true ); } fx.ui.pages.TradeResultPage.prototype = { /** * このページから画面を移動する際に呼び出される。 * 戻り値としてfalseを返すと遷移をキャンセルする。 */ from : function(toId) { // ページを非表示 document.getElementById(this.elementId).style.display = "none"; return true; }, /** * このページに画面を移動すると呼び出される。 */ to : function( fromId, param ) { this.currentProcessId = param.id; this.start = param.start; this.end = param.end; // ページを表示 document.getElementById(this.elementId).style.display = "block"; if ( param.id == "rmt" ) { document.getElementById("subpage-trade__range").style.display = "block"; } else { document.getElementById("subpage-trade__range").style.display = "none"; } this.update(); }, update: function() { var summaryEl = document.getElementById( "subpage-trade_summary" ); // 一覧対象の日時 var startDate = null; var endDate = null; if ( this.currentProcessId == "rmt" ) { // フィールドに値が設定されていればその値を使う。 var y = document.getElementById("subpage-trade_range-year").value; var m = document.getElementById("subpage-trade_range-month").value; var d = document.getElementById("subpage-trade_range-day").value; var ye = document.getElementById("subpage-trade_range-end-year").value; var me = document.getElementById("subpage-trade_range-end-month").value; var de = document.getElementById("subpage-trade_range-end-day").value; if ( y && m && d && ye && me && de ) { if ( y.match(/^\d+$/) && m.match(/^\d+$/) && d.match(/^\d+$/) && ye.match(/^\d+$/) && me.match(/^\d+$/) && de.match(/^\d+$/)) { startDate = new Date( Number(y), Number(m)-1, Number(d) ).getTime()/1000; endDate = new Date( Number(ye), Number(me)-1, Number(de) ).getTime()/1000; } else { this.dialog.show( "warn", { message : "表示範囲に数値が入力されていません。", buttons : [ { type:"ok" } ] } ); return; } } else { // 入力がなければ今月のデータを表示 var now = new Date(); var end = new Date( now.getFullYear(), now.getMonth()+1, 0 ); startDate = new Date( now.getFullYear(), now.getMonth(), 1 ).getTime()/1000; endDate = end.getTime()/1000; // フィールドにも設定しておく document.getElementById("subpage-trade_range-year").value = now.getFullYear(); document.getElementById("subpage-trade_range-month").value = now.getMonth()+1; document.getElementById("subpage-trade_range-day").value = 1; document.getElementById("subpage-trade_range-end-year").value = now.getFullYear(); document.getElementById("subpage-trade_range-end-month").value = now.getMonth()+1; document.getElementById("subpage-trade_range-end-day").value = end.getDate(); } } else { // バックテストの場合、全テストが対象 startDate = this.start; endDate = this.end; } // ロード中に変更 summaryEl.innerHTML= fx.template.Templates.common.loading; var self = this; // 終了時間はその日の終わりにする this.tradeResultServiceStub.list( this.currentProcessId, "6h", startDate, endDate+60*60*25, function( list ) { // 集計 var value = self.aggregate(list); // 集計 summaryEl.innerHTML = fx.template.Templates.submenu.trade.summary.evaluate( value[0] ); // 一覧 self.tradeListTable.setData( list.sort( function( a,b ) { return (b.date || 0) - ( a.date || 0); } ) ); self.agentResultListTable.setData( value[1] ); }, function(){} ); // TODO }, aggregate: function( list ) { var pairList = {}; var all = this.init(); var traders = {}; for ( var i=0,n=list.length;i