// 圖形標準設定值 (可以給User設定的參數才需要在這裡寫一個標準值) var ChartConfigSTD = { Version: '2022/10/14', DataLoadLength: 2500, InitIndexLength: 120, ChartItems: { KLine: { MA_DevRatioRef: 'PriceClose', MA_ShowTouchTag: 'T', PaintItems: { KLine: { Type: 'Candle', ShowHighLow: 'F', RiseColor: '#FF0000', RiseFillColor: '#FF0000', FallColor: '#008000', FallFillColor: '#008000', UnchangedColor: '#000000', BandTag: { IsShow: 'F', Cycle_DATE: 60, Cycle_WEEK: 13, Cycle_MONTH: 12, Cycle_QUAR: 4, Cycle_YEAR: 3 } }, MA_DATE0: { Name: '5日', Type: 'Line', Count: 5, Color: '#808080', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_DATE1: { Name: '10日', Type: 'Line', Count: 10, Color: '#007D48', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_DATE2: { Name: '月', Type: 'Line', Count: 20, Color: '#FF0000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE3: { Name: '季', Type: 'Line', Count: 60, Color: '#FF8000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE4: { Name: '半年', Type: 'Line', Count: 120, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE5: { Name: '年', Type: 'Line', Count: 240, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE6: { Name: '3年', Type: 'Line', Count: 720, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_DATE7: { Name: '5年', Type: 'Line', Count: 1200, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_DATE8: { Name: '10年', Type: 'Line', Count: 2400, Color: '#8000FF', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK0: { Name: '月', Type: 'Line', Count: 4, Color: '#FF0000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK1: { Name: '季', Type: 'Line', Count: 13, Color: '#FF8000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK2: { Name: '半年', Type: 'Line', Count: 26, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK3: { Name: '年', Type: 'Line', Count: 52, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK4: { Name: '3年', Type: 'Line', Count: 156, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_WEEK5: { Name: '5年', Type: 'Line', Count: 260, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK6: { Name: '10年', Type: 'Line', Count: 521, Color: '#8000FF', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_WEEK8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH0: { Name: '半年', Type: 'Line', Count: 6, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH1: { Name: '年', Type: 'Line', Count: 12, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH2: { Name: '3年', Type: 'Line', Count: 36, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH3: { Name: '5年', Type: 'Line', Count: 60, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH4: { Name: '10年', Type: 'Line', Count: 120, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_MONTH5: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH6: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_MONTH8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR0: { Name: '年', Type: 'Line', Count: 4, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_QUAR1: { Name: '3年', Type: 'Line', Count: 12, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_QUAR2: { Name: '5年', Type: 'Line', Count: 20, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR3: { Name: '10年', Type: 'Line', Count: 40, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_QUAR4: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR5: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR6: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_QUAR8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR0: { Name: '3年', Type: 'Line', Count: 3, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_YEAR1: { Name: '5年', Type: 'Line', Count: 5, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR2: { Name: '10年', Type: 'Line', Count: 10, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, MA_YEAR3: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR4: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR5: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR6: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, MA_YEAR8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_DATE0: { Name: '5日', Type: 'Line', Count: 5, Color: '#808080', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_DATE1: { Name: '10日', Type: 'Line', Count: 10, Color: '#007D48', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_DATE2: { Name: '月', Type: 'Line', Count: 20, Color: '#FF0000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_DATE3: { Name: '季', Type: 'Line', Count: 60, Color: '#FF8000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_DATE4: { Name: '半年', Type: 'Line', Count: 120, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_DATE5: { Name: '年', Type: 'Line', Count: 240, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_DATE6: { Name: '3年', Type: 'Line', Count: 720, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_DATE7: { Name: '5年', Type: 'Line', Count: 1200, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_DATE8: { Name: '10年', Type: 'Line', Count: 2400, Color: '#8000FF', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_WEEK0: { Name: '月', Type: 'Line', Count: 4, Color: '#FF0000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_WEEK1: { Name: '季', Type: 'Line', Count: 13, Color: '#FF8000', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_WEEK2: { Name: '半年', Type: 'Line', Count: 26, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_WEEK3: { Name: '年', Type: 'Line', Count: 52, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_WEEK4: { Name: '3年', Type: 'Line', Count: 156, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_WEEK5: { Name: '5年', Type: 'Line', Count: 260, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_WEEK6: { Name: '10年', Type: 'Line', Count: 521, Color: '#8000FF', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_WEEK7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_WEEK8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_MONTH0: { Name: '半年', Type: 'Line', Count: 6, Color: '#00E600', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_MONTH1: { Name: '年', Type: 'Line', Count: 12, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_MONTH2: { Name: '3年', Type: 'Line', Count: 36, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_MONTH3: { Name: '5年', Type: 'Line', Count: 60, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_MONTH4: { Name: '10年', Type: 'Line', Count: 120, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_MONTH5: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_MONTH6: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_MONTH7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_MONTH8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_QUAR0: { Name: '年', Type: 'Line', Count: 4, Color: '#0080FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_QUAR1: { Name: '3年', Type: 'Line', Count: 12, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_QUAR2: { Name: '5年', Type: 'Line', Count: 20, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_QUAR3: { Name: '10年', Type: 'Line', Count: 40, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_QUAR4: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_QUAR5: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_QUAR6: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_QUAR7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_QUAR8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR0: { Name: '3年', Type: 'Line', Count: 3, Color: '#FF0080', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_YEAR1: { Name: '5年', Type: 'Line', Count: 5, Color: '#1919B3', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR2: { Name: '10年', Type: 'Line', Count: 10, Color: '#8000FF', LineWidth: 1, IsShow: 'T', yAxisRef: 'F' }, EMA_YEAR3: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR4: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR5: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR6: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR7: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, EMA_YEAR8: { Name: null, Type: 'Line', Count: null, Color: '#000000', LineWidth: 1, IsShow: 'F', yAxisRef: 'F' }, BollingerBandsUP_DATE: { Name: '布林上軌', Type: 'Line', Color: '#FF8000', LineWidth: 1 }, BollingerBandsMA_DATE: { Name: '布林中軌', Type: 'Line', Color: '#0000FF', LineWidth: 1, Count: 20, Multiplier: 2 }, BollingerBandsDN_DATE: { Name: '布林下軌', Type: 'Line', Color: '#00CC00', LineWidth: 1 }, BollingerBandsUP_WEEK: { Name: '布林上軌', Type: 'Line', Color: '#FF8000', LineWidth: 1 }, BollingerBandsMA_WEEK: { Name: '布林中軌', Type: 'Line', Color: '#0000FF', LineWidth: 1, Count: 13, Multiplier: 2 }, BollingerBandsDN_WEEK: { Name: '布林下軌', Type: 'Line', Color: '#00CC00', LineWidth: 1 }, BollingerBandsUP_MONTH: { Name: '布林上軌', Type: 'Line', Color: '#FF8000', LineWidth: 1 }, BollingerBandsMA_MONTH: { Name: '布林中軌', Type: 'Line', Color: '#0000FF', LineWidth: 1, Count: 12, Multiplier: 2 }, BollingerBandsDN_MONTH: { Name: '布林下軌', Type: 'Line', Color: '#00CC00', LineWidth: 1 }, BollingerBandsUP_QUAR: { Name: '布林上軌', Type: 'Line', Color: '#FF8000', LineWidth: 1 }, BollingerBandsMA_QUAR: { Name: '布林中軌', Type: 'Line', Color: '#0000FF', LineWidth: 1, Count: 12, Multiplier: 2 }, BollingerBandsDN_QUAR: { Name: '布林下軌', Type: 'Line', Color: '#00CC00', LineWidth: 1 }, BollingerBandsUP_YEAR: { Name: '布林上軌', Type: 'Line', Color: '#FF8000', LineWidth: 1 }, BollingerBandsMA_YEAR: { Name: '布林中軌', Type: 'Line', Color: '#0000FF', LineWidth: 1, Count: 10, Multiplier: 2 }, BollingerBandsDN_YEAR: { Name: '布林下軌', Type: 'Line', Color: '#00CC00', LineWidth: 1 }, SAR: { Name: 'SAR', Type: 'Point', PointSize: 1.5, NormalColor: '#808080', RiseColor: '#FF00FF', FallColor: '#00FF00', nDays: 4, InitAF: 0.02, MaxAF: 0.2, DeltaAF: 0.02 }, IDX_TSE: { Name: '加權指數', Type: 'Line', LineWidth: 1, Color: '#0000FF' }, IDX_OTC: { Name: '櫃買指數', Type: 'Line', LineWidth: 1, Color: '#00FF00' }, } }, Volume: { PaintItems: { MA_DATE0: { Name: '月均量', Count: 20, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_DATE1: { Name: '季均量', Count: 60, 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: '3年均量', 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: '3年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR1: { Name: '10年均量', 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: '3年均量', Count: 3, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR1: { Name: '10年均量', 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' }, } }, VolumeDaily: { PaintItems: { MA_DATE0: { Name: '月均量', Count: 20, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_DATE1: { Name: '季均量', Count: 60, 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: '3年均量', 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: '3年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR1: { Name: '10年均量', 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: '3年均量', Count: 3, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR1: { Name: '10年均量', 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: 20, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_DATE1: { Name: '季均量', Count: 60, 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: '3年均量', 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: '3年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR1: { Name: '10年均量', 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: '3年均量', Count: 3, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR1: { Name: '10年均量', 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' }, } }, AmountDaily: { PaintItems: { MA_DATE0: { Name: '月均量', Count: 20, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_DATE1: { Name: '季均量', Count: 60, 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: '3年均量', 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: '3年均量', Count: 12, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_QUAR1: { Name: '10年均量', 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: '3年均量', Count: 3, Color: '#FF8000', LineWidth: 1.5, IsShow: 'T' }, MA_YEAR1: { Name: '10年均量', 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' }, WR3: { nDays: 0, LineWidth: 1, Color: '#0000FF', 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' } } }, ControllerBox: { Controller: { MinBarDistance: 0.01, Button: { ShiftCnt: 10, ShiftCnt2: 50, ZoomCnt: 10, ZoomCnt2: 50 } } }, }, CrossLineAndTipMgr: { ShowCrossLine: 'PriceClose', ShowTipMgr: 'F', TipMgrPosition: 'Hide', } }; // Start: Main Function ===================================================================================================================== function StockChart(oParms, oChartConfig, oChartOptions) { this.ChartConfig = oChartConfig; this.ChartOptions = oChartOptions; this.Parms = oParms; } StockChart.prototype = { Initialize: function (oPainter) { oPainter.ChartConfig = this.ChartConfig; oPainter.ChartOptions = this.ChartOptions; oPainter.Parms = this.Parms; oPainter.PaintImplement = this; }, Start: function () { }, End: function () { // Create Controller object PaintControllerBox(this, this.ChartOptions.ChartItems.ControllerBox); // 建立游標十字線及資訊框 CreateCrossLineAndTipMgrInstance(this, this.ChartOptions.CrossLineAndTipMgr); // 建立設定視窗 CreateConfigWindow(this); }, // 繪圖進入點 PaintItems: function () { var ChartOptions = this.ChartOptions; var ChartDisplayList = ChartOptions.ChartDisplayList; var ChartItems = ChartOptions.ChartItems; //重設ChratOptions的參數 ResetChartSizePos(this); //重設每個小圖的尺寸及位置 ResetShowRange(this); //重設顯示範圍的索引 // 開始繪圖 ClearCanvas(this, ChartOptions.ChartItems.ControllerBox); //清理畫布 InitLegend(ChartOptions.ChartItems); for (var i=0; i' + '' + '' + ''; // for general configuration sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + ''; // 設定KLine疊加指標 if ('KLine' in ChartOptions.ChartItems) { var ChartItem = ChartOptions.ChartItems.KLine; if ('PaintItems' in ChartItem) { var PaintItems = ChartItem.PaintItems; s0 = ''; s1 = ''; s2 = 'ChartConfig.Local.ChartItems.KLine.PaintOdr = [];'; //清空原始排序 if ('KLine' in PaintItems && PaintItems.KLine.IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_KLine_FirstDisplay'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr[0]=="KLine"?false:true);'; s2 = s2 + 'if (!' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("KLine"); }'; //K線最下層顯示 s = 'CFG_PaintOdr_KLine_PriceAccChg'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("PriceAccChg")<0?false:true);'; s2 = s2 + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("PriceAccChg"); }'; } //預設河流圖為顯示 if ('FLOW_PER0' in PaintItems && PaintItems['FLOW_PER0'].PaintGroup == 'FLOW_PER' || 'FLOW_PBR0' in PaintItems && PaintItems['FLOW_PBR0'].PaintGroup == 'FLOW_PBR' || 'FLOW_DR0' in PaintItems && PaintItems['FLOW_DR0'].PaintGroup == 'FLOW_DR') { s2 = s2 + 'ChartConfig.Local.ChartItems.KLine.PaintOdr.push("FLOW_PER");' + 'ChartConfig.Local.ChartItems.KLine.PaintOdr.push("FLOW_PBR");' + 'ChartConfig.Local.ChartItems.KLine.PaintOdr.push("FLOW_DR");'; } if ('MA_' + ChartOptions.ChartCat + '0' in PaintItems && PaintItems['MA_'+ChartOptions.ChartCat+'0'].PaintGroup == 'MA' && PaintItems['MA_'+ChartOptions.ChartCat+'0'].IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_MA'; s3 = 'if (\'CFG_PaintOdr_KLine_EMA\' in window && CFG_PaintOdr_KLine_EMA.checked && ' + s + '.checked)' + '{ CFG_PaintOdr_KLine_EMA.checked = false; }'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("MA")<0?false:true);'; s2 = s2 + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("MA"); }'; } if ('EMA_' + ChartOptions.ChartCat + '0' in PaintItems && PaintItems['EMA_'+ChartOptions.ChartCat+'0'].PaintGroup == 'EMA' && PaintItems['EMA_'+ChartOptions.ChartCat+'0'].IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_EMA'; s3 = 'if (\'CFG_PaintOdr_KLine_MA\' in window && CFG_PaintOdr_KLine_MA.checked && ' + s + '.checked)' + '{ CFG_PaintOdr_KLine_MA.checked = false; }'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("EMA")<0?false:true);'; s2 = s2 + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("EMA"); }'; } //顯示布林軌道 if ('BollingerBandsMA_' + ChartOptions.ChartCat in PaintItems && PaintItems['BollingerBandsMA_'+ChartOptions.ChartCat].PaintGroup == 'BollingerBands' && PaintItems['BollingerBandsMA_'+ChartOptions.ChartCat].IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_BollingerBands'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("BollingerBands")<0?false:true);'; s2 = s2 + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("BollingerBands"); }'; } //顯示SAR if ('SAR' in PaintItems && PaintItems.SAR.IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_SAR'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("SAR")<0?false:true);'; s2 = s2 + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("SAR"); }'; } var arr = [['IDX_TSE','加權指數'],['IDX_OTC','櫃買指數'],['AvgPrice','平均收盤價'], ['IDX_SH000001','上证指数'],['IDX_SZ399001','深证指数']]; for (var v of arr) { if (v[0] in PaintItems && PaintItems[v[0]].IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_' + v[0]; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("' + v[0] + '")<0?false:true);' + s + '_Color.value = ChartOptions.ChartItems.KLine.PaintItems.' + v[0] + '.Color;'; s2 = s2 + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("' + v[0] + '"); }' + 'if (!("' + v[0] + '" in ChartConfig.Local.ChartItems.KLine.PaintItems)) ChartConfig.Local.ChartItems.KLine.PaintItems.' + v[0] + ' = {};' + 'ChartConfig.Local.ChartItems.KLine.PaintItems.' + v[0] + '.Color = ' + s + '_Color.value;'; } } //K線最上層顯示 if ('KLine' in PaintItems && PaintItems.KLine.IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_KLine_FirstDisplay'; s2 = s2 + 'if (' + s + '.checked) {' + ' if (ChartConfig.Local.ChartItems.KLine.PaintOdr.length <= 0)' + ' { ChartConfig.Local.ChartItems.KLine.PaintOdr.push(""); }' + ' ChartConfig.Local.ChartItems.KLine.PaintOdr.push("KLine");' + '}'; } // 顯示最高最低價 if ('KLine' in PaintItems && PaintItems.KLine.ShowHighLow != 'AlwaysShow' && PaintItems.KLine.ShowHighLow != 'AlwaysHide') { s = 'CFG_KLine_KLine_ShowHighLow'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintItems.KLine.ShowHighLow=="F"?false:true);'; s2 = s2 + '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 = (' + s + '.checked?"T":"F");'; } //顯示除權息記號 if ('DividendFlag' in PaintItems && PaintItems.DividendFlag.IsShow != 'AlwaysShow' && PaintItems.DividendFlag.IsShow != 'AlwaysHide') { s = 'CFG_PaintOdr_KLine_DividendFlag'; s0 = s0 + '' + '' + ''; s1 = s1 + s + '.checked = (ChartItems.KLine.PaintOdr.indexOf("DividendFlag")<0?false:true);'; s2 = s2 + 'if (!("KLine" in ChartConfig.Local.ChartItems)) ChartConfig.Local.ChartItems.KLine = {};' + 'if (!("PaintItems" in ChartConfig.Local.ChartItems.KLine)) ChartConfig.Local.ChartItems.KLine.PaintItems = {};' + 'if (!("DividendFlag" in ChartConfig.Local.ChartItems.KLine.PaintItems)) ChartConfig.Local.ChartItems.KLine.PaintItems.DividendFlag = {};' + 'ChartConfig.Local.ChartItems.KLine.PaintItems.DividendFlag.IsShow = (' + s + '.checked?"T":"F");' + 'if (' + s + '.checked) { ChartConfig.Local.ChartItems.KLine.PaintOdr.push("DividendFlag"); }'; } //設定儲存內容 if (s0 != '') { sForm = sForm + ''; sLoad = sLoad + s1; sSave = sSave + s2 + 'for (var i=ChartConfig.Local.ChartItems.KLine.PaintOdr.length; i' + '' + '' + '' + ''; s2 = s2 + 'if (!("ChartDisplayList" in ChartConfig.Local)) { ChartConfig.Local.ChartDisplayList = []; }' + 'if (!("ChartHeightList" in ChartConfig.Local)) { ChartConfig.Local.ChartHeightList = []; }'; var iStart = 0, iEnd = (ChartItemList.indexOf('KLine1')>=0?ChartItemList.indexOf('KLine1'):ChartItemList.length)-1; //定義ChartItem取樣範圍 for (var i=0,iNo=0; i' + '' + '' + ''; s1 = s1 + 'CFG_ChartItem_Height' + i + '.value = ChartOptions.ChartHeightList[' + i + '];'; s2 = s2 + 'ChartConfig.Local.ChartHeightList[' + i + '] = Number(CFG_ChartItem_Height' + i + '.value);'; } s0 = s0 + '
' + '' + '' + ''; // 設定資料載入 if ('DataLoadLength' in ChartOptions) { sForm = sForm + ''; sLoad = sLoad + 'CFG_DataLoadLength.value = ChartOptions.DataLoadLength;' + 'if (!IsNumeric(CFG_DataLoadLength.value)) { CFG_DataLoadLength.value = "2500"; }'; sSave = sSave + 'ChartConfig.Global.DataLoadLength = Number(CFG_DataLoadLength.value);'; } // 設定起始顯示長度 if ('InitIndexLength' in ChartOptions && ChartOptions.IsFixedIndexLength != 'T') { sForm = sForm + ''; 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; }'; } if ('CrossLineAndTipMgr' in ChartOptions) { // 顯示浮動資訊框 if (ChartOptions.CrossLineAndTipMgr.ShowTipMgr != 'AlwaysShow' && ChartOptions.CrossLineAndTipMgr.ShowTipMgr != 'AlwaysHide') { sForm = sForm + ''; 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");'; } // 設定十字線落點 sForm = sForm + '' + ''; sLoad = sLoad + 'CFG_CrossLineAndTipMgr_ShowCrossLine.value = ChartOptions.CrossLineAndTipMgr.ShowCrossLine;' + 'if (CFG_CrossLineAndTipMgr_ShowCrossLine.value == "") { CFG_CrossLineAndTipMgr_ShowCrossLine.value = "Float"; }' + 'CFG_CrossLineAndTipMgr_CrossLineColor.value = ChartOptions.CrossLineAndTipMgr.CrossLineOptions.Color;'; sSave = sSave + 'if (!("CrossLineAndTipMgr" in ChartConfig.Global)) { ChartConfig.Global.CrossLineAndTipMgr = {}; }' + 'ChartConfig.Global.CrossLineAndTipMgr.ShowCrossLine = CFG_CrossLineAndTipMgr_ShowCrossLine.value;' + 'if (!("CrossLineOptions" in ChartConfig.Global.CrossLineAndTipMgr)) { ChartConfig.Global.CrossLineAndTipMgr.CrossLineOptions = {}; }' + 'ChartConfig.Global.CrossLineAndTipMgr.CrossLineOptions.Color = CFG_CrossLineAndTipMgr_CrossLineColor.value;'; } //顯示字體顏色設定值 sForm = sForm + ''; sLoad = sLoad + 'CFG_FontColor.value = ChartOptions.FontColor;'; sSave = sSave + 'ChartConfig.Global.FontColor = CFG_FontColor.value;'; //顯示背景色設定值 sForm = sForm + ''; sLoad = sLoad + 'CFG_BackgroundColor.value = (ChartOptions.BackgroundColor=="transparent"?"#ffffff":ChartOptions.BackgroundColor);'; sSave = sSave + 'ChartConfig.Global.BackgroundColor = (CFG_BackgroundColor.value=="#ffffff"?"transparent":CFG_BackgroundColor.value);'; // 顯示Controller按鈕設定值 if ('ControllerBox' in ChartOptions.ChartItems) { if ('Controller' in ChartOptions.ChartItems.ControllerBox) { var ControllerBox = ChartOptions.ChartItems.ControllerBox; if ((IsNumeric(ControllerBox.Region.ButtonHeight)?ControllerBox.Region.ButtonHeight:0) > 0 && 'Button' in ChartOptions.ChartItems.ControllerBox.Controller) { sForm = sForm + ''; sLoad = sLoad + 'CFG_CtrlShiftCnt.value = ChartOptions.ChartItems.ControllerBox.Controller.Button.ShiftCnt;'; s = (ChartOptions.Language=='CN'?'K线图位移数设定值必须是数字且大于零,请重新输入。':'K線圖位移數設定值必須是數字且大於零,請重新輸入。'); sSave = sSave + 'if (IsNumeric(CFG_CtrlShiftCnt.value) && CFG_CtrlShiftCnt.value > 0) ' + '{ ChartConfig.Global.ChartItems.ControllerBox.Controller.Button.ShiftCnt = Number(CFG_CtrlShiftCnt.value); }' + 'else { alert("' + s + '"); return false; }'; sForm = sForm + ''; sLoad = sLoad + 'CFG_CtrlShiftCnt2.value = ChartOptions.ChartItems.ControllerBox.Controller.Button.ShiftCnt2;'; s = (ChartOptions.Language=='CN'?'K线图位移数设定值必须是数字且大于零,请重新输入。':'K線圖位移數設定值必須是數字且大於零,請重新輸入。'); sSave = sSave + 'if (IsNumeric(CFG_CtrlShiftCnt2.value) && CFG_CtrlShiftCnt2.value > 0) ' + '{ ChartConfig.Global.ChartItems.ControllerBox.Controller.Button.ShiftCnt2 = Number(CFG_CtrlShiftCnt2.value); }' + 'else { alert("' + s + '"); return false; }'; sForm = sForm + ''; sLoad = sLoad + 'CFG_CtrlZoomCnt.value = ChartOptions.ChartItems.ControllerBox.Controller.Button.ZoomCnt;'; s = (ChartOptions.Language=='CN'?'K线图缩放数设定值必须是数字且大于零,请重新输入。':'K線圖縮放數設定值必須是數字且大於零,請重新輸入。'); sSave = sSave + 'if (IsNumeric(CFG_CtrlZoomCnt.value) && CFG_CtrlZoomCnt.value > 0) ' + '{ ChartConfig.Global.ChartItems.ControllerBox.Controller.Button.ZoomCnt = Number(CFG_CtrlZoomCnt.value); }' + 'else { alert("' + s + '"); return false; }'; sForm = sForm + ''; sLoad = sLoad + 'CFG_CtrlZoomCnt2.value = ChartOptions.ChartItems.ControllerBox.Controller.Button.ZoomCnt2;'; s = (ChartOptions.Language=='CN'?'K线图缩放数设定值必须是数字且大于零,请重新输入。':'K線圖縮放數設定值必須是數字且大於零,請重新輸入。'); sSave = sSave + 'if (IsNumeric(CFG_CtrlZoomCnt2.value) && CFG_CtrlZoomCnt2.value > 0) ' + '{ ChartConfig.Global.ChartItems.ControllerBox.Controller.Button.ZoomCnt2 = Number(CFG_CtrlZoomCnt2.value); }' + 'else { alert("' + s + '"); return false; }'; } } } /* // 顯示波段高低點以及設定波段計算週期 if ('KLine' in ChartOptions.ChartItems) { if ('KLine' in ChartOptions.ChartItems.KLine.PaintItems) { if ('BandTag' in ChartOptions.ChartItems.KLine.PaintItems.KLine) { //顯示波段高低點 sForm = sForm + ''; 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 + ''; 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 + '
' + (ChartOptions.Language=='CN'?'一 般 设 置':'一 般 設 定') + '
' + (ChartOptions.Language=='CN'?'资料载入量:':'資料載入量:') + '' + '
' + (ChartOptions.Language=='CN'?'K线图显示笔数:':'K線圖顯示筆數:') + '' + '
' + (ChartOptions.Language=='CN'?'浮动资讯框位置':'浮動資訊框位置') + ':' + '
' + (ChartOptions.Language=='CN'?'十字线落点':'十字線落點') + ':' + '
' + (ChartOptions.Language=='CN'?'十字线颜色':'十字線顏色') + ':' + '' + '
' + (ChartOptions.Language=='CN'?'字体颜色':'字體顏色') + ':' + '' + '
' + (ChartOptions.Language=='CN'?'背景颜色':'背景顏色') + ':' + '' + '
' + '' + ' ' + (ChartOptions.Language=='CN'?'位移数:':'位移數:') + '' + '
' + '' + ' ' + (ChartOptions.Language=='CN'?'位移数:':'位移數:') + '' + '
' + '' + ' ' + (ChartOptions.Language=='CN'?'缩放数:':'縮放數:') + '' + '
' + '' + ' ' + (ChartOptions.Language=='CN'?'缩放数:':'縮放數:') + '' + '
' + (ChartOptions.Language=='CN'?'显示波段高低点':'顯示波段高低點') + ':' + '
' + (ChartOptions.Language=='CN'?'波段计算周期':'波段計算週期') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + '):' + '
' + (ChartOptions.Language=='CN'?'K线在最上层显示':'K線在最上層顯示') + '
' + (ChartOptions.Language=='CN'?'累计迄今涨跌价/幅':'累計迄今漲跌價/幅') + '
' + (ChartOptions.Language=='CN'?'移动平均线':'移動平均線') + '
' + (ChartOptions.Language=='CN'?'平滑移动平均线':'平滑移動平均線') + '
布林軌道
SAR
' + '' + v[1] + '  ' + '' + '
' + (ChartOptions.Language=='CN'?'最高/最低价':'最高/最低價') + '
' + (ChartOptions.Language=='CN'?'除权息记号':'除權息記號') + '
' + '' + '' + '' + '' + '' + s0 + '
' + (ChartOptions.Language=='CN'?'K线图叠加指标':'K線圖疊加指標') + '
' + (ChartOptions.Language=='CN'?'显示':'顯示') + '' + (ChartOptions.Language=='CN'?'指标名称':'指標名稱') + '
' + (ChartOptions.Language=='CN'?'子 图 显 示':'子 圖 顯 示') + '
名 稱高度比清除
'; if (sID in ChartItems && (sID == 'KLine' || sID == 'KLine1')) { s0 = s0 + '':'>') + ''; 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; s0 = s0 + ''; } s1 = s1 + 'CFG_ChartItem_Show' + i + '.value = ChartOptions.ChartDisplayList[' + i + '];'; s2 = s2 + 'ChartConfig.Local.ChartDisplayList[' + i + '] = CFG_ChartItem_Show' + i + '.value;'; } s0 = s0 + '
'; if (s0 != '') { // for 子圖顯示設定 if (conMobileMode) { sForm = sForm + '' + s0 + '' } else { sForm = sForm + '' + s0 + ''; } sLoad = sLoad + s1; sSave = sSave + s2; } sForm = sForm + ''; // end of general configuration // 建立K線設定框 var s0 = '', s1 = '', s2 = ''; if ('KLine' in ChartOptions.ChartItems) { if ('KLine' in ChartOptions.ChartItems.KLine.PaintItems) { s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '' + (ChartOptions.Language=='CN'?'K线设置':'K線設定') + '
  ' + (ChartOptions.Language=='CN'?'项目':'項目') + '  ' + (ChartOptions.Language=='CN'?'框线颜色':'框線顏色') + '' + (ChartOptions.Language=='CN'?'柱体颜色':'柱體顏色') + '
