// 圖形標準設定值 (可以給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> </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> ' + (ChartOptions.Language=='CN'?'显示均线扣抵位置':'顯示均線扣抵位置') + ':</nobr></td>' +
'<td><input type="checkbox" id="CFG_KLine_MA_SHOW_TOUCH_TAG"></td>' +
'</tr><tr>' +
'<td><nobr> ' + (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> 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> 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> 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> 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> 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);"> ' + sTimeStr + ' </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> 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> ' + (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> ' + (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);"> ' + sTimeStr + ' </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 ' + (ChartOptions.Language=='CN'?'设定值':'設定值') + '</nobr></td></tr>' +
'<tr valign="middle">' +
'<td style="padding:2px 0"><nobr> 短天期:' +
'<input type="text" id="CFG_RSI1_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td style="padding:2px 0"><nobr> ' + (ChartOptions.Language=='CN'?'长天期':'長天期') + ':' +
'<input type="text" id="CFG_RSI2_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);"> ' + sTimeStr + ' </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> 短天期:' +
'<input type="text" id="CFG_WR1_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td style="padding:2px 0"><nobr> ' + (ChartOptions.Language=='CN'?'长天期':'長天期') + ':' +
'<input type="text" id="CFG_WR2_nDAYS" size="1" maxlength="3" onkeypress="InputPosIntChk(event);"> ' + sTimeStr + ' </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> 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> 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> 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> 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> 短期EMA</nobr></td>' +
'<td colspan="2"><nobr><input type="text" id="CFG_MACD_nEMA1" size="2" maxlength="2" onkeypress="InputPosIntChk(event);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td><nobr> ' + (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);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td><nobr> ' + (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);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td><nobr> ' + (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);"> 倍 </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> +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> -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> 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> 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> ' + (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);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td><nobr> ' + (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);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td><nobr> ' + (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);"> ' + sTimeStr + ' </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> ' + (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> ' + (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> ' + (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> ' + (ChartOptions.Language=='CN'?'均线周期':'均線週期') + '</nobr></td>' +
'<td style="padding:2px 0"><nobr><input type="text" id="CFG_BollingerBandsCount" size="2" maxlength="4" onkeypress="InputPosIntChk(event);"> ' + sTimeStr + ' </nobr></td>' +
'</tr>' +
'<tr valign="middle">' +
'<td><nobr> ' + (ChartOptions.Language=='CN'?'轨道乘数':'軌道乘數') + '</nobr></td>' +
'<td style="padding:2px 0"><nobr><input type="text" id="CFG_BollingerBandsMultiplier" size="2" maxlength="6" onkeypress="InputPosNumChk(event);"> 倍 </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> 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> ' + (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 = ' <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 = ' (' + GetUpDownICON(Records[PaintItem.Fields.DiffAmount][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffAmount][iCurIdx])) + (ItemLegend.Unit=='%'?'':ItemLegend.Unit) + ')';
} else if (Legend.ShowICON == 'T') {
sDiffAmount = ' <span style="color:' + GetRiseFallColor(fValCur-fValLast) + '">(' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(Math.abs(fValCur-fValLast)) + ')</span>';
} else {
sDiffAmount = ' (' + 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 = ' <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 = ' (' + GetUpDownICON(Records[PaintItem.Fields.DiffRatio][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffRatio][iCurIdx])) + '%)';
} else if (Legend.ShowICON == 'T') {
sDiffRatio = ' <span style="color:' + GetRiseFallColor(fValCur-fValLast) + '">(' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(100*Math.abs(fValCur-fValLast)/fValLast) + '%)</span>';
} else {
sDiffRatio = ' (' + 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) + ': ';
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) + ': ';
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 + ' '; }
if (ItemLegend.Align == 'center') { s2 = s2 + s + ' '; }
if (ItemLegend.Align == 'right') { s3 = s3 + ' ' + 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 + " </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> " + 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> </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> </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> </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> </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) + ' ' +
"(" + (Records['漲跌幅'+sField][iCurIdx]>0?'+':'') + toMoney(Records['漲跌幅'+sField][iCurIdx]) + "%)</b> </nobr></td>" +
"<td width='130px'><nobr>成交量:" + bigNumberToText(Records['成交量'+sField][iCurIdx],2) + "手 </nobr></td>";
// "<td width='130px'><nobr>成交额:" + bigNumberToText(Records['成交額'+sField][iCurIdx],2) + "元 </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> </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> </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> </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> </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]) + ' ' +
"(" + (Records['漲跌幅'+sField][iCurIdx]>0?'+':'') + toMoney(Records['漲跌幅'+sField][iCurIdx]) + "%)</b> </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)+'張') + " </nobr></td>";
}
s = s + "<td><nobr>" + Records.RPT_TIME[iCurIdx] +
(ChartOptions.ChartCat=='DATE'?' ('+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]==''?
'':' (' + Records.START_DATE[iCurIdx].substr(5) + '~' + Records.END_DATE[iCurIdx].substr(5) + ')') +
" </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):'')):'') +
" </nobr></td>";
}
}
}
s = s + "<div><table style='width:100%;height:18px;'><tr>" + sTmp + "<td> </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 + ' (' + 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 + ' (' + 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?' <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?' <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])?' <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])?' <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> ' + 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 + ' <font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</font>'; }
else if (Records[sField][idx] - Records[sField][idx-1] < 0) { result = result + ' <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 + ' / <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> ' +
(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 + ' <font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</font>';
} else if (f < 0 && PaintItem.IsAccumulated == 'T') {
result = result + ' <font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + '</font>';
} else if (f > 0) {
result = result + ' (<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 + ' (<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 + ' <font color="' + GetRiseFallColor(1) + '">' + GetUpDownICON(1) + '</font>';
} else if (f < 0 && PaintItem.IsAccumulated == 'T') {
result = result + ' <font color="' + GetRiseFallColor(-1) + '">' + GetUpDownICON(-1) + '</font>';
} else if (f > 0) {
result = result + ' (<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 + ' (<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);
// }
// }
// }
//}
// ============================================================================================================================================