Untitled

Run Settings
LanguageJavaScript
Language Version
Run Command
// 圖形標準設定值 (可以給User設定的參數才需要在這裡寫一個標準值) var ChartConfigSTD = { InitIndexLength: 120, ChartItems: { KLine: { MA_DevRatioRef: 'PriceClose', MA_ShowTouchTag: 'T', PaintItems: { KLine: { ShowHighLow: 'F', BandTag: { IsShow: 'F', Cycle_DATE: 62, Cycle_WEEK: 13, Cycle_MONTH: 12, Cycle_QUAR: 4, Cycle_YEAR: 3 } }, MA_DATE0: { Name: '5日', Count: 5, Color: '#808080', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_DATE1: { Name: '10日', Count: 10, Color: '#007D48', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_DATE2: { Name: '月', Count: 21, Color: '#FF0000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE3: { Name: '季', Count: 62, Color: '#FF8000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE4: { Name: '半年', Count: 124, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE5: { Name: '年', Count: 248, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE6: { Name: '三年', Count: 745, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE7: { Name: '五年', Count: 1242, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_DATE8: { Name: '十年', Count: 2484, Color: '#8000FF', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK0: { Name: '月', Count: 4, Color: '#FF0000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK1: { Name: '季', Count: 13, Color: '#FF8000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK2: { Name: '半年', Count: 26, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK3: { Name: '年', Count: 52, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK4: { Name: '三年', Count: 156, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK5: { Name: '五年', Count: 260, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK6: { Name: '十年', Count: 521, Color: '#8000FF', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK7: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK8: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH0: { Name: '半年', Count: 6, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH1: { Name: '年', Count: 12, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH2: { Name: '三年', Count: 36, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH3: { Name: '五年', Count: 60, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH4: { Name: '十年', Count: 120, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH5: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH6: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH7: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH8: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR0: { Name: '年', Count: 4, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_QUAR1: { Name: '三年', Count: 12, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_QUAR2: { Name: '五年', Count: 20, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR3: { Name: '十年', Count: 40, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_QUAR4: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR5: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR6: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR7: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR8: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR0: { Name: '三年', Count: 3, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_YEAR1: { Name: '五年', Count: 5, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR2: { Name: '十年', Count: 10, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_YEAR3: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR4: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR5: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR6: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR7: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR8: { Name: null, Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, BollingerBandsUP_DATE: { Name: '布林上軌', Color: '#FF8000', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsMA_DATE: { Name: '布林中軌', Color: '#0000FF', LineWidth: 1, IsShow: 'AlwaysShow', Count: 21, Multiplier: 2 }, BollingerBandsDN_DATE: { Name: '布林下軌', Color: '#00CC00', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsUP_WEEK: { Name: '布林上軌', Color: '#FF8000', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsMA_WEEK: { Name: '布林中軌', Color: '#0000FF', LineWidth: 1, IsShow: 'AlwaysShow', Count: 13, Multiplier: 2 }, BollingerBandsDN_WEEK: { Name: '布林下軌', Color: '#00CC00', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsUP_MONTH: { Name: '布林上軌', Color: '#FF8000', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsMA_MONTH: { Name: '布林中軌', Color: '#0000FF', LineWidth: 1, IsShow: 'AlwaysShow', Count: 12, Multiplier: 2 }, BollingerBandsDN_MONTH: { Name: '布林下軌', Color: '#00CC00', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsUP_QUAR: { Name: '布林上軌', Color: '#FF8000', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsMA_QUAR: { Name: '布林中軌', Color: '#0000FF', LineWidth: 1, IsShow: 'AlwaysShow', Count: 12, Multiplier: 2 }, BollingerBandsDN_QUAR: { Name: '布林下軌', Color: '#00CC00', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsUP_YEAR: { Name: '布林上軌', Color: '#FF8000', LineWidth: 1, IsShow: 'AlwaysShow' }, BollingerBandsMA_YEAR: { Name: '布林中軌', Color: '#0000FF', LineWidth: 1, IsShow: 'AlwaysShow', Count: 10, Multiplier: 2 }, BollingerBandsDN_YEAR: { Name: '布林下軌', Color: '#00CC00', LineWidth: 1, IsShow: 'AlwaysShow' }, } }, Volume: { PaintItems: { MA_DATE0: { Name: '月均量', Count: 21, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_DATE1: { Name: '季均量', Count: 62, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_DATE2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_DATE3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_WEEK0: { Name: '季均量', Count: 13, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_WEEK1: { Name: '年均量', Count: 52, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_WEEK2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_WEEK3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_MONTH0: { Name: '年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_MONTH1: { Name: '三年均量', Count: 36, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_MONTH2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_MONTH3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_QUAR0: { Name: '三年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR1: { Name: '十年均量', Count: 40, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_QUAR3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_YEAR0: { Name: '三年均量', Count: 3, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR1: { Name: '十年均量', Count: 10, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_YEAR3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, } }, Amount: { PaintItems: { MA_DATE0: { Name: '月均量', Count: 21, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_DATE1: { Name: '季均量', Count: 62, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_DATE2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_DATE3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_WEEK0: { Name: '季均量', Count: 13, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_WEEK1: { Name: '年均量', Count: 52, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_WEEK2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_WEEK3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_MONTH0: { Name: '年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_MONTH1: { Name: '三年均量', Count: 36, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_MONTH2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_MONTH3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_QUAR0: { Name: '三年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR1: { Name: '十年均量', Count: 40, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_QUAR3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_YEAR0: { Name: '三年均量', Count: 3, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR1: { Name: '十年均量', Count: 10, Color: '#0080FF', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR2: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, MA_YEAR3: { Name: null, Count: null, Color: '#000000', LineWidth: 1.5, IsShow: 'F' }, } }, OBV: { PaintItems: { OBV: { LineWidth: 1, Color: '#FF0000', IsShow: 'T' }, OBV_MA: { Count: 10, LineWidth: 1, Color: '#008000', IsShow: 'T' } } }, RSI: { PaintItems: { RSI1: { nDays: 6, LineWidth: 1, Color: '#FF0000', IsShow: 'T' }, RSI2: { nDays: 12, LineWidth: 1, Color: '#008000', IsShow: 'T' } } }, KD: { nDays: 9, PaintItems: { K: { LineWidth: 1, Color: '#FF0000', IsShow: 'T' }, D: { LineWidth: 1, Color: '#008000', IsShow: 'T' }, J: { LineWidth: 1, Color: '#8000FF', IsShow: 'T' }, RSV: { LineWidth: 1, Color: '#808080', IsShow: 'F' } } }, MACD: { nEMA1: 12, nEMA2: 26, nDays: 9, nMultiOSC: 2, PaintItems: { DIF: { LineWidth: 1.2, Color: '#FFA500', IsShow: 'T' }, MACD: { LineWidth: 1.2, Color: '#008000', IsShow: 'T' }, OSC: { BarWidth: 5, SpaceWidth: 2, RiseColor: '#0033CC', FallColor: '#668CFF', IsShow: 'T' } } }, WilliamsR: { PaintItems: { WR1: { nDays: 12, LineWidth: 1, Color: '#FF0000', IsShow: 'T' }, WR2: { nDays: 24, LineWidth: 1, Color: '#008000', IsShow: 'T' } } }, DMI: { nDaysDI: 14, nDaysADX: 14, nDaysADXR: 14, PaintItems: { DI1: { LineWidth: 1, Color: '#FF0000', IsShow: 'T' }, DI2: { LineWidth: 1, Color: '#008000', IsShow: 'T' }, ADX: { LineWidth: 1, Color: '#0000FF', IsShow: 'T' }, ADXR: { LineWidth: 1, Color: '#FFA500', IsShow: 'T' } } }, MonthlyRevenue: { PaintItems: { MA_MONTH0: { Name: '3個月均量', Count: 3, Color: '#FF0000', LineWidth: 1.2, IsShow: 'F' }, MA_MONTH1: { Name: '12個月均量', Count: 12, Color: '#FFA500', LineWidth: 1.2, IsShow: 'F' }, } }, MTM: { PaintItems: { MTM: { Count: 10, LineWidth: 1, Color: '#FF0000', IsShow: 'T' }, MTM_MA: { Count: 25, LineWidth: 1, Color: '#008000', IsShow: 'T' } } }, }, CrossLineAndTipMgr: { ShowCrossLine: 'PriceClose', ShowTipMgr: 'F', TipMgrPosition: 'Hide', } }; // 繪製各種圖形所使用的 funciton ============================================================================================================== // 建立設定式窗 function CreateConfigWindow(oPainter) { var ChartConfig = oPainter.ChartConfig; var ChartOptions = oPainter.ChartOptions; var ChartItems = ChartOptions.ChartItems; var ChartDisplayList = ChartOptions.ChartDisplayList; var CanvasPosition = getPageCoord(oPainter.Canvas); var oButton = null; var sButtonID = oPainter.Canvas.id + '_btnConfig'; var oDiv = null; var sDivID = oPainter.Canvas.id + '_divConfig'; var sForm = ''; var sLoad = 'var ChartOptions = StockPainter.ChartOptions;'; var sSave = 'var ChartConfig = StockPainter.ChartConfig;' + 'if (!("Global" in ChartConfig)) ChartConfig.Global = {};' + 'if (!("Local" in ChartConfig)) ChartConfig.Local = {};' + 'if (!("ChartItems" in ChartConfig.Global)) ChartConfig.Global.ChartItems = {};' + 'if (!("ChartItems" in ChartConfig.Local)) ChartConfig.Local.ChartItems = {};'; var sDefault = 'if (confirm("' + (ChartOptions.Language=='CN'?'确定要回到预设值?':'確定要回到預設值?') + '")) {' + ' var result = ExecuteAsp("PersonalSetting2' + (ChartOptions.Language=='TW'?'':ChartOptions.Language) + '.asp","STEP=DEL_CHART_CONFIG&ASP_NM="+escape(StockPainter.ChartOptions.AspNM));' + ' if (!result.result) alert(result.responseText); ' + ' else if (result.responseText.substr(0,3) == "錯誤:") alert(result.responseText.substr(3)); ' + ' else location.reload(true);' + '}'; var s = ''; // 取得ChartItemList清單 var ChartItemList = []; for (var item in ChartItems) ChartItemList.push(item); // 檢查瀏覽器是否支援 Input type = color var Browser = GetBrowserInfo(); if (!Browser.Support.InputColor && typeof(jscolor) != 'Object') { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '../Library/jsp/jscolor/jscolor.js'; document.getElementsByTagName('head')[0].appendChild(script); } // 建立設定視窗 if (!(sDivID in window)) { oDiv = document.createElement('DIV'); oDiv.id = sDivID; oDiv.className = 'disable_select'; oDiv.style.cssText = 'line-height:16px;font-family:Arial;font-size:9pt;border:1.5px solid lightgray;padding:12px 12px 8px 12px;'; oDiv.style.zIndex = 6 + parseInt(oPainter.Canvas.style.zIndex || 1); oDiv.style.backgroundColor = '#eaeaea'; oDiv.style.position = 'absolute'; oDiv.style.display = 'none'; document.body.appendChild(oDiv); sForm = '<table width="100%" style="border:0;"><tr valign="top"><td style="padding:0;">' + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="2"><nobr>' + (ChartOptions.Language=='CN'?'一 般 设 置':'一 般 設 定') + '</nobr></td></tr>' + '<tr height="2px"><td colspan="2"></td></tr>'; // 設定起始顯示長度 if ('InitIndexLength' in ChartOptions && ChartOptions.IsFixedIndexLength != 'T') { sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'K线图显示范围:':'K線圖顯示範圍:') + '</nobr></td><td style="padding:0 6px 0 0">' + '<input type="text" id="CFG_InitIndexLength" size="4" maxlength="4" onkeypress="InputPosIntChk(event);"></td></tr>'; sLoad = sLoad + 'CFG_InitIndexLength.value = ChartOptions.InitIndexLength;'; s = (ChartOptions.Language=='CN'?'K线图显示范围必须是数字且大于零,请重新输入。':'K線圖顯示範圍必須是數字且大於零,請重新輸入。'); sSave = sSave + 'if (IsNumeric(CFG_InitIndexLength.value) && CFG_InitIndexLength.value > 0) { ChartConfig.Global.InitIndexLength = Number(CFG_InitIndexLength.value); }' + 'else { alert("' + s + '"); return false; }'; } // 設定KLine顯示類型 var arr = ['KLine','KLine2']; for (var idx = 0; idx < arr.length; idx++) { if (arr[idx] in ChartOptions.ChartItems) { if ('TypeList' in ChartOptions.ChartItems[arr[idx]] && ChartOptions.ChartItems[arr[idx]].TypeList.length > 1) { sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'K线图显示类型':'K線圖顯示類型') + String(arr[idx]).substr(5) + ':</nobr></td><td style="padding:2px 6px 2px 0">' + '<select id="CFG_' + arr[idx] + '_Type">'; for (var i = 0; i < ChartOptions.ChartItems[arr[idx]].TypeList.length; i++) { if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'MA') sForm = sForm + '<option value="MA">' + (ChartOptions.Language=='CN'?'移动均线':'移動均線') + '</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'EMA') sForm = sForm + '<option value="EMA">' + (ChartOptions.Language=='CN'?'平滑移动均线':'平滑移動均線') + '</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'BollingerBands') sForm = sForm + '<option value="BollingerBands">' + (ChartOptions.Language=='CN'?'布林轨道':'布林軌道') + '</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'AvgPrice') sForm = sForm + '<option value="AvgPrice">' + (ChartOptions.Language=='CN'?'平均价':'平均價') + '</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'IDX_TSE') sForm = sForm + '<option value="IDX_TSE">加權指數</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'IDX_OTC') sForm = sForm + '<option value="IDX_OTC">櫃買指數</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'IDX_SH000001') sForm = sForm + '<option value="IDX_SH000001">上证指数</option>'; else if (ChartOptions.ChartItems[arr[idx]].TypeList[i] == 'IDX_SZ399001') sForm = sForm + '<option value="IDX_SZ399001">深证指数</option>'; } sForm = sForm + '</select></td></tr>'; sLoad = sLoad + 'CFG_' + arr[idx] + '_Type.value = ChartOptions.ChartItems.' + arr[idx] + '.Type;' + 'if (CFG_' + arr[idx] + '_Type.value == "") { CFG_' + arr[idx] + '_Type.value = "MA"; }'; sSave = sSave + 'if (!("' + arr[idx] + '" in ChartConfig.Local.ChartItems)) ChartConfig.Local.ChartItems["' + arr[idx] + '"] = {};' + 'ChartConfig.Local.ChartItems["' + arr[idx] + '"].Type = CFG_' + arr[idx] + '_Type.value;'; } } } if ('CrossLineAndTipMgr' in ChartOptions) { // 設定十字線落點 sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'设置十字线落点':'設定十字線落點') + ':</nobr></td><td style="padding:2px 6px 2px 0">' + '<select id="CFG_CrossLineAndTipMgr_ShowCrossLine">' + '<option value="Float">' + (ChartOptions.Language=='CN'?'浮动':'浮動') + '</option>' + '<option value="PriceClose">' + (ChartOptions.Language=='CN'?'收盘价':'收盤價') + '</option>' + '<option value="PriceOpen">' + (ChartOptions.Language=='CN'?'开盘价':'開盤價') + '</option>' + '<option value="PriceHigh">' + (ChartOptions.Language=='CN'?'最高价':'最高價') + '</option>' + '<option value="PriceLow">' + (ChartOptions.Language=='CN'?'最低价':'最低價') + '</option>' + '</select></td></tr>'; sLoad = sLoad + 'CFG_CrossLineAndTipMgr_ShowCrossLine.value = ChartOptions.CrossLineAndTipMgr.ShowCrossLine;' + 'if (CFG_CrossLineAndTipMgr_ShowCrossLine.value == "") { CFG_CrossLineAndTipMgr_ShowCrossLine.value = "Float"; }'; sSave = sSave + 'if (!("CrossLineAndTipMgr" in ChartConfig.Global)) { ChartConfig.Global.CrossLineAndTipMgr = {}; }' + 'ChartConfig.Global.CrossLineAndTipMgr.ShowCrossLine = CFG_CrossLineAndTipMgr_ShowCrossLine.value;'; // 顯示浮動資訊框 if (ChartOptions.CrossLineAndTipMgr.ShowTipMgr != 'AlwaysShow' && ChartOptions.CrossLineAndTipMgr.ShowTipMgr != 'AlwaysHide') { sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'浮动资讯框位置':'浮動資訊框位置') + ':</nobr></td><td style="padding:2px 6px 2px 0">' + '<select id="CFG_CrossLineAndTipMgr_TipMgrPosition">' + '<option value="Hide">' + (ChartOptions.Language=='CN'?'隐藏':'隱藏') + '</option>' + '<option value="Float">' + (ChartOptions.Language=='CN'?'浮动':'浮動') + '</option>' + '<option value="FixedLeft">固定置左</option>' + '<option value="FixedRight">固定置右</option>' + '</select></td></tr>'; sLoad = sLoad + 'CFG_CrossLineAndTipMgr_TipMgrPosition.value = ChartOptions.CrossLineAndTipMgr.TipMgrPosition;' + 'if (CFG_CrossLineAndTipMgr_TipMgrPosition.value == "") { ' + ' if (ChartOptions.CrossLineAndTipMgr.ShowTipMgr == "T") CFG_CrossLineAndTipMgr_TipMgrPosition.value = "Float"; ' + ' else CFG_CrossLineAndTipMgr_TipMgrPosition.value = "Hide"; ' + '}'; sSave = sSave + 'if (!("CrossLineAndTipMgr" in ChartConfig.Global)) { ChartConfig.Global.CrossLineAndTipMgr = {}; }' + 'ChartConfig.Global.CrossLineAndTipMgr.TipMgrPosition = CFG_CrossLineAndTipMgr_TipMgrPosition.value; ' + 'ChartConfig.Global.CrossLineAndTipMgr.ShowTipMgr = (CFG_CrossLineAndTipMgr_TipMgrPosition.value=="Hide"?"F":"T");'; } } // 顯示除權息記號 if ('KLine' in ChartOptions.ChartItems) { if ('DividendFlag' in ChartOptions.ChartItems.KLine.PaintItems) { if (ChartOptions.ChartItems.KLine.PaintItems.DividendFlag.IsShow != 'AlwaysShow' && ChartOptions.ChartItems.KLine.PaintItems.DividendFlag.IsShow != 'AlwaysHide') { sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'显示除权息记号':'顯示除權息記號') + ':</nobr></td><td style="padding:2px 6px 2px 0">' + '<input type="checkbox" id="CFG_PaintItem_DividendFlag_IsShow"></td></tr>'; sLoad = sLoad + 'CFG_PaintItem_DividendFlag_IsShow.checked = (ChartOptions.ChartItems.KLine.PaintItems.DividendFlag.IsShow=="T"?true:false);'; sSave = sSave + 'if (!("KLine" in ChartConfig.Global.ChartItems)) ChartConfig.Global.ChartItems.KLine = {};' + 'if (!("PaintItems" in ChartConfig.Global.ChartItems.KLine)) ChartConfig.Global.ChartItems.KLine.PaintItems = {};' + 'if (!("DividendFlag" in ChartConfig.Global.ChartItems.KLine.PaintItems)) ChartConfig.Global.ChartItems.KLine.PaintItems.DividendFlag = {};' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.DividendFlag.IsShow = (CFG_PaintItem_DividendFlag_IsShow.checked?"T":"F");'; } } } // 顯示最高最低價 if ('KLine' in ChartOptions.ChartItems) { if ('KLine' in ChartOptions.ChartItems.KLine.PaintItems) { if (ChartOptions.ChartItems.KLine.PaintItems.KLine.ShowHighLow != 'AlwaysShow' && ChartOptions.ChartItems.KLine.PaintItems.KLine.ShowHighLow != 'AlwaysHide') { sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'显示最高最低价':'顯示最高最低價') + ':</nobr></td><td style="padding:2px 6px 2px 0">' + '<input type="checkbox" id="CFG_PaintItem_KLine_ShowHighLow"></td></tr>'; sLoad = sLoad + 'CFG_PaintItem_KLine_ShowHighLow.checked = (ChartOptions.ChartItems.KLine.PaintItems.KLine.ShowHighLow=="F"?false:true);'; sSave = sSave + 'if (!("KLine" in ChartConfig.Global.ChartItems)) ChartConfig.Global.ChartItems.KLine = {};' + 'if (!("PaintItems" in ChartConfig.Global.ChartItems.KLine)) ChartConfig.Global.ChartItems.KLine.PaintItems = {};' + 'if (!("KLine" in ChartConfig.Global.ChartItems.KLine.PaintItems)) ChartConfig.Global.ChartItems.KLine.PaintItems.KLine = {};' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.ShowHighLow = (CFG_PaintItem_KLine_ShowHighLow.checked?"T":"F");'; } } } /* // 顯示波段高低點以及設定波段計算週期 if ('KLine' in ChartOptions.ChartItems) { if ('KLine' in ChartOptions.ChartItems.KLine.PaintItems) { if ('BandTag' in ChartOptions.ChartItems.KLine.PaintItems.KLine) { //顯示波段高低點 sForm = sForm + '<tr><td style="width:1px;padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'显示波段高低点':'顯示波段高低點') + ':</nobr></td><td style="padding:2px 6px 2px 0">' + '<input type="checkbox" id="CFG_PaintItem_KLine_ShowBandTag"></td></tr>'; sLoad = sLoad + 'CFG_PaintItem_KLine_ShowBandTag.checked = (ChartOptions.ChartItems.KLine.PaintItems.KLine.BandTag.IsShow=="F"?false:true);'; sSave = sSave + 'if (!("KLine" in ChartConfig.Global.ChartItems)) ChartConfig.Global.ChartItems.KLine = {};' + 'if (!("PaintItems" in ChartConfig.Global.ChartItems.KLine)) ChartConfig.Global.ChartItems.KLine.PaintItems = {};' + 'if (!("KLine" in ChartConfig.Global.ChartItems.KLine.PaintItems)) ChartConfig.Global.ChartItems.KLine.PaintItems.KLine = {};' + 'if (!("BandTag" in ChartConfig.Global.ChartItems.KLine.PaintItems.KLine)) ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.BandTag = {};' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.BandTag.IsShow = (CFG_PaintItem_KLine_ShowBandTag.checked?"T":"F");'; //設定波段計算週期 sForm = sForm + '<tr><td style="padding:2px 0 2px 6px"><nobr>' + (ChartOptions.Language=='CN'?'波段计算周期':'波段計算週期') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + '):</nobr></td><td style="padding:0 6px 0 0">' + '<input type="text" id="CFG_PaintItem_KLine_BandCycle" size="4" maxlength="4" onkeypress="InputPosIntChk(event);"></td></tr>'; sLoad = sLoad + 'CFG_PaintItem_KLine_BandCycle.value = ChartOptions.ChartItems.KLine.PaintItems.KLine.BandTag.Cycle_' + ChartOptions.ChartCat + ';'; s = (ChartOptions.Language=='CN'?'波段计算周期的范围必须是数字且大于零,请重新输入。':'波段計算週期的範圍必須是數字且大於零,請重新輸入。'); sSave = sSave + 'if (IsNumeric(CFG_PaintItem_KLine_BandCycle.value) && CFG_PaintItem_KLine_BandCycle.value > 0)' + '{ ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.BandTag.Cycle_' + ChartOptions.ChartCat + ' = CFG_PaintItem_KLine_BandCycle.value; }' + 'else { alert("' + s + '"); return false; }'; } } } */ sForm = sForm + '<tr height="4px"><td colspan="2"></td></tr></table>'; // ChartItem顯示設定 sForm = sForm + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="2"><nobr>' + (ChartOptions.Language=='CN'?'子 图 显 示':'子 圖 顯 示') + '</nobr></td></tr>' + '<tr height="2px"><td colspan="2"></td></tr>'; sSave = sSave + 'if (!("ChartDisplayList" in ChartConfig.Local)) { ChartConfig.Local.ChartDisplayList = []; }'; var iStart = 0, iEnd = (ChartItemList.indexOf('KLine2')>=0?ChartItemList.indexOf('KLine2'):ChartItemList.length)-1; //定義ChartItem取樣範圍 for (var i=0,iNo=0; i<ChartDisplayList.length; i++) { var sID = ChartDisplayList[i]; if (sID == 'KLine2') { iStart = ChartItemList.indexOf('KLine2'); iEnd = ChartItemList.length - 1; } var bFlag = (sID in ChartItems && ChartItems[sID].IsShow == 'AlwaysShow'); //是否符合特定條件 var bFlag2 = (sID in ChartItems && ChartItems[sID].IsShow == 'AlwaysHide'); //是否符合特定條件 iNo = iNo + (bFlag2?0:1); sForm = sForm + '<tr ' + (bFlag2?'style="display:none"':'') + '>' + '<td style="width:1px;padding:2px 0 2px 6px;"><nobr>' + (ChartOptions.Language=='CN'?'图':'圖') + iNo + ':</nobr></td>' + '<td><nobr><select style="width:160px" id="CFG_ChartItem_Show' + i + '" ' + (bFlag?'disabled>':'>') + '<option value="">無</option>'; for (var j=iStart; j<=iEnd; j++) { var item = ChartItemList[j]; if (!item in ChartItems) continue; else var ChartItem = ChartItems[item]; if (ChartItem.IsShow == 'AlwaysShow' && sID != ChartItem.ID) continue; if (ChartItem.IsShow == 'AlwaysHide' && sID != ChartItem.ID) continue; if ('Controller' in ChartItem || !('ID' in ChartItem) || !('Name' in ChartItem)) continue; sForm = sForm + '<option value="' + ChartItem.ID + '">' + ChartItem.Name + '</option>'; } sForm = sForm + '</select>&nbsp;</nobr></td></tr>'; sLoad = sLoad + 'CFG_ChartItem_Show' + i + '.value = ChartOptions.ChartDisplayList[' + i + '];'; sSave = sSave + 'ChartConfig.Local.ChartDisplayList['+i+'] = CFG_ChartItem_Show' + i + '.value;'; } sForm = sForm + '<tr height="4px"><td colspan="2"></td></tr></table>'; sForm = sForm + '</td>'; // 建立價格均線設定框 var sTmp = '', s0 = '', s1 = '', s2 = ''; if ('KLine' in ChartOptions.ChartItems) { var PaintItems = ChartOptions.ChartItems.KLine.PaintItems; for (var item in PaintItems) { if (item.substr(0,7) == String('MA_'+ChartOptions.ChartCat).substr(0,7)) { sTmp = sTmp + '<tr align="center" valign="middle">' + '<td><input type="text" id="CFG_KLine_' + item + '_Name" size="6" maxlength="8" onkeypress="InputSpecialCharChk(event);"></td>' + '<td><input type="text" id="CFG_KLine_' + item + '_Value" size="4" maxlength="4" onkeypress="InputPosIntChk(event);"></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_KLine_' + item + '_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_KLine_' + item + '_IsShow"></td>' + '</tr>'; s1 = s1 + 'CFG_KLine_' + item + '_Name.value = (ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Name==null?"":ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Name);' + 'CFG_KLine_' + item + '_Value.value = (isNaN(ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Count)?"":ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Count);' + 'CFG_KLine_' + item + '_Color.value = ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Color;' + 'CFG_KLine_' + item + '_IsShow.checked = (ChartOptions.ChartItems.KLine.PaintItems.' + item + '.IsShow=="F"?false:true);'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems.' + item + '.Name = String(CFG_KLine_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.' + item + '.Count = (isNaN(CFG_KLine_' + item + '_Value.value)||String(CFG_KLine_' + item + '_Value.value).trim()==""?null:Number(CFG_KLine_' + item + '_Value.value));' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.' + item + '.Color = CFG_KLine_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.' + item + '.IsShow = (CFG_KLine_' + item + '_IsShow.checked?"T":"F");'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_KLine_' + item + '_Color.style.color = ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Color;' + 'CFG_KLine_' + item + '_Color.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Color;' + 'CFG_KLine_' + item + '_Color.value = String(ChartOptions.ChartItems.KLine.PaintItems.' + item + '.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems.' + item + '.Color = "#"+CFG_KLine_' + item + '_Color.value;'; } } } if (sTmp != '') { s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td colspan="4"><nobr>' + (ChartOptions.Language=='CN'?'价格移动平均线':'價格移動平均線') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + ')</nobr></td>' + '</tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'名称':'名稱') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'数值':'數值') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + sTmp + '<tr><td colspan="4">' + '<table width="100%" style="border:0;"><tr>' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'显示均线扣抵位置':'顯示均線扣抵位置') + ':</nobr></td>' + '<td><input type="checkbox" id="CFG_KLine_MA_SHOW_TOUCH_TAG"></td>' + '</tr><tr>' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'乖离率计算参考价':'乖離率計算參考價') + ':</nobr></td>' + '<td><select id="CFG_KLine_MA_DEV_RATE_REF">' + '<option value="PriceClose">' + (ChartOptions.Language=='CN'?'收盘价':'收盤價') + '</option>' + '<option value="PriceOpen">' + (ChartOptions.Language=='CN'?'开盘价':'開盤價') + '</option>' + '<option value="PriceHigh">' + (ChartOptions.Language=='CN'?'最高价':'最高價') + '</option>' + '<option value="PriceLow">' + (ChartOptions.Language=='CN'?'最低价':'最低價') + '</option>' + '<option value="Hide">' + (ChartOptions.Language=='CN'?'不显示':'不顯示') + '</option>' + '</select></td></tr></table>' + '</td></tr>' + '</table>'; s1 = s1 + 'CFG_KLine_MA_SHOW_TOUCH_TAG.checked = (ChartOptions.ChartItems.KLine.MA_ShowTouchTag=="T"?true:false);' + 'CFG_KLine_MA_DEV_RATE_REF.value = ChartOptions.ChartItems.KLine.MA_DevRatioRef;' + 'if (CFG_KLine_MA_DEV_RATE_REF.value == "") { CFG_KLine_MA_DEV_RATE_REF.value = "PriceClose"; }'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.MA_ShowTouchTag = (CFG_KLine_MA_SHOW_TOUCH_TAG.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.KLine.MA_DevRatioRef = CFG_KLine_MA_DEV_RATE_REF.value;'; } } // 建立量能均線設定框 var sTmp = ''; if ('Volume' in ChartOptions.ChartItems) { var PaintItems = ChartOptions.ChartItems.Volume.PaintItems; for (var item in PaintItems) { if (item.substr(0,7) == String('MA_'+ChartOptions.ChartCat).substr(0,7)) { sTmp = sTmp + '<tr align="center" valign="middle">' + '<td><input type="text" id="CFG_Volume_' + item + '_Name" size="6" maxlength="8" onkeypress="InputSpecialCharChk(event);"></td>' + '<td><input type="text" id="CFG_Volume_' + item + '_Value" size="4" maxlength="4" onkeypress="InputPosIntChk(event);"></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_Volume_' + item + '_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_Volume_' + item + '_IsShow"></td>' + '</tr>'; s1 = s1 + 'CFG_Volume_' + item + '_Name.value = (ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Name==null?"":ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Name);' + 'CFG_Volume_' + item + '_Value.value = (isNaN(ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Count)?"":ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Count);' + 'CFG_Volume_' + item + '_Color.value = ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Color;' + 'CFG_Volume_' + item + '_IsShow.checked = (ChartOptions.ChartItems.Volume.PaintItems.' + item + '.IsShow=="F"?false:true);'; s2 = s2 + 'ChartConfig.Global.ChartItems.Volume.PaintItems.' + item + '.Name = String(CFG_Volume_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.Volume.PaintItems.' + item + '.Count = (isNaN(CFG_Volume_' + item + '_Value.value)||String(CFG_Volume_' + item + '_Value.value).trim()==""?null:Number(CFG_Volume_' + item + '_Value.value));' + 'ChartConfig.Global.ChartItems.Volume.PaintItems.' + item + '.Color = CFG_Volume_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.Volume.PaintItems.' + item + '.IsShow = (CFG_Volume_' + item + '_IsShow.checked?"T":"F");'; // for Color controller if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_Volume_' + item + '_Color.style.color = ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Color;' + 'CFG_Volume_' + item + '_Color.style.backgroundColor = ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Color;' + 'CFG_Volume_' + item + '_Color.value = String(ChartOptions.ChartItems.Volume.PaintItems.' + item + '.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.Volume.PaintItems.' + item + '.Color = "#"+CFG_Volume_' + item + '_Color.value;'; } } } if (sTmp != '') { s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td colspan="4"><nobr>' + (ChartOptions.Language=='CN'?'成交量能移动平均线':'成交量能移動平均線') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + ')</nobr></td>' + '</tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'名称':'名稱') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'数值':'數值') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + sTmp + '</table>'; } } // 建立成交金額均線設定框 var sTmp = ''; if ('Amount' in ChartOptions.ChartItems) { var PaintItems = ChartOptions.ChartItems.Amount.PaintItems; for (var item in PaintItems) { if (item.substr(0,7) == String('MA_'+ChartOptions.ChartCat).substr(0,7)) { sTmp = sTmp + '<tr align="center" valign="middle">' + '<td><input type="text" id="CFG_Amount_' + item + '_Name" size="6" maxlength="8" onkeypress="InputSpecialCharChk(event);"></td>' + '<td><input type="text" id="CFG_Amount_' + item + '_Value" size="4" maxlength="4" onkeypress="InputPosIntChk(event);"></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_Amount_' + item + '_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_Amount_' + item + '_IsShow"></td>' + '</tr>'; s1 = s1 + 'CFG_Amount_' + item + '_Name.value = (ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Name==null?"":ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Name);' + 'CFG_Amount_' + item + '_Value.value = (isNaN(ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Count)?"":ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Count);' + 'CFG_Amount_' + item + '_Color.value = ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Color;' + 'CFG_Amount_' + item + '_IsShow.checked = (ChartOptions.ChartItems.Amount.PaintItems.' + item + '.IsShow=="F"?false:true);'; s2 = s2 + 'ChartConfig.Global.ChartItems.Amount.PaintItems.' + item + '.Name = String(CFG_Amount_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.Amount.PaintItems.' + item + '.Count = (isNaN(CFG_Amount_' + item + '_Value.value)||String(CFG_Amount_' + item + '_Value.value).trim()==""?null:Number(CFG_Amount_' + item + '_Value.value));' + 'ChartConfig.Global.ChartItems.Amount.PaintItems.' + item + '.Color = CFG_Amount_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.Amount.PaintItems.' + item + '.IsShow = (CFG_Amount_' + item + '_IsShow.checked?"T":"F");'; // for Color controller if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_Amount_' + item + '_Color.style.color = ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Color;' + 'CFG_Amount_' + item + '_Color.style.backgroundColor = ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Color;' + 'CFG_Amount_' + item + '_Color.value = String(ChartOptions.ChartItems.Amount.PaintItems.' + item + '.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.Amount.PaintItems.' + item + '.Color = "#"+CFG_Amount_' + item + '_Color.value;'; } } } if (sTmp != '') { s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td colspan="4"><nobr>' + (ChartOptions.Language=='CN'?'成交金额移动平均线':'成交金額移動平均線') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + ')</nobr></td>' + '</tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'名称':'名稱') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'数值':'數值') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + sTmp + '</table>'; } } // 建立月營收均線設定框 var sTmp = ''; if ('MonthlyRevenue' in ChartOptions.ChartItems && String(ChartOptions.AspNM).toUpperCase() == String('ShowSaleMonChartData').toUpperCase()) { var PaintItems = ChartOptions.ChartItems.MonthlyRevenue.PaintItems; for (var item in PaintItems) { if (item.substr(0,7) == String('MA_'+ChartOptions.ChartCat).substr(0,7)) { sTmp = sTmp + '<tr align="center" valign="middle">' + '<td><input type="text" id="CFG_MonthlyRevenue_' + item + '_Name" size="6" maxlength="8" onkeypress="InputSpecialCharChk(event);"></td>' + '<td><input type="text" id="CFG_MonthlyRevenue_' + item + '_Value" size="4" maxlength="4" onkeypress="InputPosIntChk(event);"></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MonthlyRevenue_' + item + '_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_MonthlyRevenue_' + item + '_IsShow"></td>' + '</tr>'; s1 = s1 + 'CFG_MonthlyRevenue_' + item + '_Name.value = (ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Name==null?"":ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Name);' + 'CFG_MonthlyRevenue_' + item + '_Value.value = (isNaN(ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Count)?"":ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Count);' + 'CFG_MonthlyRevenue_' + item + '_Color.value = ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Color;' + 'CFG_MonthlyRevenue_' + item + '_IsShow.checked = (ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.IsShow=="F"?false:true);'; s2 = s2 + 'ChartConfig.Global.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Name = String(CFG_MonthlyRevenue_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Count = (IsNumeric(CFG_MonthlyRevenue_' + item + '_Value.value)?Number(CFG_MonthlyRevenue_' + item + '_Value.value):null);' + 'ChartConfig.Global.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Color = CFG_MonthlyRevenue_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.MonthlyRevenue.PaintItems.' + item + '.IsShow = (CFG_MonthlyRevenue_' + item + '_IsShow.checked?"T":"F");'; // for Color controller if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_MonthlyRevenue_' + item + '_Color.style.color = ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Color;' + 'CFG_MonthlyRevenue_' + item + '_Color.style.backgroundColor = ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Color;' + 'CFG_MonthlyRevenue_' + item + '_Color.value = String(ChartOptions.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.MonthlyRevenue.PaintItems.' + item + '.Color = "#"+CFG_MonthlyRevenue_' + item + '_Color.value;'; } } } if (sTmp != '') { s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td colspan="4"><nobr>' + (ChartOptions.Language=='CN'?'月营收移动平均线':'月營收移動平均線') + '</nobr></td>' + '</tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'名称':'名稱') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'数值':'數值') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + sTmp + '</table>'; } } // for 價格 & 量能 & 月營收移動平均線 if (s0 != '') { sForm = sForm + '<td style="padding:0 0 0 6px;">' + s0 + '</td>'; sLoad = sLoad + s1; sSave = sSave + s2; } // 設定框空白字串 var s0 = '', s1 = '', s2 = ''; // 建立 KD 設定框 if ('KD' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="3">' + '<nobr>KD' + (ChartOptions.Language=='CN'?'设定值':'設定值') + '</nobr></td></tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'项目':'項目') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;K值</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_KD_K_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_KD_K_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;D值</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_KD_D_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_KD_D_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;J值</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_KD_J_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_KD_J_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;RSV</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_KD_RSV_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_KD_RSV_IsShow"></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;KD' + (ChartOptions.Language=='CN'?'周期':'週期') + '</nobr></td>' + '<td colspan="2" style="padding:2px 0"><nobr><input type="text" id="CFG_KD_nDAYS" size="1" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_KD_K_Color.value = ChartOptions.ChartItems.KD.PaintItems.K.Color;' + 'CFG_KD_K_IsShow.checked = (ChartOptions.ChartItems.KD.PaintItems.K.IsShow=="F"?false:true);' + 'CFG_KD_D_Color.value = ChartOptions.ChartItems.KD.PaintItems.D.Color;' + 'CFG_KD_D_IsShow.checked = (ChartOptions.ChartItems.KD.PaintItems.D.IsShow=="F"?false:true);' + 'CFG_KD_J_Color.value = ChartOptions.ChartItems.KD.PaintItems.J.Color;' + 'CFG_KD_J_IsShow.checked = (ChartOptions.ChartItems.KD.PaintItems.J.IsShow=="F"?false:true);' + 'CFG_KD_RSV_Color.value = ChartOptions.ChartItems.KD.PaintItems.RSV.Color;' + 'CFG_KD_RSV_IsShow.checked = (ChartOptions.ChartItems.KD.PaintItems.RSV.IsShow=="F"?false:true);' + 'CFG_KD_nDAYS.value = ChartOptions.ChartItems.KD.nDays;'; s2 = s2 + 'ChartConfig.Global.ChartItems.KD.PaintItems.K.Color = CFG_KD_K_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.K.IsShow = (CFG_KD_K_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.KD.PaintItems.D.Color = CFG_KD_D_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.D.IsShow = (CFG_KD_D_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.KD.PaintItems.J.Color = CFG_KD_J_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.J.IsShow = (CFG_KD_J_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.KD.PaintItems.RSV.Color = CFG_KD_RSV_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.RSV.IsShow = (CFG_KD_RSV_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.KD.nDays = CFG_KD_nDAYS.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_KD_K_Color.style.color = ChartOptions.ChartItems.KD.PaintItems.K.Color;' + 'CFG_KD_K_Color.style.backgroundColor = ChartOptions.ChartItems.KD.PaintItems.K.Color;' + 'CFG_KD_K_Color.value = String(ChartOptions.ChartItems.KD.PaintItems.K.Color).replace("#","");' + 'CFG_KD_D_Color.style.color = ChartOptions.ChartItems.KD.PaintItems.D.Color;' + 'CFG_KD_D_Color.style.backgroundColor = ChartOptions.ChartItems.KD.PaintItems.D.Color;' + 'CFG_KD_D_Color.value = String(ChartOptions.ChartItems.KD.PaintItems.D.Color).replace("#","");' + 'CFG_KD_J_Color.style.color = ChartOptions.ChartItems.KD.PaintItems.J.Color;' + 'CFG_KD_J_Color.style.backgroundColor = ChartOptions.ChartItems.KD.PaintItems.J.Color;' + 'CFG_KD_J_Color.value = String(ChartOptions.ChartItems.KD.PaintItems.J.Color).replace("#","");' + 'CFG_KD_RSV_Color.style.color = ChartOptions.ChartItems.KD.PaintItems.RSV.Color;' + 'CFG_KD_RSV_Color.style.backgroundColor = ChartOptions.ChartItems.KD.PaintItems.RSV.Color;' + 'CFG_KD_RSV_Color.value = String(ChartOptions.ChartItems.KD.PaintItems.RSV.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.KD.PaintItems.K.Color = "#"+CFG_KD_K_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.D.Color = "#"+CFG_KD_D_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.J.Color = "#"+CFG_KD_J_Color.value;' + 'ChartConfig.Global.ChartItems.KD.PaintItems.RSV.Color = "#"+CFG_KD_RSV_Color.value;'; } } // 建立 OBV 設定框 if ('OBV' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="2">' + '<nobr>' + (ChartOptions.Language=='CN'?'OBV设定值':'OBV設定值') + '</nobr></td></tr>' + '<tr valign="middle">' + '<td align="left"><nobr>&nbsp;OBV</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_OBV_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle">' + '<td align="left"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'OBV均线':'OBV均線') + '</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_OBV_MA_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'均线周期':'均線週期') + '</nobr></td>' + '<td style="padding:2px 0"><nobr><input type="text" id="CFG_OBV_MA_Count" size="1" maxlength="4" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_OBV_Color.value = ChartOptions.ChartItems.OBV.PaintItems.OBV.Color;' + 'CFG_OBV_MA_Color.value = ChartOptions.ChartItems.OBV.PaintItems.OBV_MA.Color;' + 'CFG_OBV_MA_Count.value = ChartOptions.ChartItems.OBV.PaintItems.OBV_MA.Count;'; s2 = s2 + 'ChartConfig.Global.ChartItems.OBV.PaintItems.OBV.Color = CFG_OBV_Color.value;' + 'ChartConfig.Global.ChartItems.OBV.PaintItems.OBV_MA.Color = CFG_OBV_MA_Color.value;' + 'ChartConfig.Global.ChartItems.OBV.PaintItems.OBV_MA.Count = CFG_OBV_MA_Count.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_OBV_Color.style.color = ChartOptions.ChartItems.OBV.PaintItems.OBV.Color;' + 'CFG_OBV_Color.style.backgroundColor = ChartOptions.ChartItems.OBV.PaintItems.OBV.Color;' + 'CFG_OBV_Color.value = String(ChartOptions.ChartItems.OBV.PaintItems.OBV.Color).replace("#","");' + 'CFG_OBV_MA_Color.style.color = ChartOptions.ChartItems.OBV.PaintItems.OBV_MA.Color;' + 'CFG_OBV_MA_Color.style.backgroundColor = ChartOptions.ChartItems.OBV.PaintItems.OBV_MA.Color;' + 'CFG_OBV_MA_Color.value = String(ChartOptions.ChartItems.OBV.PaintItems.OBV_MA.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.OBV.PaintItems.OBV.Color = "#"+CFG_OBV_Color.value;' + 'ChartConfig.Global.ChartItems.OBV.PaintItems.OBV_MA.Color = "#"+CFG_OBV_MA_Color.value;'; } } // 建立 RSI 設定框 if ('RSI' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td>' + '<nobr>RSI&nbsp;' + (ChartOptions.Language=='CN'?'设定值':'設定值') + '</nobr></td></tr>' + '<tr valign="middle">' + '<td style="padding:2px 0"><nobr>&nbsp;短天期:' + '<input type="text" id="CFG_RSI1_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td style="padding:2px 0"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'长天期':'長天期') + ':' + '<input type="text" id="CFG_RSI2_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_RSI1_nDAYS.value = ChartOptions.ChartItems.RSI.PaintItems.RSI1.nDays;' + 'CFG_RSI2_nDAYS.value = ChartOptions.ChartItems.RSI.PaintItems.RSI2.nDays;'; s2 = s2 + 'ChartConfig.Global.ChartItems.RSI.PaintItems.RSI1.nDays = CFG_RSI1_nDAYS.value;' + 'ChartConfig.Global.ChartItems.RSI.PaintItems.RSI2.nDays = CFG_RSI2_nDAYS.value;'; } // 建立 威廉指標 設定框 if ('WilliamsR' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td>' + '<nobr>' + (ChartOptions.Language=='CN'?'威廉指标设定值':'威廉指標設定值') + '</nobr></td></tr>' + '<tr valign="middle">' + '<td style="padding:2px 0"><nobr>&nbsp;短天期:' + '<input type="text" id="CFG_WR1_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td style="padding:2px 0"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'长天期':'長天期') + ':' + '<input type="text" id="CFG_WR2_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_WR1_nDAYS.value = ChartOptions.ChartItems.WilliamsR.PaintItems.WR1.nDays;' + 'CFG_WR2_nDAYS.value = ChartOptions.ChartItems.WilliamsR.PaintItems.WR2.nDays;'; s2 = s2 + 'ChartConfig.Global.ChartItems.WilliamsR.PaintItems.WR1.nDays = CFG_WR1_nDAYS.value;' + 'ChartConfig.Global.ChartItems.WilliamsR.PaintItems.WR2.nDays = CFG_WR2_nDAYS.value;'; } if (s0 != '') { // for OBV & RSI & KD & 威廉指標 sForm = sForm + '<td style="padding:0 0 0 6px;width:140px;">' + s0 + '</td>'; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立 MACD 設定框 var s0 = '', s1 = '', s2 = ''; if ('MACD' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="3">' + '<nobr>MACD' + (ChartOptions.Language=='CN'?'设定值':'設定值') + '</nobr></td></tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'项目':'項目') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;DIF</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MACD_DIF_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_MACD_DIF_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;MACD</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MACD_MACD_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_MACD_MACD_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;OSC(+)</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MACD_OSC_PLUS_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td rowspan="2"><input type="checkbox" id="CFG_MACD_OSC_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;OSC(-)</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MACD_OSC_MINUS_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;短期EMA</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_MACD_nEMA1" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'长期EMA':'長期EMA') + '</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_MACD_nEMA2" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'MACD周期':'MACD週期') + '</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_MACD_nDAYS" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'OSC倍数':'OSC倍數') + '</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_MACD_nMultiOSC" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;倍&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_MACD_DIF_Color.value = ChartOptions.ChartItems.MACD.PaintItems.DIF.Color;' + 'CFG_MACD_DIF_IsShow.checked = (ChartOptions.ChartItems.MACD.PaintItems.DIF.IsShow=="F"?false:true);' + 'CFG_MACD_MACD_Color.value = ChartOptions.ChartItems.MACD.PaintItems.MACD.Color;' + 'CFG_MACD_MACD_IsShow.checked = (ChartOptions.ChartItems.MACD.PaintItems.MACD.IsShow=="F"?false:true);' + 'CFG_MACD_OSC_PLUS_Color.value = ChartOptions.ChartItems.MACD.PaintItems.OSC.RiseColor;' + 'CFG_MACD_OSC_MINUS_Color.value = ChartOptions.ChartItems.MACD.PaintItems.OSC.FallColor;' + 'CFG_MACD_OSC_IsShow.checked = (ChartOptions.ChartItems.MACD.PaintItems.OSC.IsShow=="F"?false:true);' + 'CFG_MACD_nEMA1.value = ChartOptions.ChartItems.MACD.nEMA1;' + 'CFG_MACD_nEMA2.value = ChartOptions.ChartItems.MACD.nEMA2;' + 'CFG_MACD_nDAYS.value = ChartOptions.ChartItems.MACD.nDays;' + 'CFG_MACD_nMultiOSC.value = ChartOptions.ChartItems.MACD.nMultiOSC;'; s2 = s2 + 'ChartConfig.Global.ChartItems.MACD.PaintItems.DIF.Color = CFG_MACD_DIF_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.DIF.IsShow = (CFG_MACD_DIF_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.MACD.Color = CFG_MACD_MACD_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.MACD.IsShow = (CFG_MACD_MACD_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.OSC.RiseColor = CFG_MACD_OSC_PLUS_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.OSC.FallColor = CFG_MACD_OSC_MINUS_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.OSC.IsShow = (CFG_MACD_OSC_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.MACD.nEMA1 = CFG_MACD_nEMA1.value;' + 'ChartConfig.Global.ChartItems.MACD.nEMA2 = CFG_MACD_nEMA2.value;' + 'ChartConfig.Global.ChartItems.MACD.nDays = CFG_MACD_nDAYS.value;' + 'ChartConfig.Global.ChartItems.MACD.nMultiOSC = CFG_MACD_nMultiOSC.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_MACD_DIF_Color.style.color = ChartOptions.ChartItems.MACD.PaintItems.DIF.Color;' + 'CFG_MACD_DIF_Color.style.backgroundColor = ChartOptions.ChartItems.MACD.PaintItems.DIF.Color;' + 'CFG_MACD_DIF_Color.value = String(ChartOptions.ChartItems.MACD.PaintItems.DIF.Color).replace("#","");' + 'CFG_MACD_MACD_Color.style.color = ChartOptions.ChartItems.MACD.PaintItems.MACD.Color;' + 'CFG_MACD_MACD_Color.style.backgroundColor = ChartOptions.ChartItems.MACD.PaintItems.MACD.Color;' + 'CFG_MACD_MACD_Color.value = String(ChartOptions.ChartItems.MACD.PaintItems.MACD.Color).replace("#","");' + 'CFG_MACD_OSC_PLUS_Color.style.color = ChartOptions.ChartItems.MACD.PaintItems.OSC.RiseColor;' + 'CFG_MACD_OSC_PLUS_Color.style.backgroundColor = ChartOptions.ChartItems.MACD.PaintItems.OSC.RiseColor;' + 'CFG_MACD_OSC_PLUS_Color.value = String(ChartOptions.ChartItems.MACD.PaintItems.OSC.RiseColor).replace("#","");' + 'CFG_MACD_OSC_MINUS_Color.style.color = ChartOptions.ChartItems.MACD.PaintItems.OSC.FallColor;' + 'CFG_MACD_OSC_MINUS_Color.style.backgroundColor = ChartOptions.ChartItems.MACD.PaintItems.OSC.FallColor;' + 'CFG_MACD_OSC_MINUS_Color.value = String(ChartOptions.ChartItems.MACD.PaintItems.OSC.FallColor).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.MACD.PaintItems.DIF.Color = "#"+CFG_MACD_DIF_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.MACD.Color = "#"+CFG_MACD_MACD_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.OSC.RiseColor = "#"+CFG_MACD_OSC_PLUS_Color.value;' + 'ChartConfig.Global.ChartItems.MACD.PaintItems.OSC.FallColor = "#"+CFG_MACD_OSC_MINUS_Color.value;'; } } // 建立 DMI 設定框 if ('DMI' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="3">' + '<nobr>DMI' + (ChartOptions.Language=='CN'?'设定值':'設定值') + '</nobr></td></tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'项目':'項目') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'显示':'顯示') + '</nobr></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;+DI</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_DMI_DI1_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_DMI_DI1_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;-DI</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_DMI_DI2_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_DMI_DI2_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;ADX</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_DMI_ADX_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_DMI_ADX_IsShow"></td>' + '</tr>' + '<tr align="center" valign="middle">' + '<td align="left"><nobr>&nbsp;ADXR</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_DMI_ADXR_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '<td><input type="checkbox" id="CFG_DMI_ADXR_IsShow"></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'DI周期':'DI週期') + '</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_DMI_DI_nDays" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'ADX周期':'ADX週期') + '</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_DMI_ADX_nDays" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'ADXR周期':'ADXR週期') + '</nobr></td>' + '<td colspan="2"><nobr><input type="text" id="CFG_DMI_ADXR_nDays" size="2" maxlength="2" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_DMI_DI1_Color.value = ChartOptions.ChartItems.DMI.PaintItems.DI1.Color;' + 'CFG_DMI_DI1_IsShow.checked = (ChartOptions.ChartItems.DMI.PaintItems.DI1.IsShow=="F"?false:true);' + 'CFG_DMI_DI2_Color.value = ChartOptions.ChartItems.DMI.PaintItems.DI2.Color;' + 'CFG_DMI_DI2_IsShow.checked = (ChartOptions.ChartItems.DMI.PaintItems.DI2.IsShow=="F"?false:true);' + 'CFG_DMI_ADX_Color.value = ChartOptions.ChartItems.DMI.PaintItems.ADX.Color;' + 'CFG_DMI_ADX_IsShow.checked = (ChartOptions.ChartItems.DMI.PaintItems.ADX.IsShow=="F"?false:true);' + 'CFG_DMI_ADXR_Color.value = ChartOptions.ChartItems.DMI.PaintItems.ADXR.Color;' + 'CFG_DMI_ADXR_IsShow.checked = (ChartOptions.ChartItems.DMI.PaintItems.ADXR.IsShow=="F"?false:true);' + 'CFG_DMI_DI_nDays.value = ChartOptions.ChartItems.DMI.nDaysDI;' + 'CFG_DMI_ADX_nDays.value = ChartOptions.ChartItems.DMI.nDaysADX;' + 'CFG_DMI_ADXR_nDays.value = ChartOptions.ChartItems.DMI.nDaysADXR;'; s2 = s2 + 'ChartConfig.Global.ChartItems.DMI.PaintItems.DI1.Color = CFG_DMI_DI1_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.DI1.IsShow = (CFG_DMI_DI1_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.DI2.Color = CFG_DMI_DI2_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.DI2.IsShow = (CFG_DMI_DI2_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.ADX.Color = CFG_DMI_ADX_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.ADX.IsShow = (CFG_DMI_ADX_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.ADXR.Color = CFG_DMI_ADXR_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.ADXR.IsShow = (CFG_DMI_ADXR_IsShow.checked?"T":"F");' + 'ChartConfig.Global.ChartItems.DMI.nDaysDI = CFG_DMI_DI_nDays.value;' + 'ChartConfig.Global.ChartItems.DMI.nDaysADX = CFG_DMI_ADX_nDays.value;' + 'ChartConfig.Global.ChartItems.DMI.nDaysADXR = CFG_DMI_ADXR_nDays.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_DMI_DI1_Color.style.color = ChartOptions.ChartItems.DMI.PaintItems.DI1.Color;' + 'CFG_DMI_DI1_Color.style.backgroundColor = ChartOptions.ChartItems.DMI.PaintItems.DI1.Color;' + 'CFG_DMI_DI1_Color.value = String(ChartOptions.ChartItems.DMI.PaintItems.DI1.Color).replace("#","");' + 'CFG_DMI_DI2_Color.style.color = ChartOptions.ChartItems.DMI.PaintItems.DI2.Color;' + 'CFG_DMI_DI2_Color.style.backgroundColor = ChartOptions.ChartItems.DMI.PaintItems.DI2.Color;' + 'CFG_DMI_DI2_Color.value = String(ChartOptions.ChartItems.DMI.PaintItems.DI2.Color).replace("#","");' + 'CFG_DMI_ADX_Color.style.color = ChartOptions.ChartItems.DMI.PaintItems.ADX.Color;' + 'CFG_DMI_ADX_Color.style.backgroundColor = ChartOptions.ChartItems.DMI.PaintItems.ADX.Color;' + 'CFG_DMI_ADX_Color.value = String(ChartOptions.ChartItems.DMI.PaintItems.ADX.Color).replace("#","");' + 'CFG_DMI_ADXR_Color.style.color = ChartOptions.ChartItems.DMI.PaintItems.ADXR.Color;' + 'CFG_DMI_ADXR_Color.style.backgroundColor = ChartOptions.ChartItems.DMI.PaintItems.ADXR.Color;' + 'CFG_DMI_ADXR_Color.value = String(ChartOptions.ChartItems.DMI.PaintItems.ADXR.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.DMI.PaintItems.DI1.Color = "#"+CFG_DMI_DI1_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.DI2.Color = "#"+CFG_DMI_DI2_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.ADX.Color = "#"+CFG_DMI_ADX_Color.value;' + 'ChartConfig.Global.ChartItems.DMI.PaintItems.ADXR.Color = "#"+CFG_DMI_ADXR_Color.value;'; } } if (s0 != '') { // for MACD & DMI sForm = sForm + '<td style="padding:0 0 0 6px;width:140px;">' + s0 + '</td>'; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立布林軌道設定框 var s0 = '', s1 = '', s2 = ''; if ('KLine' in ChartOptions.ChartItems && 'BollingerBandsMA_' + ChartOptions.ChartCat in ChartOptions.ChartItems.KLine.PaintItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="2">' + '<nobr>' + (ChartOptions.Language=='CN'?'布林轨道设定值':'布林軌道設定值') + '(' + sTimeStr + ')</nobr></td></tr>' + '<tr valign="middle">' + '<td align="left"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'上轨颜色':'上軌顏色') + '</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_BollingerBandsUP_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle">' + '<td align="left"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'中轨颜色':'中軌顏色') + '</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_BollingerBandsMA_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle">' + '<td align="left"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'下轨颜色':'下軌顏色') + '</nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_BollingerBandsDN_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'均线周期':'均線週期') + '</nobr></td>' + '<td style="padding:2px 0"><nobr><input type="text" id="CFG_BollingerBandsCount" size="2" maxlength="4" onkeypress="InputPosIntChk(event);">&nbsp;' + sTimeStr + '&nbsp;</nobr></td>' + '</tr>' + '<tr valign="middle">' + '<td><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'轨道乘数':'軌道乘數') + '</nobr></td>' + '<td style="padding:2px 0"><nobr><input type="text" id="CFG_BollingerBandsMultiplier" size="2" maxlength="6" onkeypress="InputPosNumChk(event);">&nbsp;倍&nbsp;</nobr></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_BollingerBandsUP_Color.value = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsUP_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsMA_Color.value = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsDN_Color.value = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsDN_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsCount.value = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Count;' + 'CFG_BollingerBandsMultiplier.value = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Multiplier;'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsUP_'+ChartOptions.ChartCat+'"].Color = CFG_BollingerBandsUP_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Color = CFG_BollingerBandsMA_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsDN_'+ChartOptions.ChartCat+'"].Color = CFG_BollingerBandsDN_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Count = CFG_BollingerBandsCount.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Multiplier = CFG_BollingerBandsMultiplier.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_BollingerBandsUP_Color.style.color = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsUP_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsUP_Color.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsUP_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsUP_Color.value = String(ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsUP_'+ChartOptions.ChartCat+'"].Color).replace("#","");' + 'CFG_BollingerBandsMA_Color.style.color = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsMA_Color.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsMA_Color.value = String(ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Color).replace("#","");' + 'CFG_BollingerBandsDN_Color.style.color = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsDN_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsDN_Color.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsDN_'+ChartOptions.ChartCat+'"].Color;' + 'CFG_BollingerBandsDN_Color.value = String(ChartOptions.ChartItems.KLine.PaintItems["BollingerBandsDN_'+ChartOptions.ChartCat+'"].Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsUP_'+ChartOptions.ChartCat+'"].Color = "#"+CFG_BollingerBandsUP_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsMA_'+ChartOptions.ChartCat+'"].Color = "#"+CFG_BollingerBandsMA_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems["BollingerBandsDN_'+ChartOptions.ChartCat+'"].Color = "#"+CFG_BollingerBandsDN_Color.value;'; } } // 建立MTM動量指標設定框 if ('MTM' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '<table width="100%" style="margin-bottom:6px;border:1px solid gray;border-collapse:separate;border-spacing:1px;">' + '<tr style="color:white;background-color:#3366FF;" align="center"><td colspan="3">' + '<nobr>' + (ChartOptions.Language=='CN'?'MTM设定值':'MTM設定值') + '(' + sTimeStr + ')</nobr></td></tr>' + '<tr style="color:white;background-color:#3366FF;" align="center">' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'项目':'項目') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'数值':'數值') + '</nobr></td>' + '<td style="padding:2px"><nobr>' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '</nobr></td>' + '</tr>' + '<tr valign="middle" align="center">' + '<td align="left"><nobr>&nbsp;MTM</nobr></td>' + '<td style="padding:2px 0"><nobr><input type="text" id="CFG_MTM_Count" size="1" maxlength="4" onkeypress="InputPosIntChk(event);"></nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MTM_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '<tr valign="middle" align="center">' + '<td align="left"><nobr>&nbsp;' + (ChartOptions.Language=='CN'?'均线':'均線') + '</nobr></td>' + '<td style="padding:2px 0"><nobr><input type="text" id="CFG_MTM_MA_Count" size="1" maxlength="4" onkeypress="InputPosIntChk(event);"></nobr></td>' + '<td><input ' + (Browser.Support.InputColor?'type':'class') + '="color" id="CFG_MTM_MA_Color" style="font-size:0pt;padding:0;width:23px;height:16px;" readonly></td>' + '</tr>' + '</table>'; s1 = s1 + 'CFG_MTM_Color.value = ChartOptions.ChartItems.MTM.PaintItems.MTM.Color;' + 'CFG_MTM_Count.value = ChartOptions.ChartItems.MTM.PaintItems.MTM.Count;' + 'CFG_MTM_MA_Color.value = ChartOptions.ChartItems.MTM.PaintItems.MTM_MA.Color;' + 'CFG_MTM_MA_Count.value = ChartOptions.ChartItems.MTM.PaintItems.MTM_MA.Count;'; s2 = s2 + 'ChartConfig.Global.ChartItems.MTM.PaintItems.MTM.Color = CFG_MTM_Color.value;' + 'ChartConfig.Global.ChartItems.MTM.PaintItems.MTM.Count = CFG_MTM_Count.value;' + 'ChartConfig.Global.ChartItems.MTM.PaintItems.MTM_MA.Color = CFG_MTM_MA_Color.value;' + 'ChartConfig.Global.ChartItems.MTM.PaintItems.MTM_MA.Count = CFG_MTM_MA_Count.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_MTM_Color.style.color = ChartOptions.ChartItems.MTM.PaintItems.MTM.Color;' + 'CFG_MTM_Color.style.backgroundColor = ChartOptions.ChartItems.MTM.PaintItems.MTM.Color;' + 'CFG_MTM_Color.value = String(ChartOptions.ChartItems.MTM.PaintItems.MTM.Color).replace("#","");' + 'CFG_MTM_MA_Color.style.color = ChartOptions.ChartItems.MTM.PaintItems.MTM_MA.Color;' + 'CFG_MTM_MA_Color.style.backgroundColor = ChartOptions.ChartItems.MTM.PaintItems.MTM_MA.Color;' + 'CFG_MTM_MA_Color.value = String(ChartOptions.ChartItems.MTM.PaintItems.MTM_MA.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.MTM.PaintItems.MTM.Color = "#"+CFG_MTM_Color.value;' + 'ChartConfig.Global.ChartItems.MTM.PaintItems.MTM_MA.Color = "#"+CFG_MTM_MA_Color.value;'; } } if (s0 != '') { // for 布林軌道&MTM動量指標 sForm = sForm + '<td style="padding:0 0 0 6px;width:140px;">' + s0 + '</td>'; sLoad = sLoad + s1; sSave = sSave + s2; } // Main Form 結尾 sForm = sForm + '</td></tr></table>'; // 建立儲存程式碼 sSave = sSave + 'var result = ExecuteAsp("PersonalSetting2' + (ChartOptions.Language=='TW'?'':ChartOptions.Language) + '.asp","STEP=SAVE_CHART_CONFIG&ASP_NM="+escape(StockPainter.ChartOptions.AspNM)+"&CHART_CONFIG_GLOBAL="+escape(JSON.stringify(ChartConfig.Global))+"&CHART_CONFIG_LOCAL="+escape(JSON.stringify(ChartConfig.Local)));' + 'if (!result.result) alert(result.responseText);' + 'else if (result.responseText.substr(0,3) == "錯誤:") alert(result.responseText.substr(3));' + 'ResetStockChart();' + 'document.getElementById("' + sDivID + '").style.display="none";'; // 建立儲存取消鈕 sForm = sForm + '<table width="100%" style="border:0;">' + '<tr height="2px"><td colspan="3"></td></tr>' + '<tr><td align="right" width="35%">' + '<button onclick=\'' + sSave + '\'>' + (ChartOptions.Language=='CN'?'确定':'確定') + '</button>' + '</td><td align="center" width="30%">' + '<button onclick=\'document.getElementById("' + sDivID + '").style.display="none";\'>取消</button>' + '</td><td width="35%">' + '<button onclick=\'' + sDefault + '\'>' + (ChartOptions.Language=='CN'?'恢复预设值':'恢復預設值') +'</button>' + '</td></tr></table>'; // 建立Login警告說明 if (false != true) { sForm = sForm + '<table width="100%" style="border:0;">' + '<tr height="6px"><td></td></tr>' + '<tr><td style="color:gray;">' + (ChartOptions.Language=='TW'?'由於您未登入本網站, 您的線圖設定只能儲存於此部電腦, 無法跟隨您的帳號帶到其他電腦使用, 請使用時多加留意。':'') + (ChartOptions.Language=='CN'?'由于您未登录本网站, 您的线图设定只能储存于此部电脑, 无法跟随您的帐号带到其他电脑使用, 请使用时多加留意。':'') + '</td></tr></table>'; } oDiv.innerHTML = '<table width="1px" style="border:0;"><tr><td>' + sForm + '</td></tr></table>'; } else { oDiv = document.getElementById(sDivID); } // 建立設定鈕 if (!(sButtonID in window)) { sLoad = 'if (document.getElementById("' + sDivID + '").style.display!="") { ' + sLoad + ' document.getElementById("' + sDivID + '").style.display = ""; ' + '} else { document.getElementById("' + sDivID + '").style.display = "none"; } '; oButton = document.createElement('DIV'); oButton.id = sButtonID; oButton.style.cssText = 'padding:0;'; oButton.style.zIndex = 5 + parseInt(oPainter.Canvas.style.zIndex || 1); oButton.style.position = 'absolute'; oButton.innerHTML = '<input id="btnStockChartSetting" type="button" value="' + (ChartOptions.Language=='CN'?'设置':'設定') + '" ' + 'style="line-height:16px;font-family:Arial;font-size:9pt;padding:0px 8px;" onclick=\'' + sLoad + '\'>'; document.body.appendChild(oButton); } else { oButton = document.getElementById(sButtonID); } // 設定物件位置 oButton.style.left = (CanvasPosition.x + 6) + 'px'; oButton.style.top = (CanvasPosition.y + 4) + 'px'; oDiv.style.left = (CanvasPosition.x - 3) + 'px'; oDiv.style.top = (CanvasPosition.y + 24) + 'px'; } function PaintChart(oPainter, ChartItem, Records) { if ('Controller' in ChartItem || ChartItem.IsShow == 'AlwaysHide') return; var ctx = oPainter.ctx; var StockData = oPainter.Data; var ChartOptions = oPainter.ChartOptions; var Region = ChartItem.Region; var Legend = ChartItem.Legend; var xAxis = ChartItem.xAxis; var yAxisL = ChartItem.yAxisL; var yAxisR = ChartItem.yAxisR; var PaintItems = ChartItem.PaintItems; var fChartWidth = ChartOptions.ChartWidth; var fChartHeight = Region.height; function GetX(i) { return (i * fChartWidth / ChartOptions.IndexLength + fChartWidth / ChartOptions.IndexLength / 2); } function GetY(v, h, l) { if (v == null || h == null || l == null) { return null; } else if (v > h) { return 0; } else if (v < l) { return fChartHeight; } else { return (fChartHeight - fChartHeight * (v - l) / (h - l)); } } function GetColor(v, PaintItem) { if (v > 0 && 'RiseColor' in PaintItem) { return PaintItem.RiseColor; } else if (v < 0 && 'FallColor' in PaintItem) { return PaintItem.FallColor; } else if ('NormalColor' in PaintItem) { return PaintItem.NormalColor; } else if ('RiseColor' in PaintItem) { return PaintItem.RiseColor; } else if ('Color' in PaintItem) { return PaintItem.Color; } else { return '#000000'; } } //取得左右軸相關欄位 var f = ['Field','Open','Close','High','Low']; if (yAxisL != null) { yAxisL.Fields = []; } if (yAxisR != null) { yAxisR.Fields = []; } for (var item in PaintItems) { var PaintItem = PaintItems[item]; if ('yAxisAlign' in PaintItem) { if ('Type' in ChartItem && 'AlignType' in PaintItem && ChartItem.Type != null && PaintItem.AlignType != null && (Array.isArray(PaintItem.AlignType) == false && ChartItem.Type != PaintItem.AlignType || Array.isArray(PaintItem.AlignType) == true && PaintItem.AlignType.indexOf(ChartItem.Type) == -1)) { /* 什麼都不做 */ } else if (PaintItem.yAxisRef == 'F') { /* 什麼都不做 */ } else if (PaintItem.yAxisAlign in ChartItem && PaintItem.IsShow != 'F' && PaintItem.IsShow != 'AlwaysHide') { var yAxisTmp = ChartItem[PaintItem.yAxisAlign] if (PaintItem.Type == 'StackBar') { yAxisTmp.Fields.push({ StackFields: PaintItem.Fields, IsReverse: PaintItem.IsReverse, IsAccumulated: PaintItem.IsAccumulated }); } else { for (var j = 0; j < f.length; j++) { if (f[j] in PaintItem.Fields) { yAxisTmp.Fields.push({ Field: PaintItem.Fields[f[j]], Type: PaintItem.Type, IsReverse: PaintItem.IsReverse, IsAccumulated: PaintItem.IsAccumulated }); } } } } } } //取得左右Y軸資料高低點 var yAxisList = ['yAxisL','yAxisR']; for (var idx = 0; idx < yAxisList.length; idx++) { if (yAxisList[idx] in ChartItem) { var yAxisTmp = ChartItem[yAxisList[idx]]; var high = yAxisTmp.InitAxisHigh; var low = yAxisTmp.InitAxisLow; for (var i = 0; i < yAxisTmp.Fields.length; i++) { var iReverse = (yAxisTmp.Fields[i].IsReverse=='T'?-1:1); if ('StackFields' in yAxisTmp.Fields[i]) { var StackFields = yAxisTmp.Fields[i].StackFields; var fTmp = 0; for (var j = ChartOptions.IndexStart; j <= ChartOptions.IndexEnd; j++) { if (yAxisTmp.Fields[i].IsAccumulated != 'T') fTmp = 0; for (var k = 0; k < StackFields.length; k++) { if (StackFields[k] in Records && IsNumeric(Records[StackFields[k]][j])) fTmp = fTmp + Records[StackFields[k]][j]; } if (IsNumeric(fTmp)) { if (high == null) { high = fTmp*iReverse; } else { high = Math.max(high, fTmp*iReverse); } if (low == null) { low = fTmp*iReverse; } else { low = Math.min(low, fTmp*iReverse); } } } } else if (yAxisTmp.Fields[i].Field in Records) { var fTmp = 0; var Record = Records[yAxisTmp.Fields[i].Field]; for (var j = ChartOptions.IndexStart; j <= ChartOptions.IndexEnd; j++) { if (IsNumeric(Record[j])) { if (yAxisTmp.Fields[i].IsAccumulated == 'T') { fTmp = fTmp + Record[j]; } else { fTmp = Record[j]; } if (IsNumeric(fTmp)) { if (high == null) { high = fTmp*iReverse; } else { high = Math.max(high, fTmp*iReverse); } if (low == null) { low = fTmp*iReverse; } else { low = Math.min(low, fTmp*iReverse); } } } } } } //修正high/low錯誤 if (high == null) { high = 0; } if (low == null) { low = 0; } if (high == 0 && low == 0) { high = 1; } else if (high == low && high > 0) { low = 0; } else if (high == low && low < 0) { high = 0; } //對稱性座標軸 if (yAxisTmp.IsSymmetrical == 'T') { if (Math.abs(high) > Math.abs(low)) { low = high * -1; } else if (Math.abs(high) < Math.abs(low)) { high = low * -1; } } //修正Y軸高低點 // var fSpace = getScalesSpace(low, high, ChartItem.HLineCount / (yAxisTmp.IsSymmetrical=='T'?2:1)); var fSpace = getScalesSpace(low, high, ChartItem.HLineCount); yAxisTmp.Space = fSpace; for (var i=0; i<=high; i=i+fSpace); if (yAxisTmp.LimitAxisHigh != null && i > yAxisTmp.LimitAxisHigh) i = yAxisTmp.LimitAxisHigh; if (yAxisTmp.BestAxisHigh != null && low >= yAxisTmp.BestAxisHigh) i = yAxisTmp.BestAxisHigh; yAxisTmp.AxisHigh = i; for (var i=yAxisTmp.AxisHigh; i>=low; i=i-fSpace); if (yAxisTmp.LimitAxisLow != null && i < yAxisTmp.LimitAxisLow) i = yAxisTmp.LimitAxisLow; if (yAxisTmp.BestAxisLow != null && low >= yAxisTmp.BestAxisLow) i = yAxisTmp.BestAxisLow; yAxisTmp.AxisLow = i; } } //左右軸高低點資料互補 if (yAxisL != null && yAxisR != null) { if (yAxisL.Fields.length > 0 && yAxisR.Fields.length == 0) { yAxisR.AxisHigh = yAxisL.AxisHigh; yAxisR.AxisLow = yAxisL.AxisLow; if ('Space' in yAxisL) yAxisR.Space = yAxisL.Space; if ('SplitPoint' in yAxisL) yAxisR.SplitPoint = yAxisL.SplitPoint; } if (yAxisL.Fields.length == 0 && yAxisR.Fields.length > 0) { yAxisL.AxisHigh = yAxisR.AxisHigh; yAxisL.AxisLow = yAxisR.AxisLow; if ('Space' in yAxisR) yAxisL.Space = yAxisR.Space; if ('SplitPoint' in yAxisR) yAxisL.SplitPoint = yAxisR.SplitPoint; } } //定位繪圖原點 ctx.restore(); ctx.save(); ctx.translate(Region.x, Region.y); ctx.globalAlpha = 1; //畫垂直底紋線 & x軸文字 var iBackLineSpace = Math.ceil(ChartOptions.IndexLength/(ChartItem.VLineCount+1)); for (var i = ChartOptions.IndexEnd; i >= ChartOptions.IndexStart; i-=iBackLineSpace) { var x = GetX(i - ChartOptions.IndexStart); oPainter.drawVLine(ChartItem.SplitLineColor, x, 0, fChartHeight, ChartItem.SplitLineWidth, ChartItem.SplitLineStyle); //畫垂直底紋線 if (xAxis != null && 'ShowText' in xAxis) { if (xAxis.ShowText == 'T') { var s = ('TextField' in xAxis?xAxis.TextField:'RPT_TIME'); oPainter.drawVLine(ChartItem.BorderColor, x, fChartHeight, 4, ChartItem.BorderLineWidth, ChartItem.BorderLineStyle); oPainter.drawText(Records[s][i], x, fChartHeight+5.5, xAxis.Font, xAxis.Color, xAxis.TextBaseline, xAxis.Align); } } } //畫主K線圖的水平底紋線 & 左右y軸文字 function yAxisPaint(v, high, low, iRound, yAxisTmp, sAxisName) { if (v > high || v < low) return; var y = GetY(v, high, low); var x = (sAxisName=='yAxisL'?-8:fChartWidth+8); if ('Round' in yAxisTmp && !isNaN(yAxisTmp.Round)) { oPainter.drawText(Math.round(v*Math.pow(10,yAxisTmp.Round))/Math.pow(10,yAxisTmp.Round), x, y, yAxisTmp.Font, yAxisTmp.Color, yAxisTmp.TextBaseline, yAxisTmp.Align); } else if (yAxisTmp.BigNumberToText == 'T') { oPainter.drawText(bigNumberToText(v,2), x, y, yAxisTmp.Font, yAxisTmp.Color, yAxisTmp.TextBaseline, yAxisTmp.Align); } else if (IsNumeric(iRound)) { oPainter.drawText(Number(v).toFixed(iRound), x, y, yAxisTmp.Font, yAxisTmp.Color, yAxisTmp.TextBaseline, yAxisTmp.Align); } else { oPainter.drawText(Round(v,2), x, y, yAxisTmp.Font, yAxisTmp.Color, yAxisTmp.TextBaseline, yAxisTmp.Align); } if (yAxisTmp.ShowSplitLine == 'T') oPainter.drawHLine(ChartItem.SplitLineColor, 0, y, fChartWidth, ChartItem.SplitLineWidth, ChartItem.SplitLineStyle); if (sAxisName == 'yAxisL') oPainter.drawHLine(ChartItem.BorderColor, -5, y, 5, ChartItem.SplitLineWidth, ChartItem.SplitLineStyle); if (sAxisName == 'yAxisR') oPainter.drawHLine(ChartItem.BorderColor, fChartWidth, y, 5, ChartItem.SplitLineWidth, ChartItem.SplitLineStyle); } for (var idx = 0; idx < yAxisList.length; idx++) { if (yAxisList[idx] in ChartItem) { var yAxisTmp = ChartItem[yAxisList[idx]]; var fSpace = yAxisTmp.Space; var high = yAxisTmp.AxisHigh; var low = yAxisTmp.AxisLow; if (high != null && low != null && 'SplitPoint' in yAxisTmp) { for (var i = 0; i < yAxisTmp.SplitPoint.length; i++) { yAxisPaint(yAxisTmp.SplitPoint[i], high, low, null, yAxisTmp, yAxisList[idx]); } } else if (high != null && low != null && fSpace != null) { var iRound = 0; if (high*100%10 != 0 || low*100%10 != 0 || fSpace*100%10 != 0) iRound = 2; else if (high*10%10 != 0 || low*10%10 != 0 || fSpace*10%10 != 0) iRound = 1; for (var i = low; i <= high; i = i + fSpace) { yAxisPaint(i, high, low, iRound, yAxisTmp, yAxisList[idx]); } } } } // 正式畫圖 if ('PaintOrder' in ChartItem && Object.prototype.toString.call(ChartItem.PaintOrder) == '[object Array]') { //以特定順序畫圖 var PaintItemList = ChartItem.PaintOrder; } else if ('PaintOrder' in ChartItem && String(ChartItem.PaintOrder).toUpperCase() == 'DESC') { //以反向順序畫圖 var TempList = []; for (var item in PaintItems) TempList.push(item); var PaintItemList = []; for (var i = TempList.length - 1; i >= 0; i--) PaintItemList.push(TempList[i]); } else { //以正向順序畫圖 var PaintItemList = []; for (var item in PaintItems) PaintItemList.push(item); } for (var idx = 0; idx < PaintItemList.length; idx++) { var PaintItem = PaintItems[PaintItemList[idx]]; var iReverse = (PaintItem.IsReverse=='T'?-1:1); var yAxisTmp = ChartItem[PaintItem.yAxisAlign]; var p = { low: { v: null, x: null, y: null}, high: { v: null, x: null, y: null} } //用來記錄最高最低點的座標 if (PaintItem.IsShow == 'F' || PaintItem.IsShow == 'AlwaysHide') { continue; } else if ('Type' in ChartItem && 'AlignType' in PaintItem && ChartItem.Type != null && PaintItem.AlignType != null && Array.isArray(PaintItem.AlignType) == true && PaintItem.AlignType.indexOf(ChartItem.Type) == -1) { continue; } else if ('Type' in ChartItem && 'AlignType' in PaintItem && ChartItem.Type != null && PaintItem.AlignType != null && Array.isArray(PaintItem.AlignType) == false && ChartItem.Type != PaintItem.AlignType) { continue; } else if (PaintItem.Type == 'Candle') { //Start of Candle ResetBarWidth(oPainter, ChartItem, PaintItem); //重設柱寬及間距 var fBarWidth = PaintItem.BarWidth; var fSpaceWidth = PaintItem.SpaceWidth; var fCurX = null; var Fields = PaintItem.Fields; for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { if (Records[Fields.Open][i] == null || Records[Fields.Close][i] == null || Records[Fields.High][i] == null || Records[Fields.Low][i] == null) { continue; } if (Records[Fields.Close][i] != null && Records[Fields.Open][i] != null) { var sColor = GetColor(Records[Fields.Close][i]-Records[Fields.Open][i], PaintItem); } else { var sColor = GetColor(0, PaintItem); } var fLineX = GetX(i - ChartOptions.IndexStart); var fTopY = GetY(Records[Fields.High][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); var fBottomY = GetY(Records[Fields.Low][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); if (fCurX == null || fLineX - fCurX >= 1) { //兩根柱子距離太近就跳過不畫 oPainter.drawVLine(sColor, fLineX, fTopY, fBottomY-fTopY, 1, 'solid'); if (fBarWidth > 1.5) { //柱子夠寬才畫出柱子 var fCandleY, fCandleHeight; if (Records[Fields.Open][i] <= Records[Fields.Close][i]) { fCandleY = GetY(Records[Fields.Close][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); fCandleHeight = GetY(Records[Fields.Open][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow) - fCandleY; } else { fCandleY = GetY(Records[Fields.Open][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); fCandleHeight = GetY(Records[Fields.Close][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow) - fCandleY; } if (fCandleHeight < 1) { fCandleHeight = 1; } oPainter.drawVLine(sColor, fLineX, fCandleY, fCandleHeight, fBarWidth, 'solid'); } fCurX = fLineX; } // 標示波段高低點 if ('BandTag' in PaintItem && 'BandTag' in Records) { if (PaintItem.BandTag.IsShow == 'T' && String(Records.BandTag[i]).indexOf('H') >= 0) { oPainter.drawText(Records[Fields.High][i], fLineX, fTopY-2, ChartItem.Font, '#FF0000', 'bottom', 'center'); } else if (PaintItem.BandTag.IsShow == 'T' && String(Records.BandTag[i]).indexOf('L') >= 0) { oPainter.drawText(Records[Fields.Low][i], fLineX, fBottomY+2, ChartItem.Font, '#008000', 'top', 'center'); } } // 記錄最高最低價 if (p.high.v == null || Records[Fields.High][i] != null && p.high.v <= Records[Fields.High][i]) { p.high.v = Records[Fields.High][i]; p.high.x = fLineX; p.high.y = fTopY; } if (p.low.v == null || Records[Fields.Low][i] != null && p.low.v >= Records[Fields.Low][i]) { p.low.v = Records[Fields.Low][i]; p.low.x = fLineX; p.low.y = fBottomY; } } } //End of Candle else if (PaintItem.Type == 'Line') { //Start of Line var sField = PaintItem.Fields.Field; //取得欄位名稱 ctx.strokeStyle = PaintItem.Color; ctx.lineWidth = PaintItem.LineWidth; ctx.beginPath(); var bPaint = false; for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { if (Records[sField][i] != null) { var x = GetX(i - ChartOptions.IndexStart); var y = GetY(Records[sField][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); if (y && !bPaint) { ctx.moveTo(x, y); bPaint = true; } else { ctx.lineTo(x, y); } // 記錄最高最低價 if (p.high.v == null || Records[sField][i] != null && p.high.v <= Records[sField][i]) { p.high.v = Records[sField][i]; p.high.x = x; p.high.y = y; } if (p.low.v == null || Records[sField][i] != null && p.low.v >= Records[sField][i]) { p.low.v = Records[sField][i]; p.low.x = x; p.low.y = y; } } else { bPaint = false; } } ctx.stroke(); } //End of Line else if (PaintItem.Type == 'Bar') { //Start of Bar ResetBarWidth(oPainter, ChartItem, PaintItem); //重設柱寬及間距 var fBarWidth = PaintItem.BarWidth; var fSpaceWidth = PaintItem.SpaceWidth; var sField = PaintItem.Fields.Field; //取得欄位名稱 var sColorField = PaintItem.Fields.ColorField; //取得決定色彩的欄位名稱 for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { if (Records[sField][i] != null) { var x = GetX(i - ChartOptions.IndexStart); var y = GetY(Records[sField][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); var h = GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow) - y; if (sColorField == null) { sColor = PaintItem.Color; } else { sColor = GetColor((Records[sColorField][i]==null?0:Records[sColorField][i]), PaintItem); } oPainter.drawVLine(sColor, x, y, h, fBarWidth, 'solid'); // 記錄最高最低價 if (p.high.v == null || Records[sField][i] != null && p.high.v <= Records[sField][i]) { p.high.v = Records[sField][i]; p.high.x = x; p.high.y = y; } if (p.low.v == null || Records[sField][i] != null && p.low.v >= Records[sField][i]) { p.low.v = Records[sField][i]; p.low.x = x; p.low.y = y; } } } ctx.stroke(); } //End of Bar else if (PaintItem.Type == 'StackBar') { //Start of Stack Bar ResetBarWidth(oPainter, ChartItem, PaintItem); //重設柱寬及間距 var fBarWidth = PaintItem.BarWidth; var fSpaceWidth = PaintItem.SpaceWidth; var StackFields = PaintItem.Fields; //取得欄位名稱 var StackColors = PaintItem.Colors; //取得色彩 for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { var fStack = 0; var fLast = 0; var x = GetX(i - ChartOptions.IndexStart); for (var j = StackFields.length - 1; j >= 0; j--) { if (IsNumeric(Records[StackFields[j]][i])) { fStack = fStack + Records[StackFields[j]][i]; var y = GetY(fStack*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); var h = GetY(fLast, yAxisTmp.AxisHigh, yAxisTmp.AxisLow) - y; var sColor = StackColors[j]; oPainter.drawVLine(sColor, x, y, h, fBarWidth, 'solid'); fLast = fStack; } } // 記錄最高最低價 if (p.high.v == null || fStack != null && p.high.v <= fStack) { p.high.v = fStack; p.high.x = x; p.high.y = y; } if (p.low.v == null || fStack != null && p.low.v >= fStack) { p.low.v = fStack; p.low.x = x; p.low.y = y; } } ctx.stroke(); } //End of Stack Bar else if (PaintItem.Type == 'Area') { //Start of Area var sField = PaintItem.Fields.Field; //取得欄位名稱 ctx.globalAlpha = PaintItem.GlobalAlpha; ctx.strokeStyle = PaintItem.Color; if ('LineWidth' in PaintItem) { ctx.lineWidth = PaintItem.LineWidth; } ctx.beginPath(); ctx.moveTo(GetX(0), GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow)); var fTmp = 0; for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { if (PaintItem.IsAccumulated == 'T') { fTmp = fTmp + Records[sField][i]; } else { fTmp = Records[sField][i]; } var x = GetX(i - ChartOptions.IndexStart); var y = GetY(fTmp*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow); ctx.lineTo(x, y); } ctx.lineTo(GetX(ChartOptions.IndexEnd - ChartOptions.IndexStart), GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow)); ctx.moveTo(GetX(0), GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow)); ctx.stroke(); ctx.fillStyle = PaintItem.Color; ctx.fill(); ctx.globalAlpha = 1; } //End of Area else if (PaintItem.Type == 'Flag') { //Start of Flag var sField = PaintItem.Fields.Field; //取得欄位名稱 var sRefer = PaintItem.Fields.PositionRefer; //繪圖位置參考欄位 for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { if (Records[sField][i] != '' && Records[sField][i] != null) { var x = GetX(i - ChartOptions.IndexStart); var y = GetY(Records[sRefer][i], yAxisTmp.AxisHigh, yAxisTmp.AxisLow); if (PaintItem.Pointer != null && PaintItem.Pointer != '') oPainter.drawText(PaintItem.Pointer, x, y, ChartItem.Font, PaintItem.Color, PaintItem.TextBaseline, 'center'); oPainter.drawText(Records[sField][i], x + PaintItem.Offset.x, y + PaintItem.Offset.y, ChartItem.Font, PaintItem.Color, PaintItem.TextBaseline, 'center'); } } } //End of Flag PaintItem.HighLowRecord = p; //儲存最高最低記錄 } //畫外框 ctx.strokeStyle = ChartItem.BorderColor; ctx.lineWidth = ChartItem.BorderLineWidth; ctx.beginPath(); ctx.rect(0, 0, fChartWidth, fChartHeight); ctx.stroke(); //畫均線扣抵位置 if (ChartItem.MA_ShowTouchTag == 'T') { for (var item in PaintItems) { var PaintItem = PaintItems[item]; if (PaintItem.IsShow == 'T' && String(item).indexOf('MA_'+ChartOptions.ChartCat) >= 0) { var i = StockData.RecordCount - PaintItem.Count - ChartOptions.IndexStart; if (i >= 0 && i < ChartOptions.IndexLength) oPainter.drawText('▲', GetX(i), ChartItem.Region.height+2, ChartItem.Font, PaintItem.Color, 'bottom', 'center'); } } } //畫最高最低價 for (var idx = PaintItemList.length - 1; idx >= 0; idx--) { var PaintItem = PaintItems[PaintItemList[idx]]; if ('ShowHighLow' in PaintItem && 'HighLowRecord' in PaintItem) { if (PaintItem.ShowHighLow == 'T' && PaintItem.IsShow != 'F') { var p = PaintItem.HighLowRecord; if (p.high.v != null) oPainter.drawText(p.high.v, p.high.x, p.high.y-2, ChartItem.Font, '#FF0000', 'bottom', 'center'); if (p.low.v != null) oPainter.drawText(p.low.v, p.low.x, p.low.y+2, ChartItem.Font, '#008000', 'top', 'center'); } } } //恢復ctx原始設定 ctx.restore(); //畫Legend PaintLegend(oPainter, ChartItem); } // 繪製一般Legend function PaintLegend(oPainter, ChartItem) { if (String(ChartItem.Legend.Type).substr(0,5) == 'KLine') { PaintKLineLegend(oPainter, ChartItem); return; } var sLegendID = 'SubChartLegend_' + ChartItem.ID; var ChartOptions = oPainter.ChartOptions; var Data = oPainter.Data; var Records = Data.Records; var Region = ChartItem.Region; var Legend = ChartItem.Legend; var PaintItems = ChartItem.PaintItems; var canvasPosition = getPageCoord(oPainter.Canvas); var iCurIdx = ChartOptions.IndexCurrent; var iStartIdx = ChartOptions.IndexStart; // 建立或連結物件 if (sLegendID in window) { var oLegend = $id(sLegendID) } else { var oLegend = document.createElement('DIV'); oLegend.id = sLegendID; document.body.appendChild(oLegend); addEvent(oLegend, 'mouseover', DisableSelect); } var s1 = "", s2 = "", s3 = ""; for (var item in PaintItems) { var PaintItem = PaintItems[item]; // 過濾幾種不顯示的狀況 if (!('Legend' in PaintItem)) continue; if (PaintItem.IsShow == 'F' && PaintItem.Legend.IsShow != 'AlwaysShow') continue; if (PaintItem.Legend.IsShow == 'F') continue; var arrFields = []; if (PaintItem.Type == 'StackBar') { arrFields = PaintItem.Fields; } else { arrFields.push('Close' in PaintItem.Fields?PaintItem.Fields.Close:PaintItem.Fields.Field); } for (var iField = 0; iField < arrFields.length; iField++) { var sField = arrFields[iField]; var ItemLegend = PaintItem.Legend; if (PaintItem.IsAccumulated == 'T') { var fValCur = 0, fValLast = 0; for (var i = iStartIdx; i <= iCurIdx; i++) { if (Records[sField][i] != null) { fValCur = fValCur + Records[sField][i]; } if (i > iStartIdx) { if (Records[sField][i-1] != null) { fValLast = fValLast + Records[sField][i-1]; } } } } else { var fValCur = Records[sField][iCurIdx]; var fValLast = (iCurIdx>0?Records[sField][iCurIdx-1]:null); } // 檢查是否忽略顯示空白資料 if ('Legend' in PaintItem && 'HideEmpty' in PaintItem.Legend && PaintItem.Legend.HideEmpty == 'T' && fValCur == null) { continue; } // 設定趨勢符號 var sTrend = ''; if (ItemLegend.ShowTrend == 'T' && iCurIdx > 0 && IsNumeric(fValCur) && IsNumeric(fValLast)) { if (Legend.ShowICON == 'T') { if (fValCur > fValLast) { sTrend = '<span style="color:' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</span>'; } else if (fValCur < fValLast) { sTrend = '<span style="color:' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + '</span>'; } } else { if (fValCur > fValLast) { sTrend = GetUpDownICON(1); } else if (fValCur < fValLast) { sTrend = GetUpDownICON(-1); } } } // 設定增減數 var sDiffAmount = ''; if (ItemLegend.ShowDiffAmount == 'T' && iCurIdx > 0 && IsNumeric(fValCur) && IsNumeric(fValLast)) { if (Legend.ShowICON == 'T' && 'DiffAmount' in PaintItem.Fields) { sDiffAmount = '&nbsp;<span style="color:' + GetRiseFallColor(Records[PaintItem.Fields.DiffAmount][iCurIdx]) + '">(' + GetUpDownICON(Records[PaintItem.Fields.DiffAmount][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffAmount][iCurIdx])) + ')</span>'; } else if ('DiffAmount' in PaintItem.Fields) { sDiffAmount = '&nbsp;(' + GetUpDownICON(Records[PaintItem.Fields.DiffAmount][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffAmount][iCurIdx])) + (ItemLegend.Unit=='%'?'':ItemLegend.Unit) + ')'; } else if (Legend.ShowICON == 'T') { sDiffAmount = '&nbsp;<span style="color:' + GetRiseFallColor(fValCur-fValLast) + '">(' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(Math.abs(fValCur-fValLast)) + ')</span>'; } else { sDiffAmount = '&nbsp;(' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(Math.abs(fValCur-fValLast)) + (ItemLegend.Unit=='%'?'':ItemLegend.Unit) + ')'; } } // 設定增減率 var sDiffRatio = ''; if (ItemLegend.ShowDiffRatio == 'T' && iCurIdx > 0 && IsNumeric(fValCur) && IsNumeric(fValLast) && fValLast != 0) { if (Legend.ShowICON == 'T' && 'DiffRatio' in PaintItem.Fields) { sDiffRatio = '&nbsp;<span style="color:' + GetRiseFallColor(Records[PaintItem.Fields.DiffRatio][iCurIdx]) + '">(' + GetUpDownICON(Records[PaintItem.Fields.DiffRatio][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffRatio][iCurIdx])) + '%)</span>'; } else if ('DiffRatio' in PaintItem.Fields) { sDiffRatio = '&nbsp;(' + GetUpDownICON(Records[PaintItem.Fields.DiffRatio][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffRatio][iCurIdx])) + '%)'; } else if (Legend.ShowICON == 'T') { sDiffRatio = '&nbsp;<span style="color:' + GetRiseFallColor(fValCur-fValLast) + '">(' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(100*Math.abs(fValCur-fValLast)/fValLast) + '%)</span>'; } else { sDiffRatio = '&nbsp;(' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(100*Math.abs(fValCur-fValLast)/fValLast) + '%)'; } } // 設定字體顏色 var sColor = '#000000'; if (PaintItem.Type == 'StackBar') { sColor = PaintItem.Colors[iField]; } else if ('Color' in ItemLegend) { sColor = ItemLegend.Color; } else if ('RiseColor' in PaintItem && 'FallColor' in PaintItem && iCurIdx > 0) { sColor = PaintItem.RiseColor; sColorField = ('ColorField' in PaintItem.Fields?PaintItem.Fields.ColorField:PaintItem.Fields.Field) if (Records[sColorField][iCurIdx] < 0) { sColor = PaintItem.FallColor; } else if ('NormalColor' in PaintItem) { sColor = PaintItem.NormalColor; } } else if ('Color' in PaintItem) { sColor = PaintItem.Color; } else if ('NormalColor' in PaintItem) { sColor = PaintItem.NormalColor; } else if ('RiseColor' in PaintItem) { sColor = PaintItem.RiseColor; } else if ('FallColor' in PaintItem) { sColor = PaintItem.FallColor; } // 串聯文字 if (Legend.ShowICON == 'T') { var s = '<nobr><b style="color:' + sColor + ';line-height:1px;padding:0 2px 0 0;">' + GetICON(PaintItem.Type) + '</b>' + (PaintItem.Type == 'StackBar'?PaintItem.Names[iField]:PaintItem.Name) + ':&nbsp;'; if (ItemLegend.ShowPlusFlag == 'T') s = s + '<span style="color:' + (fValCur==0?GetRiseFallColor(0)+'">':(fValCur>=0?GetRiseFallColor(1)+'">+':GetRiseFallColor(-1)+'">')); if (fValCur == null) { s = s + 'null</span></nobr>'; } else { if ('Round' in ItemLegend && IsNumeric(ItemLegend.Round)) { s = s + Math.round(fValCur*Math.pow(10,ItemLegend.Round))/Math.pow(10,ItemLegend.Round); } else if (ItemLegend.BigNumberToText == 'T') { s = s + bigNumberToText(fValCur); } else { s = s + autoRound(fValCur); } s = s + ('Unit' in ItemLegend?ItemLegend.Unit:'') + '</span>' + sTrend + sDiffAmount + sDiffRatio + '</nobr>'; } } else { var s = '<nobr><font color="' + sColor + '">' + (PaintItem.Type == 'StackBar'?PaintItem.Names[iField]:PaintItem.Name) + ':&nbsp;'; if (ItemLegend.ShowPlusFlag == 'T') s = s + (fValCur>0?'+':''); if (fValCur == null) { s = s + 'null</font></nobr>'; } else { if ('Round' in ItemLegend && IsNumeric(ItemLegend.Round)) { s = s + Math.round(fValCur*Math.pow(10,ItemLegend.Round))/Math.pow(10,ItemLegend.Round); } else if (ItemLegend.BigNumberToText == 'T') { s = s + bigNumberToText(fValCur); } else { s = s + autoRound(fValCur); } s = s + ('Unit' in ItemLegend?ItemLegend.Unit:'') + sTrend + sDiffAmount + sDiffRatio + '</font></nobr>'; } } if (ItemLegend.Align == 'left') { s1 = s1 + s + '&nbsp;&nbsp; '; } if (ItemLegend.Align == 'center') { s2 = s2 + s + '&nbsp;&nbsp; '; } if (ItemLegend.Align == 'right') { s3 = s3 + ' &nbsp;&nbsp;' + s; } } } s = "<table class='none_tbl' style='cursor:default;width:" + ChartOptions.ChartWidth + "px;max-width:" + ChartOptions.ChartWidth + "px;height:" + (ChartItem.Legend.height) + "px'>" + "<tr valign='" + ChartItem.Legend.TextBaseline + "'>" + "<td style='padding:0 0 0 4px;' align='left'>" + ('Title' in Legend&&Legend.Title.Align=='left'?"<nobr>" + Legend.Title.Name + "&nbsp;</nobr>":"") + s1 + "</td>" + "<td style='padding:0 0;' align='center'>" + ('Title' in Legend&&Legend.Title.Align=='center'?"<nobr>" + Legend.Title.Name + "</nobr>":"") + s2 + "</td>" + "<td style='padding:0 4px 0 0;' align='right'>" + s3 + ('Title' in Legend&&Legend.Title.Align=='right'?"<nobr>&nbsp;" + Legend.Title.Name + "</nobr>":"") + "</td>" + "</tr></table>"; oLegend.className = 'disable_select'; oLegend.style.alpha = 0; oLegend.style.position = 'absolute'; oLegend.style.width = ('width' in Region?Region.width:ChartOptions.ChartWidth) + 'px'; oLegend.style.height = ChartItem.Legend.height + 'px'; oLegend.style.display = 'block'; oLegend.style.left = (ChartItem.Legend.x + canvasPosition.x) + 'px'; oLegend.style.top = (ChartItem.Legend.y + canvasPosition.y) + 'px'; oLegend.style.zindex = parseInt(oPainter.Canvas.style.zIndex ? oPainter.Canvas.style.zIndex : 1) + 1; oLegend.style.font = ChartItem.Legend.Font; oLegend.style.lineHeight = (parseInt(ChartItem.Legend.Font) + 2) + 'px'; oLegend.innerHTML = s; } // 繪製K線圖的Legend function PaintKLineLegend(oPainter, ChartItem) { var sLegendID = 'KLineLegend_' + ChartItem.ID; var ChartOptions = oPainter.ChartOptions; var Data = oPainter.Data; var Records = Data.Records; var Region = ChartItem.Region; var canvasPosition = getPageCoord(oPainter.Canvas); var iCurIdx = ChartOptions.IndexCurrent; // 建立Legend物件 if (sLegendID in window) { var oLegend = $id(sLegendID) } else { var oLegend = document.createElement('DIV'); oLegend.id = sLegendID; document.body.appendChild(oLegend); addEvent(oLegend, 'mouseover', DisableSelect); } var sField = ChartItem.PaintItems.KLine.Fields.Close.substr(3); var PaintItem = null; for (var i = 0; i < ChartItem.PaintItems.length; i++) if (ChartItem.PaintItems[i].ID == 'KLine') { PaintItem = ChartItem.PaintItems[i]; break; } var s = "<table class='none_tbl' style='cursor:default;height:" + (ChartItem.Legend.height-2) + "px;width:" + (ChartOptions.ChartWidth + ChartOptions.ChartMargin.right) + "px;'>" + "<tr valign='" + ChartItem.Legend.TextBaseline + "'><td style='padding:0 0 0 4px '>"; s = s + "<div><table style='width:100%'>" if (ChartItem.Title != null && ChartItem.Title != '') s = s + "<tr><td align='left' colspan='99'>" + ChartItem.Title + "</td></tr>"; s = s + "<tr>" var fLimitUp = ('漲停價'+sField in Records?Records['漲停價'+sField][iCurIdx]:null); var fLimitDown = ('跌停價'+sField in Records?Records['跌停價'+sField][iCurIdx]:null); if (fLimitUp == null) fLimitUp = -999999999.999999; //設定一個不可能觸及的價位以避開null的誤判問題 if (fLimitDown == null) fLimitDown = -999999999.999999; //設定一個不可能觸及的價位以避開null的誤判問題 if (ChartOptions.Language == 'CN') { //for China if (IsNumeric(ChartItem.PriceRound)) { var i = ChartItem.PriceRound; } else { var i = 2; } s = s + "<td width='90px'><nobr>收盘:<b style='color:" + (Records['收盤價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['收盤價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['收盤價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['收盤價'+sField][iCurIdx],i) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='90px'><nobr>开盘:<b style='color:" + (Records['開盤價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['開盤價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['開盤價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['開盤價'+sField][iCurIdx],i) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='90px'><nobr>最高:<b style='color:" + (Records['最高價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['最高價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['最高價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['最高價'+sField][iCurIdx],i) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='90px'><nobr>最低:<b style='color:" + (Records['最低價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['最低價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['最低價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['最低價'+sField][iCurIdx],i) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='150px'><nobr>涨跌:<b style='color:" + (Records['收盤價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['收盤價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['漲跌價'+sField][iCurIdx], PaintItem))) + "'>" + (Records['漲跌價'+sField][iCurIdx]>0?'+':'') + toMoney(Records['漲跌價'+sField][iCurIdx],i) + '&nbsp;&nbsp;' + "(" + (Records['漲跌幅'+sField][iCurIdx]>0?'+':'') + toMoney(Records['漲跌幅'+sField][iCurIdx]) + "%)</b>&nbsp;&nbsp;</nobr></td>" + "<td width='130px'><nobr>成交量:" + bigNumberToText(Records['成交量'+sField][iCurIdx],2) + "手&nbsp;&nbsp;</nobr></td>"; // "<td width='130px'><nobr>成交额:" + bigNumberToText(Records['成交額'+sField][iCurIdx],2) + "元&nbsp;&nbsp;</nobr></td>"; } else { //for Taiwan s = s + "<td width='90px'><nobr>收盤:<b style='color:" + (Records['收盤價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['收盤價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['收盤價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['收盤價'+sField][iCurIdx]) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='90px'><nobr>開盤:<b style='color:" + (Records['開盤價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['開盤價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['開盤價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['開盤價'+sField][iCurIdx]) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='90px'><nobr>最高:<b style='color:" + (Records['最高價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['最高價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['最高價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['最高價'+sField][iCurIdx]) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='90px'><nobr>最低:<b style='color:" + (Records['最低價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['最低價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['最低價'+sField][iCurIdx]-Records['昨收價'+sField][iCurIdx], PaintItem))) + "'>" + toMoney(Records['最低價'+sField][iCurIdx]) + "</b>&nbsp;&nbsp;</nobr></td>" + "<td width='150px'><nobr>漲跌:<b style='color:" + (Records['收盤價'+sField][iCurIdx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records['收盤價'+sField][iCurIdx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records['漲跌價'+sField][iCurIdx], PaintItem))) + "'>" + (Records['漲跌價'+sField][iCurIdx]>0?'+':'') + toMoney(Records['漲跌價'+sField][iCurIdx]) + '&nbsp;&nbsp;' + "(" + (Records['漲跌幅'+sField][iCurIdx]>0?'+':'') + toMoney(Records['漲跌幅'+sField][iCurIdx]) + "%)</b>&nbsp;&nbsp;</nobr></td>" + "<td width='130px'><nobr>成交量:" + (ChartOptions['StockID'+sField].substr(ChartOptions['StockID'+sField].length-2)=='指數'?bigNumberToText(Records['成交額'+sField][iCurIdx],2)+'元':bigNumberToText(Records['成交量'+sField][iCurIdx],2)+'張') + "&nbsp;&nbsp;</nobr></td>"; } s = s + "<td><nobr>" + Records.RPT_TIME[iCurIdx] + (ChartOptions.ChartCat=='DATE'?'&nbsp;('+WeekName(Records.RPT_TIME[iCurIdx])+')':'') + (ChartOptions.ChartCat=='DATE'||!('START_DATE' in Records)||!('END_DATE' in Records)|| Records.START_DATE[iCurIdx]==null||Records.END_DATE[iCurIdx]==null|| Records.START_DATE[iCurIdx]==''||Records.END_DATE[iCurIdx]==''? '':'&nbsp;(' + Records.START_DATE[iCurIdx].substr(5) + '~' + Records.END_DATE[iCurIdx].substr(5) + ')') + "&nbsp;&nbsp;</nobr></td></tr></table></div>" var sTmp = ''; if (ChartItem.Type == 'BollingerBands' || ChartItem.Type == 'AvgPrice' || ChartItem.Type == 'IDX_TSE' || ChartItem.Type == 'IDX_OTC' || ChartItem.Type == 'IDX_SH000001' || ChartItem.Type == 'IDX_SZ399001' || ChartItem.Type == 'FLOW_PER' || ChartItem.Type == 'FLOW_PBR' || ChartItem.Type == 'FLOW_DR_') { var sID = ChartItem.Type; } else { var sID = 'MA_' + ChartOptions.ChartCat; } for (var item in ChartItem.PaintItems) { var PaintItem = ChartItem.PaintItems[item]; if ('Type' in ChartItem && 'AlignType' in PaintItem && ChartItem.Type != null && PaintItem.AlignType != null && Array.isArray(PaintItem.AlignType) == false && ChartItem.Type == PaintItem.AlignType && item.indexOf(sID) == 0 || 'Type' in ChartItem && 'AlignType' in PaintItem && ChartItem.Type != null && PaintItem.AlignType != null && Array.isArray(PaintItem.AlignType) == true && PaintItem.AlignType.indexOf(ChartItem.Type) != -1 && item.indexOf(sID) == 0 || !('Type' in ChartItem) && item.indexOf(sID) == 0 && !isNaN(item.substr(sID.length))) { var sField = PaintItem.Fields.Field; if ((PaintItem.IsShow == 'T' || PaintItem.IsShow == 'AlwaysShow') && Records[sField][iCurIdx] != null) { sTmp = sTmp + "<td style='width:82px;color:" + PaintItem.Color + "'><nobr>" + PaintItem.Name + ':'; if ('Legend' in PaintItem && 'Round' in PaintItem.Legend && IsNumeric(PaintItem.Legend.Round)) { sTmp = sTmp + Math.round(Records[sField][iCurIdx]*Math.pow(10,PaintItem.Legend.Round))/Math.pow(10,PaintItem.Legend.Round); } else if ('Legend' in PaintItem && PaintItem.Legend.BigNumberToText == 'T') { sTmp = sTmp + bigNumberToText(Records[sField][iCurIdx]); } else if ('Legend' in PaintItem && IsNumeric(PaintItem.Legend.AutoRound)) { sTmp = sTmp + Round(Records[sField][iCurIdx],PaintItem.Legend.AutoRound,true); } else { sTmp = sTmp + Round(Records[sField][iCurIdx],ChartItem.PriceRound,false); } sTmp = sTmp + ('Legend' in PaintItem && 'Unit' in PaintItem.Legend?PaintItem.Legend.Unit:'') + (iCurIdx>0?(Records[sField][iCurIdx]>Records[sField][iCurIdx-1]?GetUpDownICON(1):(Records[sField][iCurIdx]<Records[sField][iCurIdx-1]?GetUpDownICON(-1):'')):'') + "&nbsp;&nbsp;</nobr></td>"; } } } s = s + "<div><table style='width:100%;height:18px;'><tr>" + sTmp + "<td>&nbsp;</td></tr></table></div>"; s = s + "</td></tr></table>"; oLegend.className = 'disable_select'; oLegend.style.alpha = 0; oLegend.style.position = 'absolute'; oLegend.style.width = ('width' in Region?Region.width:ChartOptions.ChartWidth) + 'px'; oLegend.style.height = ChartItem.Legend.height + 'px'; oLegend.style.display = 'block'; oLegend.style.left = (ChartItem.Legend.x + canvasPosition.x) + 'px'; oLegend.style.top = (ChartItem.Legend.y + canvasPosition.y) + 'px'; oLegend.style.zindex = parseInt(oPainter.Canvas.style.zIndex ? oPainter.Canvas.style.zIndex : 1) + 1; oLegend.style.font = ChartItem.Legend.Font; oLegend.style.lineHeight = (parseInt(ChartItem.Legend.Font) + 2) + 'px'; oLegend.innerHTML = s; } // 建立控制桿及底圖 function PaintControllerBox(oPainter, ChartItem) { if (oPainter.Controller == null) { // 繪製底圖 ============================================================================= var ctx = oPainter.ctx; var Region = ChartItem.Region; var Records = oPainter.Data.Records; var ChartOptions = oPainter.ChartOptions; ctx.restore(); ctx.save(); ctx.translate(Region.x, Region.y); if ('BackgroundColor' in ChartOptions) { ctx.beginPath(); ctx.fillStyle = ChartOptions.BackgroundColor; ctx.rect(0 - Region.x, 0, oPainter.Canvas.width, Region.height); ctx.fill(); } else { ctx.clearRect(0 - Region.x, 0, oPainter.Canvas.width, Region.height); } //畫水平底紋線 var fSpaceHeight = Region.height / (ChartItem.HLineCount + 1); for (var i = 1; i <= ChartItem.HLineCount; i++) { var y = fSpaceHeight * i; if (y * 10 % 10 == 0) y += .5; oPainter.drawHLine(ChartItem.SplitLineColor, 0, y, Region.width, 1, ChartItem.LineStyle); } //找到最高最低價 var fHigh = null, fLow = null; for (var i = 0; i < oPainter.Data.RecordCount; i++) { if (fHigh == null && Records.收盤價[i] != null) { fHigh = Records.收盤價[i]; } else { fHigh = Math.max(fHigh, Records.收盤價[i]); } if (fLow == null && Records.收盤價[i] != null) { fLow = Records.收盤價[i]; } else { fLow = Math.min(fLow, Records.收盤價[i]); } } if (fLow > 1) fLow -= 1; //畫底圖 var iCurX = 0; for (var i = 0; i < oPainter.Data.RecordCount; i++) { var x = Region.width * i / (oPainter.Data.RecordCount-1); if (iCurX != 0 && x - iCurX < 1) continue; iCurX = x; var y = Region.height * (fHigh - Records.收盤價[i]) / (fHigh - fLow); if (i == 0) { ctx.beginPath(); ctx.moveTo(x, y); } else { ctx.lineTo(x, y); } } ctx.strokeStype = ChartItem.BorderColor; ctx.stroke(); ctx.lineTo(Region.width, Region.height); ctx.lineTo(0, Region.height); ctx.closePath(); ctx.fillStyle = ChartItem.FillColor; ctx.globalAlpha = ChartItem.Alpha; ctx.fill(); // 恢復預設值 ctx.globalAlpha = 1; ctx.restore(); // ====================================================================================== // 繪製控制Bar ========================================================================== var ControllerOptions = ChartItem.Controller; var sID = oPainter.Canvas.id + '_controller'; var ControllerCanvas = $id(sID); if (ControllerCanvas == null) { ControllerCanvas = document.createElement('CANVAS'); ControllerCanvas.id = sID; document.body.appendChild(ControllerCanvas); } ControllerCanvas.width = Region.width + ControllerOptions.Bar.width * 2; ControllerCanvas.height = Region.height; var CanvasPosition = getPageCoord(oPainter.Canvas); ControllerCanvas.style.left = CanvasPosition.x + Region.x - ControllerOptions.Bar.width + 'px'; ControllerCanvas.style.top = CanvasPosition.y + Region.y + 'px'; ControllerCanvas.style.position = 'absolute'; ControllerCanvas.style.zIndex = (oPainter.Canvas.style.zIndex ? oPainter.Canvas.style.zIndex : 1) + 1; ControllerCanvas.style.display = 'block'; var c = new Controller(ControllerCanvas.id, { Region: { x: 0, y: 0, width: ControllerCanvas.width, height: ControllerCanvas.height }, Bar: ControllerOptions.Bar || { width: 20, height: 35, BorderColor: '#000000', FillColor: '#FFFAFA' }, Value: { left: oPainter.ChartOptions.ShowStart, right: oPainter.ChartOptions.ShowEnd }, MinBarDistance: ControllerOptions.MinBarDistance || 20, onPositionChanged: function (changeToValue) { oPainter.ChartOptions.ShowStart = changeToValue.left; oPainter.ChartOptions.ShowEnd = changeToValue.right; oPainter.Paint(); oPainter.Controller.drawControllerPart(); }, prePaint: function (ctx) { }, touchFaultTolerance:20 }); oPainter.Controller = c; c.drawControllerPart(); c.addControllerEvents(); // ====================================================================================== } else if (oPainter.RequestController) { oPainter.RequestController = false; oPainter.Controller.drawControllerPart(); oPainter.Controller.addControllerEvents(); } } // 建立游標十字線及資訊框 function CreateCrossLineAndTipMgrInstance(oPainter, CrossLineAndTipMgr) { if(!oPainter.CrossLineAndTipMgrInstance){ oPainter.CrossLineAndTipMgrInstance = new CrossLinesAndTipMgr(oPainter, CrossLineAndTipMgr); oPainter.CrossLineAndTipMgrInstance.addCrossLinesAndTipEvents(); } else { oPainter.CrossLineAndTipMgrInstance.updateOptions(CrossLineAndTipMgr); } } // ============================================================================================================================================ // 其他輔助用function ========================================================================================================================= function ClearCanvas(oPainter, ControllerBox) { var Canvas = oPainter.Canvas; var ctx = oPainter.ctx; var ChartOptions = oPainter.ChartOptions; ctx.save(); if (ControllerBox != null && 'BackgroundColor' in ChartOptions) { var y = ControllerBox.Region.y + ControllerBox.Region.height; ctx.beginPath(); ctx.fillStyle = ChartOptions.BackgroundColor; ctx.rect(0, 0, Canvas.width, ChartOptions.ChartItems.ControllerBox.Region.y-1); ctx.rect(0, y, Canvas.width, Canvas.height - y); ctx.fill(); } else if ('BackgroundColor' in ChartOptions) { ctx.beginPath(); ctx.fillStyle = ChartOptions.BackgroundColor; ctx.rect(0, 0, Canvas.width, Canvas.height); ctx.fill(); } else if (ControllerBox != null) { var y = ControllerBox.Region.y + ControllerBox.Region.height; ctx.clearRect(0, 0, Canvas.width, ControllerBox.Region.y - 1); ctx.clearRect(0, y, Canvas.width, Canvas.height - y); } else { ctx.clearRect(0, 0, Canvas.width, Canvas.height); } ctx.restore(); } function InitLegend(ChartItems) { for (var item in ChartItems) { var sLegendID = 'Legend_' + item; if (sLegendID in window) { $id(sLegendID).style.display = 'none'; } else { var oLegend = document.createElement('DIV'); oLegend.id = sLegendID; document.body.appendChild(oLegend); } } /* // 建立或連結物件 if (sLegendID in window) { var oLegend = $id(sLegendID) } else { var oLegend = document.createElement('DIV'); oLegend.id = sLegendID; document.body.appendChild(oLegend); } */ } function RepaintStockChart(oPainter) { //重畫圖形 if (oPainter) { if ('controller' in oPainter) { oPainter.controller = null; } if ('Controller' in oPainter) { oPainter.Controller = null; } oPainter.Paint(); } } function GetRiseFallColor(f, obj) { var sColor = '#000000'; if (obj) { if ('RiseColor' in obj && f > 0) { sColor = obj.RiseColor; } else if ('FallColor' in obj && f < 0) { sColor = obj.FallColor; } else if ('NormalColor' in obj && f == 0) { sColor = obj.NormalColor; } else if ('Color' in obj && f == 0) { sColor = obj.Color; } else if (f > 0) { sColor = '#FF0000'; } else if (f < 0) { sColor = '#008000'; } } else { if (f > 0) { sColor = '#FF0000'; } else if (f < 0) { sColor = '#008000'; } } return sColor; } function ResetChartSizePos(oPainter) { var ChartOptions = oPainter.ChartOptions; var ChartItems = ChartOptions.ChartItems; var ChartDisplayList = ChartOptions.ChartDisplayList; var fChartHeightShow = 0; var fMarginHeightShow = 0; var fControllerHeight = 0; var fScale = 1; //將ChartDisplayList中重複或不存在的ID進行清除,以確保程式能正確執行 for (var i=0; i<ChartDisplayList.length; i++) { var s = ChartDisplayList[i]; if (s == '') continue; //跳過空白 var j = ChartDisplayList.indexOf(s,0); if (!(s in ChartItems) || j > -1 && j < i) ChartDisplayList[i] = ''; } //計算ControllerBox的總高度,並設定ControllerBox的位置及大小 for (var item in ChartItems) { var ChartItem = ChartItems[item]; if ('Controller' in ChartItem) { ChartItem.Margin.left = ChartOptions.ChartMargin.left; ChartItem.Margin.right = ChartOptions.ChartMargin.right; ChartItem.Region.height = ChartItem.Region.InitHeight; ChartItem.Region.width = ChartOptions.ChartWidth; ChartItem.Region.x = ChartOptions.ChartMargin.left; ChartItem.Region.y = ChartOptions.ChartHeight - ChartItem.Margin.bottom - ChartItem.Region.height; fControllerHeight = ChartItem.Margin.top + ChartItem.Margin.bottom + ChartItem.Region.height; //break; } } // 計算顯示物件之總高度,並設定ChartDisplayList.Margin for (var i=0; i<ChartDisplayList.length; i++) { var sID = ChartDisplayList[i]; if (!(sID in ChartItems)) continue; //物件不存在就跳過 var ChartItem = ChartItems[sID]; if (ChartItem.IsShow == 'AlwaysHide') continue; // 若沒有設定ChartItem.Margin,則另外設定 if (!('top' in ChartItem.Margin)) ChartItem.Margin.top = 0; if (!('bottom' in ChartItem.Margin)) ChartItem.Margin.bottom = 0; if (!('left' in ChartItem.Margin)) ChartItem.Margin.left = ChartOptions.ChartMargin.left; if (!('right' in ChartItem.Margin)) ChartItem.Margin.right = ChartOptions.ChartMargin.right; if (!('Controller' in ChartItem)) { fChartHeightShow = fChartHeightShow + ChartItem.Region.InitHeight; fMarginHeightShow = fMarginHeightShow + ChartItem.Margin.top + ChartItem.Margin.bottom; } } //計算圖形縮放比例 fScale = (ChartOptions.ChartHeight - fControllerHeight - fMarginHeightShow) / fChartHeightShow; // 設定圖形位置及大小 for (var i=0,y=0; i<ChartDisplayList.length; i++) { var sID = ChartDisplayList[i]; if (!(sID in ChartItems)) continue; //物件不存在就跳過 var ChartItem = ChartItems[sID]; if (ChartItem.IsShow == 'AlwaysHide') continue; //設定Region y = y + ChartItem.Margin.top; ChartItem.Region.height = ChartItem.Region.InitHeight * fScale; ChartItem.Region.width = ChartOptions.ChartWidth; ChartItem.Region.x = ChartItem.Margin.left; ChartItem.Region.y = y; y = y + ChartItem.Region.height + ChartItem.Margin.bottom; //設定Legend ChartItem.Legend.height = ChartItem.Legend.InitHeight; ChartItem.Legend.width = ChartOptions.ChartWidth; ChartItem.Legend.x = ChartItem.Margin.left; ChartItem.Legend.y = ChartItem.Region.y - ChartItem.Legend.InitHeight; //設定橫線,直線數量 ChartItem.VLineCount = Round(ChartItem.InitVLineCount,0); ChartItem.HLineCount = Round(ChartItem.Region.height/12.5,0); } // 重設十字線及區域框的滑鼠事件反應區域 if ('CrossLineAndTipMgr' in ChartOptions) { var CrossLineAndTipMgr = ChartOptions.CrossLineAndTipMgr; if (!('TriggerEventRanges' in CrossLineAndTipMgr)) { CrossLineAndTipMgr.TriggerEventRanges = {}; } var TriggerEventRanges = CrossLineAndTipMgr.TriggerEventRanges; TriggerEventRanges.x = ChartOptions.ChartMargin.left; TriggerEventRanges.y = 0; for (var i=0; i<ChartDisplayList.length; i++) { var item = ChartDisplayList[i]; if (item in ChartItems && ChartItems[item].IsShow != 'AlwaysHide') { TriggerEventRanges.y = ChartItems[item].Region.y; break; } } TriggerEventRanges.width = ChartOptions.ChartWidth; TriggerEventRanges.height = ChartOptions.ChartHeight; for (var i=ChartDisplayList.length-1; i>=0; i--) { var item = ChartDisplayList[i]; if (item in ChartItems && ChartItems[item].IsShow != 'AlwaysHide') { var ChartItem = ChartItems[item]; TriggerEventRanges.height = ChartItem.Region.y + ChartItem.Region.height - TriggerEventRanges.y; break; } } } } function ResetShowRange(oPainter) { var ChartOptions = oPainter.ChartOptions; var iRecordCount = oPainter.Data.RecordCount; //計算資料顯示指標位置 var iStart = Math.ceil(ChartOptions.ShowStart / 100 * iRecordCount); var iEnd = Math.ceil(ChartOptions.ShowEnd / 100 * iRecordCount); if (iEnd >= iRecordCount) iEnd = iRecordCount - 1; if (iStart > iEnd) iStart = iEnd; if (ChartOptions.IndexEnd != iEnd) ChartOptions.IndexCurrent = iEnd; ChartOptions.IndexStart = iStart; ChartOptions.IndexEnd = iEnd; ChartOptions.IndexLength = iEnd - iStart + 1; } function ResetBarWidth(oPainter, Options, PaintItem) { var ChartOptions = oPainter.ChartOptions; var iRecordCount = oPainter.Data.RecordCount; var Region = Options.Region; // 檢查目標物件是否存在 if (!('BarWidth' in PaintItem && 'SpaceWidth' in PaintItem)) { return; } //計算K線圖的SpaceWidth和BarWidth屬性 var iStart = ChartOptions.IndexStart; var iEnd = ChartOptions.IndexEnd var iCount = ChartOptions.IndexLength; var fWidth = ('width' in Region?Region.width:ChartOptions.ChartWidth); function IsOptionsOK() { return (PaintItem.SpaceWidth + PaintItem.BarWidth) * iCount <= fWidth; } var fSpaceWidth, fBarWidth; if (IsOptionsOK()) { fSpaceWidth = 1; fBarWidth = (fWidth - fSpaceWidth * iCount) / iCount; if (fBarWidth > 4) { fSpaceWidth = 2; fBarWidth = ((fWidth - fSpaceWidth * iCount) / iCount); } } else { fSpaceWidth = 1; fBarWidth = (fWidth - fSpaceWidth * iCount) / iCount; if (fBarWidth <= 2) { fSpaceWidth = 0; fBarWidth = (fWidth - fSpaceWidth * iCount) / iCount; } else if (fBarWidth > 4) { fSpaceWidth = 2; fBarWidth = ((fWidth - fSpaceWidth * iCount) / iCount); } } PaintItem.BarWidth = fBarWidth; PaintItem.SpaceWidth = fSpaceWidth; } function ResetIndexCurrent(ev, oPainter) { // Reset Current Index var ChartOptions = oPainter.ChartOptions; var x = ev.offsetX - ChartOptions.ChartMargin.left; var idx = ChartOptions.IndexStart + Math.ceil(x / (ChartOptions.ChartWidth / ChartOptions.IndexLength)) - 1; if (idx > ChartOptions.IndexEnd) { idx = ChartOptions.IndexEnd; } ChartOptions.IndexCurrent = idx; } function ResetLegend(oPainter) { var ChartOptions = oPainter.ChartOptions; var ChartItems = ChartOptions.ChartItems; var ChartDisplayList = ChartOptions.ChartDisplayList; for (var i=0; i<ChartDisplayList.length; i++) { var s = ChartDisplayList[i]; if (s in ChartItems) { var ChartItem = ChartItems[s]; if (!('Controller' in ChartItem) && ChartItem.IsShow != 'AlwaysHide') PaintLegend(oPainter, ChartItem); } } } function GetXbyIDX(idx, oPainter) { var ChartOptions = oPainter.ChartOptions; idx = idx - ChartOptions.IndexStart; return ChartOptions.ChartMargin.left + idx * ChartOptions.ChartWidth / ChartOptions.IndexLength + ChartOptions.ChartWidth / ChartOptions.IndexLength / 2; } function InitKLineBandData(Data, ChartOptions, KLine, Fields) { if (!('BandTag' in KLine)) return; //若沒有宣告BandTag,就直接離開 var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); var iBandCycle = Number(KLine.BandTag['Cycle_'+ChartOptions.ChartCat]); var iHigh = null, iLow = null; // 建立欄位預設值 if (Fields == null) Fields = { High:'最高價', Low:'最低價' }; // 建立記錄波段符號的欄位 if (!('BandFlag' in Data.Records)) { Data.Fields.push('BandTag'); Data.Records.BandTag = new Array(iRecordCount); } if (iRecordCount <= 1) return; //若只有1筆以下的記錄, 則判定為無波段直接離開 /* // 找出首筆可用資料 for (var i = 0; i < iRecordCount; i++) { if (IsNumeric(Records[Fields.High][i]) && IsNumeric(Records[Fields.Low][i])) { iHigh = iLow = i; break; } } // 決定起點是波段高點還是低點 // 找出波段高低點 for (i++; i < iRecordCount; i++) { if (IsNumeric(Records[Fields.High][i])) { if (Records[Fields.High][i] > Records[Fields.High][iHigh]) { if (i - iHigh > iBandCycle) { Records.BandTag[iHigh] = 'H' + (Records.BandTag[iHigh]==null?'':Records.BandTag[iHigh]); } iHigh = i; } } if (IsNumeric(Records[Fields.Low][i])) { } } // Records.BandTag[i-1] = 'H'; // Records.BandTag[i-2] = 'L'; // alert(iRecordCount); */ } // 計算各式移動平均線資料 function InitMA_Data(Data, ChartOptions, ChartItem, sMA_ID, sRefField) { var ChartDisplayList = ChartOptions.ChartDisplayList; var PaintItems = ChartItem.PaintItems; var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (sRefField == null) return; // 找出最後一筆非空白資料 var Record = Records[sRefField]; for (var iEnd = iRecordCount - 1; iEnd >= 0; iEnd--) if (IsNumeric(Record[iEnd]) == true) { break; } // 為空白的收盤價填上假資料 var fLast = null, iLog = []; for (var i = 0; i <= iEnd; i++) { if (IsNumeric(Record[i]) == false && IsNumeric(fLast)) { Record[i] = fLast; iLog.push(i); } fLast = Record[i]; } for (var item in PaintItems) { var PaintItem = PaintItems[item]; if (item.indexOf(sMA_ID) == 0 && IsNumeric(item.substr(sMA_ID.length)) && 'Fields' in PaintItem) { var s = PaintItem.Fields.Field; //欄位名稱 var iDaysCount = Number(PaintItem.Count); //MA指定Count if (DataFields.indexOf(s) == -1) DataFields.push(s); if (s in Records) delete Records[s]; Records[s] = new Array(iRecordCount); if (iDaysCount > 0 && ChartDisplayList.indexOf(ChartItem.ID) >= 0 && PaintItem.IsShow != 'F' && PaintItem.IsShow != 'AlwaysHide') { if ('Type' in ChartItem && ChartItem.Type == 'EMA') { for (var i = 0; Record[i] == null && i < iRecordCount; i++); //找到第一個實際有資料的位置 var k = 2 / (iDaysCount + 1); for (var iCnt = 0; i < iRecordCount; i++, iCnt++) { if (iCnt == 0) { var fLast = k * Record[i]; } else { var fLast = fLast + k * (Record[i] - fLast); } if (iCnt >= iDaysCount) { Records[s][i] = fLast; } } } else { //MA var fSum = 0, iSumCnt = 0; for (var i = 0; i <= iEnd; i++) { if (IsNumeric(Record[i])) { iSumCnt++; fSum = fSum + Record[i] - (i>=iDaysCount?Record[i-iDaysCount]:0); } if (iSumCnt >= iDaysCount) { Records[s][i] = fSum/iDaysCount; } } } } } } // 清除假資料 for (var i = 0; i < iLog.length; i++) { Record[iLog[i]] = null; } } // 計算成交量增減資料 function InitVolumeDif_Data(Data, ChartOptions, VolumeDif, Fields) { var PaintItems = VolumeDif.PaintItems; var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (Fields == null) { Fields = { Volume:'成交量', VolumeDif:'成交量增減數', VolumeDifRatio:'成交量增減幅', Turnover:'成交額', TurnoverDiv: '成交額增減數', TurnoverDivRatio:'成交額增減幅' }; } if (DataFields.indexOf(Fields.VolumeDif) == -1) DataFields.push(Fields.VolumeDif); if (DataFields.indexOf(Fields.VolumeDifRatio) == -1) DataFields.push(Fields.VolumeDifRatio); if (DataFields.indexOf(Fields.TurnoverDiv) == -1) DataFields.push(Fields.TurnoverDiv); if (DataFields.indexOf(Fields.TurnoverDivRatio) == -1) DataFields.push(Fields.TurnoverDivRatio); if (Fields.VolumeDif in Records) delete Records[Fields.VolumeDif]; Records[Fields.VolumeDif] = new Array(iRecordCount); if (Fields.VolumeDifRatio in Records) delete Records[Fields.VolumeDifRatio]; Records[Fields.VolumeDifRatio] = new Array(iRecordCount); if (Fields.TurnoverDiv in Records) delete Records[Fields.TurnoverDiv]; Records[Fields.TurnoverDiv] = new Array(iRecordCount); if (Fields.TurnoverDivRatio in Records) delete Records[Fields.TurnoverDivRatio]; Records[Fields.TurnoverDivRatio] = new Array(iRecordCount); if (VolumeDif.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(VolumeDif.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var i = 0, fLastV = null, fLastT = null; i < iRecordCount; i++) { if (IsNumeric(Records[Fields.Volume][i]) && IsNumeric(fLastV)) { Records[Fields.VolumeDif][i] = Records[Fields.Volume][i] - fLastV; if (fLastV != 0) Records[Fields.VolumeDifRatio][i] = 100 * Records[Fields.VolumeDif][i] / fLastV; } if (IsNumeric(Records[Fields.Turnover][i]) && IsNumeric(fLastT)) { Records[Fields.TurnoverDiv][i] = Records[Fields.Turnover][i] - fLastT; if (fLastT != 0) Records[Fields.TurnoverDivRatio][i] = 100 * Records[Fields.TurnoverDiv][i] / fLastT; } fLastV = Records[Fields.Volume][i]; fLastT = Records[Fields.Turnover][i]; } } function InitVolumeDiv_Data(Data, ChartOptions, VolumeDif, Fields) { return InitVolumeDif_Data(Data, ChartOptions, VolumeDif, Fields); } //呼叫到錯誤名稱的修正 // 計算OBV資料(能量潮指標) function InitOBV_Data(Data, ChartOptions, OBV, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); var iOBV_MA_CNT = Number(OBV.PaintItems.OBV_MA.Count); if (Fields == null) Fields = { Close:'收盤價', Volume:'成交量', OBV:'OBV', OBV_MA:'OBV_MA' }; if (DataFields.indexOf(Fields.OBV) == -1) DataFields.push(Fields.OBV); if (DataFields.indexOf(Fields.OBV_MA) == -1) DataFields.push(Fields.OBV_MA); if (Fields.OBV in Records) delete Records[Fields.OBV]; Records[Fields.OBV] = new Array(iRecordCount); if (Fields.OBV_MA in Records) delete Records[Fields.OBV_MA]; Records[Fields.OBV_MA] = new Array(iRecordCount); if (OBV.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(OBV.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var i = 0; Records[Fields.Close][i] == null && i < iRecordCount; i++); //找到第一個實際有資料的位置 Records[Fields.OBV][i] = 0; //第一筆資料設定為0 var fSum = 0, iSumCnt = 1; //用來計算OBV_MA for (i++; i < iRecordCount; i++) { // 計算OBV var j = 0; if (IsNumeric(Records[Fields.Close][i]) && IsNumeric(Records[Fields.Close][i-1])) { if (Records[Fields.Close][i] > Records[Fields.Close][i-1]) { j = 1; } else if (Records[Fields.Close][i] < Records[Fields.Close][i-1]) { j = -1; } } Records[Fields.OBV][i] = Records[Fields.OBV][i-1] + (IsNumeric(Records[Fields.Volume][i])?Records[Fields.Volume][i]:0) * j; // 計算OBV_MA if (IsNumeric(iOBV_MA_CNT) && iOBV_MA_CNT > 0) { if (IsNumeric(Records[Fields.OBV][i])) { iSumCnt++; fSum = fSum + Records[Fields.OBV][i] - (i>=iOBV_MA_CNT&&IsNumeric(Records[Fields.OBV][i-iOBV_MA_CNT])?Records[Fields.OBV][i-iOBV_MA_CNT]:0); } if (iSumCnt >= iOBV_MA_CNT) { Records[Fields.OBV_MA][i] = Math.round(fSum/iOBV_MA_CNT*100)/100; } } } } // 計算RSI資料 function InitRSI_Data(Data, ChartOptions, RSI, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); var PaintItems = RSI.PaintItems; var nDays1 = RSI.PaintItems.RSI1.nDays; var nDays2 = RSI.PaintItems.RSI2.nDays; PaintItems.RSI1.Name = 'RSI ' + RSI.PaintItems.RSI1.nDays; PaintItems.RSI2.Name = 'RSI ' + RSI.PaintItems.RSI2.nDays; if (Fields == null) Fields = { Change:'漲跌價', RSI1:PaintItems.RSI1.Fields.Field, RSI2:PaintItems.RSI2.Fields.Field }; if (DataFields.indexOf(Fields.RSI1) == -1) DataFields.push(Fields.RSI1); if (DataFields.indexOf(Fields.RSI2) == -1) DataFields.push(Fields.RSI2); if (Fields.RSI1 in Records) delete Records[Fields.RSI1]; Records[Fields.RSI1] = new Array(iRecordCount); if (Fields.RSI2 in Records) delete Records[Fields.RSI2]; Records[Fields.RSI2] = new Array(iRecordCount); if (RSI.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(RSI.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var i = 0; IsNumeric(Records[Fields.Change][i]) == false && i < iRecordCount; i++); //找到第一個實際有資料的位置 var RSI1 = { UP: 0, DN: 0 }; var RSI2 = { UP: 0, DN: 0 }; for (var iCnt = 1; i < iRecordCount; i++, iCnt++) { var f = Records[Fields.Change][i]; var fUP = (f>0?f:0); var fDN = (f<0?f:0); // for RSI1 RSI1.UP = (RSI1.UP * (nDays1 - 1) + fUP) / nDays1; RSI1.DN = (RSI1.DN * (nDays1 - 1) + Math.abs(fDN)) / nDays1; if (iCnt >= nDays1) { if (RSI1.DN == 0) Records[Fields.RSI1][i] = 100; else Records[Fields.RSI1][i] = 100 - 100 / (1 + RSI1.UP / RSI1.DN); } // for RSI2 RSI2.UP = (RSI2.UP * (nDays2 - 1) + fUP) / nDays2; RSI2.DN = (RSI2.DN * (nDays2 - 1) + Math.abs(fDN)) / nDays2; if (iCnt >= nDays2) { if (RSI2.DN == 0) Records[Fields.RSI2][i] = 100; else Records[Fields.RSI2][i] = 100 - 100 / (1 + RSI2.UP / RSI2.DN); } } } // 計算BIAS(乖離率)資料 function InitBIAS_Data(Data, ChartOptions, KLine, BIAS, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (Fields == null) Fields = { Close:'收盤價', Open:'開盤價', High:'最高價', Low:'最低價' }; var sPriceField = Fields.Close; if ('MA_DevRatioRef' in KLine) { if (KLine.MA_DevRatioRef == 'PriceOpen') var sPriceField = Fields.Open; else if (KLine.MA_DevRatioRef == 'PriceHigh') var sPriceField = Fields.High; else if (KLine.MA_DevRatioRef == 'PriceLow') var sPriceField = Fields.Low; } for (var item in BIAS.PaintItems) { var PaintItem = BIAS.PaintItems[item]; var ReferItem = KLine.PaintItems[PaintItem.ReferItem]; if (DataFields.indexOf(PaintItem.Fields.Field) == -1) DataFields.push(PaintItem.Fields.Field); if (PaintItem.Fields.Field in Records) delete Records[PaintItem.Fields.Field]; Records[PaintItem.Fields.Field] = new Array(iRecordCount); PaintItem.Name = ReferItem.Name; PaintItem.Color = ReferItem.Color; PaintItem.IsShow = ReferItem.IsShow; } if (BIAS.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(BIAS.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var item in BIAS.PaintItems) { var PaintItem = BIAS.PaintItems[item]; var ReferItem = KLine.PaintItems[PaintItem.ReferItem]; var sPaintField = PaintItem.Fields.Field; var sReferField = ReferItem.Fields.Field; for (var i = 0; i < iRecordCount; i++) { if (IsNumeric(Records[sReferField][i]) && IsNumeric(Records[sPriceField][i])) { Records[sPaintField][i] = Round(100*(Records[sPriceField][i]-Records[sReferField][i])/Records[sReferField][i],2); } } } } // 計算KD資料 function InitKD_Data(Data, ChartOptions, KD, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (Fields == null) Fields = { Close:'收盤價', High:'最高價', Low:'最低價', K:'K值', D:'D值', J:'J值', RSV:'RSV' }; if (DataFields.indexOf(Fields.K) == -1) DataFields.push(Fields.K); if (DataFields.indexOf(Fields.D) == -1) DataFields.push(Fields.D); if (DataFields.indexOf(Fields.J) == -1) DataFields.push(Fields.J); if (DataFields.indexOf(Fields.RSV) == -1) DataFields.push(Fields.RSV); if (Fields.K in Records) delete Records[Fields.K]; Records[Fields.K] = new Array(iRecordCount); if (Fields.D in Records) delete Records[Fields.D]; Records[Fields.D] = new Array(iRecordCount); if (Fields.J in Records) delete Records[Fields.J]; Records[Fields.J] = new Array(iRecordCount); if (Fields.RSV in Records) delete Records[Fields.RSV]; Records[Fields.RSV] = new Array(iRecordCount); if (KD.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(KD.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var i = 0; Records[Fields.Close][i] == null && i < iRecordCount; i++); //找到第一個實際有資料的位置 for (i = i + Number(KD.nDays) - 1; i < iRecordCount; i++) { var j = i - Number(KD.nDays) + 1; var fMax = Math.max.apply(null, Records[Fields.High].slice(j,i+1)); var fMin = Math.min.apply(null, Records[Fields.Low].slice(j,i+1)); if (fMax == fMin) { Records[Fields.RSV][i] = 0; } else { Records[Fields.RSV][i] = 100 * (Records[Fields.Close][i] - fMin) / (fMax - fMin); } if (Records[Fields.K][i-1] == null) { Records[Fields.K][i] = 50*2/3 + Records[Fields.RSV][i]*1/3; } else { Records[Fields.K][i] = Records[Fields.K][i-1]*2/3 + Records[Fields.RSV][i]*1/3; } if (Records[Fields.D][i-1] == null) { Records[Fields.D][i] = 50*2/3 + Records[Fields.K][i]*1/3; } else { Records[Fields.D][i] = Records[Fields.D][i-1]*2/3 + Records[Fields.K][i]*1/3; } Records[Fields.J][i] = 3 * Records[Fields.K][i] - 2 * Records[Fields.D][i]; } } // 計算MACD資料 function InitMACD_Data(Data, ChartOptions, oMACD, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (Fields == null) Fields = { Close:'收盤價', High:'最高價', Low:'最低價', EMA1:'EMA1', EMA2:'EMA2', DIF:'DIF', MACD:'MACD', OSC:'OSC'}; if (DataFields.indexOf(Fields.EMA1) == -1) DataFields.push(Fields.EMA1); if (DataFields.indexOf(Fields.EMA2) == -1) DataFields.push(Fields.EMA2); if (DataFields.indexOf(Fields.DIF) == -1) DataFields.push(Fields.DIF); if (DataFields.indexOf(Fields.MACD) == -1) DataFields.push(Fields.MACD); if (DataFields.indexOf(Fields.OSC) == -1) DataFields.push(Fields.OSC); if (Fields.EMA1 in Records) delete Records[Fields.EMA1]; Records[Fields.EMA1] = new Array(iRecordCount); if (Fields.EMA2 in Records) delete Records[Fields.EMA2]; Records[Fields.EMA2] = new Array(iRecordCount); if (Fields.DIF in Records) delete Records[Fields.DIF]; Records[Fields.DIF] = new Array(iRecordCount); if (Fields.MACD in Records) delete Records[Fields.MACD]; Records[Fields.MACD] = new Array(iRecordCount); if (Fields.OSC in Records) delete Records[Fields.OSC]; Records[Fields.OSC] = new Array(iRecordCount); if (oMACD.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(oMACD.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var i = 0; Records[Fields.Close][i] == null && i < iRecordCount; i++); //找到第一個實際有資料的位置 for (var iCnt = 0; i < iRecordCount; i++, iCnt++) { if (iCnt == 0) { Records[Fields.EMA1][i] = (Records[Fields.High][i] + Records[Fields.Low][i] + Records[Fields.Close][i] * 2) / 4; Records[Fields.EMA2][i] = (Records[Fields.High][i] + Records[Fields.Low][i] + Records[Fields.Close][i] * 2) / 4; } else { Records[Fields.EMA1][i] = (Records[Fields.EMA1][i-1]*(Number(oMACD.nEMA1)-1)+((Records[Fields.High][i]+Records[Fields.Low][i]+Records[Fields.Close][i]*2)/4)*2)/(Number(oMACD.nEMA1)+1); Records[Fields.EMA2][i] = (Records[Fields.EMA2][i-1]*(Number(oMACD.nEMA2)-1)+((Records[Fields.High][i]+Records[Fields.Low][i]+Records[Fields.Close][i]*2)/4)*2)/(Number(oMACD.nEMA2)+1); } Records[Fields.DIF][i] = Records[Fields.EMA1][i] - Records[Fields.EMA2][i]; if (iCnt == 0) { Records[Fields.MACD][i] = Records[Fields.DIF][i]; } else { Records[Fields.MACD][i] = (Records[Fields.MACD][i-1] * (Number(oMACD.nDays)-1) + Records[Fields.DIF][i]*2) / (Number(oMACD.nDays)+1); } Records[Fields.OSC][i] = (Records[Fields.DIF][i] - Records[Fields.MACD][i]) * Number(oMACD.nMultiOSC); } } // 計算威廉指標 function InitWilliamsR_Data(Data, ChartOptions, WR, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); var PaintItems = WR.PaintItems; var nDays = [WR.PaintItems.WR1.nDays, WR.PaintItems.WR2.nDays]; PaintItems.WR1.Name = (ChartOptions.Language=='CN'?'威廉指标 ':'威廉指標 ') + WR.PaintItems.WR1.nDays; PaintItems.WR2.Name = (ChartOptions.Language=='CN'?'威廉指标 ':'威廉指標 ') + WR.PaintItems.WR2.nDays; if (Fields == null) Fields = { Close:'收盤價', High:'最高價', Low:'最低價', WR1:PaintItems.WR1.Fields.Field, WR2:PaintItems.WR2.Fields.Field }; if (DataFields.indexOf(Fields.WR1) == -1) DataFields.push(Fields.WR1); if (DataFields.indexOf(Fields.WR2) == -1) DataFields.push(Fields.WR2); if (Fields.WR1 in Records) delete Records[Fields.WR1]; Records[Fields.WR1] = new Array(iRecordCount); if (Fields.WR2 in Records) delete Records[Fields.WR2]; Records[Fields.WR2] = new Array(iRecordCount); if (WR.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(WR.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var iStart = 0; Records[Fields.Close][iStart] == null && iStart < iRecordCount; iStart++); //找到第一個實際有資料的位置 for (var iDay = 0; iDay < nDays.length; iDay++) { var sField = Fields['WR'+Number(iDay+1).toString()]; for (var i = iStart + Number(nDays[iDay]) - 1; i < iRecordCount; i++) { var j = i - Number(nDays[iDay]) + 1; var fMax = Math.max.apply(null, Records[Fields.High].slice(j,i+1)); var fMin = Math.min.apply(null, Records[Fields.Low].slice(j,i+1)); if (fMax == fMin) { Records[sField][i] = 0; } else { Records[sField][i] = -100 * (fMax - Records[Fields.Close][i]) / (fMax - fMin); } } } } // 計算Bollinger資料 function InitBollingerData(Data, ChartOptions, ChartItem, sCloseField) { var PaintItems = ChartItem.PaintItems; var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (!('BollingerBandsUP_' + ChartOptions.ChartCat in PaintItems) || !('BollingerBandsMA_' + ChartOptions.ChartCat in PaintItems) || !('BollingerBandsDN_' + ChartOptions.ChartCat in PaintItems)) return; var PaintItemUP = PaintItems['BollingerBandsUP_' + ChartOptions.ChartCat]; var PaintItemMA = PaintItems['BollingerBandsMA_' + ChartOptions.ChartCat]; var PaintItemDN = PaintItems['BollingerBandsDN_' + ChartOptions.ChartCat]; if (sCloseField == null) sCloseField = ChartItem.PaintItems.KLine.Fields.Close; // 建立相關欄位 if (DataFields.indexOf(PaintItemUP.Fields.Field) == -1) DataFields.push(PaintItemUP.Fields.Field); if (PaintItemUP.Fields.Field in Records) delete Records[PaintItemUP.Fields.Field]; Records[PaintItemUP.Fields.Field] = new Array(iRecordCount); if (DataFields.indexOf(PaintItemMA.Fields.Field) == -1) DataFields.push(PaintItemMA.Fields.Field); if (PaintItemMA.Fields.Field in Records) delete Records[PaintItemMA.Fields.Field]; Records[PaintItemMA.Fields.Field] = new Array(iRecordCount); if (DataFields.indexOf(PaintItemDN.Fields.Field) == -1) DataFields.push(PaintItemDN.Fields.Field); if (PaintItemDN.Fields.Field in Records) delete Records[PaintItemDN.Fields.Field]; Records[PaintItemDN.Fields.Field] = new Array(iRecordCount); if (DataFields.indexOf(PaintItemMA.Fields.PB) == -1) DataFields.push(PaintItemMA.Fields.PB); if (PaintItemMA.Fields.PB in Records) delete Records[PaintItemMA.Fields.PB]; Records[PaintItemMA.Fields.PB] = new Array(iRecordCount); if (DataFields.indexOf(PaintItemMA.Fields.BW) == -1) DataFields.push(PaintItemMA.Fields.BW); if (PaintItemMA.Fields.BW in Records) delete Records[PaintItemMA.Fields.BW]; Records[PaintItemMA.Fields.BW] = new Array(iRecordCount); // 檢查是否計算後續資料 if (Number(PaintItemMA.Count) <= 0 || ChartOptions.ChartDisplayList.indexOf(ChartItem.ID) < 0) return; // 找出最後一筆非空白資料 var Record = Records[sCloseField]; for (var iEnd = iRecordCount - 1; iEnd >= 0; iEnd--) if (IsNumeric(Record[iEnd]) == true) { break; } // 為空白的收盤價填上假資料 var fLast = null, iLog = []; for (var i = 0; i <= iEnd; i++) { if (IsNumeric(Record[i]) == false && IsNumeric(fLast)) { Record[i] = fLast; iLog.push(i); } fLast = Record[i]; } // 計算BollingerBand var RecordUP = Records[PaintItemUP.Fields.Field]; var RecordMA = Records[PaintItemMA.Fields.Field]; var RecordDN = Records[PaintItemDN.Fields.Field]; var RecordPB = Records[PaintItemMA.Fields.PB]; var RecordBW = Records[PaintItemMA.Fields.BW]; var iDaysCount = Number(PaintItemMA.Count); //MA指定Count // 計算中心線(移動平均線) var fSum = 0, iSumCnt = 0; for (var i = 0; i <= iEnd; i++) { if (IsNumeric(Record[i])) { iSumCnt++; fSum = fSum + Record[i] - (i>=iDaysCount?Record[i-iDaysCount]:0); } if (iSumCnt >= iDaysCount) { RecordMA[i] = fSum/iDaysCount; } } // 計算標準差, %b指標, 帶寬指標 var fSum = 0, iSumCnt = 0; for (var i = 0; i <= iEnd; i++) { if (IsNumeric(Record[i])) { iSumCnt++; fSum = fSum + Math.pow(Record[i],2) - (i>=iDaysCount?Math.pow(Record[i-iDaysCount],2):0); } if (iSumCnt >= iDaysCount) { var f = PaintItemMA.Multiplier * Math.sqrt(Round(fSum / iDaysCount,9) - Round(Math.pow(RecordMA[i],2),9)); RecordUP[i] = RecordMA[i] + f; RecordDN[i] = RecordMA[i] - f; if (RecordUP[i] == RecordDN[i]) { RecordPB[i] = 0; } else { RecordPB[i] = Round((Record[i] - RecordDN[i]) / (RecordUP[i] - RecordDN[i]),2); } RecordBW[i] = Round((RecordUP[i] - RecordDN[i]) / RecordMA[i],2); } } // 清除假資料 for (var i = 0; i < iLog.length; i++) { Record[iLog[i]] = null; } // 修正四捨五入小數點 for (var i = 0; i < iRecordCount; i++) { if (IsNumeric(RecordUP[i])) RecordUP[i] = Round(RecordUP[i],2); if (IsNumeric(RecordMA[i])) RecordMA[i] = Round(RecordMA[i],2); if (IsNumeric(RecordDN[i])) RecordDN[i] = Round(RecordDN[i],2); } } // 計算DMI資料 function InitDMI_Data(Data, ChartOptions, DMI, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (Fields == null) { Fields = { Close:'收盤價', High:'最高價', Low:'最低價', DM1:'DM1', DM2:'DM2', TR:'TR', ADM1:'ADM1', ADM2:'ADM2', ATR:'ATR', DI1:'DI1', DI2:'DI2', DX:'DX', ADX:'ADX', ADXR:'ADXR' }; } if (DataFields.indexOf(Fields.DM1) == -1) DataFields.push(Fields.DM1); if (DataFields.indexOf(Fields.DM2) == -1) DataFields.push(Fields.DM2); if (DataFields.indexOf(Fields.TR) == -1) DataFields.push(Fields.TR); if (DataFields.indexOf(Fields.ADM1) == -1) DataFields.push(Fields.ADM1); if (DataFields.indexOf(Fields.ADM2) == -1) DataFields.push(Fields.ADM2); if (DataFields.indexOf(Fields.ATR) == -1) DataFields.push(Fields.ATR); if (DataFields.indexOf(Fields.DI1) == -1) DataFields.push(Fields.DI1); if (DataFields.indexOf(Fields.DI2) == -1) DataFields.push(Fields.DI2); if (DataFields.indexOf(Fields.DX) == -1) DataFields.push(Fields.DX); if (DataFields.indexOf(Fields.ADX) == -1) DataFields.push(Fields.ADX); if (DataFields.indexOf(Fields.ADXR) == -1) DataFields.push(Fields.ADXR); if (Fields.DM1 in Records) delete Records[Fields.DM1]; Records[Fields.DM1] = new Array(iRecordCount); if (Fields.DM2 in Records) delete Records[Fields.DM2]; Records[Fields.DM2] = new Array(iRecordCount); if (Fields.TR in Records) delete Records[Fields.TR]; Records[Fields.TR] = new Array(iRecordCount); if (Fields.ADM1 in Records) delete Records[Fields.ADM1]; Records[Fields.ADM1] = new Array(iRecordCount); if (Fields.ADM2 in Records) delete Records[Fields.ADM2]; Records[Fields.ADM2] = new Array(iRecordCount); if (Fields.ATR in Records) delete Records[Fields.ATR]; Records[Fields.ATR] = new Array(iRecordCount); if (Fields.DI1 in Records) delete Records[Fields.DI1]; Records[Fields.DI1] = new Array(iRecordCount); if (Fields.DI2 in Records) delete Records[Fields.DI2]; Records[Fields.DI2] = new Array(iRecordCount); if (Fields.DX in Records) delete Records[Fields.DX]; Records[Fields.DX] = new Array(iRecordCount); if (Fields.ADX in Records) delete Records[Fields.ADX]; Records[Fields.ADX] = new Array(iRecordCount); if (Fields.ADXR in Records) delete Records[Fields.ADXR]; Records[Fields.ADXR] = new Array(iRecordCount); if (DMI.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(DMI.ID) < 0) return; //若該圖形不顯示,則直接跳出 var nDaysDI = Number(DMI.nDaysDI); var nDaysADX = Number(DMI.nDaysADX); var nDaysADXR = Number(DMI.nDaysADXR); var iCnt = 0, iCntADX = 0; for (var i=1; i<iRecordCount; i++) { if (IsNumeric(Records[Fields.High][i]) && IsNumeric(Records[Fields.High][i-1]) && IsNumeric(Records[Fields.Low][i]) && IsNumeric(Records[Fields.Low][i-1]) && IsNumeric(Records[Fields.Close][i-1])) { iCnt++; var fDM1 = Records[Fields.High][i] - Records[Fields.High][i-1]; var fDM2 = Records[Fields.Low][i-1] - Records[Fields.Low][i]; if (fDM1 < 0) { fDM1 = 0; } if (fDM2 < 0) { fDM2 = 0; } if (fDM1 < fDM2) { fDM1 = 0; } else if (fDM2 < fDM1) { fDM2 = 0; } else { fDM1 = 0; fDM2 = 0; } Records[Fields.DM1][i] = fDM1; Records[Fields.DM2][i] = fDM2; Records[Fields.TR][i] = Math.max( Math.abs(Records[Fields.High][i] - Records[Fields.Low][i]), Math.abs(Records[Fields.High][i] - Records[Fields.Close][i-1]), Math.abs(Records[Fields.Low][i] - Records[Fields.Close][i-1])); } else { iCnt = 0; iCntADX = 0; } if (iCnt >= nDaysDI) { if (IsNumeric(Records[Fields.ADM1][i-1])) { Records[Fields.ADM1][i] = Records[Fields.ADM1][i-1]*(nDaysDI-1)/nDaysDI + Records[Fields.DM1][i]/nDaysDI; } else { var fSumDM1 = 0; for (var j=i; j>i-nDaysDI; j--) fSumDM1 = fSumDM1 + Records[Fields.DM1][j]; Records[Fields.ADM1][i] = fSumDM1/nDaysDI; } if (IsNumeric(Records[Fields.ADM2][i-1])) { Records[Fields.ADM2][i] = Records[Fields.ADM2][i-1]*(nDaysDI-1)/nDaysDI + Records[Fields.DM2][i]/nDaysDI; } else { var fSumDM2 = 0; for (var j=i; j>i-nDaysDI; j--) fSumDM2 = fSumDM2 + Records[Fields.DM2][j]; Records[Fields.ADM2][i] = fSumDM2/nDaysDI; } if (IsNumeric(Records[Fields.ATR][i-1])) { Records[Fields.ATR][i] = Records[Fields.ATR][i-1]*(nDaysDI-1)/nDaysDI + Records[Fields.TR][i]/nDaysDI; } else { var fSumTR = 0; for (var j=i; j>i-nDaysDI; j--) fSumTR = fSumTR + Records[Fields.TR][j]; Records[Fields.ATR][i] = fSumTR/nDaysDI; } if (Records[Fields.ATR][i] == 0) { Records[Fields.DI1][i] = 0; Records[Fields.DI2][i] = 0; } else { Records[Fields.DI1][i] = 100*Records[Fields.ADM1][i]/Records[Fields.ATR][i]; Records[Fields.DI2][i] = 100*Records[Fields.ADM2][i]/Records[Fields.ATR][i]; } iCntADX++; if (Records[Fields.ADM1][i] + Records[Fields.ADM2][i] == 0) { Records[Fields.DX][i] = 0; } else { Records[Fields.DX][i] = 100*Math.abs(Records[Fields.ADM1][i]-Records[Fields.ADM2][i])/(Records[Fields.ADM1][i]+Records[Fields.ADM2][i]); } if (iCntADX >= nDaysADX) { if (IsNumeric(Records[Fields.ADX][i-1])) { Records[Fields.ADX][i] = Records[Fields.ADX][i-1]*(nDaysADX-1)/nDaysADX + Records[Fields.DX][i]/nDaysADX; if (IsNumeric(Records[Fields.ADX][i-nDaysADXR])) { Records[Fields.ADXR][i] = (Records[Fields.ADX][i] + Records[Fields.ADX][i-nDaysADXR]) / 2; } } else { var fSumADX = 0; for (var j=i; j>i-nDaysADX; j--) fSumADX = fSumADX + Records[Fields.DX][j]; Records[Fields.ADX][i] = fSumADX/nDaysADX; } } } } } // 計算MTM資料(動量指標) function InitMTM_Data(Data, ChartOptions, MTM, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); var iMTM_CNT = Number(MTM.PaintItems.MTM.Count); var iMTM_MA_CNT = Number(MTM.PaintItems.MTM_MA.Count); if (Fields == null) Fields = { Close:'收盤價', MTM:'MTM', MTM_MA:'MTM_MA' }; if (DataFields.indexOf(Fields.MTM) == -1) DataFields.push(Fields.MTM); if (DataFields.indexOf(Fields.MTM_MA) == -1) DataFields.push(Fields.MTM_MA); if (Fields.MTM in Records) delete Records[Fields.MTM]; Records[Fields.MTM] = new Array(iRecordCount); if (Fields.MTM_MA in Records) delete Records[Fields.MTM_MA]; Records[Fields.MTM_MA] = new Array(iRecordCount); if (MTM.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(MTM.ID) < 0) return; //若該圖形不顯示,則直接跳出 for (var i = 0; Records[Fields.Close][i] == null && i < iRecordCount; i++); //找到第一個實際有資料的位置 var fSum = 0, iSumCnt = 1; //用來計算MTM_MA for (i = i + iMTM_CNT; i < iRecordCount; i++) { // 計算MTM if (IsNumeric(Records[Fields.Close][i]) && IsNumeric(Records[Fields.Close][i-iMTM_CNT])) { Records[Fields.MTM][i] = Records[Fields.Close][i] - Records[Fields.Close][i-iMTM_CNT]; } // 計算MTM_MA if (IsNumeric(iMTM_MA_CNT) && iMTM_MA_CNT > 0) { if (IsNumeric(Records[Fields.MTM][i])) { iSumCnt++; fSum = fSum + Records[Fields.MTM][i] - (i>=iMTM_MA_CNT&&IsNumeric(Records[Fields.MTM][i-iMTM_MA_CNT])?Records[Fields.MTM][i-iMTM_MA_CNT]:0); } if (iSumCnt >= iMTM_MA_CNT) { Records[Fields.MTM_MA][i] = Math.round(fSum/iMTM_MA_CNT*100)/100; } } } } // 同步圖形設定值 function ChartConfigAlign(objTo, objFrom, sAlignType) { for (var item in objFrom) { if (typeof(objFrom[item]) == 'object' && typeof(objTo[item]) == 'object' && objFrom[item] != null && objTo[item] != null) { ChartConfigAlign(objTo[item], objFrom[item], sAlignType); } else if ((typeof(objFrom[item]) != 'object' || objFrom[item] == null) && (typeof(objTo[item]) != 'object' || objTo[item] == null) && (sAlignType == 'AlignValue'|| sAlignType == 'AlignItemValue')) { if (objFrom[item] == null) objTo[item] = null; //由於物件是 Copy address, 故要這樣寫才能造一個新的物件 else if (objTo[item] != 'AlwaysShow' && objTo[item] != 'AlwaysHide') objTo[item] = objFrom[item]; //Value align } else if (!(item in objTo) && (sAlignType == 'AlignItem' || sAlignType == 'AlignItemValue')) { if (objFrom[item] == null) { objTo[item] = null; } else if (typeof(objFrom[item]) == 'object') { if (Object.prototype.toString.call(objFrom[item]) == '[object Array]') objTo[item] = []; else objTo[item] = {}; ChartConfigAlign(objTo[item], objFrom[item], sAlignType); } else { objTo[item] = objFrom[item]; } } } } function TimeStrMap(sTime, sLanguage) { var s = String(sTime).toUpperCase(); if (s == 'DATE') return '日'; if (s == 'WEEK' && sLanguage == 'CN') return '周'; if (s == 'WEEK') return '週'; if (s == 'MONTH') return '月'; if (s == 'QUAR') return '季'; if (s == 'YEAR') return '年'; } function GetYbyCrossPoint(oPainter, ev) { if (oPainter.ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'Float') return ev.offsetY; var Records = oPainter.Data.Records; var ChartOptions = oPainter.ChartOptions; var ChartItems = ChartOptions.ChartItems; var ChartDisplayList = ChartOptions.ChartDisplayList; function GetY(v, h, l, Region) { if (v == null || h == null || l == null) { return null; } else if (v > h) { return Region.y; } else if (v < l) { return Region.y + Region.height; } else { return Region.y + Region.height - Region.height * (v - l) / (h - l); } } if ('KLine' in ChartItems) { if (ChartDisplayList.indexOf('KLine') >= 0) { if ('KLine' in ChartItems.KLine.PaintItems) { if (ChartItems.KLine.PaintItems.KLine.Type == 'Candle') { if (ChartItems.KLine.PaintItems.KLine.yAxisAlign == 'yAxisR') { var h = ChartItems.KLine.yAxisR.AxisHigh; var l = ChartItems.KLine.yAxisR.AxisLow; } else { var h = ChartItems.KLine.yAxisL.AxisHigh; var l = ChartItems.KLine.yAxisL.AxisLow; } if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceOpen' && Records.開盤價[ChartOptions.IndexCurrent] != null) { return GetY(Records.開盤價[ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region); } else if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceHigh' && Records.最高價[ChartOptions.IndexCurrent] != null) { return GetY(Records.最高價[ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region); } else if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceLow' && Records.最低價[ChartOptions.IndexCurrent] != null) { return GetY(Records.最低價[ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region); } else if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceClose' && Records.收盤價[ChartOptions.IndexCurrent] != null) { return GetY(Records.收盤價[ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region); } } } } } return ev.offsetY; } function GetTipHtml(oPainter, ev) { var ChartOptions = oPainter.ChartOptions; var ChartItems = ChartOptions.ChartItems; var ChartDisplayList = ChartOptions.ChartDisplayList; var TipHtml = { Tip: null, TipAxisL: null, TipAxisR: null } // 找出目前游標的落點物件 var oLocate = null; var x = ev.offsetX; var y = GetYbyCrossPoint(StockPainter, ev); var Target = null; for (var item in ChartItems) { if (ChartDisplayList.indexOf(item) == -1 || ChartItems[item].IsShow == 'AlwaysHide') continue; var Region = ChartItems[item].Region; if (x >= Region.x && x <= Region.x + Region.width && y >= Region.y && y <= Region.y + Region.height) { Target = ChartItems[item]; break; } } // 計算左右軸的數字 if (Target != null) { var yAxisL = Target.yAxisL; var yAxisR = Target.yAxisR; y = y - Region.y; if (yAxisL.AxisHigh != null && yAxisL.AxisLow != null) { var f = (1 - y / Region.height) * (yAxisL.AxisHigh - yAxisL.AxisLow) + yAxisL.AxisLow; var i = null; if (String(Target.Legend.Type).substr(0,5) == 'KLine') { if (Math.abs(f) < 100) i = 2; else if (Math.abs(f) < 1000) i = 1; else i = 0; } TipHtml.TipAxisL = '<nobr>' + (yAxisL.BigNumberToText=='T'?bigNumberToText(f,i):Round(f,i)) + '</nobr>'; } if (yAxisR.AxisHigh != null && yAxisR.AxisLow != null) { var f = (1 - y / Region.height) * (yAxisR.AxisHigh - yAxisR.AxisLow) + yAxisR.AxisLow; var i = null; if (String(Target.Legend.Type).substr(0,5) == 'KLine') { if (Math.abs(f) < 100) i = 2; else if (Math.abs(f) < 1000) i = 1; else i = 0; } TipHtml.TipAxisR = '<nobr>' + (yAxisR.BigNumberToText=='T'?bigNumberToText(f,i):Round(f,i)) + '</nobr>'; } } return TipHtml; } function GetICON(s) { if (s == 'Line') { return '<span style=font-family:新細明體,Arial;>━</span>'; } else { return '<span style=font-family:新細明體,Arial;>■</span>'; } } function GetUpDownICON(f) { if (f > 0) return '▲'; else if (f < 0) return '▼'; else return ''; } function GetUpDownFlag(f) { if (f > 0) return '+'; else if (f < 0) return '-'; else return ''; } function GetSubTipText(sTipCat, oPainter, ChartItem, Fields, iRound) { var ChartOptions = oPainter.ChartOptions; var ChartItems = ChartOptions.ChartItems; var ChartDisplayList = ChartOptions.ChartDisplayList; var Records = oPainter.Data.Records; var idx = ChartOptions.IndexCurrent; var result = ''; if (sTipCat == 'ReportTime') { if (Fields == null) Fields = { RPT_TIME:'RPT_TIME', START_DATE:'START_DATE', END_DATE:'END_DATE' }; if (Fields.RPT_TIME in Records) { result = Records[Fields.RPT_TIME][idx]; if (ChartOptions.ChartCat == 'DATE') result = result + '&nbsp;(' + WeekName(result) + ')'; } if (ChartOptions.ChartCat != 'DATE' && Fields.START_DATE in Records && Fields.END_DATE in Records) { if (Records[Fields.START_DATE][idx] != null && Records[Fields.END_DATE][idx] != null && Records[Fields.START_DATE][idx] != '' && Records[Fields.END_DATE][idx] != '') result = result + '&nbsp;(' + String(Records[Fields.START_DATE][idx]).substr(5) + '~' + String(Records[Fields.END_DATE][idx]).substr(5) + ')'; } } else if (sTipCat == 'PriceDetail') { if (Fields == null) Fields = { Open:'開盤價', Close:'收盤價', High:'最高價', Low:'最低價', PreClose:'昨收價', Change:'漲跌價', ChangeRatio:'漲跌幅', Volume:'成交量', Turnover:'成交額', LimitUp:'漲停價', LimitDown:'跌停價', AvgPrice:'平均價', DateHigh:'最高價日期', DateLow:'最低價日期' }; var fLimitUp = (Fields.LimitUp in Records?Records[Fields.LimitUp][idx]:null); var fLimitDown = (Fields.LimitDown in Records?Records[Fields.LimitDown][idx]:null); if (fLimitUp == null) fLimitUp = -999999999.999999; //設定一個不可能觸及的價位以避開null的誤判問題 if (fLimitDown == null) fLimitDown = -999999999.999999; //設定一個不可能觸及的價位以避開null的誤判問題 if (ChartOptions.Language=='CN') { if (ChartItem != null && IsNumeric(ChartItem.PriceRound)) { var i = ChartItem.PriceRound; } else { var i = 2; } result = '收盘价:' + (Records[Fields.Close][idx]==null?'No data':'<font style="color:' + (Records[Fields.Close][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Close][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Change][idx]))) + '">' + toMoney(Records[Fields.Close][idx],i) + '</font>') + '<br/>' + '涨跌额:' + (Records[Fields.Change][idx]==null?'No data':'<font style="color:' + (Records[Fields.Close][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Close][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Change][idx]))) + '">' + (Records[Fields.Change][idx]>0?'+':'') + toMoney(Records[Fields.Change][idx],i) + '</font>') + '<br/>' + '涨跌幅:' + (Records[Fields.ChangeRatio][idx]==null?'No data':'<font style="color:' + (Records[Fields.Close][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Close][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.ChangeRatio][idx]))) + '">' + (Records[Fields.ChangeRatio][idx]>0?'+':'') + toMoney(Records[Fields.ChangeRatio][idx],2) + '%</font>') + '<br/>' + '成交量:' + (Records[Fields.Volume][idx]==null?'No data':bigNumberToText(Math.round(Records[Fields.Volume][idx]))+(ChartOptions.Language=='CN'?'手':'張')) + '<br/>' + '成交额:' + (Records[Fields.Turnover][idx]==null?'No data':bigNumberToText(Records[Fields.Turnover][idx])+'元') + '<br/>' + '昨收价:' + (Records[Fields.PreClose][idx]==null?'No data':'<font style="color:#000000">' + toMoney(Records[Fields.PreClose][idx],i) + '</font>') + '<br/>' + '开盘价:' + (Records[Fields.Open][idx]==null?'No data':'<font style="color:' + (Records[Fields.Open][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Open][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Open][idx]-Records[Fields.PreClose][idx]))) + '">' + toMoney(Records[Fields.Open][idx],i) + '</font>') + '<br/>' + '最高价:' + (Records[Fields.High][idx]==null?'No data':'<font style="color:' + (Records[Fields.High][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.High][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.High][idx]-Records[Fields.PreClose][idx]))) + '">' + toMoney(Records[Fields.High][idx],i) + '</font>') + (Fields.DateHigh in Records?'&nbsp;&nbsp;<font style="color:gray">('+Records[Fields.DateHigh][idx].substr(5)+')</font>':'') + '<br/>' + '最低价:' + (Records[Fields.Low][idx]==null?'No data':'<font style="color:' + (Records[Fields.Low][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Low][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Low][idx]-Records[Fields.PreClose][idx]))) + '">' + toMoney(Records[Fields.Low][idx],i) + '</font>') + (Fields.DateLow in Records?'&nbsp;&nbsp;<font style="color:gray">('+Records[Fields.DateLow][idx].substr(5)+')</font>':''); if ('AvgPrice' in Fields && Fields.AvgPrice in Records) { result = result + '<br/>平均价:' + (Records[Fields.AvgPrice][idx]==null?'No data':'<font style="color:#000000">' + Round(Records[Fields.AvgPrice][idx],i) + '</font>') + '<br/>'; } } else { result = '收盤價:' + (Records[Fields.Close][idx]==null?'No data':'<font style="color:' + (Records[Fields.Close][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Close][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Change][idx]))) + '">' + toMoney(Records[Fields.Close][idx]) + '</font>') + '<br/>' + '漲跌價:' + (Records[Fields.Change][idx]==null?'No data':'<font style="color:' + (Records[Fields.Close][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Close][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Change][idx]))) + '">' + (Records[Fields.Change][idx]>0?'+':'') + toMoney(Records[Fields.Change][idx]) + '</font>') + '<br/>' + '漲跌幅:' + (Records[Fields.ChangeRatio][idx]==null?'No data':'<font style="color:' + (Records[Fields.Close][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Close][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.ChangeRatio][idx]))) + '">' + (Records[Fields.ChangeRatio][idx]>0?'+':'') + toMoney(Records[Fields.ChangeRatio][idx]) + '%</font>') + '<br/>' + '成交張:' + (Records[Fields.Volume][idx]==null?'No data':bigNumberToText(Math.round(Records[Fields.Volume][idx]))+(ChartOptions.Language=='CN'?'手':'張')) + '<br/>' + '成交額:' + (Records[Fields.Turnover][idx]==null?'No data':bigNumberToText(Records[Fields.Turnover][idx])+'元') + '<br/>' + '昨收價:' + (Records[Fields.PreClose][idx]==null?'No data':'<font style="color:#000000">' + toMoney(Records[Fields.PreClose][idx]) + '</font>') + '<br/>' + '開盤價:' + (Records[Fields.Open][idx]==null?'No data':'<font style="color:' + (Records[Fields.Open][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Open][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Open][idx]-Records[Fields.PreClose][idx]))) + '">' + toMoney(Records[Fields.Open][idx]) + '</font>') + '<br/>' + '最高價:' + (Records[Fields.High][idx]==null?'No data':'<font style="color:' + (Records[Fields.High][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.High][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.High][idx]-Records[Fields.PreClose][idx]))) + '">' + toMoney(Records[Fields.High][idx]) + '</font>') + (Fields.DateHigh in Records&&IsDate(Records[Fields.DateHigh][idx])?'&nbsp;&nbsp;<font style="color:gray">('+String(Records[Fields.DateHigh][idx]).substr(5)+')</font>':'') + '<br/>' + '最低價:' + (Records[Fields.Low][idx]==null?'No data':'<font style="color:' + (Records[Fields.Low][idx]==fLimitUp?'#FFFF00;background-color:#FF0000;':(Records[Fields.Low][idx]==fLimitDown?'#FFFF00;background-color:#008000;':GetRiseFallColor(Records[Fields.Low][idx]-Records[Fields.PreClose][idx]))) + '">' + toMoney(Records[Fields.Low][idx]) + '</font>') + (Fields.DateLow in Records&&IsDate(Records[Fields.DateLow][idx])?'&nbsp;&nbsp;<font style="color:gray">('+String(Records[Fields.DateLow][idx]).substr(5)+')</font>':''); if ('AvgPrice' in Fields && Fields.AvgPrice in Records) { result = result + '<br/>平均價:' + (Records[Fields.AvgPrice][idx]==null?'No data':'<font style="color:#000000">' + toMoney(Records[Fields.AvgPrice][idx]) + '</font>') + '<br/>'; } } } else if ((sTipCat == 'PriceMA' || sTipCat == 'VolumeMA' || sTipCat == 'AmountMA' || sTipCat == 'PriceMA&DevRatio') && ChartDisplayList.indexOf(ChartItem.ID) >= 0 && ChartItem.IsShow != 'AlwaysHide') { var PaintItems = ChartItem.PaintItems; if ('KLine' in PaintItems) var KLineFields = PaintItems.KLine.Fields; else var KLineFields = { Open:'開盤價', Close:'收盤價', High:'最高價', Low:'最低價' }; for (var item in PaintItems) { var PaintItem = PaintItems[item]; if (String(item).substr(0,3) == 'MA_' && (PaintItem.IsShow == 'T' || PaintItem.IsShow == 'AlwaysShow')) { var sField = PaintItem.Fields.Field; if (Records[sField][idx] != null) { if (result != '') result = result + '<br/>'; result = result + '<b style="color:' + PaintItem.Color + '">' + GetICON(PaintItem.Type) + '</b>&nbsp;' + PaintItem.Name + ':' + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Records[sField][idx]):toMoney(Records[sField][idx],(ChartItem!=null&&IsNumeric(ChartItem.PriceRound)?ChartItem.PriceRound:2))) + ('Legend' in PaintItem&&'Unit' in PaintItem.Legend?PaintItem.Legend.Unit:''); if (idx > 0 && (sTipCat.substr(0,7) == 'PriceMA' || (PaintItem.Legend != null && PaintItem.Legend.ShowTrend == 'T'))) { if (Records[sField][idx] - Records[sField][idx-1] > 0) { result = result + '&nbsp;<font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</font>'; } else if (Records[sField][idx] - Records[sField][idx-1] < 0) { result = result + '&nbsp;<font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + '</font>'; } } if (sTipCat == 'PriceMA&DevRatio') { //顯示乖離率數據 var f = null; if (ChartItem.MA_DevRatioRef == 'PriceClose') f = Records[KLineFields.Close][idx]; if (ChartItem.MA_DevRatioRef == 'PriceOpen') f = Records[KLineFields.Open][idx]; if (ChartItem.MA_DevRatioRef == 'PriceHigh') f = Records[KLineFields.High][idx]; if (ChartItem.MA_DevRatioRef == 'PriceLow') f = Records[KLineFields.Low][idx]; if (f != null && !isNaN(f) && Records[sField][idx] != 0) { f = Round(100 * (f - Records[sField][idx]) / Records[sField][idx]); if (f != null) result = result + '&nbsp;/&nbsp;<font color="' + GetRiseFallColor(f) + '">' + (f>=0?'+':'') + f + '%</font>'; } } } } } } else if (ChartDisplayList.indexOf(ChartItem.ID) >= 0 && ChartItem.IsShow != 'AlwaysHide') { var PaintItems = ChartItem.PaintItems; for (var item in PaintItems) { var PaintItem = PaintItems[item]; if ('Type' in ChartItem && sTipCat != null && ChartItem.Type == sTipCat && (PaintItem.AlignType == null || PaintItem.AlignType != sTipCat)) { continue; } else if (PaintItem.IsShow != 'F' && PaintItem.IsShow != 'AlwaysHide' || PaintItem.Legend.IsShow == 'AlwaysShow') { var arrFields = []; if (PaintItem.Type == 'StackBar') { arrFields = PaintItem.Fields; } else { arrFields.push('Close' in PaintItem.Fields?PaintItem.Fields.Close:PaintItem.Fields.Field); } for (var iField = 0; iField < arrFields.length; iField++) { var sField = arrFields[iField]; if (Records[sField][idx] != null || PaintItem.IsAccumulated == 'T') { if (PaintItem.IsAccumulated == 'T') { var fValCur = 0, fValLast = 0; for (var i = ChartOptions.IndexStart; i <= idx; i++) { if (Records[sField][i] != null) { fValCur = fValCur + Records[sField][i]; } if (i > ChartOptions.IndexStart) { if (Records[sField][i-1] != null) fValLast = fValLast + Records[sField][i-1]; } } } else { var fValCur = Records[sField][idx]; var fValLast = (idx>0?Records[sField][idx-1]:null); } // 取得 ICON 顏色 var sColor = '#000000'; if (PaintItem.Type == 'StackBar') { sColor = PaintItem.Colors[iField]; } else if ('Color' in PaintItem) { sColor = PaintItem.Color; } else if ('RiseColor' in PaintItem && 'FallColor' in PaintItem && idx > 0) { sColor = PaintItem.RiseColor; var sColorField = ('ColorField' in PaintItem.Fields?PaintItem.Fields.ColorField:PaintItem.Fields.Field); if (Records[sColorField][idx] < 0) { sColor = PaintItem.FallColor; } else if ('NormalColor' in PaintItem) { sColor = PaintItem.NormalColor; } } else if ('Color' in PaintItem) { sColor = PaintItem.Color; } else if ('NormalColor' in PaintItem) { sColor = PaintItem.NormalColor; } else if ('RiseColor' in PaintItem) { sColor = PaintItem.RiseColor; } else if ('FallColor' in PaintItem) { sColor = PaintItem.FallColor; } if (result != '') result = result + '<br/>'; result = result + '<b style="color:' + sColor + '">' + GetICON(PaintItem.Type) + '</b>&nbsp;' + (PaintItem.Type == 'StackBar'?PaintItem.Names[iField]:PaintItem.Name) + ':<span style="' + ('Legend' in PaintItem&&PaintItem.Legend.ShowPlusFlag=='T'&&'RiseColor' in PaintItem && 'FallColor' in PaintItem?'color:'+sColor+';':'') + ('Legend' in PaintItem&&PaintItem.Legend.ShowPlusFlag=='T'?'color:'+GetRiseFallColor(fValCur)+';':'') + '">' + ('Legend' in PaintItem&&PaintItem.Legend.ShowPlusFlag=='T'&&fValCur>0?'+':'') + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(fValCur,iRound):Round(fValCur,iRound)) + ('Legend' in PaintItem&&'Unit' in PaintItem.Legend?PaintItem.Legend.Unit:'') + '</span>'; // 變動數 if (idx > 0 && 'Legend' in PaintItem && IsNumeric(fValCur) && IsNumeric(fValLast) && (PaintItem.Legend.ShowTrend == 'T' || PaintItem.Legend.ShowDiffAmount == 'T')) { var sUnit = (PaintItem.Legend.Unit==null||PaintItem.Legend.Unit=='%'?'':PaintItem.Legend.Unit); if ('DiffAmount' in PaintItem.Fields) { var f = Records[PaintItem.Fields.DiffAmount][idx]; } else { var f = fValCur - fValLast; } if (f > 0 && PaintItem.IsAccumulated == 'T') { result = result + '&nbsp;<font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</font>'; } else if (f < 0 && PaintItem.IsAccumulated == 'T') { result = result + '&nbsp;<font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + '</font>'; } else if (f > 0) { result = result + '&nbsp;(<font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):Round(Math.abs(f))) + sUnit + '</font>)'; } else if (f < 0) { result = result + '&nbsp;(<font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):Round(Math.abs(f))) + sUnit + '</font>)'; } } // 變動率 if (idx > 0 && 'Legend' in PaintItem && IsNumeric(fValCur) && IsNumeric(fValLast) && PaintItem.Legend.ShowDiffRatio == 'T') { var sUnit = '%'; if ('DiffRatio' in PaintItem.Fields) { var f = Records[PaintItem.Fields.DiffRatio][idx]; } else if (fValLast == 0) { var f = null; } else { var f = 100 * (fValCur - fValLast) / fValLast; } if (f > 0 && PaintItem.IsAccumulated == 'T') { result = result + '&nbsp;<font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</font>'; } else if (f < 0 && PaintItem.IsAccumulated == 'T') { result = result + '&nbsp;<font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + '</font>'; } else if (f > 0) { result = result + '&nbsp;(<font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):Round(Math.abs(f))) + sUnit + '</font>)'; } else if (f < 0) { result = result + '&nbsp;(<font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):Round(Math.abs(f))) + sUnit + '</font>)'; } } } } } } } if (result == null) result = ''; result = String(result).trim(); return result; } function FormatTipTime(sTime, sCat) { if (sCat == 'DATE' || sCat == 'YEAR') { return String(sTime); } else { return String(sTime).substr(0,4) + String(sCat).substr(0,1) + String(sTime).substr(4); } } function LoadChartConfig(s) { try { var cfg = JSON.parse(s); } catch(err) { var cfg = { Global:{}, Local:{} }; } ChartConfigAlign(cfg.Global, ChartConfigSTD, 'AlignItem'); //將Global設定值與標準值進行同步修正 return cfg; } // 為所有物件加入ID名稱 //function CreateObjectID(obj) { // for (var objSub in obj) { // if (typeof(obj[objSub]) == 'object') { // obj[objSub].ID = objSub; // CreateObjectID(objSub); // } // } //} // 計算交易狀況未提供的欄位(如漲跌幅,昨收價), Removed on 2015/9/12 //function InitPriceData(Data, sField) { // if (sField == null) sField = ''; // with (Data) { // if (!('昨收價'+sField in Records) && '收盤價'+sField in Records && '漲跌價'+sField in Records) { // Fields.push(['昨收價'+sField]); // Records['昨收價'+sField] = []; // for (var i = 0; i < RecordCount; i++) { // if (Records['收盤價'+sField][i] == null || Records['漲跌價'+sField][i] == null) Records['昨收價'+sField].push(null); // else Records['昨收價'+sField].push(Math.round((Records['收盤價'+sField][i]-Records['漲跌價'+sField][i])*100)/100); // } // } // // if (!('漲跌幅'+sField in Records) && '漲跌價'+sField in Records && '收盤價'+sField in Records) { // Fields.push(['漲跌幅'+sField]); // Records['漲跌幅'+sField] = []; // for (var i = 0; i < RecordCount; i++) { // if (Records['收盤價'+sField][i] == null || Records['漲跌價'+sField][i] == null) Records['漲跌幅'+sField].push(null); // else Records['漲跌幅'+sField].push(Math.round(Records['漲跌價'+sField][i]/(Records['收盤價'+sField][i]-Records['漲跌價'+sField][i])*10000)/100); // } // } // } //} // ============================================================================================================================================
Editor Settings
Theme
Key bindings
Full width
Lines