' + (ChartOptions.Language=='CN'?'上涨':'上漲') + '
下跌
' + (ChartOptions.Language=='CN'?'平盘':'平盤') + ' 
'; s1 = s1 + 'CFG_K_Stick_RiseColor.value = ChartOptions.ChartItems.KLine.PaintItems.KLine.RiseColor;' + 'CFG_K_Stick_RiseFillColor.value = ChartOptions.ChartItems.KLine.PaintItems.KLine.RiseFillColor;' + 'CFG_K_Stick_FallColor.value = ChartOptions.ChartItems.KLine.PaintItems.KLine.FallColor;' + 'CFG_K_Stick_FallFillColor.value = ChartOptions.ChartItems.KLine.PaintItems.KLine.FallFillColor;' + 'CFG_K_Stick_UnchangedColor.value = ChartOptions.ChartItems.KLine.PaintItems.KLine.UnchangedColor;'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.RiseColor = CFG_K_Stick_RiseColor.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.RiseFillColor = CFG_K_Stick_RiseFillColor.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.FallColor = CFG_K_Stick_FallColor.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.FallFillColor = CFG_K_Stick_FallFillColor.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.KLine.UnchangedColor = CFG_K_Stick_UnchangedColor.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("#","");'; 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;'; } */ } } if (s0 != '') { // for K線設定 sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立價格均線設定框 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 + '' + '' + '' + '' + '' + ''; 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");' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.E' + item + '.Name = String(CFG_KLine_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.E' + 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.E' + item + '.Color = CFG_KLine_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.E' + 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;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.E' + item + '.Color = "#"+CFG_KLine_' + item + '_Color.value;'; } } } if (sTmp != '') { s0 = s0 + (s0==''?'':'') + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + sTmp + '' + '
' + (ChartOptions.Language=='CN'?'价格移动平均线':'價格移動平均線') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + ')
' + (ChartOptions.Language=='CN'?'名称':'名稱') + '' + (ChartOptions.Language=='CN'?'数值':'數值') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
' + '' + '' + '' + '' + '' + '
 ' + (ChartOptions.Language=='CN'?'显示均线扣抵位置':'顯示均線扣抵位置') + ':
 ' + (ChartOptions.Language=='CN'?'乖离率计算参考价':'乖離率計算參考價') + ':
' + '
' + ''; 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 = '', s00 = ''; 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 + '' + '' + '' + '' + '' + ''; 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");' + 'ChartConfig.Global.ChartItems.VolumeDaily.PaintItems.' + item + '.Name = String(CFG_Volume_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.VolumeDaily.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.VolumeDaily.PaintItems.' + item + '.Color = CFG_Volume_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.VolumeDaily.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;' + 'ChartConfig.Global.ChartItems.VolumeDaily.PaintItems.' + item + '.Color = "#"+CFG_Volume_' + item + '_Color.value;'; } } } if (sTmp != '') { s00 = s00 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + sTmp + '
' + (ChartOptions.Language=='CN'?'成交量移动平均线':'成交張數移動平均線') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + ')
' + (ChartOptions.Language=='CN'?'名称':'名稱') + '' + (ChartOptions.Language=='CN'?'数值':'數值') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
'; } } // 建立成交金額均線設定框 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 + '' + '' + '' + '' + '' + ''; 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");' + 'ChartConfig.Global.ChartItems.AmountDaily.PaintItems.' + item + '.Name = String(CFG_Amount_' + item + '_Name.value).trim();' + 'ChartConfig.Global.ChartItems.AmountDaily.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.AmountDaily.PaintItems.' + item + '.Color = CFG_Amount_' + item + '_Color.value;' + 'ChartConfig.Global.ChartItems.AmountDaily.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;' + 'ChartConfig.Global.ChartItems.AmountDaily.PaintItems.' + item + '.Color = "#"+CFG_Amount_' + item + '_Color.value;'; } } } if (sTmp != '') { s00 = s00 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + sTmp + '
' + (ChartOptions.Language=='CN'?'成交额移动平均线':'成交金額移動平均線') + '(' + TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language) + ')
' + (ChartOptions.Language=='CN'?'名称':'名稱') + '' + (ChartOptions.Language=='CN'?'数值':'數值') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
'; } } // 建立月營收均線設定框 var sTmp = ''; if ('MonthlyRevenue' in ChartOptions.ChartItems && String(ChartOptions.AspNM).toUpperCase() == String('ShowSaleMonChart.data').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 + '' + '' + '' + '' + '' + ''; 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 != '') { s00 = s00 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + sTmp + '
' + (ChartOptions.Language=='CN'?'月营收移动平均线':'月營收移動平均線') + '
' + (ChartOptions.Language=='CN'?'名称':'名稱') + '' + (ChartOptions.Language=='CN'?'数值':'數值') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
'; } } s0 = s0 + (s0==''?'':'') + '' + s00 + ''; // for 價格 & 量能 & 月營收移動平均線 if (s0 != '') { sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + '
'; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立 KD 設定框 var s0 = '', s1 = '', s2 = ''; if ('KD' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'KD' + (ChartOptions.Language=='CN'?'指标':'指標') + '
' + (ChartOptions.Language=='CN'?'项目':'項目') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
 K值
 D值
 J值
 RSV
 KD' + (ChartOptions.Language=='CN'?'周期':'週期') + ' ' + sTimeStr + ' 
'; 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;'; } } if (s0 != '') { // for KD sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立 OBV 設定框 var s0 = '', s1 = '', s2 = ''; if ('OBV' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'OBV' + (ChartOptions.Language=='CN'?'指标':'指標') + '
 OBV
 ' + (ChartOptions.Language=='CN'?'OBV均线':'OBV均線') + '
 ' + (ChartOptions.Language=='CN'?'均线周期':'均線週期') + ' ' + sTimeStr + ' 
'; 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;'; } } if (s0 != '') { // for OBV sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立 RSI 設定框 var s0 = '', s1 = '', s2 = ''; if ('RSI' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'RSI ' + (ChartOptions.Language=='CN'?'指标':'指標') + '
 短天期:' + ' ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'长天期':'長天期') + ':' + ' ' + sTimeStr + ' 
'; 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 (s0 != '') { // for RSI sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立 威廉指標 設定框 var s0 = '', s1 = '', s2 = ''; if ('WilliamsR' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + ''; var i = 0; for (var item in ChartOptions.ChartItems.WilliamsR.PaintItems) { if (UCase(item) == 'WR1' || UCase(item) == 'WR2') { i++; s0 = s0 + '' + '' + ''; s1 = s1 + 'CFG_' + item + '_nDAYS.value = ChartOptions.ChartItems.WilliamsR.PaintItems.' + item + '.nDays;'; s2 = s2 + 'ChartConfig.Global.ChartItems.WilliamsR.PaintItems.' + item + '.nDays = CFG_' + item + '_nDAYS.value;'; } } s0 = s0 + '
' + '威廉' + (ChartOptions.Language=='CN'?'指标':'指標') + '
 ' + (ChartOptions.Language=='CN'?'指标':'指標') + i + ':' + ' ' + sTimeStr + ' 
'; } if (s0 != '') { // for 威廉指標 sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; 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 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'MACD' + (ChartOptions.Language=='CN'?'指标':'指標') + '
' + (ChartOptions.Language=='CN'?'项目':'項目') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
 DIF
 MACD
 OSC(+)
 OSC(-)
 短期EMA ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'长期EMA':'長期EMA') + ' ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'MACD周期':'MACD週期') + ' ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'OSC倍数':'OSC倍數') + ' 倍 
'; 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;'; } } if (s0 != '') { // for MACD sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立 DMI 設定框 var s0 = '', s1 = '', s2 = ''; if ('DMI' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'DMI' + (ChartOptions.Language=='CN'?'指标':'指標') + '
' + (ChartOptions.Language=='CN'?'项目':'項目') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '' + (ChartOptions.Language=='CN'?'显示':'顯示') + '
 +DI
 -DI
 ADX
 ADXR
 ' + (ChartOptions.Language=='CN'?'DI周期':'DI週期') + ' ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'ADX周期':'ADX週期') + ' ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'ADXR周期':'ADXR週期') + ' ' + sTimeStr + ' 
'; 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 DMI sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; 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 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '' + (ChartOptions.Language=='CN'?'布林轨道':'布林軌道') + '(' + sTimeStr + ')
 ' + (ChartOptions.Language=='CN'?'上轨颜色':'上軌顏色') + '
 ' + (ChartOptions.Language=='CN'?'中轨颜色':'中軌顏色') + '
 ' + (ChartOptions.Language=='CN'?'下轨颜色':'下軌顏色') + '
 ' + (ChartOptions.Language=='CN'?'均线周期':'均線週期') + ' ' + sTimeStr + ' 
 ' + (ChartOptions.Language=='CN'?'轨道乘数':'軌道乘數') + ' 倍 
'; 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;' + 'if (IsNumeric(CFG_BollingerBandsMultiplier.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;'; } } if (s0 != '') { // for BollingerBandsMA sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立MTM動量指標設定框 var s0 = '', s1 = '', s2 = ''; if ('MTM' in ChartOptions.ChartItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'MTM' + (ChartOptions.Language=='CN'?'動量指標':'動量指標') + '(' + sTimeStr + ')
' + (ChartOptions.Language=='CN'?'项目':'項目') + '' + (ChartOptions.Language=='CN'?'数值':'數值') + '' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '
 MTM
 ' + (ChartOptions.Language=='CN'?'均线':'均線') + '
'; 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 sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // 建立SAR設定框 var s0 = '', s1 = '', s2 = ''; if ('KLine' in ChartOptions.ChartItems && 'SAR' in ChartOptions.ChartItems.KLine.PaintItems) { var sTimeStr = TimeStrMap(ChartOptions.ChartCat,ChartOptions.Language); s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + 'SAR' + (ChartOptions.Language=='CN'?'设定':'設定') + '
 ' + (ChartOptions.Language=='CN'?'涨势颜色':'漲勢顏色') + '
 ' + (ChartOptions.Language=='CN'?'跌势颜色':'跌勢顏色') + '
 SAR' + (ChartOptions.Language=='CN'?'周期':'週期') + ' ' + sTimeStr + ' 
 起始值 
 ' + (ChartOptions.Language=='CN'?'增加单位':'增加單位') + ' 
 最大值 
'; s1 = s1 + 'CFG_SAR_UP_Color.value = ChartOptions.ChartItems.KLine.PaintItems.SAR.RiseColor;' + 'CFG_SAR_DN_Color.value = ChartOptions.ChartItems.KLine.PaintItems.SAR.FallColor;' + 'CFG_SAR_nDays.value = ChartOptions.ChartItems.KLine.PaintItems.SAR.nDays;' + 'CFG_SAR_InitAF.value = ChartOptions.ChartItems.KLine.PaintItems.SAR.InitAF;' + 'CFG_SAR_DeltaAF.value = ChartOptions.ChartItems.KLine.PaintItems.SAR.DeltaAF;' + 'CFG_SAR_MaxAF.value = ChartOptions.ChartItems.KLine.PaintItems.SAR.MaxAF;'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.RiseColor = CFG_SAR_UP_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.FallColor = CFG_SAR_DN_Color.value;' + 'if (IsNumeric(CFG_SAR_nDays.value)) ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.nDays = CFG_SAR_nDays.value;' + 'if (IsNumeric(CFG_SAR_InitAF.value)) ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.InitAF = CFG_SAR_InitAF.value;' + 'if (IsNumeric(CFG_SAR_DeltaAF.value)) ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.DeltaAF = CFG_SAR_DeltaAF.value;' + 'if (IsNumeric(CFG_SAR_MaxAF.value)) ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.MaxAF = CFG_SAR_MaxAF.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_SAR_UP_Color.style.color = ChartOptions.ChartItems.KLine.PaintItems.SAR.RiseColor;' + 'CFG_SAR_UP_Color.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems.SAR.RiseColor;' + 'CFG_SAR_UP_Color.value = String(ChartOptions.ChartItems.KLine.PaintItems.SAR.RiseColor).replace("#","");' + 'CFG_SAR_DN_Color.style.color = ChartOptions.ChartItems.KLine.PaintItems.SAR.FallColor;' + 'CFG_SAR_DN_Color.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems.SAR.FallColor;' + 'CFG_SAR_DN_Color.value = String(ChartOptions.ChartItems.KLine.PaintItems.SAR.FallColor).replace("#","");'; s2 = s2 + 'ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.RiseColor = "#"+CFG_SAR_UP_Color.value;' + 'ChartConfig.Global.ChartItems.KLine.PaintItems.SAR.FallColor = "#"+CFG_SAR_DN_Color.value;'; } } if (s0 != '') { // for SAR sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } //河流圖 var s0 = '', s1 = '', s2 = ''; if (String(ChartOptions.AspNM).toUpperCase() == String('ShowK_ChartFlow.data').toUpperCase() && ('FlowSetPER' in ChartItems.KLine || 'FlowSetPBR' in ChartItems.KLine || 'FlowSetDR' in ChartItems.KLine)) { if ('FlowSetPER' in ChartItems.KLine) { s = 'PER'; var j = 5; } if ('FlowSetPBR' in ChartItems.KLine) { s = 'PBR'; var j = 5; } if ('FlowSetDR' in ChartItems.KLine) { s = 'DR'; var j = 8; } sTmp = ChartOptions.ChartItems.KLine['FlowSet' + s].UseDefault; s0 = s0 + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; s2 = s2 + 'if (!("FlowSet' + s + '" in ChartConfig.Local.ChartItems.KLine)) { ChartConfig.Local.ChartItems.KLine.FlowSet' + s + ' = {}; }' + 'if (!("Cust' + s + '" in ChartConfig.Local.ChartItems.KLine.FlowSet' + s + ')) { ChartConfig.Local.ChartItems.KLine.FlowSet' + s + '.Cust' + s + ' = []; }' + 'ChartConfig.Local.ChartItems.KLine.FlowSet' + s + '.UseDefault = (CFG_FLOW_' + s + '_DEFAULT.checked?"T":"F");' for (var i=0;i<=j;i++) { s0 = s0 + '' + '' + '' + '' + ''; s1 = s1 + 'CFG_FLOW_' + s + '_DEFAULT.checked = ' + (sTmp=='T'?'true':'false') + ';' + 'CFG_FLOW_' + s + '_CUSTOMIZE.checked = ' + (sTmp=='T'?'false':'true') + ';' + 'CFG_FLOW_' + s + '_RATIO_' + i + '.disabled = (ChartOptions.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Name=="均線"?true:false);' + 'CFG_FLOW_' + s + '_RATIO_' + i + '.value = ChartOptions.ChartItems.KLine.FlowSet' + s + '.Cust' + s + '[' + i + '];' + 'CFG_FLOW_' + s + '_COLOR_' + i + '.value = ChartOptions.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Color;'; s2 = s2 + 'if (IsNumeric(CFG_FLOW_' + s + '_RATIO_' + i + '.value)) ChartConfig.Local.ChartItems.KLine.FlowSet' + s + '.Cust' + s + '[' + i + '] = CFG_FLOW_' + s + '_RATIO_' + i + '.value;' + 'if (!("FLOW_' + s + i + '" in ChartConfig.Local.ChartItems.KLine.PaintItems)) { ChartConfig.Local.ChartItems.KLine.PaintItems.FLOW_' + s + i + ' = {}; }' + 'ChartConfig.Local.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Color = CFG_FLOW_' + s + '_COLOR_' + i + '.value;'; if (!Browser.Support.InputColor) { s1 = s1 + 'CFG_FLOW_' + s + '_COLOR_' + i + '.style.color = ChartOptions.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Color;' + 'CFG_FLOW_' + s + '_COLOR_' + i + '.style.backgroundColor = ChartOptions.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Color;' + 'CFG_FLOW_' + s + '_COLOR_' + i + '.value = String(ChartOptions.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Color).replace("#","");'; s2 = s2 + 'ChartConfig.Local.ChartItems.KLine.PaintItems.FLOW_' + s + i + '.Color = "#"+CFG_FLOW_' + s + '_COLOR_' + i + '.value;'; } } s0 = s0 + '
' + '' + (s=='DR'?'河流圖乖離率':s+(ChartOptions.Language=='CN'?'河流图倍率':'河流圖倍率')) + '
 
 
' + (ChartOptions.Language=='CN'?'项目':'項目') + '' + (ChartOptions.Language=='CN'?'自订值':'自訂值') + '(' + (s=='DR'?'%':'倍') + ')' + (ChartOptions.Language=='CN'?'颜色':'顏色') + '
' + (ChartOptions.Language=='CN'?'线':'線') + (i+1) + '
'; } if (s0 != '') { // for 河流圖 sCfgDlgList = sCfgDlgList + ''; sForm = sForm + '' + s0 + ''; sLoad = sLoad + s1; sSave = sSave + s2; } // Main Form 結尾 sForm = sForm + ''; // 建立儲存程式碼 sSave = sSave + 'function CB_SaveChartConfig(result) {' + ' if (!result.result) alert(result.responseText);' + ' else if (result.responseText.substr(0,3) == "錯誤:") alert(result.responseText.substr(3));' + ' if (CFG_Reload.value=="T") { location.reload(true); return; }' + ' if (true || ChartConfig.Global.InitIndexLength != StockPainter.ChartOptions.InitIndexLength) { ' + ' var iRecordCount = StockPainter.Data.RecordCount;' + ' var d = 100-(iRecordCount<=1?0:100*(iRecordCount-Math.min(ChartConfig.Global.InitIndexLength,iRecordCount))/(iRecordCount-1));' + ' var e = StockPainter.ChartOptions.ShowEnd;' + ' var s = e - d;' + ' if (s < 0) { e = e + Math.abs(s); }' + ' StockPainter.ChartOptions.ShowStart = (s<0?0:s);' + ' StockPainter.ChartOptions.ShowEnd = (e>100?100:e);' + ' }' + ' InitData(StockPainter.Data, StockPainter.ChartOptions, StockPainter.ChartConfig);' + ' RepaintStockChart(StockPainter);' + ' document.getElementById("' + sDivID + '").style.display="none";' + ' document.getElementById("' + sChtCfgMaskID + '").style.display = "none";' + ' document.body.style.cursor = "default";' + '}' + 'document.body.style.cursor = "progress";' + 'CallXMLHttp("POST","PersonalSetting2' + (ChartOptions.Language=='TW'?'':'.'+LCase(ChartOptions.Language)) + '.asp","STEP=SAVE_CHART_CONFIG&ASP_NM="+escape(UCase(StockPainter.ChartOptions.AspNM))+"&CHART_CONFIG_GLOBAL="+escape(JSON.stringify(ChartConfig.Global))+"&CHART_CONFIG_LOCAL="+escape(JSON.stringify(ChartConfig.Local)),CB_SaveChartConfig);'; // 建立儲存取消鈕 sForm = sForm + '' + '' + '
' + '' + '' + '' + '' + '' + '
'; // 建立Login警告說明 if (false != true) { sForm = sForm + '' + '' + '
' + (ChartOptions.Language=='TW'?'由於您未登入本網站, 您的線圖設定只能儲存於此部電腦, 無法跟隨您的帳號帶到其他電腦使用, 請使用時多加留意。':'') + (ChartOptions.Language=='CN'?'由于您未登录本网站, 您的线图设定只能储存于此部电脑, 无法跟随您的帐号带到其他电脑使用, 请使用时多加留意。':'') + '
'; } s = 'document.getElementById(CurChtCfgDlg.value).style.display = "none";' + 'document.getElementById(this.value).style.display = "";' + 'CurChtCfgDlg.value = this.value;'; oDiv.innerHTML = '' + '' + '' + '
設定項目: 
' + sForm + '
'; } else { oDiv = document.getElementById(sDivID); } //設定遮罩 if (!(sChtCfgMaskID in window)) { oChtCfgMask = document.createElement('DIV'); oChtCfgMask.id = sChtCfgMaskID; oChtCfgMask.style.cssText = 'display:none;width:100%;background:rgba(0,0,0,0.3);position:fixed;top:0;left:0;height:100000px;'; oChtCfgMask.style.zIndex = 21 + parseInt(oPainter.Canvas.style.zIndex || 1); document.body.appendChild(oChtCfgMask); } // 建立設定鈕 if (!(sButtonID in window)) { sLoad = 'if (document.getElementById("' + sDivID + '").style.display!="") { ' + sLoad + ' document.getElementById("' + sDivID + '").style.display = ""; ' + ' document.getElementById("' + sChtCfgMaskID + '").style.display = ""; ' + '} else { ' + ' document.getElementById("' + sDivID + '").style.display = "none"; ' + ' document.getElementById("' + sChtCfgMaskID + '").style.display = "none"; ' + '} '; oButton = document.createElement('DIV'); oButton.id = sButtonID; oButton.style.cssText = 'padding:0;'; oButton.style.zIndex = 22 + parseInt(oPainter.Canvas.style.zIndex || 1); oButton.style.position = 'absolute'; oButton.innerHTML = ''; 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 + 6) + 'px'; oDiv.style.top = (CanvasPosition.y + 4 + 20) + 'px'; } // End of CreateConfigWindow ================================================================================================================ 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 sChartType = NVL(ChartItem.Type,''); 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, sChartType) { if (v == null || h == null || l == null) { return null; } else if (v > h) { return 0; } else if (v < l) { return fChartHeight; } else if (sChartType == 'Log') { var vv = (Round(v,8)==0?0:Math.log10(v)); var ll = (Round(l,8)==0?0:Math.log10(l)); var hh = (Round(h,8)==0?0:Math.log10(h)); return (fChartHeight - fChartHeight * (vv - ll) / (hh - ll)); } else { return (fChartHeight - fChartHeight * (v - l) / (h - l)); } } function GetColor(v, PaintItem) { v = Round(v,16) if (v > 0 && 'RiseColor' in PaintItem) { return PaintItem.RiseColor; } else if (v < 0 && 'FallColor' in PaintItem) { return PaintItem.FallColor; } else if (v == 0 && 'UnchangedColor' in PaintItem) { return PaintItem.UnchangedColor; } 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'; } } function GetFillColor(v, PaintItem) { v = Round(v,16) if (v > 0 && 'RiseFillColor' in PaintItem) { return PaintItem.RiseFillColor; } else if (v < 0 && 'FallFillColor' in PaintItem) { return PaintItem.FallFillColor; } else if (v == 0 && 'UnchangedFillColor' in PaintItem) { return PaintItem.UnchangedFillColor; } else if ('NormalFillColor' in PaintItem) { return PaintItem.NormalFillColor; } else if ('RiseFillColor' in PaintItem) { return PaintItem.RiseFillColor; } else if ('FillColor' in PaintItem) { return PaintItem.FillColor; } 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 (PaintItem.yAxisRef == 'F') { /* 什麼都不做 */ } else if (PaintItem.yAxisAlign in ChartItem && PaintItem.IsShow != 'F' && PaintItem.IsShow != 'AlwaysHide' && (!ChartItem.PaintOdr || TypeName(ChartItem.PaintOdr) == '[object String]' || ChartItem.PaintOdr.indexOf(PaintItem.ID) > -1 || ChartItem.PaintOdr.indexOf(PaintItem.PaintGroup) > -1)) { 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軸高低點 if (IsNumeric(yAxisTmp.ScalesSpace)) { var fSpace = yAxisTmp.ScalesSpace; } else { var fSpace = getScalesSpace(low, high, ChartItem.HLineCount*(sChartType=='Log'?10:1)); } yAxisTmp.Space = fSpace * (sChartType=='Log'?10:1); for (var i=0; i<=high; i=i+fSpace); if ('KLine' in PaintItems && Round(i-fSpace*0.9,3) <= Round(high,3)) { if (PaintItems.KLine.ShowHighLow == 'T') i = i + fSpace; } if (yAxisTmp.LimitAxisHigh != null && i > yAxisTmp.LimitAxisHigh) i = yAxisTmp.LimitAxisHigh; if (yAxisTmp.BestAxisHigh != null && high >= yAxisTmp.BestAxisHigh) i = yAxisTmp.BestAxisHigh; yAxisTmp.AxisHigh = i; for (var i=yAxisTmp.AxisHigh; i>=low; i=i-fSpace); if ('KLine' in PaintItems && Round(i+fSpace*0.6,3) >= Round(low,3)) { if (PaintItems.KLine.ShowHighLow == 'T') 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, (ChartOptions.FontColor?ChartOptions.FontColor:xAxis.Color), xAxis.TextBaseline, xAxis.Align); } } } //畫主K線圖的水平底紋線 & 左右y軸文字 function yAxisPaint(v, high, low, iRound, yAxisTmp, sAxisName, sChartType) { if (v > high || v < low) return; var y = GetY(v, high, low, sChartType); 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, (ChartOptions.FontColor?ChartOptions.FontColor:yAxisTmp.Color), yAxisTmp.TextBaseline, yAxisTmp.Align); } else if (yAxisTmp.BigNumberToText == 'T') { oPainter.drawText(bigNumberToText(v,2), x, y, yAxisTmp.Font, (ChartOptions.FontColor?ChartOptions.FontColor:yAxisTmp.Color), yAxisTmp.TextBaseline, yAxisTmp.Align); } else if (IsNumeric(iRound)) { oPainter.drawText(Number(v).toFixed(iRound), x, y, yAxisTmp.Font, (ChartOptions.FontColor?ChartOptions.FontColor:yAxisTmp.Color), yAxisTmp.TextBaseline, yAxisTmp.Align); } else { oPainter.drawText(Round(v,2), x, y, yAxisTmp.Font, (ChartOptions.FontColor?ChartOptions.FontColor: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], sChartType); } } 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], sChartType); } } } } // 正式畫圖 var PaintItemList = []; var PaintItemKeys = Object.keys(PaintItems); if ('PaintOdr' in ChartItem && Object.prototype.toString.call(ChartItem.PaintOdr) == '[object Array]') { //以特定順序畫圖 for (var i=0; i=0; j--) { if (PaintItems[PaintItemKeys[j]].PaintGroup == ChartItem.PaintOdr[i]) { if (PaintItemList.indexOf(PaintItemKeys[j]) < 0) { PaintItemList.push(PaintItemKeys[j]); } } } } else { if (PaintItemList.indexOf(ChartItem.PaintOdr[i]) < 0) { PaintItemList.push(ChartItem.PaintOdr[i]); } } } } else if ('PaintOdr' in ChartItem && String(ChartItem.PaintOdr).toUpperCase() == 'DESC') { //以反向順序畫圖 for (var i = PaintItemKeys.length - 1; i >= 0; i--) PaintItemList.push(PaintItemKeys[i]); } else { //以正向順序畫圖 PaintItemList = Array.from(PaintItemKeys); } 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; } 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 f = Records[Fields.Close][i]-Records[Fields.Open][i]; var sColor = GetColor(f, PaintItem); var sFillColor = GetFillColor(f, PaintItem); } else { var sColor = GetColor(0, PaintItem); var sFillColor = GetFillColor(0, PaintItem); } var fLineX = GetX(i - ChartOptions.IndexStart); var fTopY = GetY(Records[Fields.High][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType); var fBottomY = GetY(Records[Fields.Low][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType); 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, sChartType); fCandleHeight = GetY(Records[Fields.Open][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType) - fCandleY; } else { fCandleY = GetY(Records[Fields.Open][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType); fCandleHeight = GetY(Records[Fields.Close][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType) - fCandleY; } if (fCandleHeight < 1) { fCandleHeight = 1; } oPainter.drawRect(fLineX-(fBarWidth-1)/2, fCandleY+0.5, fBarWidth-1, fCandleHeight-1, 1, sColor, sFillColor); } 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 = Round(Records[Fields.High][i],3.2,true); 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 = Round(Records[Fields.Low][i],3.2,true); 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, sChartType); 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, sChartType); var h = GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType) - 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, sChartType); var h = GetY(fLast, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType) - 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, sChartType)); 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, sChartType); ctx.lineTo(x, y); } ctx.lineTo(GetX(ChartOptions.IndexEnd - ChartOptions.IndexStart), GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType)); ctx.moveTo(GetX(0), GetY(0, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType)); ctx.stroke(); ctx.fillStyle = PaintItem.Color; ctx.fill(); ctx.globalAlpha = 1; } //End of Area else if (PaintItem.Type == 'Point') { //Start of Point var sField = PaintItem.Fields.Field; //取得欄位名稱 var sColorField = PaintItem.Fields.ColorField; //取得決定色彩的欄位名稱 var fPointSize = PaintItem.PointSize; for (var i = ChartOptions.IndexStart; i <= ChartOptions.IndexEnd; i++) { var x = GetX(i - ChartOptions.IndexStart); var y = GetY(Records[sField][i]*iReverse, yAxisTmp.AxisHigh, yAxisTmp.AxisLow, sChartType); if (sColorField == null) { sColor = ('Color' in PaintItem?PaintItem.Color:'#000000'); } else { sColor = GetColor(Records[sColorField][i], PaintItem); } ctx.fillStyle = sColor; ctx.beginPath(); ctx.arc(x, y, fPointSize, 0, Math.PI * 2, true); ctx.fill(); } } //End of Point 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, sChartType); if (PaintItem.Pointer != null && PaintItem.Pointer != '') oPainter.drawText(PaintItem.Pointer, x, y, ChartItem.Font, (ChartOptions.FontColor?ChartOptions.FontColor:PaintItem.Color), PaintItem.TextBaseline, 'center'); oPainter.drawText(Records[sField][i], x + PaintItem.Offset.x, y + PaintItem.Offset.y, ChartItem.Font, (ChartOptions.FontColor?ChartOptions.FontColor: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); } // End of PaintChart ======================================================================================================================== // 繪製一般Legend function PaintLegend(oPainter, ChartItem) { if (Left(ChartItem.ID,5) == 'KLine') { PaintKLineLegend(oPainter, ChartItem); return; } var sLegendID = 'ChartLegend_' + 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]; var R = GetRoundSetting(PaintItem.Legend); // 過濾幾種不顯示的狀況 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 (Records[sField][iCurIdx] == null) continue; 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 = '' + GetUpDownICON(1) + ''; } else if (fValCur < fValLast) { sTrend = '' + GetUpDownICON(-1) + ''; } } 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 = ' (' + GetUpDownICON(Records[PaintItem.Fields.DiffAmount][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffAmount][iCurIdx]),R.Round,R.AutoRound) + ')'; } else if ('DiffAmount' in PaintItem.Fields) { sDiffAmount = ' (' + GetUpDownICON(Records[PaintItem.Fields.DiffAmount][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffAmount][iCurIdx]),R.Round,R.AutoRound) + (ItemLegend.Unit=='%'?'':ItemLegend.Unit) + ')'; } else if (Legend.ShowICON == 'T') { sDiffAmount = ' (' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(Math.abs(fValCur-fValLast),R.Round,R.AutoRound) + ')'; } else { sDiffAmount = ' (' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(Math.abs(fValCur-fValLast),R.Round,R.AutoRound) + (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 = ' (' + GetUpDownICON(Records[PaintItem.Fields.DiffRatio][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffRatio][iCurIdx]),2,conMobileMode) + '%)'; } else if ('DiffRatio' in PaintItem.Fields) { sDiffRatio = ' (' + GetUpDownICON(Records[PaintItem.Fields.DiffRatio][iCurIdx]) + bigNumberToText(Math.abs(Records[PaintItem.Fields.DiffRatio][iCurIdx]),2,conMobileMode) + '%)'; } else if (Legend.ShowICON == 'T') { sDiffRatio = ' (' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(100*Math.abs(fValCur-fValLast)/fValLast,2,conMobileMode) + '%)'; } else { sDiffRatio = ' (' + GetUpDownICON(fValCur-fValLast) + bigNumberToText(100*Math.abs(fValCur-fValLast)/fValLast,2,conMobileMode) + '%)'; } } // 設定字體顏色 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 = '' + GetICON(PaintItem.Type) + '' + (PaintItem.Type == 'StackBar'?PaintItem.Names[iField]:PaintItem.Name) + (conMobileMode?':':': '); if (ItemLegend.ShowPlusFlag == 'T') s = s + '':(fValCur>=0?GetRiseFallColor(1)+'">+':GetRiseFallColor(-1)+'">')); if (fValCur == null) { s = s + 'null'; } else { if (ItemLegend.BigNumberToText == 'T') { s = s + bigNumberToText(fValCur,R.Round,R.AutoRound); } else { s = s + autoRound(fValCur,R.Round,R.AutoRound); } s = s + ('Unit' in ItemLegend?ItemLegend.Unit:'') + '' + sTrend + sDiffAmount + sDiffRatio + ''; } } else { var s = '' + (PaintItem.Type == 'StackBar'?PaintItem.Names[iField]:PaintItem.Name) + (conMobileMode?':':': '); if (ItemLegend.ShowPlusFlag == 'T') s = s + (fValCur>0?'+':''); if (fValCur == null) { s = s + 'null'; } else { if (ItemLegend.BigNumberToText == 'T') { s = s + bigNumberToText(fValCur,R.Round,R.AutoRound); } else { s = s + autoRound(fValCur,R.Round,R.AutoRound); } s = s + ('Unit' in ItemLegend?ItemLegend.Unit:'') + sTrend + sDiffAmount + sDiffRatio + ''; } } if (ItemLegend.Align == 'left') { s1 = s1 + s + (conMobileMode?' ':'   '); } if (ItemLegend.Align == 'center') { s2 = s2 + s + (conMobileMode?' ':'   '); } if (ItemLegend.Align == 'right') { s3 = s3 + (conMobileMode?' ':'   ') + s; } } } s = "" + "" + "" + "" + "" + "
" + ('Title' in Legend&&Legend.Title.Align=='left'?"" + Legend.Title.Name + " ":"") + s1 + "" + ('Title' in Legend&&Legend.Title.Align=='center'?"" + Legend.Title.Name + "":"") + s2 + "" + s3 + ('Title' in Legend&&Legend.Title.Align=='right'?" " + Legend.Title.Name + "":"") + "
"; 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 - (ChartItem.Legend.TextBaseline=='top'?0:(conMobileMode?2:3))) + 'px'; oLegend.style.zindex = parseInt(oPainter.Canvas.style.zIndex ? oPainter.Canvas.style.zIndex : 1) + 1; oLegend.style.font = ChartItem.Legend.Font; oLegend.style.color = ChartOptions.FontColor; oLegend.style.lineHeight = (parseInt(ChartItem.Legend.Font) + 2) + 'px'; oLegend.innerHTML = s; } // 繪製K線圖的Legend function PaintKLineLegend(oPainter, ChartItem) { var sLegendID = 'ChartLegend_' + ChartItem.ID; var ChartOptions = oPainter.ChartOptions; var Data = oPainter.Data; var Records = Data.Records; var Region = ChartItem.Region; var iRegionWidth = ('width' in Region?Region.width:ChartOptions.ChartWidth); 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 R = GetRoundSetting(ChartItem.PaintItems.KLine.Legend); var Fields = ChartItem.PaintItems.KLine.Fields; var sField = GetStrNum(Fields.Close); if (!('Close' in Fields)) Fields.Close = '收盤價' + sField; if (!('Open' in Fields)) Fields.Open = '開盤價' + sField; if (!('High' in Fields)) Fields.High = '最高價' + sField; if (!('Low' in Fields)) Fields.Low = '最低價' + sField; if (!('YesClose' in Fields)) Fields.YesClose = '昨收價' + sField; if (!('LimitHigh' in Fields)) Fields.LimitHigh = '漲停價' + sField; if (!('LimitLow' in Fields)) Fields.LimitLow = '跌停價' + sField; if (!('PriceChg' in Fields)) Fields.PriceChg = '漲跌價' + sField; if (!('PriceChgRate' in Fields)) Fields.PriceChgRate = '漲跌幅' + sField; if (!('Volume' in Fields)) Fields.Volume = '成交量' + sField; if (!('Amount' in Fields)) Fields.Amount = '成交額' + sField; 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 = "" + "
"; s = s + "" if (ChartItem.Title != null && ChartItem.Title != '') s = s + ""; s = s + "" var fLimitUp = (Fields.LimitHigh in Records?Records[Fields.LimitHigh][iCurIdx]:null); var fLimitDown = (Fields.LimitLow in Records?Records[Fields.LimitLow][iCurIdx]:null); if (fLimitUp == null) fLimitUp = -999999999.999999; //設定一個不可能觸及的價位以避開null的誤判問題 if (fLimitDown == null) fLimitDown = -999999999.999999; //設定一個不可能觸及的價位以避開null的誤判問題 if (ChartOptions.Language == 'CN' && conMobileMode) { //for Mobile of China s = s + "" + "" + "" + "" + "" + ""; } else if (ChartOptions.Language == 'CN') { //for China s = s + "" + "" + "" + "" + "" + ""; // ""; } else if (conMobileMode) { //for Mobile of Taiwan s = s + "" + "" + "" + "" + "" + ""; } else { //for PC of Taiwan s = s + "" + "" + "" + "" + "" + ""; } s = s + "
" + ChartItem.Title + "
收:" + Round(Records[Fields.Close][iCurIdx],R.Round,R.AutoRound) + " 开:" + Round(Records[Fields.Open][iCurIdx],R.Round,R.AutoRound) + " 高:" + Round(Records[Fields.High][iCurIdx],R.Round,R.AutoRound) + " 低:" + Round(Records[Fields.Low][iCurIdx],R.Round,R.AutoRound) + "  " + (Records[Fields.PriceChg][iCurIdx]>0?'+':'') + Round(Records[Fields.PriceChg][iCurIdx],R.Round,R.AutoRound) + '  ' + "(" + (Records[Fields.PriceChgRate][iCurIdx]>0?'+':'') + AutoRound(Records[Fields.PriceChgRate][iCurIdx],3.2) + "%) " + bigNumberToText(Records[Fields.Volume][iCurIdx],2,true) + "手 收盘: " + toMoney(Records[Fields.Close][iCurIdx],R.Round,R.AutoRound) + "  开盘: " + toMoney(Records[Fields.Open][iCurIdx],R.Round,R.AutoRound) + "  最高: " + toMoney(Records[Fields.High][iCurIdx],R.Round,R.AutoRound) + "  最低: " + toMoney(Records[Fields.Low][iCurIdx],R.Round,R.AutoRound) + "  涨跌: " + (Records[Fields.PriceChg][iCurIdx]>0?'+':'') + toMoney(Records[Fields.PriceChg][iCurIdx],R.Round,R.AutoRound) + '  ' + "(" + (Records[Fields.PriceChgRate][iCurIdx]>0?'+':'') + AutoRound(Records[Fields.PriceChgRate][iCurIdx],3.2) + "%)  成交量: " + bigNumberToText(Records[Fields.Volume][iCurIdx],2) + "手  成交额:" + bigNumberToText(Records[Fields.Amount][iCurIdx],2) + "元  收:" + Round(Records[Fields.Close][iCurIdx],R.Round,R.AutoRound) + " 開:" + Round(Records[Fields.Open][iCurIdx],R.Round,R.AutoRound) + " 高:" + Round(Records[Fields.High][iCurIdx],R.Round,R.AutoRound) + " 低:" + Round(Records[Fields.Low][iCurIdx],R.Round,R.AutoRound) + "  " + (Records[Fields.PriceChg][iCurIdx]>0?'+':'') + Round(Records[Fields.PriceChg][iCurIdx],R.Round,R.AutoRound) + '  ' + "(" + (Records[Fields.PriceChgRate][iCurIdx]>0?'+':'') + AutoRound(Records[Fields.PriceChgRate][iCurIdx],3.2) + "%) " + (Right(ChartOptions['StockID'+sField],2)=='指數'?bigNumberToText(Records[Fields.Amount][iCurIdx],2,true)+'元':bigNumberToText(Records[Fields.Volume][iCurIdx],2,true)+'張') + " 收盤: " + toMoney(Records[Fields.Close][iCurIdx],R.Round,R.AutoRound) + "  開盤: " + toMoney(Records[Fields.Open][iCurIdx],R.Round,R.AutoRound) + "  最高: " + toMoney(Records[Fields.High][iCurIdx],R.Round,R.AutoRound) + "  最低: " + toMoney(Records[Fields.Low][iCurIdx],R.Round,R.AutoRound) + "  漲跌: " + (Records[Fields.PriceChg][iCurIdx]>0?'+':'') + toMoney(Records[Fields.PriceChg][iCurIdx],R.Round,R.AutoRound) + '  ' + "(" + (Records[Fields.PriceChgRate][iCurIdx]>0?'+':'') + AutoRound(Records[Fields.PriceChgRate][iCurIdx],3.2) + "%)  成交量: " + (Right(ChartOptions['StockID'+sField],2)=='指數'?bigNumberToText(Records[Fields.Amount][iCurIdx],2)+'元':bigNumberToText(Records[Fields.Volume][iCurIdx],2)+'張') + "  "; if (ChartOptions.ChartCat == 'DATE' && conMobileMode) { s = s + "'" + Mid(Records.RPT_TIME[iCurIdx],3); } else if (ChartOptions.ChartCat == 'DATE') { s = s + Records.RPT_TIME[iCurIdx] + ' (' + WeekName(Records.RPT_TIME[iCurIdx]) + ')'; } else { s = s + Mid(Records.RPT_TIME[iCurIdx],(ChartOptions.ChartCat=='YEAR'||!conMobileMode?1:3)) + (conMobileMode||!('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) + ')'); } s = s +"  
"; var arr = ['','','']; if (ChartItem.PaintOdr.indexOf('PriceAccChg') >= 0) { var i = Data.RecordCount - 1; var d = Mid((ChartOptions.ChartCat=='DATE'?Records.RPT_TIME[i]:Records.END_DATE[i]),6); var fPriceChg = Round(Records[Fields.Close][i]-Records[Fields.YesClose][iCurIdx],R.Round,R.AutoRound); var fPriceChgRate = Round(100*fPriceChg/Records[Fields.YesClose][iCurIdx],2,true); if (conMobileMode) { arr[2] = arr[2] + "
累計漲跌價(幅):" + "" + (fPriceChg>0?'+':'') + fPriceChg + " (" + (fPriceChg>0?'+':'') + fPriceChgRate + "%)" + "  
"; } else { arr[2] = arr[2] + "
" + "累計至" + d + "漲跌價(幅):" + " " + "" + (fPriceChg>0?'+':'') + fPriceChg + " (" + (fPriceChg>0?'+':'') + fPriceChgRate + "%)" + "    
"; } } for (var item in ChartItem.PaintItems) { var PaintItem = ChartItem.PaintItems[item]; if (!('PaintGroup' in PaintItem)) { continue; } var sPaintGroup = PaintItem.PaintGroup; if (Left(sPaintGroup,5) == 'KLine') { continue; } if (ChartItem.PaintOdr.indexOf(sPaintGroup) < 0) { continue; } var R = GetRoundSetting(PaintItem.Legend); switch (sPaintGroup) { case 'MA': case 'EMA': var idx = 0; var i = (ChartOptions.StockCat=='指數'?(conMobileMode?5:7):(conMobileMode?6:8)); var sWidth = 'width:' + Math.floor((ChartOptions.ChartWidth+ChartOptions.ChartMargin.right-2)/i) + 'px;'; break; case 'FLOW_PER': case 'FLOW_PBR': var idx = 1; var i = (conMobileMode?6:6); var sWidth = 'width:' + Math.floor(ChartOptions.ChartWidth/i) + 'px;'; break; case 'FLOW_DR': var idx = 1; var i = (conMobileMode?5:9); var sWidth = 'width:' + Math.floor((ChartOptions.ChartWidth+ChartOptions.ChartMargin.right-2)/i) + 'px;'; break; case 'BollingerBands': case 'SAR': case 'AvgPrice': case 'IDX_TSE': case 'IDX_OTC': case 'IDX_SH000001': case 'IDX_SZ399001': var idx = 2; var sWidth = ''; break; default: continue; } var Field = Records[PaintItem.Fields.Field]; if ((PaintItem.IsShow != 'F' && PaintItem.IsShow != 'AlwaysHide' || 'Legend' in PaintItem && PaintItem.Legend.IsShow == 'AlwaysShow') && Field[iCurIdx] != null) { if ('RiseColor' in PaintItem && 'FallColor' in PaintItem) { var sColor = (Records[PaintItem.Fields.ColorField][iCurIdx] >= 0?PaintItem.RiseColor:PaintItem.FallColor); } else { var sColor = PaintItem.Color; } arr[idx] = arr[idx] + "
" + PaintItem.Name + ':'; if ('Legend' in PaintItem && PaintItem.Legend.BigNumberToText == 'T') { arr[idx] = arr[idx] + bigNumberToText(Field[iCurIdx],R.Round,R.AutoRound); } else { arr[idx] = arr[idx] + AutoRound(Field[iCurIdx],R.Round,R.AutoRound); } arr[idx] = arr[idx] + ('Legend' in PaintItem && 'Unit' in PaintItem.Legend?PaintItem.Legend.Unit:'') + (iCurIdx>0?(Field[iCurIdx]>Field[iCurIdx-1]?GetUpDownICON(1):(Field[iCurIdx] < Field[iCurIdx-1]?GetUpDownICON(-1):'')):'') + " " + (conMobileMode?"":"  ") + "
"; } } for (var i=0; i
" + arr[i] + "
"; } s = s + ""; 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.color = ChartOptions.FontColor; oLegend.style.lineHeight = ChartItem.Legend.LineHeight + 'px'; oLegend.innerHTML = s; } // 建立控制桿及底圖 function PaintControllerBox(oPainter, ChartItem) { var Region = ChartItem.Region; var iBtnHeight = (IsNumeric(Region.ButtonHeight)?Region.ButtonHeight:0); if (oPainter.Controller == null) { // 繪製底圖 ============================================================================= var ctx = oPainter.ctx; var Records = oPainter.Data.Records; var ChartOptions = oPainter.ChartOptions; ctx.restore(); ctx.save(); ctx.translate(Region.x, Region.y); ctx.clearRect(0 - Region.x, 0, oPainter.Canvas.width, Region.height - iBtnHeight); //畫水平底紋線 var fSpaceHeight = (Region.height - iBtnHeight) / (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, sFieldClose = '收盤價'; var arr = ['收盤價','收盤價0','收盤價1']; for (i=0; i < arr.length; i++) { if (arr[i] in Records) { var sFieldClose = arr[i]; break; } } for (var i = 0; i < oPainter.Data.RecordCount; i++) { if (fHigh == null && Records[sFieldClose][i] != null) { fHigh = Records[sFieldClose][i]; } else { fHigh = Math.max(fHigh, Records[sFieldClose][i]); } if (fLow == null && Records[sFieldClose][i] != null) { fLow = Records[sFieldClose][i]; } else { fLow = Math.min(fLow, Records[sFieldClose][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 - iBtnHeight) * (fHigh - Records[sFieldClose][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 - iBtnHeight); ctx.lineTo(0, Region.height - iBtnHeight); 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 - iBtnHeight; 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(); } // 建立控制按鈕 ========================================================================= if (iBtnHeight > 0) { var oButton, s, s0, s1, i; var CanvasPosition = getPageCoord(oPainter.Canvas); if (!('divCtrlBtn' in window)) { oButton = document.createElement('DIV'); oButton.id = 'divCtrlBtn'; oButton.className = 'disable_select'; oButton.style.cssText = 'height:' + (iBtnHeight-1) + 'px;width:' + Region.width + 'px;text-align:center;padding:0;'; //oButton.style.zIndex = 1; oButton.style.position = 'absolute'; i = iBtnHeight - 1; s0 = 'type="button" style="padding:0;height:' + i + 'px;width:' + (i*2) + 'px;line-height:' + conLineHeight16 + 'px;' + (conMobileMode?'':'font-family:新細明體;') + 'font-size:' + conFontSize09 + 'pt;">'; s1 = (conMobileMode?' ':'  '); s = '' + '' + '' + '
' + '' + ''; if (typeof(Calendar) == 'function') { s = s + ''; } s = s + '
'; oButton.innerHTML = '' + s + ''; document.body.appendChild(oButton); //設定日曆物件 if (typeof(Calendar) == 'function' && 'btnKC_SelDate' in window && 'txtKC_SelDate' in window) { var cal = Calendar.setup({ showTime: false, fdow: 0, animation: true, onSelect: function(cal) { cal.hide(); ClickCtrlBtn('SelDate'); }, }); cal.manageFields('btnKC_SelDate','txtKC_SelDate','%Y/%m/%d'); } } else { oButton = document.getElementById('divCtrlBtn'); } oButton.style.left = (CanvasPosition.x + Region.x) + 'px'; oButton.style.top = (CanvasPosition.y + Region.y + Region.height - iBtnHeight + 1) + 'px'; } // ====================================================================================== } function ClickCtrlBtn(sEvent) { if (!('StockPainter' in window)) return; var StockData = StockPainter.Data; var ChartOptions = StockPainter.ChartOptions; var iRecordCount = StockData.RecordCount; var iZoomCnt = ChartOptions.ChartItems.ControllerBox.Controller.Button.ZoomCnt; var iZoomCnt2 = ChartOptions.ChartItems.ControllerBox.Controller.Button.ZoomCnt2; var iShiftCnt = ChartOptions.ChartItems.ControllerBox.Controller.Button.ShiftCnt; var iShiftCnt2 = ChartOptions.ChartItems.ControllerBox.Controller.Button.ShiftCnt2; var iStart = ChartOptions.IndexStart; var iEnd = ChartOptions.IndexEnd; if (sEvent == 'ZoomIn' || sEvent == 'ZoomIn2') { var i = (sEvent=='ZoomIn2'?iZoomCnt2:iZoomCnt); iStart = ChartOptions.IndexStart + i; if (iStart > ChartOptions.IndexEnd) { iStart = ChartOptions.IndexEnd; } } else if (sEvent == 'ZoomOut' || sEvent == 'ZoomOut2') { var i = (sEvent=='ZoomOut2'?iZoomCnt2:iZoomCnt); if (ChartOptions.IndexStart <= 0) { iEnd = ChartOptions.IndexEnd + i; } else { iStart = ChartOptions.IndexStart - i; } } else if (sEvent == 'ShiftLeft' || sEvent == 'ShiftLeft2') { //var i = Math.round(ChartOptions.IndexLength/(sEvent=='ShiftLeft2'?1:4)); //以頁面比例捲動(廢除) var i = (sEvent=='ShiftLeft2'?iShiftCnt2:iShiftCnt); //以K線數量捲動 if (i < 1) { i = 1; } if (ChartOptions.IndexStart - i < 0) { i = ChartOptions.IndexStart; } iStart = ChartOptions.IndexStart - i; iEnd = ChartOptions.IndexEnd - i; } else if (sEvent == 'ShiftLeft3') { iStart = 0; iEnd = ChartOptions.IndexEnd - ChartOptions.IndexStart; } else if (sEvent == 'ShiftRight' || sEvent == 'ShiftRight2') { //var i = Math.round(ChartOptions.IndexLength/(sEvent=='ShiftRight2'?1:4)); //以頁面比例捲動(廢除) var i = (sEvent=='ShiftRight2'?iShiftCnt2:iShiftCnt); //以K線數量捲動 if (i < 1) { i = 1; } if (ChartOptions.IndexEnd + i >= iRecordCount) { i = iRecordCount - ChartOptions.IndexEnd - 1; } iStart = ChartOptions.IndexStart + i; iEnd = ChartOptions.IndexEnd + i; } else if (sEvent == 'ShiftRight3') { iStart = iRecordCount - ChartOptions.IndexEnd + ChartOptions.IndexStart - 1; iEnd = iRecordCount - 1; } else if (sEvent == 'SelDate') { // 檢查日期是否存在 var s = txtKC_SelDate.value; if ('START_DATE' in StockData.Records && 'END_DATE' in StockData.Records) { var ts = StockData.Records['START_DATE']; var te = StockData.Records['END_DATE']; for (iEnd = iRecordCount-1;iEnd>-1;iEnd--) { if (ts[iEnd] <= s && te[iEnd] >= s) break; } } else if ('RPT_TIME' in StockData.Records) { var t = StockData.Records['RPT_TIME']; for (iEnd = iRecordCount-1;iEnd>-1;iEnd--) { if (t[iEnd] == s) break; } } if (iEnd < 0) { alert(s+(ChartOptions.Language=='CN'?' 无交易资料,请再次确认。':' 無交易資料,請再次確認。')); return; } iStart = iEnd - ChartOptions.IndexLength + 1; } else { return; } if (iStart < 0) { iStart = 0; } if (iEnd >= iRecordCount) { iEnd = iRecordCount - 1; } ChartOptions.ShowStart = (iRecordCount <= 1? 0: 100 * iStart / (iRecordCount - 1)); ChartOptions.ShowEnd = (iRecordCount <= 1? 100: 100 * iEnd / (iRecordCount - 1)); if (ChartOptions.ShowStart < 0) { ChartOptions.ShowStart = 0; } if (ChartOptions.ShowStart > 100) { ChartOptions.ShowStart = 100; } if (ChartOptions.ShowEnd < 0) { ChartOptions.ShowEnd = 0; } if (ChartOptions.ShowEnd > 100) { ChartOptions.ShowEnd = 100; } RepaintStockChart(StockPainter); } // 建立游標十字線及資訊框 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) { 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 ChartItem = ChartItems[item]; if (!ChartItem.ID) { continue; } else { var sLegendID = 'ChartLegend_' + ChartItem.ID; } if (sLegendID in window) { $id(sLegendID).style.display = 'none'; } else { var oLegend = document.createElement('DIV'); oLegend.id = sLegendID; document.body.appendChild(oLegend); } } //建立左右兩邊手機可滑動區域 var CanvasPosition = getPageCoord(StockPainter.Canvas); var arr = ['left','right']; for (var item in arr) { sScrollArea = arr[item]; if (!('ScrollArea_' + sScrollArea in window)) { var oScrollArea = document.createElement('DIV'); oScrollArea.id = 'ScrollArea_' + sScrollArea; oScrollArea.className = 'disable_select'; oScrollArea.style.alpha = 0; oScrollArea.style.position = 'absolute'; oScrollArea.style.width = (StockPainter.ChartOptions.ChartMargin[sScrollArea] - 2) + 'px'; oScrollArea.style.height = StockPainter.ChartOptions.ChartHeight + 'px'; oScrollArea.style.display = 'block'; if (sScrollArea == 'right') { oScrollArea.style.left = (CanvasPosition.x + StockPainter.ChartOptions.ChartWidth + StockPainter.ChartOptions.ChartMargin.left + 2) + 'px'; } else { oScrollArea.style.left = CanvasPosition.x + 'px'; } oScrollArea.style.top = CanvasPosition.y + 'px'; oScrollArea.style.zindex = parseInt(StockPainter.Canvas.style.zIndex ? StockPainter.Canvas.style.zIndex : 1) + 1; document.body.appendChild(oScrollArea); } } } function RepaintStockChart(oPainter) { //重畫圖形 if (oPainter) { //定位繪圖落點範圍 if ('controller' in oPainter) { var oCtrl = oPainter.controller; } if ('Controller' in oPainter) { var oCtrl = oPainter.Controller; } oCtrl.Value.left = oPainter.ChartOptions.ShowStart; oCtrl.Value.right = oPainter.ChartOptions.ShowEnd; oPainter.Paint(); oCtrl.drawControllerPart(); } } function GetRiseFallColor(f, obj) { var sColor = '#000000'; f = Round(f,8) 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 ChartHeightList = ChartOptions.ChartHeightList; var fChartHeightShow = 0; var fMarginHeightShow = 0; var fControllerHeight = 0; var fScale = 1; //將ChartDisplayList中重複或不存在的ID進行清除,以確保程式能正確執行 for (var i=0; i -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; //設定Controller Canvas座標 if (oPainter.Canvas.id + '_controller' in window) { var CanvasPosition = getPageCoord(oPainter.Canvas); var ControllerCanvas = $id(oPainter.Canvas.id + '_controller'); ControllerCanvas.style.left = CanvasPosition.x + ChartItem.Region.x - ChartItem.Controller.Bar.width + 'px'; ControllerCanvas.style.top = CanvasPosition.y + ChartItem.Region.y + 'px'; } //break; } } // 針對ChartItems.KLine修正Margin.top for (var v of ['KLine','KLine1']) { if (v in ChartItems && 'Legend' in ChartItems[v] && TypeName(ChartItems[v].PaintOdr) == '[object Array]') { var ChartItem = ChartItems[v]; var oTop = { Top:0, Title:0, KLine:0, MA:0, FLOW:0, Others:0 } var iHeight = ChartItem.Legend.LineHeight; if ('Title' in ChartItem && ChartItem.Title != null && String(ChartItem.Title).trim() != '') { oTop.Title = iHeight; } for (var i=0; i= 0) { oTop.Others = iHeight; } } oTop.Top = oTop.Title + oTop.KLine + oTop.MA + oTop.FLOW + oTop.Others; if (!('Margin' in ChartItem)) { ChartItem.Margin = {}; } ChartItem.Margin.top = oTop.Top + 5; if (!('Legend' in ChartItem)) { ChartItem.Legend = {}; } ChartItem.Legend.InitHeight = oTop.Top; } } // 計算顯示物件之總高度,並設定ChartDisplayList.Margin for (var i=0; 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.round((iRecordCount <= 1 ? 0 : ChartOptions.ShowStart / 100 * (iRecordCount - 1))); var iEnd = Math.round((iRecordCount <= 1 ? 100 : ChartOptions.ShowEnd / 100 * (iRecordCount - 1))); 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 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); */ } // 計算SAR function InitSarData(Data, ChartOptions, ChartItem, Fields) { var DataFields = Data.Fields; var Records = Data.Records; var iRecordCount = Number(Data.RecordCount); if (Fields == null) { Fields = { AF:'SAR_AF', EP:'SAR_EP', SAR:'SAR', SAR_TREND:'SAR_TREND', SAR_TMP:'SAR_TMP', SAR_COLOR:'SAR_COLOR', High:'最高價', Low:'最低價', Close:'收盤價' }; } //建立欄位 if (DataFields.indexOf(Fields.AF) == -1) DataFields.push(Fields.AF); if (Fields.AF in Records) delete Records[Fields.AF]; Records[Fields.AF] = new Array(iRecordCount); if (DataFields.indexOf(Fields.EP) == -1) DataFields.push(Fields.EP); if (Fields.EP in Records) delete Records[Fields.EP]; Records[Fields.EP] = new Array(iRecordCount); if (DataFields.indexOf(Fields.SAR) == -1) DataFields.push(Fields.SAR); if (Fields.SAR in Records) delete Records[Fields.SAR]; Records[Fields.SAR] = new Array(iRecordCount); if (DataFields.indexOf(Fields.SAR_TREND) == -1) DataFields.push(Fields.SAR_TREND); if (Fields.SAR_TREND in Records) delete Records[Fields.SAR_TREND]; Records[Fields.SAR_TREND] = new Array(iRecordCount); if (DataFields.indexOf(Fields.SAR_TMP) == -1) DataFields.push(Fields.SAR_TMP); if (Fields.SAR_TMP in Records) delete Records[Fields.SAR_TMP]; Records[Fields.SAR_TMP] = new Array(iRecordCount); if (DataFields.indexOf(Fields.SAR_COLOR) == -1) DataFields.push(Fields.SAR_COLOR); if (Fields.SAR_COLOR in Records) delete Records[Fields.SAR_COLOR]; Records[Fields.SAR_COLOR] = new Array(iRecordCount); //若該圖形不顯示,則直接跳出 if (ChartOptions.ChartDisplayList.indexOf(ChartItem.ID) < 0) { return; } //找到第一個實際有資料的位置 for (var iStart = 0; (Records[Fields.High][iStart] == null || Records[Fields.Low][iStart] == null) && iStart < iRecordCount; iStart++); if (iStart >= iRecordCount) { return; } var iDays = Number(ChartItem.PaintItems.SAR.nDays); var fInitAF = Number(ChartItem.PaintItems.SAR.InitAF); var fDeltaAF = Number(ChartItem.PaintItems.SAR.DeltaAF); var fMaxAF = Number(ChartItem.PaintItems.SAR.MaxAF); var i = iStart + iDays - 1; if (i < 0) { return; } for (var j = iStart; i < iRecordCount; i++, j++) { if (Records[Fields.Close][i] != Records[Fields.Close][j]) { break; } } if (i >= iRecordCount) { return; } Records[Fields.AF][i] = fInitAF; if (Records[Fields.Close][i] >= Records[Fields.Close][j]) { Records[Fields.SAR_TREND][i] = 1; Records[Fields.EP][i] = Math.max.apply(null, Records[Fields.High].slice(j,i)); Records[Fields.SAR_TMP][i] = Math.min.apply(null, Records[Fields.Low].slice(j,i)); } else { Records[Fields.SAR_TREND][i] = -1; Records[Fields.EP][i] = Math.min.apply(null, Records[Fields.Low].slice(j,i)); Records[Fields.SAR_TMP][i] = Math.max.apply(null, Records[Fields.High].slice(j,i)); } for (i++; i >= 0 && i < iRecordCount; i++) { //計算SAR,SAR_TREND Records[Fields.SAR][i] = Records[Fields.SAR_TMP][i-1] + Records[Fields.AF][i-1] * (Records[Fields.EP][i-1] - Records[Fields.SAR_TMP][i-1]); if (Records[Fields.SAR_TREND][i-1] < 0) { // Records[Fields.SAR][i] = Math.max(Records[Fields.SAR][i], Records[Fields.High][i-1], Records[Fields.High][i-2]); Records[Fields.SAR_TREND][i] = (Records[Fields.SAR][i]Records[Fields.Low][i]?-1:Records[Fields.SAR_TREND][i-1]+1); } //儲存SAR_TMP if (Records[Fields.SAR_TREND][i] == -1) { Records[Fields.SAR_TMP][i] = Math.max(Records[Fields.EP][i-1], Records[Fields.High][i]); } else if (Records[Fields.SAR_TREND][i] == 1) { Records[Fields.SAR_TMP][i] = Math.min(Records[Fields.EP][i-1], Records[Fields.Low][i]); } else { Records[Fields.SAR_TMP][i] = Records[Fields.SAR][i]; } //計算EP if (Records[Fields.SAR_TREND][i] < 0) { Records[Fields.EP][i] = (Records[Fields.SAR_TREND][i]==-1?Records[Fields.Low][i]:Math.min(Records[Fields.Low][i],Records[Fields.EP][i-1])); } else { Records[Fields.EP][i] = (Records[Fields.SAR_TREND][i]==1?Records[Fields.High][i]:Math.max(Records[Fields.High][i],Records[Fields.EP][i-1])); } //計算AF if (Math.abs(Records[Fields.SAR_TREND][i]) == 1) { Records[Fields.AF][i] = fInitAF; } else if (Round(Records[Fields.EP][i],3) == Round(Records[Fields.EP][i-1],3)) { Records[Fields.AF][i] = Records[Fields.AF][i-1]; } else { Records[Fields.AF][i] = Math.min(fMaxAF, Records[Fields.AF][i-1]+fDeltaAF); } } //設定SAR_COLOR for (var i = 0; i < iRecordCount; i++) { if (Math.abs(Records[Fields.SAR_TREND][i]) == 1) { Records[Fields.SAR_COLOR][i] = -1 * Records[Fields.SAR_TREND][i]; } else { Records[Fields.SAR_COLOR][i] = Records[Fields.SAR_TREND][i]; } } } // 計算各式移動平均線資料 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; // if (ChartItem.PaintOdr.indexOf(PaintItems[sMA_ID+'0'].PaintGroup) <= -1 && // ChartOptions.ChartDisplayList.indexOf('BIAS') < 0) 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 (Left(sMA_ID,4) == '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 (VolumeDif.IsShow == 'AlwaysHide' || ChartOptions.ChartDisplayList.indexOf(VolumeDif.ID) < 0) return; //若該圖形不顯示,則直接跳出 if (Fields == null) { Fields = { Volume:'成交量', VolumeDif:'成交量增減數', VolumeDifRatio:'成交量增減幅', Amount:'成交額', AmountDif:'成交額增減數', AmountDifRatio:'成交額增減幅' }; } if (DataFields.indexOf(Fields.VolumeDif) == -1) DataFields.push(Fields.VolumeDif); if (DataFields.indexOf(Fields.VolumeDifRatio) == -1) DataFields.push(Fields.VolumeDifRatio); if (DataFields.indexOf(Fields.AmountDif) == -1) DataFields.push(Fields.AmountDif); if (DataFields.indexOf(Fields.AmountDifRatio) == -1) DataFields.push(Fields.AmountDifRatio); 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.AmountDif in Records) delete Records[Fields.AmountDif]; Records[Fields.AmountDif] = new Array(iRecordCount); if (Fields.AmountDifRatio in Records) delete Records[Fields.AmountDifRatio]; Records[Fields.AmountDifRatio] = new Array(iRecordCount); 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.Amount][i]) && IsNumeric(fLastT)) { Records[Fields.AmountDif][i] = Records[Fields.Amount][i] - fLastT; if (fLastT != 0) Records[Fields.AmountDifRatio][i] = 100 * Records[Fields.AmountDif][i] / fLastT; } fLastV = Records[Fields.Volume][i]; fLastT = Records[Fields.Amount][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 = []; if (Fields == null) Fields = { Close:'收盤價', High:'最高價', Low:'最低價' }; for (var item in PaintItems) { var iDays = Number(IsNumeric(PaintItems[item].nDays)?PaintItems[item].nDays:0); var sField = PaintItems[item].Fields.Field; nDays.push(iDays); PaintItems[item].Name = (ChartOptions.Language=='CN'?'威廉指标 ':'威廉指標 ') + iDays; PaintItems[item].IsShow = (iDays>0?'T':'F') if (!Fields[item]) Fields[item] = sField; if (DataFields.indexOf(sField) == -1) DataFields.push(sField); if (sField in Records) delete Records[sField]; Records[sField] = 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++) { if (Number(nDays[iDay]) > 0) { 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= 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, sChartType) { 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 if (v < l) { return fChartHeight; } else if (sChartType == 'Log') { var vv = (Round(v,8)==0?0:Math.log10(v)); var ll = (Round(l,8)==0?0:Math.log10(l)); var hh = (Round(h,8)==0?0:Math.log10(h)); return (Region.y + Region.height - Region.height * (vv - ll) / (hh - ll)); } 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; } var KLineFields = ChartItems.KLine.PaintItems.KLine.Fields; if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceOpen' && Records[KLineFields.Open][ChartOptions.IndexCurrent] != null) { return GetY(Records[KLineFields.Open][ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region, ChartItems.KLine.Type); } else if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceHigh' && Records[KLineFields.High][ChartOptions.IndexCurrent] != null) { return GetY(Records[KLineFields.High][ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region, ChartItems.KLine.Type); } else if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceLow' && Records[KLineFields.Low][ChartOptions.IndexCurrent] != null) { return GetY(Records[KLineFields.Low][ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region, ChartItems.KLine.Type); } else if (ChartOptions.CrossLineAndTipMgr.ShowCrossLine == 'PriceClose' && Records[KLineFields.Close][ChartOptions.IndexCurrent] != null) { return GetY(Records[KLineFields.Close][ChartOptions.IndexCurrent], h, l, ChartItems.KLine.Region, ChartItems.KLine.Type); } } } } } 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 v = null; if (String(Target.Legend.Type).substr(0,5) == 'KLine') { v = 3.2; } TipHtml.TipAxisL = '' + (yAxisL.BigNumberToText=='T'?bigNumberToText(f,i):AutoRound(f,v)) + ''; } if (yAxisR.AxisHigh != null && yAxisR.AxisLow != null) { var f = (1 - y / Region.height) * (yAxisR.AxisHigh - yAxisR.AxisLow) + yAxisR.AxisLow; var v = null; if (String(Target.Legend.Type).substr(0,5) == 'KLine') { v = 3.2; } TipHtml.TipAxisR = '' + (yAxisR.BigNumberToText=='T'?bigNumberToText(f,i):AutoRound(f,v)) + ''; } } return TipHtml; } function GetICON(s) { if (s == 'Line') { return ''; } else { return ''; } } 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:'成交量', Amount:'成交額', 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') { var i = ChartItem.PriceRound; result = '收盘价:' + (Records[Fields.Close][idx]==null?'No data':'' + toMoney(Records[Fields.Close][idx],i) + '') + '
' + '涨跌额:' + (Records[Fields.Change][idx]==null?'No data':'' + (Records[Fields.Change][idx]>0?'+':'') + toMoney(Records[Fields.Change][idx],i) + '') + '
' + '涨跌幅:' + (Records[Fields.ChangeRatio][idx]==null?'No data':'' + (Records[Fields.ChangeRatio][idx]>0?'+':'') + toMoney(Records[Fields.ChangeRatio][idx],2) + '%') + '
' + '成交量:' + (Records[Fields.Volume][idx]==null?'No data':bigNumberToText(Math.round(Records[Fields.Volume][idx]))+(ChartOptions.Language=='CN'?'手':'張')) + '
' + '成交额:' + (Records[Fields.Amount][idx]==null?'No data':bigNumberToText(Records[Fields.Amount][idx])+'元') + '
' + '昨收价:' + (Records[Fields.PreClose][idx]==null?'No data':'' + toMoney(Records[Fields.PreClose][idx],i) + '') + '
' + '开盘价:' + (Records[Fields.Open][idx]==null?'No data':'' + toMoney(Records[Fields.Open][idx],i) + '') + '
' + '最高价:' + (Records[Fields.High][idx]==null?'No data':'' + toMoney(Records[Fields.High][idx],i) + '') + (Fields.DateHigh in Records?'  ('+Records[Fields.DateHigh][idx].substr(5)+')':'') + '
' + '最低价:' + (Records[Fields.Low][idx]==null?'No data':'' + toMoney(Records[Fields.Low][idx],i) + '') + (Fields.DateLow in Records?'  ('+Records[Fields.DateLow][idx].substr(5)+')':''); if ('AvgPrice' in Fields && Fields.AvgPrice in Records) { result = result + '
平均价:' + (Records[Fields.AvgPrice][idx]==null?'No data':'' + Round(Records[Fields.AvgPrice][idx],i) + '') + '
'; } } else { result = '收盤價:' + (Records[Fields.Close][idx]==null?'No data':'' + toMoney(Records[Fields.Close][idx]) + '') + '
' + '漲跌價:' + (Records[Fields.Change][idx]==null?'No data':'' + (Records[Fields.Change][idx]>0?'+':'') + toMoney(Records[Fields.Change][idx]) + '') + '
' + '漲跌幅:' + (Records[Fields.ChangeRatio][idx]==null?'No data':'' + (Records[Fields.ChangeRatio][idx]>0?'+':'') + toMoney(Records[Fields.ChangeRatio][idx]) + '%') + '
' + '成交張:' + (Records[Fields.Volume][idx]==null?'No data':bigNumberToText(Math.round(Records[Fields.Volume][idx]))+(ChartOptions.Language=='CN'?'手':'張')) + '
' + '成交額:' + (Records[Fields.Amount][idx]==null?'No data':bigNumberToText(Records[Fields.Amount][idx])+'元') + '
' + '昨收價:' + (Records[Fields.PreClose][idx]==null?'No data':'' + toMoney(Records[Fields.PreClose][idx]) + '') + '
' + '開盤價:' + (Records[Fields.Open][idx]==null?'No data':'' + toMoney(Records[Fields.Open][idx]) + '') + '
' + '最高價:' + (Records[Fields.High][idx]==null?'No data':'' + toMoney(Records[Fields.High][idx]) + '') + (Fields.DateHigh in Records&&IsDate(Records[Fields.DateHigh][idx])?'  ('+String(Records[Fields.DateHigh][idx]).substr(5)+')':'') + '
' + '最低價:' + (Records[Fields.Low][idx]==null?'No data':'' + toMoney(Records[Fields.Low][idx]) + '') + (Fields.DateLow in Records&&IsDate(Records[Fields.DateLow][idx])?'  ('+String(Records[Fields.DateLow][idx]).substr(5)+')':''); if ('AvgPrice' in Fields && Fields.AvgPrice in Records) { result = result + '
平均價:' + (Records[Fields.AvgPrice][idx]==null?'No data':'' + toMoney(Records[Fields.AvgPrice][idx]) + '') + '
'; } } } else if ((sTipCat == 'PriceMA' || sTipCat == 'PriceEMA' || sTipCat == 'VolumeMA' || sTipCat == 'AmountMA' || sTipCat == 'PriceMA&DevRatio' || sTipCat == 'PriceEMA&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]; var s = (Left(sTipCat,8)=='PriceEMA'?'EMA_':'MA_') if (Left(item,Len(s)) == s && (PaintItem.IsShow == 'T' || PaintItem.IsShow == 'AlwaysShow')) { var sField = PaintItem.Fields.Field; if (Records[sField][idx] != null) { if (result != '') result = result + '
'; result = result + '' + GetICON(PaintItem.Type) + ' ' + PaintItem.Name + ':' + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Records[sField][idx]):toMoney(Records[sField][idx],ChartItem.PriceRound)) + ('Legend' in PaintItem&&'Unit' in PaintItem.Legend?PaintItem.Legend.Unit:''); if (idx > 0 && (Left(sTipCat,7) == 'PriceMA' || Left(sTipCat,8) == 'PriceEMA' || (PaintItem.Legend != null && PaintItem.Legend.ShowTrend == 'T'))) { if (Records[sField][idx] - Records[sField][idx-1] > 0) { result = result + ' ' + GetUpDownICON(1) + ''; } else if (Records[sField][idx] - Records[sField][idx-1] < 0) { result = result + ' ' + GetUpDownICON(-1) + ''; } } if (sTipCat == 'PriceMA&DevRatio' || sTipCat == 'PriceEMA&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 = AutoRound(100 * (f - Records[sField][idx]) / Records[sField][idx]); if (f != null) result = result + ' / ' + (f>=0?'+':'') + f + '%'; } } } } } } else if (ChartDisplayList.indexOf(ChartItem.ID) >= 0 && ChartItem.IsShow != 'AlwaysHide') { var PaintItems = ChartItem.PaintItems; for (var item in PaintItems) { var PaintItem = PaintItems[item]; var sPaintGroup = ('PaintGroup' in PaintItem?PaintItem.PaintGroup:''); if (NVL(sTipCat,'') != '' && sPaintGroup != sTipCat) { continue; } 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 = ('NormalColor' in PaintItem?PaintItem.NormalColor:PaintItem.RiseColor); var sColorField = ('ColorField' in PaintItem.Fields?PaintItem.Fields.ColorField:PaintItem.Fields.Field); if (Records[sColorField][idx] < 0) { sColor = PaintItem.FallColor; } else if (Records[sColorField][idx] > 0) { sColor = PaintItem.RiseColor; } } 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 + '
'; result = result + '' + GetICON(PaintItem.Type) + ' ' + (PaintItem.Type == 'StackBar'?PaintItem.Names[iField]:PaintItem.Name) + ':' + ('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:'') + ''; // 變動數 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 + ' ' + GetUpDownICON(1) + ''; } else if (f < 0 && PaintItem.IsAccumulated == 'T') { result = result + ' ' + GetUpDownICON(-1) + ''; } else if (f > 0) { result = result + ' (' + GetUpDownICON(1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):Round(Math.abs(f))) + sUnit + ')'; } else if (f < 0) { result = result + ' (' + GetUpDownICON(-1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):Round(Math.abs(f))) + sUnit + ')'; } } // 變動率 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 + ' ' + GetUpDownICON(1) + ''; } else if (f < 0 && PaintItem.IsAccumulated == 'T') { result = result + ' ' + GetUpDownICON(-1) + ''; } else if (f > 0) { result = result + ' (' + GetUpDownICON(1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):AutoRound(Math.abs(f))) + sUnit + ')'; } else if (f < 0) { result = result + ' (' + GetUpDownICON(-1) + ('Legend' in PaintItem&&PaintItem.Legend.BigNumberToText=='T'?bigNumberToText(Math.abs(f)):AutoRound(Math.abs(f))) + sUnit + ')'; } } } } } } } 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; } function GetTipText_PaintOdr(oPainter) { var ChartItems = oPainter.ChartOptions.ChartItems; var sLanguage = oPainter.ChartOptions.Language; var o, result = ''; if (!('KLine' in ChartItems)) return ''; if (!('PaintOdr' in ChartItems.KLine)) return ''; if (sLanguage == 'CN') { o = [{ Title:'价格移动平均线', PaintGroup:'MA', TipCat:'PriceMA&DevRatio' }, { Title:'平滑价格移动平均线', PaintGroup:'EMA', TipCat:'PriceEMA&DevRatio' }]; } else { o = [{ Title:'價格移動平均線', PaintGroup:'MA', TipCat:'PriceMA&DevRatio' }, { Title:'平滑價格移動平均線', PaintGroup:'EMA', TipCat:'PriceEMA&DevRatio' }]; } for (var v of o) { if (ChartItems.KLine.PaintOdr.indexOf(v.PaintGroup) >= 0) { var s = Trim(GetSubTipText(v.TipCat, oPainter, ChartItems.KLine)); if (s != '') { if ('MA_DevRatioRef' in ChartItems.KLine && Left(ChartItems.KLine.MA_DevRatioRef,5) == 'Price') result = result + '
․' + v.Title + ' / ' + (sLanguage=='CN'?'乖离率':'乖離率') + '
' + s + ''; else result = result + '
․' + v.Title + '
' + s + ''; } } } if (sLanguage == 'CN') { o = [{ Title:'布林通道', PaintGroup:'BollingerBands' }, { Title:'SAR停损停利指标', PaintGroup:'SAR' }, { Title:'平均收盘价', PaintGroup:'AvgPrice' }, { Title:'大盘指数', PaintGroup:['IDX_SH000001','IDX_SZ399001'] }]; } else { o = [{ Title:'布林通道', PaintGroup:'BollingerBands' }, { Title:'SAR停損停利指標', PaintGroup:'SAR' }, { Title:'平均收盤價', PaintGroup:'AvgPrice' }, { Title:'大盤指數', PaintGroup:['IDX_TSE','IDX_OTC'] }]; } for (var v of o) { var s = ''; if (TypeName(v.PaintGroup) == '[object Array]') { for (var i=0; i= 0) { var s1 = Trim(GetSubTipText(v.PaintGroup[i], oPainter, ChartItems.KLine)) if (s1 != '') s = s + (s==''?'':'
') + '' + s1 + ''; } } } else { if (ChartItems.KLine.PaintOdr.indexOf(v.PaintGroup) >= 0) { var s1 = Trim(GetSubTipText(v.PaintGroup, oPainter, ChartItems.KLine)); if (s1 != '') s = s + (s==''?'':'
') + '' + s1 + ''; } } if (s != '') result = result + '
․' + v.Title + '
' + s; } return result; } function GetTipText_ChartItem(oPainter, arrExtra) { var ChartItems = oPainter.ChartOptions.ChartItems; var sLanguage = oPainter.ChartOptions.Language; var o, result = ''; if (sLanguage == 'CN') { o = [{ Title:'量能移动平均线', TipCat:'VolumeMA', ChartItem:'Volume' }, { Title:'成交量能增减', TipCat:null, ChartItem:'VolumeDif' }, { Title:'换手率', TipCat:null, ChartItem:'VolumeTurnover' }, { Title:'成交金额增减', TipCat:null, ChartItem:'AmountDif' }, { Title:'OBV', TipCat:null, ChartItem:'OBV' }, { Title:'RSI', TipCat:null, ChartItem:'RSI' }, { Title:'KD', TipCat:null, ChartItem:'KD' }, { Title:'MACD', TipCat:null, ChartItem:'MACD' }, { Title:'均线乖离率', TipCat:null, ChartItem:'BIAS' }, { Title:'威廉指标', TipCat:null, ChartItem:'WilliamsR' }, { Title:'DMI趋势指标', TipCat:null, ChartItem:'DMI' }, { Title:'布林指标', TipCat:null, ChartItem:['BollingerPB','BollingerBW'] }, { Title:'MTM动量指标', TipCat:null, ChartItem:'MTM' } ]; } else { o = [{ Title:'量能移動平均線', TipCat:'VolumeMA', ChartItem:'Volume' }, { Title:'成交量能增減', TipCat:null, ChartItem:'VolumeDif' }, { Title:'成交量週轉率', TipCat:null, ChartItem:'VolumeTurnover' }, { Title:'OBV', TipCat:null, ChartItem:'OBV' }, { Title:'RSI', TipCat:null, ChartItem:'RSI' }, { Title:'KD', TipCat:null, ChartItem:'KD' }, { Title:'MACD', TipCat:null, ChartItem:'MACD' }, { Title:'均線乖離率', TipCat:null, ChartItem:'BIAS' }, { Title:'威廉指標', TipCat:null, ChartItem:'WilliamsR' }, { Title:'DMI趨勢指標', TipCat:null, ChartItem:'DMI' }, { Title:'布林指標', TipCat:null, ChartItem:['BollingerPB','BollingerBW'] }, { Title:'MTM動量指標', TipCat:null, ChartItem:'MTM' } ]; } if (TypeName(arrExtra) == '[object Array]') { for (var i=0; i') + '' + s1 + ''; } } } else if ((v.ChartItem in ChartItems)) { var s1 = Trim(GetSubTipText(v.TipCat, oPainter, ChartItems[v.ChartItem])); if (s1 != '') s = s + (s==''?'':'
') + '' + s1 + ''; } if (s != '') result = result + '
․' + v.Title + '
' + s; } return result; } //設定ChartItems及PaintItems的ID function InitChartOptions(ChartOptions, ChartConfig) { if (!('ChartItems' in ChartOptions)) return; //fix AspNM if (ChartOptions.Language == 'TW' && ChartOptions.StockCat == '指數') { ChartOptions.AspNM = ChartOptions.AspNM + '_IDX'; } //Initialize ChartOptions if (!IsNumeric(ChartOptions.ShowEnd)) { ChartOptions.ShowEnd = 100; } //定義資料的結束顯示位置點 if (!('Font' in ChartOptions)) { ChartOptions.Font = conFontSize11 + 'px Arial'; } if (!('FontColor' in ChartOptions)) { ChartOptions.FontColor = 'black'; } if (!('BackgroundColor' in ChartOptions)) { ChartOptions.BackgroundColor = 'transparent'; } if (!('ChartMargin' in ChartOptions)) { //全圖的左右邊距 ChartOptions.ChartMargin = {}; ChartOptions.ChartMargin.left = (conMobileMode?40.5:54.5); ChartOptions.ChartMargin.right = (conMobileMode?40.5:54.5); } if (!('ChartWidth' in ChartOptions)) { //圖寬 ChartOptions.ChartWidth = $id(ChartOptions.CanvasID).width - ChartOptions.ChartMargin.left - ChartOptions.ChartMargin.right; } if (!('ChartHeight' in ChartOptions)) { ChartOptions.ChartHeight = $id(ChartOptions.CanvasID).height; } if (!('ChartHeightList' in ChartOptions)) { ChartOptions.ChartHeightList = [3,1,1,1,1,1,1,1,1,1]; } if (!('CrossLineAndTipMgr' in ChartOptions)) { //十字線與資訊框定義 ChartOptions.CrossLineAndTipMgr = { GetCrossPoint: function (ev) { ResetIndexCurrent(ev, StockPainter); //取得目前的Index位置 return { x: GetXbyIDX(StockPainter.ChartOptions.IndexCurrent, StockPainter), y: GetYbyCrossPoint(StockPainter, ev) }; }, TipOptions: { GetTipHtml: function (ev) { ResetLegend(StockPainter); var TipHtml = GetTipHtml(StockPainter, ev); TipHtml.Tip = GetTipText(StockPainter); return TipHtml; }, Size: { width: (conMobileMode?160:220), height: null }, //資訊框的大小 Position: { x: false, y: 1 }, //position中的值是相對於canvas的左上角的 Opacity: 88, //透明度 CssClass: '', OffsetToPoint: (conMobileMode?20:30), //資訊框與游標的距離 TipAxisL: { Opacity: 92, Color: 'orange', BackgroundColor: 'white' }, TipAxisR: { Opacity: 92, Color: 'orange', BackgroundColor: 'white' } }, CrossLineOptions: { Color: 'black', LineWidth: 1 } }; } if (IsNumeric(ChartOptions.TipWidth)) { ChartOptions.CrossLineAndTipMgr.TipOptions.Size.width = ChartOptions.TipWidth; } //Load chart configuration if (ChartConfig) { if ('FontColor' in ChartConfig) { ChartOptions.FontColor = ChartConfig.FontColor; } if ('BackgroundColor' in ChartConfig) { ChartOptions.BackgroundColor = ChartConfig.BackgroundColor; } } //Initialize ChartItems(記得要確保物件順序) var NewChartItems = {}; var s = UCase(('ChartCat' in ChartOptions?ChartOptions.ChartCat:'')) // if (InStr('|WEEK|MONTH|QUAR|YEAR|','|'+s+'|') > 0) { var arr = ['ControllerBox','KLine','Volume','VolumeDif','VolumeDaily','VolumeTurnover','Amount','AmountDif','AmountDaily', 'OBV','RSI','KD','MACD','BIAS','WilliamsR','DMI','BollingerPB','BollingerBW','MTM']; // } else { // var arr = ['ControllerBox','KLine','Volume','VolumeDif','VolumeTurnover','Amount','AmountDif', // 'OBV','RSI','KD','MACD','BIAS','WilliamsR','DMI','BollingerPB','BollingerBW','MTM']; // } for (v of arr) { if (v in ChartOptions.ChartItems) { NewChartItems[v] = ChartOptions.ChartItems[v]; } else { NewChartItems[v] = StdChartItem(v, ChartOptions); } } var ChartItems = ChartOptions.ChartItems; var arrChartItems = Object.keys(ChartItems) for (var i = 0; i < arrChartItems.length; i++) { if (!(arrChartItems[i] in NewChartItems)) { NewChartItems[arrChartItems[i]] = ChartItems[arrChartItems[i]]; // NewChartItems[arrChartItems[i]] = JSON.parse(JSON.stringify(ChartItems[arrChartItems[i]])); //比較安全的完整複製法 } } ChartOptions.ChartItems = NewChartItems; // ChartOptions.ChartItems = JSON.parse(JSON.stringify(NewChartItems)); //比較安全的完整複製法 //assign parameters to ChartItem & PaintItem var ChartItems = ChartOptions.ChartItems; var arrChartItems = Object.keys(ChartItems) for (var i = 0; i < arrChartItems.length; i++) { var ChartItem = ChartItems[arrChartItems[i]]; if (!('ID' in ChartItem)) { ChartItem.ID = arrChartItems[i]; } if (!('Font' in ChartItem)) { ChartItem.Font = conFontSize11 + 'px Arial'; } if (!('BorderColor' in ChartItem)) { ChartItem.BorderColor = 'gray'; } //定義邊框的顏色 if (!('BorderLineWidth' in ChartItem)) { ChartItem.BorderLineWidth = 1; } //定義邊框的寬度 if (!('BorderLineStyle' in ChartItem)) { ChartItem.BorderLineStyle = 'solid'; } //定義邊框的款式 if (!('SplitLineColor' in ChartItem)) { ChartItem.SplitLineColor = '#e6e6e6'; } //定義格線的顏色 if (!('SplitLineWidth' in ChartItem)) { ChartItem.SplitLineWidth = 1; } //定義格線的寬度 if (!('SplitLineStyle' in ChartItem)) { ChartItem.SplitLineStyle = 'solid'; } //定義格線的款式 if (!('InitVLineCount' in ChartItem)) { ChartItem.InitVLineCount = (conMobileMode?5:8); } //定義縱線初始數量 if (!('Margin' in ChartItem)) { ChartItem.Margin = {}; } if (!('top' in ChartItem.Margin)) { ChartItem.Margin.top = conLineHeight17; } if (!('bottom' in ChartItem.Margin)) { ChartItem.Margin.bottom = 0; } if (!('Legend' in ChartItem)) { ChartItem.Legend = {}; } if (!('InitHeight' in ChartItem.Legend)) { ChartItem.Legend.InitHeight = conLineHeight16; } if (!('LineHeight' in ChartItem.Legend)) { ChartItem.Legend.LineHeight = conLineHeight16; } if (!('Font' in ChartItem.Legend)) { ChartItem.Legend.Font = conFontSize12 + 'px Arial'; } if (!('TextBaseline' in ChartItem.Legend)) { ChartItem.Legend.TextBaseline = 'top'; } if (!('xAxis' in ChartItem)) { ChartItem.xAxis = {}; } if (!('Font' in ChartItem.xAxis)) { ChartItem.xAxis.Font = conFontSize11 + 'px Arial'; } if (!('Color' in ChartItem.xAxis)) { ChartItem.xAxis.Color = 'black'; } if (!('Align' in ChartItem.xAxis)) { ChartItem.xAxis.Align = 'center'; } if (!('TextBaseline' in ChartItem.xAxis)) { ChartItem.xAxis.TextBaseline = 'top'; } if (!('ShowText' in ChartItem.xAxis)) { ChartItem.xAxis.ShowText = 'F'; } if (!('yAxisL' in ChartItem)) { ChartItem.yAxisL = {}; } if (!('Font' in ChartItem.yAxisL)) { ChartItem.yAxisL.Font = conFontSize11 + 'px Arial'; } if (!('Color' in ChartItem.yAxisL)) { ChartItem.yAxisL.Color = 'black'; } if (!('Align' in ChartItem.yAxisL)) { ChartItem.yAxisL.Align = 'right'; } if (!('TextBaseline' in ChartItem.yAxisL)) { ChartItem.yAxisL.TextBaseline = 'middle'; } if (!('ShowSplitLine' in ChartItem.yAxisL)) { ChartItem.yAxisL.ShowSplitLine = 'F'; } if (!('yAxisR' in ChartItem)) { ChartItem.yAxisR = {}; } if (!('Font' in ChartItem.yAxisR)) { ChartItem.yAxisR.Font = conFontSize11 + 'px Arial'; } if (!('Color' in ChartItem.yAxisR)) { ChartItem.yAxisR.Color = 'black'; } if (!('Align' in ChartItem.yAxisR)) { ChartItem.yAxisR.Align = 'left'; } if (!('TextBaseline' in ChartItem.yAxisR)) { ChartItem.yAxisR.TextBaseline = 'middle'; } if (!('ShowSplitLine' in ChartItem.yAxisR)) { ChartItem.yAxisR.ShowSplitLine = 'F'; } if ('PaintItems' in ChartItem) { var PaintItems = ChartItem.PaintItems; var arrPaintItems = Object.keys(PaintItems); for (var j = 0; j < arrPaintItems.length; j++) { var PaintItem = PaintItems[arrPaintItems[j]]; if (!('ID' in PaintItem)) { PaintItem.ID = arrPaintItems[j]; } if (!('PaintGroup' in PaintItem)) { PaintItem.PaintGroup = arrPaintItems[j]; } } } } } function InitIndicesData(StockData, ChartOptions) { var ChartItems = ChartOptions.ChartItems; if ('KLine' in ChartItems) { // 計算波段高低點 InitKLineBandData(StockData, ChartOptions, ChartItems.KLine.PaintItems.KLine); // 計算價格移動平均線 InitMA_Data(StockData, ChartOptions, ChartItems.KLine, 'MA_' + ChartOptions.ChartCat, ChartItems.KLine.PaintItems.KLine.Fields.Close); InitMA_Data(StockData, ChartOptions, ChartItems.KLine, 'EMA_' + ChartOptions.ChartCat, ChartItems.KLine.PaintItems.KLine.Fields.Close); //計算Bollinger InitBollingerData(StockData, ChartOptions, ChartItems.KLine); //計算SAR InitSarData(StockData, ChartOptions, ChartItems.KLine); } if ('Volume' in ChartItems) { //計算量能移動平均線 InitMA_Data(StockData, ChartOptions, ChartItems.Volume, 'MA_' + ChartOptions.ChartCat, ChartItems.Volume.PaintItems.Volume.Fields.Field); } if ('VolumeDif' in ChartItems) { //計算成交量能增減數 InitVolumeDif_Data(StockData, ChartOptions, ChartOptions.ChartItems.VolumeDif); } if ('VolumeDaily' in ChartItems) { //計算量能移動平均線 if (ChartItems.VolumeDaily.IsShow != 'AlwaysHide') { InitMA_Data(StockData, ChartOptions, ChartItems.VolumeDaily, 'MA_' + ChartOptions.ChartCat, ChartItems.VolumeDaily.PaintItems.VolumeDaily.Fields.Field); } } if ('Amount' in ChartItems) { //計算成交金額移動平均線 InitMA_Data(StockData, ChartOptions, ChartOptions.ChartItems.Amount, 'MA_' + ChartOptions.ChartCat, ChartOptions.ChartItems.Amount.PaintItems.Amount.Fields.Field); } if ('AmountDif' in ChartItems) { //計算成交量能增減數 InitVolumeDif_Data(StockData, ChartOptions, ChartOptions.ChartItems.AmountDif); } if ('AmountDaily' in ChartItems) { //計算日平均成交金額移動平均線 if (ChartItems.AmountDaily.IsShow != 'AlwaysHide') { InitMA_Data(StockData, ChartOptions, ChartOptions.ChartItems.AmountDaily, 'MA_' + ChartOptions.ChartCat, ChartOptions.ChartItems.AmountDaily.PaintItems.AmountDaily.Fields.Field); } } if ('OBV' in ChartItems) { //計算OBV InitOBV_Data(StockData, ChartOptions, ChartItems.OBV, { Close:'收盤價', Volume:(ChartOptions.StockCat=='指數'?'成交額':'成交量'), OBV:'OBV', OBV_MA:'OBV_MA' }); } if ('RSI' in ChartItems) { //計算RSI InitRSI_Data(StockData, ChartOptions, ChartItems.RSI); } if ('KD' in ChartItems) { //計算RSV,K,D,J InitKD_Data(StockData, ChartOptions, ChartItems.KD); } if ('MACD' in ChartItems) { //計算MACD InitMACD_Data(StockData, ChartOptions, ChartItems.MACD); } if ('BIAS' in ChartItems) { //計算BIAS InitBIAS_Data(StockData, ChartOptions, ChartItems.KLine, ChartItems.BIAS); } if ('WilliamsR' in ChartItems) { //計算威廉指標 InitWilliamsR_Data(StockData, ChartOptions, ChartItems.WilliamsR); } if ('DMI' in ChartItems) { //計算DMI InitDMI_Data(StockData, ChartOptions, ChartItems.DMI); } if ('MTM' in ChartItems) { //計算MTM InitMTM_Data(StockData, ChartOptions, ChartItems.MTM); } } function GetRoundSetting(o) { var result = { Round: 3.2, AutoRound: true }; if (!o) { return result; } if (o.AutoRound == 'T') { if (IsNumeric(o.Round)) { result.Round = o.Round; } result.AutoRound = true } else if (IsNumeric(o.AutoRound)) { result.Round = o.AutoRound; result.AutoRound = true; } else if (IsFloat(o.Round)) { result.Round = o.Round; result.AutoRound = true; } else if (IsInt(o.Round)) { result.Round = o.Round; result.AutoRound = false; } return result; } function StdChartItem(sChartItemName, ChartOptions) { switch (UCase(sChartItemName)) { case 'KLINE': var r = { //定義K線圖位置 Name: (ChartOptions.Language=='CN'?'K线图':'K線圖'), IsShow: 'AlwaysShow', Margin: { bottom: conLineHeight18 }, Legend: { Type: 'KLine' }, xAxis: { ShowText: 'T' }, yAxisR: { ShowSplitLine: 'T' }, PaintOdr: ['MA','KLine'], //另外定義繪圖順序,若有使用者重新定義就會使用新的設定值 PaintItems: { KLine: { Type: 'Candle', yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: 'red', FallColor: 'green', Fields: { Open: '開盤價', Close: '收盤價', High: '最高價', Low: '最低價' }, Legend: { Round:(conMobileMode?5.2:2) }, BandTag: {/*有宣告BandTag才會顯示波段數值*/}, }, // 定義移動平均線 ['MA_' + ChartOptions.ChartCat + '0']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine0' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '1']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine1' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '2']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine2' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '3']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine3' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '4']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine4' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '5']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine5' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '6']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine6' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '7']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine7' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['MA_' + ChartOptions.ChartCat + '8']: { Type: 'Line', PaintGroup: 'MA', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_KLine8' }, Legend: { Round:(conMobileMode?3.2:2) } }, // 定義平滑移動平均線 ['EMA_' + ChartOptions.ChartCat + '0']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine0' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '1']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine1' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '2']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine2' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '3']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine3' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '4']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine4' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '5']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine5' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '6']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine6' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '7']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine7' }, Legend: { Round:(conMobileMode?3.2:2) } }, ['EMA_' + ChartOptions.ChartCat + '8']: { Type: 'Line', PaintGroup: 'EMA', yAxisAlign: 'yAxisR', Fields: { Field: 'EMA_KLine8' }, Legend: { Round:(conMobileMode?3.2:2) } }, // 定義布林軌道 ['BollingerBandsUP_' + ChartOptions.ChartCat]: { Type: 'Line', PaintGroup: 'BollingerBands', yAxisAlign: 'yAxisR', Legend: { ShowTrend: 'T' }, Fields: { Field: 'BollingerBandsUP' }, Legend: { Round:(conMobileMode?2.2:3.2) } }, ['BollingerBandsMA_' + ChartOptions.ChartCat]: { Type: 'Line', PaintGroup: 'BollingerBands', yAxisAlign: 'yAxisR', Legend: { ShowTrend: 'T' }, Fields: { Field: 'BollingerBandsMA', PB: 'BollingerPB', BW: 'BollingerBW' }, Legend: { Round:(conMobileMode?2.2:3.2) } }, ['BollingerBandsDN_' + ChartOptions.ChartCat]: { Type: 'Line', PaintGroup: 'BollingerBands', yAxisAlign: 'yAxisR', Legend: { ShowTrend: 'T' }, Fields: { Field: 'BollingerBandsDN' }, Legend: { Round:(conMobileMode?2.2:3.2) } }, // SAR停損停利指標 SAR: { Type: 'Point', PaintGroup: 'SAR', yAxisAlign: 'yAxisR', Fields: { Field: 'SAR', ColorField: 'SAR_COLOR' }, Legend: { Round:(conMobileMode?2.2:3.2) } }, }, }; var arrExtraIDX = []; var s = '|' + UCase(ChartOptions.AspNM) + '|' if (ChartOptions.Language == 'CN') { if (InStr('|K_CHART.DATA.CN|',s) > 0) { arrExtraIDX = ['IDX_SH000001','IDX_SZ399001']; } } else { if (InStr('|SHOWK_CHART.DATA|',s) > 0) { arrExtraIDX = ['IDX_TSE','IDX_OTC','DividendFlag']; } var s0 = '|SALARY.DATA|STOCKASSETSSTATUS.DATA|STOCKBZPERFORMANCE.DATA|STOCKCASHFLOW.DATA' + '|STOCKDIRECTORSHAREHOLD.DATA|STOCKDIVIDENDPOLICY.DATA|'; if (InStr(s0,s) > 0) { arrExtraIDX = ['AvgPrice']; } } for (var v of arrExtraIDX) { switch (UCase(v)) { case 'IDX_TSE': r.PaintItems[v] = { Name: '加權指數', PaintGroup: 'IDX_TSE', Type: 'Line', LineWidth: 1, Color: '#0000FF', yAxisAlign: 'yAxis'+(ChartOptions.StockID=='加權指數'?'R':'L'), Fields: { Field: '加權指數' }, Legend: { Align: 'left', ShowTrend: 'T', Round:(conMobileMode?4.2:2) } }; break; case 'IDX_OTC': r.PaintItems[v] = { Name: '櫃買指數', PaintGroup: 'IDX_OTC', Type: 'Line', LineWidth: 1, Color: '#00FF00', yAxisAlign: 'yAxis'+(ChartOptions.StockID=='櫃買指數'?'R':'L'), Fields: { Field: '櫃買指數' }, Legend: { Align: 'left', ShowTrend: 'T', Round:(conMobileMode?4.2:2) } }; break; case 'DIVIDENDFLAG': //定義除權息標記 r.PaintItems[v] = { Type: 'Flag', yAxisAlign: 'yAxisR', Pointer: '▼', Color: '#000000', TextBaseline: 'bottom', Offset: { x: 0, y: -12 }, IsShow: (ChartOptions.StockCat=='指數'?'AlwaysHide':'F'), Fields: { Field: 'DIVIDEND_FLAG', PositionRefer: '最高價' } }; break; case 'AVGPRICE': r.PaintItems[v] = { Name: (ChartOptions.Language=='CN'?'平均收盘价':'平均收盤價'), PaintGroup: 'AvgPrice', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#0000FF', IsShow: 'T', Fields: { Field: '平均價' }, Legend: { Align: 'left', ShowTrend: 'T', Round:(conMobileMode?3.2:2) } }; break; case 'IDX_SH000001': r.PaintItems[v] = { Name: '上证指数', PaintGroup: 'IDX_SH000001', Type: 'Line', LineWidth: 1, Color: '#0000FF',IsShow: 'T', yAxisAlign: 'yAxis'+(ChartOptions.MarketCat+ChartOptions.StockID=='上海000001'?'R':'L'), Fields: { Field: '上證指數' }, Legend: { Align: 'left', ShowTrend: 'T', Round:(conMobileMode?4.3:3) } }; break; case 'IDX_SZ399001': r.PaintItems[v] = { Name: '深证指数', PaintGroup: 'IDX_SZ399001', Type: 'Line', LineWidth: 1, Color: '#00FF00',IsShow: 'T', yAxisAlign: 'yAxis'+(ChartOptions.MarketCat+ChartOptions.StockID=='深圳399001'?'R':'L'), Fields: { Field: '深證指數' }, Legend: { Align: 'left', ShowTrend: 'T', Round:(conMobileMode?4.3:3) } }; break; } } return r; break; case 'VOLUME': var sUnit = (ChartOptions.Language=='CN'?'手':'張'); var sName = (ChartOptions.Language=='CN'||conMobileMode?'成交量':'成交張數'); return { Name: sName, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', InitAxisLow: 0, LimitAxisLow: 0, ShowSplitLine: 'T' }, PaintOdr: ['Volume','MA'], PaintItems: { Volume: { Type: 'Bar', Name: sName, yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: 'red', FallColor: 'green', Fields: { Field: '成交量', ColorField: '漲跌價' }, Legend: { Align: 'right', Color: 'black', ShowDiffAmount: 'T', Unit: sUnit, BigNumberToText: 'T' } }, ['MA_' + ChartOptions.ChartCat + '0']: { PaintGroup: 'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_Volume0' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: sUnit } }, ['MA_' + ChartOptions.ChartCat + '1']: { PaintGroup: 'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_Volume1' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: sUnit } }, ['MA_' + ChartOptions.ChartCat + '2']: { PaintGroup: 'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_Volume2' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: sUnit } }, }, }; break; case 'VOLUMEDIF': var sUnit = (ChartOptions.Language=='CN'?'手':'張'); var sName = (ChartOptions.Language=='CN'||conMobileMode?'成交量增减':'成交張數增減'); return { Name: sName, yAxisL: { BigNumberToText: 'T', IsSymmetrical: 'T' }, yAxisR: { BigNumberToText: 'T', IsSymmetrical: 'T', ShowSplitLine: 'T' }, PaintItems: { Div: { Name: sName, Type: 'Bar', yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: '#FF0000', FallColor: '#008000', Fields: { Field: '成交量增減數', ColorField: '成交量增減數' }, Legend: { Align: 'right', ShowPlusFlag: 'T', Unit: sUnit, BigNumberToText: 'T' } }, DivRatio: { Name: sName+'率', Type: 'Line', yAxisAlign: 'yAxisL', LineWidth: 1.2, Color: '#FFA500', IsShow: 'T', Fields: { Field: '成交量增減幅' }, Legend: { Align: 'left', ShowPlusFlag: 'T', Unit: '%' } }, }, }; break; case 'VOLUMEDAILY': var sUnit = (ChartOptions.Language=='CN'?'手':'張'); var sName = (conMobileMode?'日均成交量':(ChartOptions.Language=='CN'?'平均日成交量':'平均日成交張數')); var sShow = (InStr('|WEEK|MONTH|QUAR|YEAR|','|'+UCase(ChartOptions.ChartCat)+'|')>0?'T':'AlwaysHide'); return { Name: sName, IsShow: sShow, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', InitAxisLow: 0, LimitAxisLow: 0, ShowSplitLine: 'T' }, PaintOdr: ['VolumeDaily','MA'], PaintItems: { VolumeDaily: { Type: 'Bar', Name: sName, yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: 'red', FallColor: 'green', Fields: { Field: '平均日成交量', ColorField: '漲跌價' }, Legend: { Align: 'right', ShowDiffAmount: 'T', Unit: sUnit, BigNumberToText: 'T' } }, ['MA_' + ChartOptions.ChartCat + '0']: { PaintGroup: 'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_VolumeDaily0' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: sUnit } }, ['MA_' + ChartOptions.ChartCat + '1']: { PaintGroup: 'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_VolumeDaily1' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: sUnit } }, ['MA_' + ChartOptions.ChartCat + '2']: { PaintGroup: 'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_VolumeDaily2' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: sUnit } }, }, }; break; case 'VOLUMETURNOVER': sName = (ChartOptions.Language=='CN'?'换手率':'成交張數週轉率'); sField = (ChartOptions.Language=='CN'?'換手率':'成交量週轉率'); return { Name: sName, IsShow: (ChartOptions.StockCat=='指數'||ChartOptions.StockCat=='指数'?'AlwaysHide':''), Legend: { Title: { Name: '【'+sName+'】', Align: 'left' } }, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', ShowSplitLine: 'T', LimitAxisLow: 0 }, PaintOdr: 'desc', PaintItems: { Turnover: { Name: sName, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: sField }, Legend: { Align: 'right', ShowDiffAmount: 'T', BigNumberToText: 'T', Unit: '%' } }, } }; break; case 'AMOUNT': //成交金額 var sName = (ChartOptions.Language=='CN'?'成交额':(conMobileMode?'成交額':'成交金額')); return { Name: sName, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', InitAxisLow: 0, LimitAxisLow: 0, ShowSplitLine: 'T' }, PaintItems: { Amount: { Name: sName, Type: 'Bar', yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: 'red', FallColor: 'green', Fields: { Field: '成交額', ColorField: '漲跌價' }, Legend: { Align: 'right', Unit: '元', ShowDiffAmount: 'T', BigNumberToText: 'T' } }, ['MA_' + ChartOptions.ChartCat + '0']: { PaintGroup:'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_Amount0' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: '元' } }, ['MA_' + ChartOptions.ChartCat + '1']: { PaintGroup:'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_Amount1' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: '元' } }, ['MA_' + ChartOptions.ChartCat + '2']: { PaintGroup:'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_Amount2' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: '元' } }, } }; break; case 'AMOUNTDIF': var sName = (ChartOptions.Language=='CN'?'成交额增减':(conMobileMode?'成交額增減':'成交金額增減')); return { Name: sName, yAxisL: { IsSymmetrical: 'T' }, yAxisR: { IsSymmetrical: 'T', BigNumberToText: 'T', ShowSplitLine: 'T' }, PaintItems: { Div: { Name: sName, Type: 'Bar', yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: '#FF0000', FallColor: '#008000', Fields: { Field: '成交額增減數', ColorField: '成交額增減數' }, Legend: { Align: 'right', ShowPlusFlag: 'T', Unit: '元', BigNumberToText: 'T' } }, DivRatio: { Name: sName+'率', Type: 'Line', yAxisAlign: 'yAxisL', LineWidth: 1.2, Color: '#FFA500', IsShow: 'T', Fields: { Field: '成交額增減幅' }, Legend: { Align: 'left', ShowPlusFlag: 'T', Unit: '%' } }, }, }; break; case 'AMOUNTDAILY': var sName = (ChartOptions.Language=='CN'?(conMobileMode?'日均成交额':'平均日成交额'):(conMobileMode?'日均成交額':'平均日成交金額')); var sShow = (InStr('|WEEK|MONTH|QUAR|YEAR|','|'+UCase(ChartOptions.ChartCat)+'|')>0?'T':'AlwaysHide'); return { Name: sName, IsShow: sShow, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', InitAxisLow: 0, LimitAxisLow: 0, ShowSplitLine: 'T' }, PaintOdr: ['AmountDaily','MA'], PaintItems: { AmountDaily: { Name: sName, Type: 'Bar', yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: 'red', FallColor: 'green', Fields: { Field: '平均日成交額', ColorField: '漲跌價' }, Legend: { Align: 'right', Unit: '元', ShowDiffAmount: 'T', BigNumberToText: 'T' } }, ['MA_' + ChartOptions.ChartCat + '0']: { PaintGroup:'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_AmountDaily0' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: '元' } }, ['MA_' + ChartOptions.ChartCat + '1']: { PaintGroup:'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_AmountDaily1' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: '元' } }, ['MA_' + ChartOptions.ChartCat + '2']: { PaintGroup:'MA', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'MA_AmountDaily2' }, Legend: { Align: 'left', ShowTrend: 'T', BigNumberToText: 'T', Unit: '元' } }, } }; break; case 'OBV': return { Name: 'OBV', //Defined in ChratConfig Legend: { Title: { Name: '【OBV】', Align: 'left' } }, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', ShowSplitLine: 'T' }, PaintOdr: 'desc', PaintItems: { OBV: { Name: 'OBV', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'OBV' }, Legend: { Align: 'right', ShowTrend: 'T', BigNumberToText: 'T' } }, OBV_MA: { Name: (ChartOptions.Language=='CN'?'均线':'均線'), Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#008000', IsShow: 'T', Fields: { Field: 'OBV_MA' }, Legend: { Align: 'right', ShowTrend: 'T', BigNumberToText: 'T' } }, } }; break; case 'RSI': return { //RSI定義 Name: 'RSI', //Defined in ChratConfig Legend: { Title: { Name: '【RSI】', Align: 'left' } }, yAxisR: { InitAxisHigh: 100, InitAxisLow: 0, LimitAxisHigh: 100, LimitAxisLow: 0, ShowSplitLine: 'T', SplitPoint: [0, 20, 50, 80, 100] }, PaintItems: { RSI1: { nDays: null, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'RSI1' }, Legend: { Align: 'right', ShowTrend: 'T' } }, RSI2: { nDays: null, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#008000', IsShow: 'T', Fields: { Field: 'RSI2' }, Legend: { Align: 'right', ShowTrend: 'T' } }, } }; break; case 'KD': var sName = (ChartOptions.Language=='CN'?'KD指标':'KD指標'); return { //KD圖位置定義 Name: sName, nDays: null, //Defined in ChratConfig Legend: { Title: { Name: '【' + sName + '】', Align: 'left' } }, yAxisR: { ScalesSpace: 5, InitAxisHigh: 100, InitAxisLow: 0, ShowSplitLine: 'T', SplitPoint: [0, 20, 50, 80, 100] }, PaintOdr: ['RSV','J','D','K'], PaintItems: { K: { Name: 'K', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'K值' }, Legend: { Align: 'right', ShowTrend: 'T' } }, D: { Name: 'D', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#008000', IsShow: 'T', Fields: { Field: 'D值' }, Legend: { Align: 'right', ShowTrend: 'T' } }, J: { Name: 'J', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#8000FF', IsShow: 'T', Fields: { Field: 'J值' }, Legend: { Align: 'right', ShowTrend: 'T' } }, RSV: { Name: 'RSV', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#808080', IsShow: 'T', Fields: { Field: 'RSV' }, Legend: { Align: 'right', ShowTrend: 'T' } } } }; break; case 'MACD': return { //MACD圖位置定義 Name: 'MACD', nEMA1: null, nEMA2: null, nDays: null, nMultiOSC: null, //Defined in ChartConfig Legend: { Title: { Name: '【MACD】', Align: 'left' } }, yAxisR: { ShowSplitLine: 'T', IsSymmetrical: 'T' }, PaintOdr: ['OSC','MACD','DIF'], PaintItems: { DIF: { Name: 'DIF', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1.2, Color: '#FFA500', IsShow: 'T', Fields: { Field: 'DIF' }, Legend: { Align: 'right', ShowTrend: 'T' } }, MACD: { Name: 'MACD', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1.2, Color: '#008000', IsShow: 'T', Fields: { Field: 'MACD' }, Legend: { Align: 'right', ShowTrend: 'T' } }, OSC: { Name: 'OSC', Type: 'Bar', yAxisAlign: 'yAxisR', BarWidth: 5, SpaceWidth: 2, RiseColor: '#0033CC', FallColor: '#668CFF', Fields: { Field: 'OSC', ColorField: 'OSC' }, Legend: { Align: 'right', ShowTrend: 'T' } } }, }; break; case 'BIAS': var sName = (ChartOptions.Language=='CN'?'BIAS均线乖离率':'BIAS均線乖離率'); return { //BIAS定義 Name: sName, Legend: { Title: { Name: '【' + Right(sName,3) + '】', Align: 'left' } }, yAxisR: { ShowSplitLine: 'T' }, PaintOdr: 'desc', PaintItems: { BIAS0: { ReferItem: 'MA_' + ChartOptions.ChartCat + '0', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS0' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS1: { ReferItem: 'MA_' + ChartOptions.ChartCat + '1', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS1' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS2: { ReferItem: 'MA_' + ChartOptions.ChartCat + '2', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS2' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS3: { ReferItem: 'MA_' + ChartOptions.ChartCat + '3', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS3' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS4: { ReferItem: 'MA_' + ChartOptions.ChartCat + '4', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS4' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS5: { ReferItem: 'MA_' + ChartOptions.ChartCat + '5', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS5' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS6: { ReferItem: 'MA_' + ChartOptions.ChartCat + '6', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS6' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS7: { ReferItem: 'MA_' + ChartOptions.ChartCat + '7', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS7' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, BIAS8: { ReferItem: 'MA_' + ChartOptions.ChartCat + '8', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Fields: { Field: 'BIAS8' }, Legend: { Align: 'right', ShowTrend: 'T', ShowPlusFlag: 'T', Unit: '%', AutoRound:2 } }, } }; break; case 'WILLIAMSR': var sName = (ChartOptions.Language=='CN'?'威廉指标':'威廉指標'); return { //威廉指標位置定義 Name: sName, nDays: null, //Defined in ChratConfig Legend: { Title: { Name: '【' + sName + '】', Align: 'left' } }, yAxisR: { InitAxisHigh: 0, InitAxisLow: -100, ScalesSpace: 5, ShowSplitLine: 'T', SplitPoint: [-100, -80, -50, -20, 0] }, PaintItems: { WR1: { nDays: null, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'WR1' }, Legend: { Align: 'right', ShowTrend: 'T' } }, WR2: { nDays: null, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#008000', IsShow: 'T', Fields: { Field: 'WR2' }, Legend: { Align: 'right', ShowTrend: 'T' } }, WR3: { nDays: null, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#0000FF', IsShow: 'T', Fields: { Field: 'WR3' }, Legend: { Align: 'right', ShowTrend: 'T' } }, } }; break; case 'DMI': var sName = (ChartOptions.Language=='CN'?'DMI趋向指标':'DMI趨向指標'); return { //DMI圖位置定義 Name: sName, //Defined in ChratConfig nDaysDI: null, nDaysADX: null, nDaysADXR: null, Legend: { Title: { Name: '【' + sName + '】', Align: 'left' } }, yAxisR: { ShowSplitLine: 'T', LimitAxisLow: 0 }, PaintItems: { DI1: { Name: '+DI', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'DI1' }, Legend: { Align: 'right', ShowTrend: 'T', Round: 2 } }, DI2: { Name: '-DI', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'DI2' }, Legend: { Align: 'right', ShowTrend: 'T', Round: 2 } }, ADX: { Name: 'ADX', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'ADX' }, Legend: { Align: 'right', ShowTrend: 'T', Round: 2 } }, ADXR: { Name: 'ADXR', Type: 'Line', yAxisAlign: 'yAxisR', Fields: { Field: 'ADXR' }, Legend: { Align: 'right', ShowTrend: 'T', Round: 2 } } } }; break; case 'BOLLINGERPB': return { Name: '布林%b', //Defined in ChratConfig Legend: { Title: { Name: '【布林%b】', Align: 'left' } }, yAxisR: { ShowSplitLine: 'T', ScalesSpace: 0.05, SplitPoint: [0, 0.25, 0.5, 0.75, 1] }, PaintItems: { PB: { Name: '布林%b', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'BollingerPB' }, Legend: { Align: 'right', ShowTrend: 'T' } }, } }; break; case 'BOLLINGERBW': var sName = (ChartOptions.Language=='CN'?'布林带宽':'布林帶寬'); return { Name: sName, //Defined in ChratConfig Legend: { Title: { Name: '【' + sName + '】', Align: 'left' } }, yAxisR: { ShowSplitLine: 'T' }, PaintItems: { BW: { Name: sName, Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'BollingerBW' }, Legend: { Align: 'right', ShowTrend: 'T' } }, } }; break; case 'MTM': var sName = (ChartOptions.Language=='CN'?'MTM动量指标':'MTM動量指標'); return { Name: sName, //Defined in ChratConfig Legend: { Title: { Name: '【' + sName + '】', Align: 'left' } }, yAxisL: { BigNumberToText: 'T' }, yAxisR: { BigNumberToText: 'T', ShowSplitLine: 'T', IsSymmetrical: 'T' }, PaintOdr: 'desc', PaintItems: { MTM: { Name: 'MTM', Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#FF0000', IsShow: 'T', Fields: { Field: 'MTM' }, Legend: { Align: 'right', ShowTrend: 'T', BigNumberToText: 'T' } }, MTM_MA: { Name: (ChartOptions.Language=='CN'?'均线':'均線'), Type: 'Line', yAxisAlign: 'yAxisR', LineWidth: 1, Color: '#008000', IsShow: 'T', Fields: { Field: 'MTM_MA' }, Legend: { Align: 'right', ShowTrend: 'T', BigNumberToText: 'T' } }, } }; break; case 'CONTROLLERBOX': return { //控制桿背景圖位置定義 (物件名稱不可變更) BorderColor: 'gray', BorderLineWidth: 1, BorderLineStyle: 'solid', //定義邊框的顏色,寬度,格式 SplitLineColor: '#e6e6e6', SplitLineWidth: 1, SplitLineStyle: 'solid', //定義底線的顏色,寬度,格式 HLineCount: 1, VLineCount: 0, //定義橫線及縱線數量 FillColor: 'lightgray', Alpha: 0.5, //線圖底色及透明度 Margin: { top: conLineHeight08, bottom: 2 }, Region: { InitHeight: (conMobileMode?55:75), ButtonHeight: (conMobileMode?15:25) }, // 控制桿大小定義 Controller: { Bar: { width: (conMobileMode?36:40), height: (conMobileMode?38:49), BorderColor: 'black', FillColor: 'lightgray' }, Button: {} } }; break; default: return {}; } } // 計算交易狀況未提供的欄位(如漲跌幅,昨收價), 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); // } // } // } //} // ============================================================================================================================================