{"version":3,"sources":["jsdelivr-header.js","/npm/umchart-utils@1.0.2/dist/utils.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,CCEA,SAA2C,EAAM,GAC1B,iBAAZ,SAA0C,iBAAX,OACxC,OAAO,QAAU,IACQ,mBAAX,QAAyB,OAAO,IAC9C,OAAO,GAAI,GACe,iBAAZ,QACd,QAAgB,OAAI,IAEpB,EAAa,OAAI,GAClB,CATD,CASG,MAAM,IACO,MACN,aACA,IAAI,oBAAsB,CAE9B;;;0BAIA,CAAE,wBAAyB,oBAAqB,uBAEtD,KAAK,s2jjGAEE,GAKO,oBAAsB,CAMzB,EAAwB,CAAC,EAAS,KACjC,IAAI,IAAI,KAAO,EACX,oBAAoB,EAAE,EAAY,KAAS,oBAAoB,EAAE,EAAS,IAC5E,OAAO,eAAe,EAAS,EAAK,CAAE,YAAY,EAAM,IAAK,EAAW,IAE1E,EAMD,EAAwB,CAAC,EAAK,IAAU,OAAO,UAAU,eAAe,KAAK,EAAK,GAMlF,EAAyB,IACH,oBAAX,QAA0B,OAAO,aAC1C,OAAO,eAAe,EAAS,OAAO,YAAa,CAAE,MAAO,WAE7D,OAAO,eAAe,EAAS,aAAc,CAAE,OAAO,GAAO,GAS3D,oBAAsB,CAAC,EAG3B,OAFA,oBAAoB,kBAAkB,EAAG,oBAAqB,qBAEvD,mBACP,EAzDM","file":"/npm/umchart-utils@1.0.2/dist/utils.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/umchart-utils@1.0.2/dist/utils.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n * ATTENTION: The \"eval\" devtool has been used (maybe by default in mode: \"development\").\n * This devtool is neither made for production nor for readable output files.\n * It uses \"eval()\" calls to create a separate source file in the browser devtools.\n * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)\n * or disable the default devtool with \"devtool: false\".\n * If you are looking for production-ready output files, see mode: \"production\" (https://webpack.js.org/configuration/mode/).\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mUtils\"] = factory();\n\telse\n\t\troot[\"mUtils\"] = factory();\n})(self, () => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./src/index.js\":\n/*!**********************!*\\\n  !*** ./src/index.js ***!\n  \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\neval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */   \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n\\r\\n//日志输出类\\r\\nvar JSConsole=\\r\\n    {\\r\\n        Chart:{ Log:console.log },      //图形日志\\r\\n        Complier:{ Log:console.log },   //编译器日志\\r\\n        JSTable:{ Log:console.log }      //表格日志\\r\\n    };\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n   Copyright (c) 2018 jones\\r\\n\\r\\n    http://www.apache.org/licenses/LICENSE-2.0\\r\\n\\r\\n   开源项目 https://github.com/jones2000/HQChart\\r\\n\\r\\n   jones_2000@163.com\\r\\n\\r\\n   系统指标 (H5版本)\\r\\n*/\\r\\n\\r\\n\\r\\n/*\\r\\n    指标数据脚本 系统内置指标都写在这里\\r\\n    Name：指标名字\\r\\n    Description：指标描述信息\\r\\n    Args:参数 { Name:名字, Value=值 }\\r\\n    IsMainIndex：是否是主图指标 true=主图指标 false=副图指标\\r\\n    KLineType:K线设置 -1=主图不显示K线(只在主图有效) 0=在副图显示K线 1=在副图显示K线(收盘价线) 2=在副图显示K线(美国线)\\r\\n    InstructionType: 1=专家指示  2=五彩K线\\r\\n    FloatPrecision: 小数位数 缺省=2\\r\\n    YSplitScale:  Y固定刻度 [1,8,10]\\r\\n    YSpecificMaxMin: 固定Y轴最大最小值 { Max: 9, Min: 0, Count: 3 };\\r\\n    StringFormat: 1=带单位万/亿 2=原始格式\\r\\n    Condition: 限制条件 { Symbol:'Index'/'Stock'(只支持指数/股票),Period:[](支持的周期), Include:[](指定支持的股票,代码全部大写包括后缀)}\\r\\n    OutName:动态输出变量名字 [{Name:原始变量名, DynamicName:动态名字格式}] 如 {Name:\\\"MA1\\\", DynamicName:\\\"MA{M1}\\\"};\\r\\n*/\\r\\n\\r\\n//周期条件枚举\\r\\nvar CONDITION_PERIOD=\\r\\n    {\\r\\n        MINUTE_ID:101,            //分钟      走势图\\r\\n        MULTIDAY_MINUTE_ID:102,   //多日分钟  走势图\\r\\n        HISTORY_MINUTE_ID:103,    //历史分钟  走势图\\r\\n\\r\\n        //K线周期\\r\\n        KLINE_DAY_ID:0,\\r\\n        KLINE_WEEK_ID:1,\\r\\n        KLINE_TWOWEEK_ID:21,\\r\\n        KLINE_MONTH_ID:2,\\r\\n        KLINE_QUARTER_ID:9,\\r\\n\\r\\n        KLINE_YEAR_ID:3,\\r\\n        KLINE_MINUTE_ID:4,\\r\\n        KLINE_5_MINUTE_ID:5,\\r\\n        KLINE_15_MINUTE_ID:6,\\r\\n        KLINE_30_MINUTE_ID:7,\\r\\n        KLINE_60_MINUTE_ID:8,\\r\\n    };\\r\\n\\r\\n//自定义的指标脚本\\r\\nfunction CustomIndexScript()\\r\\n{\\r\\n    this.DataMap=new Map(); //key=指标id, value=data {ID:, Name：指标名字, Description：指标描述信息 Args:参数 ......}\\r\\n\\r\\n    this.Get=function(id)\\r\\n    {\\r\\n        if (!this.DataMap.has(id)) return null;\\r\\n        return this.DataMap.get(id);\\r\\n    }\\r\\n\\r\\n    this.Add=function(data)\\r\\n    {\\r\\n        this.DataMap.set(data.ID, data);\\r\\n    }\\r\\n}\\r\\n\\r\\nvar g_CustomIndex=new CustomIndexScript();\\r\\n\\r\\nfunction JSIndexScript()\\r\\n{\\r\\n    this.DataMap=new Map(\\r\\n        [\\r\\n            ['MA', this.MA],['均线', this.MA],\\r\\n            [\\\"MA4\\\", this.MA4],[\\\"MA5\\\", this.MA5],[\\\"MA6\\\", this.MA6],[\\\"MA7\\\", this.MA7],[\\\"MA8\\\", this.MA8],\\r\\n            ['BOLL', this.BOLL],['BOLL副图', this.BOLL2],['BBI', this.BBI],\\r\\n            ['DKX', this.DKX],['MIKE', this.MIKE],['PBX', this.PBX],\\r\\n            ['ENE', this.ENE],['MACD', this.MACD],['KDJ', this.KDJ],[\\\"MACD2\\\", this.MACD2],\\r\\n            ['VOL', this.VOL],['RSI', this.RSI],['BRAR', this.BRAR],\\r\\n            ['WR', this.WR],['BIAS', this.BIAS],['OBV', this.OBV],\\r\\n            ['DMI', this.DMI],['CR', this.CR],['PSY', this.PSY],\\r\\n            ['CCI', this.CCI],['DMA', this.DMA],['TRIX', this.TRIX],\\r\\n            ['VR', this.VR],['EMV', this.EMV],['ROC', this.ROC],\\r\\n            ['MTM', this.MTM],['FSL', this.FSL],['CYR', this.CYR],\\r\\n            ['MASS', this.MASS],['WAD', this.WAD],['CHO', this.CHO],\\r\\n            ['ADTM', this.ADTM],['HSL', this.HSL],['BIAS36', this.BIAS36],\\r\\n            ['BIAS_QL', this.BIAS_QL],['DPO', this.DPO],['OSC', this.OSC],\\r\\n            ['ATR', this.ATR],['NVI', this.NVI],['PVI', this.PVI],\\r\\n            ['UOS', this.UOS],['CYW', this.CYW],['LON', this.LON],\\r\\n            ['NDB', this.NDB],['SKDJ',this.SKDJ],['KD',this.KD],['FKX',this.FKX],\\r\\n            ['DKCOL',this.DKCOL],['UDL',this.UDL],['MFI',this.MFI],['LWR',this.LWR],\\r\\n            ['MARSI',this.MARSI],['CYD',this.CYD],['CYF',this.CYF],['TAPI',this.TAPI],\\r\\n            ['VMACD',this.VMACD],['QACD',this.QACD],['VPT',this.VPT],['WVAD',this.WVAD],\\r\\n            ['DBQR',this.DBQR],['JS',this.JS],['CYE',this.CYE],['QR',this.QR],['GDX',this.GDX],\\r\\n            ['JLHB',this.JLHB],['PCNT',this.PCNT],['BTX', this.BTX],['AMO',this.AMO],\\r\\n            ['VRSI',this.VRSI],['HSCOL',this.HSCOL],['DBQRV',this.DBQRV],['DBLB',this.DBLB],\\r\\n            ['ACD',this.ACD],['EXPMA',this.EXPMA],['EXPMA_S',this.EXPMA_S],['HMA',this.HMA],\\r\\n            ['LMA',this.LMA],['VMA',this.VMA],['AMV',this.AMV],['BBIBOLL',this.BBIBOLL],\\r\\n            ['ALLIGAT',this.ALLIGAT],['ZX',this.ZX],['XS',this.XS],['XS2',this.XS2],\\r\\n            ['SG-XDT',this.SG_XDT],['SG-SMX',this.SG_SMX],['SG-LB',this.SG_LB],['SG-PF',this.SG_PF],\\r\\n            ['RAD',this.RAD],['SHT',this.SHT],['ZLJC',this.ZLJC],['ZLMM',this.ZLMM],['SLZT',this.SLZT],\\r\\n            ['ADVOL',this.ADVOL],['CYC',this.CYC],['CYS',this.CYS],['CYQKL',this.CYQKL],\\r\\n            ['SCR',this.SCR],['ASR',this.ASR],['SAR',this.SAR],['TJCJL',this.TJCJL],['量比',this.VOLRate],\\r\\n            ['平均K线',this.HeikinAshi], [\\\"ADL\\\", this.ADL],[\\\"SQJZ\\\", this.SQJZ],[\\\"XT\\\", this.XT],[\\\"CFJT\\\", this.CFJT],[\\\"CYX\\\",this.CYX],\\r\\n            [\\\"WAVE\\\",this.WAVE],\\r\\n            ['VOL-TDX',this.VOL_TDX],\\r\\n            ['EMPTY', this.EMPTY],  //什么都不显示的指标\\r\\n            ['神奇九转', this.NineTurns],\\r\\n\\r\\n            //通达信特色指标\\r\\n            [\\\"散户线\\\", this.ShareholderCount],[\\\"NXTS\\\", this.NXTS],[\\\"FKX\\\", this.FKX],[\\\"两融资金\\\", this.Margin4],\\r\\n            [\\\"ZSDB\\\",this.ZSDB],\\r\\n\\r\\n            ['CJL2', this.CJL],  //期货持仓量\\r\\n            ['ASI', this.ASI],['DC', this.DC],['DEMA', this.DEMA],[\\\"VWAP\\\", this.VWAP],\\r\\n\\r\\n            ['飞龙四式', this.Dragon4_Main],['飞龙四式-附图', this.Dragon4_Fig],\\r\\n            ['资金分析', this.FundsAnalysis],['融资占比',this.MarginProportion],['负面新闻', this.NewsNegative],\\r\\n            ['涨跌趋势', this.UpDownAnalyze],['北上资金', this.HK2SHSZ],['股东人数', this.ShareHolder],\\r\\n\\r\\n            [\\\"两融余额\\\", this.Margin2],[\\\"两融余额2\\\", this.Margin3],\\r\\n\\r\\n            ['Zealink-资金吸筹', this.Zealink_Index1], ['Zealink-牛熊区间', this.Zealink_Index2],['Zealink-持仓信号', this.Zealink_Index3],\\r\\n            ['Zealink-增减持',this.Zealink_Index4],['Zealink-大宗交易', this.Zealink_Index5], ['Zealink-信托持股', this.Zealink_Index6],\\r\\n            ['Zealink-官网新闻', this.Zealink_Index7], ['Zealink-高管要闻', this.Zealink_Index8],['Zealink-股权质押', this.Zealink_Index9],\\r\\n            ['Zealink-操盘BS点', this.Zealink_Index10],['Zealink-操盘BS点2', this.Zealink_Index11],\\r\\n\\r\\n            //外包指标\\r\\n            ['放心股-操盘BS点',this.FXG_BSPoint],\\r\\n            ['放心股-涨停多空线',this.FXG_INDEX],\\r\\n            ['放心股-涨停吸筹区',this.FXG_INDEX2],\\r\\n            ['放心股-量能黄金点',this.FXG_INDEX3],\\r\\n\\r\\n            //五彩K线(函数COLOR_开头)\\r\\n            ['五彩K线-十字星',this.COLOR_KSTAR1],['五彩K线-早晨之星',this.COLOR_KSTAR2],['五彩K线-黄昏之星',this.COLOR_KSTAR3],['五彩K线-长十字',this.COLOR_SHI1],\\r\\n            ['五彩K线-身怀六甲',this.COLOR_K220],['五彩K线-三个白武士',this.COLOR_K300],['五彩K线-三只乌鸦',this.COLOR_K310],['五彩K线-光头阳线',this.COLOR_K380],\\r\\n            ['五彩K线-光脚阴线',this.COLOR_K390],['五彩K线-垂死十字',this.COLOR_K134],['五彩K线-早晨十字星',this.COLOR_K140],['五彩K线-黄昏十字星',this.COLOR_K150],\\r\\n            ['五彩K线-射击之星',this.COLOR_K160],['五彩K线-倒转锤头',this.COLOR_K165],['五彩K线-锤头',this.COLOR_K170],['五彩K线-吊颈',this.COLOR_K180],\\r\\n            ['五彩K线-穿头破脚',this.COLOR_K190],['五彩K线-出水芙蓉',this.COLOR_CSFR],['五彩K线-乌云盖顶',this.COLOR_WYGD],['五彩K线-曙光初现',this.COLOR_SGCJ],\\r\\n            ['五彩K线-十字胎',this.COLOR_SZTAI],['五彩K线-剑',this.COLOR_SWORD],['五彩K线-平顶',this.COLOR_PINGDING],['五彩K线-平底',this.COLOR_PINGDI],\\r\\n            ['五彩K线-大阳烛',this.COLOR_DAYANZHU],['五彩K线-大阴烛',this.COLOR_DAYINGZHU],\\r\\n\\r\\n            ['五彩K线-好友反攻',this.COLOR_HYFG],['五彩K线-跳空缺口',this.COLOR_TKQK],\\r\\n            ['五彩K线-双飞乌鸦',this.COLOR_SFWY],['五彩K线-上升三部曲',this.COLOR_SSSBQ],['五彩K线-下跌三部曲',this.COLOR_XDSBQ],['五彩K线-长下影',this.COLOR_CHXY],\\r\\n            ['五彩K线-长上影',this.COLOR_CHSY],['五彩K线-分离',this.COLOR_FENLI],\\r\\n\\r\\n            //交易系统\\r\\n            ['交易系统-BIAS',this.TRADE_BIAS],['交易系统-CCI',this.TRADE_CCI],['交易系统-DMI',this.TRADE_DMI],['交易系统-KD',this.TRADE_KD],\\r\\n            ['交易系统-BOLL',this.TRADE_BOLL],['交易系统-KDJ',this.TRADE_KDJ],['交易系统-MA',this.TRADE_MA],['交易系统-MACD',this.TRADE_MACD],\\r\\n            ['交易系统-MTM',this.TRADE_MTM],['交易系统-PSY',this.TRADE_PSY],['交易系统-ROC',this.TRADE_ROC],['交易系统-RSI',this.TRADE_RSI],\\r\\n            ['交易系统-VR',this.TRADE_VR],['交易系统-DPSJ',this.TRADE_DPSJ],\\r\\n\\r\\n            ['TEST', this.TEST] //测试用\\r\\n        ]);\\r\\n}\\r\\n\\r\\nJSIndexScript.AddIndex=function(aryIndex)  //添加自定义指标\\r\\n{\\r\\n    for(var i in aryIndex)\\r\\n    {\\r\\n        g_CustomIndex.Add(aryIndex[i]);\\r\\n    }\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Get=function(id)\\r\\n{\\r\\n    var data=g_CustomIndex.Get(id);\\r\\n    if (data) return data;\\r\\n\\r\\n    var func=this.DataMap.get(id);\\r\\n    if (func) return func();\\r\\n\\r\\n    return null;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Search=function(name)\\r\\n{\\r\\n    var result=[];\\r\\n    var reg = new RegExp(name,'i');\\r\\n    this.DataMap.forEach(function(value,key)\\r\\n    {\\r\\n        if (key.indexOf('交易系统-')!=0 && key.indexOf('五彩K线-')!=0  && key.search(reg)>=0)\\r\\n            result.push(key);\\r\\n    });\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MA=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MA', Description:'均线', IsMainIndex:true, StringFormat:2,\\r\\n            Args:[ { Name:'M1', Value:5}, { Name:'M2', Value:10 }, { Name:'M3', Value:20} ],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" },{Name:'MA3',DynamicName:\\\"MA{M3}\\\" }],\\r\\n            Script: //脚本\\r\\n                'MA1:MA(CLOSE,M1);\\\\n\\\\\\r\\nMA2:MA(CLOSE,M2);\\\\n\\\\\\r\\nMA3:MA(CLOSE,M3);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MA4=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MA', Description:'均线', IsMainIndex:true, StringFormat:2,\\r\\n            Args:[ { Name:'M1', Value:5}, { Name:'M2', Value:10 }, { Name:'M3', Value:20},{ Name:'M4', Value:60} ],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" },{Name:'MA3',DynamicName:\\\"MA{M3}\\\" },{Name:'MA4',DynamicName:\\\"MA{M4}\\\" } ],\\r\\n            Script: //脚本\\r\\n                'MA1:MA(CLOSE,M1);\\\\n\\\\\\r\\nMA2:MA(CLOSE,M2);\\\\n\\\\\\r\\nMA3:MA(CLOSE,M3);\\\\n\\\\\\r\\nMA4:MA(CLOSE,M4);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MA5=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MA', Description:'均线', IsMainIndex:true, StringFormat:2,\\r\\n            Args:[ { Name:'M1', Value:5}, { Name:'M2', Value:10 }, { Name:'M3', Value:20} ,{ Name:'M4', Value:60} ,{ Name:'M5', Value:0}],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" },{Name:'MA3',DynamicName:\\\"MA{M3}\\\" },{Name:'MA4',DynamicName:\\\"MA{M4}\\\" },{Name:'MA5',DynamicName:\\\"MA{M5}\\\" } ],\\r\\n            Script: //脚本\\r\\n                'MA1:MA(CLOSE,M1);\\\\n\\\\\\r\\nMA2:MA(CLOSE,M2);\\\\n\\\\\\r\\nMA3:MA(CLOSE,M3);\\\\n\\\\\\r\\nMA4:MA(CLOSE,M4);\\\\n\\\\\\r\\nMA5:MA(CLOSE,M5);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MA6=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MA', Description:'均线', IsMainIndex:true, StringFormat:2,\\r\\n            Args:\\r\\n                [\\r\\n                    { Name:'M1', Value:5}, { Name:'M2', Value:10 }, { Name:'M3', Value:20} , { Name:'M4', Value:60} ,\\r\\n                    { Name:'M5', Value:0},{ Name:'M6', Value:0}\\r\\n                ],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" },{Name:'MA3',DynamicName:\\\"MA{M3}\\\" },{Name:'MA4',DynamicName:\\\"MA{M4}\\\" },\\r\\n                {Name:'MA5',DynamicName:\\\"MA{M5}\\\" } ,{ Name:'MA6',DynamicName:\\\"MA{M6}\\\" } ],\\r\\n            Script: //脚本\\r\\n                'MA1:MA(CLOSE,M1);\\\\n\\\\\\r\\nMA2:MA(CLOSE,M2);\\\\n\\\\\\r\\nMA3:MA(CLOSE,M3);\\\\n\\\\\\r\\nMA4:MA(CLOSE,M4);\\\\n\\\\\\r\\nMA5:MA(CLOSE,M5);\\\\n\\\\\\r\\nMA6:MA(CLOSE,M6);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MA7=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MA', Description:'均线', IsMainIndex:true, StringFormat:2,\\r\\n            Args:\\r\\n                [\\r\\n                    { Name:'M1', Value:5}, { Name:'M2', Value:10 }, { Name:'M3', Value:20}, { Name:'M4', Value:60},\\r\\n                    { Name:'M5', Value:0},{ Name:'M6', Value:0} ,{ Name:'M7', Value:0 }\\r\\n                ],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" },{Name:'MA3',DynamicName:\\\"MA{M3}\\\" },{Name:'MA4',DynamicName:\\\"MA{M4}\\\" },\\r\\n                {Name:'MA5',DynamicName:\\\"MA{M5}\\\" } ,{ Name:'MA6',DynamicName:\\\"MA{M6}\\\" } ,{ Name:'MA7',DynamicName:\\\"MA{M7}\\\" }],\\r\\n            Script: //脚本\\r\\n                'MA1:MA(CLOSE,M1);\\\\n\\\\\\r\\nMA2:MA(CLOSE,M2);\\\\n\\\\\\r\\nMA3:MA(CLOSE,M3);\\\\n\\\\\\r\\nMA4:MA(CLOSE,M4);\\\\n\\\\\\r\\nMA5:MA(CLOSE,M5);\\\\n\\\\\\r\\nMA6:MA(CLOSE,M6);\\\\n\\\\\\r\\nMA7:MA(CLOSE,M7);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MA8=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MA', Description:'均线', IsMainIndex:true, StringFormat:2,\\r\\n            Args:\\r\\n                [\\r\\n                    { Name:'M1', Value:5}, { Name:'M2', Value:10 }, { Name:'M3', Value:20}, { Name:'M4', Value:60},\\r\\n                    { Name:'M5', Value:0},{ Name:'M6', Value:0} ,{ Name:'M7', Value:0 } ,{ Name:'M8', Value:0 }\\r\\n                ],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" },{Name:'MA3',DynamicName:\\\"MA{M3}\\\" },{Name:'MA4',DynamicName:\\\"MA{M4}\\\" },\\r\\n                {Name:'MA5',DynamicName:\\\"MA{M5}\\\" } ,{ Name:'MA6',DynamicName:\\\"MA{M6}\\\" } ,{ Name:'MA7',DynamicName:\\\"MA{M7}\\\" },{ Name:'MA8',DynamicName:\\\"MA{M8}\\\" }],\\r\\n            Script: //脚本\\r\\n                'MA1:MA(CLOSE,M1);\\\\n\\\\\\r\\nMA2:MA(CLOSE,M2);\\\\n\\\\\\r\\nMA3:MA(CLOSE,M3);\\\\n\\\\\\r\\nMA4:MA(CLOSE,M4);\\\\n\\\\\\r\\nMA5:MA(CLOSE,M5);\\\\n\\\\\\r\\nMA6:MA(CLOSE,M6);\\\\n\\\\\\r\\nMA7:MA(CLOSE,M7);\\\\n\\\\\\r\\nMA8:MA(CLOSE,M8);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BOLL=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BOLL', Description:'布林线', IsMainIndex:true,\\r\\n            Args:[ { Name:'M', Value:20} ],\\r\\n            Script: //脚本\\r\\n                'BOLL:MA(CLOSE,M);\\\\n\\\\\\r\\nUB:BOLL+2*STD(CLOSE,M);\\\\n\\\\\\r\\nLB:BOLL-2*STD(CLOSE,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BOLL2=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BOLL2', Description:'布林线', IsMainIndex:false, KLineType:0,\\r\\n            Args:[ { Name:'M', Value:20} ],\\r\\n            Script: //脚本\\r\\n                'BOLL:MA(CLOSE,M);\\\\n\\\\\\r\\nUB:BOLL+2*STD(CLOSE,M);\\\\n\\\\\\r\\nLB:BOLL-2*STD(CLOSE,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.BBI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BBI', Description:'多空均线', IsMainIndex:true,\\r\\n            Args:[ { Name:'M1', Value:3}, { Name:'M2', Value:6}, { Name:'M3', Value:12}, { Name:'M4', Value:24} ],\\r\\n            Script: //脚本\\r\\n                'BBI:(MA(CLOSE,M1)+MA(CLOSE,M2)+MA(CLOSE,M3)+MA(CLOSE,M4))/4;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.DKX=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'DKX', Description:'多空线', IsMainIndex:false,\\r\\n            Args:[ { Name:'M', Value:10} ],\\r\\n            Script: //脚本\\r\\n                'MID:=(3*CLOSE+LOW+OPEN+HIGH)/6;\\\\n\\\\\\r\\nDKX:(20*MID+19*REF(MID,1)+18*REF(MID,2)+17*REF(MID,3)+\\\\n\\\\\\r\\n16*REF(MID,4)+15*REF(MID,5)+14*REF(MID,6)+\\\\n\\\\\\r\\n13*REF(MID,7)+12*REF(MID,8)+11*REF(MID,9)+\\\\n\\\\\\r\\n10*REF(MID,10)+9*REF(MID,11)+8*REF(MID,12)+\\\\n\\\\\\r\\n7*REF(MID,13)+6*REF(MID,14)+5*REF(MID,15)+\\\\n\\\\\\r\\n4*REF(MID,16)+3*REF(MID,17)+2*REF(MID,18)+REF(MID,20))/210;\\\\n\\\\\\r\\nMADKX:MA(DKX,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MIKE=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MIKE', Description:'麦克支撑压力', IsMainIndex:true,\\r\\n            Args:[ { Name:'N', Value:10} ],\\r\\n            Script: //脚本\\r\\n                'HLC:=REF(MA((HIGH+LOW+CLOSE)/3,N),1);\\\\n\\\\\\r\\nHV:=EMA(HHV(HIGH,N),3);\\\\n\\\\\\r\\nLV:=EMA(LLV(LOW,N),3);\\\\n\\\\\\r\\nSTOR:EMA(2*HV-LV,3);\\\\n\\\\\\r\\nMIDR:EMA(HLC+HV-LV,3);\\\\n\\\\\\r\\nWEKR:EMA(HLC*2-LV,3);\\\\n\\\\\\r\\nWEKS:EMA(HLC*2-HV,3);\\\\n\\\\\\r\\nMIDS:EMA(HLC-HV+LV,3);\\\\n\\\\\\r\\nSTOS:EMA(2*LV-HV,3);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.PBX=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'PBX', Description:'瀑布线', IsMainIndex:true,\\r\\n            Args:[ { Name:'M1', Value:4}, { Name:'M2', Value:6}, { Name:'M3', Value:9}, { Name:'M4', Value:13},{ Name:'M5', Value:18},{ Name:'M6', Value:24} ],\\r\\n            Script: //脚本\\r\\n                'PBX1:(EMA(CLOSE,M1)+MA(CLOSE,M1*2)+MA(CLOSE,M1*4))/3;\\\\n\\\\\\r\\nPBX2:(EMA(CLOSE,M2)+MA(CLOSE,M2*2)+MA(CLOSE,M2*4))/3;\\\\n\\\\\\r\\nPBX3:(EMA(CLOSE,M3)+MA(CLOSE,M3*2)+MA(CLOSE,M3*4))/3;\\\\n\\\\\\r\\nPBX4:(EMA(CLOSE,M4)+MA(CLOSE,M4*2)+MA(CLOSE,M4*4))/3;\\\\n\\\\\\r\\nPBX5:(EMA(CLOSE,M5)+MA(CLOSE,M5*2)+MA(CLOSE,M5*4))/3;\\\\n\\\\\\r\\nPBX6:(EMA(CLOSE,M6)+MA(CLOSE,M6*2)+MA(CLOSE,M6*4))/3;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ENE=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'ENE', Description:'轨道线', IsMainIndex:true,\\r\\n            Args:[ { Name:'N', Value:25}, { Name:'M1', Value:6}, { Name:'M2', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'UPPER:(1+M1/100)*MA(CLOSE,N);\\\\n\\\\\\r\\nLOWER:(1-M2/100)*MA(CLOSE,N);\\\\n\\\\\\r\\nENE:(UPPER+LOWER)/2;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MACD=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MACD', Description:'平滑异同平均', IsMainIndex:false,\\r\\n            Args:[ { Name:'SHORT', Value:12}, { Name:'LONG', Value:26}, { Name:'MID', Value:9} ],\\r\\n            Script: //脚本\\r\\n                'DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);\\\\n\\\\\\r\\nDEA:EMA(DIF,MID);\\\\n\\\\\\r\\nMACD:(DIF-DEA)*2,COLORSTICK;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n//上下柱子\\r\\nJSIndexScript.prototype.MACD2=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MACD', Description:'平滑异同平均', IsMainIndex:false,\\r\\n            Args:[ { Name:'SHORT', Value:12}, { Name:'LONG', Value:26}, { Name:'MID', Value:9} ],\\r\\n            Script: //脚本\\r\\n                'DIF2:=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);\\\\n\\\\\\r\\nDEA2:=EMA(DIF2,MID);\\\\n\\\\\\r\\nMACD:(DIF2-DEA2)*2,COLORSTICK,LINETHICK50;\\\\n\\\\\\r\\nDIF:DIF2;\\\\n\\\\\\r\\nDEA:DEA2;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.KDJ=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'KDJ', Description:'随机指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:9}, { Name:'M1', Value:3}, { Name:'M2', Value:3} ],\\r\\n            Script: //脚本\\r\\n                'RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;\\\\n\\\\\\r\\nK:SMA(RSV,M1,1);\\\\n\\\\\\r\\nD:SMA(K,M2,1);\\\\n\\\\\\r\\nJ:3*K-2*D;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VOL=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'VOL', Description:'成交量', IsMainIndex:false,FloatPrecision:0,\\r\\n            Args:[ { Name:'M1', Value:5}, { Name:'M2', Value:10} ],\\r\\n            OutName:[ {Name:'MA1',DynamicName:\\\"MA{M1}\\\" },  {Name:'MA2',DynamicName:\\\"MA{M2}\\\" }],\\r\\n            Script: //脚本\\r\\n                'VOL:VOL,VOLSTICK;\\\\n\\\\\\r\\nMA1:MA(VOL,M1);\\\\n\\\\\\r\\nMA2:MA(VOL,M2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VOL_TDX=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'VOL-TDX', Description:'成交量(虚拟)', IsMainIndex:false,FloatPrecision:0,\\r\\n            Args:[ { Name:'M1', Value:5}, { Name:'M2', Value:10} ],\\r\\n            Script: //脚本\\r\\n                'TOTAL:=IF(PERIOD=1,5,IF(PERIOD=2,15,IF(PERIOD=3,30,IF(PERIOD=4,60,IF(PERIOD=5,TOTALFZNUM,1)))));\\\\n\\\\\\r\\nMTIME:=MOD(FROMOPEN,TOTAL);\\\\n\\\\\\r\\nCTIME:=IF(MTIME<0.5,TOTAL,MTIME);\\\\n\\\\\\r\\nVVOL:IF((CURRBARSCOUNT=1 AND DYNAINFO(8)>1),VOL*(TOTAL+3)/(CTIME+3),DRAWNULL),NODRAW;\\\\n\\\\\\r\\nSTICKLINE((CURRBARSCOUNT=1 AND DYNAINFO(8)>1),VVOL,0,-1,-1),COLORYELLOW;\\\\n\\\\\\r\\nVOLUME:VOL,VOLSTICK;\\\\n\\\\\\r\\nMAVOL1:MA(VOLUME,M1);\\\\n\\\\\\r\\nMAVOL2:MA(VOLUME,M2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.RSI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'RSI', Description:'相对强弱指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N1', Value:6}, { Name:'N2', Value:12}, { Name:'N3', Value:24}  ],\\r\\n            Script: //脚本\\r\\n                'LC:=REF(CLOSE,1);\\\\n\\\\\\r\\nRSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;\\\\n\\\\\\r\\nRSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100;\\\\n\\\\\\r\\nRSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BRAR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BRAR', Description:'情绪指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:26} ],\\r\\n            Script: //脚本\\r\\n                'BR:SUM(MAX(0,HIGH-REF(CLOSE,1)),N)/SUM(MAX(0,REF(CLOSE,1)-LOW),N)*100;\\\\n\\\\\\r\\nAR:SUM(HIGH-OPEN,N)/SUM(OPEN-LOW,N)*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.WR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'WR', Description:'威廉指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:10}, { Name:'N1', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'WR1:100*(HHV(HIGH,N)-CLOSE)/(HHV(HIGH,N)-LLV(LOW,N));\\\\n\\\\\\r\\nWR2:100*(HHV(HIGH,N1)-CLOSE)/(HHV(HIGH,N1)-LLV(LOW,N1));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BIAS=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BIAS', Description:'乖离率', IsMainIndex:false,\\r\\n            Args:[ { Name:'N1', Value:6}, { Name:'N2', Value:12}, { Name:'N3', Value:24} ],\\r\\n            Script: //脚本\\r\\n                'BIAS1 :(CLOSE-MA(CLOSE,N1))/MA(CLOSE,N1)*100;\\\\n\\\\\\r\\nBIAS2 :(CLOSE-MA(CLOSE,N2))/MA(CLOSE,N2)*100;\\\\n\\\\\\r\\nBIAS3 :(CLOSE-MA(CLOSE,N3))/MA(CLOSE,N3)*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.OBV=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'OBV', Description:'累积能量线', IsMainIndex:false,\\r\\n            Args:[ { Name:'M', Value:30} ],\\r\\n            Script: //脚本\\r\\n                'VA:=IF(CLOSE>REF(CLOSE,1),VOL,-VOL);\\\\n\\\\\\r\\nOBV:SUM(IF(CLOSE==REF(CLOSE,1),0,VA),0);\\\\n\\\\\\r\\nMAOBV:MA(OBV,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DMI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'DMI', Description:'趋向指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:14}, { Name:'MM', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'MTR:=EXPMEMA(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(REF(CLOSE,1)-LOW)),N);\\\\n\\\\\\r\\nHD :=HIGH-REF(HIGH,1);\\\\n\\\\\\r\\nLD :=REF(LOW,1)-LOW;\\\\n\\\\\\r\\nDMP:=EXPMEMA(IF(HD>0&&HD>LD,HD,0),N);\\\\n\\\\\\r\\nDMM:=EXPMEMA(IF(LD>0&&LD>HD,LD,0),N);\\\\n\\\\\\r\\nPDI: DMP*100/MTR;\\\\n\\\\\\r\\nMDI: DMM*100/MTR;\\\\n\\\\\\r\\nADX: EXPMEMA(ABS(MDI-PDI)/(MDI+PDI)*100,MM);\\\\n\\\\\\r\\nADXR:EXPMEMA(ADX,MM);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'CR', Description:'带状能量线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:26}, { Name:'M1', Value:10},{ Name:'M2', Value:20},{ Name:'M3', Value:40},{ Name:'M4', Value:62} ],\\r\\n            Script: //脚本\\r\\n                'MID:=REF(HIGH+LOW,1)/2;\\\\n\\\\\\r\\nCR:SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100;\\\\n\\\\\\r\\nMA1:REF(MA(CR,M1),M1/2.5+1);\\\\n\\\\\\r\\nMA2:REF(MA(CR,M2),M2/2.5+1);\\\\n\\\\\\r\\nMA3:REF(MA(CR,M3),M3/2.5+1);\\\\n\\\\\\r\\nMA4:REF(MA(CR,M4),M4/2.5+1);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.PSY=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'PSY', Description:'心理线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:12}, { Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'PSY:COUNT(CLOSE>REF(CLOSE,1),N)/N*100;\\\\r\\\\\\r\\nPSYMA:MA(PSY,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CCI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'CCI', Description:'商品路径指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:14} ],\\r\\n            Script: //脚本\\r\\n                'TYP:=(HIGH+LOW+CLOSE)/3;\\\\n\\\\\\r\\nCCI:(TYP-MA(TYP,N))/(0.015*AVEDEV(TYP,N));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DMA=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'DMA', Description:'平均差', IsMainIndex:false,\\r\\n            Args:[ { Name:'N1', Value:10},{ Name:'N2', Value:50},{ Name:'M', Value:10} ],\\r\\n            Script: //脚本\\r\\n                'DIF:MA(CLOSE,N1)-MA(CLOSE,N2);\\\\n\\\\\\r\\nDIFMA:MA(DIF,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRIX=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'TRIX', Description:'三重指数平均线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:12},{ Name:'M', Value:9} ],\\r\\n            Script: //脚本\\r\\n                'MTR:=EMA(EMA(EMA(CLOSE,N),N),N);\\\\n\\\\\\r\\nTRIX:(MTR-REF(MTR,1))/REF(MTR,1)*100;\\\\n\\\\\\r\\nMATRIX:MA(TRIX,M) ;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'VR', Description:'成交量变异率', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:26},{ Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'TH:=SUM(IF(CLOSE>REF(CLOSE,1),VOL,0),N);\\\\n\\\\\\r\\nTL:=SUM(IF(CLOSE<REF(CLOSE,1),VOL,0),N);\\\\n\\\\\\r\\nTQ:=SUM(IF(CLOSE==REF(CLOSE,1),VOL,0),N);\\\\n\\\\\\r\\nVR:100*(TH*2+TQ)/(TL*2+TQ);\\\\n\\\\\\r\\nMAVR:MA(VR,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.EMV=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'EMV', Description:'简易波动指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:14},{ Name:'M', Value:9} ],\\r\\n            Script: //脚本\\r\\n                'VOLUME:=MA(VOL,N)/VOL;\\\\n\\\\\\r\\nMID:=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW);\\\\n\\\\\\r\\nEMV:MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N);\\\\n\\\\\\r\\nMAEMV:MA(EMV,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ROC=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'ROC', Description:'变动率指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:12},{ Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'ROC:100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);\\\\n\\\\\\r\\nMAROC:MA(ROC,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MTM=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MTM', Description:'动量线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:12},{ Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'MTM:CLOSE-REF(CLOSE,N);\\\\n\\\\\\r\\nMAMTM:MA(MTM,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.FSL=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'FSL', Description:'分水岭', IsMainIndex:false,\\r\\n            Args:[ ],\\r\\n            Script: //脚本\\r\\n                'SWL:(EMA(CLOSE,5)*7+EMA(CLOSE,10)*3)/10;\\\\n\\\\\\r\\nSWS:DMA(EMA(CLOSE,12),MAX(1,100*(SUM(VOL,5)/(3*CAPITAL))));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'CYR', Description:'市场强弱', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:13},{ Name:'M', Value:5}],\\r\\n            Script: //脚本\\r\\n                'DIVE:=0.01*EMA(AMOUNT,N)/EMA(VOL,N);\\\\n\\\\\\r\\nCYR:(DIVE/REF(DIVE,1)-1)*100;\\\\n\\\\\\r\\nMACYR:MA(CYR,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MASS=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'MASS', Description:'市场强弱', IsMainIndex:false,\\r\\n            Args:[ { Name:'N1', Value:9},{ Name:'N2', Value:25}, { Name:'M', Value:6}],\\r\\n            Script: //脚本\\r\\n                'MASS:SUM(MA(HIGH-LOW,N1)/MA(MA(HIGH-LOW,N1),N1),N2);\\\\n\\\\\\r\\nMAMASS:MA(MASS,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.WAD=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'WAD', Description:'威廉多空力度线', IsMainIndex:false,\\r\\n            Args:[ { Name:'M', Value:30}],\\r\\n            Script: //脚本\\r\\n                'MIDA:=CLOSE-MIN(REF(CLOSE,1),LOW);\\\\n\\\\\\r\\nMIDB:=IF(CLOSE<REF(CLOSE,1),CLOSE-MAX(REF(CLOSE,1),HIGH),0);\\\\n\\\\\\r\\nWAD:SUM(IF(CLOSE>REF(CLOSE,1),MIDA,MIDB),0);\\\\n\\\\\\r\\nMAWAD:MA(WAD,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CHO=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'CHO', Description:'佳庆指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N1', Value:10}, { Name:'N2', Value:20}, { Name:'M', Value:6}],\\r\\n            Script: //脚本\\r\\n                'MID:=SUM(VOL*(2*CLOSE-HIGH-LOW)/(HIGH+LOW),0);\\\\n\\\\\\r\\nCHO:MA(MID,N1)-MA(MID,N2);\\\\n\\\\\\r\\nMACHO:MA(CHO,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ADTM=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'ADTM', Description:'动态买卖气指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:23}, { Name:'M', Value:8}],\\r\\n            Script: //脚本\\r\\n                'DTM:=IF(OPEN<=REF(OPEN,1),0,MAX((HIGH-OPEN),(OPEN-REF(OPEN,1))));\\\\n\\\\\\r\\nDBM:=IF(OPEN>=REF(OPEN,1),0,MAX((OPEN-LOW),(OPEN-REF(OPEN,1))));\\\\n\\\\\\r\\nSTM:=SUM(DTM,N);\\\\n\\\\\\r\\nSBM:=SUM(DBM,N);\\\\n\\\\\\r\\nADTM:IF(STM>SBM,(STM-SBM)/STM,IF(STM==SBM,0,(STM-SBM)/SBM));\\\\n\\\\\\r\\nMAADTM:MA(ADTM,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.HSL=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'HSL', Description:'换手线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:5} ],\\r\\n            Script: //脚本\\r\\n                'HSL:IF((SETCODE==0||SETCODE==1),100*VOL,VOL)/(FINANCE(7)/100);\\\\n\\\\\\r\\nMAHSL:MA(HSL,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BIAS36=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BIAS36', Description:'三六乖离', IsMainIndex:false,\\r\\n            Args:[ { Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'BIAS36:MA(CLOSE,3)-MA(CLOSE,6);\\\\n\\\\\\r\\nBIAS612:MA(CLOSE,6)-MA(CLOSE,12);\\\\n\\\\\\r\\nMABIAS:MA(BIAS36,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BIAS_QL=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'BIAS_QL', Description:'乖离率-传统版', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:6}, { Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'BIAS :(CLOSE-MA(CLOSE,N))/MA(CLOSE,N)*100;\\\\n\\\\\\r\\nBIASMA :MA(BIAS,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DPO=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'DPO', Description:'区间震荡线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:20}, { Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'DPO:CLOSE-REF(MA(CLOSE,N),N/2+1);\\\\n\\\\\\r\\nMADPO:MA(DPO,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.OSC=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'OSC', Description:'变动速率线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:20}, { Name:'M', Value:6} ],\\r\\n            Script: //脚本\\r\\n                'OSC:100*(CLOSE-MA(CLOSE,N));\\\\n\\\\\\r\\nMAOSC:EXPMEMA(OSC,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ATR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'ATR', Description:'真实波幅', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:14}],\\r\\n            Script: //脚本\\r\\n                'MTR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));\\\\n\\\\\\r\\nATR:MA(MTR,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.NVI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'ATR', Description:'负成交量', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:72} ],\\r\\n            Script: //脚本\\r\\n                'NVI:100*MULAR(IF(V<REF(V,1),C/REF(C,1),1),0);\\\\n\\\\\\r\\nMANVI:MA(NVI,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.PVI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'PVI', Description:'正成交量', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:72} ],\\r\\n            Script: //脚本\\r\\n                'NVI:100*MULAR(IF(V>REF(V,1),C/REF(C,1),1),0);\\\\n\\\\\\r\\nMANVI:MA(NVI,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.UOS=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'UOS', Description:'终极指标', IsMainIndex:false,\\r\\n            Args:[ { Name:'N1', Value:7} ,{ Name:'N2', Value:14},{ Name:'N3', Value:28},{ Name:'M', Value:6}],\\r\\n            Script: //脚本\\r\\n                'TH:=MAX(HIGH,REF(CLOSE,1));\\\\n\\\\\\r\\nTL:=MIN(LOW,REF(CLOSE,1));\\\\n\\\\\\r\\nACC1:=SUM(CLOSE-TL,N1)/SUM(TH-TL,N1);\\\\n\\\\\\r\\nACC2:=SUM(CLOSE-TL,N2)/SUM(TH-TL,N2);\\\\n\\\\\\r\\nACC3:=SUM(CLOSE-TL,N3)/SUM(TH-TL,N3);\\\\n\\\\\\r\\nUOS:(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3);\\\\n\\\\\\r\\nMAUOS:EXPMEMA(UOS,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYW=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'CYW', Description:'主力控盘', IsMainIndex:false,\\r\\n            Args:[ ],\\r\\n            Script: //脚本\\r\\n                'VAR1:=CLOSE-LOW;\\\\n\\\\\\r\\nVAR2:=HIGH-LOW;\\\\n\\\\\\r\\nVAR3:=CLOSE-HIGH;\\\\n\\\\\\r\\nVAR4:=IF(HIGH>LOW,(VAR1/VAR2+VAR3/VAR2)*VOL,0);\\\\n\\\\\\r\\nCYW: SUM(VAR4,10)/10000, COLORSTICK;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.LON=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'LON', Description:'龙系长线', IsMainIndex:false,\\r\\n            Args:[ { Name:'N', Value:10} ],\\r\\n            Script: //脚本\\r\\n                'LC := REF(CLOSE,1);\\\\n\\\\\\r\\nVID := SUM(VOL,2)/(((HHV(HIGH,2)-LLV(LOW,2)))*100);\\\\n\\\\\\r\\nRC := (CLOSE-LC)*VID;\\\\n\\\\\\r\\nLONG := SUM(RC,0);\\\\n\\\\\\r\\nDIFF := SMA(LONG,10,1);\\\\n\\\\\\r\\nDEA := SMA(LONG,20,1);\\\\n\\\\\\r\\nLON : DIFF-DEA;\\\\n\\\\\\r\\nLONMA : MA(LON,10);\\\\n\\\\\\r\\nLONT : LON, COLORSTICK;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.NDB = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'NDB', Description: '脑电波', IsMainIndex: false,\\r\\n            Args: [{ Name: 'P1', Value: 5 }, { Name: 'P2', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                'HH:=IF(C/REF(C,1)>1.098 AND L>REF(H,1),2*C-REF(C,1)-H,2*C-H-L);\\\\n\\\\\\r\\nV1:= BARSCOUNT(C) - 1;\\\\n\\\\\\r\\nV2:= 2 * REF(C, V1) - REF(H, V1) - REF(L, V1);\\\\n\\\\\\r\\nDK: SUM(HH, 0) + V2;\\\\n\\\\\\r\\nMDK5: MA(DK, P1);\\\\n\\\\\\r\\nMDK10: MA(DK, P2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SKDJ = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SKDJ', Description: '慢速随机指标', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 9 }, { Name: 'M', Value: 3 }],\\r\\n            Script: //脚本\\r\\n                'LOWV:=LLV(LOW,N);\\\\n\\\\\\r\\nHIGHV:=HHV(HIGH,N);\\\\n\\\\\\r\\nRSV:=EMA((CLOSE-LOWV)/(HIGHV-LOWV)*100,M);\\\\n\\\\\\r\\nK:EMA(RSV,M);\\\\n\\\\\\r\\nD:MA(K,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.KD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'KD', Description: '随机指标KD', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 9 }, { Name: 'M1', Value: 3 },{ Name: 'M2', Value: 3 }],\\r\\n            Script: //脚本\\r\\n                'RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;\\\\n\\\\\\r\\nK:SMA(RSV,M1,1);\\\\n\\\\\\r\\nD:SMA(K,M2,1);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.FKX=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name:'FKX', Description:'反K线', IsMainIndex:true,\\r\\n            Args:[  ],\\r\\n            Script: //脚本\\r\\n                'DRAWKLINE(-LOW, -OPEN, -HIGH, -CLOSE);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DKCOL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DKCOL', Description: '多空能量柱(适用于分时主图)', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'FF:=(C-REF(C,N))/REF(C,N);\\\\n\\\\\\r\\nSTICKLINE(FF>0,DYNAINFO(3),DYNAINFO(3)*(1+FF),0.5,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(FF<0,DYNAINFO(3),DYNAINFO(3)*(1+FF),0.5,0),COLORGREEN;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.UDL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'UDL', Description: '引力线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N1', Value: 3 },{ Name: 'N2', Value: 5 },{ Name: 'N3', Value: 10 },{ Name: 'N4', Value: 20 },{ Name: 'M', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'UDL:(MA(CLOSE,N1)+MA(CLOSE,N2)+MA(CLOSE,N3)+MA(CLOSE,N4))/4;\\\\n\\\\\\r\\nMAUDL:MA(UDL,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MFI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'MFI', Description: '资金流量指标', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 14 },{ Name: 'N2', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'TYP := (HIGH + LOW + CLOSE)/3;\\\\n\\\\\\r\\nV1:=SUM(IF(TYP>REF(TYP,1),TYP*VOL,0),N)/SUM(IF(TYP<REF(TYP,1),TYP*VOL,0),N);\\\\n\\\\\\r\\nMFI:100-(100/(1+V1));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.LWR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'LWR', Description: 'LWR威廉指标', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 9 },{ Name: 'M1', Value: 3 },{ Name: 'M2', Value: 3 }],\\r\\n            Script: //脚本\\r\\n                'RSV:= (HHV(HIGH,N)-CLOSE)/(HHV(HIGH,N)-LLV(LOW,N))*100;\\\\n\\\\\\r\\nLWR1:SMA(RSV,M1,1);\\\\n\\\\\\r\\nLWR2:SMA(LWR1,M2,1);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MARSI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'MARSI', Description: '相对强弱平均线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M1', Value: 10 },{ Name: 'M2', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'DIF:=CLOSE-REF(CLOSE,1);\\\\n\\\\\\r\\nVU:=IF(DIF>=0,DIF,0);\\\\n\\\\\\r\\nVD:=IF(DIF<0,-DIF,0);\\\\n\\\\\\r\\nMAU1:=MEMA(VU,M1);\\\\n\\\\\\r\\nMAD1:=MEMA(VD,M1);\\\\n\\\\\\r\\nMAU2:=MEMA(VU,M2);\\\\n\\\\\\r\\nMAD2:=MEMA(VD,M2);\\\\n\\\\\\r\\nRSI10:MA(100*MAU1/(MAU1+MAD1),M1);\\\\n\\\\\\r\\nRSI6:MA(100*MAU2/(MAU2+MAD2),M2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYD', Description: '承接因子', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 21 }],\\r\\n            Script: //脚本\\r\\n                'CYDS:WINNER(CLOSE)/(VOL/CAPITAL);\\\\n\\\\\\r\\nCYDN:WINNER(CLOSE)/MA(VOL/CAPITAL,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYF = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYF', Description: '市场能量', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 21 }],\\r\\n            Script: //脚本\\r\\n                'CYF:100-100/(1+EMA(HSL,N));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TAPI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'TAPI', Description: '加权指数成交值', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'TAPI:AMOUNT/INDEXC;\\\\n\\\\\\r\\nMATAIP:MA(TAPI,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VMACD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'VMACD', Description: '量平滑异同平均', IsMainIndex: false,\\r\\n            Args: [{ Name: 'SHORT', Value: 12 },{ Name: 'LONG', Value: 26 },{ Name: 'MID', Value: 9 }],\\r\\n            Script: //脚本\\r\\n                'DIF:EMA(VOL,SHORT)-EMA(VOL,LONG);\\\\n\\\\\\r\\nDEA:EMA(DIF,MID);\\\\n\\\\\\r\\nMACD:DIF-DEA,COLORSTICK;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.QACD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'QACD', Description: '快速异同平均', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N1', Value: 12 },{ Name: 'N2', Value: 26 },{ Name: 'M', Value: 9 }],\\r\\n            Script: //脚本\\r\\n                'DIF:EMA(CLOSE,N1)-EMA(CLOSE,N2);\\\\n\\\\\\r\\nMACD:EMA(DIF,M);\\\\n\\\\\\r\\nDDIF:DIF-MACD;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VPT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'VPT', Description: '量价曲线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 51 },{ Name: 'M', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'VPT:SUM(VOL*(CLOSE-REF(CLOSE,1))/REF(CLOSE,1),N);\\\\n\\\\\\r\\nMAVPT:MA(VPT,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.WVAD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'WVAD', Description: '威廉变异离散量', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 24 },{ Name: 'M', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'WVAD:SUM((CLOSE-OPEN)/(HIGH-LOW)*VOL,N)/10000;\\\\n\\\\\\r\\nMAWVAD:MA(WVAD,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DBQR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'WVAD', Description: '对比强弱', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 5 },{ Name: 'M1', Value: 10 },{ Name: 'M2', Value: 20 },{ Name: 'M3', Value: 60 }],\\r\\n            Script: //脚本\\r\\n                'ZS:(INDEXC-REF(INDEXC,N))/REF(INDEXC,N);\\\\n\\\\\\r\\nGG:(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);\\\\n\\\\\\r\\nMADBQR1:MA(GG,M1);\\\\n\\\\\\r\\nMADBQR2:MA(GG,M2);\\\\n\\\\\\r\\nMADBQR3:MA(GG,M3);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.JS = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'JS', Description: '加速线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 5 },{ Name: 'M1', Value: 5 },{ Name: 'M2', Value: 10 },{ Name: 'M3', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                'JS:100*(CLOSE-REF(CLOSE,N))/(N*REF(CLOSE,N));\\\\n\\\\\\r\\nMAJS1:MA(JS,M1);\\\\n\\\\\\r\\nMAJS2:MA(JS,M2);\\\\n\\\\\\r\\nMAJS3:MA(JS,M3);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYE = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYE', Description: '市场趋势', IsMainIndex: false,\\r\\n            Args: [ ],\\r\\n            Script: //脚本\\r\\n                'MAL:=MA(CLOSE,5);\\\\n\\\\\\r\\nMAS:=MA(MA(CLOSE,20),5);\\\\n\\\\\\r\\nCYEL:(MAL-REF(MAL,1))/REF(MAL,1)*100;\\\\n\\\\\\r\\nCYES:(MAS-REF(MAS,1))/REF(MAS,1)*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.QR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'QR', Description: '强弱指标', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 21 } ],\\r\\n            Script: //脚本\\r\\n                '个股: (CLOSE-REF(CLOSE,N))/REF(CLOSE,N)*100; \\\\n\\\\\\r\\n大盘: (INDEXC-REF(INDEXC,N))/REF(INDEXC,N)*100; \\\\n\\\\\\r\\n强弱值:EMA(个股-大盘,2),COLORSTICK;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.GDX = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'GDX', Description: '轨道线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 30 } ,{ Name: 'M', Value: 9 }],\\r\\n            Script: //脚本\\r\\n                'AA:=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,N))/MA(CLOSE,N); \\\\n\\\\\\r\\n轨道:DMA(CLOSE,AA);\\\\n\\\\\\r\\n压力线:(1+M/100)*轨道; \\\\n\\\\\\r\\n支撑线:(1-M/100)*轨道;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.JLHB = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'JLHB', Description: '绝路航标', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 7 } ,{ Name: 'M', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'VAR1:=(CLOSE-LLV(LOW,60))/(HHV(HIGH,60)-LLV(LOW,60))*80; \\\\n\\\\\\r\\nB:SMA(VAR1,N,1); \\\\n\\\\\\r\\nVAR2:SMA(B,M,1); \\\\n\\\\\\r\\n绝路航标:IF(CROSS(B,VAR2) AND B<40,50,0);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.PCNT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'PCNT', Description: '幅度比', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'PCNT:(CLOSE-REF(CLOSE,1))/CLOSE*100;\\\\n\\\\\\r\\nMAPCNT:EXPMEMA(PCNT,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BTX = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'BTX', Description: '宝塔线', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'B1:=REF(C,1);\\\\n\\\\\\r\\nB2:= REF(C, 2);\\\\n\\\\\\r\\nSS:= IF(C > REF(C, 1) AND REF(C, 1) >= REF(C, 2), 1, IF(C < REF(C, 1) AND REF(C, 1) <= REF(C, 2), -1, IF(C > REF(C, 2) AND REF(C, 2) > REF(C, 1), 2, IF(C < REF(C, 2) AND REF(C, 2) < REF(C, 1), -2, 0))));\\\\n\\\\\\r\\nSM:= IF(REF(SS, 1) <> 0, REF(SS, 1), IF(REF(SS, 2) <> 0, REF(SS, 2), IF(REF(SS, 3) <> 0, REF(SS, 3), IF(REF(SS, 5) <> 0, REF(SS, 5), IF(REF(SS, 6) <> 0, REF(SS, 6), IF(REF(SS, 7) <> 0, REF(SS, 7), 0))))));\\\\n\\\\\\r\\nMC:= IF(REF(SS, 1) <> 0, B2, IF(SM > 0, MIN(B1, B2), MAX(B1, B2)));\\\\n\\\\\\r\\nTOW1:= IF(C > REF(C, 1), C, REF(C, 1));\\\\n\\\\\\r\\nTOW2:= IF((SS == -1 OR SS == -2) AND SM > 0, B2, TOW1);\\\\n\\\\\\r\\nTOWER:= IF(TOW1 > TOW2, TOW1, TOW2);\\\\n\\\\\\r\\nSTICKLINE(SS == 1 OR SM >= 1 AND SS == 0, B1, C, 10, 1), COLORRED;\\\\n\\\\\\r\\nSTICKLINE(SS == -1 OR SM <= -1 AND SS == 0, B1, C, 10, 0), COLORCYAN;\\\\n\\\\\\r\\nSTICKLINE(SS == 2, B2, C, 10, 1), COLORRED;\\\\n\\\\\\r\\nSTICKLINE(SS == -2, B2, C, 10, 0), COLORCYAN;\\\\n\\\\\\r\\nSTICKLINE((SS == -1 OR SS == -2) AND SM > 0, B2, B1, 10, 1), COLORRED;\\\\n\\\\\\r\\nSTICKLINE((SS == 1 OR SS == 2) AND SM < 0, B2, B1, 10, 0), COLORCYAN;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.AMO = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'AMO', Description: '成交金额', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M1', Value: 5 },{ Name: 'M2', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                'AMOW:AMOUNT/10000.0,VOLSTICK;\\\\n\\\\\\r\\nAMO1:MA(AMOW,M1);\\\\n\\\\\\r\\nAMO2:MA(AMOW,M2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VRSI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'VRSI', Description: '相对强弱量', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N1', Value: 6 },{ Name: 'N2', Value: 12 },{ Name: 'N3', Value: 24 }],\\r\\n            Script: //脚本\\r\\n                'LC:=REF(VOL,1);\\\\n\\\\\\r\\nRSI1:SMA(MAX(VOL-LC,0),N1,1)/SMA(ABS(VOL-LC),N1,1)*100;\\\\n\\\\\\r\\nRSI2:SMA(MAX(VOL-LC,0),N2,1)/SMA(ABS(VOL-LC),N2,1)*100;\\\\n\\\\\\r\\nRSI3:SMA(MAX(VOL-LC,0),N3,1)/SMA(ABS(VOL-LC),N3,1)*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.HSCOL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'HSCOL', Description: '换手柱', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'HSCOL:IF((SETCODE==0||SETCODE==1),100*VOL,VOL)/(FINANCE(7)/100),VOLSTICK;\\\\n\\\\\\r\\nMAHSL:MA(HSCOL,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DBQRV = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DBQRV', Description: '对比强弱量(需下载日线)', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'ZS:(INDEXV-REF(INDEXV,N))/REF(INDEXV,N);\\\\n\\\\\\r\\nGG:(VOL-REF(VOL,N))/REF(VOL,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.DBLB = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DBLB', Description: '对比量比(需下载日线)', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 5 },{ Name: 'M', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'GG:=VOL/SUM(REF(VOL,1),N);\\\\n\\\\\\r\\nZS:=INDEXV/SUM(REF(INDEXV,1),N);\\\\n\\\\\\r\\nDBLB:GG/ZS;\\\\n\\\\\\r\\nMADBLB:MA(DBLB,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ACD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ACD', Description: '升降线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                'LC:=REF(CLOSE,1);\\\\n\\\\\\r\\nDIF:=CLOSE-IF(CLOSE>LC,MIN(LOW,LC),MAX(HIGH,LC));\\\\n\\\\\\r\\nACD:SUM(IF(CLOSE==LC,0,DIF),0);\\\\n\\\\\\r\\nMAACD:EXPMEMA(ACD,M);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.EXPMA = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'EXPMA', Description: '指数平均线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'M1', Value: 12 },{ Name: 'M2', Value: 50 }],\\r\\n            Script: //脚本\\r\\n                'EXP1:EMA(CLOSE,M1);\\\\n\\\\\\r\\nEXP2:EMA(CLOSE,M2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.EXPMA_S = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'EXPMA_S', Description: '指数平均线-副图', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M1', Value: 12 },{ Name: 'M2', Value: 50 }],\\r\\n            Script: //脚本\\r\\n                'EXP1:EMA(CLOSE,M1);\\\\n\\\\\\r\\nEXP2:EMA(CLOSE,M2);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.HMA = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'HMA', Description: '高价平均线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'M1', Value: 6 },{ Name: 'M2', Value: 12 },{ Name: 'M3', Value: 30 },{ Name: 'M4', Value: 72 },{ Name: 'M5', Value: 144 }],\\r\\n            Script: //脚本\\r\\n                'HMA1:MA(HIGH,M1);\\\\n\\\\\\r\\nHMA2:MA(HIGH,M2);\\\\n\\\\\\r\\nHMA3:MA(HIGH,M3);\\\\n\\\\\\r\\nHMA4:MA(HIGH,M4);\\\\n\\\\\\r\\nHMA5:MA(HIGH,M5);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.LMA = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'LMA', Description: '低价平均线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'M1', Value: 6 },{ Name: 'M2', Value: 12 },{ Name: 'M3', Value: 30 },{ Name: 'M4', Value: 72 },{ Name: 'M5', Value: 144 }],\\r\\n            Script: //脚本\\r\\n                'LMA1:MA(LOW,M1);\\\\n\\\\\\r\\nLMA2:MA(LOW,M2);\\\\n\\\\\\r\\nLMA3:MA(LOW,M3);\\\\n\\\\\\r\\nLMA4:MA(LOW,M4);\\\\n\\\\\\r\\nLMA5:MA(LOW,M5);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VMA = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'VMA', Description: '变异平均线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'M1', Value: 6 },{ Name: 'M2', Value: 12 },{ Name: 'M3', Value: 30 },{ Name: 'M4', Value: 72 },{ Name: 'M5', Value: 144 }],\\r\\n            Script: //脚本\\r\\n                'VV:=(HIGH+OPEN+LOW+CLOSE)/4;\\\\n\\\\\\r\\nVMA1:MA(VV,M1);\\\\n\\\\\\r\\nVMA2:MA(VV,M2);\\\\n\\\\\\r\\nVMA3:MA(VV,M3);\\\\n\\\\\\r\\nVMA4:MA(VV,M4);\\\\n\\\\\\r\\nVMA5:MA(VV,M5);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.AMV = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'AMV', Description: '成本价均线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M1', Value: 6 },{ Name: 'M2', Value: 12 },{ Name: 'M3', Value: 30 },{ Name: 'M4', Value: 72 },{ Name: 'M5', Value: 144 }],\\r\\n            Script: //脚本\\r\\n                'AMOV:=VOL*(OPEN+CLOSE)/2;\\\\n\\\\\\r\\nAMV1:SUM(AMOV,M1)/SUM(VOL,M1);\\\\n\\\\\\r\\nAMV2:SUM(AMOV,M2)/SUM(VOL,M2);\\\\n\\\\\\r\\nAMV3:SUM(AMOV,M3)/SUM(VOL,M3);\\\\n\\\\\\r\\nAMV4:SUM(AMOV,M4)/SUM(VOL,M4);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.BBIBOLL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'BBIBOLL', Description: '多空布林线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 11 },{ Name: 'M', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'CV:=CLOSE;\\\\n\\\\\\r\\nBBIBOLL:(MA(CV,3)+MA(CV,6)+MA(CV,12)+MA(CV,24))/4;\\\\n\\\\\\r\\nUPR:BBIBOLL+M*STD(BBIBOLL,N);\\\\n\\\\\\r\\nDWN:BBIBOLL-M*STD(BBIBOLL,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ALLIGAT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ALLIGAT', Description: '鳄鱼线', IsMainIndex: true,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'NN:=(H+L)/2;\\\\n\\\\\\r\\n上唇:REF(MA(NN,5),3),COLOR40FF40;\\\\n\\\\\\r\\n牙齿:REF(MA(NN,8),5),COLOR0000C0;\\\\n\\\\\\r\\n下颚:REF(MA(NN,13),8),COLORFF4040;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ZX = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ZX', Description: '重心线', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'AV:0.01*AMOUNT/VOL;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.XS = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'XS', Description: '薛斯通道', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 13 }],\\r\\n            Script: //脚本\\r\\n                'VAR2:=CLOSE*VOL;\\\\n\\\\\\r\\nVAR3:=EMA((EMA(VAR2,3)/EMA(VOL,3)+EMA(VAR2,6)/EMA(VOL,6)+EMA(VAR2,12)/EMA(VOL,12)+EMA(VAR2,24)/EMA(VOL,24))/4,N);\\\\n\\\\\\r\\nSUP:1.06*VAR3;\\\\n\\\\\\r\\nSDN:VAR3*0.94;\\\\n\\\\\\r\\nVAR4:=EMA(CLOSE,9);\\\\n\\\\\\r\\nLUP:EMA(VAR4*1.14,5);\\\\n\\\\\\r\\nLDN:EMA(VAR4*0.86,5);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.XS2 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'XS2', Description: '薛斯通道II', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 102 },{ Name: 'M', Value: 7 }],\\r\\n            Script: //脚本\\r\\n                'AA:=MA((2*CLOSE+HIGH+LOW)/4,5); \\\\n\\\\\\r\\n通道1:AA*N/100; \\\\n\\\\\\r\\n通道2:AA*(200-N)/100; \\\\n\\\\\\r\\nCC:=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,20))/MA(CLOSE,20); \\\\n\\\\\\r\\nDD:=DMA(CLOSE,CC); \\\\n\\\\\\r\\n通道3:(1+M/100)*DD; \\\\n\\\\\\r\\n通道4:(1-M/100)*DD;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SG_XDT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SG-XDT', Description: '心电图(需下载日线)', IsMainIndex: false,\\r\\n            Args: [{ Name: 'P1', Value: 5 },{ Name: 'P2', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                'QR:CLOSE/INDEXC*1000;\\\\n\\\\\\r\\nMQR1:MA(QR,5);\\\\n\\\\\\r\\nMQR2:MA(QR,10);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SG_SMX = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SG-SMX', Description: '生命线(需下载日线)', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 50 }],\\r\\n            Script: //脚本\\r\\n                'H1:=HHV(HIGH,N);\\\\n\\\\\\r\\nL1:=LLV(LOW,N);\\\\n\\\\\\r\\nH2:=HHV(INDEXH,N);\\\\n\\\\\\r\\nL2:=LLV(INDEXL,N);\\\\n\\\\\\r\\nZY:=CLOSE/INDEXC*2000;\\\\n\\\\\\r\\nZY1:EMA(ZY,3);\\\\n\\\\\\r\\nZY2:EMA(ZY,17);\\\\n\\\\\\r\\nZY3:EMA(ZY,34);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SG_LB = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SG-LB', Description: '量比(需下载日线)', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'ZY2:=VOL/INDEXV*1000;\\\\n\\\\\\r\\n量比:ZY2;\\\\n\\\\\\r\\nMA5:MA(ZY2,5);\\\\n\\\\\\r\\nMA10:MA(ZY2,10);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SG_PF = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SG-PF', Description: '强势股评分(需下载日线)', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'ZY1:=CLOSE/INDEXC*1000;\\\\n\\\\\\r\\nA1:=IF(ZY1>HHV(ZY1,3),10,0);\\\\n\\\\\\r\\nA2:=IF(ZY1>HHV(ZY1,5),15,0);\\\\n\\\\\\r\\nA3:=IF(ZY1>HHV(ZY1,10),20,0);\\\\n\\\\\\r\\nA4:=IF(ZY1>HHV(ZY1,2),10,0);\\\\n\\\\\\r\\nA5:=COUNT(ZY1>REF(ZY1,1) ,9)*5;\\\\n\\\\\\r\\n强势股评分:A1+A2+A3+A4+A5;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.RAD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'RAD', Description: '威力雷达(需下载日线)', IsMainIndex: false,\\r\\n            Args: [{ Name: 'D', Value: 3 },{ Name: 'S', Value: 30 },{ Name: 'M', Value: 30 }],\\r\\n            Script: //脚本\\r\\n                'SM:=(OPEN+HIGH+CLOSE+LOW)/4;\\\\n\\\\\\r\\nSMID:=MA(SM,D);\\\\n\\\\\\r\\nIM:=(INDEXO+INDEXH+INDEXL+INDEXC)/4;\\\\n\\\\\\r\\nIMID:=MA(IM,D);\\\\n\\\\\\r\\nSI1:=(SMID-REF(SMID,1))/SMID;\\\\n\\\\\\r\\nII:=(IMID-REF(IMID,1))/IMID;\\\\n\\\\\\r\\nRADER1:SUM((SI1-II)*2,S)*1000;\\\\n\\\\\\r\\nRADERMA:SMA(RADER1,M,1);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SHT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SHT', Description: '龙系短线', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'VAR1:=MA((VOL-REF(VOL,1))/REF(VOL,1),5);\\\\n\\\\\\r\\nVAR2:=(CLOSE-MA(CLOSE,24))/MA(CLOSE,24)*100;\\\\n\\\\\\r\\nMY: VAR2*(1+VAR1);\\\\n\\\\\\r\\nSHT: MY, COLORSTICK;\\\\n\\\\\\r\\nSHTMA: MA(SHT,N);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ZLJC = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ZLJC', Description: '主力进出', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'VAR1:=(CLOSE+LOW+HIGH)/3; \\\\n\\\\\\r\\nVAR2:=SUM(((VAR1-REF(LOW,1))-(HIGH-VAR1))*VOL/100000/(HIGH-LOW),0); \\\\n\\\\\\r\\nVAR3:=EMA(VAR2,1); \\\\n\\\\\\r\\nJCS:VAR3; \\\\n\\\\\\r\\nJCM:MA(VAR3,12); \\\\n\\\\\\r\\nJCL:MA(VAR3,26);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ZLMM = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ZLMM', Description: '主力买卖', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'LC :=REF(CLOSE,1);\\\\n\\\\\\r\\nRSI2:=SMA(MAX(CLOSE-LC,0),12,1)/SMA(ABS(CLOSE-LC),12,1)*100;\\\\n\\\\\\r\\nRSI3:=SMA(MAX(CLOSE-LC,0),18,1)/SMA(ABS(CLOSE-LC),18,1)*100;\\\\n\\\\\\r\\nMMS:MA(3*RSI2-2*SMA(MAX(CLOSE-LC,0),16,1)/SMA(ABS(CLOSE-LC),16,1)*100,3);\\\\n\\\\\\r\\nMMM:EMA(MMS,8);\\\\n\\\\\\r\\nMML:MA(3*RSI3-2*SMA(MAX(CLOSE-LC,0),12,1)/SMA(ABS(CLOSE-LC),12,1)*100,5);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SLZT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SLZT', Description: '神龙在天', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '白龙: MA(CLOSE,125);\\\\n\\\\\\r\\n黄龙: 白龙+2*STD(CLOSE,170);\\\\n\\\\\\r\\n紫龙: 白龙-2*STD(CLOSE,145);\\\\n\\\\\\r\\n青龙: SAR(125,1,7), LINESTICK;\\\\n\\\\\\r\\nVAR2:=HHV(HIGH,70);\\\\n\\\\\\r\\nVAR3:=HHV(HIGH,20);\\\\n\\\\\\r\\n红龙: VAR2*0.83;\\\\n\\\\\\r\\n蓝龙: VAR3*0.91;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ADVOL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ADVOL', Description: '龙系离散量', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'A:=SUM(((CLOSE-LOW)-(HIGH-CLOSE))*VOL/10000/(HIGH-LOW),0);\\\\n\\\\\\r\\nADVOL:A;\\\\n\\\\\\r\\nMA1:MA(A,30);\\\\n\\\\\\r\\nMA2:MA(MA1,100);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYC = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYC', Description: '成本均线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'P1', Value: 5 },{ Name: 'P2', Value: 13 },{ Name: 'P3', Value: 34 }],\\r\\n            Script: //脚本\\r\\n                'JJJ:=IF(DYNAINFO(8)>0.01,0.01*DYNAINFO(10)/DYNAINFO(8),DYNAINFO(3));\\\\n\\\\\\r\\nDDD:=(DYNAINFO(5)<0.01 || DYNAINFO(6)<0.01);\\\\n\\\\\\r\\nJJJT:=IF(DDD,1,(JJJ<(DYNAINFO(5)+0.01) && JJJ>(DYNAINFO(6)-0.01)));\\\\n\\\\\\r\\nCYC1:IF(JJJT,0.01*EMA(AMOUNT,P1)/EMA(VOL,P1),EMA((HIGH+LOW+CLOSE)/3,P1));\\\\n\\\\\\r\\nCYC2:IF(JJJT,0.01*EMA(AMOUNT,P2)/EMA(VOL,P2),EMA((HIGH+LOW+CLOSE)/3,P2));\\\\n\\\\\\r\\nCYC3:IF(JJJT,0.01*EMA(AMOUNT,P3)/EMA(VOL,P3),EMA((HIGH+LOW+CLOSE)/3,P3));\\\\n\\\\\\r\\nCYC4:IF(JJJT,DMA(AMOUNT/(100*VOL),100*VOL/FINANCE(7)),EMA((HIGH+LOW+CLOSE)/3,120));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYS = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYS', Description: '市场盈亏', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'CYC13:EMA(AMOUNT,13)/EMA(VOL,13);\\\\n\\\\\\r\\nCYS:(CLOSE-CYC13)/CYC13*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYQKL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYQKL', Description: '博弈K线长度', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'KL:100*(WINNER(CLOSE)-WINNER(OPEN));'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SCR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SCR', Description: '筹码集中度', IsMainIndex: false,\\r\\n            Args: [{ Name: 'P1', Value: 90 }],\\r\\n            Script: //脚本\\r\\n                'A:=P1+(100-P1)/2;\\\\n\\\\\\r\\nB:=(100-P1)/2;\\\\n\\\\\\r\\nCC:=COST(A);\\\\n\\\\\\r\\nDD:=COST(B);\\\\n\\\\\\r\\nSCR:(CC-DD)/(CC+DD)*100/2;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.ASR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ASR', Description: '浮筹比例', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'ASR:(WINNER(C*1.1)-WINNER(C*0.9))/WINNER(HHV(H,0))*100;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SAR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SAR', Description: '抛物转向', IsMainIndex: true,\\r\\n            Args: [{ Name: 'P', Value: 10 },{ Name: 'STEP', Value: 2 },{ Name: 'MAXP', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                'S:SAR(P,STEP,MAXP),CIRCLEDOT;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TJCJL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '太极成交量', Description: '太极成交量', IsMainIndex: true,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '总手:VOL,NODRAW;\\\\n\\\\\\r\\nDRAWTEXT_FIX(ISLASTBAR,0,0,0,\\\"说明: 红色柱为吸货量,绿色为出货量,黄色为天量,蓝色为地量\\\"),COLORGRAY;\\\\n\\\\\\r\\nZZ:=IF(REF(C,1)>REF(O,1) AND O>REF(C,1)*1.014 AND C<O*1.02,1,3);\\\\n\\\\\\r\\nV5:=MA(V,5);\\\\n\\\\\\r\\nV12:=MA(V,12);\\\\n\\\\\\r\\nV34:=MA(V,34);\\\\n\\\\\\r\\nC6:=MA(C,6);\\\\n\\\\\\r\\nSTICKLINE(VOL,0,VOL,3,0),COLORLIGRAY;\\\\n\\\\\\r\\nSTICKLINE(CROSS(C,C6) AND V>V5*1.2 AND V>V12*1.2 AND ZZ>2 AND C>H*0.975,0,VOL,3,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(CROSS(C6,C) AND V>V5*1.2 AND V>V12*1.2,0,VOL,3,0),COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(VOL>MA(VOL,5)*2 AND V>V34*3 AND C<REF(C,1)*1.05,0,VOL,3,0),COLORYELLOW;\\\\n\\\\\\r\\nSTICKLINE(VOL<MA(VOL,5)/2 AND V<V12/2,0,VOL,3,0),COLORBLUE;\\\\n\\\\\\r\\nSTICKLINE(VOL>MA(VOL,5)*2 AND V>V34*3 AND C<REF(C,1)*1.05 AND CROSS(C,C6) AND V>V5*1.2 AND V>V12*1.2 AND ZZ>2 AND C>H*0.975,VOL*0.5,0,3,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(VOL>MA(VOL,5)*2 AND V>V34*3 AND C<REF(C,1)*1.05 AND CROSS(C6,C) AND V>V5*1.2 AND V>V12*1.2,VOL*0.5,0,3,0),COLORRED;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n/*\\r\\n    飞龙四式-主图\\r\\n*/\\r\\nJSIndexScript.prototype.Dragon4_Main = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '飞龙四式', Description: '飞龙四式', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N1', Value: 5 }, { Name: 'N2', Value: 10 }, { Name: 'N3', Value: 50 }, { Name: 'N4', Value: 60 }],\\r\\n            Script: //脚本\\r\\n                '蜻蜓点水:=EMA(CLOSE,N1),COLORGRAY;\\\\n\\\\\\r\\n魔界:=EMA(CLOSE,N2),COLORGREEN;\\\\n\\\\\\r\\n水:=EMA(CLOSE,N3),COLORRED;\\\\n\\\\\\r\\nDRAWKLINE(HIGH,OPEN,LOW,CLOSE);\\\\n\\\\\\r\\n生命线:MA(CLOSE,N4),COLORBLUE,LINETHICK2;\\\\n\\\\\\r\\nDRAWBAND(魔界,\\\\'RGB(186,225,250)\\\\',水,\\\\'RGB(253,194,124)\\\\');\\\\n\\\\\\r\\nDRAWBAND(蜻蜓点水,\\\\'RGB(128,138,135)\\\\',魔界,\\\\'RGB(0,0,255)\\\\');'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Dragon4_Fig=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '飞龙四式', Description: '飞龙四式', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '倍:VOL>=REF(V,1)*1.90 AND C>REF(C,1),COLORYELLOW;\\\\n\\\\\\r\\n低:VOL<REF(LLV(VOL,13),1),COLORGREEN;\\\\n\\\\\\r\\n地:VOL<REF(LLV(VOL,100),1),COLORMAGENTA; \\\\n\\\\\\r\\n平:=ABS(VOL-HHV(REF(VOL,1),5))/HHV(REF(VOL,1),5)<=0.03 OR ABS(VOL-REF(VOL,1))/REF(VOL,1)<=0.03,NODRAW,COLORWHITE;\\\\n\\\\\\r\\n倍缩:VOL<=REF(V,1)*0.5,COLORFF8000;\\\\n\\\\\\r\\n梯量:COUNT(V>REF(V,1),3)==3 AND COUNT(C>O,3)==3,COLORBROWN;\\\\n\\\\\\r\\n缩量涨:COUNT(C>REF(C,1),2)==2 AND COUNT(V<REF(V,1),2)==2,COLORBLUE;\\\\n\\\\\\r\\nSTICKLINE(C>=REF(C,1),V,0,2,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(C<REF(C,1),V,0,2,0),COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(倍,0,V,2,0),COLORYELLOW;\\\\n\\\\\\r\\nSTICKLINE(低,0,V,2,0),COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(地,0,V,2,0),COLORLIMAGENTA;\\\\n\\\\\\r\\nSTICKLINE(平,0,V,2,0),COLORGRAY;\\\\n\\\\\\r\\nSTICKLINE(倍缩,0,V,2,0),COLORFF8000;\\\\n\\\\\\r\\nSTICKLINE(梯量,0,V,2,0),COLORBROWN;\\\\n\\\\\\r\\nSTICKLINE(缩量涨,0,V,2,0),COLORBLUE;'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n能图-资金分析\\r\\nM:=55;\\r\\nN:=34;\\r\\nLC:=REF(CLOSE,1);\\r\\nRSI:=((SMA(MAX((CLOSE - LC),0),3,1) / SMA(ABS((CLOSE - LC)),3,1)) * 100);\\r\\nFF:=EMA(CLOSE,3);\\r\\nMA15:=EMA(CLOSE,21); DRAWTEXT(CROSS(85,RSI),75,'▼'),COLORGREEN;\\r\\nVAR1:=IF(YEAR>=2038 AND MONTH>=1,0,1);\\r\\nVAR2:=REF(LOW,1)*VAR1;\\r\\nVAR3:=SMA(ABS(LOW-VAR2),3,1)/SMA(MAX(LOW-VAR2,0),3,1)*100*VAR1;\\r\\nVAR4:=EMA(IF(CLOSE*1.3,VAR3*10,VAR3/10),3)*VAR1;\\r\\nVAR5:=LLV(LOW,30)*VAR1;\\r\\nVAR6:=HHV(VAR4,30)*VAR1;\\r\\nVAR7:=IF(MA(CLOSE,58),1,0)*VAR1;\\r\\nVAR8:=EMA(IF(LOW<=VAR5,(VAR4+VAR6*2)/2,0),3)/618*VAR7*VAR1;\\r\\n吸筹A:IF(VAR8>100,100,VAR8)*VAR1,COLORRED;\\r\\n吸筹B:STICKLINE(吸筹A>-150,0,吸筹A,8,0),COLORRED;\\r\\n\\r\\n散户线: 100*(HHV(HIGH,M)-CLOSE)/(HHV(HIGH,M)-LLV(LOW,M)),COLORFFFF00,LINETHICK2;\\r\\nRSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;\\r\\nK:=SMA(RSV,3,1);\\r\\nD:=SMA(K,3,1);\\r\\nJ:=3*K-2*D;\\r\\n主力线:EMA(J,5),COLORFF00FF,LINETHICK2;\\r\\nDRAWICON(CROSS(主力线,散户线),主力线,1);\\r\\nDRAWICON(CROSS(散户线,主力线),主力线,2);\\r\\n*/\\r\\n\\r\\nJSIndexScript.prototype.FundsAnalysis=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '资金分析', Description: '资金分析', IsMainIndex: false,\\r\\n            Args: [{ Name: 'M', Value: 55 }, { Name: 'N', Value: 34 }],\\r\\n            Script: //脚本\\r\\n                'LC:=REF(CLOSE,1);\\\\n\\\\\\r\\nRSI:=((SMA(MAX((CLOSE - LC),0),3,1) / SMA(ABS((CLOSE - LC)),3,1)) * 100);\\\\n\\\\\\r\\nFF:=EMA(CLOSE,3);\\\\n\\\\\\r\\nMA15:=EMA(CLOSE,21); DRAWTEXT(CROSS(85,RSI),75,\\\\'▼\\\\'),COLORGREEN;\\\\n\\\\\\r\\nVAR1:=IF(YEAR>=2038 AND MONTH>=1,0,1);\\\\n\\\\\\r\\nVAR2:=REF(LOW,1)*VAR1;\\\\n\\\\\\r\\nVAR3:=SMA(ABS(LOW-VAR2),3,1)/SMA(MAX(LOW-VAR2,0),3,1)*100*VAR1;\\\\n\\\\\\r\\nVAR4:=EMA(IF(CLOSE*1.3,VAR3*10,VAR3/10),3)*VAR1;\\\\n\\\\\\r\\nVAR5:=LLV(LOW,30)*VAR1;\\\\n\\\\\\r\\nVAR6:=HHV(VAR4,30)*VAR1;\\\\n\\\\\\r\\nVAR7:=IF(MA(CLOSE,58),1,0)*VAR1;\\\\n\\\\\\r\\nVAR8:=EMA(IF(LOW<=VAR5,(VAR4+VAR6*2)/2,0),3)/618*VAR7*VAR1;\\\\n\\\\\\r\\n吸筹A:IF(VAR8>100,100,VAR8)*VAR1,COLORFB2F3B;\\\\n\\\\\\r\\n{吸筹B}STICKLINE(吸筹A>-150,0,吸筹A,8,0),COLORFB2F3B;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\n散户线: 100*(HHV(HIGH,M)-CLOSE)/(HHV(HIGH,M)-LLV(LOW,M)),COLORAA89BD,LINETHICK2;\\\\n\\\\\\r\\nRSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;\\\\n\\\\\\r\\nK:=SMA(RSV,3,1);\\\\n\\\\\\r\\nD:=SMA(K,3,1);\\\\n\\\\\\r\\nJ:=3*K-2*D;\\\\n\\\\\\r\\n主力线:EMA(J,5),COLORF39800,LINETHICK2;\\\\n\\\\\\r\\nDRAWICON(CROSS(主力线,散户线),主力线,1);\\\\n\\\\\\r\\nDRAWICON(CROSS(散户线,主力线),主力线,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.MarginProportion=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '融资占比(%)', Description: '融资占比', IsMainIndex: false,\\r\\n            Condition: { Period:[CONDITION_PERIOD.KLINE_DAY_ID] },\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '占比:MARGIN(2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Margin2=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '两融余额', Description: '融资融券余额', IsMainIndex: false,\\r\\n            Condition: { Period:[CONDITION_PERIOD.KLINE_DAY_ID] },\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'T1:MARGIN(1);\\\\n\\\\\\r\\n        T2:MA(MARGIN(1),N);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Margin3=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '两融余额', Description: '融资融券余额', IsMainIndex: false,\\r\\n            Condition: { Period:[CONDITION_PERIOD.KLINE_DAY_ID] },\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                'T1:=MARGIN(1);\\\\n\\\\\\r\\n        T2:=MA(MARGIN(1),N);\\\\n\\\\\\r\\n        STICKLINE(T1-T2>=0,0,T1-T2,50,T1>T2),COLORRED;\\\\n\\\\\\r\\n        STICKLINE(T1-T2<0,T1-T2,0,50,T1>T2),COLORGREEN;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.FXG_BSPoint=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '操盘BS点', Description: '操盘BS点', IsMainIndex: true,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'MA5:MA(CLOSE,5);\\\\n\\\\\\r\\n        MA13:MA(CLOSE,13);\\\\n\\\\\\r\\n        MA21:MA(CLOSE,21);\\\\n\\\\\\r\\n        MA34:MA(CLOSE,34);\\\\n\\\\\\r\\n        {MA55:MA(CLOSE,55),COLOR0000FF;}\\\\n\\\\\\r\\n        {MA120:=MA(CLOSE,120),COLORFFFF00;}\\\\n\\\\\\r\\n        天使:=EMA(C,2),COLOR000000;\\\\n\\\\\\r\\n        魔鬼:=EMA(SLOPE(C,21)*20+C,42),COLOR000000;\\\\n\\\\\\r\\n        买:=CROSS(天使,魔鬼);\\\\n\\\\\\r\\n        卖:=CROSS(魔鬼,天使);\\\\n\\\\\\r\\n        DRAWICON(买,L*0.97,13);\\\\n\\\\\\r\\n        DRAWICON(卖,H*1.03,14);\\\\n\\\\\\r\\n        DRAWKLINE_IF(天使>=魔鬼,HIGH,CLOSE,LOW,OPEN),COLORRED;\\\\n\\\\\\r\\n        DRAWKLINE_IF(天使<魔鬼,HIGH,CLOSE,LOW,OPEN),COLORBLUE;\\\\n\\\\\\r\\n        DRAWKLINE_IF(CROSS(天使,魔鬼),HIGH,CLOSE,LOW,OPEN),COLORYELLOW;\\\\n\\\\\\r\\n        DRAWKLINE_IF(CROSS(魔鬼,天使),HIGH,CLOSE,LOW,OPEN),COLORBLACK;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.FXG_INDEX=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '涨停多空线', Description: '涨停多空线', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '做多能量线: SMA((CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100,5,1)-8,COLORRED,LINETHICK3;\\\\n\\\\\\r\\n做空能量线: SMA((HHV(HIGH,36)-CLOSE)/(HHV(HIGH,36)-LLV(LOW,36))*100,2,1),COLORGREEN,LINETHICK3;\\\\n\\\\\\r\\n20,POINTDOT,COLORF00FF0;\\\\n\\\\\\r\\n50,POINTDOT,COLORGREEN;\\\\n\\\\\\r\\n80,POINTDOT,COLORLIBLUE;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.FXG_INDEX2=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '涨停吸筹区', Description: '涨停吸筹区', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'VAR0:=EMA(HHV(HIGH,500),21); \\\\n\\\\\\r\\nVAR1:=EMA(HHV(HIGH,250),21);\\\\n\\\\\\r\\nVAR2:=EMA(HHV(HIGH,90),21); \\\\n\\\\\\r\\nVAR3:=EMA(LLV(LOW,500),21); \\\\n\\\\\\r\\nVAR4:=EMA(LLV(LOW,250),21); \\\\n\\\\\\r\\nVAR5:=EMA(LLV(LOW,90),21);\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nVAR6:=EMA((VAR3*0.96+VAR4*0.96+VAR5*0.96+VAR0*0.558+VAR1*0.558+VAR2*0.558)/6,21); \\\\n\\\\\\r\\nVAR7:=EMA((VAR3*1.25+VAR4*1.23+VAR5*1.2+VAR0*0.55+VAR1*0.55+VAR2*0.65)/6,21); \\\\n\\\\\\r\\nVAR8:=EMA((VAR3*1.3+VAR4*1.3+VAR5*1.3+VAR0*0.68+VAR1*0.68+VAR2*0.68)/6,21); \\\\n\\\\\\r\\nVAR9:=EMA((VAR6*3+VAR7*2+VAR8)/6*1.738,21); \\\\n\\\\\\r\\nVAR10:=REF(LOW,1); \\\\n\\\\\\r\\nVAR11:=SMA(ABS(LOW-VAR10),3,1)/SMA(MAX(LOW-VAR10,0),3,1)*100; \\\\n\\\\\\r\\nVAR12:=EMA(IFF(CLOSE*1.35<=VAR9,VAR11*10,VAR11/10),3); \\\\n\\\\\\r\\nVAR13:=LLV(LOW,30); \\\\n\\\\\\r\\nVAR14:=HHV(VAR12,30); \\\\n\\\\\\r\\nVAR15:=IFF(MA(CLOSE,58),1,0); \\\\n\\\\\\r\\nVAR16:=EMA(IFF(LOW<=VAR13,(VAR12+VAR14*2)/2,0),3)/618*VAR15;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\n资金入场:IFF(VAR16>0,VAR16,0),LINETHICK,LINETHICK2, COLORFF0000; \\\\n\\\\\\r\\n\\\\n\\\\\\r\\nA1:IFF(资金入场>0,资金入场*1.2,0),STICK,LINETHICK5, COLORFF0000;\\\\n\\\\\\r\\nA2:IFF(资金入场>0,资金入场*0.8,0),STICK,LINETHICK5, COLORFF6600;\\\\n\\\\\\r\\nA3:IFF(资金入场>0,资金入场*0.6,0),STICK,LINETHICK5, COLORFF9900;\\\\n\\\\\\r\\nA4:IFF(资金入场>0,资金入场*0.4,0) ,STICK,LINETHICK5,COLORFFCC00;\\\\n\\\\\\r\\nA5:IFF(资金入场>0,资金入场*0.2,0) ,STICK,LINETHICK5,COLORFFFF00;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.FXG_INDEX3=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '量能黄金点', Description: '量能黄金点', IsMainIndex: false,FloatPrecision:0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'A:=IFF((CLOSE>126.32),VOL,VOL); \\\\n\\\\\\r\\n主力:=MA(A,4),COLORRED;\\\\n\\\\\\r\\n游资:=MA(A,8),COLORYELLOW;\\\\n\\\\\\r\\n大户:=MA(A,16),COLORF0F000;\\\\n\\\\\\r\\n散户:=MA(A,32),COLOR00FF00;\\\\n\\\\\\r\\n主比:=ABS(((主力)/(主力 + 游资 + 大户 + 散户))*(100)),LINESTICK,COLORRED;\\\\n\\\\\\r\\n游比:=ABS(((游资)/(主力 + 游资 + 大户 + 散户))*(100)),LINESTICK,COLORYELLOW;\\\\n\\\\\\r\\n大比:=ABS(((大户)/(主力 + 游资 + 大户 + 散户))*(100)),LINESTICK,COLORF0F000;\\\\n\\\\\\r\\n散比:=ABS(((散户)/(主力 + 游资 + 大户 + 散户))*(100)),LINESTICK,COLOR00FF00;\\\\n\\\\\\r\\n警戒线:MA(A,180),COLORFF66FF;\\\\n\\\\\\r\\nSTICKLINE((主力 > 0),0,主力,2.5,0),COLOR1020BB;\\\\n\\\\\\r\\nSTICKLINE((主力 > 0),0,主力,0.7,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE((游资 > 0),0,游资,2.5,0),COLOR009CFF;\\\\n\\\\\\r\\nSTICKLINE((游资 > 0),0,游资,0.7,0),COLORYELLOW;\\\\n\\\\\\r\\nSTICKLINE((大户 > 0),0,大户,2.5,0),COLORFF8800;\\\\n\\\\\\r\\nSTICKLINE((大户 > 0),0,大户,0.7,0),COLORLIBLUE;\\\\n\\\\\\r\\nSTICKLINE((散户 > 0),0,散户,2.5,0),COLOR00CA00;\\\\n\\\\\\r\\nSTICKLINE((散户 > 0),0,散户,0.7,0),COLORGREEN;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.NewsNegative=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '负面新闻', Description: '负面新闻统计', IsMainIndex: false,FloatPrecision:0,\\r\\n            Args: [{ Name: 'N', Value: 5 }, { Name: 'N2', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                '负面:NEWS(1);\\\\n\\\\\\r\\nMA1:MA(负面,N);\\\\n\\\\\\r\\nMA2:MA(负面,N2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.UpDownAnalyze=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '涨跌趋势', Description: '涨跌趋势', IsMainIndex: false,FloatPrecision:0,\\r\\n            Condition: { Period:[CONDITION_PERIOD.MINUTE_ID, CONDITION_PERIOD.MULTIDAY_MINUTE_ID, CONDITION_PERIOD.KLINE_DAY_ID] },\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"上涨家数:UPCOUNT('CNA.CI'),COLORRED;\\\\n\\\\\\r\\n下跌家数:DOWNCOUNT('CNA.CI'),COLORGREEN;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.HK2SHSZ=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '北上资金', Description: '北上资金', IsMainIndex: false,FloatPrecision:0,\\r\\n            Condition: { Period:[CONDITION_PERIOD.MINUTE_ID,CONDITION_PERIOD.MULTIDAY_MINUTE_ID,CONDITION_PERIOD.KLINE_DAY_ID] },\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"净流入:HK2SHSZ(1),COLORSTICK;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ShareHolder=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '股东人数', Description: '股东人数', IsMainIndex: false,FloatPrecision:0,\\r\\n            Condition: { Period:[\\r\\n                    CONDITION_PERIOD.KLINE_DAY_ID,\\r\\n                    CONDITION_PERIOD.KLINE_MONTH_ID,\\r\\n                    CONDITION_PERIOD.KLINE_WEEK_ID,\\r\\n                    CONDITION_PERIOD.KLINE_YEAR_ID] },\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"人数:FINANCE(100);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.VOLRate=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '量比', Description: '量比', IsMainIndex: false,  Condition: { Period:[CONDITION_PERIOD.MINUTE_ID, CONDITION_PERIOD.MULTIDAY_MINUTE_ID ] },\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"LIANGBI:VOLR;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//五彩K线\\r\\n\\r\\nJSIndexScript.prototype.COLOR_KSTAR1=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '十字星', Description: '十字星', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:CLOSE==OPEN&&HIGH>LOW;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_KSTAR2=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '早晨之星', Description: '早晨之星', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:(REF(CLOSE,2)/REF(OPEN,2)<0.95) && (REF(OPEN,1) < REF(CLOSE,2)) && (ABS(REF(OPEN,1)-REF(CLOSE,1))/REF(CLOSE,1)<0.03) && CLOSE/OPEN>1.05 && CLOSE>REF(CLOSE,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_KSTAR3=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '黄昏之星', Description: '黄昏之星', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:REF(CLOSE,2)/REF(OPEN,2)>1.05 && REF(OPEN,1)>REF(CLOSE,2) && ABS(REF(OPEN,1)-REF(CLOSE,1))/REF(CLOSE,1)<0.03 && CLOSE/OPEN<0.95 && CLOSE<REF(CLOSE,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_SHI1=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '长十字', Description: '长十字', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:CLOSE==OPEN&&HIGH/LOW>1.03;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K220=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '身怀六甲', Description: '身怀六甲', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:ABS(REF(CLOSE,1)-REF(OPEN,1))/REF(CLOSE,1)>0.04&&\\\\n\\\\\\r\\n            ABS(CLOSE-OPEN)/CLOSE<0.005&&\\\\n\\\\\\r\\n            MAX(CLOSE,OPEN)<MAX(REF(CLOSE,1),REF(OPEN,1))&&\\\\n\\\\\\r\\n            MIN(CLOSE,OPEN)>MIN(REF(CLOSE,1),REF(OPEN,1));'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K300=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '三个白武士', Description: '三个白武士', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:UPNDAY(CLOSE,3)&&NDAY(CLOSE,OPEN,3);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K310=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '三只乌鸦', Description: '三只乌鸦', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:DOWNNDAY(CLOSE,3)&&NDAY(OPEN,CLOSE,3);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K380=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '光头阳线', Description: '光头阳线', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:HIGH==CLOSE&&HIGH>LOW;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K390=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '光脚阴线', Description: '光脚阴线', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:LOW==CLOSE&&HIGH>LOW;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K134=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '垂死十字', Description: '垂死十字', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:CLOSE==OPEN&&CLOSE==LOW&&CLOSE<HIGH;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K140=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '早晨十字星', Description: '早晨十字星', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:REF(CLOSE,2)/REF(OPEN,2)<0.95&&\\\\n\\\\\\r\\nREF(OPEN,1)<REF(CLOSE,2)&&\\\\n\\\\\\r\\nREF(OPEN,1)==REF(CLOSE,1)&&\\\\n\\\\\\r\\nCLOSE/OPEN>1.05&&CLOSE>REF(CLOSE,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K150=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '黄昏十字星', Description: '黄昏十字星', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:REF(CLOSE,2)/REF(OPEN,2)>1.05&&\\\\n\\\\\\r\\nREF(OPEN,1)>REF(CLOSE,2)&&\\\\n\\\\\\r\\nREF(OPEN,1)=REF(CLOSE,1)&&\\\\n\\\\\\r\\nCLOSE/OPEN<0.95&&CLOSE<REF(CLOSE,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K160=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '射击之星', Description: '射击之星', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:MIN(OPEN,CLOSE)==LOW&&\\\\n\\\\\\r\\nHIGH-LOW>3*(MAX(OPEN,CLOSE)-LOW)&&\\\\n\\\\\\r\\nCLOSE>MA(CLOSE,5);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K165=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '倒转锤头', Description: '倒转锤头', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'KSTAR:MIN(OPEN,CLOSE)==LOW&&\\\\n\\\\\\r\\nHIGH-LOW>3*(MAX(OPEN,CLOSE)-LOW)&&\\\\n\\\\\\r\\nCLOSE<MA(CLOSE,5);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K170=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '锤头', Description: '锤头', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'OUT:HIGH==MAX(OPEN,CLOSE)&&\\\\n\\\\\\r\\nHIGH-LOW>3*(HIGH-MIN(OPEN,CLOSE))&&\\\\n\\\\\\r\\nCLOSE<MA(CLOSE,5);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K180=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '吊颈', Description: '吊颈', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'OUT:HIGH==MAX(OPEN,CLOSE)&&\\\\n\\\\\\r\\nHIGH-LOW>3*(HIGH-MIN(OPEN,CLOSE))&&\\\\n\\\\\\r\\nCLOSE>MA(CLOSE,5);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_K190=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '穿头破脚', Description: '穿头破脚', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'OUT:(REF(CLOSE,1)/REF(OPEN,1)>1.03&&\\\\n\\\\\\r\\nCLOSE/OPEN<0.96&&\\\\n\\\\\\r\\nCLOSE<REF(OPEN,1)&&OPEN>REF(CLOSE,1))||\\\\n\\\\\\r\\n(REF(CLOSE,1)/REF(OPEN,1)<0.97&&\\\\n\\\\\\r\\nCLOSE/OPEN>1.04&&\\\\n\\\\\\r\\nCLOSE>REF(OPEN,1)&&OPEN<REF(CLOSE,1));'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_SWORD=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '剑', Description: '剑', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'AA:=VOL>REF(VOL,1)||VOL>(CAPITAL*0.1);\\\\n\\\\\\r\\nBB:=OPEN>=(REF(HIGH,1))&&REF(HIGH,1)>(REF(HIGH,2)*1.06);\\\\n\\\\\\r\\nCC:=CLOSE>(REF(CLOSE,1))-(REF(CLOSE,1)*0.01);\\\\n\\\\\\r\\nDD:=CLOSE<(HIGH*0.965) && HIGH>(OPEN*1.05);\\\\n\\\\\\r\\nEE:=LOW<OPEN && LOW<CLOSE&&HIGH>(REF(CLOSE,1)*1.06);\\\\n\\\\\\r\\nFF:=(HIGH-(MAX(OPEN,CLOSE)))/2>(MIN(OPEN,CLOSE))-LOW;\\\\n\\\\\\r\\nGG:=(ABS(OPEN-CLOSE))/2<(MIN(OPEN,CLOSE)-LOW);\\\\n\\\\\\r\\nSWORDO:AA&&BB&&CC&&DD&&EE&&FF&&GG;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_CSFR=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '出水芙蓉', Description: '出水芙蓉', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'A:=CLOSE>OPEN;\\\\n\\\\\\r\\nB:=A&&CLOSE>MA(CLOSE,S)&&CLOSE>MA(CLOSE,M)&&CLOSE>MA(CLOSE,LL);\\\\n\\\\\\r\\nCC:=B&&OPEN<MA(CLOSE,M)&&OPEN<MA(CLOSE,LL);\\\\n\\\\\\r\\nCSFRO:CC&&(CLOSE-OPEN)>0.0618*CLOSE;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_WYGD=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '乌云盖顶', Description: '乌云盖顶', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( \\\\n\\\\\\r\\nREF(CLOSE,1)/REF(OPEN,1)>1.03 AND \\\\n\\\\\\r\\nCLOSE/OPEN<0.97 AND \\\\n\\\\\\r\\nOPEN>REF(CLOSE,1) AND CLOSE<REF(CLOSE,1), 3);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_SGCJ=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '曙光初现', Description: '曙光初现', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( \\\\n\\\\\\r\\nREF(CLOSE,1)/REF(OPEN,1)<0.97 AND \\\\n\\\\\\r\\nCLOSE/OPEN>1.03 AND \\\\n\\\\\\r\\nOPEN<REF(CLOSE,1) AND CLOSE>REF(CLOSE,1), 3);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_SZTAI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '十字胎', Description: '十字胎', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( ABS(REF(CLOSE,1)-REF(OPEN,1))/REF(CLOSE,1) > 0.04 AND \\\\n\\\\\\r\\nCLOSE==OPEN AND CLOSE < MAX(REF(CLOSE,1),REF(OPEN,1)) AND \\\\n\\\\\\r\\nCLOSE > MIN(REF(CLOSE,1),REF(OPEN,1)), 2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_PINGDING=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '平顶', Description: '平顶', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET(ABS(HIGH-REF(HIGH,1))/HIGH<0.001,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_PINGDI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '平底', Description: '平底', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET((ABS(LOW-REF(LOW,1))/LOW<0.001 AND \\\\n\\\\\\r\\nABS(REF(LOW,1)-REF(LOW,2))/REF(LOW,1)<=0.001),2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_DAYANZHU=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '大阳烛', Description: '大阳烛', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:CLOSE/OPEN>1.05 AND HIGH/LOW < CLOSE/OPEN+0.018;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_DAYINGZHU=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '大阴烛', Description: '大阴烛', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:OPEN/CLOSE > 1.05 AND HIGH/LOW < OPEN/CLOSE+0.018;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_HYFG=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '好友反攻', Description: '好友反攻', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( (REF(CLOSE,1)<REF(OPEN,1) AND \\\\n\\\\\\r\\nCLOSE>OPEN AND ABS(CLOSE-REF(CLOSE,1))/CLOSE<0.002),2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_TKQK=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '跳空缺口', Description: '跳空缺口', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( HIGH<REF(LOW,1) OR LOW>REF(HIGH,1),2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_SFWY=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '双飞乌鸦', Description: '双飞乌鸦', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( REF(CLOSE,1)<REF(OPEN,1) AND CLOSE<OPEN AND CLOSE/OPEN<0.98,1);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_SSSBQ=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '上升三部曲', Description: '上升三部曲', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( \\\\n\\\\\\r\\nREF(CLOSE,4)/REF(OPEN,4)>1.03 AND \\\\n\\\\\\r\\nREF(CLOSE,3)<REF(OPEN,3) AND \\\\n\\\\\\r\\nREF(CLOSE,2)<REF(OPEN,2) AND \\\\n\\\\\\r\\nREF(CLOSE,1)<REF(OPEN,1) AND \\\\n\\\\\\r\\nREF(LOW,4)<REF(LOW,3) AND \\\\n\\\\\\r\\nREF(LOW,4)<REF(LOW,2) AND \\\\n\\\\\\r\\nREF(LOW,4)<REF(LOW,1) AND \\\\n\\\\\\r\\nREF(HIGH,4)>REF(HIGH,3) AND \\\\n\\\\\\r\\nREF(HIGH,4)>REF(HIGH,2) AND \\\\n\\\\\\r\\nREF(HIGH,4)>REF(HIGH,1) AND \\\\n\\\\\\r\\nCLOSE/OPEN>1.03 AND \\\\n\\\\\\r\\nCLOSE>REF(CLOSE,4), 5);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_XDSBQ=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '下跌三部曲', Description: '下跌三部曲', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( \\\\n\\\\\\r\\nREF(CLOSE,4)/REF(OPEN,4)<0.97 AND \\\\n\\\\\\r\\nREF(CLOSE,3)>REF(OPEN,3) AND \\\\n\\\\\\r\\nREF(CLOSE,2)>REF(OPEN,2) AND \\\\n\\\\\\r\\nREF(CLOSE,1)>REF(OPEN,1) AND \\\\n\\\\\\r\\nREF(LOW,4)<REF(LOW,3) AND \\\\n\\\\\\r\\nREF(LOW,4)<REF(LOW,2) AND \\\\n\\\\\\r\\nREF(LOW,4)<REF(LOW,1) AND \\\\n\\\\\\r\\nREF(HIGH,4)>REF(HIGH,3) AND \\\\n\\\\\\r\\nREF(HIGH,4)>REF(HIGH,2) AND \\\\n\\\\\\r\\nREF(HIGH,4)>REF(HIGH,1) AND \\\\n\\\\\\r\\nCLOSE/OPEN<0.97 AND \\\\n\\\\\\r\\nCLOSE<REF(CLOSE,4), 5);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_CHXY=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '长下影', Description: '长下影', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR2:(MIN(CLOSE,OPEN)-LOW)/(HIGH-LOW)>0.667;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_CHSY=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '长上影', Description: '长上影', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR2:(HIGH-MAX(CLOSE,OPEN))/(HIGH-LOW)>0.667,COLORBLUE;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.COLOR_FENLI=function()\\r\\n{\\r\\n    let data=\\r\\n        {\\r\\n            Name: '分离', Description: '分离', IsMainIndex: true, InstructionType:2,\\r\\n            Script: //脚本\\r\\n                'VAR1:BACKSET( OPEN==REF(OPEN,1) AND (CLOSE-OPEN)*(REF(CLOSE,1)-REF(OPEN,1))<0,2);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//交易系统\\r\\n\\r\\nJSIndexScript.prototype.TRADE_BIAS = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'BIAS', Description: '乖离率专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 12 }, { Name: 'LL', Value: 6 },{ Name: 'LH', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'BIAS:=(CLOSE-MA(CLOSE,N))/MA(CLOSE,N)*100;\\\\n\\\\\\r\\nENTERLONG:CROSS(-LL,BIAS);\\\\n\\\\\\r\\nEXITLONG:CROSS(BIAS,LH);'\\r\\n\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_CCI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CCI', Description: 'CCI专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 14 }],\\r\\n            Script: //脚本\\r\\n                'TYP:=(HIGH+LOW+CLOSE)/3;\\\\n\\\\\\r\\nCCI:=(TYP-MA(TYP,N))/(0.015*AVEDEV(TYP,N));\\\\n\\\\\\r\\nINDEX:=CCI;\\\\n\\\\\\r\\nENTERLONG:CROSS(INDEX,-100);\\\\n\\\\\\r\\nEXITLONG:CROSS(100,INDEX);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_DMI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DMI', Description: '趋向专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 14 }],\\r\\n            Script: //脚本\\r\\n                'MTR:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N);\\\\n\\\\\\r\\nHD :=HIGH-REF(HIGH,1);\\\\n\\\\\\r\\nLD :=REF(LOW,1)-LOW;\\\\n\\\\\\r\\nPDM:=SUM(IF(HD>0&&HD>LD,HD,0),N);\\\\n\\\\\\r\\nMDM:=SUM(IF(LD>0&&LD>HD,LD,0),N);\\\\n\\\\\\r\\nPDI:=PDM*100/MTR;\\\\n\\\\\\r\\nMDI:=MDM*100/MTR;\\\\n\\\\\\r\\nENTERLONG:CROSS(PDI,MDI);\\\\n\\\\\\r\\nEXITLONG:CROSS(MDI,PDI);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_KD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'KD', Description: 'KD指标专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 9 },{ Name: 'M1', Value: 3 },{ Name: 'M2', Value: 3 }],\\r\\n            Script: //脚本\\r\\n                'WRSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;\\\\n\\\\\\r\\nWK:=SMA(WRSV,M1,1);\\\\n\\\\\\r\\nD:=SMA(WK,M2,1);\\\\n\\\\\\r\\nENTERLONG:CROSS(WK,D)&&WK<20;\\\\n\\\\\\r\\nEXITLONG:CROSS(D,WK)&&WK>80;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_BOLL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'BOLL', Description: '布林带专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                'MID :=MA(CLOSE,N);\\\\n\\\\\\r\\nUPPER:=MID+2*STD(CLOSE,N);\\\\n\\\\\\r\\nLOWER:=MID-2*STD(CLOSE,N);\\\\n\\\\\\r\\nENTERLONG:CROSS(CLOSE,LOWER);\\\\n\\\\\\r\\nEXITLONG:CROSS(CLOSE,UPPER);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_KDJ = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'KDJ', Description: 'KDJ专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 9 },{ Name: 'M1', Value: 3 }],\\r\\n            Script: //脚本\\r\\n                'RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;\\\\n\\\\\\r\\nK:=SMA(RSV,M1,1);\\\\n\\\\\\r\\nD:=SMA(K,M1,1);\\\\n\\\\\\r\\nJ:=3*K-2*D;\\\\n\\\\\\r\\nENTERLONG:CROSS(J,0);\\\\n\\\\\\r\\nEXITLONG:CROSS(100,J);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_MA = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'MA', Description: '均线专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'SHORT', Value: 5 },{ Name: 'LONG', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                'ENTERLONG:CROSS(MA(CLOSE,SHORT),MA(CLOSE,LONG));\\\\n\\\\\\r\\nEXITLONG:CROSS(MA(CLOSE,LONG),MA(CLOSE,SHORT));'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_MACD = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'MACD', Description: 'MACD专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'LONG', Value: 26 }, { Name: 'SHORT', Value: 12 }, { Name: 'M', Value: 9 }],\\r\\n            Script: //脚本\\r\\n                'DIFF:=EMA(CLOSE,SHORT) - EMA(CLOSE,LONG);\\\\n\\\\\\r\\nDEA  := EMA(DIFF,M);\\\\n\\\\\\r\\nMACD := 2*(DIFF-DEA);\\\\n\\\\\\r\\nENTERLONG:CROSS(MACD,0);\\\\n\\\\\\r\\nEXITLONG:CROSS(0,MACD);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_MTM = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'MTM', Description: '动力指标专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'WMTM:=C-REF(C,N);\\\\n\\\\\\r\\nENTERLONG:CROSS(WMTM,0);\\\\n\\\\\\r\\nEXITLONG:CROSS(0,WMTM);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_PSY = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'PSY', Description: 'PSY心理线专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 12 },{ Name: 'LL', Value: 10 },{ Name: 'LH', Value: 85 }],\\r\\n            Script: //脚本\\r\\n                'MYPSY:=COUNT(CLOSE>REF(CLOSE,1),N)/N*100;\\\\n\\\\\\r\\nENTERLONG:CROSS(LL,MYPSY);\\\\n\\\\\\r\\nEXITLONG:CROSS(MYPSY,LH);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_ROC = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ROC', Description: '变动速率专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 12 },{ Name: 'M', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                'WROC:=MA(100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N),M);\\\\n\\\\\\r\\nENTERLONG:CROSS(WROC,0);\\\\n\\\\\\r\\nEXITLONG:CROSS(0,WROC);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_RSI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'RSI', Description: '相对强弱专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 6 },{ Name: 'LL', Value: 20 },{ Name: 'LH', Value: 80 }],\\r\\n            Script: //脚本\\r\\n                'LC:=REF(CLOSE,1);\\\\n\\\\\\r\\nWRSI:=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1)*100;\\\\n\\\\\\r\\nENTERLONG:CROSS(WRSI,LL);\\\\n\\\\\\r\\nEXITLONG:CROSS(LH,WRSI);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_VR = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'VR', Description: 'VR容量比率专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N', Value: 26 },{ Name: 'LL', Value: 70 },{ Name: 'LH', Value: 250 }],\\r\\n            Script: //脚本\\r\\n                'WVR := SUM((IF(CLOSE>OPEN,VOL,0)+IF(CLOSE=OPEN,VOL/2,0)),N)/SUM((IF(CLOSE<OPEN,VOL,0)+IF(CLOSE=OPEN,VOL/2,0)),N)*100;\\\\n\\\\\\r\\nENTERLONG:CROSS(LL,WVR);\\\\n\\\\\\r\\nEXITLONG:CROSS(WVR,LH);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.TRADE_DPSJ = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DPSJ', Description: '大盘随机专家系统', IsMainIndex: true, InstructionType:1,\\r\\n            Args: [{ Name: 'N1', Value: 18 },{ Name: 'N2', Value: 12 }],\\r\\n            Script: //脚本\\r\\n                'RSV:=(INDEXC-LLV(INDEXL,N1))/(HHV(INDEXH,N1)-LLV(INDEXL,N1))*100;\\\\n\\\\\\r\\nK:=SMA(RSV,N2,1);\\\\n\\\\\\r\\nHSL:VOL/100/(FINANCE(7));\\\\n\\\\\\r\\nENTERLONG: CROSS(K,20);\\\\n\\\\\\r\\nEXITLONG: (CROSS(HSL,5) OR CROSS(K,80));'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index1 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '资金吸筹', Description: '资金吸筹', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'VAR1:=REF((LOW+OPEN+CLOSE+HIGH)/4,1);  \\\\n\\\\\\r\\nVAR2:= SMA(ABS(LOW - VAR1), 13, 1) / SMA(MAX(LOW - VAR1, 0), 10, 1);\\\\n\\\\\\r\\nVAR3:= EMA(VAR2, 10);\\\\n\\\\\\r\\nVAR4:= LLV(LOW, 33);\\\\n\\\\\\r\\nVAR5:= EMA(IF(LOW <= VAR4, VAR3, 0), 3) * 0.2;\\\\n\\\\\\r\\n主力进场: IF(VAR5 > REF(VAR5, 1), VAR5,0), COLORRED, NODRAW;\\\\n\\\\\\r\\n洗盘: IF(VAR5 < REF(VAR5, 1),  VAR5,0), COLORYELLOW, NODRAW;\\\\n\\\\\\r\\nSTICKLINE(VAR5> REF(VAR5, 1),0, VAR5, 20, 0), COLORRED;\\\\n\\\\\\r\\nSTICKLINE(VAR5 < REF(VAR5, 1), 0, VAR5, 20, 0), COLORYELLOW;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index2 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '牛熊区间', Description: '牛熊区间', IsMainIndex: false,YSpecificMaxMin:{Max:100,Min:1,Count:4},YSplitScale:[1,50,100],\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '短高H:=(20*H+19*REF(H,1)+18*REF(H,2)+17*REF(H,3)+16*REF(H,4)+15*REF(H,5)+14*REF(H,6)\\\\n\\\\\\r\\n+ 13 * REF(H, 7) + 12 * REF(H, 8) + 11 * REF(H, 9) + 10 * REF(H, 10) + 9 * REF(H, 11) + 8 * REF(H, 12)\\\\n\\\\\\r\\n+ 7 * REF(H, 13) + 6 * REF(H, 14) + 5 * REF(H, 15) + 4 * REF(H, 16) + 3 * REF(H, 17) + 2 * REF(H, 18) +\\\\n\\\\\\r\\nREF(H, 20))/ 210, COLORBLUE, LINETHICK1;\\\\n\\\\\\r\\n短低L:= (20 * L + 19 * REF(L, 1) + 18 * REF(L, 2) + 17 * REF(L, 3) + 16 * REF(L, 4) + 15 * REF(L, 5) + 14 * REF(L, 6)\\\\n\\\\\\r\\n+ 13 * REF(L, 7) + 12 * REF(L, 8) + 11 * REF(L, 9) + 10 * REF(L, 10) + 9 * REF(L, 11) + 8 * REF(L, 12)\\\\n\\\\\\r\\n+ 7 * REF(L, 13) + 6 * REF(L, 14) + 5 * REF(L, 15) + 4 * REF(L, 16) + 3 * REF(L, 17) + 2 * REF(L, 18) +\\\\n\\\\\\r\\nREF(L, 20)) / 210, COLORBLUE, LINETHICK1;\\\\n\\\\\\r\\nD90H:= EMA(短高H, 90), COLORRED, LINETHICK1;\\\\n\\\\\\r\\nD90L:= EMA(短低L, 90), COLORRED, LINETHICK1;\\\\n\\\\\\r\\nD90差:= D90H - D90L;\\\\n\\\\\\r\\nD90顶:= D90H + D90差 * 2, COLORRED, LINETHICK1;\\\\n\\\\\\r\\nD90底:= D90L - D90差 * 2, COLORRED, LINETHICK1;\\\\n\\\\\\r\\n高0:= (EMA(EMA(H, 25), 25) - EMA(EMA(L, 25), 25)) * 1 + EMA(EMA(H, 25), 25), LINETHICK1, COLORWHITE;\\\\n\\\\\\r\\n低0:= EMA(EMA(L, 25), 25) - (EMA(EMA(H, 25), 25) - EMA(EMA(L, 25), 25)) * 1, LINETHICK1, COLORWHITE;\\\\n\\\\\\r\\n多头定位:= 低0 >= D90底 AND 高0 >= D90顶;\\\\n\\\\\\r\\n空头定位:= 高0 <= D90顶 AND 低0 <= D90底;\\\\n\\\\\\r\\n震荡定位:= 低0 >= D90底 AND 高0 <= D90顶;\\\\n\\\\\\r\\n牛市: IF(多头定位 == 1, 100, 1), COLORRED, NODRAW;\\\\n\\\\\\r\\n熊市: IF(空头定位 == 1, 100, 1), COLORGREEN, NODRAW;\\\\n\\\\\\r\\n震荡: IF(震荡定位 == 1, 100, 1), COLORGRAY, NODRAW;\\\\n\\\\\\r\\nSTICKLINE(多头定位 == 1, 100, 1, 100, 0), COLORRED;\\\\n\\\\\\r\\nSTICKLINE(空头定位 == 1, 100, 1, 100, 0), COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(震荡定位 == 1, 100, 1, 100, 0), COLORGRAY;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index3 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '持仓信号', Description: '持仓信号', IsMainIndex: true,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '买线:=EMA(C,2);\\\\n\\\\\\r\\n卖线:=EMA(SLOPE(C,30)*5+C,20); \\\\n\\\\\\r\\nBU:=CROSS(买线,卖线);\\\\n\\\\\\r\\nSEL:=CROSS(卖线,买线);\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nSTICKLINE(买线>=卖线 AND CLOSE>OPEN,LOW,HIGH,0,1),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(买线>=卖线 AND CLOSE<OPEN,LOW,HIGH,0,1),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(买线>=卖线 AND CLOSE>OPEN,CLOSE,OPEN,50,1),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(买线>=卖线 AND CLOSE<OPEN,CLOSE,OPEN,50,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(买线<卖线 AND CLOSE<OPEN,LOW,HIGH,0,1),COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(买线<卖线 AND CLOSE>OPEN,LOW,HIGH,0,1),COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(买线<卖线 AND CLOSE<OPEN,CLOSE,OPEN,50,0),COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(买线<卖线 AND CLOSE>OPEN,CLOSE,OPEN,50,1),COLORGREEN;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nHHJSJDA:=(3*CLOSE+OPEN+LOW+HIGH)/6;\\\\n\\\\\\r\\nHHJSJDB:(19*HHJSJDA+19*REF(HHJSJDA,1)+18*REF(HHJSJDA,2)+17*REF(HHJSJDA,3)+16*REF(HHJSJDA,4)+15*REF(HHJSJDA,5)+14*REF(HHJSJDA,6)\\\\n\\\\\\r\\n+13*REF(HHJSJDA,7)+12*REF(HHJSJDA,8)+11*REF(HHJSJDA,9)+10*REF(HHJSJDA,10)+9*REF(HHJSJDA,11)+8*REF(HHJSJDA,12)+7*REF(HHJSJDA,13)+6*REF(HHJSJDA,14)+5*REF(HHJSJDA,15)+4*REF(HHJSJDA,16)+3*REF(HHJSJDA,17)+2*REF\\\\n\\\\\\r\\n(HHJSJDA,20)+REF(HHJSJDA,19))/210,COLORYELLOW;\\\\n\\\\\\r\\nHHJSJDC:MA(HHJSJDB,5),COLORRED;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nSVAR11:=HHV(HIGH,34);\\\\n\\\\\\r\\nSVAR14:=CLOSE-REF(CLOSE,1);\\\\n\\\\\\r\\nSVAR15:=MAX(SVAR14,0);\\\\n\\\\\\r\\nSVAR16:=ABS(SVAR14);\\\\n\\\\\\r\\nSVAR17:=SMA(SVAR15,7,1)/SMA(SVAR16,7,1)*100;\\\\n\\\\\\r\\nSVAR18:=SMA(SVAR15,13,1)/SMA(SVAR16,13,1)*100;\\\\n\\\\\\r\\nSVAR19:=BARSCOUNT(CLOSE);\\\\n\\\\\\r\\nSVAR20:=SMA(MAX(SVAR14,0),6,1)/SMA(ABS(SVAR14),6,1)*100;\\\\n\\\\\\r\\nSVAR21:=(-200)*(HHV(HIGH,60)-CLOSE)/(HHV(HIGH,60)-LLV(LOW,60))+100;\\\\n\\\\\\r\\nSVAR1A:=(CLOSE-LLV(LOW,15))/(HHV(HIGH,15)-LLV(LOW,15))*100;\\\\n\\\\\\r\\nSVAR1B:=SMA((SMA(SVAR1A,4,1)-50)*2,3,1);\\\\n\\\\\\r\\nSVAR1C:=(INDEXC-LLV(INDEXL,14))/(HHV(INDEXH,14)-LLV(INDEXL,14))*100;\\\\n\\\\\\r\\nSVAR1D:=SMA(SVAR1C,4,1);\\\\n\\\\\\r\\nSVAR1E:=SMA(SVAR1D,3,1);\\\\n\\\\\\r\\nSVAR1F:=(HHV(HIGH,30)-CLOSE)/CLOSE*100;\\\\n\\\\\\r\\nSVAR22:=SVAR20<=25 AND SVAR21<-95 AND SVAR1F>20 AND SVAR1B<-30 AND SVAR1E<30 AND SVAR11-CLOSE>=-0.25 AND SVAR17<22 AND SVAR18<28 AND SVAR19>50;\\\\n\\\\\\r\\nBUY3:=CROSS(SVAR22,0.5) AND COUNT(SVAR22==1,10)==1;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nSVARF:=LOW*0.9;\\\\n\\\\\\r\\nSVAR10X:=100-3*SMA((OPEN-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1)+2*SMA(SMA((OPEN-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1),15,1);\\\\n\\\\\\r\\nSVAR11X:=SVARF<REF(SVAR10X,1) AND VOL>REF(VOL,1) AND CLOSE>REF(CLOSE,1);\\\\n\\\\\\r\\nBUY2:=SVAR11X AND COUNT(SVAR11X,30)==1;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nVAR1:=(CLOSE+HIGH+LOW+OPEN)/4;\\\\n\\\\\\r\\nVAR2:=SUMBARS(VOL,CAPITAL);\\\\n\\\\\\r\\nVAR3:=HHV(VAR1,VAR2);\\\\n\\\\\\r\\nVAR4:=LLV(VAR1,VAR2);\\\\n\\\\\\r\\nVAR5:=(2*VAR1-VAR4-REF(VAR4,1))/(VAR3-VAR4);\\\\n\\\\\\r\\nVAR6:=(VAR1-VAR4)/(VAR3-VAR4);\\\\n\\\\\\r\\nVAR7:=IF(VAR1<=VAR4,VAR5*60,VAR6*60);\\\\n\\\\\\r\\nVAR8:=600*(EMA(CLOSE,3)-EMA(LOW,30))/EMA(LOW,30);\\\\n\\\\\\r\\nVAR9:=EMA(VAR8,7);\\\\n\\\\\\r\\nVARC:=HHV(HIGH,9)-LLV(LOW,9);\\\\n\\\\\\r\\nVARD:=HHV(HIGH,9)-CLOSE;\\\\n\\\\\\r\\nVARE:=CLOSE-LLV(LOW,9);\\\\n\\\\\\r\\nVARF:=VARD/VARC*100-70;\\\\n\\\\\\r\\nVAR10:=(CLOSE-LLV(LOW,60))/(HHV(HIGH,60)-LLV(LOW,60))*100;\\\\n\\\\\\r\\nVAR11:=(2*CLOSE+HIGH+LOW)/4;\\\\n\\\\\\r\\nVAR12:=SMA(VARE/VARC*100,3,1);\\\\n\\\\\\r\\nVAR13:=LLV(LOW,34);\\\\n\\\\\\r\\nVAR14:=SMA(VAR12,3,1)-SMA(VARF,9,1);\\\\n\\\\\\r\\nVAR15:=IF(VAR14>100,VAR14-100,0);\\\\n\\\\\\r\\nVAR16:=HHV(HIGH,34);\\\\n\\\\\\r\\nVAR17:=EMA((VAR11-VAR13)/(VAR16-VAR13)*100,8);\\\\n\\\\\\r\\nVAR18:=EMA(VAR17,5);\\\\n\\\\\\r\\nBUY:=STICKLINE(VAR17-VAR18>0,VAR17,VAR18,8,1),COLORRED;\\\\n\\\\\\r\\nSELL:=STICKLINE(VAR17-VAR18<0,VAR17,VAR18,8,1),COLORGREEN;\\\\n\\\\\\r\\nBUY1:=VAR17>VAR18 AND REF(VAR17,1)<REF(VAR18,1);\\\\n\\\\\\r\\nSELL1:=VAR17<VAR18 AND REF(VAR17,1)>REF(VAR18,1);\\\\n\\\\\\r\\n\\\\n\\\\\\r\\n短高H:=(20*H+19*REF(H,1)+18*REF(H,2)+17*REF(H,3)+16*REF(H,4)+15*REF(H,5)+14*REF(H,6)\\\\n\\\\\\r\\n+13*REF(H,7)+12*REF(H,8)+11*REF(H,9)+10*REF(H,10)+9*REF(H,11)+8*REF(H,12)\\\\n\\\\\\r\\n+7*REF(H,13)+6*REF(H,14)+5*REF(H,15)+4*REF(H,16)+3*REF(H,17)+2*REF(H,18)+\\\\n\\\\\\r\\nREF(H,20))/210,COLORBLUE,LINETHICK1;\\\\n\\\\\\r\\n短低L:=(20*L+19*REF(L,1)+18*REF(L,2)+17*REF(L,3)+16*REF(L,4)+15*REF(L,5)+14*REF(L,6)\\\\n\\\\\\r\\n+13*REF(L,7)+12*REF(L,8)+11*REF(L,9)+10*REF(L,10)+9*REF(L,11)+8*REF(L,12)\\\\n\\\\\\r\\n+7*REF(L,13)+6*REF(L,14)+5*REF(L,15)+4*REF(L,16)+3*REF(L,17)+2*REF(L,18)+\\\\n\\\\\\r\\nREF(L,20))/210,COLORBLUE,LINETHICK1;\\\\n\\\\\\r\\nD90H:=EMA(短高H,90),COLORRED,LINETHICK1;\\\\n\\\\\\r\\nD90L:=EMA(短低L,90),COLORRED,LINETHICK1;\\\\n\\\\\\r\\nD90差:=D90H-D90L;\\\\n\\\\\\r\\nD90顶:=D90H+D90差*2,COLORRED,LINETHICK1;\\\\n\\\\\\r\\nD90底:=D90L-D90差*2,COLORRED,LINETHICK1;\\\\n\\\\\\r\\n高0:=(EMA(EMA(H,25),25)-EMA(EMA(L,25),25))*1+EMA(EMA(H,25),25),LINETHICK1,COLORWHITE;\\\\n\\\\\\r\\n低0:=EMA(EMA(L,25),25)-(EMA(EMA(H,25),25)-EMA(EMA(L,25),25))*1,LINETHICK1,COLORWHITE;\\\\n\\\\\\r\\n多头定位:=低0>=D90底 AND 高0>=D90顶;\\\\n\\\\\\r\\n空头定位:=高0<=D90顶 AND 低0<=D90底;\\\\n\\\\\\r\\n震荡定位:=低0>=D90底 AND 高0<=D90顶;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\n牛市:=多头定位==1;\\\\n\\\\\\r\\n熊市:=空头定位==1;\\\\n\\\\\\r\\n震荡:=震荡定位==1;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\n非牛市:=熊市 OR 震荡;\\\\n\\\\\\r\\n非熊市:=牛市 OR 震荡;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nBUY11:=BUY1 AND 非熊市;\\\\n\\\\\\r\\nSELL11:=SELL1 AND 震荡定位==0;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nBUY111:=BUY11 AND COUNT(BUY11,10)<2;\\\\n\\\\\\r\\nBUY0:=BUY111 AND COUNT(BUY111,21)==1;\\\\n\\\\\\r\\nSELL111:=SELL11 AND COUNT(SELL11,10)<2;\\\\n\\\\\\r\\nSELL0:=SELL111 AND COUNT(SELL111,10)==1;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nXK1:=EMA(100*(CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3)/4;\\\\n\\\\\\r\\n上穿:=REF(XK1,1)<5 AND XK1>=5;\\\\n\\\\\\r\\nBUY4:=上穿 AND COUNT(XK1<2,12)<1;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nSELL2:=REF(XK1,1)<=22.5 AND XK1>22.5 AND COUNT(REF(XK1,1)>=22.5 AND XK1<22.5,5)>0;\\\\n\\\\\\r\\nSELL3:=REF(XK1,1)>=21.5 AND XK1<21.5 AND COUNT(REF(XK1,1)>=22.5 AND XK1<22.5,12)>1;\\\\n\\\\\\r\\nSELL4:=SELL2 OR SELL3 AND COUNT((SELL2 OR SELL3)==1,5)==1;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nSUPERDRAWTEXT(BUY0,L,\\\"机会\\\",2,10),COLORRED;\\\\n\\\\\\r\\nSUPERDRAWTEXT(SELL0,H,\\\"风险\\\",1,10),COLORGREEN;\\\\n\\\\\\r\\nSUPERDRAWTEXT(BUY2,L,\\\"机会\\\",2,10),COLORRED;\\\\n\\\\\\r\\nSUPERDRAWTEXT(BUY4,L,\\\"机会\\\",2,10),COLORRED;\\\\n\\\\\\r\\nSUPERDRAWTEXT(SELL4,H,\\\"风险\\\",1,10),COLORGREEN;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index4 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '股东实际增减持', Description: '股东实际增减持', IsMainIndex: false, FloatPrecision:0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '增持:NEWS(4),NODRAW,COLORRED;\\\\n\\\\\\r\\n减持:NEWS(5),NODRAW,COLORGREEN;\\\\n\\\\\\r\\nSTICKLINE(增持>0,0,增持,1,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(减持<0,0,减持,1,0),COLORGREEN;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index5 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '大宗交易', Description: '大宗交易', IsMainIndex: false, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '交易次数:NEWS(7);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index6 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '信托持股', Description: '信托持股', IsMainIndex: false, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '家数:NEWS(6);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index7 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '官网新闻', Description: '官网新闻', IsMainIndex: false, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '个数:NEWS(8);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index8 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '高管要闻', Description: '高管要闻', IsMainIndex: false, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '个数:NEWS(9);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index9 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '股权质押', Description: '股权质押', IsMainIndex: false, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                '次数:NEWS(10);'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index10 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '操盘BS点', Description: '操盘BS点', IsMainIndex: true, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"JJ:=(CLOSE+HIGH+LOW)/3; \\\\n\\\\\\r\\nA:=EMA(JJ,10); \\\\n\\\\\\r\\nB:=REF(A,1);\\\\n\\\\\\r\\nM1:=EMA(CLOSE,3);\\\\n\\\\\\r\\nM2:=EMA(CLOSE,8); \\\\n\\\\\\r\\nM3:=EMA(M2,13); \\\\n\\\\\\r\\nM4:=EMA(M2,55); \\\\n\\\\\\r\\nB1:=A>B AND REF(A,1)<REF(B,1);\\\\n\\\\\\r\\nS1:=A<B AND REF(A,1)>REF(B,1);\\\\n\\\\\\r\\nINDEXCLOSE:INDEXC,EXDATA;\\\\n\\\\\\r\\nINDEXOPEN:INDEXO,EXDATA;\\\\n\\\\\\r\\nDRAWICON(REF(B1,1),L*0.97,13);\\\\n\\\\\\r\\nDRAWICON(REF(S1,1),H*1.03,14);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Zealink_Index11 = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '操盘BS点', Description: '操盘BS点', IsMainIndex: true, FloatPrecision: 0,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"JJ:=(CLOSE+HIGH+LOW)/3;\\\\n\\\\\\r\\nA:=EMA(JJ,10);\\\\n\\\\\\r\\nB:=REF(A,1);\\\\n\\\\\\r\\nM1:=EMA(CLOSE,3);\\\\n\\\\\\r\\nM2:=EMA(CLOSE,8); \\\\n\\\\\\r\\nM3:=EMA(M2,13);\\\\n\\\\\\r\\nM4:=EMA(M2,55);\\\\n\\\\\\r\\n持股区域:=STICKLINE(A>B,A,B,2,0),COLORYELLOW; \\\\n\\\\\\r\\n持币区域:=STICKLINE(A<B,A,B,2,0),COLORBLUE;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nVR1:=(C+O+REF(C,1))/3;\\\\n\\\\\\r\\nVR3:=HHV(VR1,21);\\\\n\\\\\\r\\nVR4:=LLV(VR1,21);\\\\n\\\\\\r\\nVR5:=(2*VR1-VR4-REF(VR4,1))/(VR3-VR4);\\\\n\\\\\\r\\nVR6:=(VR1-VR4)/(VR3-VR4);\\\\n\\\\\\r\\nVR7:=IF(VR1<=VR4,VR5*60,VR6*60);\\\\n\\\\\\r\\nVR8:=600*(EMA(C,3)-EMA(L,30))/EMA(L,30);\\\\n\\\\\\r\\nVR9:=EMA(VR8,7);\\\\n\\\\\\r\\nVRA:=(WINNER(120*C/100)-WINNER(100*C/100))*100;\\\\n\\\\\\r\\nVRB:=(-100)*(WINNER(120*C/100)-WINNER(100*C/100))+5;\\\\n\\\\\\r\\nVRC:=HHV(H,9)-LLV(L,9);\\\\n\\\\\\r\\nVRD:=HHV(H,9)-C;\\\\n\\\\\\r\\nVRE:=C-LLV(L,9);\\\\n\\\\\\r\\nVRF:=VRD/VRC*100-70;\\\\n\\\\\\r\\nVR10:=(C-LLV(L,60))/(HHV(H,60)-LLV(L,60))*100;\\\\n\\\\\\r\\nVR11:=(2*C+H+L)/4;\\\\n\\\\\\r\\nVR12:=SMA(VRE/VRC*100,3,1);\\\\n\\\\\\r\\nVR13:=LLV(L,34);\\\\n\\\\\\r\\nVR14:=SMA(VR12,3,1)-SMA(VRF,9,1);\\\\n\\\\\\r\\nVR15:=IF(VR14>100,VR14-100,0);\\\\n\\\\\\r\\nVR16:=HHV(H,34);\\\\n\\\\\\r\\nVR17:=EMA((VR11-VR13)/(VR16-VR13)*100,8);\\\\n\\\\\\r\\nVR18:=EMA(VR17,5);\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nB1:=A>B AND REF(A,1)<REF(B,1);\\\\n\\\\\\r\\nS1:=A<B AND REF(A,1)>REF(B,1);\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nB9:=BARSLAST(REF(B1,1) AND (REF(VR17>VR18,1) OR MIN(VR17,VR18)>REF(MAX(VR17,VR18),1)));\\\\n\\\\\\r\\nS9:=BARSLAST(REF(S1,1) AND (REF(VR17<VR18,1) OR MAX(VR17,VR18)<REF(MIN(VR17,VR18),1)));\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nDRAWICON(REF(B1,1) AND (REF(VR17>VR18,1) OR MIN(VR17,VR18)>REF(MAX(VR17,VR18),1)) AND REF(B9,2)>=S9,L*0.97,13);\\\\n\\\\\\r\\nDRAWICON(REF(S1,1) AND (REF(VR17<VR18,1) OR MAX(VR17,VR18)<REF(MIN(VR17,VR18),1)) AND REF(S9,1)>=B9,H*1.03,14);\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nDRAWKLINE_IF(VR17>VR18,HIGH,CLOSE,LOW,OPEN),COLORRED;\\\\n\\\\\\r\\nDRAWKLINE_IF(VR17<VR18,HIGH,CLOSE,LOW,OPEN),COLORBLUE;\\\\n\\\\\\r\\n\\\\n\\\\\\r\\nINDEXCLOSE:INDEXC,EXDATA;\\t\\t//取指数的收盘价 回测的时候计算BATE系数用 \\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.HeikinAshi=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '平均K线', Description: 'Heikin-Ashi 平均K线', IsMainIndex: true, KLineType:-1,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"HCLOSE:(OPEN+HIGH+LOW+CLOSE)/4, NODRAW;\\\\n\\\\\\r\\nHOPEN:(REF(OPEN,1)+REF(CLOSE,1))/2,NODRAW;\\\\n\\\\\\r\\nHHIGH:MAX(HIGH,MAX(HOPEN,HCLOSE)),NODRAW;\\\\n\\\\\\r\\nHLOW:MIN(LOW,MIN(HOPEN,HCLOSE)),NODRAW;\\\\n\\\\\\r\\nDRAWKLINE(HHIGH,HOPEN,HLOW,HCLOSE);\\\"\\r\\n        }\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.ADL=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '腾落指标', Description: '腾落指标', IsMainIndex: false, StringFormat:2,\\r\\n            Condition:\\r\\n                {\\r\\n                    Period:[CONDITION_PERIOD.KLINE_DAY_ID, CONDITION_PERIOD.KLINE_WEEK_ID, CONDITION_PERIOD.KLINE_TWOWEEK_ID,\\r\\n                        CONDITION_PERIOD.KLINE_MONTH_ID, CONDITION_PERIOD.KLINE_QUARTER_ID ,CONDITION_PERIOD.KLINE_YEAR_ID ],\\r\\n                    Include:[\\\"000001.SH\\\", \\\"000003.SH\\\", \\\"000016.SH\\\", \\\"000300.SH\\\", \\\"000905.SH\\\", \\\"399001.SZ\\\", \\\" 399005.SZ\\\", \\\"399006.SZ\\\"]\\r\\n                },\\r\\n            Args: [ { Name: 'M', Value: 7 } ],\\r\\n            Script: //脚本\\r\\n                \\\"ADL:SUM(ADVANCE-DECLINE,0);\\\\n\\\\\\r\\nMAADL:MA(ADL,M);\\\"\\r\\n        }\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.EMPTY = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '', Description: '空指标', IsMainIndex: true,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                'VAR2:=C;'\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CJL = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CJL', Description: '期货持仓量', IsMainIndex: false,\\r\\n            Args: [],\\r\\n            Script: //脚本\\r\\n                \\\"成交量:VOL,VOLSTICK;\\\\n\\\\\\r\\n持仓量:VOLINSTK,LINEOVERLAY;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ASI = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ASI', Description: '振动升降指标', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N1', Value: 6 }],\\r\\n            Script: //脚本\\r\\n                \\\"X_1:=REF(CLOSE,1);\\\\n\\\\\\r\\nX_2:=ABS(HIGH-X_1);\\\\n\\\\\\r\\nX_3:=ABS(LOW-X_1);\\\\n\\\\\\r\\nX_4:=ABS(HIGH-REF(LOW,1));\\\\n\\\\\\r\\nX_5:=ABS(X_1-REF(OPEN,1));\\\\n\\\\\\r\\nX_6:=IF(X_2>X_3 AND X_2>X_4,X_2+X_3/2+X_5/4,IF(X_3>X_4 AND X_3>X_2,X_3+X_2/2+X_5/4,X_4+X_5/4));\\\\n\\\\\\r\\nX_7:=CLOSE-X_1+(CLOSE-OPEN)/2+X_1-REF(OPEN,1);\\\\n\\\\\\r\\nX_8:=8*X_7/X_6*MAX(X_2,X_3);\\\\n\\\\\\r\\nASI:SUM(X_8,0),LINETHICK2;\\\\n\\\\\\r\\nMASI:MA(ASI,N1),LINETHICK2;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n/*\\r\\nHistory\\r\\nThe Donchian Channels (DC) indicator was created by the famous commodities trader Richard Donchian. Donchian would become known as The Father of Trend Following.\\r\\n\\r\\nCalculation\\r\\nFor this example, a 20 day period is used which is a very commonly used timeframe.\\r\\n\\r\\nUpper Channel = 20 Day High\\r\\nLower Channel = 20 Day Low\\r\\nMiddle Channel = (20 Day High + 20 Day Low)/2\\r\\n*/\\r\\nJSIndexScript.prototype.DC = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DC', Description: '唐奇安通道', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N1', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                \\\"UPPER:HHV(H,N1),COLORBLUE,LINETHICK2;\\\\n\\\\\\r\\nLOWER:LLV(L,N1),COLORBLUE,LINETHICK2;\\\\n\\\\\\r\\nMIDDLE:(UPPER+LOWER)/2,COLORRED,LINETHICK3;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n/*\\r\\n双重指数移动均线(DEMA)由Patrick Mulloy开发并于1994年2月在\\\"股票与商品期货的技术分析\\\"杂志中出版。\\r\\n用于平滑价格系列并被直接应用到金融证券的价格图表中。此外，它还用于平滑其他指标的价值。\\r\\n\\r\\nDEMA的优势是在锯齿状的价格移动中清除错误信号并允许趋势强劲时保持仓位。\\r\\n\\r\\n计算\\r\\n该指标基于指数移动平均线 (EMA). 从EMA值中查看价格偏差错误：\\r\\nerr(i) = Price(i) - EMA(Price, N, i)\\r\\n\\r\\n此处:\\r\\nerr(i) ― 当前EMA误差;\\r\\nPrice(i) ― 当前价格;\\r\\nEMA(Price, N, i) ― 价格系列的以N为周期的EMA的当前值。\\r\\n\\r\\n添加指数平均线错误值到价格指数移动平均数值，可以获得EDMA；\\r\\nDEMA(i) = EMA(Price,N,i)+ EMA(err,N,i) = EMA(Price,N,i)+EMA(Price-EMA(Price,N,i),N,i) =\\r\\n= 2*EMA(Price,N,i)-EMA(Price-EMA(Price,N,i),N,i)=2*EMA(Price,N,i)-EMA2(Price,N,i)\\r\\n\\r\\n此处:\\r\\nEMA(err, N, i) ― 误差err的指数均线的当前值;\\r\\nEMA2(Price, N, i) ― 价格的二重连续平滑的当前值。\\r\\n*/\\r\\nJSIndexScript.prototype.DEMA = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'DEMA', Description: '双重指数移动均线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N1', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                \\\"ERR:=C-EMA(C,N1);\\\\n\\\\\\r\\nDEMA:EMA(C,10)+EMA(ERR,N1);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n/*\\r\\nCalculation\\r\\nThere are five steps in calculating VWAP:\\r\\n\\r\\nCalculate the Typical Price for the period.\\r\\n    [(High + Low + Close)/3)]\\r\\nMultiply the Typical Price by the period Volume.\\r\\n    (Typical Price x Volume)\\r\\nCreate a Cumulative Total of Typical Price.\\r\\n    Cumulative(Typical Price x Volume)\\r\\nCreate a Cumulative Total of Volume.\\r\\n    Cumulative(Volume)\\r\\nDivide the Cumulative Totals.\\r\\n    VWAP = Cumulative(Typical Price x Volume) / Cumulative(Volume)\\r\\n*/\\r\\n\\r\\nJSIndexScript.prototype.VWAP = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'VWAP', Description: '成交量加权平均价', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N1', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                \\\"PRICE:=(H+L+C)/3;\\\\n\\\\\\r\\nT2:=VOL*PRICE;\\\\n\\\\\\r\\nVWAP:SUM(T2,0)/SUM(VOL,0);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.SQJZ = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'SQJZ', Description: '神奇九转', IsMainIndex: true,\\r\\n            Script: //脚本\\r\\n                \\\"B:=C<REF(C,4);\\\\n\\\\\\r\\nN:=CURRBARSCOUNT;\\\\n\\\\\\r\\nB1:=(N=6 AND REFXV(COUNT(B,6),5)=6) OR (N=7 AND REFXV(COUNT(B,7),6)=7) OR (N=8 AND REFXV(COUNT(B,8),7)=8) OR (N>=9 AND REFXV(COUNT(B,9),8)=9);\\\\n\\\\\\r\\nDRAWNUMBER(B1 AND REF(B,1)=0,L,1),COLORMAGENTA;\\\\n\\\\\\r\\nB2:=(N=5 AND REFXV(COUNT(B,6),4)=6) OR (N=6 AND REFXV(COUNT(B,7),5)=7) OR (N=7 AND REFXV(COUNT(B,8),6)=8) OR (N>=8 AND REFXV(COUNT(B,9),7)=9);\\\\n\\\\\\r\\nDRAWNUMBER(B2 AND REF(B,2)=0,L,2),COLORMAGENTA;\\\\n\\\\\\r\\nB8:=(N=1 AND COUNT(B,8)=8) OR (N>=2 AND REFXV(COUNT(B,9),1)=9);\\\\n\\\\\\r\\nDRAWNUMBER(B8 AND REF(B,8)=0,L,8),COLORMAGENTA;\\\\n\\\\\\r\\nB9:=(N>=1 AND COUNT(B,9)=9);\\\\n\\\\\\r\\nDRAWNUMBER(B9 AND REF(B,9)=0,L,9),COLORBROWN;\\\\n\\\\\\r\\nS:=C>REF(C,4);\\\\n\\\\\\r\\nS1:=(N=6 AND REFXV(COUNT(S,6),5)=6) OR (N=7 AND REFXV(COUNT(S,7),6)=7) OR (N=8 AND REFXV(COUNT(S,8),7)=8) OR (N>=9 AND REFXV(COUNT(S,9),8)=9);\\\\n\\\\\\r\\nDRAWNUMBER(S1 AND REF(S,1)=0,H,1),COLORMAGENTA,DRAWABOVE;\\\\n\\\\\\r\\nS2:=(N=5 AND REFXV(COUNT(S,6),4)=6) OR (N=6 AND REFXV(COUNT(S,7),5)=7) OR (N=7 AND REFXV(COUNT(S,8),6)=8) OR (N>=8 AND REFXV(COUNT(S,9),7)=9);\\\\n\\\\\\r\\nDRAWNUMBER(S2 AND REF(S,2)=0,H,2),COLORMAGENTA,DRAWABOVE;\\\\n\\\\\\r\\nS8:=(N=1 AND COUNT(S,8)=8) OR (N>=2 AND REFXV(COUNT(S,9),1)=9);\\\\n\\\\\\r\\nDRAWNUMBER(S8 AND REF(S,8)=0,H,8),COLORMAGENTA,DRAWABOVE;\\\\n\\\\\\r\\nS9:=(N>=1 AND COUNT(S,9)=9);\\\\n\\\\\\r\\nDRAWNUMBER(S9 AND REF(S,9)=0,H,9),COLORGREEN,DRAWABOVE;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.XT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'XT', Description: '箱体', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                \\\"【箱顶】:PEAK(CLOSE,N,1)*0.98;\\\\n\\\\\\r\\n【箱底】:TROUGH(CLOSE,N,1)*1.02;\\\\n\\\\\\r\\n【箱高】:100*(【箱顶】-【箱底】)/【箱底】,NODRAW;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CFJT = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CFJT', Description: '财富阶梯', IsMainIndex: true,\\r\\n            Script: //脚本\\r\\n                \\\"突破:=REF(EMA(C,14),1);\\\\n\\\\\\r\\nA1X:=(EMA(C,10)-突破)/突破*100;\\\\n\\\\\\r\\n多方:=IF(A1X>=0,REF(EMA(C,10),BARSLAST(CROSS(A1X,0))+1),DRAWNULL);\\\\n\\\\\\r\\n空方:=IF(A1X<0,REF(EMA(C,10),BARSLAST(CROSS(0,A1X))+1),DRAWNULL);\\\\n\\\\\\r\\nSTICKLINE(A1X>=0,多方,突破,110,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(A1X<0,空方,突破,110,0),COLORGREEN;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.CYX = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'CYX', Description: '撑压线', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 7 }],\\r\\n            Script: //脚本\\r\\n                \\\"Z1:=STRCAT(HYBLOCK,' ');\\\\n\\\\\\r\\nZ2:=STRCAT(Z1,DYBLOCK);\\\\n\\\\\\r\\nZ3:=STRCAT(Z2,' ');\\\\n\\\\\\r\\nDRAWTEXT_FIX(ISLASTBAR,0,0,0,STRCAT(Z3,GNBLOCK)),COLOR00C0C0;\\\\n\\\\\\r\\nA1:=REF(H,N)=HHV(H,2*N+1);\\\\n\\\\\\r\\nB1:=FILTER(A1,N);\\\\n\\\\\\r\\nC1:=BACKSET(B1,N+1);\\\\n\\\\\\r\\nD1:=FILTER(C1,N);\\\\n\\\\\\r\\nA2:=REF(L,N)=LLV(L,2*N+1);\\\\n\\\\\\r\\nB2:=FILTER(A2,N);\\\\n\\\\\\r\\nC2:=BACKSET(B2,N+1);\\\\n\\\\\\r\\nD2:=FILTER(C2,N);\\\\n\\\\\\r\\nE1:=(REF(LLV(L,2*N),1)+REF(HHV(H,2*N),1))/2;\\\\n\\\\\\r\\nE2:=(H+L)/2;\\\\n\\\\\\r\\nH1:=(D1 AND NOT(D2 AND E1>=E2)) OR ISLASTBAR OR BARSCOUNT(C)=1;\\\\n\\\\\\r\\nL1:=(D2 AND NOT(D1 AND E1<E2));\\\\n\\\\\\r\\nH2:=D1 AND NOT(D2 AND E1>=E2);\\\\n\\\\\\r\\nX1:=REF(BARSLAST(H1),1)+1;\\\\n\\\\\\r\\nF1:=BACKSET(H1 AND COUNT(L1,X1)>0,LLVBARS(IF(L1,L,10000),X1));\\\\n\\\\\\r\\nG1:=F1>REF(F1,1);\\\\n\\\\\\r\\nI1:=BACKSET(G1,2);\\\\n\\\\\\r\\nLD:=I1>REF(I1,1);\\\\n\\\\\\r\\nL2:=LD OR ISLASTBAR OR BARSCOUNT(C)=1;\\\\n\\\\\\r\\nX2:=REF(BARSLAST(L2),1)+1;\\\\n\\\\\\r\\nF2:=BACKSET(L2 AND COUNT(H2,X2)>0,HHVBARS(IF(H2,H,0),X2));\\\\n\\\\\\r\\nG2:=F2>REF(F2,1);\\\\n\\\\\\r\\nI2:=BACKSET(G2,2);\\\\n\\\\\\r\\nHD:=I2>REF(I2,1);\\\\n\\\\\\r\\nR1:=BACKSET(ISLASTBAR,BARSLAST(HD)+1);\\\\n\\\\\\r\\nS1:=R1>REF(R1,1);\\\\n\\\\\\r\\nT1:=BACKSET(ISLASTBAR,BARSLAST(LD)+1);\\\\n\\\\\\r\\nU1:=T1>REF(T1,1);\\\\n\\\\\\r\\nR2:=BACKSET(S1,REF(BARSLAST(HD),1)+2);\\\\n\\\\\\r\\nS2:=R2>REF(R2,1);\\\\n\\\\\\r\\nT2:=BACKSET(U1,REF(BARSLAST(LD),1)+2);\\\\n\\\\\\r\\nU2:=T2>REF(T2,1);\\\\n\\\\\\r\\nDRAWLINE(S2,H,S1,H,1),LINETHICK2,COLORRED;\\\\n\\\\\\r\\nDRAWLINE(U2,L,U1,L,1),LINETHICK2,COLORGREEN;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.WAVE = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'WAVE', Description: '波浪分析', IsMainIndex: true,\\r\\n            Args: [{ Name: 'N', Value: 5 }],\\r\\n            Script: //脚本\\r\\n                \\\"ZIG(3,N);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ShareholderCount=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '散户线', Description: '散户线', IsMainIndex: false,\\r\\n            Script: //脚本\\r\\n                \\\"GPJYVALUE(1,1,1);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.NXTS=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'NXTS', Description: '牛熊天数', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 20 }],\\r\\n            Script: //脚本\\r\\n                \\\"Z:=ZIG(C,N);\\\\n\\\\\\r\\n高点:=Z>REF(Z,1) AND Z>REFX(Z,1);\\\\n\\\\\\r\\n低点:=Z<REF(Z,1) AND Z<REFX(Z,1);\\\\n\\\\\\r\\nNG:=BARSLAST(高点);\\\\n\\\\\\r\\nND:=BARSLAST(低点);\\\\n\\\\\\r\\nD0:=DATETODAY(DATE)-DATETODAY(REF(DATE,BARSSINCE(C)));\\\\n\\\\\\r\\nDG:=DATETODAY(DATE)-DATETODAY(REF(DATE,NG));\\\\n\\\\\\r\\nDD:=DATETODAY(DATE)-DATETODAY(REF(DATE,ND));\\\\n\\\\\\r\\nN1:=(NG>ND OR COUNT(高点,0)=0) AND ND>0 AND (HHV(C,ND)-REF(C,ND))/REF(C,ND)>(N/100);\\\\n\\\\\\r\\nN2:=NG<ND AND NG>0 AND (LLV(C,NG)-REF(C,NG))/REF(C,NG)>=-(N/100);\\\\n\\\\\\r\\nN3:=NG<ND AND NG=0;\\\\n\\\\\\r\\nN4:=COUNT(低点 OR 高点,0)=0 AND (HHV(C,0)-REF(C,BARSSINCE(C)))/REF(C,BARSSINCE(C))>(N/100);\\\\n\\\\\\r\\nN5:=COUNT(低点,0)=0 AND NG>0 AND (LLV(C,NG)-REF(C,NG))/REF(C,NG)>=-(N/100);\\\\n\\\\\\r\\nN6:=COUNT(低点,0)=0 AND NG=0;\\\\n\\\\\\r\\nX1:=(NG<ND OR COUNT(低点,0)=0) AND NG>0 AND (LLV(C,NG)-REF(C,NG))/REF(C,NG)<-(N/100);\\\\n\\\\\\r\\nX2:=NG>ND AND ND>0 AND (HHV(C,ND)-REF(C,ND))/REF(C,ND)<=(N/100);\\\\n\\\\\\r\\nX3:=NG>ND AND ND=0;\\\\n\\\\\\r\\nX4:=COUNT(高点 OR 低点,0)=0 AND (LLV(C,0)-REF(C,BARSSINCE(C)))/REF(C,BARSSINCE(C))<-(N/100);\\\\n\\\\\\r\\nX5:=COUNT(高点,0)=0 AND ND>0 AND (HHV(C,ND)-REF(C,ND))/REF(C,ND)<=(N/100);\\\\n\\\\\\r\\nX6:=COUNT(高点,0)=0 AND ND=0;\\\\n\\\\\\r\\n牛市天数:IF(N4 OR N5 OR N6,D0,IF(N1 OR N2 OR N3,DD,0)),COLORRED;\\\\n\\\\\\r\\n熊市天数:IF(X4 OR X5 OR X6,D0,IF(X1 OR X2 OR X3,DG,0)),COLORGREEN;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.FKX=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'FKX', Description: '反K线', IsMainIndex: false,\\r\\n            Script: //脚本\\r\\n                \\\"DRAWKLINE(-LOW, -OPEN, -HIGH, -CLOSE);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.Margin4=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '两融资金', Description: '两融资金', IsMainIndex: false,\\r\\n            Script: //脚本\\r\\n                \\\"TMPV:=IF(FINANCE(3)==0,REF(SCJYVALUE(1,1,1),1),REF(GPJYVALUE(3,1,1),1));\\\\n\\\\\\r\\nTMPV1:=IF(FINANCE(3)==0,SCJYVALUE(1,1,0),GPJYVALUE(3,1,0));\\\\n\\\\\\r\\n两融:IF(TMPV==0 OR TMPV1==0,DRAWNULL,IF(FINANCE(3)==0,(SCJYVALUE(1,1,1)-REF(SCJYVALUE(1,1,1),1))/10000-(SCJYVALUE(1,2,1)-REF(SCJYVALUE(1,2,1),1))/10000,((GPJYVALUE(3,1,1)-REF(GPJYVALUE(3,1,1),1))-((GPJYVALUE(3,2,1)*C/10000-(REF(GPJYVALUE(3,2,1),1)*REF(C,1)/10000)))))),NODRAW;\\\\n\\\\\\r\\nSTICKLINE(两融>0,0,两融,2,0),COLORRED;\\\\n\\\\\\r\\nSTICKLINE(两融<0,0,两融,2,0),COLORCYAN;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.ZSDB=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'ZSDB', Description: '指数对比(副图,需下载日线)', IsMainIndex: false,\\r\\n            Script: //脚本\\r\\n                \\\"A:=REF(INDEXC,1);\\\\n\\\\\\r\\n指数涨幅:IF(A>0,(INDEXC-A)*100/A,0),NODRAW;\\\\n\\\\\\r\\nDRAWKLINE(INDEXH,INDEXO,INDEXL,INDEXC);\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\nJSIndexScript.prototype.NineTurns=function()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: '神奇九转', Description: '九转指标', IsMainIndex: true,\\r\\n            Script: //脚本\\r\\n                \\\"A1:=C>REF(C,4);\\\\n\\\\\\r\\nA2:=C<REF(C,4);\\\\n\\\\\\r\\nT1:=A2 AND REF(A1,1);\\\\n\\\\\\r\\nT2:=A2 AND REF(T1,1);\\\\n\\\\\\r\\nT3:=A2 AND REF(T2,1);\\\\n\\\\\\r\\nT4:=A2 AND REF(T3,1);\\\\n\\\\\\r\\nT5:=A2 AND REF(T4,1);\\\\n\\\\\\r\\nT6:=A2 AND REF(T5,1);\\\\n\\\\\\r\\nT7:=A2 AND REF(T6,1);\\\\n\\\\\\r\\nT8:=A2 AND REF(T7,1);\\\\n\\\\\\r\\nT9:=A2 AND REF(T8,1);\\\\n\\\\\\r\\nT10:=A2 AND REF(T9,1);\\\\n\\\\\\r\\nT11:=A2 AND REF(T10,1);\\\\n\\\\\\r\\nT12:=A2 AND REF(T11,1);\\\\n\\\\\\r\\nT13:=A2 AND REF(T12,1);\\\\n\\\\\\r\\nT14:=A2 AND REF(T13,1);\\\\n\\\\\\r\\nDRAWTEXT(T1,L*0.98,'1'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T2,L*0.98,'2'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T3,L*0.98,'3'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T4,L*0.98,'4'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T5,L*0.98,'5'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T6,L*0.98,'6'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T7,L*0.98,'7'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T8,L*0.98,'8'),COLORGREEN;\\\\n\\\\\\r\\nDRAWTEXT(T9,L*0.98,'9'),COLORBLUE;\\\\n\\\\\\r\\nB1:=C<REF(C,4);\\\\n\\\\\\r\\nB2:=C>REF(C,4);\\\\n\\\\\\r\\nD1:=B2 AND REF(B1,1);\\\\n\\\\\\r\\nD2:=B2 AND REF(D1,1);\\\\n\\\\\\r\\nD3:=B2 AND REF(D2,1);\\\\n\\\\\\r\\nD4:=B2 AND REF(D3,1);\\\\n\\\\\\r\\nD5:=B2 AND REF(D4,1);\\\\n\\\\\\r\\nD6:=B2 AND REF(D5,1);\\\\n\\\\\\r\\nD7:=B2 AND REF(D6,1);\\\\n\\\\\\r\\nD8:=B2 AND REF(D7,1);\\\\n\\\\\\r\\nD9:=B2 AND REF(D8,1);\\\\n\\\\\\r\\nD10:=B2 AND REF(D9,1);\\\\n\\\\\\r\\nD11:=B2 AND REF(D10,1);\\\\n\\\\\\r\\nD12:=B2 AND REF(D11,1);\\\\n\\\\\\r\\nD13:=B2 AND REF(D12,1);\\\\n\\\\\\r\\nD14:=B2 AND REF(D13,1);\\\\n\\\\\\r\\nDRAWTEXT(D1,H*1.010,'1'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D2,H*1.010,'2'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D3,H*1.010,'3'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D4,H*1.010,'4'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D5,H*1.010,'5'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D6,H*1.010,'6'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D7,H*1.010,'7'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D8,H*1.010,'8'),COLORBLUE;\\\\n\\\\\\r\\nDRAWTEXT(D9,H*1.010,'9'),COLORGREEN;\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\nJSIndexScript.prototype.TEST = function ()\\r\\n{\\r\\n    let data =\\r\\n        {\\r\\n            Name: 'TEST', Description: '测试脚本', IsMainIndex: false,\\r\\n            Args: [{ Name: 'N', Value: 10 }],\\r\\n            Script: //脚本\\r\\n                \\\"DRAWCHANNEL(OPEN>C,H,L, 'RGB(255,94,102)', 2 ,'5,5','RGBA(58,20,62,0.3)' );\\\"\\r\\n        };\\r\\n\\r\\n    return data;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n   Copyright (c) 2018 jones\\r\\n\\r\\n    http://www.apache.org/licenses/LICENSE-2.0\\r\\n\\r\\n   开源项目 https://github.com/jones2000/HQChart\\r\\n\\r\\n   jones_2000@163.com\\r\\n\\r\\n   封装行情类图形控件 (H5版本)\\r\\n*/\\r\\n\\r\\n\\r\\n//日志输出类\\r\\nif (!JSConsole)\\r\\n{\\r\\n    var JSConsole=\\r\\n        {\\r\\n            Chart:{ Log:console.log, Warn:console.warn },      //图形日志\\r\\n            Complier:{ Log:console.log, Warn:console.warn }    //编译器日志\\r\\n        };\\r\\n}\\r\\n\\r\\n\\r\\nfunction JSChart(divElement, bOffscreen)\\r\\n{\\r\\n    this.DivElement=divElement;\\r\\n    this.DivToolElement=null;           //工具条\\r\\n    this.JSChartContainer;              //画图控件\\r\\n\\r\\n    //h5 canvas\\r\\n    this.CanvasElement=document.createElement(\\\"canvas\\\");\\r\\n    this.CanvasElement.className='jschart-drawing';\\r\\n    this.CanvasElement.id=Guid();\\r\\n    this.CanvasElement.setAttribute(\\\"tabindex\\\",0);\\r\\n    if (this.CanvasElement.style) this.CanvasElement.style.outline='none';\\r\\n    if(divElement.hasChildNodes())\\r\\n    {\\r\\n        JSConsole.Chart.Log(\\\"[JSChart::JSChart] divElement hasChildNodes\\\", divElement.childNodes);\\r\\n    }\\r\\n    divElement.appendChild(this.CanvasElement);\\r\\n\\r\\n    //离屏\\r\\n    this.OffscreenCanvasElement;\\r\\n    if (bOffscreen==true) this.OffscreenCanvasElement=document.createElement(\\\"canvas\\\");\\r\\n\\r\\n    //改参数div\\r\\n    this.ModifyIndexDialog=new ModifyIndexDialog(divElement);\\r\\n    this.ChangeIndexDialog=new ChangeIndexDialog(divElement);\\r\\n    this.MinuteDialog=new MinuteDialog(divElement);\\r\\n\\r\\n    this.OnSize=function(option) //{ Type:1 新版本OnSize  Redraw:是否重绘 }\\r\\n    {\\r\\n        //画布大小通过div获取\\r\\n        var height=parseInt(this.DivElement.style.height.replace(\\\"px\\\",\\\"\\\"));\\r\\n        if (this.ToolElement)\\r\\n        {\\r\\n            //TODO调整工具条大小\\r\\n            height-=this.ToolElement.style.height.replace(\\\"px\\\",\\\"\\\");   //减去工具条的高度\\r\\n        }\\r\\n\\r\\n        this.CanvasElement.height=height;\\r\\n        this.CanvasElement.width=parseInt(this.DivElement.style.width.replace(\\\"px\\\",\\\"\\\"));\\r\\n        this.CanvasElement.style.width=this.CanvasElement.width+'px';\\r\\n        this.CanvasElement.style.height=this.CanvasElement.height+'px';\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        this.CanvasElement.height*=pixelTatio;\\r\\n        this.CanvasElement.width*=pixelTatio;\\r\\n\\r\\n        if (this.OffscreenCanvasElement)\\r\\n        {\\r\\n            this.OffscreenCanvasElement.height=this.CanvasElement.height;\\r\\n            this.OffscreenCanvasElement.width=this.CanvasElement.width;\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log(`[JSChart::OnSize] devicePixelRatio=${window.devicePixelRatio}, height=${this.CanvasElement.height}, width=${this.CanvasElement.width}`);\\r\\n\\r\\n        if (option && option.Redraw==false) return;\\r\\n\\r\\n        if (this.JSChartContainer)\\r\\n        {\\r\\n            if (this.JSChartContainer.OnSize && option && option.Type==1)\\r\\n            {\\r\\n                this.JSChartContainer.OnSize();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.JSChartContainer.Frame) this.JSChartContainer.Frame.SetSizeChage(true);\\r\\n                this.JSChartContainer.Draw();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //手机屏需要调整 间距\\r\\n    this.AdjustChartBorder=function(chart)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n\\r\\n        chart.Frame.ChartBorder.Left*=pixelTatio;\\r\\n        chart.Frame.ChartBorder.Right*=pixelTatio;\\r\\n        chart.Frame.ChartBorder.Top*=pixelTatio;\\r\\n        chart.Frame.ChartBorder.Bottom*=pixelTatio;\\r\\n    }\\r\\n\\r\\n    this.AdjustTitleHeight=function(chart)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n\\r\\n        for(var i=0;i<chart.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight*=pixelTatio;\\r\\n        }\\r\\n\\r\\n        chart.ChartCorssCursor.TextHeight*=pixelTatio;  //十字光标文本信息高度\\r\\n    }\\r\\n\\r\\n    //历史K线图\\r\\n    this.CreateKLineChartContainer=function(option)\\r\\n    {\\r\\n        var chart=null;\\r\\n        if (option.Type===\\\"历史K线图横屏\\\") chart=new KLineChartHScreenContainer(this.CanvasElement);\\r\\n        else chart=new KLineChartContainer(this.CanvasElement,this.OffscreenCanvasElement);\\r\\n\\r\\n        if (option.NetworkFilter) chart.NetworkFilter=option.NetworkFilter;\\r\\n\\r\\n        //创建改参数div\\r\\n        chart.ModifyIndexDialog=this.ModifyIndexDialog;\\r\\n        chart.ChangeIndexDialog=this.ChangeIndexDialog;\\r\\n        chart.MinuteDialog=this.MinuteDialog;\\r\\n\\r\\n        //右键菜单\\r\\n        if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);\\r\\n        if (option.ScriptError) chart.ScriptErrorCallback=option.ScriptError;\\r\\n        chart.SelectRectRightMenu=new KLineSelectRightMenu(this.DivElement);\\r\\n        if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;\\r\\n        if (option.DisableMouse==true) chart.DisableMouse=option.DisableMouse;\\r\\n        if (option.TouchMoveMinAngle) chart.TouchMoveMinAngle=option.TouchMoveMinAngle;\\r\\n        if (option.EnableZoomUpDown) chart.EnableZoomUpDown=option.EnableZoomUpDown;\\r\\n        if (IFrameSplitOperator.IsString(option.SplashTitle)) chart.LoadDataSplashTitle=option.SplashTitle;\\r\\n        if (IFrameSplitOperator.IsBool(option.EnableZoomIndexWindow)) chart.EnableZoomIndexWindow=option.EnableZoomIndexWindow;\\r\\n\\r\\n        if (option.EnableYDrag)\\r\\n        {\\r\\n            var item=option.EnableYDrag;\\r\\n            if (IFrameSplitOperator.IsBool(item.Left)) chart.EnableYDrag.Left=item.Left;\\r\\n            if (IFrameSplitOperator.IsBool(item.Right)) chart.EnableYDrag.Right=item.Right;\\r\\n        }\\r\\n\\r\\n        if (option.KLine)   //k线图的属性设置\\r\\n        {\\r\\n            if (option.KLine.DragMode>=0) chart.DragMode=option.KLine.DragMode;\\r\\n            if (option.KLine.Right>=0) chart.Right=option.KLine.Right;\\r\\n            if (option.KLine.Period>=0) chart.Period=option.KLine.Period;\\r\\n            if (option.KLine.MaxReqeustDataCount>0) chart.MaxReqeustDataCount=option.KLine.MaxReqeustDataCount;\\r\\n            if (option.KLine.Info && option.KLine.Info.length>0) chart.SetKLineInfo(option.KLine.Info,false);\\r\\n            if (option.KLine.IndexTreeApiUrl) chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;\\r\\n            if (option.KLine.KLineDoubleClick==false) chart.MinuteDialog=this.MinuteDialog=null;\\r\\n            if (option.KLine.IndexTreeApiUrl!=null) chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;\\r\\n            if (option.KLine.IsShowTooltip==false) chart.IsShowTooltip=false;\\r\\n            if (option.KLine.MaxRequestMinuteDayCount>0) chart.MaxRequestMinuteDayCount=option.KLine.MaxRequestMinuteDayCount;\\r\\n            if (option.KLine.DrawType) chart.KLineDrawType=option.KLine.DrawType;\\r\\n            if (option.KLine.FirstShowDate>19910101) chart.CustomShow={ Date:option.KLine.FirstShowDate, PageSize:option.KLine.PageSize };\\r\\n            if (option.KLine.RightSpaceCount>0) chart.RightSpaceCount=option.KLine.RightSpaceCount;\\r\\n            if (option.KLine.ZoomType>0) chart.ZoomType=option.KLine.ZoomType;\\r\\n            if (option.KLine.DataWidth>=1) chart.KLineSize={ DataWidth:option.KLine.DataWidth };\\r\\n            if (IFrameSplitOperator.IsNumber(option.KLine.RightFormula)) chart.RightFormula=option.KLine.RightFormula;\\r\\n        }\\r\\n\\r\\n        if (option.EnableFlowCapital)\\r\\n        {\\r\\n            var item=option.EnableFlowCapital;\\r\\n            if (item.BIT==true) chart.EnableFlowCapital.BIT=item.BIT;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(option.EnableBorderDrag))\\r\\n        {\\r\\n            chart.EnableBorderDrag=option.EnableBorderDrag;\\r\\n        }\\r\\n\\r\\n        if (option.Page)\\r\\n        {\\r\\n            if (option.Page.Day && option.Page.Day.Enable==true) chart.Page.Day.Enable=true;\\r\\n            if (option.Page.Minute && option.Page.Minute.Enable==true) chart.Page.Minute.Enable=true;\\r\\n        }\\r\\n\\r\\n        if (option.DragDownload)\\r\\n        {\\r\\n            if (option.DragDownload.Day && option.DragDownload.Day.Enable==true) chart.DragDownload.Day.Enable=true;\\r\\n            if (option.DragDownload.Minute && option.DragDownload.Minute.Enable==true) chart.DragDownload.Minute.Enable=true;\\r\\n        }\\r\\n\\r\\n        if (option.Language)\\r\\n        {\\r\\n            if (option.Language==='CN') chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n            else if(option.Language==='EN') chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID;\\r\\n            else if(option.Language==='TC') chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_TRADITIONAL_CHINESE_ID;\\r\\n        }\\r\\n\\r\\n        if (option.SourceDatatLimit) chart.SetSourceDatatLimit(option.SourceDatatLimit);\\r\\n\\r\\n        if (option.DrawPicture) //画图工具\\r\\n        {\\r\\n            if (option.DrawPicture.StorageKey && chart.ChartDrawStorage) chart.ChartDrawStorage.Load(option.DrawPicture.StorageKey);\\r\\n        }\\r\\n\\r\\n        if (option.DrawTool)    //画图工具\\r\\n        {\\r\\n            if (option.DrawTool.StorageKey && chart.ChartDrawStorage) chart.ChartDrawStorage.Load(option.DrawTool.StorageKey);\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(option.StepPixel)) chart.StepPixel=option.StepPixel;\\r\\n        if (option.ZoomStepPixel>0) chart.ZoomStepPixel=option.ZoomStepPixel;\\r\\n        if (option.IsApiPeriod==true) chart.IsApiPeriod=option.IsApiPeriod;\\r\\n\\r\\n        if (!option.Windows || option.Windows.length<=0) return null;\\r\\n\\r\\n        //创建子窗口\\r\\n        chart.Create(option.Windows.length, option.Listener);\\r\\n\\r\\n        if (option.Border)\\r\\n        {\\r\\n            var item=option.Border;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            else option.Border.Left=chart.Frame.ChartBorder.Left;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            else option.Border.Right=chart.Frame.ChartBorder.Right;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n            else option.Border.Top=chart.Frame.ChartBorder.Top;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Bottom)) chart.Frame.ChartBorder.Bottom=option.Border.Bottom;\\r\\n            else option.Border.Bottom=chart.Frame.ChartBorder.Bottom;\\r\\n\\r\\n            if (item.AutoLeft) chart.Frame.AutoLeftBorder=item.AutoLeft;\\r\\n            if (item.AutoRight) chart.Frame.AutoRightBorder=item.AutoRight;\\r\\n        }\\r\\n\\r\\n        this.AdjustChartBorder(chart);\\r\\n\\r\\n        if (option.KLine)\\r\\n        {\\r\\n            if (option.KLine.PageSize > 0)  //一屏显示的数据个数\\r\\n            {\\r\\n                let pageSize = chart.GetMaxMinPageSize();\\r\\n                if (pageSize.Max>10 && pageSize.Max < option.KLine.PageSize) chart.PageSize = pageSize.Max;\\r\\n                else if (pageSize.Min>10 && pageSize.Min> option.KLine.PageSize) chart.PageSize=pageSize.Min;\\r\\n                else chart.PageSize = option.KLine.PageSize;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //取消显示十字光标刻度信息\\r\\n        if (option.IsCorssOnlyDrawKLine===true) chart.ChartCorssCursor.IsOnlyDrawKLine=option.IsCorssOnlyDrawKLine;\\r\\n        if (option.CorssCursorTouchEnd===true) chart.CorssCursorTouchEnd = option.CorssCursorTouchEnd;\\r\\n        if (option.IsClickShowCorssCursor==true) chart.IsClickShowCorssCursor=option.IsClickShowCorssCursor;\\r\\n        if (option.CorssCursorInfo)\\r\\n        {\\r\\n            var item=option.CorssCursorInfo;\\r\\n            if (!isNaN(option.CorssCursorInfo.Left)) chart.ChartCorssCursor.ShowTextMode.Left=option.CorssCursorInfo.Left;\\r\\n            if (!isNaN(option.CorssCursorInfo.Right)) chart.ChartCorssCursor.ShowTextMode.Right=option.CorssCursorInfo.Right;\\r\\n            if (!isNaN(option.CorssCursorInfo.Bottom)) chart.ChartCorssCursor.ShowTextMode.Bottom=option.CorssCursorInfo.Bottom;\\r\\n            if (option.CorssCursorInfo.IsShowCorss===false) chart.ChartCorssCursor.IsShowCorss=option.CorssCursorInfo.IsShowCorss;\\r\\n            if (option.CorssCursorInfo.IsShowClose == true) chart.ChartCorssCursor.IsShowClose = option.CorssCursorInfo.IsShowClose;    //Y轴显示收盘价\\r\\n            if (option.CorssCursorInfo.PressTime) chart.PressTime=option.CorssCursorInfo.PressTime; //长按显示十字光标的时间\\r\\n            if (IFrameSplitOperator.IsNumber(option.CorssCursorInfo.HPenType)) chart.ChartCorssCursor.HPenType=option.CorssCursorInfo.HPenType;\\r\\n            if (option.CorssCursorInfo.VPenType>0) chart.ChartCorssCursor.VPenType=option.CorssCursorInfo.VPenType;\\r\\n            if (IFrameSplitOperator.IsNumber(item.VLineType)) chart.ChartCorssCursor.VLineType=item.VLineType;\\r\\n            if (option.CorssCursorInfo.DateFormatType>0) chart.ChartCorssCursor.StringFormatX.DateFormatType=option.CorssCursorInfo.DateFormatType;\\r\\n            if (IFrameSplitOperator.IsBool(item.IsDrawXRangeBG)) chart.ChartCorssCursor.IsDrawXRangeBG=item.IsDrawXRangeBG;\\r\\n            if (IFrameSplitOperator.IsBool(option.CorssCursorInfo.IsFixXLastTime)) chart.ChartCorssCursor.IsFixXLastTime=option.CorssCursorInfo.IsFixXLastTime;\\r\\n            if (item.RightButton)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsBool(item.RightButton.Enable)) chart.ChartCorssCursor.RightButton.Enable=item.RightButton.Enable;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //保存十字光标文字高度\\r\\n        option.CorssCursor={};\\r\\n        option.CorssCursor.TitleHeight=chart.ChartCorssCursor.TextHeight;\\r\\n\\r\\n\\r\\n\\r\\n        if (option.Frame)\\r\\n        {\\r\\n            for(var i=0;i<option.Frame.length;++i)\\r\\n            {\\r\\n                var item=option.Frame[i];\\r\\n                if (!chart.Frame.SubFrame[i]) continue;\\r\\n                var subFrame=chart.Frame.SubFrame[i].Frame;\\r\\n\\r\\n                if (item.SplitCount) chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;\\r\\n                if (item.StringFormat) chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;\\r\\n                if (IFrameSplitOperator.IsNumber(item.FloatPrecision)) chart.Frame.SubFrame[i].Frame.YSplitOperator.FloatPrecision=item.FloatPrecision;\\r\\n                if (item.Custom) chart.Frame.SubFrame[i].Frame.YSplitOperator.Custom=item.Custom;\\r\\n                if (IFrameSplitOperator.IsNumber(item.SplitType)) chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitType=item.SplitType;\\r\\n                if (!isNaN(item.Height)) chart.Frame.SubFrame[i].Height = item.Height;\\r\\n                if (item.IsShowLeftText===false || item.IsShowLeftText===true)\\r\\n                {\\r\\n                    chart.Frame.SubFrame[i].Frame.IsShowYText[0]=item.IsShowLeftText;\\r\\n                    chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;            //显示左边刻度\\r\\n                }\\r\\n                if (item.IsShowRightText===false || item.IsShowRightText===true)\\r\\n                {\\r\\n                    chart.Frame.SubFrame[i].Frame.IsShowYText[1]=item.IsShowRightText;\\r\\n                    chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;         //显示右边刻度\\r\\n                }\\r\\n                if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;\\r\\n                if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;\\r\\n\\r\\n                if (item.RightTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[1]=item.RightTextPosition;\\r\\n                if (item.LeftTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[0]=item.LeftTextPosition;\\r\\n\\r\\n                if (item.IsShowXLine==false) chart.Frame.SubFrame[i].Frame.IsShowXLine=item.IsShowXLine;\\r\\n                if (item.IsShowYLine==false) chart.Frame.SubFrame[i].Frame.IsShowYLine=item.IsShowYLine;\\r\\n                if (IFrameSplitOperator.IsNumber(item.YTextBaseline)) chart.Frame.SubFrame[i].Frame.YTextBaseline=item.YTextBaseline;\\r\\n\\r\\n                if (item.YCoordinateType>0) chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=item.YCoordinateType;\\r\\n                if (item.IsYReverse==true) chart.Frame.SubFrame[0].Frame.CoordinateType=1;  //反转坐标\\r\\n                if (IFrameSplitOperator.IsNumber(item.PercentageTextFormat)) subFrame.YSplitOperator.PercentageTextFormat=item.PercentageTextFormat;    //百分比坐标格式\\r\\n\\r\\n                if (item.DefaultYMaxMin) chart.Frame.SubFrame[i].Frame.YSplitOperator.DefaultYMaxMin=item.DefaultYMaxMin;\\r\\n                if (IFrameSplitOperator.IsBool(item.EnableRemoveZero)) chart.Frame.SubFrame[i].Frame.YSplitOperator.EnableRemoveZero=item.EnableRemoveZero;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.MinYDistance)) chart.Frame.SubFrame[i].Frame.MinYDistance=item.MinYDistance;\\r\\n                if (IFrameSplitOperator.IsNumber(item.BorderLine)) chart.Frame.SubFrame[i].Frame.BorderLine=item.BorderLine;\\r\\n                if (IFrameSplitOperator.IsBool(item.IsShowIndexTitle)) chart.Frame.SubFrame[i].Frame.IsShowIndexTitle=item.IsShowIndexTitle;\\r\\n                if (IFrameSplitOperator.IsBool(item.IsDrawTitleBottomLine)) subFrame.IsDrawTitleBottomLine=item.IsDrawTitleBottomLine;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option.KLine)\\r\\n        {\\r\\n            if (option.KLine.ShowKLine == false) chart.ChartPaint[0].IsShow = false;\\r\\n            if (option.KLine.InfoPosition>0) chart.ChartPaint[0].InfoPosition=option.KLine.InfoPosition;\\r\\n            if (option.KLine.IsShowMaxMinPrice == false) chart.ChartPaint[0].IsShowMaxMinPrice=option.KLine.IsShowMaxMinPrice;\\r\\n        }\\r\\n\\r\\n        if(option.KLineTitle)\\r\\n        {\\r\\n            if(option.KLineTitle.IsShowName==false) chart.TitlePaint[0].IsShowName=false;\\r\\n            if(option.KLineTitle.IsShowSettingInfo==false) chart.TitlePaint[0].IsShowSettingInfo=false;\\r\\n            if(option.KLineTitle.IsShow == false) chart.TitlePaint[0].IsShow = false;\\r\\n        }\\r\\n\\r\\n        //叠加股票\\r\\n\\r\\n        if (option.Overlay)\\r\\n        {\\r\\n            for(var i=0;i<option.Overlay.length;++i)\\r\\n            {\\r\\n                var item=option.Overlay[i];\\r\\n                chart.OverlaySymbol(item.Symbol,item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option.ExtendChart)\\r\\n        {\\r\\n            for(var i=0;i<option.ExtendChart.length;++i)\\r\\n            {\\r\\n                var item=option.ExtendChart[i];\\r\\n                chart.CreateExtendChart(item.Name, item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //创建子窗口的指标\\r\\n        let scriptData = new JSIndexScript();\\r\\n\\r\\n        if (option.ColorIndex)    //五彩K线\\r\\n        {\\r\\n            var item=option.ColorIndex;\\r\\n            let indexInfo=scriptData.Get(item.Index);\\r\\n            if (indexInfo)\\r\\n            {\\r\\n                indexInfo.ID=item.Index;\\r\\n                chart.ColorIndex=new ScriptIndex(indexInfo.Name, indexInfo.Script, indexInfo.Args,indexInfo);    //脚本执行\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option.TradeIndex)  //交易指标\\r\\n        {\\r\\n            var item=option.TradeIndex;\\r\\n            let indexInfo=scriptData.Get(item.Index);\\r\\n            if (indexInfo)\\r\\n            {\\r\\n                indexInfo.ID=item.Index;\\r\\n                chart.TradeIndex=new ScriptIndex(indexInfo.Name, indexInfo.Script, indexInfo.Args,indexInfo);    //脚本执行\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<option.Windows.length;++i)\\r\\n        {\\r\\n            var item=option.Windows[i];\\r\\n            if (item.Script)\\r\\n            {\\r\\n                chart.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n            }\\r\\n            else if (item.JsonData)\\r\\n            {\\r\\n                chart.WindowIndex[i]=new JsonDataIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n            }\\r\\n            else if (item.Local && item.Local.Data)\\r\\n            {\\r\\n                chart.WindowIndex[i]=new LocalJsonDataIndex(item.Local.Name,item.Local.Args,{JsonData:item.Local.Data});\\r\\n            }\\r\\n            else if (item.API)  //使用API挂接指标数据 API:{ Name:指标名字, Script:指标脚本可以为空, Args:参数可以为空, Url:指标执行地址 }\\r\\n            {\\r\\n                var apiItem=item.API;\\r\\n                chart.WindowIndex[i]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                let indexItem=JSIndexMap.Get(item.Index);\\r\\n                if (indexItem)\\r\\n                {\\r\\n                    chart.WindowIndex[i]=indexItem.Create();\\r\\n                    chart.CreateWindowIndex(i);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    let indexInfo = scriptData.Get(item.Index);\\r\\n                    if (!indexInfo) continue;\\r\\n\\r\\n                    if (item.Lock) indexInfo.Lock=item.Lock;\\r\\n                    indexInfo.ID=item.Index;\\r\\n                    var args=indexInfo.Args;\\r\\n                    if (item.Args) args=item.Args;\\r\\n                    if (item.IsShortTitle) indexInfo.IsShortTitle=item.IsShortTitle;\\r\\n                    if (item.TitleFont) indexInfo.TitleFont=item.TitleFont;\\r\\n                    chart.WindowIndex[i] = new ScriptIndex(indexInfo.Name, indexInfo.Script, args,indexInfo);    //脚本执行\\r\\n                    if (item.StringFormat>0) chart.WindowIndex[i].StringFormat=item.StringFormat;\\r\\n                    if (item.FloatPrecision>=0) chart.WindowIndex[i].FloatPrecision=item.FloatPrecision;\\r\\n                }\\r\\n\\r\\n            }\\r\\n\\r\\n            if (item.Modify!=null) chart.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;\\r\\n            if (item.Change!=null) chart.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;\\r\\n            if (item.Close!=null) chart.Frame.SubFrame[i].Frame.CloseIndex=item.Close;\\r\\n            if (item.Overlay!=null) chart.Frame.SubFrame[i].Frame.OverlayIndex=item.Overlay;\\r\\n            if (item.IsDrawTitleBG==true)  chart.Frame.SubFrame[i].Frame.IsDrawTitleBG=item.IsDrawTitleBG;\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(item.TitleHeight)) chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n            else item.TitleHeight=chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight;\\r\\n            if (item.IsShowTitleArraw==false) chart.Frame.SubFrame[i].Frame.IsShowTitleArraw=false;\\r\\n            if (item.IsShowIndexName==false) chart.Frame.SubFrame[i].Frame.IsShowIndexName=false;\\r\\n            if (item.IsShowOverlayIndexName==false) chart.Frame.SubFrame[i].Frame.IsShowOverlayIndexName=false;\\r\\n            if (item.IndexParamSpace>=0) chart.Frame.SubFrame[i].Frame.IndexParamSpace=item.IndexParamSpace;\\r\\n            if (item.OverlayIndexType)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(item.OverlayIndexType.Position)) chart.Frame.SubFrame[i].Frame.OverlayIndexType.Position=item.OverlayIndexType.Position;\\r\\n                if (IFrameSplitOperator.IsNumber(item.OverlayIndexType.LineSpace)) chart.Frame.SubFrame[i].Frame.OverlayIndexType.LineSpace=item.OverlayIndexType.LineSpace;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //叠加指标宽度\\r\\n        if (option.OverlayIndexFrameWidth>40) chart.OverlayIndexFrameWidth=option.OverlayIndexFrameWidth;\\r\\n\\r\\n        //叠加指标\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(option.OverlayIndex))\\r\\n        {\\r\\n            for(var i=0;i<option.OverlayIndex.length;++i)\\r\\n            {\\r\\n                var item=option.OverlayIndex[i];\\r\\n                if (item.Windows>=chart.Frame.SubFrame.length) continue;\\r\\n\\r\\n                var itemString = JSON.stringify(item);\\r\\n                var obj = JSON.parse(itemString);\\r\\n                if (item.Index) obj.IndexName=item.Index;\\r\\n                if (item.Windows>=0) obj.WindowIndex=item.Windows;\\r\\n                chart.CreateOverlayWindowsIndex(obj);\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        this.AdjustTitleHeight(chart);\\r\\n\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    //自定义指数历史K线图\\r\\n    this.CreateCustomKLineChartContainer=function(option)\\r\\n    {\\r\\n        var chart=new CustomKLineChartContainer(this.CanvasElement);\\r\\n\\r\\n        //创建改参数div\\r\\n        chart.ModifyIndexDialog=this.ModifyIndexDialog;\\r\\n        chart.ChangeIndexDialog=this.ChangeIndexDialog;\\r\\n        chart.MinuteDialog=this.MinuteDialog;\\r\\n\\r\\n        //右键菜单\\r\\n        if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);\\r\\n\\r\\n        if (option.KLine)   //k线图的属性设置\\r\\n        {\\r\\n            if (option.KLine.DragMode>=0) chart.DragMode=option.KLine.DragMode;\\r\\n            if (option.KLine.Right>=0) chart.Right=option.KLine.Right;\\r\\n            if (option.KLine.Period>=0) chart.Period=option.KLine.Period;\\r\\n            if (option.KLine.MaxReqeustDataCount>0) chart.MaxReqeustDataCount=option.KLine.MaxReqeustDataCount;\\r\\n            if (option.KLine.Info && option.KLine.Info.length>0) chart.SetKLineInfo(option.KLine.Info,false);\\r\\n            if (option.KLine.IndexTreeApiUrl) chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;\\r\\n            if (option.KLine.KLineDoubleClick==false) chart.MinuteDialog=this.MinuteDialog=null;\\r\\n            if (option.KLine.IndexTreeApiUrl!=null) chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;\\r\\n            if (option.KLine.PageSize>0)  chart.PageSize=option.KLine.PageSize;\\r\\n            if (option.KLine.IsShowTooltip==false) chart.IsShowTooltip=false;\\r\\n        }\\r\\n\\r\\n        if (option.CustomStock) chart.CustomStock=option.CustomStock;\\r\\n        if (option.QueryDate) chart.QueryDate=option.QueryDate;\\r\\n\\r\\n        if (!option.Windows || option.Windows.length<=0) return null;\\r\\n\\r\\n        //创建子窗口\\r\\n        chart.Create(option.Windows.length);\\r\\n\\r\\n        if (option.Border)\\r\\n        {\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n        }\\r\\n\\r\\n        if (option.IsShowCorssCursorInfo==false)    //取消显示十字光标刻度信息\\r\\n        {\\r\\n            chart.ChartCorssCursor.IsShowText=option.IsShowCorssCursorInfo;\\r\\n        }\\r\\n\\r\\n        if (option.Frame)\\r\\n        {\\r\\n            for(var i=0;i<option.Frame.length;++i)\\r\\n            {\\r\\n                var item=option.Frame[i];\\r\\n                if (item.SplitCount) chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;\\r\\n                if (item.StringFormat) chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if(option.KLineTitle)\\r\\n        {\\r\\n            if(option.KLineTitle.IsShowName==false) chart.TitlePaint[0].IsShowName=false;\\r\\n            if(option.KLineTitle.IsShowSettingInfo==false) chart.TitlePaint[0].IsShowSettingInfo=false;\\r\\n        }\\r\\n\\r\\n        //创建子窗口的指标\\r\\n        let scriptData = new JSIndexScript();\\r\\n        for(var i=0;i<option.Windows.length;++i)\\r\\n        {\\r\\n            var item=option.Windows[i];\\r\\n            if (item.Script)\\r\\n            {\\r\\n                chart.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                let indexItem=JSIndexMap.Get(item.Index);\\r\\n                if (indexItem)\\r\\n                {\\r\\n                    chart.WindowIndex[i]=indexItem.Create();\\r\\n                    chart.CreateWindowIndex(i);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    let indexInfo = scriptData.Get(item.Index);\\r\\n                    if (!indexInfo) continue;\\r\\n\\r\\n                    if (item.Lock) indexInfo.Lock=item.Lock;\\r\\n                    chart.WindowIndex[i] = new ScriptIndex(indexInfo.Name, indexInfo.Script, indexInfo.Args,indexInfo);    //脚本执行\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (item.Modify!=null)\\r\\n                chart.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;\\r\\n            if (item.Change!=null)\\r\\n                chart.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;\\r\\n\\r\\n            if (!isNaN(item.TitleHeight)) chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n        }\\r\\n\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    //分钟走势图\\r\\n    this.CreateMinuteChartContainer=function(option)\\r\\n    {\\r\\n        var chart=null;\\r\\n        if (option.Type===\\\"分钟走势图横屏\\\") chart=new MinuteChartHScreenContainer(this.CanvasElement);\\r\\n        else chart=new MinuteChartContainer(this.CanvasElement);\\r\\n\\r\\n        if (option.NetworkFilter) chart.NetworkFilter=option.NetworkFilter;\\r\\n\\r\\n        chart.ModifyIndexDialog=this.ModifyIndexDialog;\\r\\n        chart.ChangeIndexDialog=this.ChangeIndexDialog;\\r\\n\\r\\n        var windowsCount=2;\\r\\n        if (option.Windows && option.Windows.length>0) windowsCount+=option.Windows.length; //指标窗口从第3个窗口开始\\r\\n        if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;\\r\\n        if (option.DisableMouse==true) chart.DisableMouse=option.DisableMouse;\\r\\n        if (option.ScriptError) chart.ScriptErrorCallback=option.ScriptError;       //指标执行错误回调\\r\\n        if (IFrameSplitOperator.IsString(option.SplashTitle)) chart.LoadDataSplashTitle=option.SplashTitle;\\r\\n        if (IFrameSplitOperator.IsBool(option.EnableSelectRect)) chart.EnableSelectRect=option.EnableSelectRect; //是否启用区间选择\\r\\n        if (IFrameSplitOperator.IsBool(option.EnableZoomIndexWindow)) chart.EnableZoomIndexWindow=option.EnableZoomIndexWindow;\\r\\n\\r\\n        chart.SelectRectDialog=new MinuteSelectRectDialog(this.DivElement);\\r\\n\\r\\n\\r\\n        if (option.Minute)   //分钟走势图属性设置\\r\\n        {\\r\\n            if (option.Minute.IsShowTooltip==false) chart.IsShowTooltip=false;\\r\\n            if (option.Minute.DragMode>=0) chart.DragMode=option.Minute.DragMode;\\r\\n        }\\r\\n\\r\\n        if (option.Language)\\r\\n        {\\r\\n            if (option.Language==='CN') chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n            else if(option.Language==='EN') chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID;\\r\\n            else if(option.Language==='TC') chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_TRADITIONAL_CHINESE_ID;\\r\\n        }\\r\\n\\r\\n        if (option.Info && option.Info.length>0) chart.SetMinuteInfo(option.Info,false);\\r\\n\\r\\n        if (option.DrawTool)    //画图工具\\r\\n        {\\r\\n            if (option.DrawTool.StorageKey && chart.ChartDrawStorage) chart.ChartDrawStorage.Load(option.DrawTool.StorageKey);\\r\\n        }\\r\\n\\r\\n        if (option.BeforeOpen)  //集合竞价\\r\\n        {\\r\\n            var item=option.BeforeOpen;\\r\\n\\r\\n            if (IFrameSplitOperator.IsBool(item.IsShow)) chart.IsShowBeforeData=item.IsShow;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Width)) chart.ExtendWidth.Left=item.Width;\\r\\n        }\\r\\n\\r\\n        if (option.AfterClose)  //收盘集合竞价\\r\\n        {\\r\\n            var item=option.AfterClose;\\r\\n            if (IFrameSplitOperator.IsBool(item.IsShow)) chart.IsShowAfterData=item.IsShow;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Width)) chart.ExtendWidth.Right=item.Width;\\r\\n        }\\r\\n\\r\\n        chart.Create(windowsCount,option.Listener);                            //创建子窗口\\r\\n\\r\\n        if (option.CorssCursorInfo)\\r\\n        {\\r\\n            var item=option.CorssCursorInfo;\\r\\n            if (!isNaN(option.CorssCursorInfo.Left)) chart.ChartCorssCursor.ShowTextMode.Left=option.CorssCursorInfo.Left;\\r\\n            if (!isNaN(option.CorssCursorInfo.Right)) chart.ChartCorssCursor.ShowTextMode.Right=option.CorssCursorInfo.Right;\\r\\n            if (!isNaN(option.CorssCursorInfo.Bottom)) chart.ChartCorssCursor.ShowTextMode.Bottom=option.CorssCursorInfo.Bottom;\\r\\n            if (option.CorssCursorInfo.IsShowCorss===false) chart.ChartCorssCursor.IsShowCorss=option.CorssCursorInfo.IsShowCorss;\\r\\n            if (option.CorssCursorInfo.RightTextFormat>0) chart.ChartCorssCursor.TextFormat.Right=option.CorssCursorInfo.RightTextFormat;\\r\\n            if (option.CorssCursorInfo.IsOnlyDrawMinute == true) chart.ChartCorssCursor.IsOnlyDrawMinute = option.CorssCursorInfo.IsOnlyDrawMinute;    //Y轴显示收盘价\\r\\n            if (IFrameSplitOperator.IsBool(option.CorssCursorInfo.IsFixXLastTime)) chart.ChartCorssCursor.IsFixXLastTime=option.CorssCursorInfo.IsFixXLastTime;\\r\\n\\r\\n            if (item.RightButton)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsBool(item.RightButton.Enable)) chart.ChartCorssCursor.RightButton.Enable=item.RightButton.Enable;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option.MinuteInfo) chart.CreateMinuteInfo(option.MinuteInfo);\\r\\n\\r\\n        if (option.IsShowRightMenu==true) chart.RightMenu=new MinuteRightMenu(this.DivElement);\\r\\n\\r\\n        if (option.DayCount>1) chart.DayCount=option.DayCount;\\r\\n\\r\\n        if (option.Border)\\r\\n        {\\r\\n            var item=option.Border;\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n            if (!isNaN(option.Border.Bottom)) chart.Frame.ChartBorder.Bottom=option.Border.Bottom;\\r\\n\\r\\n            if (item.AutoLeft) chart.Frame.AutoLeftBorder=item.AutoLeft;\\r\\n            if (item.AutoRight) chart.Frame.AutoRightBorder=item.AutoRight;\\r\\n        }\\r\\n\\r\\n        if (option.SplashTitle) chart.ChartSplashPaint.SplashTitle=option.SplashTitle;\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(option.EnableBorderDrag))\\r\\n        {\\r\\n            chart.EnableBorderDrag=option.EnableBorderDrag;\\r\\n        }\\r\\n\\r\\n        this.AdjustChartBorder(chart);\\r\\n\\r\\n        if (option.Frame)\\r\\n        {\\r\\n            for(var i=0;i<option.Frame.length;++i)\\r\\n            {\\r\\n                var item=option.Frame[i];\\r\\n                if (!chart.Frame.SubFrame[i]) continue;\\r\\n                if (item.SplitCount) chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;\\r\\n                if (item.StringFormat) chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;\\r\\n                if (item.IsShowLeftText==false)\\r\\n                {\\r\\n                    chart.Frame.SubFrame[i].Frame.IsShowYText[0]=item.IsShowLeftText;\\r\\n                    chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;            //显示左边刻度\\r\\n                }\\r\\n                if (item.IsShowRightText==false)\\r\\n                {\\r\\n                    chart.Frame.SubFrame[i].Frame.IsShowYText[1]=item.IsShowRightText;\\r\\n                    chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;         //显示右边刻度\\r\\n                }\\r\\n                if (item.Height>=0) chart.Frame.SubFrame[i].Height = item.Height;\\r\\n                if (item.Custom) chart.Frame.SubFrame[i].Frame.YSplitOperator.Custom=item.Custom;\\r\\n                if (item.RightTextFormat>0) chart.Frame.SubFrame[i].Frame.YSplitOperator.RightTextFormat=item.RightTextFormat;\\r\\n                if (IFrameSplitOperator.IsNumber(item.TitleHeight)) chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n                if (IFrameSplitOperator.IsNumber(item.BorderLine)) chart.Frame.SubFrame[i].Frame.BorderLine=item.BorderLine;\\r\\n                if (IFrameSplitOperator.IsBool(item.EnableRemoveZero)) chart.Frame.SubFrame[i].Frame.YSplitOperator.EnableRemoveZero=item.EnableRemoveZero;\\r\\n                if (IFrameSplitOperator.IsNumber(item.FloatPrecision)) chart.Frame.SubFrame[i].Frame.YSplitOperator.FloatPrecision=item.FloatPrecision;\\r\\n                if (IFrameSplitOperator.IsNumber(item.YTextBaseline)) chart.Frame.SubFrame[i].Frame.YTextBaseline=item.YTextBaseline;\\r\\n            }\\r\\n\\r\\n            chart.UpdateXShowText();\\r\\n        }\\r\\n\\r\\n        if (option.ExtendChart)\\r\\n        {\\r\\n            for(var i=0;i<option.ExtendChart.length;++i)\\r\\n            {\\r\\n                var item=option.ExtendChart[i];\\r\\n                chart.CreateExtendChart(item.Name, item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //叠加股票\\r\\n        if (option.Overlay)\\r\\n        {\\r\\n            for(var i=0;i<option.Overlay.length;++i)\\r\\n            {\\r\\n                var item=option.Overlay[i];\\r\\n                chart.OverlaySymbol(item.Symbol,item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option.MinuteLine)\\r\\n        {\\r\\n            if (option.MinuteLine.IsDrawAreaPrice==false) chart.ChartPaint[0].IsDrawArea=false;\\r\\n            if (option.MinuteLine.IsShowLead==false) chart.IsShowLead=false;\\r\\n            if (option.MinuteLine.IsShowAveragePrice==false)\\r\\n            {\\r\\n                chart.ChartPaint[1].IsShow=false;\\r\\n                chart.TitlePaint[0].IsShowAveragePrice=false;   //标题栏均线也不显示\\r\\n                for(var i=0;i<chart.ExtendChartPaint.length;++i)\\r\\n                {\\r\\n                    var item=chart.ExtendChartPaint[i];\\r\\n                    if (item.ClassName==\\\"MinuteTooltipPaint\\\")\\r\\n                        item.IsShowAveragePrice=false;\\r\\n                }\\r\\n            }\\r\\n            if (option.MinuteLine.SplitType>0) chart.Frame.SubFrame[0].Frame.YSplitOperator.SplitType=option.MinuteLine.SplitType;\\r\\n        }\\r\\n\\r\\n        if(option.MinuteTitle)\\r\\n        {\\r\\n            var item=option.MinuteTitle;\\r\\n            if(IFrameSplitOperator.IsBool(item.IsShowName)) chart.TitlePaint[0].IsShowName=item.IsShowName;\\r\\n            if(IFrameSplitOperator.IsBool(item.IsShowDate)) chart.TitlePaint[0].IsShowDate=item.IsShowDate;\\r\\n            if(IFrameSplitOperator.IsBool(item.IsShowTime)) chart.TitlePaint[0].IsShowTime=item.IsShowTime;\\r\\n            if(IFrameSplitOperator.IsBool(item.IsTitleShowLatestData)) chart.IsTitleShowLatestData=item.IsTitleShowLatestData;\\r\\n            //if(option.KLineTitle.IsShow == false) chart.TitlePaint[0].IsShow = false;\\r\\n        }\\r\\n\\r\\n        if (option.CorssCursorTouchEnd===true) chart.CorssCursorTouchEnd = option.CorssCursorTouchEnd;\\r\\n        if (option.IsShowBeforeData===true) chart.IsShowBeforeData=option.IsShowBeforeData;\\r\\n\\r\\n        //分钟数据指标从第3个指标窗口设置\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(option.Windows))\\r\\n        {\\r\\n            let scriptData = new JSIndexScript();\\r\\n            for(var i=0;i<option.Windows.length;++i)\\r\\n            {\\r\\n                var index=2+i;\\r\\n                var item=option.Windows[i];\\r\\n                if (item.Script)\\r\\n                {\\r\\n                    chart.WindowIndex[index]=new ScriptIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n                }\\r\\n                else if (item.API)  //使用API挂接指标数据 API:{ Name:指标名字, Script:指标脚本可以为空, Args:参数可以为空, Url:指标执行地址 }\\r\\n                {\\r\\n                    var apiItem=item.API;\\r\\n                    chart.WindowIndex[index]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var indexItem=JSIndexMap.Get(item.Index);\\r\\n                    if (indexItem)\\r\\n                    {\\r\\n                        chart.WindowIndex[index]=indexItem.Create();       //创建子窗口的指标\\r\\n                        chart.CreateWindowIndex(index);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        let indexInfo = scriptData.Get(item.Index);\\r\\n                        if (!indexInfo) continue;\\r\\n                        indexInfo.ID=item.Index;\\r\\n                        var args=indexInfo.Args;\\r\\n                        if (item.Args) args=item.Args;\\r\\n                        chart.WindowIndex[index] = new ScriptIndex(indexInfo.Name, indexInfo.Script, args,indexInfo);    //脚本执行\\r\\n                        if (item.StringFormat>0) chart.WindowIndex[index].StringFormat=item.StringFormat;\\r\\n                        if (item.FloatPrecision>=0) chart.WindowIndex[index].FloatPrecision=item.FloatPrecision;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (item.Modify!=null) chart.Frame.SubFrame[index].Frame.ModifyIndex=item.Modify;\\r\\n                if (item.Change!=null) chart.Frame.SubFrame[index].Frame.ChangeIndex=item.Change;\\r\\n                if (item.Close!=null) chart.Frame.SubFrame[index].Frame.CloseIndex=item.Close;\\r\\n                if (!isNaN(item.TitleHeight)) chart.Frame.SubFrame[index].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.AdjustTitleHeight(chart);\\r\\n\\r\\n        //叠加指标\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(option.OverlayIndex))\\r\\n        {\\r\\n            for(var i=0;i<option.OverlayIndex.length;++i)\\r\\n            {\\r\\n                var item=option.OverlayIndex[i];\\r\\n                if (item.Windows>=chart.Frame.SubFrame.length) continue;\\r\\n\\r\\n                var itemString = JSON.stringify(item);\\r\\n                var obj = JSON.parse(itemString);\\r\\n                if (item.Index) obj.IndexName=item.Index;\\r\\n                if (item.Windows>=0) obj.WindowIndex=item.Windows;\\r\\n                chart.CreateOverlayWindowsIndex(obj);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    //历史分钟走势图\\r\\n    this.CreateHistoryMinuteChartContainer=function(option)\\r\\n    {\\r\\n        var chart=new HistoryMinuteChartContainer(this.CanvasElement);\\r\\n\\r\\n        var windowsCount=2;\\r\\n        if (option.Windows && option.Windows.length>0) windowsCount+=option.Windows.length; //指标窗口从第3个窗口开始\\r\\n\\r\\n        chart.Create(windowsCount);                            //创建子窗口\\r\\n\\r\\n        if (option.IsShowCorssCursorInfo==false)    //取消显示十字光标刻度信息\\r\\n        {\\r\\n            chart.ChartCorssCursor.IsShowText=option.IsShowCorssCursorInfo;\\r\\n        }\\r\\n\\r\\n        if (option.Border)\\r\\n        {\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n            if (!isNaN(option.Border.Bottom)) chart.Frame.ChartBorder.Bottom=option.Border.Bottom;\\r\\n        }\\r\\n\\r\\n        let scriptData = new JSIndexScript();\\r\\n        if (option.Windows)\\r\\n        {\\r\\n            for(var i=0;i<option.Windows.length;++i)\\r\\n            {\\r\\n                var item=option.Windows[i];\\r\\n                if (item.Script)\\r\\n                {\\r\\n                    chart.WindowIndex[2+parseInt(i)]=new ScriptIndex(item.Name,item.Script,item.Args);    //脚本执行\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var indexItem=JSIndexMap.Get(item.Index);\\r\\n                    if (indexItem)\\r\\n                    {\\r\\n                        chart.WindowIndex[2+parseInt(i)]=indexItem.Create();       //创建子窗口的指标\\r\\n                        chart.CreateWindowIndex(2+parseInt(i));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        let indexInfo = scriptData.Get(item.Index);\\r\\n                        if (!indexInfo) continue;\\r\\n\\r\\n                        chart.WindowIndex[2+parseInt(i)] = new ScriptIndex(indexInfo.Name, indexInfo.Script, indexInfo.Args);    //脚本执行\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (!isNaN(item.TitleHeight)) chart.Frame.SubFrame[2+parseInt(i)].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        chart.TradeDate=20181009;\\r\\n        if (option.HistoryMinute.TradeDate) chart.TradeDate=option.HistoryMinute.TradeDate;\\r\\n        if (option.HistoryMinute.IsShowName!=null) chart.TitlePaint[0].IsShowName=option.HistoryMinute.IsShowName;  //动态标题是否显示股票名称\\r\\n        if (option.HistoryMinute.IsShowDate!=null) chart.TitlePaint[0].IsShowDate=option.HistoryMinute.IsShowDate;  //动态标题是否显示日期\\r\\n\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    this.CreateKLineTrainChartContainer=function(option)\\r\\n    {\\r\\n        var bHScreen=(option.Type=='K线训练横屏'? true:false);\\r\\n        var chart=new KLineTrainChartContainer(this.CanvasElement,bHScreen);\\r\\n\\r\\n        if (option.NetworkFilter) chart.NetworkFilter=option.NetworkFilter;\\r\\n        if (option.IsApiPeriod==true) chart.IsApiPeriod=option.IsApiPeriod;\\r\\n\\r\\n        //创建改参数div\\r\\n        chart.ModifyIndexDialog=this.ModifyIndexDialog;\\r\\n        chart.ChangeIndexDialog=this.ChangeIndexDialog;\\r\\n\\r\\n        if (option.ScriptError) chart.ScriptErrorCallback=option.ScriptError;\\r\\n\\r\\n        if (option.KLine)   //k线图的属性设置\\r\\n        {\\r\\n            if (option.KLine.Right>=0) chart.Right=option.KLine.Right;\\r\\n            if (option.KLine.Period>=0) chart.Period=option.KLine.Period;\\r\\n            if (option.KLine.MaxReqeustDataCount>0) chart.MaxReqeustDataCount=option.KLine.MaxReqeustDataCount;\\r\\n            if (option.KLine.Info && option.KLine.Info.length>0) chart.SetKLineInfo(option.KLine.Info,false);\\r\\n            if (option.KLine.PageSize>0)  chart.PageSize=option.KLine.PageSize;\\r\\n            if (option.KLine.IsShowTooltip==false) chart.IsShowTooltip=false;\\r\\n            if (option.KLine.MaxRequestMinuteDayCount>0) chart.MaxRequestMinuteDayCount=option.KLine.MaxRequestMinuteDayCount;\\r\\n            if (option.KLine.DrawType) chart.KLineDrawType=option.KLine.DrawType;\\r\\n            if (option.KLine.RightSpaceCount>0) chart.RightSpaceCount=option.KLine.RightSpaceCount;\\r\\n        }\\r\\n\\r\\n        if (option.Train)\\r\\n        {\\r\\n            if (option.Train.DataCount) chart.TrainDataCount=option.Train.DataCount;\\r\\n            if (option.Train.Callback) chart.TrainCallback=option.Train.Callback;\\r\\n            if (option.Train.StartDate) chart.TrainStartDate=option.Train.StartDate;\\r\\n        }\\r\\n\\r\\n        if (!option.Windows || option.Windows.length<=0) return null;\\r\\n\\r\\n        //创建子窗口\\r\\n        chart.Create(option.Windows.length);\\r\\n\\r\\n        if (option.Border)\\r\\n        {\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n            if (!isNaN(option.Border.Bottom)) chart.Frame.ChartBorder.Bottom=option.Border.Bottom;\\r\\n        }\\r\\n\\r\\n        this.AdjustChartBorder(chart);\\r\\n\\r\\n        if (option.IsShowCorssCursorInfo==false) chart.ChartCorssCursor.IsShowText=option.IsShowCorssCursorInfo; //取消显示十字光标刻度信息\\r\\n        if (option.IsCorssOnlyDrawKLine===true) chart.ChartCorssCursor.IsOnlyDrawKLine=option.IsCorssOnlyDrawKLine;\\r\\n        if (option.CorssCursorTouchEnd===true) chart.CorssCursorTouchEnd = option.CorssCursorTouchEnd;\\r\\n        if (option.IsClickShowCorssCursor==true) chart.IsClickShowCorssCursor=option.IsClickShowCorssCursor;\\r\\n        if (option.CorssCursorInfo)\\r\\n        {\\r\\n            if (!isNaN(option.CorssCursorInfo.Left)) chart.ChartCorssCursor.ShowTextMode.Left=option.CorssCursorInfo.Left;\\r\\n            if (!isNaN(option.CorssCursorInfo.Right)) chart.ChartCorssCursor.ShowTextMode.Right=option.CorssCursorInfo.Right;\\r\\n            if (!isNaN(option.CorssCursorInfo.Bottom)) chart.ChartCorssCursor.ShowTextMode.Bottom=option.CorssCursorInfo.Bottom;\\r\\n            if (option.CorssCursorInfo.IsShowCorss===false) chart.ChartCorssCursor.IsShowCorss=option.CorssCursorInfo.IsShowCorss;\\r\\n            if (option.CorssCursorInfo.IsShowClose == true) chart.ChartCorssCursor.IsShowClose = option.CorssCursorInfo.IsShowClose;    //Y轴显示收盘价\\r\\n            if (option.CorssCursorInfo.PressTime) chart.PressTime=option.CorssCursorInfo.PressTime; //长按显示十字光标的时间\\r\\n            if (option.CorssCursorInfo.HPenType>0) chart.ChartCorssCursor.HPenType=option.CorssCursorInfo.HPenType;\\r\\n            if (option.CorssCursorInfo.VPenType>0) chart.ChartCorssCursor.VPenType=option.CorssCursorInfo.VPenType;\\r\\n        }\\r\\n\\r\\n        //保存十字光标文字高度\\r\\n        option.CorssCursor={};\\r\\n        option.CorssCursor.TitleHeight=chart.ChartCorssCursor.TextHeight;\\r\\n\\r\\n        if (option.Frame)\\r\\n        {\\r\\n            for(var i=0;i<option.Frame.length;++i)\\r\\n            {\\r\\n                var item=option.Frame[i];\\r\\n                if (!chart.Frame.SubFrame[i]) continue;\\r\\n                if (item.SplitCount) chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;\\r\\n                if (item.StringFormat) chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;\\r\\n                if (IFrameSplitOperator.IsNumber(item.FloatPrecision)) chart.Frame.SubFrame[i].Frame.YSplitOperator.FloatPrecision=item.FloatPrecision;\\r\\n                if (item.Custom) chart.Frame.SubFrame[i].Frame.YSplitOperator.Custom=item.Custom;\\r\\n                if (IFrameSplitOperator.IsNumber(item.SplitType)) chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitType=item.SplitType;\\r\\n                if (item.Height>0) chart.Frame.SubFrame[i].Height = item.Height;\\r\\n\\r\\n                if (item.IsShowLeftText==false) chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;            //显示左边刻度\\r\\n                if (item.IsShowRightText==false) chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;         //显示右边刻度\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option.KLine)\\r\\n        {\\r\\n            if (option.KLine.ShowKLine == false) chart.ChartPaint[0].IsShow = false;\\r\\n            if (option.KLine.InfoPosition>0) chart.ChartPaint[0].InfoPosition=option.KLine.InfoPosition;\\r\\n            if (option.KLine.IsShowMaxMinPrice == false) chart.ChartPaint[0].IsShowMaxMinPrice=option.KLine.IsShowMaxMinPrice;\\r\\n        }\\r\\n\\r\\n        if(option.KLineTitle)    //股票名称 日期 周期\\r\\n        {\\r\\n            if(option.KLineTitle.IsShowName==false) chart.TitlePaint[0].IsShowName=false;\\r\\n            if(option.KLineTitle.IsShowSettingInfo==false) chart.TitlePaint[0].IsShowSettingInfo=false;\\r\\n            if(option.KLineTitle.IsShow == false) chart.TitlePaint[0].IsShow = false;\\r\\n        }\\r\\n\\r\\n        if (option.ExtendChart)\\r\\n        {\\r\\n            for(var i=0;i<option.ExtendChart.length;++i)\\r\\n            {\\r\\n                var item=option.ExtendChart[i];\\r\\n                chart.CreateExtendChart(item.Name, item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(option.Windows))\\r\\n        {\\r\\n            //创建子窗口的指标\\r\\n            let scriptData = new JSIndexScript();\\r\\n            for(var i=0;i<option.Windows.length;++i)\\r\\n            {\\r\\n                var item=option.Windows[i];\\r\\n                if (item.Script)\\r\\n                {\\r\\n                    chart.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    let indexItem=JSIndexMap.Get(item.Index);\\r\\n                    if (indexItem)\\r\\n                    {\\r\\n                        chart.WindowIndex[i]=indexItem.Create();\\r\\n                        chart.CreateWindowIndex(i);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        let indexInfo = scriptData.Get(item.Index);\\r\\n                        if (!indexInfo) continue;\\r\\n\\r\\n                        if (item.Lock) indexInfo.Lock=item.Lock;\\r\\n                        chart.WindowIndex[i] = new ScriptIndex(indexInfo.Name, indexInfo.Script, indexInfo.Args,indexInfo);    //脚本执行\\r\\n                    }\\r\\n\\r\\n                }\\r\\n\\r\\n                if (item.Modify!=null) chart.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;\\r\\n                if (item.Change!=null) chart.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;\\r\\n                if (item.Close!=null) chart.Frame.SubFrame[i].Frame.CloseIndex=item.Close;\\r\\n\\r\\n                if (!isNaN(item.TitleHeight)) chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.AdjustTitleHeight(chart);\\r\\n\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    //深度图\\r\\n    this.CreateDepthChartContainer=function(option)\\r\\n    {\\r\\n        var chart=null;\\r\\n        chart=new DepthChartContainer(this.CanvasElement);\\r\\n        if (option.NetworkFilter) chart.NetworkFilter=option.NetworkFilter;\\r\\n\\r\\n        if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;\\r\\n        if (IFrameSplitOperator.IsPlusNumber(option.MaxVolRate)) chart.MaxVolRate=option.MaxVolRate;\\r\\n        if (option.ZoomStepPixel>0) chart.ZoomStepPixel=option.ZoomStepPixel;\\r\\n\\r\\n        chart.Create(option.Listener);\\r\\n\\r\\n        if (option.Border)\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            else option.Border.Left=chart.Frame.ChartBorder.Left;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            else option.Border.Right=chart.Frame.ChartBorder.Right;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n            else option.Border.Top=chart.Frame.ChartBorder.Top;\\r\\n            if (IFrameSplitOperator.IsNumber(option.Border.Bottom)) chart.Frame.ChartBorder.Bottom=option.Border.Bottom;\\r\\n            else option.Border.Bottom=chart.Frame.ChartBorder.Bottom;\\r\\n        }\\r\\n\\r\\n        this.AdjustChartBorder(chart);\\r\\n\\r\\n        if (option.CorssCursorTouchEnd===true) chart.CorssCursorTouchEnd = option.CorssCursorTouchEnd;\\r\\n\\r\\n        if (option.CorssCursorInfo)\\r\\n        {\\r\\n            var item=option.CorssCursorInfo;\\r\\n            if (IFrameSplitOperator.IsNumber(item.HPenType)) chart.ChartCorssCursor.HPenType=item.HPenType;\\r\\n            if (IFrameSplitOperator.IsNumber(item.VPenType)) chart.ChartCorssCursor.VPenType=item.VPenType;\\r\\n            if (IFrameSplitOperator.IsBool(item.IsShowTooltip)) chart.ChartCorssCursor.IsShowTooltip=item.IsShowTooltip;\\r\\n        }\\r\\n\\r\\n        if (option.Frame)\\r\\n        {\\r\\n            var item=option.Frame\\r\\n            if (item.SplitCount) chart.Frame.YSplitOperator.SplitCount=item.SplitCount;\\r\\n            if (IFrameSplitOperator.IsNumber(item.SplitType)) chart.Frame.YSplitOperator.SplitType=item.SplitType;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Height)) chart.Frame.Height = item.Height;\\r\\n            if (IFrameSplitOperator.IsNumber(item.YLineType)) chart.Frame.YSplitOperator.LineType=item.YLineType;\\r\\n            if (IFrameSplitOperator.IsNumber(item.XLineType)) chart.Frame.XSplitOperator.LineType=item.XLineType;\\r\\n            if (Array.isArray(item.IgnoreYValue)) chart.Frame.YSplitOperator.IgnoreYValue=item.IgnoreYValue;\\r\\n            if (item.IsShowLeftText===false || item.IsShowLeftText===true)\\r\\n            {\\r\\n                chart.Frame.IsShowYText[0]=item.IsShowLeftText;\\r\\n                chart.Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;            //显示左边刻度\\r\\n            }\\r\\n            if (item.IsShowRightText===false || item.IsShowRightText===true)\\r\\n            {\\r\\n                chart.Frame.IsShowYText[1]=item.IsShowRightText;\\r\\n                chart.Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;          //显示右边刻度\\r\\n            }\\r\\n\\r\\n            if (item.IsShowXLine==false) chart.Frame.IsShowXLine=item.IsShowXLine;\\r\\n            if (item.IsShowYLine==false) chart.Frame.IsShowYLine=item.IsShowYLine;\\r\\n        }\\r\\n\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    //根据option内容绘制图形\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        var chart=null;\\r\\n        switch(option.Type)\\r\\n        {\\r\\n            case \\\"历史K线图\\\":\\r\\n            case '历史K线图横屏':\\r\\n                chart=this.CreateKLineChartContainer(option);\\r\\n                break;\\r\\n            case \\\"自定义指数历史K线图\\\":\\r\\n                chart=this.CreateCustomKLineChartContainer(option);\\r\\n                break;\\r\\n            case \\\"分钟走势图\\\":\\r\\n            case \\\"分钟走势图横屏\\\":\\r\\n                chart=this.CreateMinuteChartContainer(option);\\r\\n                break;\\r\\n            case \\\"历史分钟走势图\\\":\\r\\n                chart=this.CreateHistoryMinuteChartContainer(option);\\r\\n                break;\\r\\n            case 'K线训练':\\r\\n            case 'K线训练横屏':\\r\\n                chart=this.CreateKLineTrainChartContainer(option);\\r\\n                break;\\r\\n            case \\\"深度图\\\":\\r\\n                chart=this.CreateDepthChartContainer(option);\\r\\n                break;\\r\\n            case \\\"简单图形\\\":\\r\\n                return this.CreateSimpleChart(option);\\r\\n            case \\\"饼图\\\":\\r\\n            case '雷达图':\\r\\n                return this.CreatePieChart(option);\\r\\n            case '地图':\\r\\n                return this.CreateMapChart(option);\\r\\n            default:\\r\\n                return false;\\r\\n        }\\r\\n\\r\\n        if (!chart) return false;\\r\\n\\r\\n        if (option.OnCreatedCallback) option.OnCreatedCallback(chart);\\r\\n\\r\\n        //是否自动更新\\r\\n        if (option.IsAutoUpdate!=null) chart.IsAutoUpdate=option.IsAutoUpdate;\\r\\n        if (option.AutoUpdateFrequency>0) chart.AutoUpdateFrequency=option.AutoUpdateFrequency;\\r\\n        //注册事件\\r\\n        if (option.EventCallback)\\r\\n        {\\r\\n            for(var i=0;i<option.EventCallback.length;++i)\\r\\n            {\\r\\n                var item=option.EventCallback[i];\\r\\n                chart.AddEventCallback(item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        //设置股票代码\\r\\n        if (!option.Symbol)\\r\\n        {\\r\\n            chart.DrawEmpty();\\r\\n            this.JSChartContainer=chart;\\r\\n            this.DivElement.JSChart=this;   //div中保存一份\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            chart.Draw();\\r\\n            chart.ChangeSymbol(option.Symbol);\\r\\n\\r\\n            this.JSChartContainer=chart;\\r\\n            this.DivElement.JSChart=this;   //div中保存一份\\r\\n            this.JSChartContainer.Draw();\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(option.CheckLatestVerion) && option.CheckLatestVerion==false)\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else if (JSChart.LastVersion==null)\\r\\n        {\\r\\n            if (chart && typeof(chart.GetLatestVersion)=='function') chart.GetLatestVersion();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateSimpleChart=function(option)\\r\\n    {\\r\\n        var chart=new SimlpleChartContainer(this.CanvasElement);\\r\\n        if (option.MainDataControl) chart.MainDataControl=option.MainDataControl;\\r\\n\\r\\n        chart.Create();\\r\\n\\r\\n        if (option.Border)  //边框设置\\r\\n        {\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n        }\\r\\n\\r\\n\\r\\n        chart.Draw();\\r\\n        chart.RequestData();\\r\\n\\r\\n        this.JSChartContainer=chart;\\r\\n        this.DivElement.JSChart=this;   //div中保存一份\\r\\n        this.JSChartContainer.Draw();\\r\\n    }\\r\\n\\r\\n    //创建饼图\\r\\n    this.CreatePieChart=function(option)\\r\\n    {\\r\\n        var chart=new PieChartContainer(this.CanvasElement);\\r\\n        if (option.MainDataControl) chart.MainDataControl=option.MainDataControl;\\r\\n\\r\\n        if(option.Radius) chart.Radius = option.Radius;\\r\\n\\r\\n        chart.Create();\\r\\n\\r\\n        if (option.Border)  //边框设置\\r\\n        {\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n        }\\r\\n\\r\\n        this.AdjustChartBorder(chart);\\r\\n\\r\\n        if (option.Frame)\\r\\n        {\\r\\n            if (option.Frame[0].IsShowBorder == false) chart.Frame.IsShowBorder = option.Frame[0].IsShowBorder;\\r\\n        }\\r\\n\\r\\n        chart.Draw();\\r\\n        chart.RequestData();\\r\\n\\r\\n        this.JSChartContainer=chart;\\r\\n        this.DivElement.JSChart=this;   //div中保存一份\\r\\n        this.JSChartContainer.Draw();\\r\\n\\r\\n    }\\r\\n\\r\\n    this.CreateMapChart=function(option)\\r\\n    {\\r\\n        var chart=new MapChartContainer(this.CanvasElement);\\r\\n        if (option.MainDataControl) chart.MainDataControl=option.MainDataControl;\\r\\n\\r\\n        chart.Create();\\r\\n\\r\\n        if (option.Border)  //边框设置\\r\\n        {\\r\\n            if (!isNaN(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;\\r\\n            if (!isNaN(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;\\r\\n            if (!isNaN(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;\\r\\n        }\\r\\n\\r\\n        chart.Draw();\\r\\n        chart.RequestData();\\r\\n\\r\\n        this.JSChartContainer=chart;\\r\\n        this.DivElement.JSChart=this;   //div中保存一份\\r\\n        this.JSChartContainer.Draw();\\r\\n    }\\r\\n\\r\\n    //创建工具条\\r\\n    this.CreateToolbar=function(option)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    //创建设置div窗口\\r\\n    this.CreateSettingDiv=function(option)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.Focus=function()\\r\\n    {\\r\\n        if (this.CanvasElement) this.CanvasElement.focus();\\r\\n    }\\r\\n\\r\\n    //切换股票代码接口\\r\\n    this.ChangeSymbol=function(symbol, option)\\r\\n    {\\r\\n        if (this.JSChartContainer) this.JSChartContainer.ChangeSymbol(symbol,option);\\r\\n    }\\r\\n\\r\\n    //K线切换指标\\r\\n    this.ChangeIndex=function(windowIndex,indexName,option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeIndex)=='function')\\r\\n            this.JSChartContainer.ChangeIndex(windowIndex,indexName,option);\\r\\n    }\\r\\n\\r\\n    this.AddIndexWindow=function(indexName,option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.AddIndexWindow)=='function')\\r\\n            this.JSChartContainer.AddIndexWindow(indexName,option);\\r\\n    }\\r\\n\\r\\n    this.RemoveIndexWindow=function(id)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.RemoveIndexWindow)=='function')\\r\\n            this.JSChartContainer.RemoveIndexWindow(id);\\r\\n    }\\r\\n\\r\\n    this.ChangeScriptIndex=function(windowIndex,indexData,option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeScriptIndex)=='function')\\r\\n            this.JSChartContainer.ChangeScriptIndex(windowIndex,indexData,option);\\r\\n    }\\r\\n\\r\\n    this.ChangePyScriptIndex=function(windowIndex, indexData)   //切换py指标\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangePyScriptIndex)=='function')\\r\\n            this.JSChartContainer.ChangePyScriptIndex(windowIndex,indexData);\\r\\n    }\\r\\n\\r\\n    this.GetIndexInfo=function()\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.GetIndexInfo)=='function')\\r\\n            return this.JSChartContainer.GetIndexInfo();\\r\\n        else\\r\\n            return [];\\r\\n    }\\r\\n\\r\\n    this.ChangeInstructionIndex=function(indexName)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeInstructionIndex)=='function')\\r\\n            this.JSChartContainer.ChangeInstructionIndex(indexName);\\r\\n    }\\r\\n\\r\\n    this.ChangeInstructionScriptIndex=function(indexData)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeInstructionIndex)=='function')\\r\\n            this.JSChartContainer.ChangeInstructionScriptIndex(indexData);\\r\\n    }\\r\\n\\r\\n    this.CancelInstructionIndex=function()\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.CancelInstructionIndex)=='function')\\r\\n            this.JSChartContainer.CancelInstructionIndex();\\r\\n    }\\r\\n\\r\\n    //K线周期切换\\r\\n    this.ChangePeriod=function(period, option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangePeriod)=='function')\\r\\n            this.JSChartContainer.ChangePeriod(period, option);\\r\\n    }\\r\\n\\r\\n    //K线复权切换\\r\\n    this.ChangeRight=function(right)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeRight)=='function')\\r\\n            this.JSChartContainer.ChangeRight(right);\\r\\n    }\\r\\n\\r\\n    //叠加股票\\r\\n    this.OverlaySymbol=function(symbol,option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.OverlaySymbol)=='function')\\r\\n            this.JSChartContainer.OverlaySymbol(symbol,option);\\r\\n    }\\r\\n\\r\\n    //删除一个叠加股票\\r\\n    this.DeleteOverlaySymbol=function(symbol)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.DeleteOverlaySymbol)=='function')\\r\\n            this.JSChartContainer.DeleteOverlaySymbol(symbol);\\r\\n    }\\r\\n\\r\\n    //设置当前屏的起始日期 { Date:起始日期(必填), Time:起始时间(分钟K线必填) PageSize:一屏显示的数据个数(可选)}\\r\\n    this.SetFirstShowDate=function(obj)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.SetFirstShowDate)=='function')\\r\\n            this.JSChartContainer.SetFirstShowDate(obj);\\r\\n    }\\r\\n\\r\\n    //K线切换类型 0=实心K线 1=收盘价线 2=美国线 3=空心K线 4=面积图\\r\\n    this.ChangeKLineDrawType=function(drawType, isDraw)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeKLineDrawType)=='function')\\r\\n            this.JSChartContainer.ChangeKLineDrawType(drawType,isDraw);\\r\\n    }\\r\\n\\r\\n    //指标窗口个数\\r\\n    this.ChangeIndexWindowCount = function(count, option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ChangeIndexWindowCount) == 'function')\\r\\n        {\\r\\n            this.JSChartContainer.ChangeIndexWindowCount(count,option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //取消叠加\\r\\n    this.ClearOverlaySymbol = function(){\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ClearOverlaySymbol) == 'function'){\\r\\n            this.JSChartContainer.ClearOverlaySymbol();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DeleteKLineInfo=function(infoName)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.DeleteKLineInfo) == 'function')\\r\\n        {\\r\\n            this.JSChartContainer.DeleteKLineInfo(infoName);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ClearKLineInfo=function()\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ClearKLineInfo) == 'function')\\r\\n        {\\r\\n            this.JSChartContainer.ClearKLineInfo();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.AddKLineInfo=function(infoName, bUpdate)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.AddKLineInfo) == 'function')\\r\\n        {\\r\\n            this.JSChartContainer.AddKLineInfo(infoName,bUpdate);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ChangMainDataControl=function(dataControl)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.SetMainDataConotrl)=='function')\\r\\n            this.JSChartContainer.SetMainDataConotrl(dataControl);\\r\\n    }\\r\\n\\r\\n    this.AddOverlayIndex=function(obj) //{WindowIndex:窗口ID, IndexName:指标ID, Identify:叠加指标ID(可选), API}\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.AddOverlayIndex)=='function')\\r\\n            this.JSChartContainer.AddOverlayIndex(obj);\\r\\n    }\\r\\n\\r\\n    this.MoveOverlayIndex=function(src, dest, option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.MoveOverlayIndex)=='function')\\r\\n            this.JSChartContainer.MoveOverlayIndex(src, dest, option);\\r\\n    }\\r\\n\\r\\n    this.MoveOverlayIndexToNewWindow=function(src, option)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.MoveOverlayIndexToNewWindow)=='function')\\r\\n            this.JSChartContainer.MoveOverlayIndexToNewWindow(src, option);\\r\\n    }\\r\\n\\r\\n    this.DeleteOverlayWindowsIndex=function(identify)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.DeleteOverlayWindowsIndex)=='function')\\r\\n            this.JSChartContainer.DeleteOverlayWindowsIndex(identify);\\r\\n    }\\r\\n\\r\\n    this.StopAutoUpdate=function()\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.StopAutoUpdate)=='function')\\r\\n            this.JSChartContainer.StopAutoUpdate();\\r\\n    }\\r\\n\\r\\n    this.ChartDestory=function()\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof (this.JSChartContainer.ChartDestory) == 'function')\\r\\n        {\\r\\n            this.JSChartContainer.ChartDestory();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //设置深度图数据 depthData=[ {ID:深度图ID, Data:数据},]   bDraw=是否立即重绘\\r\\n    this.SetDepthMapData=function(depthData, bDraw)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof(this.JSChartContainer.SetDepthMapData)=='function')\\r\\n            this.JSChartContainer.SetDepthMapData(depthData, bDraw);\\r\\n    }\\r\\n\\r\\n    //设置强制横屏\\r\\n    this.ForceLandscape=function(bForceLandscape)\\r\\n    {\\r\\n        if (this.JSChartContainer)\\r\\n        {\\r\\n            JSConsole.Chart.Log(\\\"[JSChart::ForceLandscape] bForceLandscape=\\\"+bForceLandscape);\\r\\n            this.JSChartContainer.IsForceLandscape=bForceLandscape;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //锁指标\\r\\n    this.LockIndex=function(lockData)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.LockIndex)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:LockIndex] lockData', lockData);\\r\\n            this.JSChartContainer.LockIndex(lockData);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //历史分钟数据 更改日期\\r\\n    this.ChangeTradeDate=function(tradeDate)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ChangeTradeDate)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:ChangeTradeDate] date', tradeDate);\\r\\n            this.JSChartContainer.ChangeTradeDate(tradeDate);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //多日走势图\\r\\n    this.ChangeDayCount=function(count)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ChangeDayCount)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:ChangeDayCount] count', count);\\r\\n            this.JSChartContainer.ChangeDayCount(count);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //集合竞价显示/隐藏\\r\\n    this.ShowCallAuctionData=function(obj, option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ShowCallAuctionData)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:ShowCallAuctionData] obj, option ', obj, option);\\r\\n            this.JSChartContainer.ShowCallAuctionData(obj, option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //返回弹幕数据类\\r\\n    this.StartAnimation=function(option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.StartAnimation)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:StartAnimation] start.');\\r\\n            return this.JSChartContainer.StartAnimation(option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.StopAnimation=function()\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.StopAnimation)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:StopAnimation] start.');\\r\\n            return this.JSChartContainer.StopAnimation();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SaveToImage = function (format,colorGB)    //format=保存的文件格式,  colorGB=背景色\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof (this.JSChartContainer.SaveToImage) == 'function')\\r\\n            return this.JSChartContainer.SaveToImage(format,colorGB);\\r\\n    }\\r\\n\\r\\n    this.SaveToImageUrl=function(obj, callback)\\r\\n    {\\r\\n        if (this.JSChartContainer && typeof (this.JSChartContainer.SaveToImageUrl) == 'function')\\r\\n            return this.JSChartContainer.SaveToImageUrl(obj, callback);\\r\\n    }\\r\\n\\r\\n    //事件回调\\r\\n    this.AddEventCallback=function(obj)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.AddEventCallback)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:AddEventCallback] ', obj);\\r\\n            this.JSChartContainer.AddEventCallback(obj);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //设置语言 'EN', 'CN'\\r\\n    this.SetLanguage=function(language)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.SetLanguage)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:SetLanguage] ', language);\\r\\n            this.JSChartContainer.SetLanguage(language);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //切换指标模板\\r\\n    this.ChangeIndexTemplate=function(option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ChangeIndexTemplate)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:ChangeIndexTemplate] ', option);\\r\\n            this.JSChartContainer.ChangeIndexTemplate(option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画图工具\\r\\n    this.SetChartDrawOption=function(option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.SetChartDrawOption)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:SetChartDrawOption] ', option);\\r\\n            this.JSChartContainer.SetChartDrawOption(option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateChartDrawPicture=function(name,option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.CreateChartDrawPicture)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:CreateChartDrawPicture] ', name);\\r\\n            this.JSChartContainer.CreateChartDrawPicture(name,option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.AddChartDrawPicture=function(obj)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.AddChartDrawPicture)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:AddChartDrawPicture] ', obj);\\r\\n            this.JSChartContainer.AddChartDrawPicture(obj);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //删除画图工具\\r\\n    this.ClearChartDrawPicture=function(drawPicture)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ClearChartDrawPicture)=='function')\\r\\n        {\\r\\n            //JSConsole.Chart.Log('[JSChart:ClearChartDrawPicture] ', drawPicture);\\r\\n            this.JSChartContainer.ClearChartDrawPicture(drawPicture);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //重新加载配置\\r\\n    this.ReloadResource=function(option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.ReloadResource)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:ReloadResource] ');\\r\\n            this.JSChartContainer.ReloadResource(option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.EnableSplashScreen=function(option)\\r\\n    {\\r\\n        if(this.JSChartContainer && typeof(this.JSChartContainer.EnableSplashScreen)=='function')\\r\\n        {\\r\\n            JSConsole.Chart.Log('[JSChart:EnableSplashScreen] ');\\r\\n            this.JSChartContainer.EnableSplashScreen(option);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nJSChart.LastVersion=null;   //最新的版本号\\r\\n\\r\\n//初始化\\r\\nJSChart.Init=function(divElement)\\r\\n{\\r\\n    var jsChartControl=new JSChart(divElement);\\r\\n    jsChartControl.OnSize();\\r\\n\\r\\n    return jsChartControl;\\r\\n}\\r\\n\\r\\nJSChart.SetDomain=function(domain,cacheDomain)\\r\\n{\\r\\n    if (domain) g_JSChartResource.Domain=domain;\\r\\n    if (cacheDomain) g_JSChartResource.CacheDomain=cacheDomain;\\r\\n}\\r\\n\\r\\nJSChart.SetPyIndexDomain=function(domain)   //设置py指标计算api域名\\r\\n{\\r\\n    if  (domain) g_JSChartResource.PyIndexDomain=domain;\\r\\n}\\r\\n\\r\\n//自定义风格\\r\\nJSChart.SetStyle=function(option)\\r\\n{\\r\\n    if (option) g_JSChartResource.SetStyle(option);\\r\\n}\\r\\n\\r\\n//value { EN:'', CH:'' }\\r\\nJSChart.SetTextResource=function(key,value)\\r\\n{\\r\\n    g_JSChartLocalization.SetTextResource(key,value);\\r\\n}\\r\\n\\r\\n//获取本地化资源\\r\\nJSChart.GetLocalization=function()\\r\\n{\\r\\n    return g_JSChartLocalization;\\r\\n}\\r\\n\\r\\n//获取设备分辨率比\\r\\nJSChart.GetDevicePixelRatio=function()\\r\\n{\\r\\n    return GetDevicePixelRatio();\\r\\n}\\r\\n\\r\\nJSChart.CreateGuid=function()\\r\\n{\\r\\n    return Guid();\\r\\n}\\r\\n\\r\\nJSChart.GetResource=function()  //获取颜色配置 (设置配必须啊在JSChart.Init()之前)\\r\\n{\\r\\n    return g_JSChartResource;\\r\\n}\\r\\n\\r\\nJSChart.GetMinuteTimeStringData=function()\\r\\n{\\r\\n    return g_MinuteTimeStringData;\\r\\n}\\r\\n\\r\\nJSChart.GetMinuteCoordinateData=function()\\r\\n{\\r\\n    return g_MinuteCoordinateData;\\r\\n}\\r\\n\\r\\nJSChart.GetKLineZoom=function() //K线缩放配置\\r\\n{\\r\\n    return ZOOM_SEED;\\r\\n}\\r\\n\\r\\nJSChart.GetDivTooltipDataFormat=function()  //div tooltip数据格式化\\r\\n{\\r\\n    return g_DivTooltipDataForamt;\\r\\n}\\r\\n\\r\\nJSChart.SetUSATimeType=function(type)    //设置 0=标准时间 1=夏令时间 3=美国时间\\r\\n{\\r\\n    g_NYMEXTimeData.TimeType=type;\\r\\n    g_COMEXTimeData.TimeType=type;\\r\\n    g_NYBOTTimeData.TimeType=type;\\r\\n    g_CBOTTimeData.TimeType=type;\\r\\n}\\r\\n\\r\\nJSChart.GetChinaFuturesTimeData=function()  //获取国内期货交易时间配置\\r\\n{\\r\\n    return g_FuturesTimeData;\\r\\n}\\r\\n\\r\\nJSChart.AddPeriodCallback=function(obj)     //添加自定义周期方法 { Period:周期ID, Callback:回调 }\\r\\n{\\r\\n    g_DataPlus.AddPeriodCallback(obj);\\r\\n}\\r\\n\\r\\nJSChart.RemovePeriodCallback=function(obj) //添加自定义周期方法 { Period:周期ID, }\\r\\n{\\r\\n    g_DataPlus.RemovePeriodCallback(obj);\\r\\n}\\r\\n\\r\\n//注册一个新的画图工具 {Name:中文名字, ClassName:类名, Create:function()}\\r\\nJSChart.RegisterDrawPicture=function(obj)\\r\\n{\\r\\n    return IChartDrawPicture.RegisterDrawPicture(obj);\\r\\n}\\r\\n\\r\\n//注册一个新图标 {Name:, Text: , Color:, Family:}\\r\\nJSChart.RegisterDrawPictureIonFont=function(obj)\\r\\n{\\r\\n    return IChartDrawPicture.RegisterIonFont(obj);\\r\\n}\\r\\n\\r\\nJSChart.GetInternalTimeData=function(name)  //内置品种交易时间\\r\\n{\\r\\n    switch(name)\\r\\n    {\\r\\n        case \\\"NYMEXTimeData\\\":\\r\\n            return g_NYMEXTimeData;\\r\\n        case \\\"COMEXTimeData\\\":\\r\\n            return g_COMEXTimeData;\\r\\n        case \\\"NYBOTTimeData\\\":\\r\\n            return g_NYBOTTimeData;\\r\\n        case \\\"CBOTTimeData\\\":\\r\\n            return g_CBOTTimeData;\\r\\n        case \\\"LMETimeData\\\":\\r\\n            return g_LMETimeData;\\r\\n        case \\\"FuturesTimeData\\\":\\r\\n            return g_FuturesTimeData;\\r\\n        case \\\"TOCOMTimeData\\\":   //东京商品交易所（TOCOM\\r\\n            return g_TOCOMTimeData;\\r\\n        case \\\"IPETimeData\\\":\\r\\n            return g_IPETimeData;   //美国洲际交易所\\r\\n        default:\\r\\n            return null;\\r\\n    }\\r\\n}\\r\\n\\r\\nJSChart.RegisterExtendChartClass=function(name, option)\\r\\n{\\r\\n    g_ExtendChartPaintFactory.Add(name,option);\\r\\n}\\r\\n\\r\\nvar JSCHART_EVENT_ID=\\r\\n    {\\r\\n        RECV_KLINE_MATCH:1, //接收到形态匹配\\r\\n        RECV_INDEX_DATA:2,  //接收指标数据\\r\\n        RECV_HISTROY_DATA:3,//接收到历史数据\\r\\n        RECV_TRAIN_MOVE_STEP:4, //接收K线训练,移动一次K线\\r\\n        CHART_STATUS:5,          //每次Draw() 以后会调用\\r\\n        BARRAGE_PLAY_END:6,      //单个弹幕播放完成\\r\\n        RECV_OVERLAY_INDEX_DATA:7,//接收叠加指标数据\\r\\n        DBCLICK_KLINE:8,            //双击K线图\\r\\n        RECV_START_AUTOUPDATE:9,    //开始自动更新\\r\\n        RECV_STOP_AUTOUPDATE:10,    //停止自动更新\\r\\n        ON_CONTEXT_MENU:11,         //右键菜单事件\\r\\n        ON_TITLE_DRAW:12,           //标题信息绘制事件\\r\\n        ON_SELECT_RECT:13,          //区间选择事件通知\\r\\n        RECV_MINUTE_DATA:14,        //分时图数据到达\\r\\n        ON_CLICK_INDEXTITLE:15,     //点击指标标题事件\\r\\n        RECV_KLINE_UPDATE_DATA:16,   //K线日,分钟更新数据到达\\r\\n        ON_CLICK_DRAWPICTURE:17,    //点击画图工具\\r\\n        ON_FINISH_DRAWPICTURE:18,    //完成画图工具\\r\\n        ON_INDEXTITLE_DRAW:19,       //指标标题重绘事件\\r\\n        ON_CUSTOM_VERTICAL_DRAW:20,  //自定义X轴绘制事件\\r\\n        RECV_KLINE_MANUAL_UPDATE_DATA:21,   //手动更新K线事件\\r\\n        ON_ENABLE_SPLASH_DRAW:22,           //开启/关闭过场动画事件\\r\\n\\r\\n        ON_CLICK_CHART_PAINT:23,            //点击图形\\r\\n\\r\\n        ON_DRAW_MINUTE_LAST_POINT:24,        //分时图绘制回调事件, 返回最后一个点的坐标\\r\\n        ON_DRAW_DEPTH_TOOLTIP:25,            //绘制深度图tooltip事件\\r\\n        ON_CLICK:26,                         //点击事件\\r\\n        ON_PHONE_TOUCH:27,                   //手势点击事件 包含 TouchStart 和 TouchEnd\\r\\n\\r\\n        ON_CLICKUP_CHART_PAINT:28,           //点击图形鼠标抬起\\r\\n\\r\\n        ON_SPLIT_YCOORDINATE:29,             //分割Y轴及格式化刻度文字\\r\\n        ON_DBCLICK:30,\\r\\n        ON_SPLIT_XCOORDINATE:31,             //分割X轴及格式化刻度文字\\r\\n\\r\\n        ON_KEYDOWN_SELECT_RECT:32,           //键盘空格区间选择完成事件\\r\\n        ON_DRAG_SELECT_RECT:33,              //区间选择区域变动\\r\\n        ON_DRAG_SELECT_RECT_MOUSEUP:34,      //区间选择区域变动鼠标松开\\r\\n\\r\\n        ON_DRAW_KLINE_LAST_POINT:35,          //K线图绘制回调事件,返回最后一个点的坐标\\r\\n        ON_CLICK_CROSSCURSOR_RIGHT:36         //十字光标右边按钮\\r\\n    }\\r\\n\\r\\nvar JSCHART_OPERATOR_ID=\\r\\n    {\\r\\n        OP_SCROLL_LEFT:1,   //往左移动\\r\\n        OP_SCROLL_RIGHT:2,  //往右移动\\r\\n        OP_ZOOM_OUT:3,  //缩小\\r\\n        OP_ZOOM_IN:4,   //放大\\r\\n        OP_GOTO_HOME:5, //最新一天数据\\r\\n        OP_GOTO_END:6,  //第1天的数据\\r\\n\\r\\n        OP_LEFT_ZOOM_OUT:7,   //左边缩小\\r\\n        OP_LEFT_ZOOM_IN:8,    //左右放大\\r\\n\\r\\n        OP_RIGHT_ZOOM_OUT:9,  //右边缩小\\r\\n        OP_RIGHT_ZOOM_IN:10,  //右边放大\\r\\n    }\\r\\n\\r\\nvar JSCHART_DRAG_ID=\\r\\n    {\\r\\n        DISABLE_DRAG_ID:0,\\r\\n        CLICK_TOUCH_MODE_ID:3   //长按十字光标显示保留/点击十字光标消失 (使用TouchStatus)\\r\\n    }\\r\\n\\r\\nvar JSCHART_BUTTON_ID=\\r\\n    {\\r\\n        CLOSE_BEFOREOPEN_ID:1,  //关闭集合竞价\\r\\n    }\\r\\n\\r\\n\\r\\nfunction PhoneDBClick()\\r\\n{\\r\\n    this.Start=[];\\r\\n\\r\\n    this.Clear=function()\\r\\n    {\\r\\n        this.Start=[];\\r\\n    }\\r\\n\\r\\n    this.AddTouchStart=function(x, y, time)\\r\\n    {\\r\\n        if (this.Start.length>0)\\r\\n        {\\r\\n            var item=this.Start[this.Start.length-1];\\r\\n            var spanTime=time-item.Time;\\r\\n            if (spanTime>0 && spanTime<300)\\r\\n            {\\r\\n                this.Start.push({ X:x, Y:y, Time:time });\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Start=[];\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Start.push({ X:x, Y:y, Time:time });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.IsVaildDBClick=function()\\r\\n    {\\r\\n        if (this.Start.length==2) return true;\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.AddTouchEnd=function(time)\\r\\n    {\\r\\n        if (this.Start.length<=0) return;\\r\\n\\r\\n        var item=this.Start[this.Start.length-1];\\r\\n        var spanTime=time-item.Time;\\r\\n        if (spanTime>=0 && spanTime<150)\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Start=[];\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    图形控件\\r\\n*/\\r\\nfunction JSChartContainer(uielement, OffscreenElement)\\r\\n{\\r\\n    this.ClassName='JSChartContainer';\\r\\n    var _self = this;\\r\\n    this.Frame;                                     //框架画法\\r\\n    this.ChartPaint=new Array();                    //图形画法\\r\\n    this.ChartPaintEx=[];                           //图形扩展画法\\r\\n    this.ChartInfo=new Array();                     //K线|走势图上信息地雷\\r\\n    this.ChartInfoPaint;                            //信息地理\\r\\n    this.ExtendChartPaint=new Array();              //扩展画法\\r\\n    this.TitlePaint=new Array();                    //标题画法\\r\\n    this.OverlayChartPaint=new Array();             //叠加信息画法\\r\\n    this.ChartDrawPicture=new Array();              //画图工具\\r\\n    this.ChartDrawStorage;                          //画图工具保存\\r\\n    this.ChartDrawOption={ IsLockScreen:false, Zoom:5 };   //画图工具设置 { IsLockScreen://是否锁住屏幕, Zoom: //线段|点放大倍数 }\\r\\n    this.CurrentChartDrawPicture=null;              //当前的画图工具\\r\\n    this.SelectChartDrawPicture=null;               //当前选中的画图\\r\\n    this.EnableShowCorssCursor={ DrawPicture:true };  //DrawPicture=画图是否显示十字光标\\r\\n    this.ChartPictureMenu;                          //画图工具 单个图形设置菜单\\r\\n    this.ChartCorssCursor;                          //十字光标\\r\\n    this.IsClickShowCorssCursor=false;              //手势点击显示十字光标\\r\\n    this.ChartSplashPaint=null;                     //等待提示\\r\\n    this.LoadDataSplashTitle=\\\"数据加载中\\\";           //下载数据提示信息\\r\\n    if (OffscreenElement)\\r\\n    {\\r\\n        this.Canvas=OffscreenElement.getContext(\\\"2d\\\");\\r\\n        this.OffscreenCanvasElement=OffscreenElement;\\r\\n\\r\\n        this.ShowCanvas=uielement.getContext(\\\"2d\\\");\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        this.Canvas=uielement.getContext(\\\"2d\\\");         //画布\\r\\n        this.ShowCanvas=null;\\r\\n    }\\r\\n\\r\\n    this.UIElement=uielement;\\r\\n    this.MouseDrag;\\r\\n    this.PhoneTouchInfo;    //手机手势信息\\r\\n    this.DragMode=1;                                //拖拽模式 0 禁止拖拽 1 数据拖拽 2 区间选择 3(CLICK_TOUCH_MODE_ID)=长按十字光标显示保留/点击十字光标消失 (使用TouchStatus)\\r\\n    this.EnableBorderDrag=true;                     //是否可以拖拽边框调整指标框高度\\r\\n    this.BorderDrag;    //{ Index:, }\\r\\n    this.YDrag;         //{Index: }                 //y轴拖拽放大缩小\\r\\n    this.TouchStatus={ CorssCursorShow:false },     //十字光标是否显示\\r\\n        this.DragTimer;\\r\\n    this.EnableScrollUpDown=false;                  //是否可以上下滚动图形(手机端才有)\\r\\n    this.ClickChartTimer=null;                      //点击图形定时器,解决双击和单击K线事件\\r\\n\\r\\n    this.CursorIndex=0;             //十字光标X轴索引\\r\\n    this.LastPoint=new Point();     //鼠标位置\\r\\n    this.IsForceLandscape=false;    //是否强制横屏\\r\\n    this.CorssCursorTouchEnd = false;   //手离开屏幕自动隐藏十字光标\\r\\n    this.IsTitleShowLatestData=false;     //十字/手势不在K线图上,标题显示最新一个数据\\r\\n    this.StepPixel=4;                   //移动一个数据需要的像素 0=自动模式(根据K线宽度+间距)\\r\\n    this.ZoomStepPixel=5;               //放大缩小手势需要的最小像素\\r\\n    this.TouchMoveMinAngle=70;          //左右移动最小角度\\r\\n    this.EnableAnimation=false;         //是否开启动画\\r\\n\\r\\n    //tooltip提示信息\\r\\n    this.Tooltip=document.createElement(\\\"div\\\");\\r\\n    this.Tooltip.className='jschart-tooltip';\\r\\n    this.Tooltip.style.background=g_JSChartResource.TooltipBGColor;\\r\\n    this.Tooltip.style.opacity=g_JSChartResource.TooltipAlpha;\\r\\n    this.Tooltip.style[\\\"pointer-events\\\"]=\\\"none\\\";\\r\\n    this.Tooltip.id=Guid();\\r\\n    uielement.parentNode.appendChild(this.Tooltip);\\r\\n    this.IsShowTooltip=true;    //是否显示K线tooltip\\r\\n\\r\\n    //区间选择\\r\\n    this.SelectRect=document.createElement(\\\"div\\\");\\r\\n    this.SelectRect.className=\\\"jschart-selectrect\\\";\\r\\n    this.SelectRect.style.background=g_JSChartResource.SelectRectBGColor;\\r\\n    this.SelectRect.style[\\\"pointer-events\\\"]=\\\"none\\\";\\r\\n    //this.SelectRect.style.opacity=g_JSChartResource.SelectRectAlpha;\\r\\n    this.SelectRect.id=Guid();\\r\\n    this.SelectRect.oncontextmenu=function() { return false; }; //屏蔽选中区域系统右键菜单\\r\\n    uielement.parentNode.appendChild(this.SelectRect);\\r\\n\\r\\n    //区间选择右键菜单\\r\\n    this.SelectRectRightMenu;\\r\\n\\r\\n    //坐标轴风格方法 double-更加数值型分割  price-更加股票价格分割\\r\\n    this.FrameSplitData=new Map();\\r\\n    this.FrameSplitData.set(\\\"double\\\",new SplitData());\\r\\n    this.FrameSplitData.set(\\\"price\\\",new PriceSplitData());\\r\\n\\r\\n    //事件回调\\r\\n    this.mapEvent=new Map();   //通知外部调用 key:JSCHART_EVENT_ID value:{Callback:回调,}\\r\\n\\r\\n    this.IsOnTouch = false;     //是否再操作数据\\r\\n    this.TouchDrawCount = 0;    //手势绘制次数\\r\\n    this.DisableMouse=false;    //禁止鼠标事件\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.PressTime=500;\\r\\n\\r\\n    this.NetworkFilter;         //网络请求回调 function(data, callback);\\r\\n    this.LastMouseStatus={ }\\r\\n    this.ClickDownPoint;         //鼠标点击坐标 {X, Y}, 鼠标放开以后清空为null\\r\\n    this.IsDestroy=false;        //是否已经销毁了\\r\\n\\r\\n    this.EnableYDrag={ Left:false, Right:false };   //是否可以拖拽Y轴,放大缩小Y轴最大最小值\\r\\n    this.EnableZoomIndexWindow=false;               //是否支持双击缩放附图窗口\\r\\n\\r\\n    this.PhoneDBClick=new PhoneDBClick();\\r\\n\\r\\n    this.ChartDestory=function()    //销毁\\r\\n    {\\r\\n        this.IsDestroy=true;\\r\\n        this.StopAutoUpdate();\\r\\n\\r\\n        if (this.GetLatestVersionTimer!=null)\\r\\n        {\\r\\n            clearTimeout(this.GetLatestVersionTimer);\\r\\n            this.GetLatestVersionTimer=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetLatestVersionTimer=null;    //获取最新版本\\r\\n    this.GetLatestVersion=function()\\r\\n    {\\r\\n        if (this.GetLatestVersionTimer!=null)\\r\\n        {\\r\\n            clearTimeout(this.GetLatestVersionTimer);\\r\\n            this.GetLatestVersionTimer=null;\\r\\n        }\\r\\n\\r\\n        var roundeTime=Math.floor(Math.random()*50);\\r\\n        var waittimer=1000*60*3+(roundeTime*1000);\\r\\n        var value=\\\"aHR0cHM6Ly9ocWNoYXJ0LnplYWxpbmsuY29tL2FwaS9HZXRWZXJzaW9u\\\";\\r\\n        JSConsole.Chart.Log(\\\"[JSChartContainer::GetLatestVersion] wait for get hqchart latest version. \\\",waittimer);\\r\\n        this.GetLatestVersionTimer = setTimeout(()=>\\r\\n        {\\r\\n            var width=0, height=0;\\r\\n            if (this.Frame && this.Frame.ChartBorder)\\r\\n            {\\r\\n                width=this.Frame.ChartBorder.GetChartWidth();\\r\\n                height=this.Frame.ChartBorder.GetChartHeight();\\r\\n            }\\r\\n\\r\\n            var url=`${atob(value)}?width=${width}&height=${height}&type=h5`;\\r\\n\\r\\n            if (JSChart.LastVersion!=null) return;  //只请求一次\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: url,\\r\\n                type:\\\"get\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success:function(data)\\r\\n                {\\r\\n                    JSConsole.Chart.Log(\\\"[JSChartContainer::GetLatestVersion] hqchart latest version. \\\",data);\\r\\n                    JSChart.LastVersion=data;\\r\\n                },\\r\\n                error:function(request, textStatus, errorThrown)\\r\\n                {\\r\\n                    JSConsole.Chart.Log(\\\"[JSChartContainer::GetLatestVersion] Get HQChart latest version failed.\\\", request);\\r\\n                }\\r\\n            });\\r\\n        }, waittimer);\\r\\n    }\\r\\n\\r\\n    //设置事件回调\\r\\n    //{event:事件id, callback:回调函数}\\r\\n    this.AddEventCallback=function(object)\\r\\n    {\\r\\n        if (!object || !object.event || !object.callback) return;\\r\\n\\r\\n        var data={Callback:object.callback, Source:object};\\r\\n        this.mapEvent.set(object.event,data);\\r\\n    }\\r\\n\\r\\n    this.RemoveEventCallback=function(eventid)\\r\\n    {\\r\\n        if (!this.mapEvent.has(eventid)) return;\\r\\n\\r\\n        this.mapEvent.delete(eventid);\\r\\n    }\\r\\n\\r\\n    this.GetEventCallback=function(id)  //获取事件回调\\r\\n    {\\r\\n        if (!this.mapEvent.has(id)) return null;\\r\\n        var item=this.mapEvent.get(id);\\r\\n        return item;\\r\\n    }\\r\\n\\r\\n    //接收指标数据\\r\\n    this.GetIndexEvent=function()\\r\\n    {\\r\\n        return this.GetEventCallback(JSCHART_EVENT_ID.RECV_INDEX_DATA);\\r\\n    }\\r\\n\\r\\n    this.GetOverlayIndexEvent=function()\\r\\n    {\\r\\n        return this.GetEventCallback(JSCHART_EVENT_ID.RECV_OVERLAY_INDEX_DATA);\\r\\n    }\\r\\n\\r\\n    //鼠标事件绑定\\r\\n    uielement.onmousemove=(e)=>{ this.UIOnMouseMove(e);}\\r\\n    uielement.oncontextmenu=(e)=> { return this.UIOnContextMenu(e); }\\r\\n    uielement.ondblclick=(e)=>{ this.UIOnDblClick(e); }\\r\\n    uielement.onmousedown=(e)=> { this.UIOnMouseDown(e); }\\r\\n    uielement.onmouseout=(e)=>{ this.UIOnMounseOut(e); }\\r\\n    uielement.onmouseleave=(e)=>{ this.UIOnMouseleave(e); }\\r\\n\\r\\n    this.UIOnMouseMove=function(e)\\r\\n    {\\r\\n        //JSConsole.Chart.Log('[JSChartContainer.UIOnMouseMove] e.clientX, e.clientY, left, top ',e.clientX, e.clientY, this.getBoundingClientRect().left,this.getBoundingClientRect().top);\\r\\n        var pixelTatio = GetDevicePixelRatio(); //鼠标移动坐标是原始坐标 需要乘以放大倍速\\r\\n        var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;\\r\\n\\r\\n        //加载数据中,禁用鼠标事件\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n        if (this.DisableMouse==true) return;\\r\\n        if (this.BorderDrag) return;\\r\\n        if (this.YDrag) return;\\r\\n\\r\\n        //保存最后一次鼠标移动信息\\r\\n        var MoveStatus={ X:x, Y:y, IsInClient: this.IsMouseOnClient(x,y) };\\r\\n        this.LastMouseStatus.OnMouseMove=MoveStatus;\\r\\n        //JSConsole.Chart.Log(\\\"[JSChartContainer::UIOnMouseMove] MoveStatus\\\", MoveStatus);\\r\\n\\r\\n        this.OnMouseMove(x,y,e);\\r\\n    }\\r\\n\\r\\n    this.IsMouseOnClient=function(x,y)\\r\\n    {\\r\\n        var isInClient=false;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());\\r\\n        isInClient=this.Canvas.isPointInPath(x,y);\\r\\n        return isInClient;\\r\\n    }\\r\\n\\r\\n    this.UIOnContextMenu=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var x = e.clientX-this.UIElement.getBoundingClientRect().left;\\r\\n        var y = e.clientY-this.UIElement.getBoundingClientRect().top;\\r\\n\\r\\n        if(typeof(this.OnRightMenu)=='function') this.OnRightMenu(x,y,e);   //右键菜单事件\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.UIOnDblClick=function(e)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;\\r\\n        this.OnDoubleClick(x,y,e);\\r\\n    }\\r\\n\\r\\n    //是否在拖拽Y轴上\\r\\n    this.TryYDrag=function(x,y)\\r\\n    {\\r\\n        if (!this.EnableYDrag) return null;\\r\\n        if (!this.EnableYDrag.Left && !this.EnableYDrag.Right) return null;\\r\\n        if (!this.Frame || !this.Frame.PtInFrameY) return null;\\r\\n\\r\\n        var dragY=this.Frame.PtInFrameY(x,y);\\r\\n        if (!dragY || dragY.Index<0) return null;\\r\\n\\r\\n        if (dragY.Left && this.EnableYDrag.Left && this.Frame.IsEnableDragY(dragY.Index))\\r\\n        {\\r\\n            return dragY;\\r\\n        }\\r\\n\\r\\n        if (dragY.Right && this.EnableYDrag.Right && this.Frame.IsEnableDragY(dragY.Index))\\r\\n        {\\r\\n            return dragY;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    //是否可以上下拖拽\\r\\n    this.TryUpDownDrag=function(x,y)\\r\\n    {\\r\\n        var windowIndex=this.Frame.PtInFrame(x,y);\\r\\n        if (windowIndex<0) return null;\\r\\n\\r\\n        var item=this.Frame.SubFrame[windowIndex];\\r\\n        if (!item || !item.Frame) return null;\\r\\n\\r\\n        var frame=item.Frame;\\r\\n        if (!frame.YSplitOperator || !frame.YSplitOperator.FixedYMaxMin) return null;\\r\\n\\r\\n        return { Index:windowIndex, X:x, Y:y };\\r\\n    }\\r\\n\\r\\n    this.TryRectSelectDrag=function(x,y)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return null;\\r\\n        if (paint.GetPointCount()<=0) return null;\\r\\n\\r\\n        var item=paint.PtInPaint(x,y);\\r\\n\\r\\n        return { Item:item, X:x, Y:y };\\r\\n    }\\r\\n\\r\\n    this.TryClickCrossCursor=function(x,y,e)\\r\\n    {\\r\\n        if (!this.ChartCorssCursor) return;\\r\\n\\r\\n        var button=this.ChartCorssCursor.PtInButton(x,y);\\r\\n        if (!button) return false;\\r\\n\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_CROSSCURSOR_RIGHT);\\r\\n        if (event && event.Callback)\\r\\n        {\\r\\n            var sendData={ Button:button, e };\\r\\n            event.Callback(event,sendData,this);\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.UIOnMouseDown=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        this.ClickDownPoint={ X:e.clientX, Y:e.clientY };\\r\\n        this.IsOnTouch=true;\\r\\n        this.BorderDrag=null;\\r\\n        this.YDrag=null;\\r\\n        this.UpDownDrag=null;\\r\\n        this.RectSelectDrag=null;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;\\r\\n\\r\\n        var button=this.Frame.PtInButtons(x,y);\\r\\n        if (button && this.ClickFrameButton)\\r\\n        {\\r\\n            this.ClickFrameButton(button);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.TryClickCrossCursor(x,y, e))\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.TryClickLock)\\r\\n        {\\r\\n            //JSConsole.Chart.Log('[uielement.onmousedown] left, top ',e.clientX, e.clientY, this.getBoundingClientRect().left,this.getBoundingClientRect().top);\\r\\n            if (this.TryClickLock(x,y)) return;\\r\\n        }\\r\\n\\r\\n        this.HideSelectRect();\\r\\n        if (this.SelectRectRightMenu) this.SelectRectRightMenu.Hide();\\r\\n        if (this.ChartPictureMenu) this.ChartPictureMenu.Hide();\\r\\n\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (paint && paint.GetPointCount()>0)\\r\\n        {\\r\\n            var item=paint.PtInPaint(x,y);\\r\\n            if (item)\\r\\n            {\\r\\n                this.UIElement.style.cursor=\\\"ew-resize\\\";\\r\\n                this.RectSelectDrag={ Index:item.PointIndex };\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::UIOnMouseDown] drag rect select \\\",item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!this.RectSelectDrag && this.ClearRectSelect(false)) this.Draw();\\r\\n\\r\\n        if (this.EnableBorderDrag && this.Frame)\\r\\n        {\\r\\n            var dragBorder=this.Frame.PtInFrameBorder(x,y);\\r\\n            if (dragBorder && dragBorder.Index>=0)\\r\\n            {\\r\\n                this.UIElement.style.cursor=\\\"n-resize\\\";\\r\\n                this.BorderDrag={ Index:dragBorder.Index };\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::UIOnMouseDown] DragBorder \\\",dragBorder);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //拖拽Y轴缩放\\r\\n        if (!this.BorderDrag)\\r\\n        {\\r\\n            var dragY=this.TryYDrag(x,y);\\r\\n            if (dragY)\\r\\n            {\\r\\n                this.UIElement.style.cursor=dragY.Position==0 ? \\\"n-resize\\\":\\\"row-resize\\\";\\r\\n                this.YDrag=dragY;\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::UIOnMouseDown] dragY \\\",dragY);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var dragUpDown=this.TryUpDownDrag(x,y);\\r\\n                if (dragUpDown)\\r\\n                {\\r\\n                    this.UIElement.style.cursor=\\\"pointer\\\";\\r\\n                    this.UpDownDrag=dragUpDown;\\r\\n                    JSConsole.Chart.Log(\\\"[JSChartContainer::UIOnMouseDown] dragUpDown \\\",dragUpDown);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if(this.DragMode==0) return;\\r\\n\\r\\n        var drag=\\r\\n            {\\r\\n                \\\"Click\\\":{},\\r\\n                \\\"LastMove\\\":{}  //最后移动的位置\\r\\n            };\\r\\n\\r\\n        drag.Click.X=e.clientX;\\r\\n        drag.Click.Y=e.clientY;\\r\\n        drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y);   //是否点击在X轴上\\r\\n        drag.LastMove.X=e.clientX;\\r\\n        drag.LastMove.Y=e.clientY;\\r\\n\\r\\n        this.MouseDrag=drag;\\r\\n        this.SelectChartDrawPicture=null;\\r\\n\\r\\n        if (this.BorderDrag)\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else if (this.YDrag || this.UpDownDrag || this.RectSelectDrag)\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else if (this.CurrentChartDrawPicture)  //画图工具模式\\r\\n        {\\r\\n            var drawPicture=this.CurrentChartDrawPicture;\\r\\n            if (drawPicture.Status==2)\\r\\n                this.SetChartDrawPictureThirdPoint(drag.Click.X,drag.Click.Y);\\r\\n            else\\r\\n            {\\r\\n                this.SetChartDrawPictureFirstPoint(drag.Click.X,drag.Click.Y);\\r\\n                //只有1个点 直接完成\\r\\n                if (this.FinishChartDrawPicturePoint()) this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n        else    //是否在画图工具上\\r\\n        {\\r\\n            var drawPictrueData={};\\r\\n            drawPictrueData.X=(e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;\\r\\n            drawPictrueData.Y=(e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;\\r\\n            if (this.GetChartDrawPictureByPoint(drawPictrueData))\\r\\n            {\\r\\n                if (drawPictrueData.ChartDrawPicture.EnableMove==true)\\r\\n                {\\r\\n                    drawPictrueData.ChartDrawPicture.Status=20;\\r\\n                    drawPictrueData.ChartDrawPicture.ValueToPoint();\\r\\n                    drawPictrueData.ChartDrawPicture.MovePointIndex=drawPictrueData.PointIndex;\\r\\n                    this.CurrentChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                    this.SelectChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.CurrentChartDrawPicture=null;\\r\\n                    this.SelectChartDrawPicture=null;\\r\\n                }\\r\\n\\r\\n                var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_DRAWPICTURE); //选中画图工具事件\\r\\n                if (event && event.Callback)\\r\\n                {\\r\\n                    var sendData={ DrawPicture: drawPictrueData.ChartDrawPicture };\\r\\n                    event.Callback(event,sendData,this);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.OnSelectChartPicture(drawPictrueData.ChartDrawPicture);    //选中画图工具事件\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.ClickChartTimer!=null)\\r\\n                {\\r\\n                    clearTimeout(this.ClickChartTimer);\\r\\n                    this.ClickChartTimer=null;\\r\\n                }\\r\\n\\r\\n                var self=this;\\r\\n                var ptClick={ X:this.ClickDownPoint.X, Y:this.ClickDownPoint.Y };\\r\\n                this.ClickChartTimer = setTimeout(function()\\r\\n                {\\r\\n                    self.TryClickPaintEvent(JSCHART_EVENT_ID.ON_CLICK_CHART_PAINT,ptClick,e);\\r\\n                }, 250);\\r\\n\\r\\n            }\\r\\n        }\\r\\n\\r\\n        document.onmousemove=(e)=>{ this.DocOnMouseMove(e); }\\r\\n        document.onmouseup=(e)=> { this.DocOnMouseUp(e); }\\r\\n    }\\r\\n\\r\\n    this.DocOnMouseMove=function(e)\\r\\n    {\\r\\n        //加载数据中,禁用鼠标事件\\r\\n        if (this.ChartSplashPaint && this.IsEnableSplash == true) return;\\r\\n\\r\\n        var drag=this.MouseDrag;\\r\\n        if (!drag) return;\\r\\n\\r\\n        var moveSetp=Math.abs(drag.LastMove.X-e.clientX);\\r\\n        var moveSetpY=Math.abs(drag.LastMove.Y-e.clientY);\\r\\n        var isDragSelectRect=(this.RectSelectDrag && this.RectSelectDrag.Index>=0);\\r\\n\\r\\n        if (this.BorderDrag && this.BorderDrag.Index>=0)\\r\\n        {\\r\\n            if(Math.abs(drag.LastMove.Y-e.clientY)<5) return;\\r\\n\\r\\n            var yMove=e.clientY-drag.LastMove.Y;\\r\\n\\r\\n            this.OnMoveFromeBorder(this.BorderDrag.Index, yMove);\\r\\n\\r\\n            drag.LastMove.X=e.clientX;\\r\\n            drag.LastMove.Y=e.clientY;\\r\\n        }\\r\\n        else if (this.YDrag && this.YDrag.Index>=0)\\r\\n        {\\r\\n            if(moveSetpY<5) return;\\r\\n\\r\\n            var yMove=e.clientY-drag.LastMove.Y;\\r\\n\\r\\n            //this.UIElement.style.cursor=\\\"n-resize\\\";\\r\\n\\r\\n            JSConsole.Chart.Log(\\\"[JSChartContainer::DocOnMouseMove] YDrag \\\",this.YDrag,yMove);\\r\\n            this.OnZoomUpDownFrameY(this.YDrag, yMove);\\r\\n\\r\\n            drag.LastMove.X=e.clientX;\\r\\n            drag.LastMove.Y=e.clientY;\\r\\n        }\\r\\n        else if (this.CurrentChartDrawPicture)\\r\\n        {\\r\\n            var drawPicture=this.CurrentChartDrawPicture;\\r\\n            if (drawPicture.Status==1 || drawPicture.Status==2)\\r\\n            {\\r\\n                if(Math.abs(drag.LastMove.X-e.clientX)<5 && Math.abs(drag.LastMove.Y-e.clientY)<5) return;\\r\\n                if(this.SetChartDrawPictureSecondPoint(e.clientX,e.clientY))\\r\\n                {\\r\\n                    this.DrawDynamicInfo();\\r\\n                }\\r\\n            }\\r\\n            else if (drawPicture.Status==3)\\r\\n            {\\r\\n                if(this.SetChartDrawPictureThirdPoint(e.clientX,e.clientY))\\r\\n                {\\r\\n                    this.DrawDynamicInfo();\\r\\n                }\\r\\n            }\\r\\n            else if (drawPicture.Status==20)    //画图工具移动\\r\\n            {\\r\\n                if(Math.abs(drag.LastMove.X-e.clientX)<5 && Math.abs(drag.LastMove.Y-e.clientY)<5) return;\\r\\n\\r\\n                if(this.MoveChartDrawPicture(e.clientX-drag.LastMove.X,e.clientY-drag.LastMove.Y))\\r\\n                {\\r\\n                    this.DrawDynamicInfo();\\r\\n                }\\r\\n            }\\r\\n\\r\\n            drag.LastMove.X=e.clientX;\\r\\n            drag.LastMove.Y=e.clientY;\\r\\n        }\\r\\n        else if (this.DragMode==1 || isDragSelectRect)  //数据上下左右拖拽\\r\\n        {\\r\\n            this.OnDragMode_One({X:moveSetp, Y:moveSetpY}, e);\\r\\n        }\\r\\n        else if (this.DragMode==2) //区间选择\\r\\n        {\\r\\n            var yMoveSetp=Math.abs(drag.LastMove.Y-e.clientY);\\r\\n\\r\\n            if (moveSetp<5 && yMoveSetp<5) return;\\r\\n\\r\\n            this.UIElement.style.cursor=\\\"default\\\";\\r\\n\\r\\n            var x=drag.Click.X-uielement.getBoundingClientRect().left;\\r\\n            var y=drag.Click.Y-uielement.getBoundingClientRect().top;\\r\\n            var x2=e.clientX-uielement.getBoundingClientRect().left;\\r\\n            var y2=e.clientY-uielement.getBoundingClientRect().top;\\r\\n            this.ShowSelectRect(x,y,x2,y2);\\r\\n\\r\\n            drag.LastMove.X=e.clientX;\\r\\n            drag.LastMove.Y=e.clientY;\\r\\n\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnDragMode_One=function(moveData, e)\\r\\n    {\\r\\n        var moveSetp=moveData.X;\\r\\n        var moveSetpY=moveData.Y;\\r\\n        var drag=this.MouseDrag;\\r\\n\\r\\n        if (moveSetp<5 && moveSetpY<5) return;\\r\\n\\r\\n        var bNeedDraw=false;\\r\\n        var bUpDownY=false;\\r\\n        if (moveSetpY>=5)\\r\\n        {\\r\\n            if (this.UpDownDrag && this.UpDownDrag.Index>=0)\\r\\n            {\\r\\n                var yMove=e.clientY-drag.LastMove.Y;\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::OnDragMode_One] UpDownDrag \\\",this.UpDownDrag,yMove);\\r\\n                this.UIElement.style.cursor=\\\"pointer\\\";\\r\\n                if (this.OnUpDonwFrameY(this.UpDownDrag, yMove))\\r\\n                {\\r\\n                    bNeedDraw=true;\\r\\n                    bUpDownY=true;\\r\\n                }\\r\\n                drag.LastMove.Y=e.clientY;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (moveSetp>=5)\\r\\n        {\\r\\n            var isLeft=true;\\r\\n            if (drag.LastMove.X<e.clientX) isLeft=false;//右移数据\\r\\n            if (this.RectSelectDrag && this.RectSelectDrag.Index>=0)\\r\\n            {\\r\\n                var obj={ X:e.clientX, Y:e.clientY, PointIndex:this.RectSelectDrag.Index, Name:\\\"MoveRectSelectLine\\\" };\\r\\n                if (this.MoveRectSelectPoint(obj)) bNeedDraw=true;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var cursorStatus=\\\"pointer\\\";\\r\\n                if (drag.Click.IsInFrameBottom)  cursorStatus=\\\"ew-resize\\\";\\r\\n                var oneStepWidth=this.GetMoveOneStepWidth();\\r\\n                if (moveSetp<oneStepWidth)\\r\\n                {\\r\\n                    this.UIElement.style.cursor=cursorStatus;\\r\\n                    if (bNeedDraw) this.Draw();\\r\\n                    return;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (drag.Click && drag.Click.IsInFrameBottom)\\r\\n                    {\\r\\n\\r\\n                        if (this.XCoordinateZoom(moveSetp,isLeft))\\r\\n                        {\\r\\n                            this.UpdataDataoffset();\\r\\n                            this.UpdateFrameMaxMin();\\r\\n                            this.ResetFrameXYSplit();\\r\\n                            bNeedDraw=true;\\r\\n                        }\\r\\n                    }\\r\\n                    else if(this.DataMove(moveSetp,isLeft))\\r\\n                    {\\r\\n                        this.UpdataDataoffset();\\r\\n                        //this.UpdatePointByCursorIndex(); //推拽数据的时候不需要把鼠标位置更新到K线上\\r\\n                        this.UpdateFrameMaxMin();\\r\\n                        this.ResetFrameXYSplit();\\r\\n                        bNeedDraw=true;\\r\\n                    }\\r\\n                    else if (!bUpDownY)\\r\\n                    {\\r\\n                        if (this.DragDownloadData) this.DragDownloadData();\\r\\n                    }\\r\\n                }\\r\\n                this.UIElement.style.cursor=cursorStatus;\\r\\n            }\\r\\n            drag.LastMove.X=e.clientX;\\r\\n        }\\r\\n\\r\\n        if (bNeedDraw) this.Draw();\\r\\n    }\\r\\n\\r\\n    this.DocOnMouseUp=function(e)\\r\\n    {\\r\\n        //清空事件\\r\\n        document.onmousemove=null;\\r\\n        document.onmouseup=null;\\r\\n        var IsMinuteChart=(this.ClassName==\\\"MinuteChartContainer\\\" || this.ClassName==\\\"MinuteChartHScreenContainer\\\") ? true:false;\\r\\n        var isDragSelectRect=(this.RectSelectDrag && this.RectSelectDrag.Index>=0);\\r\\n        var bClearDrawPicture=true;\\r\\n        if (this.CurrentChartDrawPicture)\\r\\n        {\\r\\n            var drawPicture=this.CurrentChartDrawPicture;\\r\\n            if (drawPicture.Status==2 || drawPicture.Status==1 || drawPicture.Status==3)\\r\\n            {\\r\\n                drawPicture.PointStatus=drawPicture.Status;\\r\\n                if (this.FinishChartDrawPicturePoint())\\r\\n                    this.DrawDynamicInfo();\\r\\n                else\\r\\n                    bClearDrawPicture=false;\\r\\n            }\\r\\n            else if (drawPicture.Status==20)\\r\\n            {\\r\\n                if (this.FinishMoveChartDrawPicture())\\r\\n                    this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n        else if (isDragSelectRect)  //区间选择拖动范围\\r\\n        {\\r\\n            if (this.OnDragSelectRectMouseUp) this.OnDragSelectRectMouseUp(e);\\r\\n        }\\r\\n        else if (IsMinuteChart)\\r\\n        {\\r\\n            if (this.OnMinuteSelectRectMouseUp) this.OnMinuteSelectRectMouseUp(e);\\r\\n        }\\r\\n        else if (this.DragMode==2)  //区间选择\\r\\n        {\\r\\n            var drag=this.MouseDrag;\\r\\n            drag.LastMove.X=e.clientX;\\r\\n            drag.LastMove.Y=e.clientY;\\r\\n\\r\\n            var selectData=new SelectRectData();\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            //区间起始位置 结束位子\\r\\n            selectData.XStart=(drag.Click.X-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n            selectData.YStart=(drag.Click.Y-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n            selectData.XEnd=(drag.LastMove.X-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n            selectData.YEnd=(drag.LastMove.Y-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n            selectData.JSChartContainer=this;\\r\\n            selectData.Stock={Symbol:this.Symbol, Name:this.Name};\\r\\n\\r\\n            if (!this.BorderDrag && this.GetSelectRectData(selectData))\\r\\n            {\\r\\n                var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SELECT_RECT);\\r\\n                var paint=this.GetRectSelectPaint();\\r\\n                if (event && event.Callback)\\r\\n                {\\r\\n                    var data=\\r\\n                        {\\r\\n                            X:drag.LastMove.X-uielement.getBoundingClientRect().left,\\r\\n                            Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,\\r\\n                            SelectData:selectData,   //区间选择的数据\\r\\n                            RectSelectPaint:paint    //区间选择背景\\r\\n                        };\\r\\n                    event.Callback(event,data,this);\\r\\n                }\\r\\n\\r\\n                if (IsMinuteChart)  //分时图直接显示显示区间选择\\r\\n                {\\r\\n                    this.HideSelectRect();\\r\\n                    this.UpdateSelectRect(selectData.Start,selectData.End);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.SelectRectRightMenu)\\r\\n                    {\\r\\n                        e.data=\\r\\n                            {\\r\\n                                Chart:this,\\r\\n                                X:drag.LastMove.X-uielement.getBoundingClientRect().left,\\r\\n                                Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,\\r\\n                                SelectData:selectData,          //区间选择的数据\\r\\n                                RectSelectPaint:paint           //区间选择背景\\r\\n                            };\\r\\n                        this.SelectRectRightMenu.DoModal(e);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.TryClickPaintEvent(JSCHART_EVENT_ID.ON_CLICKUP_CHART_PAINT,this.ClickDownPoint,e);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.TryClickPaintEvent(JSCHART_EVENT_ID.ON_CLICKUP_CHART_PAINT,this.ClickDownPoint,e);\\r\\n            this.ClickEvent(e);\\r\\n        }\\r\\n\\r\\n        //清空数据\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::document.onmouseup]',e);\\r\\n        this.UIElement.style.cursor=\\\"default\\\";\\r\\n        this.MouseDrag=null;\\r\\n        this.ClickDownPoint=null;\\r\\n        this.IsOnTouch=false;\\r\\n        if (this.BorderDrag && this.BorderDrag.Index>=0) this.Frame.SaveSubFrameHeightRate();   //拖拽指标窗口高度以后保存\\r\\n        this.BorderDrag=null;\\r\\n        this.YDrag=null;\\r\\n        this.UpDownDrag=null;\\r\\n        this.RectSelectDrag=null;\\r\\n        if (bClearDrawPicture===true) this.CurrentChartDrawPicture=null;\\r\\n    }\\r\\n\\r\\n    this.UIOnMounseOut=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::UIOnMounseOut]',e);\\r\\n        this.UIOnMouseMove(e);\\r\\n    }\\r\\n\\r\\n    this.UIOnMouseleave=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::UIOnMouseleave]',e);\\r\\n        //this.UIOnMouseMove(e);\\r\\n    }\\r\\n\\r\\n    //点击事件\\r\\n    this.ClickEvent=function(e)\\r\\n    {\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK);\\r\\n        if (!event || !event.Callback) return false;\\r\\n        if (this.ClickDownPoint.X!=e.clientX || this.ClickDownPoint.Y!=e.clientY) return false;\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x=(e.clientX-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var y=(e.clientY-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n        var data= { X:e.clientX, Y:e.clientY, FrameID:-1 };\\r\\n\\r\\n        var isInClient=false;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());\\r\\n        isInClient=this.Canvas.isPointInPath(x,y);\\r\\n        if (isInClient)\\r\\n        {\\r\\n            var yValueExtend={};\\r\\n            var yValue=this.Frame.GetYData(y,yValueExtend);\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(yValueExtend.FrameID) && yValueExtend.FrameID>=0)\\r\\n            {\\r\\n                var xValue=this.Frame.GetXData(x);\\r\\n                data.FrameID=yValueExtend.FrameID;\\r\\n                data.Data={ X:xValue, Y:yValue } ;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        event.Callback(event, data, this);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.PtInChartPaintTooltip=function(x,y, toolTip)\\r\\n    {\\r\\n        for(var i=0;i<this.ChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item.GetTooltipData(x,y,toolTip))\\r\\n                return item;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.PtInOverlayChartPaintTooltip=function(x,y,toolTip)\\r\\n    {\\r\\n        for(var i=0;i<this.OverlayChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (item.GetTooltipData(x,y,toolTip))\\r\\n                return item;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.TryClickPaintEvent=function(eventID, ptClick, e)\\r\\n    {\\r\\n        var event=this.GetEventCallback(eventID);\\r\\n        if (event && event.Callback)\\r\\n        {\\r\\n            if (ptClick.X==e.clientX && ptClick.Y==e.clientY)\\r\\n            {\\r\\n                var pixelTatio = GetDevicePixelRatio();\\r\\n                var x = (e.clientX-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n                var y = (e.clientY-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n\\r\\n                var toolTip=new TooltipData();\\r\\n                var stock=null;\\r\\n\\r\\n                //主数据\\r\\n                var paint=this.PtInChartPaintTooltip(x,y, toolTip);\\r\\n                if (paint) stock={ Symbol:this.Symbol, Name:this.Name };\\r\\n\\r\\n                if (!paint)    //叠加数据\\r\\n                {\\r\\n                    paint=this.PtInOverlayChartPaintTooltip(x,y, toolTip);\\r\\n                    if (paint) stock={ Symbol:toolTip.ChartPaint.Symbol, Name:toolTip.ChartPaint.Title };\\r\\n                }\\r\\n\\r\\n                if (toolTip.Data)\\r\\n                {\\r\\n                    var data= { X:e.clientX, Y:e.clientY, Stock: stock, Tooltip:toolTip };\\r\\n                    event.Callback(event, data, this);\\r\\n                    return true;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n\\r\\n    //判断是单个手指\\r\\n    this.IsPhoneDragging=function(e)\\r\\n    {\\r\\n        // JSConsole.Chart.Log(e);\\r\\n        var changed=e.changedTouches.length;\\r\\n        var touching=e.touches.length;\\r\\n\\r\\n        return changed==1 && touching==1;\\r\\n    }\\r\\n\\r\\n    //是否是2个手指操所\\r\\n    this.IsPhonePinching=function(e)\\r\\n    {\\r\\n        var changed=e.changedTouches.length;\\r\\n        var touching=e.touches.length;\\r\\n\\r\\n        return (changed==1 || changed==2) && touching==2;\\r\\n    }\\r\\n\\r\\n    this.PreventTouchEvent=function(e)\\r\\n    {\\r\\n        if (e.cancelable) e.preventDefault();\\r\\n        e.stopPropagation();\\r\\n    }\\r\\n\\r\\n    this.GetToucheData=function(e, isForceLandscape)\\r\\n    {\\r\\n        var touches=new Array();\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        for(var i=0; i<e.touches.length; ++i)\\r\\n        {\\r\\n            var item=e.touches[i];\\r\\n            if (isForceLandscape)\\r\\n            {\\r\\n                touches.push(\\r\\n                    {\\r\\n                        clientX:item.clientY*pixelTatio, clientY:item.clientX*pixelTatio,\\r\\n                        pageX:item.pageY*pixelTatio, pageY:item.pageX*pixelTatio\\r\\n                    });\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                touches.push(\\r\\n                    {\\r\\n                        clientX:item.clientX*pixelTatio, clientY:item.clientY*pixelTatio,\\r\\n                        pageX:item.pageX*pixelTatio, pageY:item.pageY*pixelTatio\\r\\n                    });\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return touches;\\r\\n    }\\r\\n\\r\\n    this.IsSingleTouch=function(e)  //是否是单点触屏\\r\\n    {\\r\\n        var touchCount=e.touches.length;\\r\\n\\r\\n        return touchCount==1;\\r\\n    }\\r\\n\\r\\n    this.StopDragTimer=function()\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsNumber(this.DragTimer))\\r\\n        {\\r\\n            clearTimeout(this.DragTimer);\\r\\n            this.DragTimer=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetMoveAngle=function(pt,pt2)  //计算角度\\r\\n    {\\r\\n        var xMove=Math.abs(pt.X-pt2.X);\\r\\n        var yMove=Math.abs(pt.Y-pt2.Y);\\r\\n        var angle=Math.atan(xMove/yMove)*180/Math.PI;\\r\\n        return angle;\\r\\n    }\\r\\n\\r\\n    //手机拖拽\\r\\n    uielement.ontouchstart=(e)=> { this.OnTouchStart(e); }\\r\\n    uielement.ontouchmove=(e)=> {this.OnTouchMove(e); }\\r\\n    uielement.ontouchend=(e)=> {this.OnTouchEnd(e); }\\r\\n\\r\\n    this.AddPhoneDBClickInfo=function(x,y,time)\\r\\n    {\\r\\n        var item={ X:x, Y:y, Time:time };\\r\\n        this.PhoneDBClickInfo.Start.push(item);\\r\\n    }\\r\\n\\r\\n    this.ClearPhoneDBClickInfo=function()\\r\\n    {\\r\\n        this.PhoneDBClickInfo.Start=[];\\r\\n    }\\r\\n\\r\\n    this.IsShortPhoneClick=function(x,y,time)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.OnTouchStart=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        this.IsOnTouch=true;\\r\\n        this.TouchDrawCount=0;\\r\\n        this.PhonePinch=null;\\r\\n        this.StopDragTimer();\\r\\n\\r\\n        var isSingleTouch=this.IsSingleTouch(e);\\r\\n        if (this.EnableScrollUpDown==false ||  !isSingleTouch || //多点触屏\\r\\n            (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID && this.TouchStatus.CorssCursorShow==true)) //十字光标显示,不能滚动页面\\r\\n        {\\r\\n            if (e.cancelable) e.preventDefault();\\r\\n        }\\r\\n\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            if (this.TryClickLock || this.TryClickIndexTitle) //指标枷锁区域 , 指标标题点击\\r\\n            {\\r\\n                var touches = this.GetToucheData(e, this.IsForceLandscape);\\r\\n                var pt=this.PointAbsoluteToRelative(touches[0].clientX, touches[0].clientY, true);\\r\\n                var x = pt.X;\\r\\n                var y = pt.Y;\\r\\n                if (this.TryClickLock && this.TryClickLock(x, y)) return;\\r\\n                if (this.TryClickIndexTitle && this.TryClickIndexTitle(x,y)) return;\\r\\n            }\\r\\n\\r\\n            var bStartTimer=true;\\r\\n            if (this.ChartDrawOption.IsLockScreen)\\r\\n            {\\r\\n                bStartTimer=false;\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n            {\\r\\n                if (this.TouchStatus.CorssCursorShow==true) bStartTimer=false;\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.DISABLE_DRAG_ID)\\r\\n            {\\r\\n                bStartTimer=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (!isSingleTouch) bStartTimer=false;\\r\\n            }\\r\\n\\r\\n            var drag=\\r\\n                {\\r\\n                    \\\"Click\\\":{},\\r\\n                    \\\"LastMove\\\":{}  //最后移动的位置\\r\\n                };\\r\\n\\r\\n            var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n\\r\\n            drag.Click.X=touches[0].clientX;\\r\\n            drag.Click.Y=touches[0].clientY;\\r\\n            drag.LastMove.X=touches[0].clientX;\\r\\n            drag.LastMove.Y=touches[0].clientY;\\r\\n\\r\\n            this.MouseDrag=drag;\\r\\n            this.PhoneTouchInfo={ Start:{X:touches[0].clientX, Y:touches[0].clientY }, End:{ X:touches[0].clientX, Y:touches[0].clientY } };\\r\\n            if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;\\r\\n            this.SelectChartDrawPicture=null;\\r\\n            var isDrawPictrue=false;\\r\\n            if (this.CurrentChartDrawPicture)  //画图工具模式\\r\\n            {\\r\\n                var drawPicture=this.CurrentChartDrawPicture;\\r\\n                if (drawPicture.Status==2)\\r\\n                    this.SetChartDrawPictureThirdPoint(drag.Click.X,drag.Click.Y,true);\\r\\n                else\\r\\n                {\\r\\n                    this.SetChartDrawPictureFirstPoint(drag.Click.X,drag.Click.Y,true);\\r\\n                    //只有1个点 直接完成\\r\\n                    if (this.FinishChartDrawPicturePoint()) this.DrawDynamicInfo({Corss:false, Tooltip:false});\\r\\n                }\\r\\n\\r\\n                if (e.cancelable) e.preventDefault();\\r\\n                return;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var pt=this.PointAbsoluteToRelative(touches[0].clientX,touches[0].clientY, true);\\r\\n                var drawPictrueData={ X:pt.X, Y:pt.Y };\\r\\n                var pixelTatio = GetDevicePixelRatio(); //鼠标移动坐标是原始坐标 需要乘以放大倍速\\r\\n                if (this.GetChartDrawPictureByPoint(drawPictrueData))\\r\\n                {\\r\\n                    drawPictrueData.ChartDrawPicture.Status=20;\\r\\n                    drawPictrueData.ChartDrawPicture.ValueToPoint();\\r\\n                    drawPictrueData.ChartDrawPicture.MovePointIndex=drawPictrueData.PointIndex;\\r\\n                    drawPictrueData.ChartDrawPicture.IsSelected=true;\\r\\n                    this.CurrentChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                    this.SelectChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                    let event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_DRAWPICTURE); //选中画图工具事件\\r\\n                    if (event && event.Callback)\\r\\n                    {\\r\\n                        let sendData={ DrawPicture: drawPictrueData.ChartDrawPicture };\\r\\n                        event.Callback(event,sendData,this);\\r\\n                    }\\r\\n\\r\\n                    if (e.cancelable) e.preventDefault();\\r\\n                    return;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (bStartTimer)\\r\\n            {\\r\\n                //长按2秒,十字光标\\r\\n                var self=this;\\r\\n                this.DragTimer=setTimeout(function()\\r\\n                {\\r\\n                    if (drag.Click.X==drag.LastMove.X && drag.Click.Y==drag.LastMove.Y) //手指没有移动，出现十字光标\\r\\n                    {\\r\\n                        var mouseDrag=self.MouseDrag;\\r\\n                        self.MouseDrag=null;\\r\\n                        if (self.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID) self.TouchStatus.CorssCursorShow=true;    //十字显示\\r\\n                        self.MoveCorssCursor(drag.Click,e);//移动十字光标\\r\\n                    }\\r\\n\\r\\n                }, self.PressTime);\\r\\n            }\\r\\n\\r\\n            if (this.EnableZoomIndexWindow)\\r\\n            {\\r\\n                this.PhoneDBClick.AddTouchStart(touches[0].clientX, touches[0].clientY, Date.now());\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::OnTouchStart] PhoneDBClick \\\", this.PhoneDBClick);\\r\\n            }\\r\\n\\r\\n            if (this.ChartDrawOption.IsLockScreen)\\r\\n            {\\r\\n                this.MouseDrag=null;\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.DISABLE_DRAG_ID)\\r\\n            {\\r\\n                this.MouseDrag=null;\\r\\n                this.MoveCorssCursor(drag.Click,e);\\r\\n            }\\r\\n            else if (this.IsClickShowCorssCursor)\\r\\n            {\\r\\n                this.MoveCorssCursor(drag.Click,e);\\r\\n            }\\r\\n\\r\\n            this.TouchEvent({ EventID:JSCHART_EVENT_ID.ON_PHONE_TOUCH, FunctionName:\\\"OnTouchStart\\\"}, e);\\r\\n        }\\r\\n        else if (this.IsPhonePinching(e))\\r\\n        {\\r\\n            var phonePinch=\\r\\n                {\\r\\n                    \\\"Start\\\":{},\\r\\n                    \\\"Last\\\":{}\\r\\n                };\\r\\n\\r\\n            var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n\\r\\n            phonePinch.Start={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n            phonePinch.Last={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n\\r\\n            this.PhonePinch=phonePinch;\\r\\n            this.SelectChartDrawPicture=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchMove=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            var drag=this.MouseDrag;\\r\\n            if (drag==null)\\r\\n            {\\r\\n                if (this.IsForceLandscape) y=uielement.getBoundingClientRect().width-touches[0].clientY;    //强制横屏Y计算\\r\\n                if (!this.ChartDrawOption.IsLockScreen) this.MoveCorssCursor({X:touches[0].clientX, Y:touches[0].clientY},e);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var moveAngle=this.GetMoveAngle(drag.LastMove,{X:touches[0].clientX, Y:touches[0].clientY});\\r\\n                var moveSetp=Math.abs(drag.LastMove.X-touches[0].clientX);\\r\\n                var moveUpDown=Math.abs(drag.LastMove.Y-touches[0].clientY);\\r\\n                moveSetp=parseInt(moveSetp);\\r\\n                var isMoveCorssCursor=(this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID && this.TouchStatus.CorssCursorShow==true); //是否移动十字光标\\r\\n\\r\\n                //JSConsole.Chart.Log(\\\"[JSChartContainer::uielement.ontouchmove]  moveAngle , moveUpDown\\\", moveAngle,moveUpDown);\\r\\n\\r\\n                if (this.CurrentChartDrawPicture)\\r\\n                {\\r\\n                    var drawPicture=this.CurrentChartDrawPicture;\\r\\n                    if (drawPicture.Status==1 || drawPicture.Status==2)\\r\\n                    {\\r\\n                        if(moveSetp<5 && moveUpDown<5) return;\\r\\n                        if(this.SetChartDrawPictureSecondPoint(touches[0].clientX,touches[0].clientY,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n                    else if (drawPicture.Status==3)\\r\\n                    {\\r\\n                        if(this.SetChartDrawPictureThirdPoint(touches[0].clientX,touches[0].clientY,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n                    else if (drawPicture.Status==20)    //画图工具移动\\r\\n                    {\\r\\n                        if(moveSetp<5 && moveUpDown<5) return;\\r\\n\\r\\n                        if(this.MoveChartDrawPicture(touches[0].clientX-drag.LastMove.X,touches[0].clientY-drag.LastMove.Y,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    drag.LastMove.X=touches[0].clientX;\\r\\n                    drag.LastMove.Y=touches[0].clientY;\\r\\n                }\\r\\n                else if (isMoveCorssCursor)  //点击模式下 十字光标显示 左右移动十字光标\\r\\n                {\\r\\n                    var mouseDrag=this.MouseDrag;\\r\\n                    this.MouseDrag=null;\\r\\n                    this.MoveCorssCursor(drag.Click,e); //移动十字光标\\r\\n                }\\r\\n                else if (this.DragMode==1 || isMoveCorssCursor==false)  //数据左右拖拽\\r\\n                {\\r\\n                    if ( ((moveUpDown>0 && moveSetp<=3) || moveAngle<=this.TouchMoveMinAngle) && this.EnableScrollUpDown==true )\\r\\n                    {\\r\\n                        this.StopDragTimer();\\r\\n                        return;\\r\\n                    }\\r\\n\\r\\n                    if (moveSetp<5 || moveAngle<=this.TouchMoveMinAngle)\\r\\n                    {\\r\\n                        this.PreventTouchEvent(e);\\r\\n                        return;\\r\\n                    }\\r\\n\\r\\n                    var isLeft=true;\\r\\n                    if (drag.LastMove.X<touches[0].clientX) isLeft=false;//右移数据\\r\\n\\r\\n                    var oneStepWidth=this.GetMoveOneStepWidth();\\r\\n                    if (moveSetp<oneStepWidth) return;\\r\\n\\r\\n                    if(this.DataMove(moveSetp,isLeft))\\r\\n                    {\\r\\n                        this.UpdataDataoffset();\\r\\n                        this.UpdatePointByCursorIndex();\\r\\n                        this.UpdateFrameMaxMin();\\r\\n                        this.ResetFrameXYSplit();\\r\\n                        this.Draw();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (this.DragDownloadData) this.DragDownloadData();\\r\\n                    }\\r\\n\\r\\n                    drag.LastMove.X=touches[0].clientX;\\r\\n                    drag.LastMove.Y=touches[0].clientY;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (this.PhoneTouchInfo)\\r\\n            {\\r\\n                this.PhoneTouchInfo.End.X=touches[0].clientX;\\r\\n                this.PhoneTouchInfo.End.Y=touches[0].clientY;\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsPhonePinching(e))\\r\\n        {\\r\\n            if (this.DragMode==JSCHART_DRAG_ID.DISABLE_DRAG_ID) return;\\r\\n\\r\\n            this.PreventTouchEvent(e);\\r\\n            var phonePinch=this.PhonePinch;\\r\\n            if (!phonePinch) return;\\r\\n\\r\\n            if (this.EnableZoomUpDown && this.EnableZoomUpDown.Touch===false) return;\\r\\n\\r\\n            var yHeight=Math.abs(touches[0].pageY-touches[1].pageY);\\r\\n            var yLastHeight=Math.abs(phonePinch.Last.Y-phonePinch.Last.Y2);\\r\\n            var yStep=yHeight-yLastHeight;\\r\\n\\r\\n            var xHeight=Math.abs(touches[0].pageX-touches[1].pageX);\\r\\n            var xLastHeight=Math.abs(phonePinch.Last.X-phonePinch.Last.X2);\\r\\n            var xStep=xHeight-xLastHeight;\\r\\n            var minStep=this.ZoomStepPixel;\\r\\n            if (Math.abs(yStep)<minStep && Math.abs(xStep)<minStep) return;\\r\\n            var step=yStep;\\r\\n            if (Math.abs(yStep)<minStep) step=xStep;\\r\\n\\r\\n            if (step>0)    //放大\\r\\n            {\\r\\n                var cursorIndex={};\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (!this.Frame.ZoomUp(cursorIndex)) return;\\r\\n                this.CursorIndex=cursorIndex.Index;\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                this.ShowTooltipByKeyDown();\\r\\n                this.StopDragTimer();\\r\\n            }\\r\\n            else        //缩小\\r\\n            {\\r\\n                var cursorIndex={};\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (!this.Frame.ZoomDown(cursorIndex)) return;\\r\\n                this.CursorIndex=cursorIndex.Index;\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                this.ShowTooltipByKeyDown();\\r\\n                this.StopDragTimer();\\r\\n            }\\r\\n\\r\\n            phonePinch.Last={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n        }\\r\\n\\r\\n        this.PreventTouchEvent(e);\\r\\n    }\\r\\n\\r\\n    this.OnTouchEnd=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer:OnTouchEnd]',e);\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var bClearDrawPicture=true;\\r\\n        if (this.CurrentChartDrawPicture)\\r\\n        {\\r\\n            var drawPicture=this.CurrentChartDrawPicture;\\r\\n            if (drawPicture.Status==2 || drawPicture.Status==1 || drawPicture.Status==3)\\r\\n            {\\r\\n                drawPicture.PointStatus=drawPicture.Status;\\r\\n                if (this.FinishChartDrawPicturePoint())\\r\\n                    this.DrawDynamicInfo();\\r\\n                else\\r\\n                    bClearDrawPicture=false;\\r\\n            }\\r\\n            else if (drawPicture.Status==20)\\r\\n            {\\r\\n                if (this.FinishMoveChartDrawPicture())\\r\\n                    this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.EnableZoomIndexWindow)\\r\\n        {\\r\\n            var time=Date.now();\\r\\n            this.PhoneDBClick.AddTouchEnd(time);\\r\\n            if (this.PhoneDBClick.IsVaildDBClick())\\r\\n            {\\r\\n                this.OnTouchDBClick(this.PhoneDBClick.Start);\\r\\n                this.PhoneDBClick.Clear();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.IsOnTouch = false;\\r\\n        if (bClearDrawPicture===true) this.CurrentChartDrawPicture=null;\\r\\n        this.StopDragTimer();\\r\\n        this.TouchEvent({ EventID:JSCHART_EVENT_ID.ON_PHONE_TOUCH, FunctionName:\\\"OnTouchEnd\\\"}, e);\\r\\n        this.OnTouchFinished();\\r\\n        this.TouchDrawCount=0;\\r\\n    }\\r\\n\\r\\n    this.OnTouchDBClick=function(points)\\r\\n    {\\r\\n        var pt=this.PointAbsoluteToRelative(points[0].X, points[0].Y, true);\\r\\n        var x=pt.X, y=pt.Y;\\r\\n        JSConsole.Chart.Log(`[KLineChartContainer:OnTouchDBClick] Phone dbclick absolute [${x},${y}], soruce [${points[0].X},${points[0].Y}]`);\\r\\n\\r\\n        var frameId=this.Frame.PtInFrame(x,y);\\r\\n        JSConsole.Chart.Log(\\\"[KLineChartContainer::OnTouchDBClick] frameId\\\",frameId);\\r\\n        if (frameId>=this.Frame.ZoomStartWindowIndex)\\r\\n        {\\r\\n            if (this.ZoomIndexWindow(frameId, {X:x, Y:y}))\\r\\n            {\\r\\n                this.Frame.SetSizeChage(true);\\r\\n                this.Draw();\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //手势事件\\r\\n    this.TouchEvent=function(obj,e)\\r\\n    {\\r\\n        var eventID=obj.EventID;\\r\\n        var event=this.GetEventCallback(eventID);\\r\\n        if (!event || !event.Callback) return false;\\r\\n        var drag=this.PhoneTouchInfo\\r\\n        if (!drag || !drag.Start || !drag.End ) return false;\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var clientX=drag.End.X/pixelTatio;\\r\\n        var clientY=drag.End.Y/pixelTatio;\\r\\n        var x=drag.End.X-this.UIElement.getBoundingClientRect().left*pixelTatio;\\r\\n        var y=drag.End.Y-this.UIElement.getBoundingClientRect().top*pixelTatio;\\r\\n        var data=\\r\\n            {\\r\\n                X:clientX, Y:clientY, FrameID:-1, FunctionName:obj.FunctionName,\\r\\n                Drag:\\r\\n                    {\\r\\n                        Start:{ X:drag.Start.X/pixelTatio, Y:drag.Start.Y/pixelTatio },\\r\\n                        End:{ X:drag.End.X/pixelTatio, Y:drag.End.Y/pixelTatio }\\r\\n                    }\\r\\n            };\\r\\n\\r\\n        var isInClient=false;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());\\r\\n        isInClient=this.Canvas.isPointInPath(x,y);\\r\\n\\r\\n        if (isInClient)\\r\\n        {\\r\\n            var yValueExtend={};\\r\\n            var yValue=this.Frame.GetYData(y,yValueExtend);\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(yValueExtend.FrameID) && yValueExtend.FrameID>=0)\\r\\n            {\\r\\n                var xValue=this.Frame.GetXData(x);\\r\\n                data.FrameID=yValueExtend.FrameID;\\r\\n                data.Data={ X:xValue, Y:yValue } ;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        event.Callback(event, data, this);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.MoveCorssCursor=function(point,e)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x = point.X-this.UIElement.getBoundingClientRect().left*pixelTatio;\\r\\n        var y = point.Y-this.UIElement.getBoundingClientRect().top*pixelTatio;\\r\\n        if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID) this.TouchStatus.CorssCursorShow=true;    //十字显示\\r\\n        this.OnMouseMove(x,y,e,true);\\r\\n    }\\r\\n\\r\\n    this.DrawEmpty=function()\\r\\n    {\\r\\n        if (this.UIElement.width<=0 || this.UIElement.height<=0) return;\\r\\n        this.Canvas.clearRect(0,0,this.UIElement.width,this.UIElement.height);\\r\\n        if (this.Frame)\\r\\n        {\\r\\n            this.Frame.ScreenImageData=null;\\r\\n            this.Frame.Draw();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartCorssCursor) this.ChartCorssCursor.Status=0;\\r\\n        if (this.UIElement.width<=0 || this.UIElement.height<=0) return;\\r\\n\\r\\n        this.Canvas.clearRect(0,0,this.UIElement.width,this.UIElement.height);\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        this.Canvas.lineWidth=pixelTatio;       //手机端需要根据分辨率比调整线段宽度\\r\\n\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash)\\r\\n        {\\r\\n            this.Frame.ClearCoordinateText();\\r\\n            this.Frame.Draw( { IsEnableSplash:this.ChartSplashPaint.IsEnableSplash} );\\r\\n            this.ChartSplashPaint.Draw();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //框架\\r\\n        this.Frame.SetDrawDepthMap(()=>\\r\\n        {\\r\\n            for(var i=0;i<this.ExtendChartPaint.length;++i)\\r\\n            {\\r\\n                var item=this.ExtendChartPaint[i];\\r\\n                if (item.IsCallbackDraw) item.Draw();\\r\\n            }\\r\\n        });\\r\\n\\r\\n        this.Frame.Draw();\\r\\n        if (this.Frame.DrawCustomVertical)\\r\\n        {\\r\\n            var eventCVericalDraw=this.GetEventCallback(JSCHART_EVENT_ID.ON_CUSTOM_VERTICAL_DRAW);\\r\\n            this.Frame.DrawCustomVertical(eventCVericalDraw);\\r\\n        }\\r\\n        this.Frame.CalculateLock();\\r\\n\\r\\n        //框架内图形\\r\\n        for(var i=0;i<this.ChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item.IsDrawFirst)\\r\\n                item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i=0; i<this.ChartPaint.length; ++i)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (!item.IsDrawFirst)\\r\\n                item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ChartPaintEx.length;++i)\\r\\n        {\\r\\n            var item=this.ChartPaintEx[i];\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        //叠加股票\\r\\n        for(var i=0;i<this.OverlayChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.Frame.DrawOveraly)\\r\\n            this.Frame.DrawOveraly();   //画叠加指标\\r\\n\\r\\n        //固定扩展图形\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsCallbackDraw) continue;\\r\\n            if (!item.IsDynamic && item.IsAnimation==false) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.Frame.DrawInsideHorizontal) this.Frame.DrawInsideHorizontal();\\r\\n        if (this.Frame.DrawCustomHorizontal) this.Frame.DrawCustomHorizontal();\\r\\n        if (this.Frame.DrawEx) this.Frame.DrawEx( {Symbol:this.Symbol} );\\r\\n        if (this.ChartInfoPaint) this.ChartInfoPaint.Draw();\\r\\n        this.Frame.DrawLock();\\r\\n        this.Frame.Snapshot();\\r\\n\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i) //动态扩展图形\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsCallbackDraw) continue;\\r\\n            if (item.IsDynamic && item.DrawAfterTitle===false) item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ChartDrawPicture.length;++i)\\r\\n        {\\r\\n            var item=this.ChartDrawPicture[i];\\r\\n            if (item.IsDrawFirst) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.LastPoint.X!=null || this.LastPoint.Y!=null)\\r\\n        {\\r\\n            if (this.ChartCorssCursor)\\r\\n            {\\r\\n                this.ChartCorssCursor.LastPoint=this.LastPoint;\\r\\n                this.ChartCorssCursor.CursorIndex=this.CursorIndex;\\r\\n\\r\\n                if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n                {   //点击手势模式下\\r\\n                    if (this.TouchStatus.CorssCursorShow==true) this.ChartCorssCursor.Draw();\\r\\n                }\\r\\n                else if (!(this.CorssCursorTouchEnd===true && this.MouseDrag) && !(this.CorssCursorTouchEnd==true && this.IsOnTouch==false))\\r\\n                {   //移动端 拖拽数据的时候 不显示十字光标, 没有按屏的时候也不显示十字光标\\r\\n                    this.ChartCorssCursor.Draw();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var drawStatus=this.GetDrawStatus();\\r\\n        drawStatus.DrawName=\\\"Draw\\\";\\r\\n        var eventTitleDraw=this.GetEventCallback(JSCHART_EVENT_ID.ON_TITLE_DRAW);\\r\\n        var eventIndexTitleDraw=this.GetEventCallback(JSCHART_EVENT_ID.ON_INDEXTITLE_DRAW);\\r\\n        for(var i=0;i<this.TitlePaint.length;++i)\\r\\n        {\\r\\n            var item=this.TitlePaint[i];\\r\\n            if (!item.IsDynamic) continue;\\r\\n\\r\\n            item.CursorIndex=this.CursorIndex;\\r\\n            if (item.ClassName=='DynamicChartTitlePainting') item.OnDrawEvent=eventIndexTitleDraw\\r\\n            else item.OnDrawEvent=eventTitleDraw;\\r\\n\\r\\n            if (item.OnDrawEvent)\\r\\n            {\\r\\n                item.OnDrawEvent.FunctionName='Draw';\\r\\n                item.OnDrawEvent.PointPosition=null;\\r\\n            }\\r\\n\\r\\n            item.DrawStatus=drawStatus;\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i) //动态扩展图形\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsCallbackDraw) continue;\\r\\n            if (item.IsDynamic && item.DrawAfterTitle===true && item.IsAnimation==false) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.EnableAnimation)\\r\\n        {\\r\\n            for(var i=0;i<this.ExtendChartPaint.length;++i) //动画\\r\\n            {\\r\\n                var item=this.ExtendChartPaint[i];\\r\\n                if (item.IsAnimation===true) item.Draw();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ChartDrawPicture.length;++i)\\r\\n        {\\r\\n            var item=this.ChartDrawPicture[i];\\r\\n            if (!item.IsDrawFirst) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.CurrentChartDrawPicture && this.CurrentChartDrawPicture.Status!=10)\\r\\n        {\\r\\n            this.CurrentChartDrawPicture.Draw();\\r\\n        }\\r\\n\\r\\n        this.OffscreenToShowCanvas();\\r\\n\\r\\n        //发送图形状态给外部\\r\\n        if (this.mapEvent.has(JSCHART_EVENT_ID.CHART_STATUS))\\r\\n        {\\r\\n            var event=this.mapEvent.get(JSCHART_EVENT_ID.CHART_STATUS);\\r\\n\\r\\n            var data={  };\\r\\n            if (typeof(this.GetChartStatus)=='function') data=this.GetChartStatus();\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n\\r\\n        ++this.TouchDrawCount;\\r\\n    }\\r\\n\\r\\n    this.OffscreenToShowCanvas=function()\\r\\n    {\\r\\n        if (!this.ShowCanvas) return;\\r\\n\\r\\n        this.ShowCanvas.clearRect(0,0,this.UIElement.width,this.UIElement.height);\\r\\n        this.ShowCanvas.drawImage(this.OffscreenCanvasElement,0,0);\\r\\n    }\\r\\n\\r\\n    this.GetDrawStatus=function()\\r\\n    {\\r\\n        var status=\\r\\n            {\\r\\n                Point:{ X:this.LastPoint.X, Y:this.LastPoint.Y },\\r\\n                IsOnTouch:this.IsOnTouch,\\r\\n                CorssCursorTouchEnd:this.CorssCursorTouchEnd,\\r\\n                IsTitleShowLatestData:this.IsTitleShowLatestData,\\r\\n                IsMinuteChart:(this.ClassName==\\\"MinuteChartContainer\\\" || this.ClassName==\\\"MinuteChartHScreenContainer\\\") ? true:false\\r\\n            };\\r\\n\\r\\n        status.FrameID=this.Frame.PtInFrame(this.LastPoint.X, this.LastPoint.Y);\\r\\n\\r\\n        return status;\\r\\n    }\\r\\n    //画动态信息\\r\\n    this.DrawDynamicInfo=function(option)\\r\\n    {\\r\\n        if (this.Frame.ScreenImageData==null) return;\\r\\n\\r\\n        var isErase=false;\\r\\n        if (this.ChartCorssCursor)\\r\\n        {\\r\\n            if (this.ChartCorssCursor.PointX!=null || this.ChartCorssCursor.PointY!=null)\\r\\n                isErase=true;\\r\\n        }\\r\\n\\r\\n        isErase=true;   //每次都擦除背景\\r\\n        if (isErase==false)\\r\\n        {\\r\\n            for(var i=0;i<this.ExtendChartPaint.length;++i)\\r\\n            {\\r\\n                var item=this.ExtendChartPaint[i];\\r\\n                if (item.IsCallbackDraw) continue;\\r\\n                if (item.IsDynamic && item.IsEraseBG)\\r\\n                {\\r\\n                    isErase=true;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (isErase) this.Canvas.putImageData(this.Frame.ScreenImageData,0,0);\\r\\n\\r\\n\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i) //动态扩展图形\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsCallbackDraw) continue;\\r\\n            if (item.IsDynamic && item.DrawAfterTitle===false && item.IsAnimation==false) item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ChartDrawPicture.length;++i)\\r\\n        {\\r\\n            var item=this.ChartDrawPicture[i];\\r\\n            if (item.IsDrawFirst) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.ChartCorssCursor)\\r\\n        {\\r\\n            this.ChartCorssCursor.LastPoint=this.LastPoint;\\r\\n            this.ChartCorssCursor.CursorIndex=this.CursorIndex;\\r\\n            if (option && option.Corss==false)\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n            {\\r\\n                if (this.TouchStatus.CorssCursorShow==true) this.ChartCorssCursor.Draw();\\r\\n            }\\r\\n            else if ( !(this.IsOnTouch===false && this.CorssCursorTouchEnd===true) && !this.CurrentChartDrawPicture)\\r\\n            {\\r\\n                this.ChartCorssCursor.Draw();\\r\\n            }\\r\\n            else if (this.IsOnTouch===true && (this.CurrentChartDrawPicture && this.EnableShowCorssCursor && this.EnableShowCorssCursor.DrawPicture==true))\\r\\n            {\\r\\n                this.ChartCorssCursor.Draw();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var ptPosition=null;    //鼠标位置 null 无效 -1 在外面 >=0 对应的指标窗口中ID\\r\\n        if (option && option.ParentFunction=='OnMouseMove' && option.Point)\\r\\n        {\\r\\n            ptPosition=this.Frame.PtInFrame(option.Point.X, option.Point.Y);\\r\\n        }\\r\\n\\r\\n        var drawStatus=this.GetDrawStatus();\\r\\n        drawStatus.DrawName=\\\"DrawDynamicInfo\\\";\\r\\n        for(var i=0;i<this.TitlePaint.length;++i)\\r\\n        {\\r\\n            var item=this.TitlePaint[i];\\r\\n            if (!item.IsDynamic) continue;\\r\\n\\r\\n            item.CursorIndex=this.CursorIndex;\\r\\n            if (item.OnDrawEvent)\\r\\n            {\\r\\n                item.OnDrawEvent.FunctionName='DrawDynamicInfo';\\r\\n                item.OnDrawEvent.PointPosition=ptPosition;\\r\\n            }\\r\\n            item.DrawStatus=drawStatus;\\r\\n\\r\\n            if (item.ClassName==\\\"DynamicMinuteTitlePainting\\\")\\r\\n            {\\r\\n                if (option && IFrameSplitOperator.IsNumber(option.ClientPos) && option.Point)\\r\\n                    item.PointInfo={ ClientPos:option.ClientPos, Point:{ X:option.Point.X, Y:option.Point.Y }};\\r\\n                else\\r\\n                    item.PointInfo=null;\\r\\n            }\\r\\n\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i) //动态扩展图形   在动态标题以后画\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsCallbackDraw) continue;\\r\\n            if (item.ClassName=='KLineTooltipPaint' && option)\\r\\n            {\\r\\n                if (option.Tooltip==false) continue;\\r\\n                if (option.Point) item.LatestPoint=option.Point;\\r\\n            }\\r\\n            else if (item.ClassName==\\\"MinuteTooltipPaint\\\" && option)\\r\\n            {\\r\\n                if (option.Point) item.LatestPoint=option.Point;\\r\\n            }\\r\\n\\r\\n            if (item.IsDynamic && item.DrawAfterTitle===true) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.EnableAnimation)\\r\\n        {\\r\\n            for(var i=0;i<this.ExtendChartPaint.length;++i) //动画\\r\\n            {\\r\\n                var item=this.ExtendChartPaint[i];\\r\\n                if (item.IsAnimation===true) item.Draw();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.ChartDrawPicture.length;++i)\\r\\n        {\\r\\n            var item=this.ChartDrawPicture[i];\\r\\n            if (!item.IsDrawFirst) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.CurrentChartDrawPicture && this.CurrentChartDrawPicture.Status!=10)\\r\\n        {\\r\\n            this.CurrentChartDrawPicture.Draw();\\r\\n        }\\r\\n\\r\\n        this.OffscreenToShowCanvas();\\r\\n\\r\\n        ++this.TouchDrawCount;\\r\\n    }\\r\\n\\r\\n    this.DrawAnimation=function()   //绘制动画 如弹幕\\r\\n    {\\r\\n        if (!this.EnableAnimation) return;\\r\\n\\r\\n        if (this.Frame.ScreenImageData && !this.IsOnTouch)\\r\\n        {\\r\\n            for(var i=0;i<this.ExtendChartPaint.length;++i)\\r\\n            {\\r\\n                var item=this.ExtendChartPaint[i];\\r\\n                if (item.IsAnimation===true) item.IsMoveStep=true;  //移动弹幕\\r\\n            }\\r\\n\\r\\n            this.DrawDynamicInfo();\\r\\n        }\\r\\n\\r\\n        var self=this;\\r\\n        window.requestAnimationFrame(function() { self.DrawAnimation(); });\\r\\n    }\\r\\n\\r\\n    this.StartAnimation=function(option)\\r\\n    {\\r\\n        var bCreated=false; //是否已经创建了弹幕画法\\r\\n        var barrageData=null;\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName==='BarragePaint')\\r\\n            {\\r\\n                bCreated=true;\\r\\n                barrageData=item.BarrageList;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!bCreated)\\r\\n        {\\r\\n            var chart=new BarragePaint();\\r\\n            chart.Canvas=this.Canvas;\\r\\n            chart.ChartBorder=this.Frame.ChartBorder;\\r\\n            chart.ChartFrame=this.Frame;\\r\\n            chart.HQChart=this;\\r\\n            chart.SetOption(option);\\r\\n            this.ExtendChartPaint.push(chart);\\r\\n            barrageData=chart.BarrageList;\\r\\n        }\\r\\n\\r\\n        this.EnableAnimation=true;\\r\\n        var self=this;\\r\\n        window.requestAnimationFrame(function() { self.DrawAnimation(); });\\r\\n\\r\\n        return barrageData;\\r\\n    }\\r\\n\\r\\n    this.StopAnimation=function()\\r\\n    {\\r\\n        this.EnableAnimation=false;\\r\\n        this.DrawDynamicInfo();\\r\\n    }\\r\\n\\r\\n    this.GetChartTooltipData=function(x,y,option)\\r\\n    {\\r\\n        var toolTip=new TooltipData();\\r\\n\\r\\n        if (this.ChartInfoPaint)\\r\\n        {\\r\\n            if (this.ChartInfoPaint.GetTooltipData(x,y,toolTip))\\r\\n                return toolTip;\\r\\n        }\\r\\n\\r\\n        if (this.PtInChartPaintTooltip(x,y, toolTip))\\r\\n            return toolTip;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.Frame.SubFrame))\\r\\n        {\\r\\n            for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n            {\\r\\n                var subFrame=this.Frame.SubFrame[i];\\r\\n                for(var j=0;j<subFrame.OverlayIndex.length;++j)\\r\\n                {\\r\\n                    var overlayItem=subFrame.OverlayIndex[j];\\r\\n                    for(var k=0;k<overlayItem.ChartPaint.length;++k)\\r\\n                    {\\r\\n                        var item=overlayItem.ChartPaint[k];\\r\\n                        if (item.GetTooltipData(x,y,toolTip))\\r\\n                            return toolTip;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.PtInOverlayChartPaintTooltip(x,y,toolTip))\\r\\n            return toolTip;\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.OnMouseMove=function(x,y,e, isPhone)\\r\\n    {\\r\\n        this.LastPoint.X=x;\\r\\n        this.LastPoint.Y=y;\\r\\n        var mouseStatus=null;   //鼠标状态\\r\\n        var frameID=this.Frame.PtInFrame(x,y);\\r\\n        if (IFrameSplitOperator.IsNumber(frameID) && frameID>=0)    //在K线内部移动,调整K线索引\\r\\n            this.CursorIndex=this.Frame.GetXData(x);\\r\\n\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (paint && paint.GetPointCount()>0)\\r\\n        {\\r\\n            var item=paint.PtInPaint(x,y);\\r\\n            if (item)\\r\\n            {\\r\\n                mouseStatus={ Cursor:\\\"ew-resize\\\", Name:\\\"DragRectSelect\\\"};\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::OnMouseMove] drag rect select \\\",item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.EnableBorderDrag && this.Frame)\\r\\n        {\\r\\n            var dragBorder=this.Frame.PtInFrameBorder(x,y);\\r\\n            if (dragBorder && dragBorder.Index>=0)\\r\\n            {\\r\\n                mouseStatus={ Cursor:\\\"n-resize\\\", Name:\\\"DragBorder\\\"};\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::OnMouseMove] drag border \\\",dragBorder);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.EnableYDrag && this.Frame && !mouseStatus)\\r\\n        {\\r\\n            var dragY=this.TryYDrag(x,y);\\r\\n            if (dragY)\\r\\n            {\\r\\n                mouseStatus={ Cursor:dragY.Position==0 ? \\\"n-resize\\\":\\\"row-resize\\\", Name:\\\"DragY\\\"};\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::OnMouseMove] drag y \\\",dragY);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var button=this.Frame.PtInButtons(x,y);\\r\\n        if (button)\\r\\n        {\\r\\n            mouseStatus={ Cursor:\\\"pointer\\\", Name:\\\"FrameButton\\\"};\\r\\n            JSConsole.Chart.Log(\\\"[JSChartContainer::OnMouseMove] frame button \\\", button);\\r\\n        }\\r\\n\\r\\n        if (this.ChartCorssCursor)\\r\\n        {\\r\\n            var crossButton=this.ChartCorssCursor.PtInButton(x,y);\\r\\n            if (crossButton)\\r\\n            {\\r\\n                mouseStatus={ Cursor:\\\"pointer\\\", Name:\\\"CorssCursorButton\\\"};\\r\\n                JSConsole.Chart.Log(\\\"[JSChartContainer::OnMouseMove] cross cursor button \\\", crossButton);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.ClassName==\\\"KLineChartContainer\\\"  && this.Frame.PtInFrameBottom(x,y))\\r\\n        {\\r\\n            mouseStatus={ Cursor:\\\"ew-resize\\\", Name:\\\"FrameButtom\\\"};\\r\\n            JSConsole.Chart.Log(\\\"[JSChartContainer::OnMouseMove] frame bottom \\\");\\r\\n        }\\r\\n\\r\\n\\r\\n        var bDrawPicture=false; //是否正在画图\\r\\n        if (this.CurrentChartDrawPicture)\\r\\n        {\\r\\n            if (this.CurrentChartDrawPicture.SetLastPoint) this.CurrentChartDrawPicture.SetLastPoint({X:x,Y:y});\\r\\n            bDrawPicture=true;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var drawPictrueData={};\\r\\n            drawPictrueData.X=x;\\r\\n            drawPictrueData.Y=y;\\r\\n            if (this.GetChartDrawPictureByPoint(drawPictrueData) &&\\r\\n                drawPictrueData.ChartDrawPicture && drawPictrueData.ChartDrawPicture.EnableMove==true)\\r\\n            {\\r\\n\\r\\n                if (drawPictrueData.PointIndex===100) this.UIElement.style.cursor=\\\"move\\\";\\r\\n                else this.UIElement.style.cursor=\\\"pointer\\\";\\r\\n                bDrawPicture=true;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (!this.MouseDrag) this.UIElement.style.cursor=\\\"default\\\";\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var clientPos=this.PtInClient(x,y);\\r\\n        var option={ ParentFunction:'OnMouseMove', Point:{X:x, Y:y}, IsPhone:isPhone===true, ClientPos:clientPos };\\r\\n        if (e && (e.type==\\\"mouseout\\\" || e.type==\\\"mouseleave\\\")) option.Corss=false; //鼠标移开,不显示十字光标\\r\\n        this.DrawDynamicInfo(option);\\r\\n        if (mouseStatus) this.UIElement.style.cursor=mouseStatus.Cursor;\\r\\n\\r\\n        if (this.IsShowTooltip && bDrawPicture==false)\\r\\n        {\\r\\n            var toolTip=this.GetChartTooltipData(x,y);\\r\\n\\r\\n            if (toolTip && toolTip.Data)\\r\\n            {\\r\\n                if (isPhone===true)\\r\\n                {\\r\\n                    var touche=e.touches[0];\\r\\n                    var xTooltip = touche.clientX-this.UIElement.getBoundingClientRect().left;\\r\\n                    var yTooltip = touche.clientY-this.UIElement.getBoundingClientRect().top;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var xTooltip = e.clientX-this.UIElement.getBoundingClientRect().left;\\r\\n                    var yTooltip = e.clientY-this.UIElement.getBoundingClientRect().top;\\r\\n                }\\r\\n                this.ShowTooltip(xTooltip,yTooltip,toolTip);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.HideTooltip();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnKeyDown=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var keyID = e.keyCode ? e.keyCode :e.which;\\r\\n        switch(keyID)\\r\\n        {\\r\\n            case 37: //left\\r\\n                if (this.CursorIndex<=0.99999)\\r\\n                {\\r\\n                    if (!this.DataMoveLeft())\\r\\n                    {   //左移数据到头了 触发下载新数据\\r\\n                        if (this.DragDownloadData) this.DragDownloadData();\\r\\n                        break;\\r\\n                    }\\r\\n                    this.UpdataDataoffset();\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.UpdateFrameMaxMin();\\r\\n                    this.Draw();\\r\\n                    this.ShowTooltipByKeyDown();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    --this.CursorIndex;\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.DrawDynamicInfo();\\r\\n                    this.ShowTooltipByKeyDown();\\r\\n                }\\r\\n                break;\\r\\n            case 39: //right\\r\\n                var xPointcount=0;\\r\\n                if (this.Frame.XPointCount) xPointcount=this.Frame.XPointCount;\\r\\n                else xPointcount=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n                if (this.CursorIndex+1>=xPointcount)\\r\\n                {\\r\\n                    if (!this.DataMoveRight()) break;\\r\\n                    this.UpdataDataoffset();\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.UpdateFrameMaxMin();\\r\\n                    this.Draw();\\r\\n                    this.ShowTooltipByKeyDown();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    //判断是否在最后一个数据上\\r\\n                    var data=null;\\r\\n                    if (this.Frame.Data) data=this.Frame.Data;\\r\\n                    else data=this.Frame.SubFrame[0].Frame.Data;\\r\\n                    if (!data) break;\\r\\n                    if (this.CursorIndex+data.DataOffset+1>=data.Data.length) break;\\r\\n\\r\\n                    ++this.CursorIndex;\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.DrawDynamicInfo();\\r\\n                    this.ShowTooltipByKeyDown();\\r\\n                }\\r\\n                break;\\r\\n            case 38:    //up\\r\\n                if (this.EnableZoomUpDown && this.EnableZoomUpDown.Keyboard===false) break;\\r\\n                var cursorIndex={ ZoomType:this.ZoomType };\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (!this.Frame.ZoomUp(cursorIndex)) break;\\r\\n                this.CursorIndex=cursorIndex.Index;\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                this.ShowTooltipByKeyDown();\\r\\n                break;\\r\\n            case 40:    //down\\r\\n                if (this.EnableZoomUpDown && this.EnableZoomUpDown.Keyboard===false) break;\\r\\n                var cursorIndex={ ZoomType:this.ZoomType };\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (!this.Frame.ZoomDown(cursorIndex)) break;\\r\\n                this.CursorIndex=cursorIndex.Index;\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                this.ShowTooltipByKeyDown();\\r\\n                break;\\r\\n            case 46:    //del\\r\\n                if (!this.SelectChartDrawPicture) break;\\r\\n                var drawPicture=this.SelectChartDrawPicture;\\r\\n                JSConsole.Chart.Log(drawPicture,\\\"drawPicturedrawPicturedrawPicture\\\")\\r\\n                this.SelectChartDrawPicture=null;\\r\\n                this.ClearChartDrawPicture(drawPicture);    //删除选中的画图工具\\r\\n                break;\\r\\n            case 32:    //space\\r\\n                this.OnMarkRectSelect(e);\\r\\n                break;\\r\\n            default:\\r\\n                return;\\r\\n        }\\r\\n\\r\\n        //不让滚动条滚动\\r\\n        if(e.preventDefault) e.preventDefault();\\r\\n        else e.returnValue = false;\\r\\n    }\\r\\n\\r\\n    this.OnDoubleClick=function(x,y,e)\\r\\n    {\\r\\n        //JSConsole.Chart.Log(e);\\r\\n    }\\r\\n\\r\\n    this.ZoomIndexWindow=function(frameID, option)   //最大化/最小化指标窗口\\r\\n    {\\r\\n        if (frameID<0 || frameID>=this.Frame.SubFrame.length) return false;\\r\\n\\r\\n        return this.Frame.ZoomIndexWindow(frameID, option);\\r\\n    }\\r\\n\\r\\n    this.RemoveMinSizeWindows=function()    //清空最小化窗口\\r\\n    {\\r\\n        if (!this.Frame.ZoomWindowsInfo) return;\\r\\n\\r\\n        var aryDeleteIndex=[], aryIndex=[]; //删除的索引， 保留的索引\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            item.Frame.ClearToolbar();\\r\\n            if (item.Frame.IsMinSize)\\r\\n                aryDeleteIndex.push(i);\\r\\n            else\\r\\n                aryIndex.push(i);\\r\\n        }\\r\\n        this.Frame.ZoomWindowsInfo=null;\\r\\n        if (aryDeleteIndex.length<=0) return;\\r\\n\\r\\n        for(var i=0;i<aryDeleteIndex.length;++i)\\r\\n        {\\r\\n            this.DeleteIndexPaint(aryDeleteIndex[i]);\\r\\n        }\\r\\n\\r\\n        var newSubFrame=[];\\r\\n        var newWindowIndex=[];\\r\\n        var newTitlePaint=[this.TitlePaint[0]];\\r\\n        for(var i=0;i<aryIndex.length;++i)\\r\\n        {\\r\\n            var id=aryIndex[i];\\r\\n            newSubFrame[i]=this.Frame.SubFrame[id];\\r\\n            newWindowIndex[i]=this.WindowIndex[id];\\r\\n            newTitlePaint[i+1]=this.TitlePaint[id+1];\\r\\n        }\\r\\n        this.Frame.SubFrame=newSubFrame;\\r\\n        this.WindowIndex=newWindowIndex;\\r\\n        this.TitlePaint=newTitlePaint;\\r\\n\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n            else item.XSplitOperator.ShowText=false;\\r\\n\\r\\n            item.Identify=i;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.ChartDrawPicture))\\r\\n        {\\r\\n            var aryDrawPicture=[];\\r\\n            for(var i=0; i<this.ChartDrawPicture.length; ++i)\\r\\n            {\\r\\n                var item=this.ChartDrawPicture[i];\\r\\n                for(var j=0; j<this.Frame.SubFrame.length; ++j)\\r\\n                {\\r\\n                    if (item.Frame==this.Frame.SubFrame[j].Frame)\\r\\n                    {\\r\\n                        aryDrawPicture.push(item);\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            this.ChartDrawPicture=aryDrawPicture;\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.PtInClient=function(x,y)\\r\\n    {\\r\\n        this.Canvas.beginPath();\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            var border=this.Frame.ChartBorder.GetHScreenBorder();\\r\\n            this.Canvas.rect(border.Left,border.TopEx,border.Right-border.Left,border.BottomEx-border.TopEx);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.Frame.ChartBorder.GetBorder();\\r\\n            if (border.DayBorder)   //多日分时+多日集合竞价\\r\\n            {\\r\\n                for(var i=0;i<border.DayBorder.length;++i)\\r\\n                {\\r\\n                    var client=border.DayBorder[i];\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.rect(client.LeftEx,border.TopEx,client.RightEx-client.LeftEx,border.BottomEx-border.TopEx);\\r\\n                    if (this.Canvas.isPointInPath(x,y)) return 1;\\r\\n\\r\\n                    //盘前\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.rect(client.Left,border.TopEx,client.LeftEx-client.Left,border.BottomEx-border.TopEx);\\r\\n                    if (this.Canvas.isPointInPath(x,y))\\r\\n                        return 200+parseInt(i);\\r\\n\\r\\n                    //盘后\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.rect(client.RightEx,border.TopEx,client.Right-client.RightEx,border.BottomEx-border.TopEx);\\r\\n                    if (this.Canvas.isPointInPath(x,y))\\r\\n                        return 300+parseInt(i);\\r\\n                }\\r\\n\\r\\n                return -1;\\r\\n            }\\r\\n\\r\\n            this.Canvas.rect(border.LeftEx,border.Top,border.RightEx-border.LeftEx,border.Bottom-border.Top);\\r\\n        }\\r\\n\\r\\n        if (this.Canvas.isPointInPath(x,y)) return 1;\\r\\n\\r\\n        if (this.Frame.ChartBorder.LeftExtendWidth>10)\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.Frame.IsHScreen===true)\\r\\n            {\\r\\n                this.Canvas.rect(border.Left,border.Top,border.Right-border.Left,border.TopEx-border.Top);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.rect(border.Left,border.Top,border.LeftEx-border.Left,border.Bottom-border.Top);\\r\\n            }\\r\\n\\r\\n            if (this.Canvas.isPointInPath(x,y)) return 2;\\r\\n        }\\r\\n\\r\\n        if (this.Frame.ChartBorder.RightExtendWidth>10)\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.Frame.IsHScreen===true)\\r\\n            {\\r\\n                this.Canvas.rect(border.Left,border.BottomEx,border.Right-border.Left,border.Bottom-border.BottomEx);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.rect(border.RightEx,border.Top,border.Right-border.RightEx,border.Bottom-border.Top);\\r\\n            }\\r\\n\\r\\n            if (this.Canvas.isPointInPath(x,y)) return 3;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.OnMoveFromeBorder=function(index, yMove)\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n\\r\\n        if (!this.Frame.OnMoveFromeBorder(index,yMove)) return ;\\r\\n\\r\\n        //this.Frame.SetSizeChage(true);\\r\\n        this.Frame.SetFrameBorderSizeChange();\\r\\n        this.Frame.ReDrawToolbar();\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.OnZoomUpDownFrameY=function(obj, yMove)\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n\\r\\n        if (!this.Frame.OnZoomUpDownFrameY(obj,yMove)) return ;\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.OnUpDonwFrameY=function(obj, yMove)\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n\\r\\n        if (!this.Frame.OnUpDonwFrameY(obj,yMove)) return false;\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.CancelZoomUpDownFrameY=function(obj)\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n\\r\\n        if (!this.Frame.CancelZoomUpDownFrameY(obj)) return ;\\r\\n\\r\\n        this.UpdateFrameMaxMin();\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.IsKLineContainer=function()\\r\\n    {\\r\\n        if (this.ClassName=='KLineChartContainer' || this.ClassName=='KLineChartHScreenContainer' ||\\r\\n            this.ClassName==\\\"KLineTrainChartContainer\\\" || this.ClassName==\\\"CustomKLineChartContainer\\\" ) return true;\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.UpdatePointByCursorIndex=function(type)    //type 1=根据十字光标更新 2=强制取消十字光标\\r\\n    {\\r\\n        var pt={X:null, Y:null};\\r\\n        pt.X=this.Frame.GetXFromIndex(this.CursorIndex);\\r\\n        var index=Math.abs(this.CursorIndex-0.5);\\r\\n        if (this.IsKLineContainer()) index=this.CursorIndex;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (data.DataOffset+index<data.Data.length)\\r\\n        {\\r\\n            var close=data.Data[data.DataOffset+index].Close;\\r\\n            pt.Y=this.Frame.GetYFromData(close);\\r\\n        }\\r\\n\\r\\n        if (type==1 && this.ChartCorssCursor)\\r\\n        {\\r\\n            if (this.ChartCorssCursor.Status==1)    //十字光标显示中, 不调整位置\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.LastPoint.X=this.Frame.GetXFromIndex(this.CursorIndex);\\r\\n                var index=Math.abs(this.CursorIndex-0.5);\\r\\n                index=parseInt(index.toFixed(0));\\r\\n                if (this.IsKLineContainer()) index=this.CursorIndex;\\r\\n                this.LastPoint.Y=null;\\r\\n            }\\r\\n        }\\r\\n        else if (type==2 && this.ChartCorssCursor)  //取消鼠标位置，十字光标就不显示了\\r\\n        {\\r\\n            this.LastPoint.Y=null;\\r\\n            this.LastPoint.X=null;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.LastPoint.X=pt.X;\\r\\n            this.LastPoint.Y=pt.Y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ShowTooltipByKeyDown=function()\\r\\n    {\\r\\n        var index=Math.abs(this.CursorIndex-0.5);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        if (this.ClassName=='KLineChartContainer' || this.ClassName=='KLineTrainChartContainer') index=this.CursorIndex;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        var toolTip=new TooltipData();\\r\\n        toolTip.Data=data.Data[data.DataOffset+index];\\r\\n        toolTip.ChartPaint=this.ChartPaint[0];\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        if (pixelTatio===0) pixelTatio=1;   //div 缩放还是使用原始坐标\\r\\n        this.ShowTooltip(this.LastPoint.X/pixelTatio,this.LastPoint.Y/pixelTatio,toolTip);\\r\\n    }\\r\\n\\r\\n    this.ShowTooltip=function(x,y,toolTip)\\r\\n    {\\r\\n        if (!this.IsShowTooltip) return;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        var xMove=15/pixelTatio;    //顶部坐标偏移位置\\r\\n        if (toolTip.Type===0) //K线信息\\r\\n        {\\r\\n            var scrollPos=GetScrollPosition();\\r\\n            var left = x;\\r\\n            var top = y;\\r\\n\\r\\n            var format=g_DivTooltipDataForamt.Create('HistoryDataStringFormat');\\r\\n            format.Value=toolTip;\\r\\n            format.Symbol=this.Symbol;\\r\\n            format.LanguageID=this.LanguageID;\\r\\n            if (!format.Operator()) return;\\r\\n            var textHeight=format.LineCount*25; //每行的行高25\\r\\n            if (format.Height>0) textHeight=format.Height;  //新版本高度有格式化类计算完成\\r\\n            var width=format.Width;\\r\\n\\r\\n            this.Tooltip.style.width = width+\\\"px\\\";\\r\\n            this.Tooltip.style.height =textHeight+\\\"px\\\";\\r\\n            //JSConsole.Chart.Log(`[JSChartContainer::ShowTooltip] left=${left} top=${top} xMove=${xMove}` );\\r\\n            //if (toolTip.ChartPaint.Name==\\\"Overlay-KLine\\\")  this.Tooltip.style.height =220+\\\"px\\\";\\r\\n            this.Tooltip.style.position = \\\"absolute\\\";\\r\\n            //JSConsole.Chart.Log('[JSChartContainer::ShowTooltip] getBoundingClientRect() ',this.UIElement.getBoundingClientRect())\\r\\n            if (left+width>this.UIElement.getBoundingClientRect().width)\\r\\n                this.Tooltip.style.left = (left-width) + \\\"px\\\";\\r\\n            else\\r\\n                this.Tooltip.style.left = left + \\\"px\\\";\\r\\n\\r\\n            if (top+xMove+textHeight>this.UIElement.getBoundingClientRect().height-5)\\r\\n                this.Tooltip.style.top = (top-textHeight)+ \\\"px\\\";\\r\\n            else this.Tooltip.style.top = (top + xMove)+ \\\"px\\\";\\r\\n\\r\\n            this.Tooltip.className='jschart-tooltip';\\r\\n            this.Tooltip.innerHTML=format.Text;\\r\\n            this.Tooltip.style.display = \\\"block\\\";\\r\\n        }\\r\\n        else if (toolTip.Type===1)   //信息地雷提示信息\\r\\n        {\\r\\n            var scrollPos=GetScrollPosition();\\r\\n            var left = x;\\r\\n            var top = y;\\r\\n\\r\\n            var format=g_DivTooltipDataForamt.Create('KLineInfoDataStringFormat');\\r\\n            format.Value=toolTip;\\r\\n            format.Symbol=this.Symbol;\\r\\n            format.LanguageID=this.LanguageID;\\r\\n            if (!format.Operator()) return;\\r\\n            var width=format.Width;\\r\\n\\r\\n            this.Tooltip.className='jchart-klineinfo-tooltip';\\r\\n            this.Tooltip.style.position = \\\"absolute\\\";\\r\\n            if(left+width>this.UIElement.getBoundingClientRect().width){\\r\\n                this.Tooltip.style.left = (left-width) + \\\"px\\\";\\r\\n            }else{\\r\\n                this.Tooltip.style.left = left + \\\"px\\\";\\r\\n            }\\r\\n\\r\\n            this.Tooltip.style.top = (top +xMove)+ \\\"px\\\";\\r\\n            this.Tooltip.style.width = width+\\\"px\\\";\\r\\n            this.Tooltip.style.height =null;\\r\\n            this.Tooltip.innerHTML=format.Text;\\r\\n            this.Tooltip.style.display = \\\"block\\\";\\r\\n        }\\r\\n        else if (toolTip.Type==2)   //指标信息\\r\\n        {\\r\\n            var left = x;\\r\\n            var top = y;\\r\\n\\r\\n            var format=g_DivTooltipDataForamt.Create('KLineTradeDataStringFormat');\\r\\n            format.Value=toolTip;\\r\\n            format.Symbol=this.Symbol;\\r\\n            format.LanguageID=this.LanguageID;\\r\\n            if (!format.Operator()) return;\\r\\n            var width=format.Width;\\r\\n\\r\\n            this.Tooltip.className='jchart-klinetrade-tooltip';\\r\\n            this.Tooltip.style.position = \\\"absolute\\\";\\r\\n            this.Tooltip.style.left = left + \\\"px\\\";\\r\\n            this.Tooltip.style.top = (top +xMove)+ \\\"px\\\";\\r\\n            this.Tooltip.style.width = width+\\\"px\\\";\\r\\n            this.Tooltip.style.height =null;\\r\\n            this.Tooltip.innerHTML=format.Text;;\\r\\n            this.Tooltip.style.display = \\\"block\\\";\\r\\n        }\\r\\n        else if (toolTip.Type==3)   //分时图异动信息\\r\\n        {\\r\\n            var left = x;\\r\\n            var top = y;\\r\\n\\r\\n            var format=g_DivTooltipDataForamt.Create('MinuteInfoDataStringFormat');\\r\\n            format.Value=toolTip;\\r\\n            format.Symbol=this.Symbol;\\r\\n            format.LanguageID=this.LanguageID;\\r\\n            if (!format.Operator()) return;\\r\\n            var width=format.Width;\\r\\n\\r\\n            this.Tooltip.className='jchart-minuteinfo-tooltip'; //分时图异动\\r\\n            this.Tooltip.style.position = \\\"absolute\\\";\\r\\n            this.Tooltip.style.left = left + \\\"px\\\";\\r\\n            this.Tooltip.style.top = (top +xMove)+ \\\"px\\\";\\r\\n            this.Tooltip.style.width = width+\\\"px\\\";\\r\\n            this.Tooltip.style.height =null;\\r\\n            this.Tooltip.innerHTML=format.Text;;\\r\\n            this.Tooltip.style.display = \\\"block\\\";\\r\\n        }\\r\\n        else if (toolTip.Type==4)   //icon图标信息\\r\\n        {\\r\\n            var left = x;\\r\\n            var top = y;\\r\\n\\r\\n            var format=g_DivTooltipDataForamt.Create('IconDataStringFormat');\\r\\n            format.Value=toolTip;\\r\\n            format.Symbol=this.Symbol;\\r\\n            format.LanguageID=this.LanguageID;\\r\\n            if (!format.Operator()) return;\\r\\n            var width=format.Width;\\r\\n\\r\\n            this.Tooltip.className='jchart-iconinfo-tooltip'; //图标信息\\r\\n            this.Tooltip.style.position = \\\"absolute\\\";\\r\\n            this.Tooltip.style.left = left + \\\"px\\\";\\r\\n            this.Tooltip.style.top = (top +xMove)+ \\\"px\\\";\\r\\n            this.Tooltip.style.width = width+\\\"px\\\";\\r\\n            this.Tooltip.style.height =null;\\r\\n            this.Tooltip.innerHTML=format.Text;;\\r\\n            this.Tooltip.style.display = \\\"block\\\";\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.HideTooltip=function()\\r\\n    {\\r\\n        if (this.Tooltip.style.display!=\\\"none\\\") this.Tooltip.style.display = \\\"none\\\";\\r\\n    }\\r\\n\\r\\n    this.ShowSelectRect=function(x,y,x2,y2)\\r\\n    {\\r\\n        var left = x;\\r\\n        var top = y;\\r\\n\\r\\n        var border=this.Frame.ChartBorder.GetBorder();\\r\\n\\r\\n        var borderRight=border.Right;\\r\\n        var borderLeft=border.Left;\\r\\n\\r\\n        if (x>borderRight) x=borderRight;\\r\\n        if (x2>borderRight) x2=borderRight;\\r\\n\\r\\n        if (x<borderLeft) x=borderLeft;\\r\\n        if (x2<borderLeft) x2=borderLeft;\\r\\n\\r\\n        if (x>x2) left=x2;\\r\\n        if (y>y2) top=y2;\\r\\n\\r\\n        var width=Math.abs(x-x2);\\r\\n        var height=Math.abs(y-y2);\\r\\n\\r\\n        this.SelectRect.style.width = width+\\\"px\\\";\\r\\n        this.SelectRect.style.height =height+\\\"px\\\";\\r\\n        this.SelectRect.style.position = \\\"absolute\\\";\\r\\n        this.SelectRect.style.left = left +\\\"px\\\";\\r\\n        this.SelectRect.style.top = top +\\\"px\\\";\\r\\n        this.SelectRect.style.display = \\\"block\\\";\\r\\n    }\\r\\n\\r\\n    this.UpdateSelectRect=function(start,end)\\r\\n    {\\r\\n        if (!this.ChartPaint[0].Data) return;\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return;\\r\\n\\r\\n        var data=this.ChartPaint[0].Data;\\r\\n        var startItem=data.Data[start];\\r\\n        var endItem=data.Data[end];\\r\\n\\r\\n        JSConsole.Chart.Log('[JSChartContainer::UpdateSelectRect]',startItem,endItem);\\r\\n        paint.SetPoint(startItem, { Index:0 });\\r\\n        paint.SetPoint(endItem, { Index:1 });\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.HideSelectRect=function()\\r\\n    {\\r\\n        this.SelectRect.style.display = \\\"none\\\";\\r\\n    }\\r\\n\\r\\n    this.ResetFrameXYSplit=function()\\r\\n    {\\r\\n        if (typeof(this.Frame.ResetXYSplit)=='function')\\r\\n            this.Frame.ResetXYSplit();\\r\\n    }\\r\\n\\r\\n    this.UpdateFrameMaxMin=function()\\r\\n    {\\r\\n        var frameMaxMinData=new Array();\\r\\n\\r\\n        var chartPaint=new Array();\\r\\n\\r\\n        for(var i=0;i<this.ChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item.IsShow==false) continue;   //隐藏的图形不计算\\r\\n            chartPaint.push(this.ChartPaint[i]);\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.OverlayChartPaint.length;++i)\\r\\n        {\\r\\n            chartPaint.push(this.OverlayChartPaint[i]);\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<chartPaint.length;++i)\\r\\n        {\\r\\n            var paint=chartPaint[i];\\r\\n            var range=paint.GetMaxMin();\\r\\n            if (range==null || range.Max==null || range.Min==null) continue;\\r\\n            var frameItem=null;\\r\\n            for(var j in frameMaxMinData)\\r\\n            {\\r\\n                if (frameMaxMinData[j].Frame==paint.ChartFrame)\\r\\n                {\\r\\n                    frameItem=frameMaxMinData[j];\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (frameItem)\\r\\n            {\\r\\n                if (frameItem.Range.Max<range.Max) frameItem.Range.Max=range.Max;\\r\\n                if (frameItem.Range.Min>range.Min) frameItem.Range.Min=range.Min;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                frameItem={ OverlayFrame:[] };\\r\\n                frameItem.Frame=paint.ChartFrame;\\r\\n                frameItem.Range=range;\\r\\n                frameMaxMinData.push(frameItem);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var mapFrame=new Map();\\r\\n        for(var i=0;i<frameMaxMinData.length;++i)\\r\\n        {\\r\\n            var item=frameMaxMinData[i];\\r\\n            mapFrame.set(item.Frame.Identify,item);\\r\\n        }\\r\\n\\r\\n        //叠加坐标Y轴使用主图指标， 最大最小值\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var subFrame=this.Frame.SubFrame[i];\\r\\n            for(var j=0;j<subFrame.OverlayIndex.length;++j)\\r\\n            {\\r\\n                var overlayItem=subFrame.OverlayIndex[j];\\r\\n                var overlayFrame=overlayItem.Frame;\\r\\n                if (overlayFrame.IsShareY!=true) continue;\\r\\n                if (!overlayFrame.MainFrame) continue;\\r\\n                if (!mapFrame.has(overlayFrame.MainFrame.Identify)) continue;\\r\\n\\r\\n                var frameItem=mapFrame.get(overlayFrame.MainFrame.Identify);\\r\\n                if (!frameItem) continue;\\r\\n                frameItem.OverlayFrame.push(overlayFrame);\\r\\n                for(var k in overlayItem.ChartPaint)\\r\\n                {\\r\\n                    var paint=overlayItem.ChartPaint[k];\\r\\n                    var range=paint.GetMaxMin();\\r\\n                    if (range==null || range.Max==null || range.Min==null) continue;\\r\\n\\r\\n                    if (frameItem.Range.Max<range.Max) frameItem.Range.Max=range.Max;\\r\\n                    if (frameItem.Range.Min>range.Min) frameItem.Range.Min=range.Min;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<frameMaxMinData.length;++i)\\r\\n        {\\r\\n            var item=frameMaxMinData[i];\\r\\n            if (!item.Frame || !item.Range) continue;\\r\\n            if (item.Range.Max==null || item.Range.Min==null) continue;\\r\\n            if (item.Frame.YSpecificMaxMin)\\r\\n            {\\r\\n                item.Frame.HorizontalMax=item.Frame.YSpecificMaxMin.Max;\\r\\n                item.Frame.HorizontalMin=item.Frame.YSpecificMaxMin.Min;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                item.Frame.HorizontalMax=item.Range.Max;\\r\\n                item.Frame.HorizontalMin=item.Range.Min;\\r\\n            }\\r\\n            item.Frame.XYSplit=true;\\r\\n\\r\\n            for(var j in item.OverlayFrame)\\r\\n            {\\r\\n                item.OverlayFrame[j].XYSplit=true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n\\r\\n        //更新独立子坐标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var subFrame=this.Frame.SubFrame[i];\\r\\n            for(var j=0;j<subFrame.OverlayIndex.length;++j)\\r\\n            {\\r\\n                var overlayItem=subFrame.OverlayIndex[j];\\r\\n                if (overlayItem.Frame.IsShareY===true) continue;\\r\\n                overlayItem.UpdateFrameMaxMin();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DataMoveLeft=function()\\r\\n    {\\r\\n        var data=null;\\r\\n        if (!this.Frame.Data) data=this.Frame.Data;\\r\\n        else data=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!data) return false;\\r\\n        if (data.DataOffset<=0) return false;\\r\\n        --data.DataOffset;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.DataMoveRight=function()\\r\\n    {\\r\\n        var data=null;\\r\\n        if (!this.Frame.Data) data=this.Frame.Data;\\r\\n        else data=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var xPointcount=0;\\r\\n        if (this.Frame.XPointCount) xPointcount=this.Frame.XPointCount;\\r\\n        else xPointcount=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n        if (!xPointcount) return false;\\r\\n\\r\\n        if (xPointcount+data.DataOffset>=data.Data.length) return false;\\r\\n\\r\\n        ++data.DataOffset;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.UpdataDataoffset=function()\\r\\n    {\\r\\n        var data=null;\\r\\n        if (this.Frame.Data)\\r\\n            data=this.Frame.Data;\\r\\n        else\\r\\n            data=this.Frame.SubFrame[0].Frame.Data;\\r\\n\\r\\n        if (!data) return;\\r\\n\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            var item =this.ChartPaint[i];\\r\\n            if (!item.Data) continue;\\r\\n            item.Data.DataOffset=data.DataOffset;\\r\\n        }\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item =this.OverlayChartPaint[i];\\r\\n            if (!item.Data) continue;\\r\\n            item.Data.DataOffset=data.DataOffset;\\r\\n        }\\r\\n\\r\\n        //叠加指标当前显示的数据偏移\\r\\n        for (var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var subFrame=this.Frame.SubFrame[i];\\r\\n            for(var j in subFrame.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=subFrame.OverlayIndex[j];\\r\\n                for(var k in overlayItem.ChartPaint)\\r\\n                {\\r\\n                    var item=overlayItem.ChartPaint[k];\\r\\n                    if (!item.Data) continue;\\r\\n                    item.Data.DataOffset=data.DataOffset;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetMoveOneStepWidth=function()\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsPlusNumber(this.StepPixel)) return this.StepPixel;\\r\\n\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        var mainFrame=this.Frame.SubFrame[0].Frame;\\r\\n        var dataWidth=mainFrame.DataWidth;\\r\\n        var distanceWidth=mainFrame.DistanceWidth;\\r\\n        var oneStepWidth=this.StepPixel;\\r\\n        var oneStepWidth=(dataWidth+distanceWidth)/pixelRatio;\\r\\n        if (oneStepWidth<1) oneStepWidth=1;\\r\\n\\r\\n        return oneStepWidth;\\r\\n    }\\r\\n\\r\\n    this.DataMove=function(step,isLeft)\\r\\n    {\\r\\n        var oneStepWidth=this.GetMoveOneStepWidth();\\r\\n        var moveStep=step;\\r\\n        step=parseInt(step/oneStepWidth);  //除以4个像素\\r\\n        if (step<=0) return false;\\r\\n\\r\\n        var data=null;\\r\\n        if (!this.Frame.Data) data=this.Frame.Data;\\r\\n        else data=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var xPointcount=0;\\r\\n        if (this.Frame.XPointCount) xPointcount=this.Frame.XPointCount;\\r\\n        else xPointcount=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n        if (!xPointcount) return false;\\r\\n\\r\\n        if (this.Frame.SubFrame && this.Frame.SubFrame.length>0 && this.Frame.SubFrame[0].Frame)\\r\\n        {\\r\\n            var fristFrame=this.Frame.SubFrame[0].Frame;\\r\\n            if (fristFrame.DataWidth<=1 || fristFrame.DistanceWidth<=1) //K线在缩放很小的时候 移动加速\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsPlusNumber(this.StepPixel))\\r\\n                    step=moveStep*this.StepPixel;\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        if (isLeft) //-->\\r\\n        {\\r\\n            if (this.RightSpaceCount>0)\\r\\n            {\\r\\n                if (xPointcount+data.DataOffset>=data.Data.length+this.RightSpaceCount-1) return false;\\r\\n                data.DataOffset+=step;\\r\\n\\r\\n                if (data.DataOffset+xPointcount>=data.Data.length+this.RightSpaceCount)\\r\\n                    data.DataOffset=data.Data.length-(xPointcount-this.RightSpaceCount);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (xPointcount+data.DataOffset>=data.Data.length) return false;\\r\\n                data.DataOffset+=step;\\r\\n\\r\\n                if (data.DataOffset+xPointcount>=data.Data.length)\\r\\n                    data.DataOffset=data.Data.length-xPointcount;\\r\\n            }\\r\\n            return true;\\r\\n        }\\r\\n        else        //<--\\r\\n        {\\r\\n            if (data.DataOffset<=0) return false;\\r\\n\\r\\n            data.DataOffset-=step;\\r\\n            if (data.DataOffset<0) data.DataOffset=0;\\r\\n\\r\\n            return true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.XCoordinateZoom=function(step, isMoveLeft)\\r\\n    {\\r\\n        var oneStepWidth=this.GetMoveOneStepWidth();\\r\\n        var moveStep=step;\\r\\n        step=parseInt(step/oneStepWidth);  //除以4个像素\\r\\n        if (step<=0) return false;\\r\\n\\r\\n        return this.Frame.XCoordinateZoom(isMoveLeft);\\r\\n    }\\r\\n\\r\\n    //获取鼠标在当前子窗口id\\r\\n    this.GetSubFrameIndex=function(x,y)\\r\\n    {\\r\\n        if (!this.Frame.SubFrame || this.Frame.SubFrame.length<=0) return -1;\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var frame=this.Frame.SubFrame[i].Frame;\\r\\n            var left=frame.ChartBorder.GetLeft();\\r\\n            var top=frame.ChartBorder.GetTop();\\r\\n            var height=frame.ChartBorder.GetHeight();\\r\\n            var width=frame.ChartBorder.GetWidth();\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(left,top,width,height);\\r\\n            if (this.Canvas.isPointInPath(x,y)) return parseInt(i);\\r\\n\\r\\n        }\\r\\n        return 0;\\r\\n    }\\r\\n\\r\\n    //根据X坐标获取数据索引\\r\\n    this.GetDataIndexByPoint=function(x)\\r\\n    {\\r\\n        var frame=this.Frame;\\r\\n        if (this.Frame.SubFrame && this.Frame.SubFrame.length>0) frame=this.Frame.SubFrame[0].Frame;\\r\\n\\r\\n        var data=null;\\r\\n        if (this.Frame.Data)\\r\\n            data=this.Frame.Data;\\r\\n        else\\r\\n            data=this.Frame.SubFrame[0].Frame.Data;\\r\\n\\r\\n        if (!data || !frame) return;\\r\\n\\r\\n        var index=parseInt(frame.GetXData(x));\\r\\n\\r\\n        //JSConsole.Chart.Log('x='+ x +' date='+data.Data[data.DataOffset+index].Date);\\r\\n        return data.DataOffset+index;\\r\\n    }\\r\\n\\r\\n    //获取主数据\\r\\n    this.GetSelectRectData=function(selectData)\\r\\n    {\\r\\n        if (Math.abs(selectData.XStart-selectData.XEnd)<5) return false;\\r\\n\\r\\n        var startClientPos=this.PtInClient(selectData.XStart, selectData.YStart);\\r\\n        var endClientPos=this.PtInClient(selectData.XEnd, selectData.YEnd);\\r\\n\\r\\n        var data=null;\\r\\n        if (this.Frame.Data)\\r\\n            data=this.Frame.Data;\\r\\n        else\\r\\n            data=this.Frame.SubFrame[0].Frame.Data;\\r\\n\\r\\n        if (!data) return false;\\r\\n\\r\\n        var start=this.GetDataIndexByPoint(selectData.XStart);\\r\\n        var end=this.GetDataIndexByPoint(selectData.XEnd);\\r\\n\\r\\n        if (Math.abs(start-end)<2) return false;\\r\\n\\r\\n        selectData.Data=data;\\r\\n        if (start>end)\\r\\n        {\\r\\n            selectData.Start=end;\\r\\n            selectData.End=start;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            selectData.Start=start;\\r\\n            selectData.End=end;\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //获取当前的点对应的 画图工具的图形\\r\\n    //data.X data.Y 鼠标位置  返回 data.ChartDrawPicture 数据在画图工具 data.PointIndex 在画图工具对应点索引\\r\\n    this.GetChartDrawPictureByPoint=function(data)\\r\\n    {\\r\\n        for(var i in this.ChartDrawPicture)\\r\\n        {\\r\\n            var item =this.ChartDrawPicture[i];\\r\\n            var pointIndex=item.IsPointIn(data.X,data.Y);\\r\\n            if (pointIndex===false) continue;\\r\\n\\r\\n            if (pointIndex>=0)\\r\\n            {\\r\\n                data.ChartDrawPicture=item;\\r\\n                data.PointIndex=pointIndex;\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    // 保存图片\\r\\n    this.SaveToImage = function (format,colorGB)\\r\\n    {\\r\\n        if (this.UIElement.width<=0 || this.UIElement.height<=0) return null;\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash) return null; // 数据加载中不能保存\\r\\n\\r\\n        JSConsole.Chart.Log('[JSChartContainer::SaveToImage]', this.UIElement);\\r\\n        var clrBG='rgb(255,255,255)';\\r\\n        if (colorGB) clrBG=colorGB;\\r\\n        this.Canvas.clearRect(0,0,this.UIElement.width,this.UIElement.height);\\r\\n        this.Canvas.fillStyle=clrBG;\\r\\n        this.Canvas.fillRect(0,0,this.UIElement.width,this.UIElement.height);   //画一个背景色, 不然是一个黑的背景\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        this.Canvas.lineWidth=pixelTatio;       //手机端需要根据分辨率比调整线段宽度\\r\\n\\r\\n        this.Frame.Draw();  //框架\\r\\n\\r\\n        for (var i in this.ChartPaint)  //框架内图形\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item.IsDrawFirst)\\r\\n                item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (!item.IsDrawFirst)\\r\\n                item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i in this.ChartPaintEx)\\r\\n        {\\r\\n            var item=this.ChartPaintEx[i];\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)    //叠加股票\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n\\r\\n        for(var i in this.ExtendChartPaint)     //固定扩展图形\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (!item.IsDynamic && item.IsAnimation==false) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.Frame.DrawInsideHorizontal) this.Frame.DrawInsideHorizontal();\\r\\n        this.Frame.DrawLock();\\r\\n\\r\\n        for(var i in this.ExtendChartPaint) //动态扩展图形\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsDynamic && item.DrawAfterTitle===false) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.LastPoint.X!=null || this.LastPoint.Y!=null)\\r\\n        {\\r\\n            if (this.ChartCorssCursor)  //十字光标不画\\r\\n            {\\r\\n                this.ChartCorssCursor.LastPoint=this.LastPoint;\\r\\n                this.ChartCorssCursor.CursorIndex=this.CursorIndex;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in this.TitlePaint)\\r\\n        {\\r\\n            var item=this.TitlePaint[i];\\r\\n            if (!item.IsDynamic) continue;\\r\\n\\r\\n            item.CursorIndex=this.CursorIndex;\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        for(var i in this.ExtendChartPaint) //动态扩展图形\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.IsDynamic && item.DrawAfterTitle===true && item.IsAnimation==false) item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.EnableAnimation)\\r\\n        {\\r\\n            for(var i in this.ExtendChartPaint)    //动画\\r\\n            {\\r\\n                var item=this.ExtendChartPaint[i];\\r\\n                if (item.IsAnimation===true) item.Draw();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in this.ChartDrawPicture)\\r\\n        {\\r\\n            var item=this.ChartDrawPicture[i];\\r\\n            item.Draw();\\r\\n        }\\r\\n\\r\\n        if (this.CurrentChartDrawPicture && this.CurrentChartDrawPicture.Status!=10)\\r\\n        {\\r\\n            this.CurrentChartDrawPicture.Draw();\\r\\n        }\\r\\n\\r\\n        var dataURL=this.UIElement.toDataURL(format ? format:'image/png', 1.0);\\r\\n        JSConsole.Chart.Log('[JSChartContainer::SaveToImage] data= ', dataURL);\\r\\n        return dataURL;\\r\\n    }\\r\\n\\r\\n\\r\\n    this.SaveToImageUrl=function(obj,callback) //obj:{Format: 图片格式, ColorGB: 背景色}, callback:function(bSuccess,obj)\\r\\n    {\\r\\n        if (!obj) obj={Format:'image/png', ColorGB:'rgb(255,255,255)'};\\r\\n        var imageData=this.SaveToImage(obj.Format, obj.ColorGB);\\r\\n        var postData={\\\"Base64\\\":imageData, \\\"BucketName\\\":\\\"downloadcache\\\", \\\"Path\\\":\\\"hqchart/hq_snapshot\\\"};\\r\\n        var url=g_JSChartResource.Domain+'/API/FileUploadForBase64';\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            method: \\\"POST\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            data: postData,\\r\\n            success: function (data)\\r\\n            {\\r\\n                JSConsole.Chart.Log('[JSChartContainer::SaveToImageUrl] recv data', data);\\r\\n                var result={Path:data.relativeurl, Domain:'https://opensourcedownload.zealink.com'};\\r\\n                result.Url=`${result.Domain}/${result.Path}`;\\r\\n                if (callback) callback(true,result,'');\\r\\n            },\\r\\n            error: function (request)\\r\\n            {\\r\\n                JSConsole.Chart.Log('[JSChartContainer::SaveToImageUrl] error ', request);\\r\\n                if (callback) callback(false,null,'upload failed');\\r\\n            }\\r\\n        });\\r\\n\\r\\n    }\\r\\n\\r\\n    this.SetLanguage=function(language)\\r\\n    {\\r\\n        var languageID=null;\\r\\n        switch(language)\\r\\n        {\\r\\n            case 'EN':\\r\\n                languageID=JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID;\\r\\n                break;\\r\\n            case 'CN':\\r\\n                languageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n                break;\\r\\n            case \\\"TC\\\":\\r\\n                languageID=JSCHART_LANGUAGE_ID.LANGUAGE_TRADITIONAL_CHINESE_ID;\\r\\n                break;\\r\\n            default:\\r\\n                console.warn(`[JSChartContainer::SetLanguage] language=${language} error`);\\r\\n                return;\\r\\n        }\\r\\n\\r\\n        if (this.LanguageID==languageID) return;\\r\\n\\r\\n        this.LanguageID=languageID;\\r\\n        if (this.ChartCorssCursor && this.ChartCorssCursor.StringFormatY) this.ChartCorssCursor.StringFormatY.LanguageID=this.LanguageID;\\r\\n\\r\\n        for(var i in this.TitlePaint)\\r\\n        {\\r\\n            var item=this.TitlePaint[i];\\r\\n            if (item) item.LanguageID=this.LanguageID;\\r\\n        }\\r\\n\\r\\n        if (this.Frame && this.Frame.SetLanguage) this.Frame.SetLanguage(this.LanguageID);\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ReloadTiltePaintResource=function(resource)  //重新加载配置\\r\\n    {\\r\\n        for(var i in this.TitlePaint)\\r\\n        {\\r\\n            var item=this.TitlePaint[i];\\r\\n            if (item.ReloadResource) item.ReloadResource(resource);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadExtendChartPaintResource=function(resource)  //扩展画法重新加载配置\\r\\n    {\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ReloadResource) item.ReloadResource(resource);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadResource=function(option)\\r\\n    {\\r\\n        this.ReloadBorder(option);\\r\\n        this.ReloadTiltePaintResource(option.Resource);\\r\\n        this.ReloadChartPaint(option.Resource);\\r\\n        this.ReloadFrame(option.Resource);\\r\\n        this.ReloadExtendChartPaintResource(option.Resource);\\r\\n        this.ReloadChartCorssCursor(option,option.Resource);\\r\\n\\r\\n        if (option.Update && this.Update) this.Update( {UpdateCursorIndexType:2} );       //是否立即更新并重绘\\r\\n        else if (option.Draw==true) this.Draw(); //是否立即重绘\\r\\n    }\\r\\n\\r\\n    this.ReloadBorder=function(option)  //根据页面缩放调整对应边框的尺长\\r\\n    {\\r\\n        if (!option) return;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        if (option.Border)\\r\\n        {\\r\\n            var item=option.Border;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Left)) this.Frame.ChartBorder.Left=item.Left*pixelTatio;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Right)) this.Frame.ChartBorder.Right=item.Right*pixelTatio;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Top)) this.Frame.ChartBorder.Top=item.Top*pixelTatio;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Bottom)) this.Frame.ChartBorder.Bottom=item.Bottom*pixelTatio;\\r\\n        }\\r\\n\\r\\n        for(var i in option.Windows)\\r\\n        {\\r\\n            var item=option.Windows[i];\\r\\n            if (i>=this.Frame.SubFrame.length) continue;\\r\\n            var subFrame=this.Frame.SubFrame[i];\\r\\n            var border=subFrame.Frame.ChartBorder;\\r\\n            if (IFrameSplitOperator.IsNumber(item.TitleHeight)) border.TitleHeight=item.TitleHeight*pixelTatio;\\r\\n        }\\r\\n\\r\\n        for(var i in option.Frame)\\r\\n        {\\r\\n            var item=option.Frame[i];\\r\\n            if (i>=this.Frame.SubFrame.length) continue;\\r\\n\\r\\n            var subFrame=this.Frame.SubFrame[i];\\r\\n            var border=subFrame.Frame.ChartBorder;\\r\\n            if (item.TopSpace>=0) border.TopSpace=item.TopSpace*pixelTatio;\\r\\n            if (item.BottomSpace>=0) border.BottomSpace=item.BottomSpace*pixelTatio;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadFrame=function(resource)\\r\\n    {\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            var subFrame=item.Frame;\\r\\n            if (subFrame && subFrame.ReloadResource) subFrame.ReloadResource(resource);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadChartPaint=function(resource)\\r\\n    {\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item && item.ReloadResource) item.ReloadResource(resource);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadChartCorssCursor=function(option, resource)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        if (option && option.CorssCursor)\\r\\n        {\\r\\n            var item=option.CorssCursor;\\r\\n            if (IFrameSplitOperator.IsNumber(item.TitleHeight)) this.ChartCorssCursor.TextHeight=item.TitleHeight*pixelTatio;  //十字光标文本信息高度\\r\\n        }\\r\\n\\r\\n        if (this.ChartCorssCursor.ReloadResource) this.ChartCorssCursor.ReloadResource(resource);\\r\\n    }\\r\\n\\r\\n    this.SetDepthMapData=function(depthData, bDraw)\\r\\n    {\\r\\n        for(var i in depthData)\\r\\n        {\\r\\n            var item=depthData[i];\\r\\n            for(var j in this.ExtendChartPaint)\\r\\n            {\\r\\n                var chart=this.ExtendChartPaint[j];\\r\\n                if (chart.ID==item.ID)\\r\\n                {\\r\\n                    chart.Data=item.Data;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bDraw) this.Draw();\\r\\n    }\\r\\n\\r\\n    //画图工具\\r\\n    //把X, Y绝对位置转成的相对位置的点\\r\\n    this.PointAbsoluteToRelative=function(x, y, isPhone)\\r\\n    {\\r\\n        var pt={ X:x, Y:y };\\r\\n        var pixelTatio = GetDevicePixelRatio();             //x,y是原始坐标 需要乘以放大倍速\\r\\n        var uiRect=this.UIElement.getBoundingClientRect();  //dom返回的是没有放大倍数的值\\r\\n\\r\\n        if (isPhone)\\r\\n        {\\r\\n            pt.X=x-uiRect.left*pixelTatio;      //手机端 dom返回的是没有放大倍数的值\\r\\n            pt.Y=y-uiRect.top*pixelTatio;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            pt.X=(x-uiRect.left)*pixelTatio;\\r\\n            pt.Y=(y-uiRect.top)*pixelTatio;\\r\\n        }\\r\\n\\r\\n        return pt;\\r\\n    }\\r\\n\\r\\n    this.SetChartDrawPictureFirstPoint=function(x,y, isPhone)\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n        if (!this.Frame.SubFrame || this.Frame.SubFrame.length<=0) return false;\\r\\n\\r\\n        //相对坐标\\r\\n        var pt=this.PointAbsoluteToRelative(x, y, isPhone);\\r\\n        var xFixed=pt.X;\\r\\n        var yFixed=pt.Y;\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var frame=this.Frame.SubFrame[i].Frame;\\r\\n            var left=frame.ChartBorder.GetLeft();\\r\\n            var top=frame.ChartBorder.GetTopEx();\\r\\n            var height=frame.ChartBorder.GetHeight();\\r\\n            var width=frame.ChartBorder.GetWidth();\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(left,top,width,height);\\r\\n            if (this.Canvas.isPointInPath(xFixed,yFixed))\\r\\n            {\\r\\n                drawPicture.Frame=frame;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!drawPicture.Frame) return false;\\r\\n\\r\\n        drawPicture.Point[0]=new Point();\\r\\n        drawPicture.Point[0].X=xFixed;\\r\\n        drawPicture.Point[0].Y=yFixed;\\r\\n        drawPicture.Status=1;   //第1个点完成\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.SetChartDrawPictureSecondPoint=function(x,y,isPhone)\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n\\r\\n        //相对坐标\\r\\n        var pt=this.PointAbsoluteToRelative(x, y, isPhone);\\r\\n\\r\\n        drawPicture.Point[1]=new Point();\\r\\n        drawPicture.Point[1].X=pt.X;\\r\\n        drawPicture.Point[1].Y=pt.Y;\\r\\n\\r\\n        drawPicture.Status=2;   //设置第2个点\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //设置第3个点\\r\\n    this.SetChartDrawPictureThirdPoint=function(x,y,isPhone)\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n\\r\\n        //相对坐标\\r\\n        var pt=this.PointAbsoluteToRelative(x, y, isPhone);\\r\\n\\r\\n        drawPicture.Point[2]=new Point();\\r\\n        drawPicture.Point[2].X=pt.X;\\r\\n        drawPicture.Point[2].Y=pt.Y;\\r\\n\\r\\n        drawPicture.Status=3;   //设置第3个点\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //xStep,yStep 移动的偏移量\\r\\n    this.MoveChartDrawPicture=function(x,y,isPhone)\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速\\r\\n        if (isPhone) pixelTatio=1;\\r\\n        var xStep=x*pixelTatio;\\r\\n        var yStep=y*pixelTatio;\\r\\n        //JSConsole.Chart.Log(\\\"xStep=\\\"+xStep+\\\" yStep=\\\"+yStep);\\r\\n        drawPicture.Move(xStep,yStep);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.FinishChartDrawPicturePoint=function()\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n        if (drawPicture.PointCount!=drawPicture.Point.length) return false;\\r\\n        if (drawPicture.ClassName==\\\"ChartDrawRuler\\\")    //尺子不用保存的\\r\\n        {\\r\\n            this.CurrentChartDrawPicture=null;\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        drawPicture.Status=10;  //完成\\r\\n        drawPicture.PointToValue();\\r\\n\\r\\n        this.ChartDrawPicture.push(drawPicture);\\r\\n        this.CurrentChartDrawPicture=null;\\r\\n\\r\\n        //通知上层画好了\\r\\n        let event=this.GetEventCallback(JSCHART_EVENT_ID.ON_FINISH_DRAWPICTURE); //完成画图工具事件\\r\\n        if (event && event.Callback)\\r\\n        {\\r\\n            let sendData={ DrawPicture: drawPicture };\\r\\n            event.Callback(event,sendData,this);\\r\\n        }\\r\\n        else if (drawPicture.FinishedCallback) drawPicture.FinishedCallback(drawPicture);\\r\\n\\r\\n        if (this.ChartDrawStorage) this.ChartDrawStorage.SaveDrawData(drawPicture);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //选中画图工具 出现单个图形设置菜单\\r\\n    this.OnSelectChartPicture=function(chart)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[JSChartContainer::OnSelectChartPicture',chart);\\r\\n        if (!this.ChartPictureMenu) this.ChartPictureMenu=new ChartPictureSettingMenu(this.UIElement.parentNode);\\r\\n\\r\\n        var event={ data: { ChartPicture:chart, HQChart:this}};\\r\\n        this.ChartPictureMenu.DoModal(event);\\r\\n    }\\r\\n\\r\\n    this.FinishMoveChartDrawPicture=function()\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n        if (drawPicture.PointCount!=drawPicture.Point.length) return false;\\r\\n\\r\\n        drawPicture.Status=10;  //完成\\r\\n        drawPicture.PointToValue();\\r\\n\\r\\n        if (this.ChartDrawStorage) this.ChartDrawStorage.SaveDrawData(drawPicture);\\r\\n\\r\\n        this.CurrentChartDrawPicture=null;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //清空所有的画线工具\\r\\n    this.ClearChartDrawPicture=function(drawPicture)\\r\\n    {\\r\\n        if (!drawPicture)\\r\\n        {\\r\\n            this.ChartDrawPicture=[];\\r\\n            if (this.ChartDrawStorage) this.ChartDrawStorage.Clear();\\r\\n            this.Draw();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in this.ChartDrawPicture)\\r\\n            {\\r\\n                if (this.ChartDrawPicture[i]==drawPicture)\\r\\n                {\\r\\n                    if (this.ChartDrawStorage) this.ChartDrawStorage.DeleteDrawData(drawPicture);\\r\\n                    this.ChartDrawPicture.splice(i,1);\\r\\n                    this.Draw();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetChartDrawOption=function(option)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsBool(option.IsLockScreen)) this.ChartDrawOption.IsLockScreen=option.IsLockScreen;\\r\\n        if (IFrameSplitOperator.IsNumber(option.Zoom) && option.Zoom>=0)  this.ChartDrawOption.Zoom=option.Zoom;\\r\\n    }\\r\\n\\r\\n    //是否显示十字光标的十字线\\r\\n    this.EnableShowCorssCursorLine=function(bShow)\\r\\n    {\\r\\n        if (!this.ChartCorssCursor) return;\\r\\n\\r\\n        this.ChartCorssCursor.IsShowCorss=bShow;\\r\\n    }\\r\\n\\r\\n    //获取扩展画法\\r\\n    this.GetExtendChartByClassName=function(name)\\r\\n    {\\r\\n        for(var i=0; i<this.ExtendChartPaint.length; ++i)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName==name) return { Index:i, Chart:item };\\r\\n        }\\r\\n\\r\\n        return null\\r\\n    }\\r\\n\\r\\n    this.GetExtendChartRightWidth=function()  //扩展画法右边宽度\\r\\n    {\\r\\n        var width=0;\\r\\n        for(var i=0; i<this.ExtendChartPaint.length; ++i)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (!item) continue;\\r\\n            if (item.ClassName==\\\"StockChip\\\" || item.ClassName==\\\"DrawToolsButton\\\")\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(item.Width))\\r\\n                    width+=item.Width;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return width;\\r\\n    }\\r\\n\\r\\n    //删除扩展画法\\r\\n    this.DeleteExtendChart=function(data)\\r\\n    {\\r\\n        if (data.Index>=this.ExtendChartPaint.length) return;\\r\\n        if (this.ExtendChartPaint[data.Index]!=data.Chart) return;\\r\\n\\r\\n        if (typeof(data.Chart.Clear)=='function') data.Chart.Clear();\\r\\n        this.ExtendChartPaint.splice(data.Index,1);\\r\\n    }\\r\\n\\r\\n    //全屏提示信息 { Title:提示信息, Draw:false/true 是否立即重绘, }\\r\\n    this.EnableSplashScreen=function(option)\\r\\n    {\\r\\n        if (!this.ChartSplashPaint) return;\\r\\n        if (!option) return;\\r\\n\\r\\n        if (IFrameSplitOperator.IsString(option.Title)) this.ChartSplashPaint.SetTitle(option.Title);\\r\\n        this.ChartSplashPaint.EnableSplash(true);\\r\\n\\r\\n        if (option.Draw===false) return;\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.SetSubFrameOption=function(subFrame, option)\\r\\n    {\\r\\n        if (!option) return;\\r\\n\\r\\n        if (option.Window)\\r\\n        {\\r\\n            var item=option.Window;\\r\\n            if (item.Modify!=null) subFrame.Frame.ModifyIndex=item.Modify;\\r\\n            if (item.Change!=null) subFrame.Frame.ChangeIndex=item.Change;\\r\\n            if (item.Close!=null) subFrame.Frame.CloseIndex=item.Close;\\r\\n            if (item.Overlay!=null) subFrame.Frame.OverlayIndex=item.Overlay;\\r\\n            if (item.IsDrawTitleBG==true)  subFrame.Frame.IsDrawTitleBG=item.IsDrawTitleBG;\\r\\n\\r\\n            if (item.OverlayIndexType)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(item.OverlayIndexType.Position)) subFrame.Frame.OverlayIndexType.Position=item.OverlayIndexType.Position;\\r\\n                if (IFrameSplitOperator.IsNumber(item.OverlayIndexType.LineSpace)) subFrame.Frame.OverlayIndexType.LineSpace=item.OverlayIndexType.LineSpace;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(option.SplitCount)) subFrame.Frame.YSplitOperator.SplitCount=option.SplitCount;\\r\\n        if (IFrameSplitOperator.IsNumber(option.TitleHeight)) subFrame.Frame.ChartBorder.TitleHeight=option.TitleHeight;\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowTitleArraw)) subFrame.Frame.IsShowTitleArraw=option.IsShowTitleArraw;\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowIndexName)) subFrame.Frame.IsShowIndexName=option.IsShowIndexName;\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowOverlayIndexName)) subFrame.Frame.IsShowOverlayIndexName=option.IsShowOverlayIndexName;\\r\\n        if (IFrameSplitOperator.IsNumber(option.IndexParamSpace)) subFrame.Frame.IndexParamSpace=option.IndexParamSpace;\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowXLine)) subFrame.Frame.IsShowXLine=option.IsShowXLine;\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowYLine)) subFrame.Frame.IsShowYLine=option.IsShowYLine;\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowIndexTitle)) subFrame.Frame.IsShowIndexTitle=option.IsShowIndexTitle;\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowLeftText))\\r\\n        {\\r\\n            subFrame.Frame.IsShowYText[0]=option.IsShowLeftText;\\r\\n            subFrame.Frame.YSplitOperator.IsShowLeftText=option.IsShowLeftText;            //显示左边刻度\\r\\n        }\\r\\n        if (IFrameSplitOperator.IsBool(option.IsShowRightText))\\r\\n        {\\r\\n            subFrame.Frame.IsShowYText[1]=option.IsShowRightText;\\r\\n            subFrame.Frame.YSplitOperator.IsShowRightText=option.IsShowRightText;         //显示右边刻度\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    //增加一个指标窗口\\r\\n    this.AddIndexWindow=function(indexName,option)\\r\\n    {\\r\\n        //查找系统指标\\r\\n        let scriptData = new JSIndexScript();\\r\\n        let indexInfo = scriptData.Get(indexName);\\r\\n        if (!indexInfo) return;\\r\\n\\r\\n        this.RemoveMinSizeWindows();    //清空隐藏的指标\\r\\n\\r\\n        var index=this.Frame.SubFrame.length;\\r\\n        var subFrame=this.CreateSubFrameItem(index);\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        subFrame.Frame.ChartBorder.TitleHeight*=pixelRatio;\\r\\n        this.Frame.SubFrame[index]=subFrame;\\r\\n        var titlePaint=new DynamicChartTitlePainting();\\r\\n        titlePaint.Frame=this.Frame.SubFrame[index].Frame;\\r\\n        titlePaint.Canvas=this.Canvas;\\r\\n        titlePaint.LanguageID=this.LanguageID;\\r\\n        titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n        this.TitlePaint[index+1]=titlePaint;\\r\\n\\r\\n        this.SetSubFrameOption(subFrame,option);\\r\\n\\r\\n        //最后一个显示X轴坐标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n            else item.XSplitOperator.ShowText=false;\\r\\n        }\\r\\n\\r\\n        this.UpdataDataoffset();        //更新数据偏移\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        if (this.UpdateXShowText) this.UpdateXShowText();\\r\\n        this.ResetFrameXYSplit();\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n\\r\\n        var indexData =\\r\\n            {\\r\\n                Name:indexInfo.Name, Script:indexInfo.Script, Args: indexInfo.Args, ID:indexName ,\\r\\n                //扩展属性 可以是空\\r\\n                KLineType:indexInfo.KLineType,  YSpecificMaxMin:indexInfo.YSpecificMaxMin,  YSplitScale:indexInfo.YSplitScale,\\r\\n                FloatPrecision:indexInfo.FloatPrecision, Condition:indexInfo.Condition,StringFormat:indexInfo.StringFormat,\\r\\n                OutName:indexInfo.OutName\\r\\n            };\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.FloatPrecision>=0) indexData.FloatPrecision=option.FloatPrecision;\\r\\n            if (option.StringFormat>0) indexData.StringFormat=option.StringFormat;\\r\\n            if (option.Args) indexData.Args=option.Args;\\r\\n        }\\r\\n\\r\\n        this.WindowIndex[index] = new ScriptIndex(indexData.Name, indexData.Script, indexData.Args,indexData);    //脚本执行\\r\\n        if (this.ClassName==\\\"MinuteChartContainer\\\" || this.ClassName==\\\"MinuteChartHScreenContainer\\\")\\r\\n            var bindData=this.SourceData;\\r\\n        else\\r\\n            var bindData=this.ChartPaint[0].Data;\\r\\n\\r\\n        this.BindIndexData(index,bindData);     //执行脚本\\r\\n    }\\r\\n\\r\\n    //区间选择\\r\\n    this.GetRectSelectPaint=function()\\r\\n    {\\r\\n        for(var i=0;i<this.ExtendChartPaint.length;++i)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName==\\\"RectSelectPaint\\\")\\r\\n                return item;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.SetRectSelectData=function(kItem)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return false;\\r\\n\\r\\n        if (paint.GetPointCount()==2) return false;\\r\\n\\r\\n        return paint.SetPoint(kItem);\\r\\n    }\\r\\n\\r\\n    this.MoveRectSelectPoint=function(obj)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return false;\\r\\n\\r\\n        if (!this.ChartPaint[0] || !this.ChartPaint[0].Data) return false;\\r\\n        var kData=this.ChartPaint[0].Data;\\r\\n\\r\\n        if (!this.Frame.SubFrame[0]) return false;\\r\\n        var subFrame=this.Frame.SubFrame[0].Frame;\\r\\n        if (!subFrame) false;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x=(obj.X-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var index=subFrame.GetXData(x);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var dataIndex=index+kData.DataOffset;\\r\\n        if (dataIndex>=kData.Data.length) dataIndex=kData.Data.length-1;\\r\\n\\r\\n        var item = kData.Data[dataIndex];\\r\\n        JSConsole.Chart.Log(\\\"[KLineChartContainer::MoveRectSelectPoint] point, item\\\", obj.PointIndex, item);\\r\\n\\r\\n        if (!paint.SetPoint(item,{ Index: obj.PointIndex })) return false;\\r\\n\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAG_SELECT_RECT);\\r\\n        if (event)\\r\\n        {\\r\\n            var selectData=paint.GetSelectRectData();\\r\\n            var data={ X:obj.X, Y:obj.Y, SelectData:selectData, RectSelectPaint:paint };\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ClearRectSelect=function(bEnforce)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return false;\\r\\n        if (bEnforce) paint.PreventClose=false;\\r\\n        return paint.ClearPoint();\\r\\n    }\\r\\n\\r\\n    //删除叠加指标, 没有重回\\r\\n    this.DeleteOverlayIndex=function(identify, windowIndex)\\r\\n    {\\r\\n        var findIndex=null;\\r\\n        if (IFrameSplitOperator.IsNumber(windowIndex))\\r\\n        {\\r\\n            if (windowIndex>=0 && windowIndex<this.Frame.SubFrame.length)\\r\\n            {\\r\\n                var item=this.Frame.SubFrame[windowIndex];\\r\\n                for(var j=0; j<item.OverlayIndex.length; ++j)\\r\\n                {\\r\\n                    var overlayItem=item.OverlayIndex[j];\\r\\n                    if (overlayItem.Identify===identify)\\r\\n                    {\\r\\n                        item.OverlayIndex.splice(j, 1);\\r\\n                        findIndex=windowIndex\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n            {\\r\\n                var item=this.Frame.SubFrame[i];\\r\\n                for(var j=0; j<item.OverlayIndex.length; ++j)\\r\\n                {\\r\\n                    var overlayItem=item.OverlayIndex[j];\\r\\n                    if (overlayItem.Identify===identify)\\r\\n                    {\\r\\n                        item.OverlayIndex.splice(j, 1);\\r\\n                        findIndex=i;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex==null)\\r\\n        {\\r\\n            console.warn(`[JSChartContainer::DeleteOverlayIndex] can't find overlay index. [identify=${identify}]`);\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        var windowsIndex=findIndex+1;\\r\\n        var titlePaint=this.TitlePaint[windowsIndex];\\r\\n        if (titlePaint.OverlayIndex.has(identify))\\r\\n            titlePaint.OverlayIndex.delete(identify);\\r\\n\\r\\n        if (titlePaint.OverlayDynamicTitle.has(identify))\\r\\n            titlePaint.OverlayDynamicTitle.delete(identify);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //移动叠加指标  src={ WindowIndex:指标窗口索引，IndexID:指标ID } dest={ WindowIndex:指标窗口索引 } , option={ Operator: 0=移动, 1=复制 }\\r\\n    this.MoveOverlayIndex=function(src, dest, option)\\r\\n    {\\r\\n        if (!src || !dest || !option) return false;\\r\\n        if ( !IFrameSplitOperator.IsNumber(src.WindowIndex) || src.WindowIndex<0 || src.WindowIndex>=this.Frame.SubFrame.length ) return false;\\r\\n        if ( !IFrameSplitOperator.IsNumber(dest.WindowIndex) || dest.WindowIndex<0 || dest.WindowIndex>=this.Frame.SubFrame.length ) return false;\\r\\n\\r\\n        var item=this.Frame.SubFrame[src.WindowIndex];\\r\\n        var findOverlayItem=null;\\r\\n        for(var i=0; i<item.OverlayIndex.length; ++i)\\r\\n        {\\r\\n            var overlayItem=item.OverlayIndex[i];\\r\\n            if (overlayItem.Identify===src.IndexID)\\r\\n            {\\r\\n                findOverlayItem=overlayItem;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!findOverlayItem) return false;\\r\\n\\r\\n        var subFrame=this.Frame.SubFrame[dest.WindowIndex];\\r\\n        subFrame.Interval=this.OverlayIndexFrameWidth;\\r\\n        var overlayFrame=new OverlayIndexItem();\\r\\n        var frame=this.CreateOverlayFrame();\\r\\n        frame.Canvas=this.Canvas;\\r\\n        frame.MainFrame=subFrame.Frame;\\r\\n        frame.ChartBorder=subFrame.Frame.ChartBorder;\\r\\n        frame.IsShow=findOverlayItem.Frame.IsShow;\\r\\n        //if (obj.IsShareY===true) frame.IsShareY=true;\\r\\n        frame.YSplitOperator=new FrameSplitY();\\r\\n        frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n        frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        frame.YSplitOperator.Frame=frame;\\r\\n        frame.YSplitOperator.ChartBorder=frame.ChartBorder;\\r\\n        frame.YSplitOperator.SplitCount=subFrame.Frame.YSplitOperator.SplitCount;\\r\\n\\r\\n        overlayFrame.Frame=frame;\\r\\n        var scriptIndex=this.CloneOverlayScript(findOverlayItem.Script);\\r\\n        scriptIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:dest.WindowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n        overlayFrame.Script=scriptIndex;\\r\\n        subFrame.OverlayIndex.push(overlayFrame);\\r\\n\\r\\n        if (option.Operator==0) //移动模式, 删除原来的\\r\\n        {\\r\\n            this.DeleteOverlayIndex(findOverlayItem.Identify, src.WindowIndex);\\r\\n        }\\r\\n\\r\\n        var bindData=this.GetMainData();\\r\\n        this.BindOverlayIndexData(overlayFrame,dest.WindowIndex,bindData);\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //移动叠加指标到新的指标窗口 src={ WindowIndex:指标窗口索引，IndexID:指标ID } , option={ Operator: 0=移动, 1=复制 }\\r\\n    this.MoveOverlayIndexToNewWindow=function(src, option)\\r\\n    {\\r\\n        if (!src || !option) return false;\\r\\n        if ( !IFrameSplitOperator.IsNumber(src.WindowIndex) || src.WindowIndex<0 || src.WindowIndex>=this.Frame.SubFrame.length ) return false;\\r\\n\\r\\n        var item=this.Frame.SubFrame[src.WindowIndex];\\r\\n        var findOverlayItem=null;\\r\\n        for(var i=0; i<item.OverlayIndex.length; ++i)\\r\\n        {\\r\\n            var overlayItem=item.OverlayIndex[i];\\r\\n            if (overlayItem.Identify===src.IndexID)\\r\\n            {\\r\\n                findOverlayItem=overlayItem;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!findOverlayItem) return false;\\r\\n\\r\\n        this.RemoveMinSizeWindows();    //清空隐藏的指标\\r\\n\\r\\n        var index=this.Frame.SubFrame.length;\\r\\n        var subFrame=this.CreateSubFrameItem(index);\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        subFrame.Frame.ChartBorder.TitleHeight*=pixelRatio;\\r\\n        this.Frame.SubFrame[index]=subFrame;\\r\\n        var titlePaint=new DynamicChartTitlePainting();\\r\\n        titlePaint.Frame=this.Frame.SubFrame[index].Frame;\\r\\n        titlePaint.Canvas=this.Canvas;\\r\\n        titlePaint.LanguageID=this.LanguageID;\\r\\n        titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n        this.TitlePaint[index+1]=titlePaint;\\r\\n\\r\\n        this.SetSubFrameOption(subFrame, option);\\r\\n\\r\\n        //最后一个显示X轴坐标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n            else item.XSplitOperator.ShowText=false;\\r\\n        }\\r\\n\\r\\n        if (option.Operator==0) //移动模式, 删除原来的\\r\\n        {\\r\\n            this.DeleteOverlayIndex(findOverlayItem.Identify, src.WindowIndex);\\r\\n        }\\r\\n\\r\\n        this.UpdataDataoffset();        //更新数据偏移\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        if (this.UpdateXShowText) this.UpdateXShowText();\\r\\n        this.ResetFrameXYSplit();\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n\\r\\n        this.WindowIndex[index] = this.CloneScript(findOverlayItem.Script);\\r\\n        var bindData=this.GetMainData();\\r\\n\\r\\n        this.BindIndexData(index,bindData);     //执行脚本\\r\\n    }\\r\\n\\r\\n    this.GetMainData=function()\\r\\n    {\\r\\n        switch(this.ClassName)\\r\\n        {\\r\\n            case \\\"MinuteChartContainer\\\":\\r\\n            case \\\"MinuteChartHScreenContainer\\\":\\r\\n                return this.SourceData;\\r\\n            case \\\"KLineChartContainer\\\":\\r\\n            case \\\"KLineChartHScreenContainer\\\":\\r\\n                return this.ChartPaint[0].Data;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateOverlayFrame=function()\\r\\n    {\\r\\n        switch(this.ClassName)\\r\\n        {\\r\\n            case \\\"KLineChartContainer\\\":\\r\\n                return new OverlayKLineFrame();\\r\\n            case \\\"KLineChartHScreenContainer\\\":\\r\\n                return new OverlayKLineHScreenFrame();\\r\\n            case \\\"MinuteChartContainer\\\":\\r\\n                return new OverlayMinuteFrame();\\r\\n            case \\\"MinuteChartHScreenContainer\\\":\\r\\n                return new OverlayMinuteHScreenFrame();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CloneScript=function(src)\\r\\n    {\\r\\n        var scriptIndex=null;\\r\\n        switch(src.ClassName)\\r\\n        {\\r\\n            case \\\"ScriptIndex\\\":\\r\\n            case \\\"OverlayScriptIndex\\\":\\r\\n                scriptIndex=new ScriptIndex();\\r\\n                break;\\r\\n            case \\\"APIScriptIndex\\\":\\r\\n                scriptIndex=new APIScriptIndex();\\r\\n                break;\\r\\n        }\\r\\n\\r\\n        src.CopyTo(scriptIndex);\\r\\n\\r\\n        return scriptIndex;\\r\\n    }\\r\\n\\r\\n    this.CloneOverlayScript=function(src)\\r\\n    {\\r\\n        var scriptIndex=null;\\r\\n        switch(src.ClassName)\\r\\n        {\\r\\n            case \\\"ScriptIndex\\\":\\r\\n                scriptIndex=new ScriptIndex();\\r\\n                break;\\r\\n            case \\\"APIScriptIndex\\\":\\r\\n                scriptIndex=new APIScriptIndex();\\r\\n                break;\\r\\n            case \\\"OverlayScriptIndex\\\":\\r\\n                scriptIndex=new OverlayScriptIndex();\\r\\n                break;\\r\\n        }\\r\\n\\r\\n        src.CopyTo(scriptIndex);\\r\\n\\r\\n        return scriptIndex;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction GetDevicePixelRatio()\\r\\n{\\r\\n    if (typeof(window) =='undefined') return 1;\\r\\n    return window.devicePixelRatio || 1;\\r\\n}\\r\\n\\r\\nfunction GetFontHeight(context, font, word)\\r\\n{\\r\\n    if (!context) return null;\\r\\n\\r\\n    if (font) context.font=font;\\r\\n\\r\\n    var text='擎';\\r\\n    if (IFrameSplitOperator.IsString(word)) text=word;\\r\\n\\r\\n    var fontInfo=context.measureText(text);\\r\\n    var textHeight=fontInfo.fontBoundingBoxAscent + fontInfo.fontBoundingBoxDescent;\\r\\n    if (!IFrameSplitOperator.IsNumber(textHeight)) textHeight=fontInfo.width+2*GetDevicePixelRatio();\\r\\n\\r\\n    return textHeight;\\r\\n}\\r\\n\\r\\nfunction IsPhoneWeb()\\r\\n{\\r\\n    var userAgentInfo=navigator.userAgent;\\r\\n    const Agents =new Array(\\\"Android\\\",\\\"iPhone\\\",\\\"SymbianOS\\\",\\\"Windows Phone\\\",\\\"iPad\\\",\\\"iPod\\\");\\r\\n    for(var v=0;v<Agents.length;v++)\\r\\n    {\\r\\n        if(userAgentInfo.indexOf(Agents[v])>0) return true;\\r\\n    }\\r\\n    return false;\\r\\n}\\r\\n\\r\\nfunction OnKeyDown(e)   //键盘事件\\r\\n{\\r\\n    if(this.JSChartContainer && this.JSChartContainer.OnKeyDown)\\r\\n        this.JSChartContainer.OnKeyDown(e);\\r\\n}\\r\\n\\r\\nfunction OnWheel(e)    //上下滚动事件\\r\\n{\\r\\n    if(this.JSChartContainer && this.JSChartContainer.OnWheel)\\r\\n        this.JSChartContainer.OnWheel(e);\\r\\n}\\r\\n\\r\\nfunction ToFixed(number, precision)\\r\\n{\\r\\n    var b = 1;\\r\\n    if (isNaN(number)) return number;\\r\\n    if (number < 0) b = -1;\\r\\n    var multiplier = Math.pow(10, precision);\\r\\n    var value=Math.round(Math.abs(number) * multiplier) / multiplier * b;\\r\\n\\r\\n    if (/^(\\\\d+(?:\\\\.\\\\d+)?)(e)([\\\\-]?\\\\d+)$/.test(value))\\r\\n        var s=value.toFixed2(precision);\\r\\n    else\\r\\n        var s = value.toString();\\r\\n\\r\\n    var rs = s.indexOf('.');\\r\\n    if (rs < 0 && precision>0)\\r\\n    {\\r\\n        rs = s.length;\\r\\n        s += '.';\\r\\n    }\\r\\n\\r\\n    while (s.length <= rs + precision)\\r\\n    {\\r\\n        s += '0';\\r\\n    }\\r\\n\\r\\n\\r\\n\\r\\n    return s;\\r\\n}\\r\\n\\r\\nNumber.prototype.toFixed2=Number.prototype.toFixed; //备份下老的\\r\\nNumber.prototype.toFixed = function( precision )\\r\\n{\\r\\n    return ToFixed(this,precision);\\r\\n}\\r\\n\\r\\nfunction Guid()\\r\\n{\\r\\n    function S4()\\r\\n    {\\r\\n        return (((1+Math.random())*0x10000)|0).toString(16).substring(1);\\r\\n    }\\r\\n    return \\\"guid\\\" + (S4()+S4()+\\\"-\\\"+S4()+\\\"-\\\"+S4()+\\\"-\\\"+S4()+\\\"-\\\"+S4()+S4()+S4());\\r\\n}\\r\\n\\r\\nfunction GetScrollPosition()\\r\\n{\\r\\n    var scrollPos={};\\r\\n    var scrollTop=0;\\r\\n    var scrollLeft=0;\\r\\n    if(document.documentElement && document.documentElement.scrollTop)\\r\\n    {\\r\\n        scrollTop=document.documentElement.scrollTop;\\r\\n        scrollLeft=document.documentElement.scrollLeft;\\r\\n    }else if(document.body)\\r\\n    {\\r\\n        scrollTop=document.body.scrollTop;\\r\\n        scrollLeft=document.body.scrollLeft;\\r\\n    }\\r\\n\\r\\n    scrollPos.Top=scrollTop;\\r\\n    scrollPos.Left=scrollLeft;\\r\\n    return scrollPos;\\r\\n}\\r\\n\\r\\n//修正线段有毛刺\\r\\nfunction ToFixedPoint(value)\\r\\n{\\r\\n    return parseInt(value)+0.5;\\r\\n}\\r\\n\\r\\n//修正粗线段毛刺\\r\\nfunction ToFixedPoint2(width, value)\\r\\n{\\r\\n    var fixValue=(width % 2)===0 ? Math.floor(value):Math.floor(value) + 0.5;    //毛边修正\\r\\n    return fixValue;\\r\\n}\\r\\n\\r\\nfunction ToFixedRect(value)\\r\\n{\\r\\n    // With a bitwise or.\\r\\n    //rounded = (0.5 + somenum) | 0;\\r\\n    // A double bitwise not.\\r\\n    //rounded = ~~ (0.5 + somenum);\\r\\n    // Finally, a left bitwise shift.\\r\\n    //value*=GetDevicePixelRatio();\\r\\n    var rounded;\\r\\n    return rounded = (0.5 + value) << 0;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\nfunction Point()\\r\\n{\\r\\n    this.X;\\r\\n    this.Y;\\r\\n}\\r\\n\\r\\nfunction SelectRectData()\\r\\n{\\r\\n    this.Data;                  //主数据\\r\\n    this.JSChartContainer;      //行情控件\\r\\n\\r\\n    this.Start; //数据起始位子\\r\\n    this.End;   //数据结束位置\\r\\n\\r\\n    this.XStart;//X坐标起始位置\\r\\n    this.YStart;\\r\\n    this.XEnd;  //X位置结束为止\\r\\n    this.YEnd;\\r\\n}\\r\\n\\r\\n//坐标信息\\r\\nfunction CoordinateInfo()\\r\\n{\\r\\n    this.Value;                                                 //坐标数据\\r\\n    this.Message=[];                                            //坐标输出文字信息 0=左 1=右 2=内左 3=内右\\r\\n    this.TextColor=g_JSChartResource.FrameSplitTextColor        //文字颜色\\r\\n    this.Font=g_JSChartResource.FrameSplitTextFont;             //字体\\r\\n    this.LineColor=g_JSChartResource.FrameSplitPen;             //线段颜色\\r\\n    this.LineType=1;                                            //线段类型 -1 不画线段 2 虚线 8,9=集合竞价坐标\\r\\n    this.ExtendData;                                            //扩展属性\\r\\n                                                                //百分比 { PriceColor:, PercentageColor:, SplitColor:, Font: }\\r\\n}\\r\\n\\r\\n\\r\\n//边框信息\\r\\nfunction ChartBorder()\\r\\n{\\r\\n    this.UIElement;\\r\\n\\r\\n    //四周间距\\r\\n    this.Left=50;\\r\\n    this.Right=80;\\r\\n    this.Top=50;\\r\\n    this.Bottom=50;\\r\\n    this.TitleHeight=24;    //标题高度\\r\\n    this.TopSpace=0;\\r\\n    this.BottomSpace=0;\\r\\n\\r\\n    this.LeftExtendWidth=0;      //左边扩展图形宽度\\r\\n    this.RightExtendWidth=0;\\r\\n\\r\\n    this.MultiDayMinute={ Count:1, Left:0, Right:0 }  // { Count:天数, Left:, Right: }\\r\\n\\r\\n    this.GetBorder=function()\\r\\n    {\\r\\n        var data=\\r\\n            {\\r\\n                Left:this.Left,\\r\\n                LeftEx:this.Left+this.LeftExtendWidth,\\r\\n                Right:this.UIElement.width-this.Right,\\r\\n                RightEx:this.UIElement.width-this.Right-this.RightExtendWidth,\\r\\n\\r\\n                Top:this.Top,\\r\\n                TopEx:this.Top+this.TitleHeight+this.TopSpace,\\r\\n                TopTitle:this.Top+this.TitleHeight,\\r\\n                Bottom:this.UIElement.height-this.Bottom,\\r\\n                BottomEx:this.UIElement.height-this.Bottom-this.BottomSpace,\\r\\n\\r\\n                ChartWidth:this.UIElement.width,\\r\\n                ChartHeight:this.UIElement.height\\r\\n            };\\r\\n\\r\\n        if (this.MultiDayMinute && this.MultiDayMinute.Count>1 && ( this.MultiDayMinute.Left>0 || this.MultiDayMinute.Right>0 ))\\r\\n        {\\r\\n            var frameWidth=this.UIElement.width-this.Left-this.Right;   //坐标框子宽度\\r\\n            var dayWidth=frameWidth/this.MultiDayMinute.Count;   // 每天的框子的宽度\\r\\n\\r\\n            var dayBorder=[];\\r\\n            for(var i=0;i<this.MultiDayMinute.Count;++i)\\r\\n            {\\r\\n                var item={ Left:this.Left+dayWidth*i, Right:this.Left+dayWidth*(i+1) };\\r\\n                item.LeftEx=item.Left+this.MultiDayMinute.Left;\\r\\n                item.RightEx=item.Right-this.MultiDayMinute.Right;\\r\\n                dayBorder.push(item);\\r\\n            }\\r\\n\\r\\n            data.DayBorder=dayBorder;\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetHScreenBorder=function()\\r\\n    {\\r\\n        var data=\\r\\n            {\\r\\n                Left:this.Left,\\r\\n                LeftEx:this.Left+this.BottomSpace,\\r\\n\\r\\n                Right:this.UIElement.width-this.Right,\\r\\n                RightEx:this.UIElement.width-this.Right-this.TitleHeight- this.TopSpace,\\r\\n                RightTitle:this.UIElement.width-this.Right-this.TitleHeight,\\r\\n\\r\\n                Top:this.Top,\\r\\n                TopEx:this.Top+this.LeftExtendWidth,\\r\\n                Bottom:this.UIElement.height-this.Bottom,\\r\\n                BottomEx:this.UIElement.height-this.Bottom-this.RightExtendWidth,\\r\\n\\r\\n                ChartWidth:this.UIElement.width,\\r\\n                ChartHeight:this.UIElement.height\\r\\n            };\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //1=在K线上 -1不在图上 [200-299]=集合竞价 [300-399]=集合竞价 2=左边集合竞价 3=右边集合竞价\\r\\n    this.PtInClient=function(x, y, canvas, isHScreen)\\r\\n    {\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.GetHScreenBorder();\\r\\n            canvas.rect(border.Left,border.TopEx,border.Right-border.Left,border.BottomEx-border.TopEx);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.GetBorder();\\r\\n            if (border.DayBorder)   //多日分时+多日集合竞价\\r\\n            {\\r\\n                for(var i=0;i<border.DayBorder.length;++i)\\r\\n                {\\r\\n                    var client=border.DayBorder[i];\\r\\n                    canvas.beginPath();\\r\\n                    canvas.rect(client.LeftEx,border.TopEx,client.RightEx-client.LeftEx,border.BottomEx-border.TopEx);\\r\\n                    if (canvas.isPointInPath(x,y)) return 1;\\r\\n\\r\\n                    //盘前\\r\\n                    canvas.beginPath();\\r\\n                    canvas.rect(client.Left,border.TopEx,client.LeftEx-client.Left,border.BottomEx-border.TopEx);\\r\\n                    if (canvas.isPointInPath(x,y))\\r\\n                        return 200+parseInt(i);\\r\\n\\r\\n                    //盘后\\r\\n                    canvas.beginPath();\\r\\n                    canvas.rect(client.RightEx,border.TopEx,client.Right-client.RightEx,border.BottomEx-border.TopEx);\\r\\n                    if (canvas.isPointInPath(x,y))\\r\\n                        return 300+parseInt(i);\\r\\n                }\\r\\n\\r\\n                return -1;\\r\\n            }\\r\\n\\r\\n            canvas.rect(border.LeftEx,border.Top,border.RightEx-border.LeftEx,border.Bottom-border.Top);\\r\\n        }\\r\\n\\r\\n        if (canvas.isPointInPath(x,y)) return 1;\\r\\n\\r\\n        if (this.LeftExtendWidth>10)\\r\\n        {\\r\\n            canvas.beginPath();\\r\\n            if (isHScreen===true)\\r\\n            {\\r\\n                canvas.rect(border.Left,border.Top,border.Right-border.Left,border.TopEx-border.Top);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                canvas.rect(border.Left,border.Top,border.LeftEx-border.Left,border.Bottom-border.Top);\\r\\n            }\\r\\n\\r\\n            if (canvas.isPointInPath(x,y)) return 2;\\r\\n        }\\r\\n\\r\\n        if (this.RightExtendWidth>10)\\r\\n        {\\r\\n            canvas.beginPath();\\r\\n            if (isHScreen===true)\\r\\n            {\\r\\n                canvas.rect(border.Left,border.BottomEx,border.Right-border.Left,border.Bottom-border.BottomEx);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                canvas.rect(border.RightEx,border.Top,border.Right-border.RightEx,border.Bottom-border.Top);\\r\\n            }\\r\\n\\r\\n            if (canvas.isPointInPath(x,y)) return 3;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.GetChartWidth=function()\\r\\n    {\\r\\n        return this.UIElement.width;\\r\\n    }\\r\\n\\r\\n    this.GetChartHeight=function()\\r\\n    {\\r\\n        return this.UIElement.height;\\r\\n    }\\r\\n\\r\\n    this.GetLeft=function()\\r\\n    {\\r\\n        return this.Left+this.LeftExtendWidth;\\r\\n    }\\r\\n\\r\\n    this.GetRight=function()\\r\\n    {\\r\\n        return this.UIElement.width-this.Right-this.RightExtendWidth;\\r\\n    }\\r\\n\\r\\n    this.GetTop=function()\\r\\n    {\\r\\n        return this.Top;\\r\\n    }\\r\\n\\r\\n    this.GetTopEx=function()    //去掉标题，上面间距\\r\\n    {\\r\\n        return this.Top+this.TitleHeight+this.TopSpace;\\r\\n    }\\r\\n\\r\\n    this.GetTopTitle=function() //去掉标题\\r\\n    {\\r\\n        return this.Top+this.TitleHeight;\\r\\n    }\\r\\n\\r\\n    this.GetBottom=function()\\r\\n    {\\r\\n        return this.UIElement.height-this.Bottom;\\r\\n    }\\r\\n\\r\\n    this.GetBottomEx=function()\\r\\n    {\\r\\n        return this.UIElement.height-this.Bottom-this.BottomSpace;\\r\\n    }\\r\\n\\r\\n    this.GetWidth=function()\\r\\n    {\\r\\n        return this.UIElement.width-this.Left-this.Right-this.LeftExtendWidth-this.RightExtendWidth;\\r\\n    }\\r\\n\\r\\n    this.GetHeight=function()\\r\\n    {\\r\\n        return this.UIElement.height-this.Top-this.Bottom;\\r\\n    }\\r\\n\\r\\n    this.GetHeightEx=function() //去掉标题的高度, 上下间距\\r\\n    {\\r\\n        return this.UIElement.height-this.Top-this.Bottom-this.TitleHeight-this.TopSpace-this.BottomSpace;\\r\\n    }\\r\\n\\r\\n    this.GetRightEx=function()  //横屏去掉标题高度的 上面间距\\r\\n    {\\r\\n        return this.UIElement.width-this.Right-this.TitleHeight- this.TopSpace;\\r\\n    }\\r\\n\\r\\n    this.GetWidthEx=function()  //横屏去掉标题宽度 上下间距\\r\\n    {\\r\\n        return this.UIElement.width-this.Left-this.Right-this.TitleHeight- this.TopSpace - this.BottomSpace;\\r\\n    }\\r\\n\\r\\n    this.GetLeftEx = function () //横屏\\r\\n    {\\r\\n        return this.Left+this.BottomSpace;\\r\\n    }\\r\\n\\r\\n    this.GetRightTitle = function ()//横屏\\r\\n    {\\r\\n        return this.UIElement.width - this.Right - this.TitleHeight;\\r\\n    }\\r\\n\\r\\n    this.GetTitleHeight=function()\\r\\n    {\\r\\n        return this.TitleHeight;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction IChartFramePainting()\\r\\n{\\r\\n    this.HorizontalInfo=new Array();    //Y轴\\r\\n    this.VerticalInfo=new Array();      //X轴\\r\\n    this.ClassName='IChartFramePainting';\\r\\n\\r\\n    this.Canvas;                        //画布\\r\\n\\r\\n    this.Identify;                      //窗口标识\\r\\n\\r\\n    this.ChartBorder;\\r\\n    this.PenBorder=g_JSChartResource.FrameBorderPen;        //边框颜色\\r\\n    this.TitleBGColor=g_JSChartResource.FrameTitleBGColor;  //标题背景色\\r\\n    this.IsShow=true;                   //是否显示\\r\\n    this.SizeChange=true;               //大小是否改变\\r\\n    this.XYSplit=true;                  //XY轴坐标信息改变\\r\\n\\r\\n    this.HorizontalMax;                 //Y轴最大值\\r\\n    this.HorizontalMin;                 //Y轴最小值\\r\\n    this.XPointCount=10;                //X轴数据个数\\r\\n\\r\\n    this.YSplitOperator;               //Y轴分割\\r\\n    this.XSplitOperator;               //X轴分割\\r\\n    this.Data;                         //主数据\\r\\n\\r\\n    this.IsLocked=false;               //是否上锁\\r\\n    this.LockPaint = null;\\r\\n\\r\\n    this.YSpecificMaxMin=null;         //指定Y轴最大最小值\\r\\n    this.IsShowBorder = true;          //是否显示边框\\r\\n    this.IsShowTitleArraw=true;        //是否显示指标信息上涨下跌箭头\\r\\n    this.IsShowIndexName=true;         //是否显示指标名字\\r\\n    this.IsShowOverlayIndexName=true;  //是否显示叠加指标名字\\r\\n    this.OverlayIndexType= { Position:0, LineSpace:5 };\\r\\n    this.IndexParamSpace=2;            //指标参数数值显示间距\\r\\n    this.IsShowIndexTitle=true;        //显示整个指标标题信息\\r\\n    this.IsDrawTitleBottomLine=false;\\r\\n\\r\\n    this.BorderLine=null;               //1=上 2=下 4=左 8=右\\r\\n    this.Buttons=[];                    //按钮事件\\r\\n\\r\\n    this.IsMinSize=false;               //窗口是否最小化\\r\\n\\r\\n\\r\\n    this.PtInButtons=function(x,y) //坐标是否在按钮上\\r\\n    {\\r\\n        for(var i=0;i<this.Buttons.length;++i)\\r\\n        {\\r\\n            var item=this.Buttons[i];\\r\\n            if (!item.Rect) continue;\\r\\n\\r\\n            var rect=item.Rect;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.Left,rect.Top,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                return { ID:item.ID, Rect:rect };\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetBorder=function()\\r\\n    {\\r\\n        if (this.IsHScreen) return this.ChartBorder.GetHScreenBorder();\\r\\n        else return this.ChartBorder.GetBorder();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.Buttons=[];\\r\\n        this.DrawFrame();\\r\\n        this.DrawBorder();\\r\\n\\r\\n        this.SizeChange=false;\\r\\n        this.XYSplit=false;\\r\\n    }\\r\\n\\r\\n    this.DrawFrame=function() { }\\r\\n\\r\\n    this.ClearCoordinateText=function(option)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.HorizontalInfo))\\r\\n        {\\r\\n            for(var i=0;i<this.HorizontalInfo.length;++i)\\r\\n            {\\r\\n                var item=this.HorizontalInfo[i];\\r\\n                if (item && item.Message && Array.isArray(item.Message)) item.Message[0]=item.Message[1]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.VerticalInfo))\\r\\n        {\\r\\n            for(var i=0;i<this.VerticalInfo.length;++i)\\r\\n            {\\r\\n                var item=this.VerticalInfo[i];\\r\\n                if (item && item.Message && Array.isArray(item.Message)) item.Message[0]=item.Message[1]=null;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画边框\\r\\n    this.DrawBorder=function()\\r\\n    {\\r\\n        if (!this.IsShowBorder) return;\\r\\n        if (this.IsMinSize) return;\\r\\n\\r\\n        var border=this.IsHScreen==true?this.ChartBorder.GetHScreenBorder():this.ChartBorder.GetBorder();\\r\\n\\r\\n        var left=ToFixedPoint(border.Left);\\r\\n        var top=ToFixedPoint(border.Top);\\r\\n        var right=ToFixedPoint(border.Right);\\r\\n        var bottom=ToFixedPoint(border.Bottom);\\r\\n        var width=right-left;\\r\\n        var height=bottom-top;\\r\\n\\r\\n        //JSConsole.Chart.Log('[IChartFramePainting.DrawBorder] bottom',bottom);\\r\\n        if (this.BorderLine==null)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=this.PenBorder;\\r\\n            this.Canvas.strokeRect(left,top,width,height);\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsPlusNumber(this.BorderLine)) //单独绘制每个边框\\r\\n        {\\r\\n            this.Canvas.strokeStyle=this.PenBorder;\\r\\n            this.Canvas.beginPath();\\r\\n\\r\\n            if ((this.BorderLine&1)>0) //上\\r\\n            {\\r\\n                this.Canvas.moveTo(left,top);\\r\\n                this.Canvas.lineTo(right,top);\\r\\n            }\\r\\n\\r\\n            if ((this.BorderLine&2)>0)  //下\\r\\n            {\\r\\n                this.Canvas.moveTo(left,bottom);\\r\\n                this.Canvas.lineTo(right,bottom);\\r\\n            }\\r\\n\\r\\n            if ((this.BorderLine&4)>0)  //左\\r\\n            {\\r\\n                this.Canvas.moveTo(left,top);\\r\\n                this.Canvas.lineTo(left,bottom);\\r\\n            }\\r\\n\\r\\n            if ((this.BorderLine&8)>0)    //右\\r\\n            {\\r\\n                this.Canvas.moveTo(right,top);\\r\\n                this.Canvas.lineTo(right,bottom);\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n\\r\\n    }\\r\\n\\r\\n    //画标题背景色\\r\\n    this.DrawTitleBG=function()\\r\\n    {\\r\\n        if (this.ChartBorder.TitleHeight<=0) return;\\r\\n\\r\\n        var border=this.GetBorder();\\r\\n\\r\\n        var left=ToFixedPoint(border.Left);\\r\\n        var top=ToFixedPoint(border.Top);\\r\\n        var right=ToFixedPoint(border.Right);\\r\\n        var bottom=ToFixedPoint(this.ChartBorder.GetTopTitle());\\r\\n        var width=right-left;\\r\\n        var height=bottom-top;\\r\\n\\r\\n        this.Canvas.fillStyle=this.TitleBGColor;\\r\\n        this.Canvas.fillRect(left,top,width,height);\\r\\n\\r\\n        if (this.IsDrawTitleBottomLine)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=this.PenBorder;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(left,ToFixedPoint(border.TopTitle));\\r\\n            this.Canvas.lineTo(right,ToFixedPoint(border.TopTitle));\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawLock=function()\\r\\n    {\\r\\n        if (this.IsLocked)\\r\\n        {\\r\\n            if (this.LockPaint == null)\\r\\n                this.LockPaint = new ChartLock();\\r\\n            this.LockPaint.Canvas=this.Canvas;\\r\\n            this.LockPaint.ChartBorder=this.ChartBorder;\\r\\n            this.LockPaint.ChartFrame=this;\\r\\n            this.LockPaint.Draw(true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateLock=function()\\r\\n    {\\r\\n        if (this.IsLocked)\\r\\n        {\\r\\n            if (this.LockPaint == null)\\r\\n                this.LockPaint = new ChartLock();\\r\\n            this.LockPaint.Canvas=this.Canvas;\\r\\n            this.LockPaint.ChartBorder=this.ChartBorder;\\r\\n            this.LockPaint.ChartFrame=this;\\r\\n            this.LockPaint.Draw(false);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //设施上锁\\r\\n    this.SetLock=function(lockData)\\r\\n    {\\r\\n        if (!lockData)  //空数据不上锁\\r\\n        {\\r\\n            this.IsLocked=false;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.IsLocked=true;\\r\\n        if (!this.LockPaint) this.LockPaint=new ChartLock();    //创建锁\\r\\n\\r\\n        if (lockData.Callback) this.LockPaint.Callback=lockData.Callback;       //回调\\r\\n        if (lockData.IndexName) this.LockPaint.IndexName=lockData.IndexName;    //指标名字\\r\\n        if (lockData.ID) this.LockPaint.LockID=lockData.ID;                     //锁ID\\r\\n        if (lockData.BG) this.LockPaint.BGColor=lockData.BG;                    //背景色\\r\\n        if (lockData.Text) this.LockPaint.Title= lockData.Text;\\r\\n        if (lockData.TextColor) this.LockPaint.TextColor=lockData.TextColor;\\r\\n        if (lockData.Font) this.LockPaint.Font=lockData.Font;\\r\\n        if (lockData.Count) this.LockPaint.LockCount=lockData.Count;\\r\\n        if (lockData.MinWidth>0) this.LockPaint.MinWidth=lockData.MinWidth;\\r\\n    }\\r\\n\\r\\n    this.GetLockRect=function()\\r\\n    {\\r\\n        if (!this.IsLocked) return null;\\r\\n        if (!this.LockPaint) return null;\\r\\n        return this.LockPaint.LockRect;\\r\\n    }\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        if (!resource)\\r\\n        {\\r\\n            this.PenBorder=g_JSChartResource.FrameBorderPen;        //边框颜色\\r\\n            this.TitleBGColor=g_JSChartResource.FrameTitleBGColor;  //标题背景色\\r\\n        }\\r\\n\\r\\n        for(var i in this.HorizontalInfo)\\r\\n        {\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            if (item.Font) item.Font=g_JSChartResource.FrameSplitTextFont;             //字体\\r\\n            if (item.TextColor) item.TextColor=g_JSChartResource.FrameSplitTextColor        //文字颜色\\r\\n            if (item.LineColor) item.LineColor=g_JSChartResource.FrameSplitPen;             //线段颜色\\r\\n        }\\r\\n\\r\\n        for(var i in this.VerticalInfo)\\r\\n        {\\r\\n            var item=this.VerticalInfo[i];\\r\\n            if (item.Font) item.Font=g_JSChartResource.FrameSplitTextFont;             //字体\\r\\n            if (item.TextColor) item.TextColor=g_JSChartResource.FrameSplitTextColor        //文字颜色\\r\\n            if (item.LineColor) item.LineColor=g_JSChartResource.FrameSplitPen;             //线段颜色\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetFontHeight=function(font)\\r\\n    {\\r\\n        return GetFontHeight(this.Canvas, font, \\\"擎\\\");\\r\\n    }\\r\\n\\r\\n    //左右刻度文字宽度\\r\\n    this.GetScaleTextWidth=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//空框架只画边框\\r\\nfunction NoneFrame()\\r\\n{\\r\\n    this.newMethod=IChartFramePainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"NoneFrame\\\";\\r\\n\\r\\n    this.Snapshot=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.SetSizeChage=function(sizeChange)\\r\\n    {\\r\\n        this.SizeChange=sizeChange;\\r\\n\\r\\n        //画布的位置\\r\\n        this.Position={\\r\\n            X:this.ChartBorder.UIElement.offsetLeft,\\r\\n            Y:this.ChartBorder.UIElement.offsetTop,\\r\\n            W:this.ChartBorder.UIElement.clientWidth,\\r\\n            H:this.ChartBorder.UIElement.clientHeight\\r\\n        };\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction AverageWidthFrame()\\r\\n{\\r\\n    this.newMethod=IChartFramePainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"AverageWidthFrame\\\";\\r\\n    this.DataWidth=50*GetDevicePixelRatio();\\r\\n    this.DistanceWidth=10*GetDevicePixelRatio();\\r\\n    this.MinXDistance = 30*GetDevicePixelRatio();       //X轴刻度最小间距\\r\\n    this.MinYDistance=12*GetDevicePixelRatio();         //Y轴刻度最小间距\\r\\n    this.CoordinateType=0;  //坐标类型 0=普通坐标 1=反转坐标\\r\\n    this.IsShowYText=[true,true];       //是否显示Y轴坐标坐标 [0=左侧] [1=右侧]\\r\\n    this.XBottomOffset=g_JSChartResource.Frame.XBottomOffset;   //X轴文字显示向下偏移\\r\\n    this.YTextTopOffset=g_JSChartResource.Frame.YTopOffset;         //Y轴顶部文字向下偏移\\r\\n    this.YTextPosition=[0,0],       //是坐标否强制画在内部 [0=左侧] [1=右侧] 1=OUT\\\" , 2=INSIDE\\r\\n        this.IsShowXLine=true;              //是否显示X轴刻度线\\r\\n    this.IsShowYLine=true;\\r\\n    this.YInsideOffset=0;\\r\\n    this.YTextBaseline=0;       //0=居中 1=上部 (目前就支持内部刻度)\\r\\n    this.MultiTextFormat=0;    //多行刻度信息显示模式 0=显示第1行 1=价格/百分比 2=显示2行\\r\\n    this.RightTextMaxWidth=0;\\r\\n\\r\\n    this.ShortYLineLength=5;\\r\\n    this.ShortXLineLength=5;\\r\\n    this.DrawDepthMapCallback;      //绘制深度图\\r\\n\\r\\n    this.DrawFrame=function()\\r\\n    {\\r\\n        if (this.XPointCount>0)\\r\\n        {\\r\\n            let dInterval=this.ChartBorder.GetWidth()/(6*this.XPointCount); //分6份, 数据4 间距2\\r\\n            this.DistanceWidth=2*dInterval;\\r\\n            this.DataWidth=4*dInterval;\\r\\n        }\\r\\n\\r\\n        this.DrawHorizontal();\\r\\n        this.DrawVertical();\\r\\n    }\\r\\n\\r\\n    //isLimit 是否限制在当前坐标下\\r\\n    this.GetYFromData=function(value, isLimit)\\r\\n    {\\r\\n        if (this.Logarithmic && this.GetYLogarithmicFromData)\\r\\n        {\\r\\n            return this.GetYLogarithmicFromData(value, isLimit);\\r\\n        }\\r\\n\\r\\n        if (isLimit===false)\\r\\n        {\\r\\n            if (this.CoordinateType==1)\\r\\n            {\\r\\n                var height=this.ChartBorder.GetHeightEx()*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n                return this.ChartBorder.GetTopEx()+height;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var height=this.ChartBorder.GetHeightEx()*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n                return this.ChartBorder.GetBottomEx()-height;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.CoordinateType==1)\\r\\n            {\\r\\n                if(value<=this.HorizontalMin) return this.ChartBorder.GetTopEx();\\r\\n                if(value>=this.HorizontalMax) return this.ChartBorder.GetBottomEx();\\r\\n\\r\\n                var height=this.ChartBorder.GetHeightEx()*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n                return this.ChartBorder.GetTopEx()+height;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if(value<=this.HorizontalMin) return this.ChartBorder.GetBottomEx();\\r\\n                if(value>=this.HorizontalMax) return this.ChartBorder.GetTopEx();\\r\\n\\r\\n                var height=this.ChartBorder.GetHeightEx()*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n                return this.ChartBorder.GetBottomEx()-height;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画Y轴\\r\\n    this.DrawHorizontal=function()\\r\\n    {\\r\\n        this.RightTextMaxWidth=0;\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(this.HorizontalInfo)) return;\\r\\n\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var left=border.Left;\\r\\n        var right=border.Right\\r\\n        var bottom = border.Bottom\\r\\n        var top = this.ChartBorder.GetTopTitle();\\r\\n        var borderRight=this.ChartBorder.Right;\\r\\n        var borderLeft=this.ChartBorder.Left;\\r\\n\\r\\n        var isDrawLeft=borderLeft>10 && this.IsShowYText[0]===true && this.YTextPosition[0]!=2;\\r\\n        var isDrawRight=borderRight>10 && this.IsShowYText[1]===true && this.YTextPosition[1]!=2;\\r\\n\\r\\n        var yPrev=null; //上一个坐标y的值\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        var itemHeight=(border.BottomEx-border.TopEx)/this.HorizontalInfo.length;\\r\\n        var aryMultiText=[];\\r\\n        for(var i=this.HorizontalInfo.length-1; i>=0; --i)  //从上往下画分割线\\r\\n        {\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            var y=this.GetYFromData(item.Value);\\r\\n            if (y!=null && yPrev!=null && Math.abs(y-yPrev)<this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            var yFixed=ToFixedPoint(y);\\r\\n            if (y!=bottom && this.IsShowYLine)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=item.LineColor;\\r\\n                if (item.LineType==2)\\r\\n                {\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);   //虚线\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(left,yFixed);\\r\\n                    this.Canvas.lineTo(right,yFixed);\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n                else if (item.LineType==3)  //只在刻度边上画一个短横线\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else if (item.LineType==8 || item.LineType==9)  //集合竞价不画线\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else if (item.LineType>0)\\r\\n                {\\r\\n                    if (g_JSChartResource.FrameYLineDash)\\r\\n                    {\\r\\n                        this.Canvas.setLineDash(g_JSChartResource.FrameYLineDash);   //虚线\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(left,yFixed);\\r\\n                        this.Canvas.lineTo(right,yFixed);\\r\\n                        this.Canvas.stroke();\\r\\n                        this.Canvas.setLineDash([]);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(left,yFixed);\\r\\n                        this.Canvas.lineTo(right,yFixed);\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var yText=y;\\r\\n            if (y >= bottom - 2)\\r\\n            {\\r\\n                this.Canvas.textBaseline = 'bottom';\\r\\n            }\\r\\n            else if (y <= top + 2)\\r\\n            {\\r\\n                this.Canvas.textBaseline = 'top';\\r\\n                yText+=this.YTextTopOffset;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n            }\\r\\n\\r\\n            //坐标信息 左边 间距小于10 不画坐标\\r\\n            this.Canvas.strokeStyle=item.TextColor;\\r\\n            this.Canvas.fillStyle=item.TextColor;\\r\\n\\r\\n            if (item.Message[0]!=null && isDrawLeft)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                this.Canvas.textAlign=\\\"right\\\";\\r\\n                this.Canvas.fillText(item.Message[0],left-2,yText);\\r\\n            }\\r\\n\\r\\n            //坐标信息 右边 间距小于10 不画坐标\\r\\n            if (item.Message[1]!=null && isDrawRight)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                var xText=right;\\r\\n                if (item.LineType==3)\\r\\n                {\\r\\n                    var lineLength=this.ShortYLineLength*GetDevicePixelRatio();\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(xText,yFixed);\\r\\n                    this.Canvas.lineTo(xText+lineLength,yFixed);\\r\\n                    this.Canvas.stroke();\\r\\n\\r\\n                    xText+=lineLength;\\r\\n                }\\r\\n\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                if (Array.isArray(item.Message[1]))\\r\\n                {\\r\\n                    if (this.MultiTextFormat==1)    //显示1行 格式:价格/百分比\\r\\n                    {\\r\\n                        if (item.ExtendData)\\r\\n                        {\\r\\n                            if (item.ExtendData.Font) this.Canvas.font=item.ExtendData.Font;\\r\\n                        }\\r\\n\\r\\n                        var textData=\\r\\n                            {\\r\\n                                Text:\\r\\n                                    [\\r\\n                                        {Text:item.Message[1][0], Width:this.Canvas.measureText(item.Message[1][0]).width },\\r\\n                                        {Text:item.Message[1][1], Width:this.Canvas.measureText(item.Message[1][1]).width }\\r\\n                                    ],\\r\\n                                X:xText+2,\\r\\n                                Y:yText,\\r\\n                                TextBaseline:this.Canvas.textBaseline,\\r\\n                                Item:item\\r\\n                            }\\r\\n                        aryMultiText.push(textData);\\r\\n                    }\\r\\n                    else if (this.MultiTextFormat==2)   //显示2行\\r\\n                    {\\r\\n                        this.Canvas.fillText(item.Message[1][0],xText+2,yText);\\r\\n                        var lineHeight=this.Canvas.measureText('M').width;\\r\\n                        if (itemHeight>lineHeight*2) this.Canvas.fillText(item.Message[1][1],xText+2,yText+lineHeight);\\r\\n                    }\\r\\n                    else    //显示第1行\\r\\n                    {\\r\\n                        this.Canvas.fillText(item.Message[1][0],xText+2,yText);\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillText(item.Message[1],xText+2,yText);\\r\\n                }\\r\\n\\r\\n            }\\r\\n\\r\\n            yPrev=y;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(aryMultiText) && this.MultiTextFormat==1) this.DrawHorizontalMuText(aryMultiText)\\r\\n    }\\r\\n\\r\\n    this.DrawHorizontalMuText=function(aryText)\\r\\n    {\\r\\n        var maxWidth=[null,null];\\r\\n        for(var i=0;i<aryText.length;++i)\\r\\n        {\\r\\n            var item=aryText[i];\\r\\n            var width=item.Text[0].Width;\\r\\n            if (!IFrameSplitOperator.IsNumber(maxWidth[0])) maxWidth[0]=width;\\r\\n            else if (maxWidth[0]<width) maxWidth[0]=width;\\r\\n\\r\\n            width=item.Text[1].Width;\\r\\n            if (!IFrameSplitOperator.IsNumber(maxWidth[1])) maxWidth[1]=width;\\r\\n            else if (maxWidth[1]<width) maxWidth[1]=width;\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<aryText.length;++i)\\r\\n        {\\r\\n            var item=aryText[i];\\r\\n            var message=item.Item;\\r\\n\\r\\n            this.Canvas.textBaseline=message.TextBaseline;\\r\\n            if (message.ExtendData && message.ExtendData.Font) this.Canvas.font=message.ExtendData.Font;\\r\\n            else if (message.Font) this.Canvas.font=message.Font;\\r\\n\\r\\n            if (message.ExtendData && message.ExtendData.PriceColor) this.Canvas.fillStyle=message.ExtendData.PriceColor;\\r\\n            else this.Canvas.fillStyle=message.TextColor;\\r\\n\\r\\n            this.Canvas.textAlign=\\\"right\\\";\\r\\n            var x=item.X+maxWidth[1];\\r\\n            this.Canvas.fillText(item.Text[1].Text,x,item.Y);\\r\\n\\r\\n            if (message.ExtendData && message.ExtendData.SplitColor) this.Canvas.fillStyle=message.ExtendData.SplitColor;\\r\\n            else this.Canvas.fillStyle=message.TextColor;\\r\\n\\r\\n            this.Canvas.textAlign=\\\"left\\\";\\r\\n            var splitWidth=this.Canvas.measureText('/').width;\\r\\n            this.Canvas.fillText('/',x,item.Y);\\r\\n\\r\\n            if (message.ExtendData && message.ExtendData.PercentageColor) this.Canvas.fillStyle=message.ExtendData.PercentageColor;\\r\\n            else this.Canvas.fillStyle=message.TextColor;\\r\\n\\r\\n            this.Canvas.textAlign=\\\"right\\\";\\r\\n            var x=item.X+maxWidth[1]+maxWidth[0]+splitWidth;\\r\\n            this.Canvas.fillText(item.Text[0].Text,x,item.Y);\\r\\n\\r\\n            var textWidth=maxWidth[1]+maxWidth[0]+splitWidth*4;\\r\\n            if (this.RightTextMaxWidth<textWidth) this.RightTextMaxWidth=textWidth;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画Y轴Message[2,3]两个内部刻度\\r\\n    this.DrawInsideClientHorizontal=function()\\r\\n    {\\r\\n        var border=this.GetBorder();\\r\\n        if (border.DayBorder && IFrameSplitOperator.IsNonEmptyArray(border.DayBorder))\\r\\n        {\\r\\n            var item=border.DayBorder[0];\\r\\n            var left=item.LeftEx;\\r\\n            var item=border.DayBorder[border.DayBorder.length-1];\\r\\n            var right=item.RightEx;\\r\\n            var bottom=border.Bottom;\\r\\n            var top=border.TopTitle;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=border.LeftEx;\\r\\n            var right=border.RightEx;\\r\\n            var bottom=border.Bottom;\\r\\n            var top=border.TopTitle;\\r\\n        }\\r\\n\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var yPrev = null; //上一个坐标y的值\\r\\n        var yInsideText=null;\\r\\n        for (var i = this.HorizontalInfo.length - 1; i >= 0; --i)  //从上往下画分割线\\r\\n        {\\r\\n            var item = this.HorizontalInfo[i];\\r\\n            var y = this.GetYFromData(item.Value);\\r\\n            if (y != null && yPrev!=null && Math.abs(y - yPrev) < this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            if (item.Message[2])\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.fillStyle = item.TextColor;\\r\\n                this.Canvas.textAlign = \\\"left\\\";\\r\\n                var yText=y;\\r\\n                if (y >= bottom - 2)\\r\\n                {\\r\\n                    this.Canvas.textBaseline = 'bottom';\\r\\n                }\\r\\n                else if (y <= top + 2)\\r\\n                {\\r\\n                    this.Canvas.textBaseline = 'top';\\r\\n                    yText+=this.YTextTopOffset;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                }\\r\\n\\r\\n                var textObj={ X:left, Y:yText, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[0]}} ;\\r\\n                if (!this.IsOverlayMaxMin || !this.IsOverlayMaxMin(textObj))\\r\\n                {\\r\\n                    this.Canvas.fillText(item.Message[2], left + 1*pixelTatio, yText);\\r\\n                    if (yInsideText==null || yInsideText>yText)\\r\\n                    {\\r\\n                        this.YInsideOffset=this.Canvas.measureText(item.Message[2]).width+4*GetDevicePixelRatio();\\r\\n                        yInsideText=yText;\\r\\n                    }\\r\\n\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (item.Message[3])\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.fillStyle = item.TextColor;\\r\\n                this.Canvas.textAlign = \\\"right\\\";\\r\\n                var yText=y;\\r\\n                if (y >= bottom - 2)\\r\\n                {\\r\\n                    this.Canvas.textBaseline = 'bottom';\\r\\n                }\\r\\n                else if (y <= top + 2)\\r\\n                {\\r\\n                    this.Canvas.textBaseline = 'top';\\r\\n                    yText+=this.YTextTopOffset;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                }\\r\\n                var textWidth = this.Canvas.measureText(item.Message[3]).width;\\r\\n                var textObj={ X:right-textWidth, Y:yText, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[1]}} ;\\r\\n                if (!this.IsOverlayMaxMin || !this.IsOverlayMaxMin(textObj))\\r\\n                    this.Canvas.fillText(item.Message[3], right - 1*pixelTatio, yText);\\r\\n            }\\r\\n            yPrev = y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Y刻度画在左边内部\\r\\n    this.DrawInsideHorizontal = function ()\\r\\n    {\\r\\n        if (this.IsHScreen===true) return;  //横屏不画\\r\\n        if (this.IsMinSize) return;\\r\\n        if (this.IsShowYText[0]===false && this.IsShowYText[1]===false) return;\\r\\n\\r\\n        this.DrawInsideClientHorizontal();\\r\\n\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n\\r\\n        var left = border.Left\\r\\n        var right = border.Right;\\r\\n        var bottom = border.Bottom;\\r\\n        var top = border.TopTitle;\\r\\n        var borderRight = this.ChartBorder.Right;\\r\\n        var borderLeft = this.ChartBorder.Left;\\r\\n        var titleHeight = this.ChartBorder.TitleHeight;\\r\\n\\r\\n        var isDrawLeft= (borderLeft<10 || this.YTextPosition[0]==2) && this.IsShowYText[0]===true;\\r\\n        var isDrawRight= (borderRight<10 || this.YTextPosition[1]==2) && this.IsShowYText[1]===true;\\r\\n\\r\\n        if ( isDrawLeft || isDrawRight )\\r\\n        {\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            var yPrev = null; //上一个坐标y的值\\r\\n            var yInsideText=null;\\r\\n            for (var i = this.HorizontalInfo.length - 1; i >= 0; --i)  //从上往下画分割线\\r\\n            {\\r\\n                var item = this.HorizontalInfo[i];\\r\\n                var y = this.GetYFromData(item.Value);\\r\\n                if (y != null && yPrev!=null && Math.abs(y - yPrev) < this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n                //坐标信息 左边 间距小于10 画在内部\\r\\n                if (item.Message[0] != null && isDrawLeft)\\r\\n                {\\r\\n                    if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                    this.Canvas.fillStyle = item.TextColor;\\r\\n                    this.Canvas.textAlign = \\\"left\\\";\\r\\n                    var yText=y;\\r\\n                    if (y >= bottom - 2)\\r\\n                    {\\r\\n                        this.Canvas.textBaseline = 'bottom';\\r\\n                    }\\r\\n                    else if (y <= top + 2)\\r\\n                    {\\r\\n                        this.Canvas.textBaseline = 'top';\\r\\n                        yText+=this.YTextTopOffset;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (this.YTextBaseline==1) this.Canvas.textBaseline = \\\"bottom\\\";\\r\\n                        else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                    }\\r\\n\\r\\n                    var textObj={ X:left, Y:yText, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[0]}} ;\\r\\n                    if (!this.IsOverlayMaxMin || !this.IsOverlayMaxMin(textObj))\\r\\n                    {\\r\\n                        this.Canvas.fillText(item.Message[0], left + 1*pixelTatio, yText);\\r\\n                        if (yInsideText==null || yInsideText>yText)\\r\\n                        {\\r\\n                            this.YInsideOffset=this.Canvas.measureText(item.Message[0]).width+4*GetDevicePixelRatio();\\r\\n                            yInsideText=yText;\\r\\n                        }\\r\\n\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (item.Message[1] != null && isDrawRight)\\r\\n                {\\r\\n                    if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                    this.Canvas.fillStyle = item.TextColor;\\r\\n                    this.Canvas.textAlign = \\\"right\\\";\\r\\n                    var yText=y;\\r\\n                    if (y >= bottom - 2)\\r\\n                    {\\r\\n                        this.Canvas.textBaseline = 'bottom';\\r\\n                    }\\r\\n                    else if (y <= top + 2)\\r\\n                    {\\r\\n                        this.Canvas.textBaseline = 'top';\\r\\n                        yText+=this.YTextTopOffset;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (this.YTextBaseline==1) this.Canvas.textBaseline = \\\"bottom\\\";\\r\\n                        else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                    }\\r\\n\\r\\n                    if (Array.isArray(item.Message[1])) var text=item.Message[1][0];\\r\\n                    else var text=item.Message[1];\\r\\n\\r\\n                    var textWidth = this.Canvas.measureText(text).width;\\r\\n                    var textObj={ X:right-textWidth, Y:yText, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[1]}} ;\\r\\n                    if (!this.IsOverlayMaxMin || !this.IsOverlayMaxMin(textObj))\\r\\n                        this.Canvas.fillText(text, right - 1*pixelTatio, yText);\\r\\n                }\\r\\n                yPrev = y;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(index)\\r\\n    {\\r\\n        var count=this.XPointCount;\\r\\n\\r\\n        if (count==1)\\r\\n        {\\r\\n            if (index==0) return this.ChartBorder.GetLeft();\\r\\n            else return this.ChartBorder.GetRight();\\r\\n        }\\r\\n        else if (count<=0)\\r\\n        {\\r\\n            return this.ChartBorder.GetLeft();\\r\\n        }\\r\\n        else if (index>=count)\\r\\n        {\\r\\n            return this.ChartBorder.GetRight();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var offset=this.ChartBorder.GetLeft()+this.ChartBorder.GetWidth()*index/count;\\r\\n            return offset;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画X轴\\r\\n    this.DrawVertical=function()\\r\\n    {\\r\\n        var border=this.GetBorder();\\r\\n        var top=border.TopTitle;\\r\\n        var bottom=border.Bottom;\\r\\n        var right=border.RightEx;\\r\\n        var pixelRatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        //JSConsole.Chart.Log('[AverageWidthFrame.DrawVertical] bottom',bottom);\\r\\n        if (this.ChartBorder.Bottom<=5*GetDevicePixelRatio()) return;   //高度不够 不显示\\r\\n\\r\\n        var xPrev=null; //上一个坐标x的值\\r\\n        var textRightPrev=null; //上一次刻度输出右边x坐标\\r\\n        for(var i in this.VerticalInfo)\\r\\n        {\\r\\n            var x=this.GetXFromIndex(this.VerticalInfo[i].Value);\\r\\n            if (x>right) break;\\r\\n            if (xPrev!=null && Math.abs(x-xPrev)<this.MinXDistance) continue;\\r\\n\\r\\n            var item=this.VerticalInfo[i];\\r\\n            var xFixed=ToFixedPoint(x);\\r\\n            if (this.IsShowXLine)\\r\\n            {\\r\\n                if (item.LineType==2)   //虚线\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;\\r\\n                    this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(xFixed,top);\\r\\n                    this.Canvas.lineTo(xFixed,bottom);\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.setLineDash([]);\\r\\n                }\\r\\n                else if (item.LineType==3)\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else if (item.LineType>0)   //实线\\r\\n                {\\r\\n                    if (g_JSChartResource.FrameXLineDash)\\r\\n                    {\\r\\n                        this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;\\r\\n                        this.Canvas.setLineDash(g_JSChartResource.FrameXLineDash);   //虚线\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(xFixed,top);\\r\\n                        this.Canvas.lineTo(xFixed,bottom);\\r\\n                        this.Canvas.stroke();\\r\\n                        this.Canvas.setLineDash([]);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(xFixed,top);\\r\\n                        this.Canvas.lineTo(xFixed,bottom);\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n\\r\\n            if (this.VerticalInfo[i].Message[0]!=null)\\r\\n            {\\r\\n                if (this.VerticalInfo[i].Font!=null)\\r\\n                    this.Canvas.font=this.VerticalInfo[i].Font;\\r\\n\\r\\n                var textLeft=0;\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.strokeStyle=item.TextColor;\\r\\n                var testWidth=this.Canvas.measureText(this.VerticalInfo[i].Message[0]).width;\\r\\n                if (x<testWidth/2)\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                    textLeft=x;\\r\\n                }\\r\\n                else if ((x + testWidth / 2) >= this.ChartBorder.GetChartWidth())\\r\\n                {\\r\\n                    this.Canvas.textAlign = \\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                    textLeft=x-testWidth;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"center\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                    textLeft=x-(testWidth/2);\\r\\n                }\\r\\n\\r\\n                if (textRightPrev==null || textLeft>textRightPrev)\\r\\n                {\\r\\n                    var yText=bottom;\\r\\n                    if (item.LineType==3)\\r\\n                    {\\r\\n                        var lineLength=this.ShortXLineLength*pixelRatio;\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(xFixed,yText);\\r\\n                        this.Canvas.lineTo(xFixed,yText+lineLength);\\r\\n                        this.Canvas.stroke();\\r\\n\\r\\n                        yText+=lineLength+2*pixelRatio;\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.fillText(this.VerticalInfo[i].Message[0],x,yText+this.XBottomOffset);\\r\\n                    textRightPrev=textLeft+testWidth;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            xPrev=x;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Y坐标转y轴数值\\r\\n    this.GetYData=function(y,isLimit)\\r\\n    {\\r\\n        if (this.Logarithmic && this.GetYLogarithmicFromData)\\r\\n        {\\r\\n            return this.GetYLogarithmicData(y);\\r\\n        }\\r\\n\\r\\n        if (this.CoordinateType==1) //反转坐标\\r\\n        {\\r\\n            if (isLimit==false)\\r\\n            {\\r\\n                return (y-this.ChartBorder.GetTopEx())/this.ChartBorder.GetHeightEx()*(this.HorizontalMax-this.HorizontalMin)+this.HorizontalMin;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (y<this.ChartBorder.GetTopEx()) return this.HorizontalMin;\\r\\n                if (y>this.ChartBorder.GetBottomEx()) return this.HorizontalMax;\\r\\n\\r\\n                return (y-this.ChartBorder.GetTopEx())/this.ChartBorder.GetHeightEx()*(this.HorizontalMax-this.HorizontalMin)+this.HorizontalMin;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (isLimit==false)\\r\\n            {\\r\\n                return (this.ChartBorder.GetBottomEx()-y)/this.ChartBorder.GetHeightEx()*(this.HorizontalMax-this.HorizontalMin)+this.HorizontalMin;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (y<this.ChartBorder.GetTopEx()) return this.HorizontalMax;\\r\\n                if (y>this.ChartBorder.GetBottomEx()) return this.HorizontalMin;\\r\\n\\r\\n                return (this.ChartBorder.GetBottomEx()-y)/this.ChartBorder.GetHeightEx()*(this.HorizontalMax-this.HorizontalMin)+this.HorizontalMin;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //X坐标转x轴数值\\r\\n    this.GetXData=function(x)\\r\\n    {\\r\\n        if (x<=this.ChartBorder.GetLeft()) return 0;\\r\\n        if (x>=this.ChartBorder.GetRight()) return this.XPointCount;\\r\\n\\r\\n        return (x-this.ChartBorder.GetLeft())*(this.XPointCount*1.0/this.ChartBorder.GetWidth());\\r\\n    }\\r\\n\\r\\n    //字体外部设置好\\r\\n    this.GetCustomItemTextInfo=function(item, bLeft,pixelTatio)\\r\\n    {\\r\\n        var text=bLeft?item.Message[0]:item.Message[1];\\r\\n        var aryText=[];\\r\\n        var width=0;\\r\\n        if (Array.isArray(text))\\r\\n        {\\r\\n            for(var i=0;i<text.length;++i)\\r\\n            {\\r\\n                var value=this.Canvas.measureText(text[i].Text).width;\\r\\n                if (value>width) width=value;\\r\\n                aryText.push({Text:text[i].Text, Width:value+2*pixelTatio});\\r\\n            }\\r\\n\\r\\n            if (width>0) width+=2*pixelTatio;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            width=this.Canvas.measureText(text).width+2*pixelTatio;\\r\\n            aryText.push( {Text:text, Width:width} );\\r\\n        }\\r\\n\\r\\n        return  { MaxWidth:width, Text:aryText };\\r\\n    }\\r\\n\\r\\n    this.DrawCustomItem=function(item) //显示自定义刻度\\r\\n    {\\r\\n        //if (this.IsHScreen===true) return;  //横屏不画\\r\\n        if (!item.Message[1] && !item.Message[0]) return;\\r\\n        if (item.Value>this.HorizontalMax || item.Value<this.HorizontalMin) return;\\r\\n\\r\\n        var left = this.ChartBorder.GetLeft();\\r\\n        var right = this.ChartBorder.GetRight();\\r\\n        var bottom = this.ChartBorder.GetBottom();\\r\\n        var top = this.ChartBorder.GetTopTitle();\\r\\n        var borderRight = this.ChartBorder.Right;\\r\\n        var borderLeft = this.ChartBorder.Left;\\r\\n        var titleHeight = this.ChartBorder.TitleHeight;\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            borderLeft=this.ChartBorder.Top;\\r\\n            borderRight=this.ChartBorder.Bottom;\\r\\n            top=this.ChartBorder.GetTop();\\r\\n            bottom=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var defaultTextHeight=18*pixelTatio;\\r\\n        var textHeight=defaultTextHeight;\\r\\n\\r\\n        var y = this.GetYFromData(item.Value);\\r\\n\\r\\n        if (item.Message[0])    // 左\\r\\n        {\\r\\n            if (borderLeft<10)\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.textAlign = \\\"left\\\";\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                var textInfo=this.GetCustomItemTextInfo(item,true,pixelTatio);\\r\\n                var textWidth=textInfo.MaxWidth;\\r\\n                var fontHeight=this.GetFontHeight();\\r\\n                textHeight=fontHeight>defaultTextHeight? fontHeight:defaultTextHeight;\\r\\n                var bgColor=item.LineColor;\\r\\n                var rgb=this.RGBToStruct(item.LineColor);\\r\\n                if (rgb) bgColor=`rgba(${rgb.R}, ${rgb.G}, ${rgb.B}, ${g_JSChartResource.FrameLatestPrice.BGAlpha})`;   //内部刻度 背景增加透明度\\r\\n\\r\\n                var yText=y;\\r\\n                for(var i=0;i<textInfo.Text.length;++i)\\r\\n                {\\r\\n                    var itemText=textInfo.Text[i];\\r\\n                    if (this.IsHScreen)\\r\\n                    {\\r\\n                        var bgTop=top;\\r\\n                        var textLeft=yText-textHeight/2-1*pixelTatio;\\r\\n                        this.Canvas.fillStyle=bgColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,textHeight,itemText.Width);\\r\\n                        this.DrawHScreenText({X:yText, Y:bgTop}, {Text:itemText.Text, Color:item.TextColor, XOffset:1*pixelTatio, YOffset:2*pixelTatio});\\r\\n                        if (i==0) this.DrawLine(bgTop+itemText.Width,bottom,yText,item.LineColor,item.LineType);\\r\\n\\r\\n                        yText-=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var bgTop=yText-textHeight/2-1*pixelTatio;\\r\\n                        var textLeft=left + 1*pixelTatio\\r\\n                        this.Canvas.fillStyle=bgColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,itemText.Width,textHeight);\\r\\n                        this.Canvas.fillStyle = item.TextColor;\\r\\n                        this.Canvas.fillText(itemText.Text, textLeft + 1*pixelTatio, yText);\\r\\n                        if (i==0) this.DrawLine(textLeft+itemText.Width,right,yText,item.LineColor,item.LineType);\\r\\n\\r\\n                        yText+=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.textAlign = \\\"right\\\";\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                var textInfo=this.GetCustomItemTextInfo(item,true,pixelTatio);\\r\\n                var textWidth=textInfo.MaxWidth;\\r\\n                var fontHeight=this.GetFontHeight();\\r\\n                textHeight=fontHeight>defaultTextHeight? fontHeight:defaultTextHeight;\\r\\n\\r\\n                var yText=y;\\r\\n                for(var i=0;i<textInfo.Text.length;++i)\\r\\n                {\\r\\n                    var itemText=textInfo.Text[i];\\r\\n                    if (this.IsHScreen)\\r\\n                    {\\r\\n                        if (i==0) var bgTop=top-itemText.Width;\\r\\n                        else var bgTop=top-textWidth;\\r\\n\\r\\n                        var textLeft=yText-textHeight/2-1*pixelTatio;\\r\\n                        this.Canvas.fillStyle=item.LineColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,textHeight,itemText.Width);\\r\\n                        this.DrawHScreenText({X:yText, Y:bgTop}, {Text:itemText.Text, Color:item.TextColor, XOffset:1*pixelTatio, YOffset:2*pixelTatio});\\r\\n                        if (i==0) this.DrawLine(bgTop+itemText.Width,bottom,yText,item.LineColor,item.LineType);\\r\\n\\r\\n                        yText-=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var bgTop=yText-textHeight/2-1*pixelTatio;\\r\\n                        if (i==0)\\r\\n                        {\\r\\n                            var rectLeft=left-itemText.Width;\\r\\n                            var textLeft=left;\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var rectLeft=left-textWidth;\\r\\n                            var textLeft=left-(textWidth-itemText.Width);\\r\\n                        }\\r\\n\\r\\n                        this.Canvas.fillStyle=item.LineColor;\\r\\n                        this.Canvas.fillRect(rectLeft,bgTop,itemText.Width,textHeight);\\r\\n                        this.Canvas.fillStyle = item.TextColor;\\r\\n                        this.Canvas.fillText(itemText.Text, textLeft - 1*pixelTatio, yText);\\r\\n                        if (i==0) this.DrawLine(left,right,yText,item.LineColor,item.LineType);\\r\\n\\r\\n                        yText+=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (item.Message[1])   //右\\r\\n        {\\r\\n            if (borderRight<10)\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.textAlign = \\\"left\\\";\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                var textInfo=this.GetCustomItemTextInfo(item,false,pixelTatio);\\r\\n                var textWidth=textInfo.MaxWidth;\\r\\n                var fontHeight=this.GetFontHeight();\\r\\n                textHeight=fontHeight>defaultTextHeight? fontHeight:defaultTextHeight;\\r\\n                var bgColor=item.LineColor;\\r\\n                var rgb=this.RGBToStruct(item.LineColor);\\r\\n                if (rgb) bgColor=`rgba(${rgb.R}, ${rgb.G}, ${rgb.B}, ${g_JSChartResource.FrameLatestPrice.BGAlpha})`;   //内部刻度 背景增加透明度\\r\\n\\r\\n                var yText=y;\\r\\n                for(var i=0;i<textInfo.Text.length;++i)\\r\\n                {\\r\\n                    var itemText=textInfo.Text[i];\\r\\n                    if (this.IsHScreen)\\r\\n                    {\\r\\n                        var bgTop=bottom-itemText.Width;\\r\\n                        var textLeft=yText-textHeight/2-1*pixelTatio;\\r\\n                        this.Canvas.fillStyle=bgColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,textHeight,textWidth);\\r\\n                        this.DrawHScreenText({X:yText, Y:bgTop}, {Text:itemText.Text, Color:item.TextColor, XOffset:1*pixelTatio, YOffset:2*pixelTatio});\\r\\n                        if (i==0) this.DrawLine(top,bgTop,yText,item.LineColor,item.LineType);\\r\\n                        yText-=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var bgTop=yText-textHeight/2-1*pixelTatio;\\r\\n                        var textLeft=right-itemText.Width;\\r\\n                        this.Canvas.fillStyle=bgColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,textWidth,textHeight);  //文本背景区域\\r\\n                        this.Canvas.fillStyle = item.TextColor;\\r\\n                        this.Canvas.fillText(itemText.Text, textLeft + 1*pixelTatio, yText);\\r\\n                        if (i==0) this.DrawLine(left,textLeft,yText,item.LineColor,item.LineType);\\r\\n                        yText+=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.textAlign = \\\"left\\\";\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                var textInfo=this.GetCustomItemTextInfo(item,false,pixelTatio);\\r\\n                var textWidth=textInfo.MaxWidth;\\r\\n                var fontHeight=this.GetFontHeight();\\r\\n                textHeight=fontHeight>defaultTextHeight? fontHeight:defaultTextHeight;\\r\\n\\r\\n                var yText=y;\\r\\n                for(var i=0;i<textInfo.Text.length;++i)\\r\\n                {\\r\\n                    var itemText=textInfo.Text[i];\\r\\n                    if (this.IsHScreen)\\r\\n                    {\\r\\n                        var bgTop=bottom;\\r\\n                        //bgTop+=(textWidth-itemText.Width);\\r\\n                        var textLeft=yText-textHeight/2-1*pixelTatio;\\r\\n                        this.Canvas.fillStyle=item.LineColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,textHeight,itemText.Width);\\r\\n                        this.DrawHScreenText({X:yText, Y:bgTop}, {Text:itemText.Text, Color:item.TextColor, XOffset:1*pixelTatio, YOffset:2*pixelTatio});\\r\\n                        if (i==0)  this.DrawLine(top,bgTop,yText,item.LineColor,item.LineType);\\r\\n\\r\\n                        yText-=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var bgTop=yText-textHeight/2-1*pixelTatio;\\r\\n                        if (i==0)\\r\\n                        {\\r\\n                            var textLeft=right;\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var textLeft=right+textWidth-itemText.Width;\\r\\n                        }\\r\\n\\r\\n                        this.Canvas.fillStyle=item.LineColor;\\r\\n                        this.Canvas.fillRect(textLeft,bgTop,itemText.Width,textHeight);\\r\\n                        this.Canvas.fillStyle = item.TextColor;\\r\\n                        this.Canvas.fillText(itemText.Text, textLeft + 1*pixelTatio, yText);\\r\\n                        if (i==0) this.DrawLine(left,right,yText,item.LineColor,item.LineType);\\r\\n\\r\\n                        yText+=textHeight+1*pixelTatio;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawDotLine=function(left,right,y, color)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.strokeStyle=color;\\r\\n        this.Canvas.setLineDash([5*pixelTatio,5*pixelTatio]);   //虚线\\r\\n        this.Canvas.beginPath();\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.moveTo(ToFixedPoint(y),left);\\r\\n            this.Canvas.lineTo(ToFixedPoint(y),right);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.moveTo(left,ToFixedPoint(y));\\r\\n            this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n        }\\r\\n        this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(left,right,y, color,lineType)\\r\\n    {\\r\\n        if (lineType==-1) return;\\r\\n\\r\\n        if (lineType==0)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=color;\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(y),left);\\r\\n                this.Canvas.lineTo(ToFixedPoint(y),right);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(left,ToFixedPoint(y));\\r\\n                this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.DrawDotLine(left,right,y, color);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawHScreenText=function(center,data)\\r\\n    {\\r\\n        this.Canvas.textAlign = \\\"left\\\";\\r\\n        this.Canvas.textBaseline = \\\"middle\\\";\\r\\n        this.Canvas.fillStyle = data.Color;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(center.X, center.Y);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        this.Canvas.fillText(data.Text, data.XOffset, data.YOffset);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.RGBToStruct=function(rgb)\\r\\n    {\\r\\n        if(/^(rgb|RGB)/.test(rgb))\\r\\n        {\\r\\n            var aColor = rgb.replace(/(?:\\\\(|\\\\)|rgb|RGB)*/g,\\\"\\\").split(\\\",\\\");\\r\\n            var result={};\\r\\n            if (aColor.length!=3) return null;\\r\\n\\r\\n            result.R = Number(aColor[0]);\\r\\n            result.G = Number(aColor[1]);\\r\\n            result.B = Number(aColor[2]);\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetScaleTextWidth=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var borderTop=this.ChartBorder.Top;\\r\\n            var borderBottom=this.ChartBorder.Bottom;\\r\\n            var isDrawLeft=borderTop>10*pixelTatio && this.IsShowYText[0]===true && this.YTextPosition[0]!=2;\\r\\n            var isDrawRight=borderBottom>10*pixelTatio && this.IsShowYText[1]===true && this.YTextPosition[1]!=2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var borderRight=this.ChartBorder.Right;\\r\\n            var borderLeft=this.ChartBorder.Left;\\r\\n            var isDrawLeft=borderLeft>10 && this.IsShowYText[0]===true && this.YTextPosition[0]!=2;\\r\\n            var isDrawRight=borderRight>10 && this.IsShowYText[1]===true && this.YTextPosition[1]!=2;\\r\\n        }\\r\\n\\r\\n        if (!isDrawRight && !isDrawLeft) return null;\\r\\n\\r\\n        var width={ Left:null, Right:null };\\r\\n        var rightExtendWidth=0;\\r\\n        for(var i=0;i<this.HorizontalInfo.length;++i)\\r\\n        {\\r\\n            var textWidth=null;\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            if (!item) continue;\\r\\n            if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n            if (item.Message[0]!=null && isDrawLeft)\\r\\n            {\\r\\n                textWidth=this.Canvas.measureText(item.Message[0]).width;\\r\\n                if (width.Left==null || width.Left<textWidth)\\r\\n                    width.Left=textWidth;\\r\\n\\r\\n                //JSConsole.Chart.Log(`[ChartData::GetScaleTextWidth] ${item.Message[0]} ${textWidth}`);\\r\\n            }\\r\\n\\r\\n            if (item.Message[1]!=null && isDrawRight)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                if (Array.isArray(item.Message[1]))\\r\\n                {\\r\\n                    if (this.MultiTextFormat==1)    //显示1行 格式:价格/百分比\\r\\n                    {\\r\\n                        if (item.ExtendData)\\r\\n                        {\\r\\n                            if (item.ExtendData.Font) this.Canvas.font=item.ExtendData.Font;\\r\\n                            var width1=this.Canvas.measureText(item.Message[1][0]).width;\\r\\n                            var width2=this.Canvas.measureText(item.Message[1][1]).width;\\r\\n                            var width3=this.Canvas.measureText('/').width;\\r\\n                            textWidth=width1+width3;\\r\\n\\r\\n                            if (rightExtendWidth<width2) rightExtendWidth=width2;\\r\\n\\r\\n                            //JSConsole.Chart.Log(`[ChartData::GetScaleTextWidth] ${item.Message[1][1]}/${item.Message[1][0]} ${textWidth}, ${rightExtendWidth}`);\\r\\n                        }\\r\\n                    }\\r\\n                    else if (this.MultiTextFormat==2)   //显示2行\\r\\n                    {\\r\\n                        textWidth=this.Canvas.measureText(item.Message[1][0]).width;\\r\\n                        var textWidth2=this.Canvas.measureText(item.Message[1][1]).width;\\r\\n                        if (textWidth<textWidth2) textWidth=textWidth2;\\r\\n                    }\\r\\n                    else    //显示第1行\\r\\n                    {\\r\\n                        textWidth=this.Canvas.measureText(item.Message[1][0]).width;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    textWidth=this.Canvas.measureText(item.Message[1]).width;\\r\\n                }\\r\\n\\r\\n                if (width.Right==null || width.Right<textWidth)\\r\\n                    width.Right=textWidth;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(width.Right)) width.Right+=rightExtendWidth;\\r\\n\\r\\n        return { TextWidth:width };\\r\\n    }\\r\\n\\r\\n    this.ClearToolbar=function()\\r\\n    {\\r\\n        if (!this.ToolbarID) return;\\r\\n\\r\\n        var divToolbar=document.getElementById(this.ToolbarID);\\r\\n        if (!divToolbar) return;\\r\\n        this.ChartBorder.UIElement.parentNode.removeChild(divToolbar);\\r\\n        this.ToolbarRect=null;\\r\\n    }\\r\\n\\r\\n    this.HideToolbar=function()\\r\\n    {\\r\\n        if (!this.ToolbarID) return;\\r\\n\\r\\n        this.ToolbarRect=null;\\r\\n        var divToolbar=document.getElementById(this.ToolbarID);\\r\\n        if (!divToolbar) return;\\r\\n\\r\\n        if (divToolbar.style.display!='none') divToolbar.style.display='none';\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction MinuteFrame()\\r\\n{\\r\\n    this.newMethod=AverageWidthFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"MinuteFrame\\\";\\r\\n    this.DataWidth=1*GetDevicePixelRatio();\\r\\n    this.DistanceWidth=1*GetDevicePixelRatio();\\r\\n    this.MinuteCount=243;   //每天的分钟个数\\r\\n    this.BeforeBGColor=g_JSChartResource.Minute.Before.BGColor;  //集合竞价背景\\r\\n    this.MultiDayBorderPen=g_JSChartResource.FrameBorderPen;\\r\\n    this.CustomHorizontalInfo=[];\\r\\n    this.RightFrame=null;   //右侧多重坐标\\r\\n    this.ToolbarID=Guid();  //工具条Div id\\r\\n    this.ReDrawToolbar=false;\\r\\n    this.DayCount=1;        //显示天数\\r\\n\\r\\n    this.ModifyIndex=true;      //是否显示'改参数'菜单\\r\\n    this.ChangeIndex=true;      //是否显示'换指标'菜单\\r\\n    this.CloseIndex=true;       //是否显示'关闭指标窗口'菜单\\r\\n\\r\\n    this.ModifyIndexEvent;   //改参数 点击事件\\r\\n    this.ChangeIndexEvent;   //换指标 点击事件\\r\\n    this.ToolbarRect=null;   //保存工具条的位置\\r\\n    this.IsShowPositionTitle=false; //是否显示持仓标题\\r\\n\\r\\n    this.LastCalculateStatus={ Width:0, XPointCount:0 };    //最后一次计算宽度的状态\\r\\n    this.BeforeCloseIcon=\\r\\n        {\\r\\n            Family:g_JSChartResource.Minute.Before.CloseIcon.Family,\\r\\n            Text:g_JSChartResource.Minute.Before.CloseIcon.Text,\\r\\n            Color:g_JSChartResource.Minute.Before.CloseIcon.Color,\\r\\n            Size:g_JSChartResource.Minute.Before.CloseIcon.Size\\r\\n        };\\r\\n\\r\\n    this.BeforeOpenVerticalInfo=[];      //盘前集合竞价X轴\\r\\n    this.AfterCloseVerticalInfo=[];      //收盘集合竞价X轴\\r\\n\\r\\n    this.DrawFrame=function()\\r\\n    {\\r\\n        if (!this.IsMinSize)\\r\\n        {\\r\\n            this.SplitXYCoordinate();\\r\\n            this.DrawBeforeDataBG();\\r\\n\\r\\n            this.YInsideOffset=0;\\r\\n            this.DrawTitleBG();\\r\\n            this.DrawHorizontal();\\r\\n            this.DrawVertical();\\r\\n        }\\r\\n\\r\\n        if (this.SizeChange==true || this.ReDrawToolbar==true)\\r\\n        {\\r\\n            this.DrawToolbar();  //大小变动才画工具条\\r\\n            this.ReDrawToolbar=false;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画边框\\r\\n    this.SuperDrawBorder=this.DrawBorder;\\r\\n    this.DrawBorder=function()\\r\\n    {\\r\\n        if (!this.IsShowBorder) return;\\r\\n        if (this.IsMinSize) return;\\r\\n        this.SuperDrawBorder();\\r\\n\\r\\n        if (this.Identify==1)   //走势图和成交量中间用粗线分割开\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var left=ToFixedPoint(border.Left);\\r\\n            var top=ToFixedPoint(border.Top);\\r\\n            var right=ToFixedPoint(border.Right);\\r\\n\\r\\n            this.Canvas.strokeStyle=this.PenBorder;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(left,top);\\r\\n            this.Canvas.lineTo(right,top);\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.lineWidth=2 * GetDevicePixelRatio();\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawVolTitle=function(symbol)\\r\\n    {\\r\\n        if (!MARKET_SUFFIX_NAME.IsShowMinuteVolTitle(symbol)) return;\\r\\n\\r\\n        if (this.Identify==1)   //显示\\\"成交量\\\"\\r\\n        {\\r\\n            var pixelRatio=GetDevicePixelRatio();\\r\\n            var left=this.ChartBorder.GetLeft()+2*pixelRatio+this.YInsideOffset;\\r\\n\\r\\n            var top=this.ChartBorder.GetTopEx()+2*pixelRatio;\\r\\n\\r\\n            this.Canvas.textAlign='left';\\r\\n            this.Canvas.textBaseline='top';\\r\\n            if (g_JSChartResource.Minute.VolBarColor || g_JSChartResource.Minute.VolTitleColor)\\r\\n            {\\r\\n                if (g_JSChartResource.Minute.VolBarColor) this.Canvas.fillStyle=g_JSChartResource.Minute.VolBarColor\\r\\n                else this.Canvas.fillStyle=g_JSChartResource.Minute.VolTitleColor;\\r\\n                var languageID=this.YSplitOperator.LanguageID;\\r\\n                var text=g_JSChartLocalization.GetText('MVol-Vol',languageID);\\r\\n                this.Canvas.fillText(text,left,top);\\r\\n                left+=this.Canvas.measureText(text).width;\\r\\n                left+=6*GetDevicePixelRatio();\\r\\n            }\\r\\n\\r\\n            if (this.IsShowPositionTitle)\\r\\n            {\\r\\n                text=g_JSChartLocalization.GetText('MVol-Position',languageID);\\r\\n                this.Canvas.fillStyle=g_JSChartResource.Minute.PositionColor;\\r\\n                this.Canvas.fillText(text,left,top);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawToolbar=function()\\r\\n    {\\r\\n        if (typeof($)==\\\"undefined\\\") return;\\r\\n\\r\\n        if (this.Identify<2) return;\\r\\n        if (!this.ChartBorder.UIElement) return;\\r\\n\\r\\n        var divToolbar=document.getElementById(this.ToolbarID);\\r\\n        if (divToolbar && this.SizeChange==false && this.ReDrawToolbar==false) return;\\r\\n\\r\\n        if (!divToolbar)\\r\\n        {\\r\\n            divToolbar=document.createElement(\\\"div\\\");\\r\\n            divToolbar.className='klineframe-toolbar';\\r\\n            divToolbar.id=this.ToolbarID;\\r\\n            divToolbar.oncontextmenu = function() { return false;}; //屏蔽右键系统菜单\\r\\n            //为divToolbar添加属性identify\\r\\n            divToolbar.setAttribute(\\\"identify\\\",this.Identify.toString());\\r\\n            this.ChartBorder.UIElement.parentNode.appendChild(divToolbar);\\r\\n        }\\r\\n\\r\\n        if (!this.ModifyIndex && !this.ChangeIndex && !this.OverlayIndex)\\r\\n        {\\r\\n            if (divToolbar.style.display!='none')\\r\\n                divToolbar.style.display='none';\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //使用外城div尺寸 画图尺寸是被放大的\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var chartWidth=parseInt(this.ChartBorder.UIElement.parentElement.style.width.replace(\\\"px\\\",\\\"\\\"));\\r\\n        var chartHeight=parseInt(this.ChartBorder.UIElement.parentElement.style.height.replace(\\\"px\\\",\\\"\\\"));\\r\\n        //JSConsole.Chart.Log('[KLineFrame::DrawToolbar] ',chartWidth,chartHeight,pixelTatio);\\r\\n\\r\\n        var toolbarWidth=100;\\r\\n        var toolbarHeight=this.ChartBorder.GetTitleHeight();\\r\\n        var left=chartWidth-(this.ChartBorder.Right/pixelTatio)-toolbarWidth;\\r\\n        var top=this.ChartBorder.GetTop()/pixelTatio;\\r\\n\\r\\n        if (this.ToolbarRect)\\r\\n        {\\r\\n            //尺寸变动移动才重新设置DOM\\r\\n            if (this.ToolbarRect.Left==left && this.ToolbarRect.Top==top &&\\r\\n                this.ToolbarRect.Width==toolbarWidth && this.ToolbarRect.Height==toolbarHeight/pixelTatio)\\r\\n            {\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ToolbarRect={ Left:left, Top:top, Width:toolbarWidth, Height:toolbarHeight/pixelTatio };\\r\\n\\r\\n        const modifyButton=`<span class='index_param icon iconfont icon-index_param' id='modifyindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='调整指标参数'></span>`;\\r\\n        const changeButton=`<span class='index_change icon iconfont icon-change_index' id='changeindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='切换指标'></span>`;\\r\\n        const closeButton=`<span class='index_close icon iconfont icon-close' id='closeindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='关闭指标窗口'></span>`;\\r\\n\\r\\n        var spanIcon=modifyButton+changeButton;\\r\\n        if (this.CloseIndex)\\r\\n        {\\r\\n            spanIcon+=closeButton;\\r\\n        }\\r\\n\\r\\n        //var scrollPos=GetScrollPosition();\\r\\n        //left = left+scrollPos.Left;\\r\\n        //top = top+scrollPos.Top;\\r\\n        divToolbar.style.left = left + \\\"px\\\";\\r\\n        divToolbar.style.top = top + \\\"px\\\";\\r\\n        divToolbar.style.width=toolbarWidth+\\\"px\\\";                   //宽度先不调整吧\\r\\n        divToolbar.style.height=(toolbarHeight/pixelTatio)+'px';    //只调整高度\\r\\n        divToolbar.innerHTML=spanIcon;\\r\\n\\r\\n        var chart=this.ChartBorder.UIElement.JSChartContainer;\\r\\n        var identify=this.Identify;\\r\\n        if (!this.ModifyIndex)  //隐藏'改参数'\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_param\\\").hide();\\r\\n        else if (typeof(this.ModifyIndexEvent)=='function')  //绑定点击事件\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_param\\\").click(\\r\\n                {\\r\\n                    Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                    Identify:this.Identify\\r\\n                },this.ModifyIndexEvent);\\r\\n\\r\\n        if (!this.ChangeIndex)  //隐藏'换指标'\\r\\n        {\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_change\\\").hide();\\r\\n        }\\r\\n        else if (typeof(this.ChangeIndexEvent)=='function')\\r\\n        {\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_change\\\").click(\\r\\n                {\\r\\n                    Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                    Identify:this.Identify,\\r\\n                    IsOverlay:false\\r\\n                },this.ChangeIndexEvent);\\r\\n        }\\r\\n\\r\\n        $(\\\"#\\\"+divToolbar.id+\\\" .index_close\\\").click(\\r\\n            {\\r\\n                Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                Identify:this.Identify\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                var hqChart=event.data.Chart;\\r\\n                var id=event.data.Identify;\\r\\n                hqChart.RemoveIndexWindow(id);\\r\\n            });\\r\\n\\r\\n        divToolbar.style.display = \\\"block\\\";\\r\\n    }\\r\\n\\r\\n    this.DrawMultiDayBeforeDataBG=function(border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        var top=ToFixedPoint(border.Top);\\r\\n        var bottom=ToFixedPoint(border.Bottom);\\r\\n        var height=bottom-top;\\r\\n        this.Canvas.fillStyle=this.BeforeBGColor;\\r\\n        this.Canvas.strokeStyle=this.MultiDayBorderPen;\\r\\n        for(var i in dayBorder)\\r\\n        {\\r\\n            var drawCount=0;\\r\\n            var item=dayBorder[i];\\r\\n            var left=ToFixedPoint(item.Left);\\r\\n            var right=ToFixedPoint(item.LeftEx);\\r\\n            var width=right-left;\\r\\n            if (width>3)\\r\\n            {\\r\\n                this.Canvas.fillRect(left,top,width,height);\\r\\n                ++drawCount;\\r\\n            }\\r\\n\\r\\n            var left=ToFixedPoint(item.RightEx);\\r\\n            var right=ToFixedPoint(item.Right);\\r\\n            var width=right-left;\\r\\n            if (width>3)\\r\\n            {\\r\\n                this.Canvas.fillRect(left,top,width,height);\\r\\n                ++drawCount;\\r\\n            }\\r\\n\\r\\n            if (drawCount==2 && i!=dayBorder.length-1)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(right,top);\\r\\n                this.Canvas.lineTo(right,bottom);\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCallAuctionVertical=function(verticalInfo, callAuctionData, border, isBeforeClose)\\r\\n    {\\r\\n        if (!callAuctionData) return;\\r\\n\\r\\n        var top=border.TopTitle;\\r\\n        var bottom=border.Bottom;\\r\\n        var left=border.Left;\\r\\n        var right=border.LeftEx;\\r\\n        var pixelRatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n\\r\\n        var xPrev=null;         //上一个坐标x的值\\r\\n        var textRightPrev=null; //上一次刻度输出右边x坐标\\r\\n\\r\\n        for(var i in verticalInfo)\\r\\n        {\\r\\n            var item=verticalInfo[i];\\r\\n            var x=this.GetLeftExtendXFromIndex(item.Value,callAuctionData);\\r\\n            if (x>right) break;\\r\\n            if (xPrev!=null && Math.abs(x-xPrev)<this.MinXDistance) continue;\\r\\n\\r\\n            var xFixed=ToFixedPoint(x);\\r\\n            if (this.IsShowXLine)\\r\\n            {\\r\\n                if (item.LineType==2)   //虚线\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=item.LineColor;\\r\\n                    this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(xFixed,top);\\r\\n                    this.Canvas.lineTo(xFixed,bottom);\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.setLineDash([]);\\r\\n                }\\r\\n                else if (item.LineType==3)\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else if (item.LineType>0)   //实线\\r\\n                {\\r\\n                    if (g_JSChartResource.FrameXLineDash)\\r\\n                    {\\r\\n                        this.Canvas.strokeStyle=item.LineColor;\\r\\n                        this.Canvas.setLineDash(g_JSChartResource.FrameXLineDash);   //虚线\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(xFixed,top);\\r\\n                        this.Canvas.lineTo(xFixed,bottom);\\r\\n                        this.Canvas.stroke();\\r\\n                        this.Canvas.setLineDash([]);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.strokeStyle=item.LineColor;\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(xFixed,top);\\r\\n                        this.Canvas.lineTo(xFixed,bottom);\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n\\r\\n            if (item.Message[0]!=null && this.ChartBorder.Bottom>5*pixelRatio)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                var textLeft=0;\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.strokeStyle=item.TextColor;\\r\\n                var testWidth=this.Canvas.measureText(item.Message[0]).width;\\r\\n                if (x<testWidth/2)\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                    textLeft=x;\\r\\n                }\\r\\n                else if ((x + testWidth / 2) >= border.ChartWidth)\\r\\n                {\\r\\n                    this.Canvas.textAlign = \\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                    textLeft=x-testWidth;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"center\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                    textLeft=x-(testWidth/2);\\r\\n                }\\r\\n\\r\\n                if (textRightPrev==null || textLeft>textRightPrev)\\r\\n                {\\r\\n                    var yText=bottom;\\r\\n                    if (item.LineType==3)\\r\\n                    {\\r\\n                        var lineLength=this.ShortXLineLength*pixelRatio;\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(xFixed,yText);\\r\\n                        this.Canvas.lineTo(xFixed,yText+lineLength);\\r\\n                        this.Canvas.stroke();\\r\\n\\r\\n                        yText+=lineLength+2*pixelRatio;\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.fillText(item.Message[0],x,yText+this.XBottomOffset);\\r\\n                    textRightPrev=textLeft+testWidth;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            xPrev=x;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画集合竞价背景\\r\\n    this.DrawBeforeDataBG=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder)\\r\\n        {\\r\\n            this.DrawMultiDayBeforeDataBG(border);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.ChartBorder.LeftExtendWidth<10 && this.ChartBorder.RightExtendWidth<10) return;\\r\\n        //if (this.Identify>=2) return;\\r\\n\\r\\n        var top=ToFixedPoint(border.Top);\\r\\n        var bottom=ToFixedPoint(border.Bottom);\\r\\n        this.Canvas.fillStyle=this.BeforeBGColor;\\r\\n\\r\\n        if (this.ChartBorder.LeftExtendWidth>10)\\r\\n        {\\r\\n            var left=ToFixedPoint(border.Left);\\r\\n            var right=ToFixedPoint(this.ChartBorder.GetLeft());\\r\\n            var width=right-left;\\r\\n            var height=bottom-top;\\r\\n\\r\\n            this.Canvas.fillRect(left,top,width,height);\\r\\n\\r\\n            //绘制关闭图标\\r\\n            if (this.Identify==0)\\r\\n            {\\r\\n                this.Canvas.font=this.BeforeCloseIcon.Size+'px '+this.BeforeCloseIcon.Family;\\r\\n                this.Canvas.fillStyle=this.BeforeCloseIcon.Color;\\r\\n                this.Canvas.textAlign = 'left';\\r\\n                this.Canvas.textBaseline='top';\\r\\n                this.Canvas.fillText(this.BeforeCloseIcon.Text,border.Left,border.TopEx);\\r\\n\\r\\n                var rect={ Left:border.Left, Top:border.TopEx, Width:this.BeforeCloseIcon.Size, Height:this.BeforeCloseIcon.Size };\\r\\n                this.Buttons.push( { Rect:rect, Name:\\\"集合竞价关闭按钮\\\" , ID:JSCHART_BUTTON_ID.CLOSE_BEFOREOPEN_ID });\\r\\n            }\\r\\n\\r\\n            this.DrawCallAuctionVertical(this.BeforeOpenVerticalInfo, this.YSplitOperator.BeforeOpenData, border, true);\\r\\n        }\\r\\n\\r\\n        if (this.ChartBorder.RightExtendWidth>10)\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.BeforeBGColor;\\r\\n            var left=ToFixedPoint(this.ChartBorder.GetRight());\\r\\n            var right=ToFixedPoint(border.Right);\\r\\n            var width=right-left;\\r\\n            var height=bottom-top;\\r\\n\\r\\n            this.Canvas.fillRect(left,top,width,height);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n        if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        if (this.XSplitOperator!=null) this.XSplitOperator.Operator();\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayXFromIndex=function(index, border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        var minuteIndex=index%this.MinuteCount;\\r\\n        var dayIndex=parseInt(index/this.MinuteCount);\\r\\n        if (dayIndex>=dayBorder.length) dayIndex=dayBorder.length-1;\\r\\n\\r\\n        var client=dayBorder[dayIndex];\\r\\n        var count=this.MinuteCount-1;\\r\\n\\r\\n        if (minuteIndex>=count)\\r\\n        {\\r\\n            return client.RightEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var width=(client.RightEx-client.LeftEx);\\r\\n            var offset=client.LeftEx+width*minuteIndex/count;\\r\\n            return offset;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(index)\\r\\n    {\\r\\n        var count=this.XPointCount-1;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder) return this.GetMultiDayXFromIndex(index, border);\\r\\n\\r\\n        if (count==1)\\r\\n        {\\r\\n            if (index==0) return border.LeftEx;\\r\\n            else return border.RightEx;\\r\\n        }\\r\\n        else if (count<=0)\\r\\n        {\\r\\n            return border.LeftEx;\\r\\n        }\\r\\n        else if (index>=count)\\r\\n        {\\r\\n            return border.RightEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var width=(border.RightEx-border.LeftEx);\\r\\n            var offset=border.LeftEx+width*index/count;\\r\\n            return offset;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayXData=function(x,border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        for(var i=0;i<dayBorder.length;++i)\\r\\n        {\\r\\n            var client=dayBorder[i];\\r\\n            if (x>=client.Left && x<=client.Right)\\r\\n            {\\r\\n                var count=this.MinuteCount-1;\\r\\n                var dayMinuteCount=this.MinuteCount*i;\\r\\n                if (x<=client.LeftEx) return 0+dayMinuteCount;\\r\\n                if (x>=client.RightEx) return count+dayMinuteCount;\\r\\n\\r\\n                var width=client.RightEx-client.LeftEx;\\r\\n                return (x-client.LeftEx)*(count*1.0/width)+dayMinuteCount;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //X坐标转x轴数值\\r\\n    this.GetXData=function(x)\\r\\n    {\\r\\n        var count=this.XPointCount-1;\\r\\n        if (count<0) count=0;\\r\\n\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder) return this.GetMultiDayXData(x, border);\\r\\n\\r\\n        if (x<=border.LeftEx) return 0;\\r\\n        if (x>=border.RightEx) return count;\\r\\n\\r\\n        var width=border.RightEx-border.LeftEx;\\r\\n        return (x-border.LeftEx)*(count*1.0/width);\\r\\n    }\\r\\n\\r\\n    this.DrawCustomHorizontal=function()    //Y轴刻度定制显示\\r\\n    {\\r\\n        if (this.IsMinSize) return;\\r\\n        for(var i in this.CustomHorizontalInfo)\\r\\n        {\\r\\n            var item=this.CustomHorizontalInfo[i];\\r\\n            switch(item.Type)\\r\\n            {\\r\\n                case 0:\\r\\n                case 1:\\r\\n                    this.DrawCustomItem(item);  //自定义刻度\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendXFromIndex=function(index, obj)\\r\\n    {\\r\\n        var count=obj.TotalCount-1;\\r\\n\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder) return this.GetLeftExtendMultiDayXFromIndex(index, obj, border);\\r\\n\\r\\n        var left=border.Left;\\r\\n        var width=this.ChartBorder.LeftExtendWidth;\\r\\n\\r\\n        var offset=left+width*index/count;\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendMultiDayXFromIndex=function(index, obj, border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        var client=dayBorder[obj.Index];\\r\\n        var count=obj.TotalCount-1;\\r\\n\\r\\n        var left=client.Left;\\r\\n        var right=client.LeftEx;\\r\\n        var width=right-left;\\r\\n\\r\\n        var offset=left+width*index/count;\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendMultiDayXData=function(x, obj, border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        for(var i in dayBorder)\\r\\n        {\\r\\n            var client=dayBorder[i];\\r\\n            if (x>=client.Left && x<=client.LeftEx)\\r\\n            {\\r\\n                var count=obj[i].TotalCount-1;\\r\\n                var left=client.Left;\\r\\n                var right=client.LeftEx;\\r\\n\\r\\n                var width=right-left;\\r\\n                var index=(x-left)*(count*1.0/width);\\r\\n\\r\\n                return { DayIndex:parseInt(i), DataIndex:index };\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendXData=function(x, obj)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder) return this.GetLeftExtendMultiDayXData(x, obj, border);\\r\\n\\r\\n        var count=obj.TotalCount-1;\\r\\n        if (count<0) count=0;\\r\\n\\r\\n        var left=border.Left;\\r\\n        var right=border.LeftEx;\\r\\n\\r\\n        if (x<=left) return 0;\\r\\n        if (x>=right) return count;\\r\\n\\r\\n        var width=right-left;\\r\\n        return (x-left)*(count*1.0/width);\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendYFromData=function(value,isLimit,obj)\\r\\n    {\\r\\n        if (!obj || !obj.Range) return this.GetYFromData(value,isLimit);\\r\\n\\r\\n        var range=obj.Range;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var height=border.BottomEx-border.TopEx;\\r\\n        var offset=height*(value-range.Min)/(range.Max-range.Min);\\r\\n        return border.BottomEx-offset;\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendYData=function(y, isLimit, obj)\\r\\n    {\\r\\n        if (!obj || !obj.Range) return this.GetYData(y,isLimit);\\r\\n\\r\\n        var range=obj.Range;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var height=border.BottomEx-border.TopEx;\\r\\n        return (border.BottomEx-y)/height*(range.Max-range.Min)+range.Min;\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendMultiDayXFromIndex=function(index, obj, border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        var client=dayBorder[obj.Index];\\r\\n        var count=obj.TotalCount-1;\\r\\n\\r\\n        var left=client.RightEx;\\r\\n        var right=client.Right;\\r\\n        var width=right-left;\\r\\n\\r\\n        var offset=left+width*index/count;\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendXFromIndex=function(index, obj)\\r\\n    {\\r\\n        var count=obj.TotalCount-1;\\r\\n\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder) return this.GetRightExtendMultiDayXFromIndex(index, obj, border);\\r\\n\\r\\n        var left=border.RightEx;\\r\\n        var width=this.ChartBorder.RightExtendWidth;\\r\\n\\r\\n        var offset=left+width*index/count;\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendYFromData=function(value,isLimit,obj)\\r\\n    {\\r\\n        return this.GetLeftExtendYFromData(value,isLimit,obj)\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendYData=function(y, isLimit, obj)\\r\\n    {\\r\\n        if (!obj || !obj.Range) return this.GetYData(y,isLimit);\\r\\n\\r\\n        return this.GetLeftExtendYData(y, isLimit, obj);\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendMultiDayXData=function(x, obj, border)\\r\\n    {\\r\\n        var dayBorder=border.DayBorder;\\r\\n        for(var i in dayBorder)\\r\\n        {\\r\\n            var client=dayBorder[i];\\r\\n            if (x>=client.RightEx && x<=client.Right)\\r\\n            {\\r\\n                var count=obj[i].TotalCount-1;\\r\\n                var left=client.RightEx;\\r\\n                var right=client.Right;\\r\\n\\r\\n                var width=right-left;\\r\\n                var index=(x-left)*(count*1.0/width);\\r\\n\\r\\n                return { DayIndex:parseInt(i), DataIndex:index };\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendXData=function(x, obj)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        if (border.DayBorder) return this.GetRightExtendMultiDayXData(x, obj, border);\\r\\n\\r\\n        var count=obj.TotalCount-1;\\r\\n        if (count<0) count=0;\\r\\n\\r\\n        var left=border.RightEx;\\r\\n        var right=border.Right;\\r\\n\\r\\n        if (x<=left) return 0;\\r\\n        if (x>=right) return count;\\r\\n\\r\\n        var width=right-left;\\r\\n        return (x-left)*(count*1.0/width);\\r\\n    }\\r\\n}\\r\\n\\r\\n//走势图 横屏框架\\r\\nfunction MinuteHScreenFrame()\\r\\n{\\r\\n    this.newMethod=MinuteFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"MinuteHScreenFrame\\\";\\r\\n    this.IsHScreen=true;        //是否是横屏\\r\\n\\r\\n    //画标题背景色\\r\\n    this.DrawTitleBG=function()\\r\\n    {\\r\\n        if (this.ChartBorder.TitleHeight<=0) return;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=ToFixedPoint(border.RightEx);\\r\\n        var top=ToFixedPoint(border.Top);\\r\\n        var bottom=ToFixedPoint(border.Bottom);\\r\\n        var width=this.ChartBorder.TitleHeight;\\r\\n        var height=bottom-top;\\r\\n\\r\\n        this.Canvas.fillStyle=this.TitleBGColor;\\r\\n        this.Canvas.fillRect(left,top,width,height);\\r\\n    }\\r\\n\\r\\n    this.DrawToolbar=function()\\r\\n    {\\r\\n        return;\\r\\n    }\\r\\n\\r\\n    //画集合竞价背景\\r\\n    this.DrawBeforeDataBG=function()\\r\\n    {\\r\\n        if (this.ChartBorder.LeftExtendWidth<10 && this.ChartBorder.RightExtendWidth<10) return;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n\\r\\n        var left=ToFixedPoint(border.Left);\\r\\n        var right=ToFixedPoint(border.Right);\\r\\n        this.Canvas.fillStyle=this.BeforeBGColor;\\r\\n\\r\\n        if (this.ChartBorder.LeftExtendWidth>10)\\r\\n        {\\r\\n            var top=ToFixedPoint(border.Top);\\r\\n            var bottom=ToFixedPoint(border.TopEx);\\r\\n            var width=right-left;\\r\\n            var height=bottom-top;\\r\\n\\r\\n            this.Canvas.fillRect(left,top,width,height);\\r\\n        }\\r\\n\\r\\n        if (this.ChartBorder.RightExtendWidth>10)\\r\\n        {\\r\\n            var top=border.BottomEx;\\r\\n            var bottom=border.Bottom;\\r\\n            var width=right-left;\\r\\n            var height=bottom-top;\\r\\n\\r\\n            this.Canvas.fillRect(left,top,width,height);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Y坐标转y轴数值\\r\\n    this.GetYData=function(x)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        if (x<border.LeftEx) return this.HorizontalMin;\\r\\n        if (x>border.RightEx) return this.HorizontalMax;\\r\\n\\r\\n        var width=border.RightEx-border.LeftEx;\\r\\n        return (x-border.LeftEx)/width*(this.HorizontalMax-this.HorizontalMin)+this.HorizontalMin;\\r\\n    }\\r\\n\\r\\n    //X坐标转x轴数值\\r\\n    this.GetXData=function(y)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var count=this.XPointCount-1;\\r\\n        if (count<0) count=0;\\r\\n\\r\\n        if (y<=border.TopEx) return 0;\\r\\n        if (y>=border.BottomEx) return count;\\r\\n\\r\\n        var height=(border.BottomEx-border.TopEx);\\r\\n        return (y-border.TopEx)*(count*1.0/height);\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(index)\\r\\n    {\\r\\n        var count=this.XPointCount-1;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        if (count==1)\\r\\n        {\\r\\n            if (index==0) return border.TopEx;\\r\\n            else return border.BottomEx;\\r\\n        }\\r\\n        else if (count<=0)\\r\\n        {\\r\\n            return border.TopEx;\\r\\n        }\\r\\n        else if (index>=count)\\r\\n        {\\r\\n            return border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var height=border.BottomEx-border.TopEx;\\r\\n            var offset=border.TopEx+height*index/count;\\r\\n            return offset;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetYFromData=function(value)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        if(value<=this.HorizontalMin) return border.LeftEx;\\r\\n        if(value>=this.HorizontalMax) return border.RightEx;\\r\\n\\r\\n        var width=(border.RightEx-border.LeftEx)*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n        return border.LeftEx+width;\\r\\n    }\\r\\n\\r\\n    this.DrawVolTitle=function(symbol)\\r\\n    {\\r\\n        if (!MARKET_SUFFIX_NAME.IsShowMinuteVolTitle(symbol)) return;\\r\\n\\r\\n        if (this.Identify==1)   //显示\\\"成交量\\\"\\r\\n        {\\r\\n            var pixelRatio=GetDevicePixelRatio();\\r\\n            var left=this.ChartBorder.GetRight()-2*pixelRatio;\\r\\n            var top=this.ChartBorder.GetTopEx()+2*pixelRatio;\\r\\n\\r\\n            var xText=left,yText=top;\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.translate(xText, yText);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n            var x=this.YInsideOffset,y=0;\\r\\n            this.Canvas.textAlign='left';\\r\\n            this.Canvas.textBaseline='top';\\r\\n            if (g_JSChartResource.Minute.VolBarColor || g_JSChartResource.Minute.VolTitleColor)\\r\\n            {\\r\\n                if (g_JSChartResource.Minute.VolBarColor) this.Canvas.fillStyle=g_JSChartResource.Minute.VolBarColor\\r\\n                else this.Canvas.fillStyle=g_JSChartResource.Minute.VolTitleColor;\\r\\n                var languageID=this.YSplitOperator.LanguageID;\\r\\n                var text=g_JSChartLocalization.GetText('MVol-Vol',languageID);\\r\\n                this.Canvas.fillText(text,x,y);\\r\\n                x+=this.Canvas.measureText(text).width;\\r\\n                x+=6*GetDevicePixelRatio();\\r\\n            }\\r\\n\\r\\n            if (this.IsShowPositionTitle)\\r\\n            {\\r\\n                text=g_JSChartLocalization.GetText('MVol-Position',languageID);\\r\\n                this.Canvas.fillStyle=g_JSChartResource.Minute.PositionColor;\\r\\n                this.Canvas.fillText(text,x,y);\\r\\n            }\\r\\n\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画Y轴\\r\\n    this.DrawHorizontal=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n\\r\\n        var top=border.Top;\\r\\n        var bottom=border.Bottom;\\r\\n        var left=border.Left;\\r\\n        var right=border.Right;\\r\\n        var borderTop=this.ChartBorder.Top;\\r\\n        var borderBottom=this.ChartBorder.Bottom;\\r\\n\\r\\n        var yPrev=null; //上一个坐标y的值\\r\\n        for(var i=this.HorizontalInfo.length-1; i>=0; --i)  //从左往右画分割线\\r\\n        {\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            var y=this.GetYFromData(item.Value);\\r\\n            if (y!=null && Math.abs(y-yPrev)<this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            this.Canvas.strokeStyle=item.LineColor;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ToFixedPoint(y),top);\\r\\n            this.Canvas.lineTo(ToFixedPoint(y),bottom);\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            if (y >= right - 2)\\r\\n            {\\r\\n                this.Canvas.textBaseline = 'top';\\r\\n                y = right;\\r\\n            }\\r\\n            else if (y <= left + 2)\\r\\n            {\\r\\n                this.Canvas.textBaseline = 'bottom';\\r\\n                y=left;\\r\\n                if (y != null && Math.abs(y - yPrev) < 2*this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n            }\\r\\n\\r\\n            //坐标信息 左边 间距小于10 不画坐标\\r\\n            if (item.Message[0]!=null && borderTop>10)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.textAlign=\\\"right\\\";\\r\\n\\r\\n                var xText=y,yText=top;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(item.Message[0], -2, 0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            //坐标信息 右边 间距小于10 不画坐标\\r\\n            if (item.Message[1]!=null && borderBottom>10)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n\\r\\n                var xText=y,yText=bottom;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(item.Message[1], 2, 0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            yPrev=y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawInsideClientHorizontal=function()\\r\\n    {\\r\\n        var border=this.GetBorder();\\r\\n        var left=border.Left;\\r\\n        var right=border.Right;\\r\\n        var bottom=border.BottomEx;\\r\\n        var top=border.TopEx;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var yPrev = null; //上一个坐标y的值\\r\\n        var yInsideText=null;\\r\\n        for (var i = this.HorizontalInfo.length - 1; i >= 0; --i)  //从上往下画分割线\\r\\n        {\\r\\n            var item = this.HorizontalInfo[i];\\r\\n            if (!item || !item.Message[2] || !item.Message[3]) continue;\\r\\n            var y = this.GetYFromData(item.Value);\\r\\n            if (y != null && yPrev!=null && Math.abs(y - yPrev) < this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            if (y >= right - 2)\\r\\n            {\\r\\n                this.Canvas.textBaseline = 'top';\\r\\n                y = right;\\r\\n            }\\r\\n            else if (y <= left + 2)\\r\\n            {\\r\\n                this.Canvas.textBaseline = 'bottom';\\r\\n                y=left;\\r\\n                if (y != null && Math.abs(y - yPrev) < 2*this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.textBaseline = \\\"middle\\\";\\r\\n            }\\r\\n\\r\\n            if (item.Message[2])\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.fillStyle = item.TextColor;\\r\\n                this.Canvas.textAlign = \\\"left\\\";\\r\\n\\r\\n                var xText=y,yText=top;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(item.Message[2], 2, 0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            if (item.Message[3])\\r\\n            {\\r\\n                if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                this.Canvas.fillStyle = item.TextColor;\\r\\n                this.Canvas.textAlign = \\\"right\\\";\\r\\n\\r\\n                var xText=y,yText=bottom;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(item.Message[3], -2, 0);\\r\\n                this.Canvas.restore();\\r\\n\\r\\n            }\\r\\n            yPrev = y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画X轴\\r\\n    this.DrawVertical=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.Left;\\r\\n        var right=border.Right;\\r\\n        var bottom=border.Bottom;\\r\\n\\r\\n        var xPrev=null; //上一个坐标x的值\\r\\n        for(var i in this.VerticalInfo)\\r\\n        {\\r\\n            var x=this.GetXFromIndex(this.VerticalInfo[i].Value);\\r\\n            if (x>bottom) break;\\r\\n            if (xPrev!=null && Math.abs(x-xPrev)<this.MinXDistance) continue;\\r\\n\\r\\n            this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(left,ToFixedPoint(x));\\r\\n            this.Canvas.lineTo(right,ToFixedPoint(x));\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            if (this.VerticalInfo[i].Message[0]!=null)\\r\\n            {\\r\\n                if (this.VerticalInfo[i].Font!=null)\\r\\n                    this.Canvas.font=this.VerticalInfo[i].Font;\\r\\n\\r\\n                this.Canvas.fillStyle=this.VerticalInfo[i].TextColor;\\r\\n                var testWidth=this.Canvas.measureText(this.VerticalInfo[i].Message[0]).width;\\r\\n                if (x<testWidth/2)\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                }\\r\\n                else if ((x + testWidth / 2) >= this.ChartBorder.GetChartHeight())\\r\\n                {\\r\\n                    this.Canvas.textAlign = \\\"right\\\";\\r\\n                    this.Canvas.textBaseline = \\\"top\\\";\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"center\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                }\\r\\n\\r\\n                var xText=left,yText=x;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(this.VerticalInfo[i].Message[0], 0, 0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            xPrev=x;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Y刻度画在左边内部\\r\\n    this.DrawInsideHorizontal = function ()\\r\\n    {\\r\\n        if (this.IsMinSize) return;\\r\\n        if (this.IsShowYText[0]===false && this.IsShowYText[1]===false) return;\\r\\n\\r\\n        this.DrawInsideClientHorizontal();\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left = border.Left;\\r\\n        var right = border.RightEx;\\r\\n        var top=border.Top;\\r\\n        var bottom=border.Bottom;\\r\\n        var borderTop=this.ChartBorder.Top;\\r\\n        var borderBottom=this.ChartBorder.Bottom;\\r\\n        var titleHeight = this.ChartBorder.TitleHeight;\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n\\r\\n        if ( (borderTop<10*pixelTatio && this.IsShowYText[0]===true) || (borderBottom<10*pixelTatio && this.IsShowYText[1]===true) )\\r\\n        {\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            var yPrev = null; //上一个坐标y的值\\r\\n            var yInsideText=null;\\r\\n            for (var i = this.HorizontalInfo.length - 1; i >= 0; --i)  //从上往下画分割线\\r\\n            {\\r\\n                var item = this.HorizontalInfo[i];\\r\\n                var y = this.GetYFromData(item.Value);\\r\\n                if (y != null && yPrev!=null && Math.abs(y - yPrev) < this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n                //坐标信息 左边 间距小于10 画在内部\\r\\n                if (item.Message[0] != null && borderTop < 10*pixelTatio && this.IsShowYText[0]===true)\\r\\n                {\\r\\n                    if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                    this.Canvas.fillStyle = item.TextColor;\\r\\n                    this.Canvas.textAlign = \\\"left\\\";\\r\\n                    if (y >= right - 2) this.Canvas.textBaseline = 'top';\\r\\n                    else if (y <= left + 2) this.Canvas.textBaseline = 'bottom';\\r\\n                    else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n\\r\\n                    var textObj={ X:left, Y:y, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[0]}} ;\\r\\n                    var xText=y,yText=top;\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.translate(xText, yText);\\r\\n                    this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                    this.Canvas.fillText(item.Message[0], 2*pixelTatio, 0);\\r\\n                    this.Canvas.restore();\\r\\n\\r\\n                    if (yInsideText==null || yInsideText<xText)\\r\\n                    {\\r\\n                        this.YInsideOffset=this.Canvas.measureText(item.Message[0]).width+4*GetDevicePixelRatio();\\r\\n                        yInsideText=xText;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (item.Message[1] != null && borderBottom < 10*pixelTatio && this.IsShowYText[1]===true)\\r\\n                {\\r\\n                    if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                    this.Canvas.fillStyle = item.TextColor;\\r\\n                    this.Canvas.textAlign = \\\"right\\\";\\r\\n                    if (y >= right - 2) this.Canvas.textBaseline = 'top';\\r\\n                    else if (y <= left + 2) this.Canvas.textBaseline = 'bottom';\\r\\n                    else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                    var textWidth = this.Canvas.measureText(item.Message[1]).width;\\r\\n                    var textObj={ X:right-textWidth, Y:y, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[1]}} ;\\r\\n\\r\\n                    var xText=y,yText=bottom;\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.translate(xText, yText);\\r\\n                    this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                    this.Canvas.fillText(item.Message[1], -2*pixelTatio, 0);\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n                yPrev = y;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendXFromIndex=function(index, obj)\\r\\n    {\\r\\n        var count=obj.TotalCount-1;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.Top;\\r\\n        var width=this.ChartBorder.LeftExtendWidth;\\r\\n\\r\\n        var offset=left+width*index/count;\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendXData=function(y, obj)\\r\\n    {\\r\\n        var count=obj.TotalCount-1;\\r\\n        if (count<0) count=0;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.Top;\\r\\n        var right=border.TopEx;\\r\\n\\r\\n        if (y<=left) return 0;\\r\\n        if (y>=right) return count;\\r\\n\\r\\n        var width=right-left;\\r\\n        return (y-left)*(count*1.0/width);\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendYFromData=function(value,isLimit,obj)\\r\\n    {\\r\\n        if (!obj || !obj.Range) return this.GetYFromData(value,isLimit);\\r\\n\\r\\n        var range=obj.Range;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var width=border.RightEx-border.LeftEx;\\r\\n        var offset=width*(value-range.Min)/(range.Max-range.Min);\\r\\n        return border.LeftEx+offset;\\r\\n    }\\r\\n\\r\\n    this.GetLeftExtendYData=function(x, isLimit, obj)\\r\\n    {\\r\\n        if (!obj || !obj.Range) return this.GetYData(y,isLimit);\\r\\n\\r\\n        var range=obj.Range;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var width=border.RightEx-border.LeftEx;\\r\\n        return (x-border.LeftEx)/width*(range.Max-range.Min)+range.Min;\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendXFromIndex=function(index, obj)\\r\\n    {\\r\\n        var count=obj.TotalCount-1;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.BottomEx;\\r\\n        var width=this.ChartBorder.RightExtendWidth;\\r\\n\\r\\n        var offset=left+width*index/count;\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendXData=function(y, obj)\\r\\n    {\\r\\n        var count=obj.TotalCount-1;\\r\\n        if (count<0) count=0;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.BottomEx;\\r\\n        var right=border.Bottom;\\r\\n\\r\\n        if (y<=left) return 0;\\r\\n        if (y>=right) return count;\\r\\n\\r\\n        var width=right-left;\\r\\n        return (y-left)*(count*1.0/width);\\r\\n    }\\r\\n\\r\\n    this.GetRightExtendYFromData=function(value,isLimit,obj)\\r\\n    {\\r\\n        if (!obj || !obj.Range) return this.GetYFromData(value,isLimit);\\r\\n\\r\\n        return this.GetLeftExtendYFromData(value,isLimit,obj);\\r\\n    }\\r\\n\\r\\n\\r\\n}\\r\\n\\r\\nfunction OverlayMinuteFrame()\\r\\n{\\r\\n    this.newMethod=MinuteFrame;     //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"OverlayMinuteFrame\\\";\\r\\n    this.IsShow=true;               //坐标是否显示\\r\\n    this.IsShareY=false;            //使用和主框架公用Y轴\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.SplitXYCoordinate();\\r\\n        if (this.IsShow)\\r\\n        {\\r\\n\\r\\n        }\\r\\n\\r\\n        this.SizeChange=false;\\r\\n        this.XYSplit=false;\\r\\n    }\\r\\n\\r\\n    this.GetScaleTextWidth=function()\\r\\n    {\\r\\n        return { TextWidth:0 };\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n\\r\\n        if (this.IsShareY)  //和主图指标共享Y轴坐标\\r\\n        {\\r\\n            this.HorizontalMax=this.MainFrame.HorizontalMax;\\r\\n            this.HorizontalMin=this.MainFrame.HorizontalMin;\\r\\n            this.HorizontalInfo=[];\\r\\n            for(var i in this.MainFrame.HorizontalInfo)\\r\\n            {\\r\\n                var item=this.MainFrame.HorizontalInfo[i];\\r\\n                this.HorizontalInfo.push(item);\\r\\n            }\\r\\n        }\\r\\n        else    //独立Y轴坐标\\r\\n        {\\r\\n            if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        }\\r\\n\\r\\n        // if (this.XSplitOperator!=null) this.XSplitOperator.Operator(); 子坐标和主坐标X轴一致 所以不用计算\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction OverlayMinuteHScreenFrame()\\r\\n{\\r\\n    this.newMethod=MinuteHScreenFrame;     //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"OverlayMinuteHScreenFrame\\\";\\r\\n    this.IsShow=true;                   //坐标是否显示\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.SplitXYCoordinate();\\r\\n        if (this.IsShow)\\r\\n        {\\r\\n\\r\\n        }\\r\\n\\r\\n        this.SizeChange=false;\\r\\n        this.XYSplit=false;\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n\\r\\n        if (this.IsShareY)  //和主图指标共享Y轴坐标\\r\\n        {\\r\\n            this.HorizontalMax=this.MainFrame.HorizontalMax;\\r\\n            this.HorizontalMin=this.MainFrame.HorizontalMin;\\r\\n            this.HorizontalInfo=[];\\r\\n            for(var i in this.MainFrame.HorizontalInfo)\\r\\n            {\\r\\n                var item=this.MainFrame.HorizontalInfo[i];\\r\\n                this.HorizontalInfo.push(item);\\r\\n            }\\r\\n        }\\r\\n        else    //独立Y轴坐标\\r\\n        {\\r\\n            if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        }\\r\\n\\r\\n        // if (this.XSplitOperator!=null) this.XSplitOperator.Operator(); 子坐标和主坐标X轴一致 所以不用计算\\r\\n    }\\r\\n}\\r\\n\\r\\n//K线框架\\r\\nfunction KLineFrame()\\r\\n{\\r\\n    this.newMethod=AverageWidthFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='KLineFrame';\\r\\n    this.ToolbarID=Guid();  //工具条Div id\\r\\n\\r\\n    this.ModifyIndex=true;      //是否显示'改参数'菜单\\r\\n    this.ChangeIndex=true;      //是否显示'换指标'菜单\\r\\n    this.CloseIndex=true;       //是否显示'关闭指标窗口'菜单\\r\\n    this.OverlayIndex=false;    //是否显示叠加指标\\r\\n\\r\\n    this.ModifyIndexEvent;   //改参数 点击事件\\r\\n    this.ChangeIndexEvent;   //换指标 点击事件\\r\\n    this.ToolbarRect=null;   //保存工具条的位置\\r\\n    this.ReDrawToolbar=false;\\r\\n\\r\\n    this.LastCalculateStatus={ Width:0, XPointCount:0 };    //最后一次计算宽度的状态\\r\\n\\r\\n    this.CustomHorizontalInfo=[];   //定制Y轴刻度\\r\\n    this.IsDrawTitleBG=false;\\r\\n\\r\\n    this.CustomVerticalInfo=[];     //定制X轴刻度 Type:0,  Date:, Time: ,        Line:{ Color:线段颜色, Type:线段类型 0 直线 1 虚线 }\\r\\n                                    //           Type:1,  Space: 第几个空白间距,  Line:{ Color:线段颜色, Type:线段类型 0 直线 1 虚线 }\\r\\n    this.DrawCustomVerticalEvent;\\r\\n    this.RightSpaceCount=0;\\r\\n\\r\\n    this.Logarithmic=null; //{Up:上部 , Donw:下部 , OpenPrice:第一个开盘价}\\r\\n\\r\\n    this.DrawToolbar=function()\\r\\n    {\\r\\n        if (typeof($)==\\\"undefined\\\") return;\\r\\n\\r\\n        if (!this.ChartBorder.UIElement || !this.ChartBorder.UIElement.parentNode) return;\\r\\n\\r\\n        var divToolbar=document.getElementById(this.ToolbarID);\\r\\n        if (divToolbar && this.SizeChange==false && this.ReDrawToolbar==false)  return;\\r\\n\\r\\n        if (!divToolbar)\\r\\n        {\\r\\n\\r\\n            divToolbar=document.createElement(\\\"div\\\");\\r\\n            divToolbar.className='klineframe-toolbar';\\r\\n            divToolbar.id=this.ToolbarID;\\r\\n            divToolbar.oncontextmenu = function() { return false;}; //屏蔽右键系统菜单\\r\\n            //为divToolbar添加属性identify\\r\\n            divToolbar.setAttribute(\\\"identify\\\",this.Identify.toString());\\r\\n            this.ChartBorder.UIElement.parentNode.appendChild(divToolbar);\\r\\n        }\\r\\n\\r\\n        if ((!this.ModifyIndex && !this.ChangeIndex && !this.OverlayIndex && !this.CloseIndex))\\r\\n        {\\r\\n            if (divToolbar.style.display!='none')\\r\\n                divToolbar.style.display='none';\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //使用外城div尺寸 画图尺寸是被放大的\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var chartWidth=parseInt(this.ChartBorder.UIElement.parentElement.style.width.replace(\\\"px\\\",\\\"\\\"));\\r\\n        var chartHeight=parseInt(this.ChartBorder.UIElement.parentElement.style.height.replace(\\\"px\\\",\\\"\\\"));\\r\\n        //JSConsole.Chart.Log('[KLineFrame::DrawToolbar] ',chartWidth,chartHeight,pixelTatio);\\r\\n\\r\\n        var toolbarWidth=100;\\r\\n        var toolbarHeight=this.ChartBorder.GetTitleHeight();\\r\\n        var left=chartWidth-(this.ChartBorder.Right/pixelTatio)-toolbarWidth;\\r\\n        var top=this.ChartBorder.GetTop()/pixelTatio;\\r\\n\\r\\n        if (this.ToolbarRect)\\r\\n        {\\r\\n            //尺寸变动移动才重新设置DOM\\r\\n            if (this.ToolbarRect.Left==left && this.ToolbarRect.Top==top &&\\r\\n                this.ToolbarRect.Width==toolbarWidth && this.ToolbarRect.Height==toolbarHeight/pixelTatio)\\r\\n            {\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ToolbarRect={ Left:left, Top:top, Width:toolbarWidth, Height:toolbarHeight/pixelTatio };\\r\\n\\r\\n        const modifyButton=`<span class='index_param icon iconfont icon-index_param' id='modifyindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='调整指标参数'></span>`;\\r\\n        const changeButton=`<span class='index_change icon iconfont icon-change_index' id='changeindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='切换指标'></span>`;\\r\\n        const overlayButton=`<span class='index_overlay icon iconfont icon-overlay_index' id='overlayindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='叠加指标'></span>`;\\r\\n        const closeButton=`<span class='index_close icon iconfont icon-close' id='closeindex' style='cursor:pointer;margin-left:2px;margin-right:2px;' title='关闭指标窗口'></span>`;\\r\\n\\r\\n        var spanIcon=modifyButton+changeButton+overlayButton;\\r\\n\\r\\n        if (this.Identify!==0 && this.CloseIndex)  //第1个窗口不能关闭\\r\\n        {\\r\\n            spanIcon+=closeButton;\\r\\n        }\\r\\n\\r\\n        //var scrollPos=GetScrollPosition();\\r\\n        //left = left+scrollPos.Left;\\r\\n        //top = top+scrollPos.Top;\\r\\n        divToolbar.style.left = left + \\\"px\\\";\\r\\n        divToolbar.style.top = top + \\\"px\\\";\\r\\n        divToolbar.style.width=toolbarWidth+\\\"px\\\";                   //宽度先不调整吧\\r\\n        divToolbar.style.height=(toolbarHeight/pixelTatio)+'px';    //只调整高度\\r\\n        divToolbar.innerHTML=spanIcon;\\r\\n\\r\\n        var chart=this.ChartBorder.UIElement.JSChartContainer;\\r\\n        var identify=this.Identify;\\r\\n        if (!this.ModifyIndex)  //隐藏'改参数'\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_param\\\").hide();\\r\\n        else if (typeof(this.ModifyIndexEvent)=='function')  //绑定点击事件\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_param\\\").click(\\r\\n                {\\r\\n                    Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                    Identify:this.Identify\\r\\n                },this.ModifyIndexEvent);\\r\\n\\r\\n        if (!this.ChangeIndex)  //隐藏'换指标'\\r\\n        {\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_change\\\").hide();\\r\\n        }\\r\\n        else if (typeof(this.ChangeIndexEvent)=='function')\\r\\n        {\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_change\\\").click(\\r\\n                {\\r\\n                    Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                    Identify:this.Identify,\\r\\n                    IsOverlay:false\\r\\n                },this.ChangeIndexEvent);\\r\\n        }\\r\\n\\r\\n        if (!this.OverlayIndex)\\r\\n        {\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_overlay\\\").hide();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            $(\\\"#\\\"+divToolbar.id+\\\" .index_overlay\\\").click(\\r\\n                {\\r\\n                    Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                    Identify:this.Identify,\\r\\n                    IsOverlay:true\\r\\n                },this.ChangeIndexEvent);\\r\\n        }\\r\\n\\r\\n        $(\\\"#\\\"+divToolbar.id+\\\" .index_close\\\").click(\\r\\n            {\\r\\n                Chart:this.ChartBorder.UIElement.JSChartContainer,\\r\\n                Identify:this.Identify\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                var hqChart=event.data.Chart;\\r\\n                var id=event.data.Identify;\\r\\n                hqChart.RemoveIndexWindow(id);\\r\\n            });\\r\\n\\r\\n        divToolbar.style.display = \\\"block\\\";\\r\\n    }\\r\\n\\r\\n    this.DrawFrame=function()\\r\\n    {\\r\\n        if (!this.IsMinSize)\\r\\n        {\\r\\n            this.SplitXYCoordinate();\\r\\n\\r\\n            if (this.SizeChange==true)\\r\\n            {\\r\\n                this.CalculateDataWidth();\\r\\n                if (this.Logarithmic) this.SplitLogarithmicXYCoordinate();\\r\\n            }\\r\\n\\r\\n            if (this.DrawDepthMapCallback) this.DrawDepthMapCallback();\\r\\n\\r\\n            this.DrawTitleBG();\\r\\n            this.DrawHorizontal();\\r\\n            this.DrawVertical();\\r\\n        }\\r\\n\\r\\n        if (this.SizeChange==true || this.ReDrawToolbar==true)\\r\\n        {\\r\\n            this.DrawToolbar();  //大小变动才画工具条\\r\\n            this.ReDrawToolbar=false;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //isLimit 是否限制在当前屏坐标下\\r\\n    this.GetXFromIndex=function(index,isLimit)\\r\\n    {\\r\\n        if (isLimit===false)\\r\\n        {\\r\\n            if (index>=0)\\r\\n            {\\r\\n                var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;\\r\\n                for(var i=1;i<=index;++i)\\r\\n                {\\r\\n                    offset+=this.DistanceWidth+this.DataWidth;\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var offset=this.ChartBorder.GetLeft()-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);\\r\\n                var absIndex=Math.abs(index);\\r\\n                for(var i=1;i<absIndex;++i)\\r\\n                {\\r\\n                    offset-=(this.DistanceWidth+this.DataWidth);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (index < 0) index = 0;\\r\\n            if (index > this.xPointCount - 1) index = this.xPointCount - 1;\\r\\n\\r\\n            var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;\\r\\n            for(var i=1;i<=index;++i)\\r\\n            {\\r\\n                offset+=this.DistanceWidth+this.DataWidth;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    //X坐标转x轴数值 isLimit=是否限制在当前屏坐标下\\r\\n    this.GetXData=function(x,isLimit)\\r\\n    {\\r\\n        var distanceWidth=this.DistanceWidth;\\r\\n        var dataWidth=this.DataWidth;\\r\\n        var left=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin;\\r\\n\\r\\n        if (isLimit==false)\\r\\n        {\\r\\n            if (x<this.ChartBorder.GetLeft())\\r\\n            {\\r\\n                var index=-1;\\r\\n                var xPoint=this.ChartBorder.GetLeft()-(distanceWidth/2+dataWidth+distanceWidth);\\r\\n                while(index>-10000)\\r\\n                {\\r\\n                    if (xPoint<=x)\\r\\n                        break;\\r\\n                    xPoint-=(dataWidth+distanceWidth);\\r\\n                    --index;\\r\\n                }\\r\\n\\r\\n                return index;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var index=0;\\r\\n                var xPoint=left+distanceWidth/2+dataWidth+distanceWidth;\\r\\n                while(index<10000)  //自己算x的数值\\r\\n                {\\r\\n                    if (xPoint>=x) break;\\r\\n                    xPoint+=(dataWidth+distanceWidth);\\r\\n                    ++index;\\r\\n                }\\r\\n\\r\\n                return index;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (x<=this.ChartBorder.GetLeft()) return 0;\\r\\n            if (x>=this.ChartBorder.GetRight()) return this.XPointCount-1;\\r\\n\\r\\n            var right=this.ChartBorder.GetRight()-g_JSChartResource.FrameRightMargin;\\r\\n            var index=0;\\r\\n            var xPoint=left+distanceWidth/2+dataWidth+distanceWidth;\\r\\n            while(xPoint<right && index<10000 && index+1<this.XPointCount)  //自己算x的数值\\r\\n            {\\r\\n                if (xPoint>=x) break;\\r\\n                xPoint+=(dataWidth+distanceWidth);\\r\\n                ++index;\\r\\n            }\\r\\n\\r\\n            //var test=(x-this.ChartBorder.GetLeft())*(this.XPointCount*1.0/this.ChartBorder.GetWidth());\\r\\n            return index;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //计算数据宽度\\r\\n    this.CalculateDataWidth=function()\\r\\n    {\\r\\n        if (this.XPointCount<2) return;\\r\\n\\r\\n        //JSConsole.Chart.Log(`[KLineFrame::CalculateDataWidth] ZoomIndex=${this.ZoomIndex}, XPointCount=${this.XPointCount}, DataWidth=${this.DataWidth}, DistanceWidth=${this.DistanceWidth}`);\\r\\n        var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n\\r\\n        if (this.ZoomIndex>=0 && this.LastCalculateStatus.Width==width && this.LastCalculateStatus.XPointCount==this.XPointCount) //宽度没变 尝试使用原来的柱子宽度\\r\\n        {\\r\\n            var caclWidth=(this.DistanceWidth/2+g_JSChartResource.FrameLeftMargin)+(this.DataWidth + this.DistanceWidth)*(this.XPointCount-1);\\r\\n            var caclWidth2=(this.DataWidth + this.DistanceWidth) * this.XPointCount;\\r\\n            if (caclWidth<= width) //当前的柱子宽度够用 就不调整了\\r\\n                return;\\r\\n        }\\r\\n\\r\\n        this.LastCalculateStatus.Width=width;\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        for(var i=0;i<ZOOM_SEED.length;++i)\\r\\n        {\\r\\n            if((ZOOM_SEED[i][0] + ZOOM_SEED[i][1]) * this.XPointCount < width)\\r\\n            {\\r\\n                this.ZoomIndex=i;\\r\\n                this.DataWidth = ZOOM_SEED[i][0];\\r\\n                this.DistanceWidth = ZOOM_SEED[i][1];\\r\\n                this.TrimKLineDataWidth(width);\\r\\n                JSConsole.Chart.Log('[KLineFrame::CalculateDataWidth] ZOOM_SEED, DataWidth, DistanceWidth, XPointCount', ZOOM_SEED[this.ZoomIndex], this.DataWidth,this.DistanceWidth,this.XPointCount);\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //太多了 就平均分了\\r\\n        this.ZoomIndex=ZOOM_SEED.length-1;\\r\\n        this.DataWidth=width/this.XPointCount;\\r\\n        this.DistanceWidth=0;\\r\\n    }\\r\\n\\r\\n    this.OnSize=function(obj)\\r\\n    {\\r\\n        var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n        var xPointCount=0;\\r\\n        var y=this.DistanceWidth/2+g_JSChartResource.FrameLeftMargin+(this.DataWidth+this.DistanceWidth);\\r\\n        for(;y<width; y+=(this.DataWidth+this.DistanceWidth), ++xPointCount)\\r\\n        {\\r\\n\\r\\n        }\\r\\n\\r\\n        obj.CurCount=this.XPointCount;\\r\\n        obj.CalcCount=xPointCount;\\r\\n        obj.DataWidth=this.DataWidth;\\r\\n        obj.DistanceWidth=this.DistanceWidth;\\r\\n        obj.Changed=false;\\r\\n\\r\\n        this.LastCalculateStatus.Width=width;\\r\\n        if (obj.CurCount==obj.CalcCount) return obj;\\r\\n\\r\\n        this.XPointCount=xPointCount;\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        if (this.Data)\\r\\n        {\\r\\n            this.Data.DataOffset+=(obj.CurCount-obj.CalcCount);\\r\\n            if (this.Data.DataOffset<0) this.Data.DataOffset=0;\\r\\n            obj.Changed=true;\\r\\n        }\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    this.SetDataWidth=function(dataWidth)\\r\\n    {\\r\\n        var zoomIndex=ZOOM_SEED.length-1;\\r\\n        for(var i in ZOOM_SEED)\\r\\n        {\\r\\n            var item=ZOOM_SEED[i];\\r\\n            if (item[0]<=dataWidth)\\r\\n            {\\r\\n                zoomIndex=parseInt(i)-1;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ZoomIndex=zoomIndex;\\r\\n        this.DataWidth=ZOOM_SEED[this.ZoomIndex][0];\\r\\n        this.DistanceWidth=ZOOM_SEED[this.ZoomIndex][1];\\r\\n        var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n        var xPointCount=0;\\r\\n        var y=this.DistanceWidth/2+g_JSChartResource.FrameLeftMargin+(this.DataWidth+this.DistanceWidth);\\r\\n        for(;y<=width; y+=(this.DataWidth+this.DistanceWidth), ++xPointCount) { }\\r\\n\\r\\n        this.XPointCount=xPointCount;\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        this.LastCalculateStatus.Width=width;\\r\\n\\r\\n        var obj={ XPointCount:this.XPointCount, DataWidth:this.DataWidth, DistanceWidth:this.DistanceWidth };\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    this.TrimKLineDataWidth=function(width)\\r\\n    {\\r\\n        var dataWidth=ZOOM_SEED[this.ZoomIndex][0];\\r\\n        var distanceWidth=ZOOM_SEED[this.ZoomIndex][1];\\r\\n        if (dataWidth==1 && distanceWidth==0)\\r\\n        {\\r\\n            this.DataWidth=width/this.XPointCount;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        while(true)\\r\\n        {\\r\\n            if((this.DistanceWidth + this.DataWidth) * this.XPointCount + this.DistanceWidth > width)\\r\\n            {\\r\\n                this.DistanceWidth -= 0.01;\\r\\n                break;\\r\\n            }\\r\\n            this.DistanceWidth += 0.01;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //当前坐标信息 是否覆盖最大 最小值输出\\r\\n    this.IsOverlayMaxMin=function(obj)\\r\\n    {\\r\\n        if (!this.ChartKLine) return false;\\r\\n        if (!this.ChartKLine.Max || !this.ChartKLine.Min) return false;\\r\\n\\r\\n        var textWidth=this.Canvas.measureText(obj.Text.Value).width+4;    //刻度文字宽度\\r\\n        if (obj.Text.TextAlign==='right') obj.X-=textWidth;\\r\\n        var max=this.ChartKLine.Max, min=this.ChartKLine.Min;\\r\\n        var isOverlayMax=false, isOverlayMin=false;\\r\\n        const textHeight=20;    //字体高度\\r\\n        if (max.X>=obj.X && max.X<=obj.X+textWidth) //最大值X 坐标不在 刻度文字范围内\\r\\n        {\\r\\n            var y1=max.Y+textHeight, y2=max.Y-textHeight;\\r\\n            if ( (y1>=obj.Y-textHeight && y1<=obj.Y+textHeight) || (y2>=obj.Y-textHeight && y2<=obj.Y+textHeight))\\r\\n                isOverlayMax=true;\\r\\n        }\\r\\n\\r\\n        if (isOverlayMax==true) return true;\\r\\n\\r\\n        if (min.X>=obj.X && min.X<=obj.X+textWidth)\\r\\n        {\\r\\n            var y1=min.Y+textHeight, y2=min.Y-textHeight;\\r\\n            if ( (y1>=obj.Y-textHeight && y1<=obj.Y+textHeight) || (y2>=obj.Y-textHeight && y2<=obj.Y+textHeight))\\r\\n                isOverlayMin=true;\\r\\n        }\\r\\n\\r\\n        return isOverlayMax || isOverlayMin;\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n        if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        if (this.XSplitOperator!=null) this.XSplitOperator.Operator();\\r\\n        if (this.Logarithmic) this.SplitLogarithmicXYCoordinate();\\r\\n    }\\r\\n\\r\\n    this.SplitLogarithmicXYCoordinate=function()\\r\\n    {\\r\\n        var up=this.Logarithmic.Up;\\r\\n        var down=this.Logarithmic.Down;\\r\\n        var logHeight=0;    //对数额外高度\\r\\n        var count=0;\\r\\n        var maxCount=Math.max(up.length, down.length);\\r\\n\\r\\n        var aryLogHeight=[];\\r\\n        for(var i=0;i<maxCount;++i)\\r\\n        {\\r\\n            aryLogHeight[i]=i*2;\\r\\n        }\\r\\n\\r\\n        for(var i=0, j=aryLogHeight.length-1; i<up.length; ++i,--j)\\r\\n        {\\r\\n            var item=up[i];\\r\\n            item.LogHeight=aryLogHeight[j];\\r\\n            logHeight+=item.LogHeight;\\r\\n            ++count;\\r\\n        }\\r\\n\\r\\n        for(var i=0, j=aryLogHeight.length-1;i<down.length; ++i,--j)\\r\\n        {\\r\\n            var item=down[i];\\r\\n            item.LogHeight=aryLogHeight[j];\\r\\n            logHeight+=item.LogHeight;\\r\\n            ++count;\\r\\n        }\\r\\n\\r\\n        var heightRate=2*GetDevicePixelRatio();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var height=(bottom-top);\\r\\n        var perHeight=(height-logHeight*heightRate)/count;\\r\\n        if (perHeight<0)\\r\\n        {\\r\\n            perHeight=0;\\r\\n            heightRate=height/logHeight;\\r\\n        }\\r\\n\\r\\n        if (this.CoordinateType==1) //反转坐标\\r\\n        {\\r\\n            var itemTop=top;\\r\\n            for(var i=down.length-1;i>=0;--i)   //上部\\r\\n            {\\r\\n                var item=down[i];\\r\\n                item.Height=perHeight+(heightRate*item.LogHeight);\\r\\n                item.Top=itemTop;\\r\\n                item.Bottom=item.Top+item.Height;\\r\\n                itemTop=item.Bottom;\\r\\n            }\\r\\n\\r\\n            var itemBottom=bottom;\\r\\n            for(var i=up.length-1;i>=0;--i) //下部\\r\\n            {\\r\\n                var item=up[i];\\r\\n                item.Height=perHeight+(heightRate*item.LogHeight)\\r\\n                item.Bottom=itemBottom;\\r\\n                item.Top=itemBottom-item.Height;\\r\\n                itemBottom=item.Top;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var itemTop=top;\\r\\n            for(var i=up.length-1;i>=0;--i)\\r\\n            {\\r\\n                var item=up[i];\\r\\n                item.Height=perHeight+(heightRate*item.LogHeight);\\r\\n                item.Top=itemTop;\\r\\n                item.Bottom=item.Top+item.Height;\\r\\n                itemTop=item.Bottom;\\r\\n            }\\r\\n\\r\\n            var itemBottom=bottom;\\r\\n            for(var i=down.length-1;i>=0;--i)\\r\\n            {\\r\\n                var item=down[i];\\r\\n                item.Height=perHeight+(heightRate*item.LogHeight)\\r\\n                item.Bottom=itemBottom;\\r\\n                item.Top=itemBottom-item.Height;\\r\\n                itemBottom=item.Top;\\r\\n            }\\r\\n        }\\r\\n        JSConsole.Chart.Log(\\\"[KLineFrame::SplitLogarithmicXYCoordinate]\\\", this.Logarithmic);\\r\\n    }\\r\\n\\r\\n    this.GetYLogarithmicFromData=function(value, isLimit)\\r\\n    {\\r\\n        if (this.CoordinateType==1)\\r\\n        {\\r\\n            if(value<=this.HorizontalMin) return this.ChartBorder.GetTopEx();\\r\\n            if(value>=this.HorizontalMax) return this.ChartBorder.GetBottomEx();\\r\\n\\r\\n            if (value>this.Logarithmic.OpenPrice)\\r\\n            {\\r\\n                var up=this.Logarithmic.Up;\\r\\n                for(var i in up)\\r\\n                {\\r\\n                    var item=up[i];\\r\\n                    if (value>=item.Start && value<=item.End)\\r\\n                    {\\r\\n                        var itemHeight=item.Bottom-item.Top;\\r\\n                        var height=itemHeight*(value-item.Start)/(item.End-item.Start);\\r\\n                        return item.Top+height;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var down=this.Logarithmic.Down;\\r\\n                for(var i in down)\\r\\n                {\\r\\n                    var item=down[i];\\r\\n                    if (value>=item.Start && value<=item.End)\\r\\n                    {\\r\\n                        var itemHeight=item.Bottom-item.Top;\\r\\n                        var height=itemHeight*(value-item.Start)/(item.End-item.Start);\\r\\n                        return item.Top+height;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if(value<=this.HorizontalMin) return this.ChartBorder.GetBottomEx();\\r\\n            if(value>=this.HorizontalMax) return this.ChartBorder.GetTopEx();\\r\\n\\r\\n            if (value>this.Logarithmic.OpenPrice)\\r\\n            {\\r\\n                var up=this.Logarithmic.Up;\\r\\n                for(var i in up)\\r\\n                {\\r\\n                    var item=up[i];\\r\\n                    if (value>=item.Start && value<=item.End)\\r\\n                    {\\r\\n                        var itemHeight=item.Bottom-item.Top;\\r\\n                        var height=itemHeight*(value-item.Start)/(item.End-item.Start);\\r\\n                        return item.Bottom-height;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var down=this.Logarithmic.Down;\\r\\n                for(var i in down)\\r\\n                {\\r\\n                    var item=down[i];\\r\\n                    if (value>=item.Start && value<=item.End)\\r\\n                    {\\r\\n                        var itemHeight=item.Bottom-item.Top;\\r\\n                        var height=itemHeight*(value-item.Start)/(item.End-item.Start);\\r\\n                        return item.Bottom-height;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetYLogarithmicData=function(y)\\r\\n    {\\r\\n        if (this.CoordinateType==1) //反转坐标\\r\\n        {\\r\\n            if (y<this.ChartBorder.GetTopEx()) return this.HorizontalMin;\\r\\n            if (y>this.ChartBorder.GetBottomEx()) return this.HorizontalMax;\\r\\n\\r\\n            var up=this.Logarithmic.Up;\\r\\n            for(var i in up)\\r\\n            {\\r\\n                var item=up[i];\\r\\n                if (y>=item.Top && y<=item.Bottom)\\r\\n                {\\r\\n                    return (y-item.Top)/item.Height*(item.End-item.Start)+item.Start;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var down=this.Logarithmic.Down;\\r\\n            for(var i in down)\\r\\n            {\\r\\n                var item=down[i];\\r\\n                if (y>=item.Top && y<=item.Bottom)\\r\\n                {\\r\\n                    return (y-item.Top)/item.Height*(item.End-item.Start)+item.Start;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (y<this.ChartBorder.GetTopEx()) return this.HorizontalMax;\\r\\n            if (y>this.ChartBorder.GetBottomEx()) return this.HorizontalMin;\\r\\n\\r\\n            var up=this.Logarithmic.Up;\\r\\n            for(var i in up)\\r\\n            {\\r\\n                var item=up[i];\\r\\n                if (y>=item.Top && y<=item.Bottom)\\r\\n                {\\r\\n                    return (item.Bottom-y)/item.Height*(item.End-item.Start)+item.Start;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var down=this.Logarithmic.Down;\\r\\n            for(var i in down)\\r\\n            {\\r\\n                var item=down[i];\\r\\n                if (y>=item.Top && y<=item.Bottom)\\r\\n                {\\r\\n                    return (item.Bottom-y)/item.Height*(item.End-item.Start)+item.Start;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateCount=function(zoomIndex)\\r\\n    {\\r\\n        var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n        return parseInt(width/(ZOOM_SEED[zoomIndex][0] + ZOOM_SEED[zoomIndex][1]));\\r\\n    }\\r\\n\\r\\n    this.ZoomUp=function(cursorIndex)\\r\\n    {\\r\\n        if (this.ZoomIndex<=0) return false;\\r\\n        if (this.Data.DataOffset<0) return false;\\r\\n        var dataCount=this.Data.Data.length;\\r\\n        var maxDataCount=dataCount+this.RightSpaceCount;\\r\\n\\r\\n        var rightSpaceCount=0;\\r\\n        var lastDataIndex = this.Data.DataOffset + this.XPointCount - 1;    //最右边的数据索引\\r\\n        var lastCursorIndex=this.Data.DataOffset + cursorIndex.Index;\\r\\n        if (lastDataIndex>=dataCount)\\r\\n        {\\r\\n            rightSpaceCount=lastDataIndex-(this.Data.Data.length-1);    //计算右边预留空间\\r\\n            lastDataIndex=this.Data.Data.length-1;\\r\\n            if (rightSpaceCount>this.RightSpaceCount) rightSpaceCount=this.RightSpaceCount;\\r\\n        }\\r\\n\\r\\n        var xPointCount=this.CalculateCount(this.ZoomIndex-1);\\r\\n        JSConsole.Chart.Log(`[KLineFrame::ZoomUp] old status. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${this.Data.Data.length} rightSpaceCount=${rightSpaceCount}`);\\r\\n\\r\\n        var isShowAll=false;\\r\\n        --this.ZoomIndex;\\r\\n        if (cursorIndex.IsLockRight==true) //固定右边\\r\\n        {\\r\\n            var rightDataIndex=this.Data.DataOffset + this.XPointCount;    //最右边的数据索引\\r\\n            if (xPointCount>rightDataIndex)\\r\\n            {\\r\\n                xPointCount=rightDataIndex;\\r\\n                this.XPointCount=xPointCount;\\r\\n                this.Data.DataOffset=0;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var dataOffset=lastDataIndex - (xPointCount-rightSpaceCount)+1;\\r\\n                this.XPointCount=xPointCount;\\r\\n                this.Data.DataOffset=dataOffset;\\r\\n                if (this.Data.DataOffset<0) this.Data.DataOffset=0;\\r\\n            }\\r\\n        }\\r\\n        else if (xPointCount>=maxDataCount)\\r\\n        {\\r\\n            //xPointCount=maxDataCount;\\r\\n            //this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset=0;\\r\\n            this.XPointCount=xPointCount;\\r\\n            isShowAll=true;\\r\\n            JSConsole.Chart.Log(`[KLineFrame::ZoomUp] Show all data. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount}`);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var dataOffset=lastDataIndex - (xPointCount-rightSpaceCount)+1;\\r\\n            if (cursorIndex.ZoomType==1)    //以十字光标为中心左右放大\\r\\n            {\\r\\n                var moveOffset=(this.XPointCount-xPointCount)+1;\\r\\n                var leftOffset=parseInt(cursorIndex.Index/this.XPointCount*moveOffset);\\r\\n                var rightOffset=moveOffset-leftOffset;\\r\\n                var offset=this.Data.DataOffset+leftOffset;\\r\\n                if (offset<dataCount) dataOffset=this.Data.DataOffset+leftOffset;\\r\\n            }\\r\\n\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset=dataOffset;\\r\\n            if (this.Data.DataOffset<0) this.Data.DataOffset=0;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineFrame::ZoomUp] calculate. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount} DataOffset=${this.Data.DataOffset}`);\\r\\n        }\\r\\n\\r\\n        this.DataWidth = ZOOM_SEED[this.ZoomIndex][0];\\r\\n        this.DistanceWidth = ZOOM_SEED[this.ZoomIndex][1];\\r\\n        if (!isShowAll)\\r\\n        {\\r\\n            var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n            this.TrimKLineDataWidth(width);\\r\\n        }\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        cursorIndex.Index=lastCursorIndex-this.Data.DataOffset;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.XCoordinateZoom=function(isMoveLeft)\\r\\n    {\\r\\n        var oldXPointCount=this.XPointCount;\\r\\n        if (isMoveLeft) //放大\\r\\n        {\\r\\n            if (this.ZoomIndex<=0) return false;\\r\\n            if (this.Data.DataOffset<0) return false;\\r\\n            var zoomIndex=this.ZoomIndex-1;\\r\\n            var xPointCount=this.CalculateCount(zoomIndex);\\r\\n            var dataCount=this.Data.Data.length;\\r\\n            var moveOffset=oldXPointCount-xPointCount;\\r\\n            if (moveOffset<=0) return false;\\r\\n\\r\\n            this.Data.DataOffset+=moveOffset;\\r\\n        }\\r\\n        else    //缩小\\r\\n        {\\r\\n            if (this.ZoomIndex+1>=ZOOM_SEED.length) return false;\\r\\n            if (this.Data.DataOffset<0) return false;\\r\\n            var zoomIndex=this.ZoomIndex+1;\\r\\n            var xPointCount=this.CalculateCount(zoomIndex);\\r\\n\\r\\n            var moveOffset=xPointCount-oldXPointCount;\\r\\n            if (moveOffset>this.Data.DataOffset)\\r\\n            {\\r\\n                moveOffset=this.Data.DataOffset;\\r\\n                xPointCount=this.Data.DataOffset+oldXPointCount;\\r\\n            }\\r\\n\\r\\n            this.Data.DataOffset-=moveOffset;\\r\\n        }\\r\\n\\r\\n\\r\\n        //JSConsole.Chart.Log(`[KLineFrame::XCoordinateZoom] old (XPointCount=${oldXPointCount} ZoomIndex=${this.ZoomIndex})  DataCount= ${this.Data.Data.length} `);\\r\\n\\r\\n        this.XPointCount=xPointCount;\\r\\n        this.ZoomIndex=zoomIndex;\\r\\n        this.DataWidth = ZOOM_SEED[this.ZoomIndex][0];\\r\\n        this.DistanceWidth = ZOOM_SEED[this.ZoomIndex][1];\\r\\n        var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n        this.TrimKLineDataWidth(width);\\r\\n\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n\\r\\n        return true;\\r\\n        //var lastCursorIndex=this.Data.DataOffset + cursorIndex.Index;\\r\\n\\r\\n\\r\\n    }\\r\\n\\r\\n    this.ZoomDown=function(cursorIndex) //缩小\\r\\n    {\\r\\n        if (this.ZoomIndex+1>=ZOOM_SEED.length) return false;\\r\\n        if (this.Data.DataOffset<0) return false;\\r\\n        var dataCount=this.Data.Data.length;\\r\\n        var maxDataCount=dataCount+this.RightSpaceCount;\\r\\n        //if (this.XPointCount>=maxDataCount) return false;\\r\\n\\r\\n        var rightSpaceCount=0;\\r\\n        var lastDataIndex = this.Data.DataOffset + this.XPointCount - 1;    //最右边的数据索引\\r\\n        if (lastDataIndex>=this.Data.Data.length)\\r\\n        {\\r\\n            rightSpaceCount=lastDataIndex-(this.Data.Data.length-1);    //计算右边预留空间\\r\\n            lastDataIndex=this.Data.Data.length-1;\\r\\n            if (rightSpaceCount>this.RightSpaceCount) rightSpaceCount=this.RightSpaceCount;\\r\\n        }\\r\\n\\r\\n        var xPointCount=this.CalculateCount(this.ZoomIndex+1);\\r\\n        var lastCursorIndex=this.Data.DataOffset + cursorIndex.Index;\\r\\n\\r\\n        JSConsole.Chart.Log(`[KLineFrame::ZoomDown] old status. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${this.Data.Data.length} lastCursorIndex=${lastCursorIndex} rightSpaceCount=${rightSpaceCount}`);\\r\\n\\r\\n        var isShowAll=false;\\r\\n        ++this.ZoomIndex;\\r\\n        if (cursorIndex.IsLockRight==true) //固定右边\\r\\n        {\\r\\n            var rightDataIndex=this.Data.DataOffset + this.XPointCount;    //最右边的数据索引\\r\\n            if (xPointCount>rightDataIndex)\\r\\n            {\\r\\n                xPointCount=rightDataIndex;\\r\\n                this.XPointCount=xPointCount;\\r\\n                this.Data.DataOffset=0;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var dataOffset=lastDataIndex - (xPointCount-rightSpaceCount)+1;\\r\\n                this.XPointCount=xPointCount;\\r\\n                this.Data.DataOffset=dataOffset;\\r\\n                if (this.Data.DataOffset<0) this.Data.DataOffset=0;\\r\\n            }\\r\\n        }\\r\\n        else if (xPointCount>=maxDataCount)     //所有数据无法显示完一屏\\r\\n        {\\r\\n            //xPointCount=maxDataCount;\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset=0;\\r\\n            isShowAll=true; //数据铺满全屏, 不需要调整宽度\\r\\n            JSConsole.Chart.Log(`[KLineFrame::ZoomDown] Show all data. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount}`);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var dataOffset=lastDataIndex - (xPointCount-rightSpaceCount)+1;\\r\\n            if (cursorIndex.ZoomType==1)    //当前十字光标位置左右同时缩小\\r\\n            {\\r\\n                var moveOffset=(xPointCount-this.XPointCount)+1;\\r\\n                var leftOffset=parseInt(cursorIndex.Index/this.XPointCount*moveOffset);\\r\\n                var rightOffset=moveOffset-leftOffset;\\r\\n                var dataOffset=this.Data.DataOffset-leftOffset;\\r\\n                if (dataOffset+(xPointCount-this.RightSpaceCount)>=dataCount) dataOffset=this.Data.DataOffset-moveOffset;\\r\\n            }\\r\\n\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset=dataOffset;\\r\\n            if (this.Data.DataOffset<0) this.Data.DataOffset=0;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineFrame::ZoomDown] calculate. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount} DataOffset=${this.Data.DataOffset}`);\\r\\n        }\\r\\n\\r\\n        this.DataWidth = ZOOM_SEED[this.ZoomIndex][0];\\r\\n        this.DistanceWidth = ZOOM_SEED[this.ZoomIndex][1];\\r\\n        if (!isShowAll)\\r\\n        {\\r\\n            var width=this.GetFrameWidth()-g_JSChartResource.FrameMargin;\\r\\n            this.TrimKLineDataWidth(width);\\r\\n        }\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        cursorIndex.Index=lastCursorIndex-this.Data.DataOffset;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetFrameWidth=function()\\r\\n    {\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            return border.BottomEx-border.TopEx;\\r\\n            //return this.ChartBorder.GetHeight();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            return border.RightEx-border.LeftEx;\\r\\n            //return this.ChartBorder.GetWidth();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCustomHorizontal=function()    //Y轴刻度定制显示\\r\\n    {\\r\\n        if (this.IsMinSize) return;\\r\\n        for(var i in this.CustomHorizontalInfo)\\r\\n        {\\r\\n            var item=this.CustomHorizontalInfo[i];\\r\\n            switch(item.Type)\\r\\n            {\\r\\n                case 0: //最新价格刻度\\r\\n                case 1: //固定价格刻度\\r\\n                    this.DrawCustomItem(item);\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCustomVerticalItem=function(item)\\r\\n    {\\r\\n        this.Canvas.save();\\r\\n        if (item.Data.Line.Type==1) this.Canvas.setLineDash([5,5]);   //虚线\\r\\n        this.Canvas.strokeStyle=item.Data.Line.Color;\\r\\n        this.Canvas.beginPath();\\r\\n        if (item.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.moveTo(item.Top,ToFixedPoint(item.X));\\r\\n            this.Canvas.lineTo(item.Bottom,ToFixedPoint(item.X));\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.moveTo(ToFixedPoint(item.X),item.Top);\\r\\n            this.Canvas.lineTo(ToFixedPoint(item.X),item.Bottom);\\r\\n        }\\r\\n        this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawCustomVertical=function()  //X轴定制刻度显示\\r\\n    {\\r\\n        if (!this.CustomVerticalInfo) return;\\r\\n        if (this.CustomVerticalInfo.length<=0) return;\\r\\n        if (!this.Data) return;\\r\\n\\r\\n        var isHScreen=this.IsHScreen;\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n\\r\\n        var dataWidth=this.DataWidth;\\r\\n        var distanceWidth=this.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n            top=this.ChartBorder.GetLeftEx();\\r\\n            bottom=this.ChartBorder.GetRightEx();\\r\\n        }\\r\\n\\r\\n        var j=0;\\r\\n        for(var i=this.Data.DataOffset;i<this.Data.Data.length && j<this.XPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var kItem=this.Data.Data[i];\\r\\n            for(var k in this.CustomVerticalInfo)\\r\\n            {\\r\\n                var item=this.CustomVerticalInfo[k];\\r\\n                if (item.Type!=0) continue;\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(item.Time))\\r\\n                {\\r\\n                    if (kItem.Date!=item.Date || kItem.Time!=item.Time) continue;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (kItem.Date!=item.Date) continue;\\r\\n                }\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                var x=left+(right-left)/2;\\r\\n\\r\\n                var DrawData={X:x, Top:top, Bottom:bottom, Data:item , IsHScreen:isHScreen};\\r\\n                this.DrawCustomVerticalItem(DrawData);\\r\\n                if (this.DrawCustomVerticalEvent)\\r\\n                    this.DrawCustomVerticalEvent.Callback(this.DrawCustomVerticalEvent, DrawData, this);\\r\\n\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i=1;j<this.XPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            for(var k in  this.CustomVerticalInfo)\\r\\n            {\\r\\n                var item=this.CustomVerticalInfo[k];\\r\\n                if (item.Type!=1) continue;\\r\\n                if (item.Space!=i) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                var x=left+(right-left)/2;\\r\\n\\r\\n                var DrawData={X:x, Top:top, Bottom:bottom, Data:item,IsHScreen:isHScreen };\\r\\n                this.DrawCustomVerticalItem(DrawData);\\r\\n                if (this.DrawCustomVerticalEvent)\\r\\n                    this.DrawCustomVerticalEvent.Callback(this.DrawCustomVerticalEvent, DrawData, this);\\r\\n\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction OverlayKLineFrame()\\r\\n{\\r\\n    this.newMethod=KLineFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='OverlayKLineFrame';\\r\\n\\r\\n    this.MainFrame=null;    //主框架\\r\\n    this.IsShareY=false;    //使用和主框架公用Y轴\\r\\n    this.RightOffset=50;\\r\\n    this.PenBorder=g_JSChartResource.OverlayFrame.BolderPen; //'rgb(0,0,0)'\\r\\n    this.IsShow=true;   //坐标是否显示\\r\\n    this.Title=null;\\r\\n    this.TitleColor=g_JSChartResource.OverlayFrame.TitleColor;\\r\\n    this.TitleFont=g_JSChartResource.OverlayFrame.TitleFont;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.SplitXYCoordinate();\\r\\n\\r\\n        if (this.IsShow)\\r\\n        {\\r\\n            this.DrawVertical();\\r\\n            this.DrawHorizontal();\\r\\n            this.DrawTitle();\\r\\n        }\\r\\n\\r\\n        this.SizeChange=false;\\r\\n        this.XYSplit=false;\\r\\n    }\\r\\n\\r\\n    this.DrawTitle=function()   //画标题\\r\\n    {\\r\\n        if (!this.Title) return;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var top = this.ChartBorder.GetTopTitle();\\r\\n        var bottom = border.Bottom;\\r\\n        var right=border.Right;\\r\\n        right+=this.RightOffset;\\r\\n\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        this.Canvas.font=this.TitleFont;\\r\\n        this.Canvas.textAlign=\\\"center\\\";\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n\\r\\n        var xText=right-2,yText=top+(bottom-top)/2;\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(xText, yText);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        this.Canvas.fillText(this.Title, 0, 0);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetScaleTextWidth=function()\\r\\n    {\\r\\n        if (!this.IsShow) return null;\\r\\n\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var borderBottom=this.ChartBorder.Bottom;\\r\\n            var isDrawRight=borderBottom>10*pixelTatio && this.IsShowYText[1]===true && this.YTextPosition[1]!=2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var borderRight=this.ChartBorder.Right;\\r\\n            var isDrawRight=borderRight>10 && this.IsShowYText[1]===true && this.YTextPosition[1]!=2;\\r\\n        }\\r\\n\\r\\n        if (!isDrawRight) return null;\\r\\n\\r\\n        var width={ Left:null, Right:0 };\\r\\n        for(var i=0;i<this.HorizontalInfo.length;++i)\\r\\n        {\\r\\n            var textWidth=null;\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            if (!item) continue;\\r\\n\\r\\n            if (item.Message[1]!=null && isDrawRight)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                textWidth=this.Canvas.measureText(item.Message[1]).width;\\r\\n                if (width.Right<textWidth) width.Right=textWidth;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return { TextWidth:width };\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n\\r\\n        if (this.IsShareY)  //和主图指标共享Y轴坐标\\r\\n        {\\r\\n            this.HorizontalMax=this.MainFrame.HorizontalMax;\\r\\n            this.HorizontalMin=this.MainFrame.HorizontalMin;\\r\\n            this.HorizontalInfo=[];\\r\\n            for(var i in this.MainFrame.HorizontalInfo)\\r\\n            {\\r\\n                var item=this.MainFrame.HorizontalInfo[i];\\r\\n                this.HorizontalInfo.push(item);\\r\\n            }\\r\\n\\r\\n            this.CoordinateType=this.MainFrame.CoordinateType;\\r\\n        }\\r\\n        else    //独立Y轴坐标\\r\\n        {\\r\\n            if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        }\\r\\n\\r\\n        // if (this.XSplitOperator!=null) this.XSplitOperator.Operator(); 子坐标和主坐标X轴一致 所以不用计算\\r\\n    }\\r\\n\\r\\n    //画Y轴\\r\\n    this.DrawHorizontal=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var left=border.Left;\\r\\n        var right=border.Right;\\r\\n        var bottom = border.Bottom;\\r\\n        var top = this.ChartBorder.GetTopTitle();\\r\\n        var borderRight=this.ChartBorder.Right;\\r\\n        right+=this.RightOffset;\\r\\n\\r\\n        var yPrev=null; //上一个坐标y的值\\r\\n        for(var i=this.HorizontalInfo.length-1; i>=0; --i)  //从上往下画分割线\\r\\n        {\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            var y=this.GetYFromData(item.Value);\\r\\n            if (y!=null && Math.abs(y-yPrev)<this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            if (y >= bottom - 2) this.Canvas.textBaseline = 'bottom';\\r\\n            else if (y <= top + 2) this.Canvas.textBaseline = 'top';\\r\\n            else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n\\r\\n            this.Canvas.strokeStyle=this.PenBorder;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(right-2,ToFixedPoint(y));\\r\\n            this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            //坐标信息 右边 间距小于10 不画坐标\\r\\n            if (item.Message[1]!=null && borderRight>10)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                var text=item.Message[1];\\r\\n                if (Array.isArray(item.Message[1])) text=item.Message[1][0];\\r\\n\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.fillText(text,right+2,y);\\r\\n            }\\r\\n\\r\\n            yPrev=y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画X轴\\r\\n    this.DrawVertical=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var top=border.TopEx;\\r\\n        //var left=this.ChartBorder.GetLeft();\\r\\n        var right=border.Right;\\r\\n        var bottom=border.BottomEx;\\r\\n        right+=this.RightOffset;\\r\\n\\r\\n        this.Canvas.strokeStyle=this.PenBorder;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ToFixedPoint(right),ToFixedPoint(top));\\r\\n        this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(bottom));\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n}\\r\\n\\r\\n//K线横屏框架\\r\\nfunction KLineHScreenFrame()\\r\\n{\\r\\n    this.newMethod=KLineFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='KLineHScreenFrame';\\r\\n    this.IsHScreen=true;        //是否是横屏\\r\\n\\r\\n    //画标题背景色\\r\\n    this.DrawTitleBG=function()\\r\\n    {\\r\\n        if (this.ChartBorder.TitleHeight<=0) return;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=ToFixedPoint(border.RightTitle);\\r\\n        var top=ToFixedPoint(border.Top);\\r\\n        var bottom=ToFixedPoint(border.Bottom);\\r\\n        var width=this.ChartBorder.TitleHeight;\\r\\n        var height=bottom-top;\\r\\n\\r\\n        this.Canvas.fillStyle=this.TitleBGColor;\\r\\n        this.Canvas.fillRect(left,top,width,height);\\r\\n    }\\r\\n\\r\\n    this.DrawToolbar=function()\\r\\n    {\\r\\n        return;\\r\\n    }\\r\\n\\r\\n    this.GetYFromData=function(value,isLimit)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        if (isLimit===false)\\r\\n        {\\r\\n            var width=(border.RightEx-border.LeftEx)*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n            return border.LeftEx+width;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if(value<=this.HorizontalMin) return border.LeftEx;\\r\\n            if(value>=this.HorizontalMax) return border.RightEx;\\r\\n\\r\\n            var width=(border.RightEx-border.LeftEx)*(value-this.HorizontalMin)/(this.HorizontalMax-this.HorizontalMin);\\r\\n            return border.LeftEx+width;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画Y轴\\r\\n    this.DrawHorizontal=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var top=border.Top;\\r\\n        var bottom=border.Bottom;\\r\\n        var borderTop=this.ChartBorder.Top;\\r\\n        var borderBottom=this.ChartBorder.Bottom;\\r\\n        var left=border.Left;\\r\\n        var right=border.Right;\\r\\n\\r\\n        var yPrev=null; //上一个坐标y的值\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n\\r\\n        var isDrawLeft=borderTop>10*pixelTatio && this.IsShowYText[0]===true && this.YTextPosition[0]!=2;\\r\\n        var isDrawRight=borderBottom>10*pixelTatio && this.IsShowYText[1]===true && this.YTextPosition[1]!=2;\\r\\n\\r\\n        for(var i=this.HorizontalInfo.length-1; i>=0; --i)  //从左往右画分割线\\r\\n        {\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            var y=this.GetYFromData(item.Value);\\r\\n            if (y!=null && Math.abs(y-yPrev)<this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            if (y!=left)\\r\\n            {\\r\\n                if (item.LineType==2)\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=item.LineColor;\\r\\n                    this.Canvas.setLineDash([5*pixelTatio,5*pixelTatio]);   //虚线\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),top);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(y),bottom);\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.setLineDash([]);\\r\\n                }\\r\\n                else if (item.LineType>0)\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=item.LineColor;\\r\\n                    if (g_JSChartResource.FrameYLineDash)\\r\\n                    {\\r\\n                        this.Canvas.setLineDash(g_JSChartResource.FrameYLineDash);   //虚线\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(ToFixedPoint(y),top);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(y),bottom);\\r\\n                        this.Canvas.stroke();\\r\\n                        this.Canvas.setLineDash([]);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.moveTo(ToFixedPoint(y),top);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(y),bottom);\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            //坐标信息 左边 间距小于10 不画坐标\\r\\n            if (item.Message[0]!=null && isDrawLeft)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.textAlign=\\\"right\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n\\r\\n                var xText=y,yText=top;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(item.Message[0], -2, 0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            //坐标信息 右边 间距小于10 不画坐标\\r\\n            if (item.Message[1]!=null && isDrawRight)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                var text;\\r\\n                if (Array.isArray(item.Message[1])) //横屏只支持单行\\r\\n                {\\r\\n                    text=item.Message[1][0];\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    text=item.Message[1];\\r\\n                }\\r\\n\\r\\n                var xText=y,yText=bottom;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(text, 2, 0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            yPrev=y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Y刻度画在左边内部\\r\\n    this.DrawInsideHorizontal = function ()\\r\\n    {\\r\\n        if (this.IsMinSize) return;\\r\\n        if (this.IsShowYText[0]===false && this.IsShowYText[1]===false) return;\\r\\n\\r\\n        var left = this.ChartBorder.GetLeft();\\r\\n        var right = this.ChartBorder.GetRightEx();\\r\\n        var top=this.ChartBorder.GetTop();\\r\\n        var bottom=this.ChartBorder.GetBottom();\\r\\n        var borderTop=this.ChartBorder.Top;\\r\\n        var borderBottom=this.ChartBorder.Bottom;\\r\\n        var titleHeight = this.ChartBorder.TitleHeight;\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n\\r\\n        var isDrawLeft= (borderTop<10*pixelTatio || this.YTextPosition[0]==2) && this.IsShowYText[0]===true;\\r\\n        var isDrawRight= (borderBottom<10*pixelTatio || this.YTextPosition[1]==2) && this.IsShowYText[1]===true;\\r\\n\\r\\n        if ( isDrawLeft || isDrawRight )\\r\\n        {\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            var yPrev = null; //上一个坐标y的值\\r\\n            for (var i = this.HorizontalInfo.length - 1; i >= 0; --i)  //从上往下画分割线\\r\\n            {\\r\\n                var item = this.HorizontalInfo[i];\\r\\n                var y = this.GetYFromData(item.Value);\\r\\n                if (y != null && yPrev!=null && Math.abs(y - yPrev) < this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n                //坐标信息 左边 间距小于10 画在内部\\r\\n                if (item.Message[0] != null && isDrawLeft)\\r\\n                {\\r\\n                    if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                    this.Canvas.fillStyle = item.TextColor;\\r\\n                    this.Canvas.textAlign = \\\"left\\\";\\r\\n                    if (y >= right - 2) this.Canvas.textBaseline = 'top';\\r\\n                    else if (y <= left + 2) this.Canvas.textBaseline = 'bottom';\\r\\n                    else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n\\r\\n                    var textObj={ X:left, Y:y, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[0]}} ;\\r\\n                    var xText=y,yText=top;\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.translate(xText, yText);\\r\\n                    this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                    this.Canvas.fillText(item.Message[0], -2, 0);\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n\\r\\n                if (item.Message[1] != null && isDrawRight)\\r\\n                {\\r\\n                    if (item.Font != null) this.Canvas.font = item.Font;\\r\\n                    this.Canvas.fillStyle = item.TextColor;\\r\\n                    this.Canvas.textAlign = \\\"right\\\";\\r\\n                    if (y >= right - 2) this.Canvas.textBaseline = 'top';\\r\\n                    else if (y <= left + 2) this.Canvas.textBaseline = 'bottom';\\r\\n                    else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n                    var textWidth = this.Canvas.measureText(item.Message[1]).width;\\r\\n                    var textObj={ X:right-textWidth, Y:y, Text:{ BaseLine:this.Canvas.textBaseline, TextAlign: this.Canvas.textAlign, Font:this.Canvas.font, Value:item.Message[1]}} ;\\r\\n\\r\\n                    var xText=y,yText=bottom;\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.translate(xText, yText);\\r\\n                    this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                    this.Canvas.fillText(item.Message[1], 2, 0);\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n                yPrev = y;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(index)\\r\\n    {\\r\\n        if (index < 0) index = 0;\\r\\n        if (index > this.xPointCount - 1) index = this.xPointCount - 1;\\r\\n\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var offset=border.TopEx+ g_JSChartResource.FrameLeftMargin + this.DistanceWidth/2+this.DataWidth/2;\\r\\n        for(var i=1;i<=index;++i)\\r\\n        {\\r\\n            offset+=this.DistanceWidth+this.DataWidth;\\r\\n        }\\r\\n\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    //画X轴\\r\\n    this.DrawVertical=function()\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.Left;\\r\\n        var right=border.RightTitle;\\r\\n        var bottom=border.Bottom;\\r\\n        var pixelRatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        var xPrev=null; //上一个坐标x的值\\r\\n        for(var i in this.VerticalInfo)\\r\\n        {\\r\\n            var x=this.GetXFromIndex(this.VerticalInfo[i].Value);\\r\\n            if (x>=bottom) break;\\r\\n            if (xPrev!=null && Math.abs(x-xPrev)<80) continue;\\r\\n\\r\\n            var item=this.VerticalInfo[i];\\r\\n            if (item.LineType==2)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;\\r\\n                this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);   //虚线\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(left,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(right,ToFixedPoint(x));\\r\\n                this.Canvas.stroke();\\r\\n                this.Canvas.setLineDash([]);\\r\\n            }\\r\\n            else if (item.LineType>0)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;\\r\\n                if (g_JSChartResource.FrameXLineDash)\\r\\n                {\\r\\n                    this.Canvas.setLineDash(g_JSChartResource.FrameXLineDash);   //虚线\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(left,ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(right,ToFixedPoint(x));\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.setLineDash([]);\\r\\n                }\\r\\n                else    //实线\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(left,ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(right,ToFixedPoint(x));\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n            }\\r\\n\\r\\n\\r\\n            if (this.VerticalInfo[i].Message[0]!=null)\\r\\n            {\\r\\n                if (this.VerticalInfo[i].Font!=null)\\r\\n                    this.Canvas.font=this.VerticalInfo[i].Font;\\r\\n\\r\\n                this.Canvas.fillStyle=this.VerticalInfo[i].TextColor;\\r\\n                var testWidth=this.Canvas.measureText(this.VerticalInfo[i].Message[0]).width;\\r\\n                if (x<testWidth/2)\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textAlign=\\\"center\\\";\\r\\n                    this.Canvas.textBaseline=\\\"top\\\";\\r\\n                }\\r\\n\\r\\n                var xText=left,yText=x;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(this.VerticalInfo[i].Message[0], 0, this.XBottomOffset);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            xPrev=x;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Y坐标转y轴数值\\r\\n    this.GetYData=function(x)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        if (x<border.LeftEx) return this.HorizontalMin;\\r\\n        if (x>border.RightEx) return this.HorizontalMax;\\r\\n\\r\\n        var width=border.RightEx-border.LeftEx;\\r\\n        return (x-border.LeftEx)/width*(this.HorizontalMax-this.HorizontalMin)+this.HorizontalMin;\\r\\n    }\\r\\n\\r\\n    //X坐标转x轴数值\\r\\n    this.GetXData=function(y)\\r\\n    {\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        if (y<=border.TopEx) return 0;\\r\\n        if (y>=border.BottomEx) return this.XPointCount-1;\\r\\n\\r\\n        var left=border.TopEx;\\r\\n        var right=border.BottomEx;\\r\\n        var distanceWidth=this.DistanceWidth;\\r\\n        var dataWidth=this.DataWidth;\\r\\n\\r\\n        var index=0;\\r\\n        var xPoint=left+distanceWidth/2+ dataWidth+distanceWidth;\\r\\n        while(xPoint<right && index<10000 && index+1<this.XPointCount)  //自己算x的数值\\r\\n        {\\r\\n            if (xPoint>y) break;\\r\\n            xPoint+=(dataWidth+distanceWidth);\\r\\n            ++index;\\r\\n        }\\r\\n        return index;\\r\\n\\r\\n        //return (y-this.ChartBorder.GetTop())*(this.XPointCount*1.0/this.ChartBorder.GetHeight());\\r\\n    }\\r\\n\\r\\n    //计算数据宽度\\r\\n    /*\\r\\n    this.CalculateDataWidth=function()\\r\\n    {\\r\\n        if (this.XPointCount<2) return;\\r\\n\\r\\n        var width=this.ChartBorder.GetHeight()-g_JSChartResource.FrameMargin;\\r\\n\\r\\n        for(var i=0;i<ZOOM_SEED.length;++i)\\r\\n        {\\r\\n            if((ZOOM_SEED[i][0] + ZOOM_SEED[i][1]) * this.XPointCount < width)\\r\\n            {\\r\\n                this.ZoomIndex=i;\\r\\n                this.DataWidth = ZOOM_SEED[i][0];\\r\\n                this.DistanceWidth = ZOOM_SEED[i][1];\\r\\n                if (i == 0) break;      // 如果是最大的缩放因子，不再调整数据宽度\\r\\n\\r\\n                this.TrimKLineDataWidth(width);\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    */\\r\\n\\r\\n    /*\\r\\n    this.ZoomUp=function(cursorIndex)\\r\\n    {\\r\\n        if (this.ZoomIndex<=0) return false;\\r\\n        if (this.Data.DataOffset<0) return false;\\r\\n        var dataCount=this.Data.Data.length;\\r\\n        var maxDataCount=dataCount+this.RightSpaceCount;\\r\\n        if (this.XPointCount>=dataCount) return false;\\r\\n\\r\\n        var rightSpaceCount=0;\\r\\n        var lastDataIndex = this.Data.DataOffset + this.XPointCount - 1;    //最右边的数据索引\\r\\n        var lastCursorIndex=this.Data.DataOffset + cursorIndex.Index;\\r\\n        if (lastDataIndex>=dataCount)\\r\\n        {\\r\\n            rightSpaceCount=lastDataIndex-(dataCount-1);    //计算右边预留空间\\r\\n            lastDataIndex=dataCount-1;\\r\\n            if (rightSpaceCount>this.RightSpaceCount) rightSpaceCount=this.RightSpaceCount;\\r\\n        }\\r\\n\\r\\n        var xPointCount=this.CalculateCount(this.ZoomIndex-1);\\r\\n        JSConsole.Chart.Log(`[KLineHScreenFrame::ZoomUp] old status. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${this.Data.Data.length} rightSpaceCount=${rightSpaceCount}`);\\r\\n\\r\\n        --this.ZoomIndex;\\r\\n        if (xPointCount>=maxDataCount)\\r\\n        {\\r\\n            xPointCount=maxDataCount;\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset=0;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineHScreenFrame::ZoomUp] Show all data. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount}`);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset = lastDataIndex - (this.XPointCount-rightSpaceCount)+1;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineHScreenFrame::ZoomUp] calculate. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount} DataOffset=${this.Data.DataOffset}`);\\r\\n        }\\r\\n\\r\\n        this.DataWidth = ZOOM_SEED[this.ZoomIndex][0];\\r\\n\\t    this.DistanceWidth = ZOOM_SEED[this.ZoomIndex][1];\\r\\n        var width=this.ChartBorder.GetHeight()-g_JSChartResource.FrameMargin;\\r\\n        this.TrimKLineDataWidth(width);\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        cursorIndex.Index=lastCursorIndex-this.Data.DataOffset;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ZoomDown=function(cursorIndex)\\r\\n    {\\r\\n        if (this.ZoomIndex+1>=ZOOM_SEED.length) return false;\\r\\n        if (this.Data.DataOffset<0) return false;\\r\\n        var dataCount=this.Data.Data.length;\\r\\n        var maxDataCount=dataCount+this.RightSpaceCount;\\r\\n        if (this.XPointCount>=dataCount) return false;\\r\\n\\r\\n        var rightSpaceCount=0;\\r\\n        var lastDataIndex = this.Data.DataOffset + this.XPointCount - 1;    //最右边的数据索引\\r\\n        if (lastDataIndex>=this.Data.Data.length)\\r\\n        {\\r\\n            rightSpaceCount=lastDataIndex-(this.Data.Data.length-1);    //计算右边预留空间\\r\\n            lastDataIndex=this.Data.Data.length-1;\\r\\n            if (rightSpaceCount>this.RightSpaceCount) rightSpaceCount=this.RightSpaceCount;\\r\\n        }\\r\\n\\r\\n        var xPointCount=this.CalculateCount(this.ZoomIndex+1);\\r\\n        var lastCursorIndex=this.Data.DataOffset + cursorIndex.Index;\\r\\n        JSConsole.Chart.Log(`[KLineHScreenFrame::ZoomDown] old status. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${this.Data.Data.length} lastCursorIndex=${lastCursorIndex} rightSpaceCount=${rightSpaceCount}`);\\r\\n\\r\\n        ++this.ZoomIndex;\\r\\n        if (xPointCount>=maxDataCount)\\r\\n        {\\r\\n            xPointCount=maxDataCount;\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset=0;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineHScreenFrame::ZoomDown] Show all data. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount}`);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.XPointCount=xPointCount;\\r\\n            this.Data.DataOffset = lastDataIndex - (this.XPointCount-rightSpaceCount)+1;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineHScreenFrame::ZoomDown] calculate. XPointCount=${xPointCount} ZoomIndex=${this.ZoomIndex} DataCount= ${dataCount} DataOffset=${this.Data.DataOffset}`);\\r\\n        }\\r\\n\\r\\n        this.DataWidth = ZOOM_SEED[this.ZoomIndex][0];\\r\\n\\t    this.DistanceWidth = ZOOM_SEED[this.ZoomIndex][1];\\r\\n        var width=this.ChartBorder.GetHeight()-g_JSChartResource.FrameMargin;\\r\\n        this.TrimKLineDataWidth(width);\\r\\n        this.LastCalculateStatus.XPointCount=this.XPointCount;\\r\\n        cursorIndex.Index=lastCursorIndex-this.Data.DataOffset;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n    */\\r\\n}\\r\\n\\r\\n\\r\\nfunction OverlayKLineHScreenFrame()\\r\\n{\\r\\n    this.newMethod=KLineHScreenFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='OverlayKLineHScreenFrame';\\r\\n    this.MainFrame=null;    //主框架\\r\\n    this.IsShareY=false;    //使用和主框架公用Y轴\\r\\n    this.RightOffset=50;\\r\\n    this.PenBorder=g_JSChartResource.OverlayFrame.BolderPen; //'rgb(0,0,0)'\\r\\n    this.IsShow=true;   //坐标是否显示\\r\\n    this.Title=null;\\r\\n    this.TitleColor=g_JSChartResource.OverlayFrame.TitleColor;\\r\\n    this.TitleFont=g_JSChartResource.OverlayFrame.TitleFont;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.SplitXYCoordinate();\\r\\n\\r\\n        if (this.IsShow)\\r\\n        {\\r\\n            this.DrawVertical();\\r\\n            this.DrawHorizontal();\\r\\n            this.DrawTitle();\\r\\n        }\\r\\n\\r\\n        this.SizeChange=false;\\r\\n        this.XYSplit=false;\\r\\n    }\\r\\n\\r\\n    this.DrawTitle=function()   //画标题\\r\\n    {\\r\\n        /*\\r\\n        if (!this.Title) return;\\r\\n        var top = this.ChartBorder.GetTopTitle();\\r\\n        var bottom = this.ChartBorder.GetBottom();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        right+=this.RightOffset;\\r\\n\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        this.Canvas.font=this.TitleFont;\\r\\n        this.Canvas.textAlign=\\\"center\\\";\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n\\r\\n        var xText=right-2,yText=top+(bottom-top)/2;\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(xText, yText);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        this.Canvas.fillText(this.Title, 0, 0);\\r\\n        this.Canvas.restore();\\r\\n        */\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n        if (this.IsShareY)  //和主图指标共享Y轴坐标\\r\\n        {\\r\\n            this.HorizontalMax=this.MainFrame.HorizontalMax;\\r\\n            this.HorizontalMin=this.MainFrame.HorizontalMin;\\r\\n            this.HorizontalInfo=[];\\r\\n            for(var i in this.MainFrame.HorizontalInfo)\\r\\n            {\\r\\n                var item=this.MainFrame.HorizontalInfo[i];\\r\\n                this.HorizontalInfo.push(item);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        }\\r\\n        // if (this.XSplitOperator!=null) this.XSplitOperator.Operator(); 子坐标和主坐标X轴一致 所以不用计算\\r\\n    }\\r\\n\\r\\n    //画Y轴\\r\\n    this.DrawHorizontal=function()\\r\\n    {\\r\\n        /*\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var bottom = this.ChartBorder.GetBottom();\\r\\n        var top = this.ChartBorder.GetTopTitle();\\r\\n        var borderRight=this.ChartBorder.Right;\\r\\n        right+=this.RightOffset;\\r\\n\\r\\n        var yPrev=null; //上一个坐标y的值\\r\\n        for(var i=this.HorizontalInfo.length-1; i>=0; --i)  //从上往下画分割线\\r\\n        {\\r\\n            var item=this.HorizontalInfo[i];\\r\\n            var y=this.GetYFromData(item.Value);\\r\\n            if (y!=null && Math.abs(y-yPrev)<this.MinYDistance) continue;  //两个坐标在近了 就不画了\\r\\n\\r\\n            if (y >= bottom - 2) this.Canvas.textBaseline = 'bottom';\\r\\n            else if (y <= top + 2) this.Canvas.textBaseline = 'top';\\r\\n            else this.Canvas.textBaseline = \\\"middle\\\";\\r\\n\\r\\n            this.Canvas.strokeStyle=this.PenBorder;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(right-2,ToFixedPoint(y));\\r\\n            this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            //坐标信息 右边 间距小于10 不画坐标\\r\\n            if (item.Message[1]!=null && borderRight>10)\\r\\n            {\\r\\n                if (item.Font!=null) this.Canvas.font=item.Font;\\r\\n\\r\\n                this.Canvas.fillStyle=item.TextColor;\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.fillText(item.Message[1],right+2,y);\\r\\n            }\\r\\n\\r\\n            yPrev=y;\\r\\n        }\\r\\n        */\\r\\n    }\\r\\n\\r\\n    //画X轴\\r\\n    this.DrawVertical=function()\\r\\n    {\\r\\n        /*\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        //var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        right+=this.RightOffset;\\r\\n\\r\\n        this.Canvas.strokeStyle=this.PenBorder;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ToFixedPoint(right),ToFixedPoint(top));\\r\\n        this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(bottom));\\r\\n        this.Canvas.stroke();\\r\\n        */\\r\\n    }\\r\\n\\r\\n    this.GetScaleTextWidth=function()\\r\\n    {\\r\\n        return { TextWidth:0 };\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction SubFrameItem()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.Height;\\r\\n    this.OverlayIndex=[];   //叠加指标\\r\\n    this.Interval=60;       //子坐标间间距\\r\\n}\\r\\n\\r\\nfunction OverlayIndexItem()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.ChartPaint=[];\\r\\n    this.Identify=Guid();\\r\\n    this.Scprit;        //脚本\\r\\n\\r\\n    this.UpdateFrameMaxMin=function()   //调整坐标最大 最小值\\r\\n    {\\r\\n        var value={ Max:null, Min:null }\\r\\n        if (this.Frame.IsShareY)    //共享Y轴坐标\\r\\n        {\\r\\n            this.Frame.XYSplit=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.Frame.YSpecificMaxMin) //固定坐标\\r\\n        {\\r\\n            value.Max=this.Frame.YSpecificMaxMin.Max;\\r\\n            value.Min=this.Frame.YSpecificMaxMin.Min;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in this.ChartPaint)\\r\\n            {\\r\\n                var paint=this.ChartPaint[i];\\r\\n                var range=paint.GetMaxMin();\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(range.Max))\\r\\n                {\\r\\n                    if (value.Max==null || value.Max<range.Max) value.Max=range.Max;\\r\\n                }\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(range.Min))\\r\\n                {\\r\\n                    if (value.Min==null || value.Min>range.Min) value.Min=range.Min;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (value.Max!=null && value.Min!=null)\\r\\n        {\\r\\n            this.Frame.HorizontalMax=value.Max;\\r\\n            this.Frame.HorizontalMin=value.Min;\\r\\n            this.Frame.XYSplit=true;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//行情框架\\r\\nfunction HQTradeFrame()\\r\\n{\\r\\n    this.SubFrame=new Array();              //SubFrameItem 数组\\r\\n    this.SizeChange=true;                   //大小是否改变\\r\\n    this.ChartBorder;\\r\\n    this.Canvas;                            //画布\\r\\n    this.ScreenImageData;                   //截图\\r\\n    this.Data;                              //主数据\\r\\n    this.Position;                          //画布的位置\\r\\n    this.SizeChange=true;\\r\\n    this.MinSubFrameHeight=g_JSChartResource.DragSubFrameBorder.MinFrameHeight;\\r\\n    this.DragBorderHeight=g_JSChartResource.DragSubFrameBorder.TopBorderHeight; //拖拽边框高度\\r\\n\\r\\n    this.AutoLeftBorder=null;       //{ Blank:10 留白宽度, MinWidth:最小宽度 }\\r\\n    this.AutoRightBorder=null;      //{ Blank:10 留白宽度, MinWidth:最小宽度 }\\r\\n    this.OverlayBlankWidth=40;\\r\\n    this.AuotRightWidth;            //右边主坐标刻度宽度\\r\\n\\r\\n    this.ZoomWindowsInfo=null;      //附图指标缩放,备份信息\\r\\n    this.ZoomStartWindowIndex=1;    //允许缩放窗口起始位置\\r\\n\\r\\n    this.OnMoveFromeBorder=function(index, yMove)\\r\\n    {\\r\\n        if (this.SubFrame.length<=0) return false;\\r\\n\\r\\n        var topFrame=this.SubFrame[index];\\r\\n        var bottomFrame=null;\\r\\n        for(var i=index+1;i<this.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item.Height>0)\\r\\n            {\\r\\n                bottomFrame=item;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!topFrame || !bottomFrame) return false;\\r\\n\\r\\n        var bottomBackup=topFrame.Frame.ChartBorder.Bottom;\\r\\n        var topBackup=bottomFrame.Frame.ChartBorder.Top;\\r\\n\\r\\n        topFrame.Frame.ChartBorder.Bottom-=yMove;\\r\\n        bottomFrame.Frame.ChartBorder.Top+=yMove;\\r\\n\\r\\n        var height=topFrame.Frame.ChartBorder.GetHeightEx();\\r\\n        var height2=bottomFrame.Frame.ChartBorder.GetHeightEx();\\r\\n\\r\\n        //缩小的时候 小于最小高度 不处理\\r\\n        if ((height<this.MinSubFrameHeight && yMove<0) || (height2<this.MinSubFrameHeight && yMove>0))\\r\\n        {\\r\\n            topFrame.Frame.ChartBorder.Bottom=bottomBackup;\\r\\n            bottomFrame.Frame.ChartBorder.Top=topBackup;\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ReDrawToolbar=function()\\r\\n    {\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            this.SubFrame[i].Frame.ReDrawToolbar=true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetFrameBorderSizeChange=function()\\r\\n    {\\r\\n        var firstFrame=this.SubFrame[0];\\r\\n        if (!firstFrame || !firstFrame.Frame) return;\\r\\n\\r\\n        var splitOper=firstFrame.Frame.YSplitOperator;\\r\\n        if (!splitOper) return;\\r\\n        if (splitOper.CoordinateType==2) //对数坐标 需要重新计算Y轴分割\\r\\n        {\\r\\n            firstFrame.Frame.XYSplit=true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CancelZoomUpDownFrameY=function(obj)\\r\\n    {\\r\\n        var index=obj.Index;\\r\\n        if (this.SubFrame.length<=0) return false;\\r\\n        if (!this.SubFrame[index]) return false;\\r\\n\\r\\n        var subFrame=this.SubFrame[index];\\r\\n        var frame=subFrame.Frame;\\r\\n        var splitOper=frame.YSplitOperator;\\r\\n\\r\\n        if (splitOper.FixedYMaxMin)\\r\\n        {\\r\\n            splitOper.FixedYMaxMin=null;\\r\\n            splitOper.EnableZoomUpDown=false;\\r\\n            frame.XYSplit=true;\\r\\n            for(var i in subFrame.OverlayIndex)\\r\\n            {\\r\\n                var item=subFrame.OverlayIndex[i];\\r\\n                if (item.Frame.IsShareY) item.Frame.XYSplit=true;\\r\\n            }\\r\\n\\r\\n            JSConsole.Chart.Log(`[HQTradeFrame::CancelZoomUpDownFrameY]`);\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.OnZoomUpDownFrameY=function(obj, yMove)\\r\\n    {\\r\\n        var index=obj.Index;\\r\\n        if (this.SubFrame.length<=0) return false;\\r\\n        if (!this.SubFrame[index]) return false;\\r\\n\\r\\n        var subFrame=this.SubFrame[index];\\r\\n        var frame=subFrame.Frame;\\r\\n        var top=frame.ChartBorder.GetTopEx();\\r\\n        var bottom=frame.ChartBorder.GetBottomEx();\\r\\n\\r\\n        var maxValue=frame.HorizontalMax;\\r\\n        var minValue=frame.HorizontalMin;\\r\\n\\r\\n        var moveStep=(maxValue-minValue)*Math.abs(yMove)/(bottom-top);\\r\\n\\r\\n        var splitOper=frame.YSplitOperator;\\r\\n\\r\\n        var newFixedYMaxMin={ Max:maxValue, Min:minValue };\\r\\n        if (obj.Position==1)\\r\\n        {\\r\\n            var step=yMove>0 ? -moveStep:moveStep;\\r\\n            newFixedYMaxMin.Max+=step;\\r\\n        }\\r\\n        else if (obj.Position==2)\\r\\n        {\\r\\n            var step=yMove>0 ? -moveStep:moveStep;\\r\\n            newFixedYMaxMin.Min+=step;\\r\\n        }\\r\\n        else if (obj.Position==0)\\r\\n        {\\r\\n            var step=yMove>0 ? moveStep:-moveStep;\\r\\n            newFixedYMaxMin.Max+=step;\\r\\n            newFixedYMaxMin.Min-=step;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        if (newFixedYMaxMin.Max>newFixedYMaxMin.Min)\\r\\n        {\\r\\n            splitOper.FixedYMaxMin=newFixedYMaxMin;\\r\\n            splitOper.EnableZoomUpDown=true;\\r\\n            frame.XYSplit=true;\\r\\n\\r\\n            for(var i in subFrame.OverlayIndex)\\r\\n            {\\r\\n                var item=subFrame.OverlayIndex[i];\\r\\n                if (item.Frame.IsShareY) item.Frame.XYSplit=true;\\r\\n            }\\r\\n\\r\\n            JSConsole.Chart.Log(`[HQTradeFrame::OnZoomUpDownFrameY] Max=${newFixedYMaxMin.Max}, Min=${newFixedYMaxMin.Min}`);\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.OnUpDonwFrameY=function(obj, yMove)\\r\\n    {\\r\\n        var index=obj.Index;\\r\\n        if (this.SubFrame.length<=0) return false;\\r\\n        if (!this.SubFrame[index]) return false;\\r\\n\\r\\n        var subFrame=this.SubFrame[index];\\r\\n        var frame=subFrame.Frame;\\r\\n        var top=frame.ChartBorder.GetTopEx();\\r\\n        var bottom=frame.ChartBorder.GetBottomEx();\\r\\n        var splitOper=frame.YSplitOperator;\\r\\n        if (!splitOper) return false;\\r\\n\\r\\n        var maxValue=frame.HorizontalMax;\\r\\n        var minValue=frame.HorizontalMin;\\r\\n\\r\\n        var moveStep=(maxValue-minValue)*Math.abs(yMove)/(bottom-top);\\r\\n        var step=yMove>0 ? -moveStep:moveStep;\\r\\n        var newFixedYMaxMin={ Max:maxValue, Min:minValue };\\r\\n        newFixedYMaxMin.Max-=step;\\r\\n        newFixedYMaxMin.Min-=step;\\r\\n\\r\\n        splitOper.FixedYMaxMin=newFixedYMaxMin;\\r\\n        splitOper.EnableZoomUpDown=true;\\r\\n        frame.XYSplit=true;\\r\\n\\r\\n        for(var i in subFrame.OverlayIndex)\\r\\n        {\\r\\n            var item=subFrame.OverlayIndex[i];\\r\\n            if (item.Frame.IsShareY) item.Frame.XYSplit=true;\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log(`[HQTradeFrame::OnUpDonwFrameY] Max=${newFixedYMaxMin.Max}, Min=${newFixedYMaxMin.Min}, yMove=${yMove}, moveStep=${moveStep}`);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ClearUpDonwFrameYData=function(option)   //清空上下拖拽的数据\\r\\n    {\\r\\n        if (this.SubFrame.length<=0) return;\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            var index=option.Index;\\r\\n            if (index<0 || index>=this.SubFrame.length) return;\\r\\n\\r\\n            var item=this.SubFrame[index];\\r\\n            if (!item || !item.Frame || !item.Frame.YSplitOperator) return;\\r\\n\\r\\n            var splitOper=item.Frame.YSplitOperator;\\r\\n            if (splitOper.EnableZoomUpDown==true) splitOper.FixedYMaxMin=null;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<this.SubFrame.length;++i)\\r\\n            {\\r\\n                var item=this.SubFrame[i];\\r\\n                if (!item || !item.Frame || !item.Frame.YSplitOperator) continue;\\r\\n\\r\\n                var splitOper=item.Frame.YSplitOperator;\\r\\n                if (splitOper.EnableZoomUpDown==true) splitOper.FixedYMaxMin=null;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ClearCoordinateText=function(option) //清空X，Y轴刻度文字， 线段保留\\r\\n    {\\r\\n        for(var i=0;i<this.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (!item.Frame) continue;\\r\\n\\r\\n            item.Frame.ClearCoordinateText(option);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RestoreIndexWindows=function()\\r\\n    {\\r\\n        if (!this.ZoomWindowsInfo) return false;\\r\\n\\r\\n        var subFrame=this.SubFrame[this.ZoomWindowsInfo.FrameID];\\r\\n\\r\\n        for(var i=this.ZoomStartWindowIndex;i<this.ZoomWindowsInfo.Data.length; ++i)\\r\\n        {\\r\\n            var restoreItem=this.ZoomWindowsInfo.Data[i];\\r\\n            var frameItem=this.SubFrame[i];\\r\\n            frameItem.Height=restoreItem.Height;\\r\\n            frameItem.Frame.IsMinSize=false;\\r\\n            frameItem.Frame.ReDrawToolbar=true;\\r\\n            frameItem.Frame.XSplitOperator.ShowText=restoreItem.ShowXText;\\r\\n            frameItem.Frame.XYSplit=true;\\r\\n\\r\\n            for(var j=0; j<frameItem.OverlayIndex.length; ++j)\\r\\n            {\\r\\n                var overlayItem=frameItem.OverlayIndex[j];\\r\\n                overlayItem.Frame.IsMinSize=false;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ZoomWindowsInfo=null;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ZoomIndexWindow=function(frameID, option)\\r\\n    {\\r\\n        var subFrame=this.SubFrame[frameID];\\r\\n        if (!subFrame) return false;\\r\\n        if (this.ZoomWindowsInfo)   //还原\\r\\n        {\\r\\n            return this.RestoreIndexWindows();\\r\\n        }\\r\\n        else    //放大\\r\\n        {\\r\\n            var zoomInfo={ FrameID:frameID, Data:[] };    //备份下放大前各个窗口的高度\\r\\n            for(var i=0; i<this.SubFrame.length; ++i)\\r\\n            {\\r\\n                var item=this.SubFrame[i];\\r\\n                zoomInfo.Data[i]={ Height:item.Height, ShowXText:item.Frame.XSplitOperator.ShowText };\\r\\n            }\\r\\n            this.ZoomWindowsInfo=zoomInfo;\\r\\n\\r\\n            var totalHeight=0;\\r\\n            for(var i=this.ZoomStartWindowIndex;i<this.SubFrame.length;++i)\\r\\n            {\\r\\n                var item=this.SubFrame[i];\\r\\n                var frame=item.Frame;\\r\\n                frame.XYSplit=true;\\r\\n\\r\\n                totalHeight+=item.Height;\\r\\n\\r\\n                if (i!=frameID)\\r\\n                {\\r\\n                    item.Height=0;\\r\\n                    frame.IsMinSize=true;  //最小化\\r\\n                    frame.HideToolbar();\\r\\n                    frame.XSplitOperator.ShowText=false;\\r\\n\\r\\n                    for(var j=0; j<item.OverlayIndex.length; ++j)\\r\\n                    {\\r\\n                        var overlayItem=item.OverlayIndex[j];\\r\\n                        overlayItem.Frame.IsMinSize=true;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            subFrame.Height=totalHeight;\\r\\n            subFrame.Frame.XSplitOperator.ShowText=true;\\r\\n\\r\\n            return true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //保存高度比例\\r\\n    this.SaveSubFrameHeightRate=function()\\r\\n    {\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        for(var i=0; i<this.SubFrame.length; ++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            var subHeight=item.Frame.ChartBorder.GetHeight();\\r\\n            var rate=(subHeight/height)*100;\\r\\n            item.Height=rate;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateChartBorder=function()    //计算每个子框架的边框信息\\r\\n    {\\r\\n        if (this.SubFrame.length<=0) return;\\r\\n\\r\\n        var top=this.ChartBorder.GetTop();\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n        var totalHeight=0;\\r\\n\\r\\n        for(var i=0; i<this.SubFrame.length; ++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            totalHeight+=item.Height;\\r\\n        }\\r\\n\\r\\n        for(var i=0; i<this.SubFrame.length; ++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            item.Frame.ChartBorder.Top=top;\\r\\n            item.Frame.ChartBorder.Left=this.ChartBorder.Left;\\r\\n            item.Frame.ChartBorder.Right=this.ChartBorder.Right;\\r\\n            item.Frame.ChartBorder.LeftExtendWidth=this.ChartBorder.LeftExtendWidth;\\r\\n            item.Frame.ChartBorder.RightExtendWidth=this.ChartBorder.RightExtendWidth;\\r\\n            var frameHeight=height*(item.Height/totalHeight)+top;\\r\\n            item.Frame.ChartBorder.Bottom=this.ChartBorder.GetChartHeight()-frameHeight;\\r\\n            top=frameHeight;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetExtendWidth=function(obj)\\r\\n    {\\r\\n        if (!obj) return;\\r\\n        var leftWidth=null, rightWidth=null;\\r\\n        if (IFrameSplitOperator.IsNumber(obj.Left))\\r\\n        {\\r\\n            leftWidth=obj.Left;\\r\\n            this.ChartBorder.LeftExtendWidth=leftWidth;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(obj.Right))\\r\\n        {\\r\\n            rightWidth=obj.Right;\\r\\n            this.ChartBorder.RightExtendWidth=rightWidth;\\r\\n        }\\r\\n\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (leftWidth!=null) item.Frame.ChartBorder.LeftExtendWidth=leftWidth;\\r\\n            if (rightWidth!=null) item.Frame.ChartBorder.RightExtendWidth=rightWidth;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateChartBorder2=function()   //计算每个子框架的边框信息(思维导图用)\\r\\n    {\\r\\n        if (this.SubFrame.length<=0) return;\\r\\n\\r\\n        var top=this.ChartBorder.Top;\\r\\n        var bottom=this.ChartBorder.Bottom;\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n        var totalHeight=0;\\r\\n\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            totalHeight+=item.Height;\\r\\n        }\\r\\n\\r\\n        var tempHeight=0;\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            item.Frame.ChartBorder.Top=top;\\r\\n            item.Frame.ChartBorder.Left=this.ChartBorder.Left;\\r\\n            item.Frame.ChartBorder.Right=this.ChartBorder.Right;\\r\\n            item.Frame.ChartBorder.X=this.ChartBorder.X;\\r\\n            item.Frame.ChartBorder.Y=this.ChartBorder.Y;\\r\\n            item.Frame.ChartBorder.Width=this.ChartBorder.Width;\\r\\n            item.Frame.ChartBorder.Height=this.ChartBorder.Height;\\r\\n            var frameHeight=height*(item.Height/totalHeight);\\r\\n            tempHeight+=frameHeight;\\r\\n            bottom=this.ChartBorder.Bottom+(height-tempHeight);\\r\\n            item.Frame.ChartBorder.Bottom=bottom;\\r\\n            top+=frameHeight;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetScaleTextWidth=function()\\r\\n    {\\r\\n        var width={ Left:null, Right:null, OverlayRight:0 };\\r\\n        var aryOverlayWidth=[];// 叠加坐标\\r\\n        for(var i=0; i<this.SubFrame.length; ++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item.Height<=0) continue;\\r\\n            var frame=item.Frame;\\r\\n            if (!frame) continue;\\r\\n            if (!frame.XSplitOperator) continue;\\r\\n\\r\\n            var maxValue=frame.HorizontalMax;   //最大最小要还原\\r\\n            var minValue=frame.HorizontalMin;\\r\\n\\r\\n            frame.YSplitOperator.Operator();\\r\\n            var value=frame.GetScaleTextWidth();\\r\\n\\r\\n            frame.HorizontalMax=maxValue;\\r\\n            frame.HorizontalMin=minValue;\\r\\n\\r\\n            if (value && value.TextWidth)\\r\\n            {\\r\\n                var widthItem=value.TextWidth;\\r\\n                if (IFrameSplitOperator.IsNumber(widthItem.Left))\\r\\n                {\\r\\n                    if (width.Left==null || width.Left<widthItem.Left) width.Left=widthItem.Left;\\r\\n                }\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(widthItem.Right))\\r\\n                {\\r\\n                    if (width.Right==null || width.Right<widthItem.Right) width.Right=widthItem.Right;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            //右侧叠加指标\\r\\n            if (IFrameSplitOperator.IsNonEmptyArray(item.OverlayIndex))\\r\\n            {\\r\\n                for(var j=0, k=0; j<item.OverlayIndex.length; ++j)\\r\\n                {\\r\\n                    var overlayItem=item.OverlayIndex[j];\\r\\n                    if (!overlayItem.Frame) continue;\\r\\n\\r\\n                    var maxValue=overlayItem.Frame.HorizontalMax;   //最大最小要还原\\r\\n                    var minValue=overlayItem.Frame.HorizontalMin;\\r\\n\\r\\n                    overlayItem.Frame.YSplitOperator.Operator();\\r\\n                    var value=overlayItem.Frame.GetScaleTextWidth();\\r\\n\\r\\n                    overlayItem.Frame.HorizontalMax=maxValue;\\r\\n                    overlayItem.Frame.HorizontalMin=minValue;\\r\\n\\r\\n                    overlayItem.RightWidth={ Index:-1, Width:0 };\\r\\n                    if (!value || !value.TextWidth) continue;\\r\\n                    var widthItem=value.TextWidth;\\r\\n                    if (!IFrameSplitOperator.IsNumber(widthItem.Right)) continue;\\r\\n\\r\\n                    overlayItem.RightWidth.Index=k;\\r\\n                    overlayItem.RightWidth.Width=widthItem.Right;\\r\\n\\r\\n                    if (aryOverlayWidth[k])\\r\\n                    {\\r\\n                        aryOverlayWidth[k][i]=overlayItem.RightWidth;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        aryOverlayWidth[k]=[];\\r\\n                        aryOverlayWidth[k][i]=overlayItem.RightWidth;\\r\\n                    }\\r\\n\\r\\n                    ++k;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var overlayWidth=[];\\r\\n        for(var i=0; i<aryOverlayWidth.length; ++i)\\r\\n        {\\r\\n            var colItem=aryOverlayWidth[i];\\r\\n            var max=0;\\r\\n            for(var j=0; j<colItem.length; ++j)\\r\\n            {\\r\\n                if (!colItem[j]) continue;\\r\\n                var item=colItem[j].Width;\\r\\n                if (max<item) max=item;\\r\\n            }\\r\\n\\r\\n            if (max>0) max+=this.OverlayBlankWidth\\r\\n\\r\\n            for(var j=0; j<colItem.length; ++j)\\r\\n            {\\r\\n                if (!colItem[j]) continue;\\r\\n                colItem[j].Width=max;\\r\\n            }\\r\\n\\r\\n            overlayWidth[i]=max;\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<overlayWidth.length;++i)\\r\\n        {\\r\\n            var value=overlayWidth[i];\\r\\n            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n            width.OverlayRight+=value;\\r\\n        }\\r\\n\\r\\n        return width;\\r\\n    }\\r\\n\\r\\n    this.IsFrameXYSplit=function()\\r\\n    {\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item.Frame.XYSplit) return true;\\r\\n\\r\\n            for(var j=0; j<item.OverlayIndex.length; ++j)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                if (overlayItem.Frame.XYSplit) return true;\\r\\n            }\\r\\n\\r\\n        }\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.Draw=function(option)\\r\\n    {\\r\\n        if (this.SizeChange===true)\\r\\n        {\\r\\n            this.CalculateChartBorder();\\r\\n        }\\r\\n\\r\\n        var isSplash=false; //是否过场动画\\r\\n        if (option && option.IsEnableSplash===true) isSplash=true;\\r\\n        if (isSplash==false && (this.AutoLeftBorder || this.AutoRightBorder) && this.IsFrameXYSplit())\\r\\n        {\\r\\n            this.AutoRightOverlayWidth=[];\\r\\n            var textWidth=this.GetScaleTextWidth();\\r\\n            var bSizeChange=false;\\r\\n            if (IFrameSplitOperator.IsNumber(textWidth.Left) && this.AutoLeftBorder)\\r\\n            {\\r\\n                var blank=0;\\r\\n                if (IFrameSplitOperator.IsNumber(this.AutoLeftBorder.Blank)) blank=this.AutoLeftBorder.Blank;\\r\\n                var value=textWidth.Left+blank;\\r\\n                if (IFrameSplitOperator.IsNumber(this.AutoLeftBorder.MinWidth))\\r\\n                {\\r\\n                    if (this.AutoLeftBorder.MinWidth>value) value=this.AutoLeftBorder.MinWidth;\\r\\n                }\\r\\n                if (this.IsHScreen) this.ChartBorder.Top=value;\\r\\n                else this.ChartBorder.Left=value;\\r\\n\\r\\n                for(var i=0; i<this.SubFrame.length; ++i)\\r\\n                {\\r\\n                    var item=this.SubFrame[i];\\r\\n                    if (this.IsHScreen) item.Frame.ChartBorder.Top=value;\\r\\n                    else item.Frame.ChartBorder.Left=value;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(textWidth.Right) && this.AutoRightBorder)\\r\\n            {\\r\\n                var blank=0;\\r\\n                if (IFrameSplitOperator.IsNumber(this.AutoRightBorder.Blank)) blank=this.AutoRightBorder.Blank;\\r\\n                var value=textWidth.Right+blank;\\r\\n                if (IFrameSplitOperator.IsNumber(this.AutoRightBorder.MinWidth))\\r\\n                {\\r\\n                    if (this.AutoRightBorder.MinWidth>value) value=this.AutoRightBorder.MinWidth;\\r\\n                }\\r\\n\\r\\n                this.AuotRightWidth=value;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(textWidth.OverlayRight))\\r\\n                {\\r\\n                    value+=this.OverlayBlankWidth;\\r\\n                    this.AuotRightWidth=value;\\r\\n                    value+=textWidth.OverlayRight;\\r\\n                }\\r\\n\\r\\n                if (this.GetExtendChartRightWidth)\\r\\n                {\\r\\n                    var extendWidth=this.GetExtendChartRightWidth();\\r\\n                    value+=extendWidth;\\r\\n                }\\r\\n\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    if (this.ChartBorder.Bottom!=value) bSizeChange=true;\\r\\n                    this.ChartBorder.Bottom=value;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.ChartBorder.Right!=value) bSizeChange=true;\\r\\n                    this.ChartBorder.Right=value;\\r\\n                }\\r\\n                for(var i=0; i<this.SubFrame.length; ++i)\\r\\n                {\\r\\n                    var item=this.SubFrame[i];\\r\\n                    if (this.IsHScreen) item.Frame.ChartBorder.Bottom=value;\\r\\n                    else item.Frame.ChartBorder.Right=value;\\r\\n\\r\\n                    item.Frame.ReDrawToolbar=true;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.SetSizeChage(true);\\r\\n        }\\r\\n\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item.Height<=0) continue;\\r\\n\\r\\n            item.Frame.Draw();\\r\\n\\r\\n            if (this.AutoRightBorder)\\r\\n            {\\r\\n                var rightOffset=this.AuotRightWidth;\\r\\n\\r\\n                for(var j=0; j<item.OverlayIndex.length; ++j)\\r\\n                {\\r\\n                    var overlayItem=item.OverlayIndex[j];\\r\\n                    //把主坐标部分设置给子坐标下来\\r\\n                    overlayItem.Frame.DataWidth=item.Frame.DataWidth;\\r\\n                    overlayItem.Frame.DistanceWidth=item.Frame.DistanceWidth;\\r\\n                    overlayItem.Frame.XPointCount=item.Frame.XPointCount;\\r\\n                    if (overlayItem.ChartPaint.length>0 && overlayItem.Frame)\\r\\n                    {\\r\\n                        overlayItem.Frame.RightOffset=rightOffset;\\r\\n                        overlayItem.Frame.Draw();\\r\\n                        rightOffset+=overlayItem.RightWidth.Width;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var rightOffset=item.Interval;\\r\\n                if (item.Frame.RightTextMaxWidth>rightOffset) rightOffset=item.Frame.RightTextMaxWidth;\\r\\n                for(var j in item.OverlayIndex)\\r\\n                {\\r\\n                    var overlayItem=item.OverlayIndex[j];\\r\\n                    //把主坐标部分设置给子坐标下来\\r\\n                    overlayItem.Frame.DataWidth=item.Frame.DataWidth;\\r\\n                    overlayItem.Frame.DistanceWidth=item.Frame.DistanceWidth;\\r\\n                    overlayItem.Frame.XPointCount=item.Frame.XPointCount;\\r\\n                    if (overlayItem.ChartPaint.length>0 && overlayItem.Frame)\\r\\n                    {\\r\\n                        overlayItem.Frame.RightOffset=rightOffset;\\r\\n                        overlayItem.Frame.Draw();\\r\\n                        if (overlayItem.Frame.IsShow) rightOffset+=item.Interval;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.SizeChange=false;\\r\\n    }\\r\\n\\r\\n    this.DrawOveraly=function()\\r\\n    {\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            for(var j in item.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                for(var k in overlayItem.ChartPaint)\\r\\n                {\\r\\n                    if (overlayItem.ChartPaint[k].IsShow)\\r\\n                        overlayItem.ChartPaint[k].Draw();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawLock=function()\\r\\n    {\\r\\n        for (var i in this.SubFrame)\\r\\n        {\\r\\n            var item = this.SubFrame[i];\\r\\n            item.Frame.DrawLock();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateLock=function()\\r\\n    {\\r\\n        for (var i in this.SubFrame)\\r\\n        {\\r\\n            var item = this.SubFrame[i];\\r\\n            item.Frame.CalculateLock();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawInsideHorizontal = function ()\\r\\n    {\\r\\n        for (var i in this.SubFrame)\\r\\n        {\\r\\n            var item = this.SubFrame[i];\\r\\n            if (item.Frame.DrawInsideHorizontal) item.Frame.DrawInsideHorizontal();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCustomHorizontal=function()    //定制坐标\\r\\n    {\\r\\n        for (var i in this.SubFrame)\\r\\n        {\\r\\n            var item = this.SubFrame[i];\\r\\n            if (item.Frame.DrawCustomHorizontal) item.Frame.DrawCustomHorizontal();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawEx=function(option)\\r\\n    {\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item = this.SubFrame[i];\\r\\n            if ((item.Frame.ClassName==\\\"MinuteFrame\\\"||item.Frame.ClassName==\\\"MinuteHScreenFrame\\\")  && i==1)\\r\\n            {\\r\\n                item.Frame.DrawVolTitle(option.Symbol);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCustomVertical=function(event)\\r\\n    {\\r\\n        for (var i in this.SubFrame)\\r\\n        {\\r\\n            var item = this.SubFrame[i];\\r\\n            item.Frame.DrawCustomVerticalEvent=event;\\r\\n            if (item.Frame.DrawCustomVertical) item.Frame.DrawCustomVertical();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetSizeChage=function(sizeChange)\\r\\n    {\\r\\n        this.SizeChange=sizeChange;\\r\\n\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            item.Frame.SizeChange=sizeChange;\\r\\n\\r\\n            for(var j in item.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                if (overlayItem.Frame) overlayItem.Frame.SizeChange=sizeChange;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //画布的位置\\r\\n        if (this.ChartBorder.UIElement)\\r\\n        {\\r\\n            this.Position={\\r\\n                X:this.ChartBorder.UIElement.offsetLeft,\\r\\n                Y:this.ChartBorder.UIElement.offsetTop,\\r\\n                W:this.ChartBorder.UIElement.clientWidth,\\r\\n                H:this.ChartBorder.UIElement.clientHeight\\r\\n            };\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetDrawDepthMap=function(callback)\\r\\n    {\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            item.Frame.DrawDepthMapCallback=callback;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //图形快照\\r\\n    this.Snapshot=function()\\r\\n    {\\r\\n        this.ScreenImageData=this.Canvas.getImageData(0,0,this.ChartBorder.GetChartWidth(),this.ChartBorder.GetChartHeight());\\r\\n    }\\r\\n\\r\\n    this.GetXData=function(x)\\r\\n    {\\r\\n        return this.SubFrame[0].Frame.GetXData(x);\\r\\n    }\\r\\n\\r\\n    this.GetYData=function(y,outObject) //outObject 可以保存返回的额外数据\\r\\n    {\\r\\n        var frame;\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            var left=item.Frame.ChartBorder.GetLeft();\\r\\n            var top=item.Frame.ChartBorder.GetTopEx();\\r\\n            var width=item.Frame.ChartBorder.GetWidth();\\r\\n            var height=item.Frame.ChartBorder.GetHeightEx();\\r\\n\\r\\n            item.Frame.Canvas.beginPath();\\r\\n            item.Frame.Canvas.rect(left,top,width,height);\\r\\n            if (item.Frame.Canvas.isPointInPath(left,y))\\r\\n            {\\r\\n                frame=item.Frame;\\r\\n                if (outObject) outObject.FrameID=parseInt(i);   //转成整形\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (frame!=null)\\r\\n        {\\r\\n            if (frame.RightFrame) outObject.RightYValue=frame.RightFrame.GetYData(y);    //右侧子坐标\\r\\n\\r\\n            var yValue=frame.GetYData(y);\\r\\n            if (frame.YSplitOperator.CoordinateType==1) //百分比坐标 右边显示百分比信息\\r\\n            {\\r\\n                var  firstOpenPrice=frame.YSplitOperator.GetFirstOpenPrice();\\r\\n                outObject.RightYValue=((yValue-firstOpenPrice)/firstOpenPrice*100).toFixed(2)+'%';\\r\\n            }\\r\\n            return yValue;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.PtInFrame=function(x,y)    //鼠标哪个指标窗口\\r\\n    {\\r\\n        for(var i=0; i<this.SubFrame.length; ++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            var left=item.Frame.ChartBorder.GetLeft();\\r\\n            var top=item.Frame.ChartBorder.GetTop();\\r\\n            var width=item.Frame.ChartBorder.GetWidth();\\r\\n            var height=item.Frame.ChartBorder.GetHeight();\\r\\n\\r\\n            item.Frame.Canvas.beginPath();\\r\\n            item.Frame.Canvas.rect(left,top,width,height);\\r\\n            if (item.Frame.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                return i;   //转成整形\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.PtInButtons=function(x,y)\\r\\n    {\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            var button=item.Frame.PtInButtons(x,y);\\r\\n            if (button) return button;\\r\\n        }\\r\\n\\r\\n        return null\\r\\n    }\\r\\n\\r\\n    //是否在X轴坐标上\\r\\n    this.PtInFrameBottom=function(x,y)\\r\\n    {\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var top=this.ChartBorder.GetBottom();\\r\\n        var width=this.ChartBorder.GetWidth();\\r\\n        var height=this.ChartBorder.Bottom;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,width,height);\\r\\n        if (this.Canvas.isPointInPath(x,y)) return true;\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(index)\\r\\n    {\\r\\n        return this.SubFrame[0].Frame.GetXFromIndex(index);\\r\\n    }\\r\\n\\r\\n    this.GetYFromData=function(value)\\r\\n    {\\r\\n        return this.SubFrame[0].Frame.GetYFromData(value);\\r\\n    }\\r\\n\\r\\n    this.ZoomUp=function(cursorIndex)\\r\\n    {\\r\\n        var result=this.SubFrame[0].Frame.ZoomUp(cursorIndex);\\r\\n        this.UpdateAllFrame();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.ZoomDown=function(cursorIndex)\\r\\n    {\\r\\n        var result=this.SubFrame[0].Frame.ZoomDown(cursorIndex);\\r\\n        this.UpdateAllFrame();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.XCoordinateZoom=function(step, isMoveLeft)\\r\\n    {\\r\\n        var result=this.SubFrame[0].Frame.XCoordinateZoom(step, isMoveLeft);\\r\\n        this.UpdateAllFrame();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //设置重新计算刻度坐标\\r\\n    this.ResetXYSplit=function()\\r\\n    {\\r\\n        for(let i in this.SubFrame)\\r\\n        {\\r\\n            this.SubFrame[i].Frame.XYSplit=true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetLanguage=function(languageID)\\r\\n    {\\r\\n        for(let i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item && item.Frame )\\r\\n            {\\r\\n                if (item.Frame.YSplitOperator) item.Frame.YSplitOperator.LanguageID=languageID;\\r\\n                if (item.Frame.XSplitOperator) item.Frame.XSplitOperator.LanguageID=languageID;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetCurrentPageSize=function()  //获取当前页显示的数据个数\\r\\n    {\\r\\n        if (this.SubFrame.length<=0) return null;\\r\\n        var item=this.SubFrame[0];\\r\\n        if (!item || !item.Frame) return null;\\r\\n\\r\\n        return item.Frame.XPointCount;\\r\\n    }\\r\\n\\r\\n    this.OnSize=function()\\r\\n    {\\r\\n        var obj={};\\r\\n        this.SubFrame[0].Frame.OnSize(obj);\\r\\n        this.UpdateAllFrame();\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    this.SetDataWidth=function(dataWidth)\\r\\n    {\\r\\n        var obj=this.SubFrame[0].Frame.SetDataWidth(dataWidth);\\r\\n        this.UpdateAllFrame();\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    this.UpdateAllFrame=function()\\r\\n    {\\r\\n        var mainFrame=this.SubFrame[0].Frame;\\r\\n        for(var i=0;i<this.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (i>0)    //第1个窗口主坐标已经算好了\\r\\n            {\\r\\n                item.Frame.XPointCount= mainFrame.XPointCount;\\r\\n                item.Frame.ZoomIndex= mainFrame.ZoomIndex;\\r\\n                item.Frame.DataWidth= mainFrame.DataWidth;\\r\\n                item.Frame.DistanceWidth= mainFrame.DistanceWidth;\\r\\n                item.Frame.LastCalculateStatus.Width=mainFrame.LastCalculateStatus.Width;\\r\\n                item.Frame.LastCalculateStatus.XPointCount=mainFrame.LastCalculateStatus.XPointCount;\\r\\n            }\\r\\n\\r\\n            for(var j in item.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=this.SubFrame[i].OverlayIndex[j];\\r\\n                overlayItem.Frame.XPointCount= mainFrame.XPointCount;\\r\\n                overlayItem.Frame.ZoomIndex= mainFrame.ZoomIndex;\\r\\n                overlayItem.Frame.DataWidth= mainFrame.DataWidth;\\r\\n                overlayItem.Frame.DistanceWidth= mainFrame.DistanceWidth;\\r\\n                overlayItem.Frame.LastCalculateStatus.Width=mainFrame.LastCalculateStatus.Width;\\r\\n                overlayItem.Frame.LastCalculateStatus.XPointCount=mainFrame.LastCalculateStatus.XPointCount;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //鼠标是否在边框上\\r\\n    this.PtInFrameBorder=function(x,y)\\r\\n    {\\r\\n        var height=this.DragBorderHeight;\\r\\n        for(var i=0;i<this.SubFrame.length-1;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item.Frame.Heigh<=0) continue;\\r\\n            var bottom=item.Frame.ChartBorder.GetBottom();\\r\\n            var left=item.Frame.ChartBorder.GetLeft();\\r\\n            var right=item.Frame.ChartBorder.GetRight();\\r\\n\\r\\n            item.Frame.Canvas.beginPath();\\r\\n            item.Frame.Canvas.rect(left,bottom-height/2,(right-left),height);\\r\\n            if (item.Frame.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                return { Index:i, Bottom:true };\\r\\n            }\\r\\n        }\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.IsEnableDragY=function(index)\\r\\n    {\\r\\n        if (!this.SubFrame) return false;\\r\\n        var item=this.SubFrame[index];\\r\\n        if (!item || !item.Frame || !item.Frame.YSplitOperator) return false;\\r\\n        var split=item.Frame.YSplitOperator;\\r\\n        if (typeof(split.IsEnableDragY)!='function') return false;\\r\\n\\r\\n        return split.IsEnableDragY();\\r\\n    }\\r\\n\\r\\n    this.PtInFrameY=function(x,y)\\r\\n    {\\r\\n        for(var i=0;i<this.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (item.Frame.Heigh<=0) continue;\\r\\n            var rightWidth=item.Frame.ChartBorder.Right;\\r\\n\\r\\n            var border=item.Frame.ChartBorder.GetBorder();\\r\\n            var bottom=border.Bottom;\\r\\n            var top=border.TopTitle;\\r\\n            var left=border.Left;\\r\\n            var right=border.Right;\\r\\n\\r\\n            var maxTopHegith=30;\\r\\n            var barHegith=(bottom-top);\\r\\n            if (barHegith/3>maxTopHegith)\\r\\n            {\\r\\n                var barTop=top+maxTopHegith;\\r\\n                var barBottom=bottom-maxTopHegith;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var internal=barHegith/3;\\r\\n                var barTop=top+internal;\\r\\n                var barBottom=bottom-internal;\\r\\n            }\\r\\n\\r\\n            var position=0;\\r\\n            if (y<barTop) position=1;\\r\\n            else if (y>barBottom) position=2;\\r\\n\\r\\n            if (rightWidth>=10)\\r\\n            {\\r\\n                item.Frame.Canvas.beginPath();\\r\\n                item.Frame.Canvas.rect(right,top,rightWidth,(bottom-top));\\r\\n                if (item.Frame.Canvas.isPointInPath(x,y))\\r\\n                {\\r\\n                    return { Index:i, Right:true, Left:false , Position:position };    //Position 1=上面 2 下面 0=中间(TODO)\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var leftWidth=item.Frame.ChartBorder.Left;\\r\\n            if (leftWidth>=10)\\r\\n            {\\r\\n                item.Frame.Canvas.beginPath();\\r\\n                item.Frame.Canvas.rect(0,top,leftWidth,(bottom-top));\\r\\n                if (item.Frame.Canvas.isPointInPath(x,y))\\r\\n                {\\r\\n                    return { Index:i, Right:false, Left:true, Position:position };\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.SetDayCount=function(dayCount)\\r\\n    {\\r\\n        this.ChartBorder.MultiDayMinute.Count=dayCount;\\r\\n        for(var i=0;i<this.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (!item.Frame) continue;\\r\\n\\r\\n            item.Frame.DayCount=dayCount;\\r\\n            item.Frame.ChartBorder.MultiDayMinute.Count=dayCount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //设置多日分时宽度\\r\\n    this.SetMultiDayMinuteWidth=function(obj)\\r\\n    {\\r\\n        if (!obj) return;\\r\\n        if (IFrameSplitOperator.IsNumber(obj.Left)) this.ChartBorder.MultiDayMinute.Left=obj.Left;\\r\\n        if (IFrameSplitOperator.IsNumber(obj.Right)) this.ChartBorder.MultiDayMinute.Right=obj.Right;\\r\\n\\r\\n        for(var i=0;i<this.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            if (!item.Frame) continue;\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(obj.Left)) item.Frame.ChartBorder.MultiDayMinute.Left=obj.Left;\\r\\n            if (IFrameSplitOperator.IsNumber(obj.Right)) item.Frame.ChartBorder.MultiDayMinute.Right=obj.Right;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//行情框架横屏\\r\\nfunction HQTradeHScreenFrame()\\r\\n{\\r\\n    this.newMethod=HQTradeFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.IsHScreen=true;        //是否是横屏\\r\\n\\r\\n    this.CalculateChartBorder=function()    //计算每个子框架的边框信息\\r\\n    {\\r\\n        if (this.SubFrame.length<=0) return;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var right=this.ChartBorder.Right;\\r\\n        var left=border.Right;\\r\\n        var width=border.Right-border.Left;\\r\\n        var totalHeight=0;\\r\\n\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            totalHeight+=item.Height;\\r\\n        }\\r\\n\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            item.Frame.ChartBorder.Top=this.ChartBorder.Top;\\r\\n            item.Frame.ChartBorder.Bottom=this.ChartBorder.Bottom;\\r\\n\\r\\n            var frameWidth=width*(item.Height/totalHeight);\\r\\n            item.Frame.ChartBorder.Right=right;\\r\\n            item.Frame.ChartBorder.Left=left-frameWidth;\\r\\n\\r\\n            right+=frameWidth;\\r\\n            left-=frameWidth;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetYData=function(x,outObject)\\r\\n    {\\r\\n        var frame;\\r\\n        for(var i in this.SubFrame)\\r\\n        {\\r\\n            var item=this.SubFrame[i];\\r\\n            var left=item.Frame.ChartBorder.GetLeftEx();\\r\\n            var top=item.Frame.ChartBorder.GetTop();\\r\\n            var width=item.Frame.ChartBorder.GetWidthEx();\\r\\n            var height=item.Frame.ChartBorder.GetHeight();\\r\\n\\r\\n            item.Frame.Canvas.beginPath();\\r\\n            item.Frame.Canvas.rect(left,top,width,height);\\r\\n            if (item.Frame.Canvas.isPointInPath(x,top))\\r\\n            {\\r\\n                frame=item.Frame;\\r\\n                if (outObject) outObject.FrameID=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (frame!=null) return frame.GetYData(x);\\r\\n    }\\r\\n}\\r\\n\\r\\n//深度图框架\\r\\nfunction DepthChartFrame()\\r\\n{\\r\\n    this.newMethod=AverageWidthFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ScreenImageData;                   //截图\\r\\n    this.Position;                          //画布的位置\\r\\n    this.ClassName=\\\"DepthChartFrame\\\";\\r\\n\\r\\n    //X轴价格 最大,最小\\r\\n    this.VerticalRange={ Max:88, Min:8, Center:null, MaxDiffer:null, Differ:null, Step:0.05 };\\r\\n    this.AskPrice;\\r\\n    this.BidPrice;\\r\\n    this.MinZoom=0.05;  //最小缩放\\r\\n\\r\\n    this.SetPriceList=function(aryAskPrice, aryBidPrice)\\r\\n    {\\r\\n        this.AskPrice=aryAskPrice;\\r\\n        this.BidPrice=aryBidPrice;\\r\\n    }\\r\\n\\r\\n    this.DrawFrame=function()\\r\\n    {\\r\\n        this.SplitXYCoordinate();\\r\\n        this.DrawHorizontal();\\r\\n        this.DrawVertical();\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(value)\\r\\n    {\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var width=this.ChartBorder.GetWidth();\\r\\n        var offset=width*(value-this.VerticalRange.Min)/(this.VerticalRange.Max-this.VerticalRange.Min);\\r\\n        return left+offset;\\r\\n    }\\r\\n\\r\\n    this.GetXData=function(x)\\r\\n    {\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var width=this.ChartBorder.GetWidth();\\r\\n\\r\\n        return (x-left)/width*(this.VerticalRange.Max-this.VerticalRange.Min)+this.VerticalRange.Min;\\r\\n    }\\r\\n\\r\\n    this.GetXFromPrice=function(price)\\r\\n    {\\r\\n        var isAskPrice=false;\\r\\n        var find=this.GetPrice(this.BidPrice, price);\\r\\n        if (find==null)\\r\\n        {\\r\\n            find=this.GetPrice(this.AskPrice, price);\\r\\n            isAskPrice=true;\\r\\n        }\\r\\n\\r\\n        if (find==null)\\r\\n        {\\r\\n            if (this.BidPrice && Array.isArray(this.BidPrice) && this.BidPrice.length>0)\\r\\n            {\\r\\n                var minPrice=this.BidPrice[0];\\r\\n                if (price<minPrice)\\r\\n                {\\r\\n                    isAskPrice=false;\\r\\n                    find= minPrice;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (find==null)\\r\\n        {\\r\\n            if (this.AskPrice && Array.isArray(this.AskPrice) && this.AskPrice.length>0)\\r\\n            {\\r\\n                var maxPrice=this.AskPrice[this.AskPrice.length-1];\\r\\n                if (price>maxPrice)\\r\\n                {\\r\\n                    isAskPrice=true;\\r\\n                    find=maxPrice;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (find==null) return null;\\r\\n\\r\\n        var x=this.GetXFromIndex(find);\\r\\n\\r\\n        return { X:x, Price:find, IsAsk:isAskPrice };\\r\\n    }\\r\\n\\r\\n    this.GetPrice=function(aryPrice, price)\\r\\n    {\\r\\n        if (!aryPrice || !Array.isArray(aryPrice) || aryPrice.length<=0) return null;\\r\\n\\r\\n        if (price<aryPrice[0] || price>aryPrice[aryPrice.length-1]) return null;\\r\\n\\r\\n        var lastPrice=null;\\r\\n        for(var i in aryPrice)\\r\\n        {\\r\\n            var item=aryPrice[i];\\r\\n            if (price==item)\\r\\n            {\\r\\n                return item;\\r\\n            }\\r\\n\\r\\n            if (price<item)\\r\\n                return lastPrice;\\r\\n\\r\\n            lastPrice=item;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n        if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        if (this.XSplitOperator!=null) this.XSplitOperator.Operator();\\r\\n    }\\r\\n\\r\\n    //图形快照\\r\\n    this.Snapshot=function()\\r\\n    {\\r\\n        this.ScreenImageData=this.Canvas.getImageData(0,0,this.ChartBorder.GetChartWidth(),this.ChartBorder.GetChartHeight());\\r\\n    }\\r\\n\\r\\n    this.SetSizeChage=function(sizeChange)\\r\\n    {\\r\\n        this.SizeChange=sizeChange;\\r\\n\\r\\n        //画布的位置\\r\\n        this.Position={\\r\\n            X:this.ChartBorder.UIElement.offsetLeft,\\r\\n            Y:this.ChartBorder.UIElement.offsetTop,\\r\\n            W:this.ChartBorder.UIElement.clientWidth,\\r\\n            H:this.ChartBorder.UIElement.clientHeight\\r\\n        };\\r\\n    }\\r\\n\\r\\n    this.SetDrawDepthMap=function(callback)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.PtInFrame=function(x,y)    //鼠标哪个指标窗口\\r\\n    {\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var top=this.ChartBorder.GetTop();\\r\\n        var width=this.ChartBorder.GetWidth();\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,width,height);\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n            return 0;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.PtInFrameBorder=function(x,y)\\r\\n    {\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.ZoomUp=function()  //放大\\r\\n    {\\r\\n        var xRange=this.VerticalRange;\\r\\n        var differ=xRange.Differ;\\r\\n        var minDiffer=xRange.MaxDiffer*this.MinZoom;\\r\\n        if (differ<minDiffer) return false;\\r\\n\\r\\n        var offsetDiffer=xRange.Differ*xRange.Step;\\r\\n        differ-=offsetDiffer;\\r\\n        xRange.Differ=differ;\\r\\n        xRange.Min=xRange.Center-xRange.Differ;\\r\\n        xRange.Max=xRange.Center+xRange.Differ;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ZoomDown=function() //缩小\\r\\n    {\\r\\n        var xRange=this.VerticalRange;\\r\\n        var differ=xRange.Differ;\\r\\n        if (differ==xRange.MaxDiffer) return false;\\r\\n\\r\\n        var offsetDiffer=xRange.Differ*xRange.Step;\\r\\n        differ+=offsetDiffer;\\r\\n        if (differ>xRange.MaxDiffer) differ=xRange.MaxDiffer;\\r\\n\\r\\n        xRange.Differ=differ;\\r\\n        xRange.Min=xRange.Center-xRange.Differ;\\r\\n        xRange.Max=xRange.Center+xRange.Differ;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\nfunction SimpleChartFrame()\\r\\n{\\r\\n    this.newMethod=AverageWidthFrame;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ScreenImageData;                   //截图\\r\\n    this.Position;                          //画布的位置\\r\\n\\r\\n    this.DrawFrame=function()\\r\\n    {\\r\\n        if (this.XPointCount>0)\\r\\n        {\\r\\n            let dInterval=this.ChartBorder.GetWidth()/(6*this.XPointCount); //分6份, 数据4 间距2\\r\\n            this.DistanceWidth=2*dInterval;\\r\\n            this.DataWidth=4*dInterval;\\r\\n        }\\r\\n\\r\\n        this.SplitXYCoordinate();\\r\\n        this.DrawHorizontal();\\r\\n        this.DrawVertical();\\r\\n    }\\r\\n\\r\\n    this.GetXFromIndex=function(index)\\r\\n    {\\r\\n        if (index < 0) index = 0;\\r\\n        if (index > this.xPointCount - 1) index = this.xPointCount - 1;\\r\\n\\r\\n        var offset=this.ChartBorder.GetLeft()+2+this.DistanceWidth/2+this.DataWidth/2;\\r\\n        for(var i=1;i<=index;++i)\\r\\n        {\\r\\n            offset+=this.DistanceWidth+this.DataWidth;\\r\\n        }\\r\\n\\r\\n        return offset;\\r\\n    }\\r\\n\\r\\n    //分割x,y轴坐标信息\\r\\n    this.SplitXYCoordinate=function()\\r\\n    {\\r\\n        if (this.XYSplit==false) return;\\r\\n        if (this.YSplitOperator!=null) this.YSplitOperator.Operator();\\r\\n        if (this.XSplitOperator!=null) this.XSplitOperator.Operator();\\r\\n    }\\r\\n\\r\\n    //图形快照\\r\\n    this.Snapshot=function()\\r\\n    {\\r\\n        this.ScreenImageData=this.Canvas.getImageData(0,0,this.ChartBorder.GetChartWidth(),this.ChartBorder.GetChartHeight());\\r\\n    }\\r\\n\\r\\n    this.SetSizeChage=function(sizeChange)\\r\\n    {\\r\\n        this.SizeChange=sizeChange;\\r\\n\\r\\n        //画布的位置\\r\\n        this.Position={\\r\\n            X:this.ChartBorder.UIElement.offsetLeft,\\r\\n            Y:this.ChartBorder.UIElement.offsetTop,\\r\\n            W:this.ChartBorder.UIElement.clientWidth,\\r\\n            H:this.ChartBorder.UIElement.clientHeight\\r\\n        };\\r\\n    }\\r\\n\\r\\n    this.SetDrawDepthMap=function(callback)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.PtInFrame=function(x,y)    //鼠标哪个指标窗口\\r\\n    {\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var top=this.ChartBorder.GetTop();\\r\\n        var width=this.ChartBorder.GetWidth();\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,width,height);\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n            return 0;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.PtInFrameBorder=function(x,y)\\r\\n    {\\r\\n        return null;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//历史K线数据\\r\\nfunction HistoryData()\\r\\n{\\r\\n    this.Date;\\r\\n    this.YClose;\\r\\n    this.Open;\\r\\n    this.Close;\\r\\n    this.High;\\r\\n    this.Low;\\r\\n    this.Vol;\\r\\n    this.Amount;\\r\\n    this.Time;      //mmhh 或者 mmhhss\\r\\n    this.FlowCapital=0;   //流通股本\\r\\n    this.Position=null;   //持仓量\\r\\n\\r\\n    //期货\\r\\n    this.YFClose=null;   //前结算价\\r\\n    this.FClose=null;    //结算价\\r\\n\\r\\n    //指数才有的数据\\r\\n    this.Stop;  //停牌家数\\r\\n    this.Up;    //上涨\\r\\n    this.Down;  //下跌\\r\\n    this.Unchanged; //平盘\\r\\n\\r\\n    this.ExtendData;    //扩展数据\\r\\n\\r\\n    this.BFactor;   //前复权\\r\\n    this.AFactor;   //后复权\\r\\n}\\r\\n\\r\\n//数据复制\\r\\nHistoryData.Copy=function(data)\\r\\n{\\r\\n    var newData=new HistoryData();\\r\\n\\r\\n    newData.Date=data.Date;\\r\\n    if (IFrameSplitOperator.IsNumber(data.Time)) newData.Time=data.Time;\\r\\n\\r\\n    newData.YClose=data.YClose;\\r\\n    newData.Open=data.Open;\\r\\n    newData.Close=data.Close;\\r\\n    newData.High=data.High;\\r\\n    newData.Low=data.Low;\\r\\n    newData.Vol=data.Vol;\\r\\n    newData.Amount=data.Amount;\\r\\n\\r\\n    if (IFrameSplitOperator.IsNumber(data.FlowCapital)) newData.FlowCapital=data.FlowCapital;\\r\\n    if (IFrameSplitOperator.IsNumber(data.Position)) newData.Position=data.Position;\\r\\n    if (IFrameSplitOperator.IsNumber(data.YFClose)) newData.YFClose=data.YFClose;\\r\\n    if (IFrameSplitOperator.IsNumber(data.FClose)) newData.FClose=data.FClose;\\r\\n\\r\\n    //指数涨停家数\\r\\n    if (IFrameSplitOperator.IsNumber(data.Stop)) newData.Stop=data.Stop;\\r\\n    if (IFrameSplitOperator.IsNumber(data.Up)) newData.Up=data.Up;\\r\\n    if (IFrameSplitOperator.IsNumber(data.Down)) newData.Down=data.Down;\\r\\n    if (IFrameSplitOperator.IsNumber(data.Unchanged)) newData.Unchanged=data.Unchanged;\\r\\n\\r\\n    //复权因子\\r\\n    if (IFrameSplitOperator.IsNumber(data.BFactor)) newData.BFactor=data.BFactor;\\r\\n    if (IFrameSplitOperator.IsNumber(data.AFactor)) newData.AFactor=data.AFactor;\\r\\n\\r\\n    return newData;\\r\\n}\\r\\n\\r\\n//把数据 src 复制到 dest中\\r\\nHistoryData.CopyTo=function(dest,src)\\r\\n{\\r\\n    dest.Date=src.Date;\\r\\n    if (IFrameSplitOperator.IsNumber(src.Time)) dest.Time=src.Time;\\r\\n\\r\\n    dest.YClose=src.YClose;\\r\\n    dest.Open=src.Open;\\r\\n    dest.Close=src.Close;\\r\\n    dest.High=src.High;\\r\\n    dest.Low=src.Low;\\r\\n    dest.Vol=src.Vol;\\r\\n    dest.Amount=src.Amount;\\r\\n\\r\\n    if (IFrameSplitOperator.IsNumber(src.FlowCapital)) dest.FlowCapital=src.FlowCapital;\\r\\n    if (IFrameSplitOperator.IsNumber(src.Position)) dest.Position=src.Position;\\r\\n    if (IFrameSplitOperator.IsNumber(src.YFClose)) dest.YFClose=src.YFClose;\\r\\n    if (IFrameSplitOperator.IsNumber(src.FClose)) dest.FClose=src.FClose;\\r\\n\\r\\n    if (IFrameSplitOperator.IsNumber(src.Stop)) dest.Stop=src.Stop;\\r\\n    if (IFrameSplitOperator.IsNumber(src.Up)) dest.Up=src.Up;\\r\\n    if (IFrameSplitOperator.IsNumber(src.Down)) dest.Down=src.Down;\\r\\n    if (IFrameSplitOperator.IsNumber(src.Unchanged)) dest.Unchanged=src.Unchanged;\\r\\n\\r\\n    if (IFrameSplitOperator.IsNumber(src.BFactor)) dest.BFactor=src.BFactor;\\r\\n    if (IFrameSplitOperator.IsNumber(src.AFactor)) dest.AFactor=src.AFactor;\\r\\n}\\r\\n\\r\\n//数据复权拷贝\\r\\nHistoryData.CopyRight=function(data,seed)\\r\\n{\\r\\n    var newData=new HistoryData();\\r\\n    newData.Date=data.Date;\\r\\n    newData.YClose=data.YClose*seed;\\r\\n    newData.Open=data.Open*seed;\\r\\n    newData.Close=data.Close*seed;\\r\\n    newData.High=data.High*seed;\\r\\n    newData.Low=data.Low*seed;\\r\\n\\r\\n    newData.Vol=data.Vol;\\r\\n    newData.Amount=data.Amount;\\r\\n    newData.FlowCapital=data.FlowCapital;\\r\\n    newData.Position=data.Position;\\r\\n    newData.YFClose=data.YFClose;\\r\\n    newData.FClose=data.FClose;\\r\\n\\r\\n    return newData;\\r\\n}\\r\\n\\r\\nfunction MinuteData()\\r\\n{\\r\\n    this.Close;\\r\\n    this.Open;\\r\\n    this.High;\\r\\n    this.Low;\\r\\n    this.Vol;           //量\\r\\n    this.Amount;        //金额\\r\\n    this.DateTime;\\r\\n    this.Increase;      //涨幅\\r\\n    this.Risefall;      //涨跌\\r\\n    this.AvPrice;       //均价\\r\\n    this.Lead=null;     //领先指标\\r\\n    this.Time;          //时间\\r\\n    this.Date;              //日期\\r\\n    this.Position=null;     //持仓量\\r\\n    this.YClearing;         //昨结算价\\r\\n}\\r\\n\\r\\n//盘前集合竞价\\r\\nfunction BeforeOpenData()\\r\\n{\\r\\n    this.Time;\\r\\n    this.Date;\\r\\n    this.Price;     //匹配的价格\\r\\n    this.AvPrice;   //均价\\r\\n    this.Vol=[];    //[0]=匹配量 [1]=未匹配量\\r\\n    this.ColorID;   //0=平盘 1=红 2=绿  3 ...自定义颜色\\r\\n}\\r\\n\\r\\n//收盘集合竞价\\r\\nfunction AfterCloseData()\\r\\n{\\r\\n    this.Time;\\r\\n    this.Date;\\r\\n    this.Price;     //匹配的价格\\r\\n    this.AvPrice;   //均价\\r\\n    this.Vol=[];    //[0]=匹配量 [1]=未匹配量\\r\\n    this.ColorID;   //0=平盘 1=红 2=绿  3 ...自定义颜色\\r\\n}\\r\\n\\r\\n//单指标数据\\r\\nfunction SingleData()\\r\\n{\\r\\n    this.Date;  //日期\\r\\n    this.Time;  //时间\\r\\n    this.Value; //数据  (可以是一个数组)\\r\\n}\\r\\n\\r\\nvar KLINE_INFO_TYPE=\\r\\n    {\\r\\n        INVESTOR:1,         //互动易\\r\\n        ANNOUNCEMENT:2,     //公告\\r\\n        PFORECAST:3,        //业绩预告\\r\\n\\r\\n        ANNOUNCEMENT_QUARTER_1:4,   //一季度报\\r\\n        ANNOUNCEMENT_QUARTER_2:5,   //半年报\\r\\n        ANNOUNCEMENT_QUARTER_3:6,   //2季度报\\r\\n        ANNOUNCEMENT_QUARTER_4:7,   //年报\\r\\n\\r\\n        RESEARCH:8,                 //调研\\r\\n        BLOCKTRADING:9,             //大宗交易\\r\\n        TRADEDETAIL:10,              //龙虎榜\\r\\n\\r\\n        //公告预留类型\\r\\n        ANNOUNCEMENT_EX_START:100,\\r\\n        ANNOUNCEMENT_EX_END:200,\\r\\n    }\\r\\n\\r\\nfunction KLineInfoData()\\r\\n{\\r\\n    this.ID;\\r\\n    this.Date;\\r\\n    this.Title;\\r\\n    this.InfoType;\\r\\n    this.ExtendData;    //扩展数据\\r\\n}\\r\\n\\r\\n//外部数据计算方法接口\\r\\nfunction DataPlus ()\\r\\n{\\r\\n    this.PeriodCallback=new Map();\\r\\n\\r\\n    this.GetPeriodCallback=function(period)\\r\\n    {\\r\\n        if (!this.PeriodCallback.has(period)) return null;\\r\\n\\r\\n        return this.PeriodCallback.get(period);\\r\\n    }\\r\\n\\r\\n    this.AddPeriodCallback=function(obj)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(obj.Period) || !obj.Callback) return;\\r\\n\\r\\n        var item={ Period:obj.Period, Callback:obj.Callback };\\r\\n        this.PeriodCallback.set(obj.Period, item);\\r\\n    }\\r\\n\\r\\n    this.RemovePeriodCallback=function(obj)\\r\\n    {\\r\\n        if (!this.PeriodCallback.has(obj.ID)) return;\\r\\n        this.PeriodCallback.delete(obj.ID);\\r\\n    }\\r\\n};\\r\\n\\r\\nDataPlus.GetMinutePeriodData=null;\\r\\n\\r\\nvar g_DataPlus=new DataPlus();\\r\\n\\r\\n/*\\r\\nDataPlus.GetMinutePeriodData=function(period,data,self)\\r\\n{\\r\\n\\r\\n}\\r\\n*/\\r\\n\\r\\nfunction ChartData()\\r\\n{\\r\\n    this.Data=new Array();\\r\\n    this.DataOffset=0;                        //数据偏移\\r\\n    this.Period=0;                            //周期 0 日线 1 周线 2 月线 3年线\\r\\n    this.Right=0;                             //复权 0 不复权 1 前复权 2 后复权\\r\\n    this.Symbol;                              //股票代码\\r\\n\\r\\n    this.Data2=new Array();                   //第1组数据 走势图:历史分钟数据\\r\\n\\r\\n    this.GetCloseMA=function(dayCount)\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for (var i = 0, len = this.Data.length; i < len; i++)\\r\\n        {\\r\\n            if (i < dayCount)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var sum = 0;\\r\\n            for (var j = 0; j < dayCount; j++)\\r\\n            {\\r\\n                sum += this.Data[i - j].Close;\\r\\n            }\\r\\n            result[i]=sum / dayCount;\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetVolMA=function(dayCount)\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for (var i = 0, len = this.Data.length; i < len; i++)\\r\\n        {\\r\\n            if (i < dayCount)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var sum = 0;\\r\\n            for (var j = 0; j < dayCount; j++)\\r\\n            {\\r\\n                sum += this.Data[i - j].Vol;\\r\\n            }\\r\\n            result[i]=sum / dayCount;\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetAmountMA=function(dayCount)\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for (var i = 0, len = this.Data.length; i < len; i++)\\r\\n        {\\r\\n            if (i < dayCount)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var sum = 0;\\r\\n            for (var j = 0; j < dayCount; j++)\\r\\n            {\\r\\n                sum += this.Data[i - j].Amount;\\r\\n            }\\r\\n            result[i]=sum / dayCount;\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //获取收盘价\\r\\n    this.GetClose=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Close;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetYClose=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].YClose;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetHigh=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].High;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetLow=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Low;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetOpen=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Open;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetVol=function(unit)\\r\\n    {\\r\\n        var value=1;\\r\\n        if (IFrameSplitOperator.IsNumber(unit)>0) value=unit;\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Vol/value;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetAmount=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Amount;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetPosition=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Position;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetSettlementPrice=function()  //结算价\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].FClose;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetIsEqual=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            result[i]=(item.Close==item.Open? 1:0);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetIsUp=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            result[i]=(item.Close>item.Open? 1:0);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetIsDown=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            result[i]=(item.Close<item.Open? 1:0);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetLead=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Lead;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetDate=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Date;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetTime=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Time;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetUp=function()   //上涨家数\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Up;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetDown=function() //下跌家数\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].Down;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetYear=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=parseInt(this.Data[i].Date/10000);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetMonth=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=parseInt(this.Data[i].Date%10000/100);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //分时图均价\\r\\n    this.GetAvPrice=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var value=this.Data[i].AvPrice;\\r\\n            if (IFrameSplitOperator.IsNumber(value))\\r\\n                result[i]=value;\\r\\n            else\\r\\n                result[i]=0;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //获取数据日期和时间范围\\r\\n    this.GetDateRange=function()\\r\\n    {\\r\\n        if (!this.Data || this.Data.length<=0) return null;\\r\\n\\r\\n        var start=this.Data[0];\\r\\n        var end=this.Data[this.Data.length-1];\\r\\n        var range={ Start:{Date:start.Date}, End:{Date:end.Date} };\\r\\n        if (IFrameSplitOperator.IsNumber(start.Time)) range.Start.Time=start.Time;\\r\\n        if (IFrameSplitOperator.IsNumber(end.Time)) range.End.Time=end.Time;\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    //计算分钟\\r\\n    this.GetMinutePeriodData=function(period)\\r\\n    {\\r\\n        if (DataPlus.GetMinutePeriodData) return DataPlus.GetMinutePeriodData(period,this.Data,this);\\r\\n\\r\\n        var result = new Array();\\r\\n        var periodDataCount = 5;\\r\\n        if (period == 5)\\r\\n            periodDataCount = 5;\\r\\n        else if (period == 6)\\r\\n            periodDataCount = 15;\\r\\n        else if (period == 7)\\r\\n            periodDataCount = 30;\\r\\n        else if (period == 8)\\r\\n            periodDataCount = 60;\\r\\n        else if (period==11)\\r\\n            periodDataCount=120;\\r\\n        else if (period==12)\\r\\n            periodDataCount=240;\\r\\n        else if (period>CUSTOM_MINUTE_PERIOD_START && period<=CUSTOM_MINUTE_PERIOD_END)\\r\\n        {\\r\\n            periodDataCount=period-CUSTOM_MINUTE_PERIOD_START;\\r\\n            return this.GetMinuteCustomPeriodData(periodDataCount);\\r\\n        }\\r\\n        else\\r\\n            return this.Data;\\r\\n        var bFirstPeriodData = false;\\r\\n        var newData = null;\\r\\n        var preTime=null;   //上一次的计算时间\\r\\n        for (var i = 0; i < this.Data.length; )\\r\\n        {\\r\\n            bFirstPeriodData = true;\\r\\n            for (var j = 0; j < periodDataCount && i < this.Data.length; ++i)\\r\\n            {\\r\\n                if (bFirstPeriodData)\\r\\n                {\\r\\n                    newData = new HistoryData();\\r\\n                    result.push(newData);\\r\\n                    bFirstPeriodData = false;\\r\\n                }\\r\\n                var minData = this.Data[i];\\r\\n                if (minData == null)\\r\\n                {\\r\\n                    ++j;\\r\\n                    continue;\\r\\n                }\\r\\n                if (minData.Time==925 && (preTime==null || preTime!=924))  //9：25, 9:30 不连续就不算个数\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else if (minData.Time == 930 && (preTime==null || preTime!=929) )\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else if (minData.Time == 1300 && (preTime==null || preTime!=1259) ) //1点的数据 如果不是连续的 就不算个数\\r\\n                {\\r\\n\\r\\n                }\\r\\n                else\\r\\n                    ++j;\\r\\n                newData.Date = minData.Date;\\r\\n                newData.Time = minData.Time;\\r\\n                preTime=newData.Time;\\r\\n                if (minData.Open==null || minData.Close==null)\\r\\n                    continue;\\r\\n                if (newData.Open==null || newData.Close==null)\\r\\n                {\\r\\n                    newData.Open=minData.Open;\\r\\n                    newData.High=minData.High;\\r\\n                    newData.Low=minData.Low;\\r\\n                    newData.YClose=minData.YClose;\\r\\n                    newData.Close=minData.Close;\\r\\n                    newData.Vol=minData.Vol;\\r\\n                    newData.Amount=minData.Amount;\\r\\n                    newData.FlowCapital=minData.FlowCapital;\\r\\n                    newData.Position=minData.Position;\\r\\n                    newData.YFClose=minData.YFClose;\\r\\n                    newData.FClose=minData.FClose;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (newData.High<minData.High)\\r\\n                        newData.High=minData.High;\\r\\n                    if (newData.Low>minData.Low)\\r\\n                        newData.Low=minData.Low;\\r\\n                    newData.Close=minData.Close;\\r\\n                    newData.Vol+=minData.Vol;\\r\\n                    if (minData.Amount!=null) newData.Amount+=minData.Amount;\\r\\n                    newData.Position=minData.Position;\\r\\n                    newData.FlowCapital=minData.FlowCapital;\\r\\n                    newData.FClose=minData.FClose;\\r\\n                }\\r\\n\\r\\n                if (i+1 < this.Data.length) //判断下一个数据是否是不同日期的\\r\\n                {\\r\\n                    var nextItem=this.Data[i+1];\\r\\n                    if (nextItem && nextItem.Date!=minData.Date)    //不同日期的, 周期结束\\r\\n                    {\\r\\n                        ++i;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //自定义分钟\\r\\n    this.GetMinuteCustomPeriodData=function(count)\\r\\n    {\\r\\n        var result = new Array();\\r\\n        var periodDataCount = count;\\r\\n        var bFirstPeriodData = false;\\r\\n        var newData = null;\\r\\n        for (var i = 0; i < this.Data.length; )\\r\\n        {\\r\\n            bFirstPeriodData = true;\\r\\n            for (var j = 0; j < periodDataCount && i < this.Data.length; ++i, ++j)\\r\\n            {\\r\\n                if (bFirstPeriodData)\\r\\n                {\\r\\n                    newData = new HistoryData();\\r\\n                    result.push(newData);\\r\\n                    bFirstPeriodData = false;\\r\\n                }\\r\\n                var minData = this.Data[i];\\r\\n                if (minData == null) continue;\\r\\n\\r\\n                newData.Date = minData.Date;\\r\\n                newData.Time = minData.Time;\\r\\n                if (minData.Open==null || minData.Close==null) continue;\\r\\n                if (newData.Open==null || newData.Close==null)\\r\\n                {\\r\\n                    newData.Open=minData.Open;\\r\\n                    newData.High=minData.High;\\r\\n                    newData.Low=minData.Low;\\r\\n                    newData.YClose=minData.YClose;\\r\\n                    newData.Close=minData.Close;\\r\\n                    newData.Vol=minData.Vol;\\r\\n                    newData.Amount=minData.Amount;\\r\\n                    newData.FlowCapital=minData.FlowCapital;\\r\\n                    newData.Position=minData.Position;\\r\\n                    newData.YFClose=minData.YFClose;\\r\\n                    newData.FClose=minData.FClose;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (newData.High<minData.High)  newData.High=minData.High;\\r\\n                    if (newData.Low>minData.Low) newData.Low=minData.Low;\\r\\n                    newData.Close=minData.Close;\\r\\n                    newData.Vol+=minData.Vol;\\r\\n                    if (minData.Amount!=null) newData.Amount+=minData.Amount;   //null数据不相加\\r\\n                    newData.Position=minData.Position;\\r\\n                    newData.FlowCapital=minData.FlowCapital;\\r\\n                    newData.FClose=minData.FClose;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n    //计算周,月,年\\r\\n    this.GetDayPeriodData=function(period)\\r\\n    {\\r\\n        if (period>CUSTOM_DAY_PERIOD_START && period<=CUSTOM_DAY_PERIOD_END)\\r\\n            return this.GetDayCustomPeriodData(period-CUSTOM_DAY_PERIOD_START);\\r\\n\\r\\n        var isBit=MARKET_SUFFIX_NAME.IsBIT(this.Symbol);\\r\\n\\r\\n        var result=new Array();\\r\\n        var index=0;\\r\\n        var startDate=0;\\r\\n        var weekCount=2;\\r\\n        var newData=null;\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var isNewData=false;\\r\\n            var dayData=this.Data[i];\\r\\n\\r\\n            switch(period)\\r\\n            {\\r\\n                case 1: //周线\\r\\n                    if (isBit)  var fridayDate=ChartData.GetSunday(dayData.Date); //数字货币全年的\\r\\n                    else var fridayDate=ChartData.GetFirday(dayData.Date);\\r\\n\\r\\n                    if (fridayDate!=startDate)\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=fridayDate;\\r\\n                    }\\r\\n                    break;\\r\\n                case 21: //双周\\r\\n                    if (isBit)  var fridayDate=ChartData.GetSunday(dayData.Date); //数字货币全年的\\r\\n                    else var fridayDate=ChartData.GetFirday(dayData.Date);\\r\\n\\r\\n                    if (fridayDate!=startDate)\\r\\n                    {\\r\\n                        ++weekCount;\\r\\n                        if (weekCount>=2)\\r\\n                        {\\r\\n                            isNewData=true;\\r\\n                            weekCount=0;\\r\\n                        }\\r\\n                        startDate=fridayDate;\\r\\n                    }\\r\\n                    break;\\r\\n                case 2: //月线\\r\\n                    if (parseInt(dayData.Date/100)!=parseInt(startDate/100))\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=dayData.Date;\\r\\n                    }\\r\\n                    break;\\r\\n                case 3: //年线\\r\\n                    if (parseInt(dayData.Date/10000)!=parseInt(startDate/10000))\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=dayData.Date;\\r\\n                    }\\r\\n                    break;\\r\\n                case 22://半年:\\r\\n                    var halfYear=ChartData.GetHalfYear(dayData.Date);\\r\\n                    if (halfYear!=startDate)\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=halfYear;\\r\\n                    }\\r\\n                    break;\\r\\n                case 9: //季线\\r\\n                    var now=ChartData.GetQuarter(dayData.Date);\\r\\n                    now=parseInt(dayData.Date/10000)*10+now;\\r\\n                    var last=ChartData.GetQuarter(startDate);\\r\\n                    last=parseInt(startDate/10000)*10+last;\\r\\n                    if (now!=last)\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=dayData.Date;\\r\\n                    }\\r\\n                    break;\\r\\n            }\\r\\n\\r\\n            if (isNewData)\\r\\n            {\\r\\n                newData=new HistoryData();\\r\\n                newData.Date=dayData.Date;\\r\\n                result.push(newData);\\r\\n\\r\\n                if (dayData.Open==null || dayData.Close==null) continue;\\r\\n\\r\\n                newData.Open=dayData.Open;\\r\\n                newData.High=dayData.High;\\r\\n                newData.Low=dayData.Low;\\r\\n                newData.YClose=dayData.YClose;\\r\\n                newData.Close=dayData.Close;\\r\\n                newData.Vol=dayData.Vol;\\r\\n                newData.Amount=dayData.Amount;\\r\\n                newData.FlowCapital=dayData.FlowCapital;\\r\\n                newData.Position=dayData.Position;\\r\\n                newData.YFClose=dayData.YFClose;\\r\\n                newData.FClose=dayData.FClose;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (newData==null) continue;\\r\\n                if (dayData.Open==null || dayData.Close==null) continue;\\r\\n\\r\\n                if (newData.Open==null || newData.Close==null)\\r\\n                {\\r\\n                    newData.Open=dayData.Open;\\r\\n                    newData.High=dayData.High;\\r\\n                    newData.Low=dayData.Low;\\r\\n                    newData.YClose=dayData.YClose;\\r\\n                    newData.Close=dayData.Close;\\r\\n                    newData.Vol=dayData.Vol;\\r\\n                    newData.Amount=dayData.Amount;\\r\\n                    newData.FlowCapital=dayData.FlowCapital;\\r\\n                    newData.Position=dayData.Position;\\r\\n                    newData.YFClose=dayData.YFClose;\\r\\n                    newData.FClose=dayData.FClose;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (newData.High<dayData.High) newData.High=dayData.High;\\r\\n                    if (newData.Low>dayData.Low) newData.Low=dayData.Low;\\r\\n\\r\\n                    newData.Close=dayData.Close;\\r\\n                    newData.Vol+=dayData.Vol;\\r\\n                    if (dayData.Amount!=null) newData.Amount+=dayData.Amount;\\r\\n                    newData.Position=dayData.Position;\\r\\n                    newData.FlowCapital=dayData.FlowCapital;\\r\\n                    newData.Date=dayData.Date;\\r\\n                    newData.FClose=dayData.FClose;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetDayCustomPeriodData=function(count)\\r\\n    {\\r\\n        var result = [];\\r\\n        var periodDataCount = count;\\r\\n        var bFirstPeriodData = false;\\r\\n        var newData = null;\\r\\n        for (var i = 0; i < this.Data.length; )\\r\\n        {\\r\\n            bFirstPeriodData = true;\\r\\n            for (var j = 0; j < periodDataCount && i < this.Data.length; ++i, ++j)\\r\\n            {\\r\\n                if (bFirstPeriodData)\\r\\n                {\\r\\n                    newData = new HistoryData();\\r\\n                    result.push(newData);\\r\\n                    bFirstPeriodData = false;\\r\\n                }\\r\\n                var dayData = this.Data[i];\\r\\n                if (dayData == null) continue;\\r\\n\\r\\n                newData.Date = dayData.Date;\\r\\n\\r\\n                if (dayData.Open==null || dayData.Close==null) continue;\\r\\n                if (newData.Open==null || newData.Close==null)\\r\\n                {\\r\\n                    newData.Open=dayData.Open;\\r\\n                    newData.High=dayData.High;\\r\\n                    newData.Low=dayData.Low;\\r\\n                    newData.YClose=dayData.YClose;\\r\\n                    newData.Close=dayData.Close;\\r\\n                    newData.Vol=dayData.Vol;\\r\\n                    newData.Amount=dayData.Amount;\\r\\n                    newData.FlowCapital=dayData.FlowCapital;\\r\\n                    newData.Position=dayData.Position;\\r\\n                    newData.YFClose=dayData.YFClose;\\r\\n                    newData.FClose=dayData.FClose;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (newData.High<dayData.High)  newData.High=dayData.High;\\r\\n                    if (newData.Low>dayData.Low) newData.Low=dayData.Low;\\r\\n                    newData.Close=dayData.Close;\\r\\n                    newData.Vol+=dayData.Vol;\\r\\n                    if (dayData.Amount!=null) newData.Amount+=dayData.Amount;\\r\\n                    newData.Position=dayData.Position;\\r\\n                    newData.FlowCapital=dayData.FlowCapital;\\r\\n                    newData.FClose=dayData.FClose;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //周期数据 1=周 2=月 3=年\\r\\n    this.GetPeriodData=function(period)\\r\\n    {\\r\\n        //外部自定义周期计算函数\\r\\n        var itemCallback=g_DataPlus.GetPeriodCallback(period);\\r\\n        if (itemCallback) return itemCallback.Callback(period,this.Data,this);\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsBIT(this.Symbol))\\r\\n        {\\r\\n            if (period==5 || period==6 || period==7 || period==8 || (period>CUSTOM_MINUTE_PERIOD_START && period<=CUSTOM_MINUTE_PERIOD_END)) //分钟K线\\r\\n            {\\r\\n                var periodDataCount = 5;\\r\\n                if (period == 5)\\r\\n                    periodDataCount = 5;\\r\\n                else if (period == 6)\\r\\n                    periodDataCount = 15;\\r\\n                else if (period == 7)\\r\\n                    periodDataCount = 30;\\r\\n                else if (period == 8)\\r\\n                    periodDataCount = 60;\\r\\n                else if (period==11)\\r\\n                    periodDataCount = 120;\\r\\n                else if (period==12)\\r\\n                    periodDataCount = 240;\\r\\n                else if (period>CUSTOM_MINUTE_PERIOD_START && period<=CUSTOM_MINUTE_PERIOD_END)\\r\\n                    periodDataCount=period-CUSTOM_MINUTE_PERIOD_START;\\r\\n\\r\\n                return this.GetMinuteCustomPeriodData(periodDataCount);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //if (period==1 || period==2 || period==3 || period==9 || period==21 || period==22 || (period>CUSTOM_DAY_PERIOD_START && period<=CUSTOM_DAY_PERIOD_END))\\r\\n        if (ChartData.IsDayPeriod(period,false)) return this.GetDayPeriodData(period);\\r\\n\\r\\n        //if (period==5 || period==6 || period==7 || period==8 || period==11 || period==12 || (period>CUSTOM_MINUTE_PERIOD_START && period<=CUSTOM_MINUTE_PERIOD_END)) return this.GetMinutePeriodData(period);\\r\\n        if (ChartData.IsMinutePeriod(period,false)) return this.GetMinutePeriodData(period);\\r\\n    }\\r\\n\\r\\n    //复权  0 不复权 1 前复权 2 后复权\\r\\n    this.GetRightData=function(right, option)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (this.Data.length<=0) return result;\\r\\n\\r\\n        if (option && option.AlgorithmType==1)  //使用复权因子计算\\r\\n        {\\r\\n            for(var i=0;i<this.Data.length;++i)\\r\\n            {\\r\\n                var item=this.Data[i];\\r\\n                var seed=(right==1?item.BFactor:item.AFactor);\\r\\n                result[i]=HistoryData.CopyRight(item,seed);\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (right==1)\\r\\n        {\\r\\n            var index=this.Data.length-1;\\r\\n            var seed=1; //复权系数\\r\\n            var yClose=this.Data[index].YClose;\\r\\n\\r\\n            result[index]=HistoryData.Copy(this.Data[index]);\\r\\n\\r\\n            for(--index; index>=0; --index)\\r\\n            {\\r\\n                if (yClose!=this.Data[index].Close) break;\\r\\n                result[index]=HistoryData.Copy(this.Data[index]);\\r\\n                yClose=this.Data[index].YClose;\\r\\n            }\\r\\n\\r\\n            for(; index>=0; --index)\\r\\n            {\\r\\n                var value=this.Data[index].Close;\\r\\n                if(yClose!=value && value!=0)\\r\\n                    seed *= yClose/value;\\r\\n\\r\\n                result[index]=HistoryData.CopyRight(this.Data[index],seed);\\r\\n\\r\\n                yClose=this.Data[index].YClose;\\r\\n            }\\r\\n        }\\r\\n        else if (right==2)\\r\\n        {\\r\\n            var index=0;\\r\\n            var seed=1;\\r\\n            var close=this.Data[index].Close;\\r\\n            result[index]=HistoryData.Copy(this.Data[index]);\\r\\n\\r\\n            for(++index;index<this.Data.length;++index)\\r\\n            {\\r\\n                if (close!=this.Data[index].YClose) break;\\r\\n                result[index]=HistoryData.Copy(this.Data[index]);\\r\\n                close=this.Data[index].Close;\\r\\n            }\\r\\n\\r\\n            for(;index<this.Data.length;++index)\\r\\n            {\\r\\n                if(close!=this.Data[index].YClose)\\r\\n                    seed *= close/this.Data[index].YClose;\\r\\n\\r\\n                result[index]=HistoryData.CopyRight(this.Data[index],seed);\\r\\n\\r\\n                close=this.Data[index].Close;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetRightDate=this.GetRightData;\\r\\n\\r\\n    //叠加数据和主数据拟合,去掉主数据没有日期的数据\\r\\n    this.GetOverlayData=function(overlayData, bApiPeriod)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j>=overlayData.length)\\r\\n            {\\r\\n                result[i]=new HistoryData();\\r\\n                result[i].Date=date;\\r\\n                ++i;\\r\\n                continue;;\\r\\n            }\\r\\n\\r\\n            var overlayDate=overlayData[j].Date;\\r\\n\\r\\n            if (overlayDate==date)\\r\\n            {\\r\\n                result[i]=new HistoryData();\\r\\n                result[i].Date=overlayData[j].Date;\\r\\n                result[i].YClose=overlayData[j].YClose;\\r\\n                result[i].Open=overlayData[j].Open;\\r\\n                result[i].High=overlayData[j].High;\\r\\n                result[i].Low=overlayData[j].Low;\\r\\n                result[i].Close=overlayData[j].Close;\\r\\n                result[i].Vol=overlayData[j].Vol;\\r\\n                result[i].Amount=overlayData[j].Amount;\\r\\n\\r\\n                //涨跌家数数据\\r\\n                result[i].Stop=overlayData[j].Stop;\\r\\n                result[i].Up=overlayData[j].Up;\\r\\n                result[i].Down=overlayData[j].Down;\\r\\n                result[i].Unchanged=overlayData[j].Unchanged;\\r\\n\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (overlayDate<date)\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=new HistoryData();\\r\\n                result[i].Date=date;\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetOverlayMinuteData=function(overlayData, bApiPeriod)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n\\r\\n            if (j>=overlayData.length)\\r\\n            {\\r\\n                result[i]=new HistoryData();\\r\\n                result[i].Date=date;\\r\\n                result[i].Time=time;\\r\\n                ++i;\\r\\n                continue;;\\r\\n            }\\r\\n\\r\\n            var overlayDate=overlayData[j].Date;\\r\\n            var overlayTime=overlayData[j].Time;\\r\\n\\r\\n            if (overlayDate==date && overlayTime==time)\\r\\n            {\\r\\n                result[i]=new HistoryData();\\r\\n                result[i].Date=overlayData[j].Date;\\r\\n                result[i].Time=overlayData[j].Time;\\r\\n                result[i].YClose=overlayData[j].YClose;\\r\\n                result[i].Open=overlayData[j].Open;\\r\\n                result[i].High=overlayData[j].High;\\r\\n                result[i].Low=overlayData[j].Low;\\r\\n                result[i].Close=overlayData[j].Close;\\r\\n                result[i].Vol=overlayData[j].Vol;\\r\\n                result[i].Amount=overlayData[j].Amount;\\r\\n\\r\\n                //涨跌家数数据\\r\\n                result[i].Stop=overlayData[j].Stop;\\r\\n                result[i].Up=overlayData[j].Up;\\r\\n                result[i].Down=overlayData[j].Down;\\r\\n                result[i].Unchanged=overlayData[j].Unchanged;\\r\\n\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (overlayDate<date || (overlayDate==date && overlayTime<time))\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=new HistoryData();\\r\\n                result[i].Date=date;\\r\\n                result[i].Time=time;\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n        技术指标数据方法\\r\\n    */\\r\\n    //以主图数据 拟合,返回 SingleData 数组\\r\\n    this.GetFittingData=function(overlayData)\\r\\n    {\\r\\n        var result=new Array();\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j>=overlayData.length)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                ++i;\\r\\n                continue;;\\r\\n            }\\r\\n\\r\\n            var overlayDate=overlayData[j].Date;\\r\\n\\r\\n            if (overlayDate==date)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=overlayData[j].Date;\\r\\n                item.Value=overlayData[j].Value;\\r\\n                result[i]=item;\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (overlayDate<date)\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=new SingleData();\\r\\n                result[i].Date=date;\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    // 缺省数据使用 emptyValue填充\\r\\n    this.GetFittingData2=function(overlayData,emptyValue)\\r\\n    {\\r\\n        var result=new Array();\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j>=overlayData.length)\\r\\n            {\\r\\n                result[i]=new SingleData();\\r\\n                result[i].Date=date;\\r\\n                result[i].Value=emptyValue;\\r\\n                ++i;\\r\\n                continue;;\\r\\n            }\\r\\n\\r\\n            var overlayDate=overlayData[j].Date;\\r\\n\\r\\n            if (overlayDate==date)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=overlayData[j].Date;\\r\\n                item.Value=overlayData[j].Value;\\r\\n                result[i]=item;\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (overlayDate<date)\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=new SingleData();\\r\\n                result[i].Date=date;\\r\\n                result[i].Value=emptyValue;\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //日期转化 对应数据索引\\r\\n    this.GetDateIndex=function(data)\\r\\n    {\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j>=data.length) break;\\r\\n\\r\\n            var dateItem=data[j];\\r\\n\\r\\n            if (dateItem.Date==date)\\r\\n            {\\r\\n                dateItem.Index=i;\\r\\n                ++j;\\r\\n            }\\r\\n            else if (dateItem.Date<date)\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //日期 时间转化 对应数据索引\\r\\n    this.GetDateTimeIndex=function(data)\\r\\n    {\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n\\r\\n            if (j>=data.length) break;\\r\\n\\r\\n            var dateTimeItem=data[j];\\r\\n\\r\\n            if (dateTimeItem.Date==date && dateTimeItem.Time==time)\\r\\n            {\\r\\n                dateTimeItem.Index=i;\\r\\n                ++j;\\r\\n            }\\r\\n            else if (dateTimeItem.Date<date || (dateTimeItem.Date==date && dateTimeItem.Time<time))\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //  分钟数据拟合\\r\\n    this.GetMinuteFittingData=function(overlayData)\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n\\r\\n            if (j>=overlayData.length)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                ++i;\\r\\n                continue;;\\r\\n            }\\r\\n\\r\\n            var overlayDate=overlayData[j].Date;\\r\\n            var overlayTime=overlayData[j].Time;\\r\\n            const overlayItem=overlayData[j];\\r\\n\\r\\n            if (overlayDate==date && overlayTime==time)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=overlayItem.Date;\\r\\n                item.Time=overlayItem.Time;\\r\\n                item.Value=overlayItem.Value;\\r\\n                result[i]=item;\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (overlayDate<date || (overlayDate==date && overlayTime<time))\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=date;\\r\\n                item.Time=time;\\r\\n                result[i]=item;\\r\\n                ++i;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n\\r\\n    //把财报数据拟合到主图数据,返回 SingleData 数组\\r\\n    this.GetFittingFinanceData=function(financeData)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j<financeData.length)\\r\\n            {\\r\\n                var fDate=financeData[j].Date;\\r\\n                if (date<fDate)\\r\\n                {\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (j+1<financeData.length)\\r\\n            {\\r\\n                if (financeData[j].Date<date && financeData[j+1].Date<=date)\\r\\n                {\\r\\n                    ++j;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new SingleData();\\r\\n            item.Date=date;\\r\\n            if (j<financeData.length)\\r\\n            {\\r\\n                item.Value=financeData[j].Value;\\r\\n                item.FinanceDate=financeData[j].Date;   //财务日期 调试用\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                item.Value=null;\\r\\n                item.FinanceDate=null;\\r\\n            }\\r\\n            result[i]=item;\\r\\n\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //财务数据拟合到分钟数据上 返回 SingleData 数组\\r\\n    this.GetMinuteFittingFinanceData=function(financeData)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!Array.isArray(financeData) || financeData.length<=0) return result;\\r\\n\\r\\n        var i=0;\\r\\n        var firstItem=financeData[0];\\r\\n        for(i=0;i<this.Data.length;++i)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n            if (date>firstItem.Date || (date==firstItem.Date && time>=firstItem.Time))\\r\\n            {\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n\\r\\n            if (j+1<financeData.length)\\r\\n            {\\r\\n                if ((financeData[j].Date<date && financeData[j+1].Date<=date) ||\\r\\n                    (financeData[j].Date==date && financeData[j].Time<time && financeData[j+1].Time<=time) )\\r\\n                {\\r\\n                    ++j;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new SingleData();\\r\\n            item.Date=date;\\r\\n            item.Time=time;\\r\\n            if (j<financeData.length)\\r\\n            {\\r\\n                item.Value=financeData[j].Value;\\r\\n                item.FinanceDate=financeData[j].Date;   //财务日期 调试用\\r\\n                item.FinanceTime=financeData[j].Time;   //财务日期 调试用\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                item.Value=null;\\r\\n                item.FinanceDate=null;\\r\\n                item.FinanceTime=null;\\r\\n            }\\r\\n            result[i]=item;\\r\\n\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //日线拟合交易数据, 不做平滑处理\\r\\n    this.GetFittingTradeData=function(tradeData, nullValue, bExactMatch)\\r\\n    {\\r\\n        var result=[];\\r\\n        var bMatch=false;\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j<tradeData.length)\\r\\n            {\\r\\n                if (tradeData[j].Date>date)\\r\\n                {\\r\\n                    var item=new SingleData();\\r\\n                    item.Date=date;\\r\\n                    item.Value=nullValue;\\r\\n                    result[i]=item;\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (j+1<tradeData.length)\\r\\n            {\\r\\n                if (tradeData[j].Date<date && tradeData[j+1].Date<=date)\\r\\n                {\\r\\n                    ++j;\\r\\n                    bMatch=false;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new SingleData();\\r\\n            item.Date=date;\\r\\n            item.Value=nullValue;\\r\\n            item.FinanceDate=null;\\r\\n            if (j<tradeData.length)\\r\\n            {\\r\\n                var tradeItem=tradeData[j];\\r\\n                if (this.Period==0 && bExactMatch===true) //日线完全匹配\\r\\n                {\\r\\n                    if (tradeItem.Date==item.Date)\\r\\n                    {\\r\\n                        item.Value=tradeItem.Value;\\r\\n                        item.FinanceDate=tradeItem.Date;   //财务日期 调试用\\r\\n                        bMatch=true;\\r\\n                    }\\r\\n                }\\r\\n                else    //其他日线周期\\r\\n                {\\r\\n                    if (bMatch==false)\\r\\n                    {\\r\\n                        item.Value=tradeItem.Value;\\r\\n                        item.FinanceDate=tradeItem.Date;   //财务日期 调试用\\r\\n                        bMatch=true;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            result[i]=item;\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetMinuteFittingTradeData=function(tradeData, nullValue,bExactMatch)\\r\\n    {\\r\\n        var result=[];\\r\\n        var bMatch=false;\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n\\r\\n            if (j<tradeData.length)\\r\\n            {\\r\\n                if (tradeData[j].Date>date || (tradeData[j].Date==date && tradeData[j].Time>time))\\r\\n                {\\r\\n                    var item=new SingleData();\\r\\n                    item.Date=date;\\r\\n                    item.Time=time;\\r\\n                    item.Value=nullValue;\\r\\n                    result[i]=item;\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (j+1<tradeData.length)\\r\\n            {\\r\\n                if ( (tradeData[j].Date<date && tradeData[j+1].Date<=date) ||\\r\\n                    (tradeData[j].Date==date && tradeData[j].Time<time && tradeData[j+1].Time<=time) )\\r\\n                {\\r\\n                    ++j;\\r\\n                    bMatch=false;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new SingleData();\\r\\n            item.Date=date;\\r\\n            item.FinanceDate=null;\\r\\n            item.Time=time;\\r\\n            item.Value=nullValue;\\r\\n            if (j<tradeData.length)\\r\\n            {\\r\\n                var tradeItem=tradeData[j];\\r\\n                if (this.Period==4 && bExactMatch===true) //1分钟线完全匹配\\r\\n                {\\r\\n                    if (tradeItem.Date==item.Date && tradeItem.Time==item.Time)  //完全匹配\\r\\n                    {\\r\\n                        item.Value=tradeItem.Value;\\r\\n                        item.FinanceDate=tradeItem.Date;   //财务日期 调试用\\r\\n                        item.FinanceTime=tradeItem.Time;\\r\\n                        bMatch=true;\\r\\n                    }\\r\\n                }\\r\\n                else    //其他日线周期\\r\\n                {\\r\\n                    if (bMatch==false)\\r\\n                    {\\r\\n                        item.Value=tradeItem.Value;\\r\\n                        item.FinanceDate=tradeItem.Date;   //财务日期 调试用\\r\\n                        item.FinanceTime=tradeItem.Time;\\r\\n                        bMatch=true;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            result[i]=item;\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //市值计算 financeData.Value 是股数\\r\\n    this.GetFittingMarketValueData=function(financeData)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var price=this.Data[i].Close;\\r\\n\\r\\n            if (j+1<financeData.length)\\r\\n            {\\r\\n                if (financeData[j].Date<date && financeData[j+1].Date<=date)\\r\\n                {\\r\\n                    ++j;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new SingleData();\\r\\n            item.Date=date;\\r\\n            item.Value=financeData[j].Value*price;  //市值计算 收盘价*股数\\r\\n            item.FinanceDate=financeData[j].Date;   //财务日期 调试用\\r\\n            result[i]=item;\\r\\n\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //月线数据拟合\\r\\n    this.GetFittingMonthData=function(overlayData)\\r\\n    {\\r\\n        var result=new Array();\\r\\n\\r\\n        var preDate=null;\\r\\n        for(var i=0,j=0;i<this.Data.length;)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n\\r\\n            if (j>=overlayData.length)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                ++i;\\r\\n                continue;;\\r\\n            }\\r\\n\\r\\n            var overlayDate=overlayData[j].Date;\\r\\n\\r\\n            if (overlayDate==date)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=overlayData[j].Date;\\r\\n                item.Value=overlayData[j].Value;\\r\\n                item.Text=overlayData[j].Text;\\r\\n                result[i]=item;\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (preDate!=null && preDate<overlayDate && date>overlayDate)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=date;\\r\\n                item.OverlayDate=overlayData[j].Date;\\r\\n                item.Value=overlayData[j].Value;\\r\\n                item.Text=overlayData[j].Text;\\r\\n                result[i]=item;\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else if (overlayDate<date)\\r\\n            {\\r\\n                ++j;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=new SingleData();\\r\\n                result[i].Date=date;\\r\\n                ++i;\\r\\n            }\\r\\n\\r\\n            preDate=date;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetValue=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            if (this.Data[i] && this.Data[i].Value!=null)\\r\\n            {\\r\\n                var item=this.Data[i].Value;\\r\\n                if (!isNaN(item))\\r\\n                    result[i]=item;\\r\\n                else if (item instanceof Array)   //支持数组\\r\\n                    result[i]=item;\\r\\n                else\\r\\n                    result[i]=null;\\r\\n            }\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetObject=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            if (this.Data[i] && this.Data[i].Value)\\r\\n            {\\r\\n                var item=this.Data[i].Value;\\r\\n                result[i]=item;\\r\\n            }\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetPeriodSingleData=function(period)\\r\\n    {\\r\\n        var result=new Array();\\r\\n        var index=0;\\r\\n        var startDate=0;\\r\\n        var weekCount=2;\\r\\n        var newData=null;\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var isNewData=false;\\r\\n            var dayData=this.Data[i];\\r\\n            if (dayData==null || dayData.Date==null) continue;\\r\\n\\r\\n            switch(period)\\r\\n            {\\r\\n                case 1: //周线\\r\\n                    var fridayDate=ChartData.GetFirday(dayData.Date);\\r\\n                    if (fridayDate!=startDate)\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=fridayDate;\\r\\n                    }\\r\\n                    break;\\r\\n                case 21: //双周\\r\\n                    var fridayDate=ChartData.GetFirday(dayData.Date);\\r\\n                    if (fridayDate!=startDate)\\r\\n                    {\\r\\n                        ++weekCount;\\r\\n                        if (weekCount>=2)\\r\\n                        {\\r\\n                            isNewData=true;\\r\\n                            weekCount=0;\\r\\n                        }\\r\\n                        startDate=fridayDate;\\r\\n                    }\\r\\n                    break;\\r\\n                case 2: //月线\\r\\n                    if (parseInt(dayData.Date/100)!=parseInt(startDate/100))\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=dayData.Date;\\r\\n                    }\\r\\n                    break;\\r\\n                case 3: //年线\\r\\n                    if (parseInt(dayData.Date/10000)!=parseInt(startDate/10000))\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=dayData.Date;\\r\\n                    }\\r\\n                    break;\\r\\n                case 9: //季线\\r\\n                    var now=ChartData.GetQuarter(dayData.Date);\\r\\n                    now=parseInt(dayData.Date/10000)*10+now;\\r\\n                    var last=ChartData.GetQuarter(startDate);\\r\\n                    last=parseInt(startDate/10000)*10+last;\\r\\n                    if (now!=last)\\r\\n                    {\\r\\n                        isNewData=true;\\r\\n                        startDate=dayData.Date;\\r\\n                    }\\r\\n                    break;\\r\\n            }\\r\\n\\r\\n            if (isNewData)\\r\\n            {\\r\\n                newData=new SingleData();\\r\\n                newData.Date=dayData.Date;\\r\\n                newData.Value=dayData.Value;\\r\\n                result.push(newData);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (newData==null) continue;\\r\\n                if (dayData.Value==null || isNaN(dayData.Value)) continue;\\r\\n                if (newData.Value==null || isNaN(newData.Value)) newData.Value=dayData.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n        分钟数据方法\\r\\n        this.GetClose()     每分钟价格\\r\\n        this.GetVol()       每分钟成交量\\r\\n    */\\r\\n\\r\\n    //分钟均线\\r\\n    this.GetMinuteAvPrice=function()\\r\\n    {\\r\\n        var result=new Array();\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            result[i]=this.Data[i].AvPrice;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.MergeMinuteData=function(data) //合并数据\\r\\n    {\\r\\n        var sourceFirstItem=this.Data[0];\\r\\n        var firstItemID=0;\\r\\n        var firstItem=null;\\r\\n        for(var i=0;i<data.length;++i)  //查找比原始数据起始位置大的数据位置\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (item.Date>sourceFirstItem.Date)\\r\\n            {\\r\\n                firstItemID=i;\\r\\n                firstItem=item;\\r\\n                break;\\r\\n            }\\r\\n\\r\\n            if (item.Date==sourceFirstItem.Date && item.Time>=sourceFirstItem.Time)\\r\\n            {\\r\\n                firstItemID=i;\\r\\n                firstItem=item;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (firstItem==null) return false;\\r\\n\\r\\n        var index=null;\\r\\n        var bFind=false;    //第1个数据是否完全匹配\\r\\n        for(var i=this.Data.length-1; i>=0;--i)\\r\\n        {\\r\\n            var date=this.Data[i].Date;\\r\\n            var time=this.Data[i].Time;\\r\\n\\r\\n            if (firstItem.Date>date || (firstItem.Date==date  &&  firstItem.Time>=time) )\\r\\n            {\\r\\n                index=i;\\r\\n                if (firstItem.Date==date && firstItem.Time==time) bFind=true;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (index==null) return false;\\r\\n\\r\\n        var j=index;        //原始数据插入位置\\r\\n        var i=firstItemID;  //合并数据起始位置\\r\\n        if (bFind==true)    //第1个数据匹配,覆盖\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (j-1>0 && !item.YClose) item.YClose=this.Data[j-1].Close;   //前收盘如果没有就是上一记录的收盘\\r\\n            var newItem=HistoryData.Copy(item);\\r\\n            this.Data[j]=newItem;\\r\\n            ++j;\\r\\n            ++i;\\r\\n        }\\r\\n        else            //从下一个数据开始插入\\r\\n        {\\r\\n            ++j;\\r\\n        }\\r\\n\\r\\n        for(;i<data.length; )\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (j>=this.Data.length-1)\\r\\n            {\\r\\n                if (j-1>0 && !item.YClose) item.YClose=this.Data[j-1].YClose;   //前收盘如果没有就是上一记录的收盘\\r\\n                var newItem=HistoryData.Copy(item);\\r\\n                this.Data[j]=newItem;\\r\\n                ++j;\\r\\n                ++i;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var oldItem=this.Data[j];\\r\\n                if (oldItem.Date==item.Date && oldItem.Time==item.Time) //更新数据\\r\\n                {\\r\\n                    HistoryData.CopyTo(oldItem,item);\\r\\n                    ++j;\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    ++j;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //JSConsole.Chart.Log('[ChartData::MergeMinuteData] ', this.Data, data);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //跨周期转化\\r\\n    this.ConverPeriod=function(data, curPeriod, changePeriod) //把数据用data, 日期时间不变, curPeriod=当前周期  changePeriod=需要转换周期\\r\\n    {\\r\\n        var result=[];\\r\\n        var tempItem=null;\\r\\n        var isMinute=ChartData.IsMinutePeriod(curPeriod,true);\\r\\n        var isMinute2=ChartData.IsMinutePeriod(changePeriod,true);\\r\\n        var isMimToMin=isMinute && isMinute2;\\r\\n        var isMinToDay=isMinute && !isMinute2;\\r\\n        var isDayToDay=!isMinute && !isMinute2;\\r\\n\\r\\n        for(var i=0,j=0; i<this.Data.length; ++i)\\r\\n        {\\r\\n            var item=this.Data[i];  //原始数据\\r\\n            for(;j<data.length;++j)\\r\\n            {\\r\\n                var periodItem=data[j];\\r\\n\\r\\n                if (isMimToMin)  //都是分钟数据\\r\\n                {\\r\\n                    if ( (periodItem.Date>item.Date) || (periodItem.Date==item.Date && periodItem.Time>=item.Time) )\\r\\n                    {\\r\\n                        tempItem=periodItem;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else if (isMinToDay || isDayToDay)    //分钟 => 日线, 日线 => 日线\\r\\n                {\\r\\n                    if (periodItem.Date>=item.Date)\\r\\n                    {\\r\\n                        tempItem=periodItem;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var newItem=null;\\r\\n            if (tempItem)\\r\\n            {\\r\\n                newItem=HistoryData.Copy(tempItem);\\r\\n                newItem.PDate=tempItem.Date;\\r\\n                newItem.PTime=tempItem.Time;\\r\\n            }\\r\\n            else newItem=new HistoryData();\\r\\n\\r\\n            newItem.Date=item.Date;\\r\\n            if (isMimToMin || isMinToDay) newItem.Time=item.Time;\\r\\n            result.push(newItem);\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log('[ChartData::ConverPeriod] result', result);\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetRef=function(n)\\r\\n    {\\r\\n        let result=[];\\r\\n\\r\\n        for(var i=0 ;i<this.Data.length; ++i )\\r\\n        {\\r\\n            result[i]=null;\\r\\n            var itemDate=this.Data[i];  //原始数据\\r\\n\\r\\n            if (i-n<0)\\r\\n            {\\r\\n                var newData=new HistoryData();\\r\\n                newData.Date=itemDate.Date;\\r\\n                newData.Time=itemDate.Time;\\r\\n                result[i]=newData;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var itemData=this.Data[i-n];\\r\\n            var newData=HistoryData.Copy(itemData);\\r\\n            newData.Date=itemDate.Date;\\r\\n            newData.Time=itemDate.Time;\\r\\n\\r\\n            result[i]=newData;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //拟合其他K线数据指标\\r\\n    this.FitKLineIndex=function(kLineData, outVar, peirod, indexPeriod)\\r\\n    {\\r\\n        var count=this.Data.length;         //原始K线数据\\r\\n        var indexCount=kLineData.length;    //拟合K线数据\\r\\n        var isMinutePeriod=[ChartData.IsMinutePeriod(peirod,true), ChartData.IsMinutePeriod(indexPeriod,true) ]; //0=原始K线 1=需要拟合的K线\\r\\n        var isDayPeriod=[ChartData.IsDayPeriod(peirod,true), ChartData.IsDayPeriod(indexPeriod,true)  ];   //0=原始K线 1=需要拟合的K线\\r\\n        var firstItem=ChartData.GetKLineDataTime(this.Data[0]);\\r\\n\\r\\n        //计算拟合以后的数据索引\\r\\n        var aryFixDataID=[];\\r\\n        var indexStart=indexCount;\\r\\n        for(var i=0;i<indexCount;++i)\\r\\n        {\\r\\n            var item=ChartData.GetKLineDataTime(kLineData[i]);\\r\\n\\r\\n            if ( (isDayPeriod[0] && isDayPeriod[1]) || (isMinutePeriod[0] && isDayPeriod[1]) )   //日线(拟合) => 日线(原始)    日线(拟合 => 分钟(原始)\\r\\n            {\\r\\n                if (item.Date>=firstItem.Date)\\r\\n                {\\r\\n                    indexStart = i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n            else if (isMinutePeriod[0] && isMinutePeriod[1]) //分钟(拟合 => 分钟(原始)\\r\\n            {\\r\\n                if (item.Date>firstItem.Date)\\r\\n                {\\r\\n                    indexStart = i;\\r\\n                    break;\\r\\n                }\\r\\n\\r\\n                if (item.Date == firstItem.Date && item.Time >= firstItem.Time )\\r\\n                {\\r\\n                    indexStart = i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i=0, j=indexStart; i<count; )\\r\\n        {\\r\\n            var item=ChartData.GetKLineDataTime(this.Data[i]);\\r\\n            if (j>=indexCount)\\r\\n            {\\r\\n                var fitItem={ Date:item.Date, Time:item.Time, Index:-1 };\\r\\n                aryFixDataID[i]=fitItem;\\r\\n                ++i;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var destItem=ChartData.GetKLineDataTime(kLineData[j]);\\r\\n            if ( (isDayPeriod[0] && isDayPeriod[1]) || (isMinutePeriod[0] && isDayPeriod[1]) )  //日线(拟合) => 日线(原始)    日线(拟合 => 分钟(原始)\\r\\n            {\\r\\n                if (destItem.Date == item.Date)\\r\\n                {\\r\\n                    var fitItem={ Date:item.Date, Time:item.Time, Index:j, Data2:destItem.Date, Time2:destItem.Time };\\r\\n                    aryFixDataID[i]=fitItem;\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (j+1<indexCount)\\r\\n                    {\\r\\n                        var nextDestItem=ChartData.GetKLineDataTime(kLineData[j+1]);\\r\\n                        if ( destItem.Date<=item.Date && nextDestItem.Date>item.Date )\\r\\n                        {\\r\\n                            var fitItem={ Date:item.Date, Time:item.Time, Index:j+1, Data2:nextDestItem.Date, Time2:nextDestItem.Time };\\r\\n                            aryFixDataID[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                        else if (nextDestItem.Date <= item.Date )\\r\\n                        {\\r\\n                            ++j;\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var fitItem={ Date:item.Date, Time:item.Time, Index:-1 };\\r\\n                            aryFixDataID[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        ++j;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else if (isMinutePeriod[0] && isMinutePeriod[1])    //分钟(拟合 => 分钟(原始)\\r\\n            {\\r\\n                if (destItem.Date == item.Date && destItem.Time == item.Time)\\r\\n                {\\r\\n                    var fitItem={ Date:item.Date, Time:item.Time, Index:j, Data2:destItem.Date, Time2:destItem.Time };\\r\\n                    aryFixDataID[i]=fitItem;\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (j+1<indexCount)\\r\\n                    {\\r\\n                        var nextDestItem=ChartData.GetKLineDataTime(kLineData[j+1]);\\r\\n                        if ( (destItem.Date<item.Date && nextDestItem.Date>item.Date) ||\\r\\n                            (destItem.Date == item.Date && destItem.Time < item.Time && nextDestItem.Date == item.Date && nextDestItem.Time > item.Time) ||\\r\\n                            (destItem.Date == item.Date && destItem.Time < item.Time && nextDestItem.Date > item.Date) ||\\r\\n                            (destItem.Date < item.Date && nextDestItem.Date == item.Date && nextDestItem.Time > item.Time) )\\r\\n                        {\\r\\n                            var fitItem={ Date:item.Date, Time:item.Time, Index:j+1, Data2:nextDestItem.Date, Time2:nextDestItem.Time };\\r\\n                            aryFixDataID[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                        else if (nextDestItem.Date < item.Date || (nextDestItem.Date == item.Date && nextDestItem.Time <= item.Time) )\\r\\n                        {\\r\\n                            ++j;\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var fitItem={ Date:item.Date, Time:item.Time, Index:-1 };\\r\\n                            aryFixDataID[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        ++j;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //拟合数据\\r\\n        var result=[];\\r\\n        for(var i in outVar)\\r\\n        {\\r\\n            var item=outVar[i];\\r\\n            if (Array.isArray(item.Data))\\r\\n            {\\r\\n                var data=[];\\r\\n                result[i]={ Data:data, Name:item.Name } ;\\r\\n                for(var j=0;j<aryFixDataID.length;++j)\\r\\n                {\\r\\n                    var dataItem=aryFixDataID[j];\\r\\n                    data[j]=null;\\r\\n                    if ( dataItem && dataItem.Index>=0 && dataItem.Index<item.Data.length )\\r\\n                        data[j]=item.Data[dataItem.Index];\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]={ Data:item.Data, Name:item.Name} ;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //获取数据索引\\r\\n    this.FindDataIndexByDateTime=function(aryDateTime) //aryDateTime=[ { Date:, Time:, Index:-1 }, ......]\\r\\n    {\\r\\n        var findCount=0;\\r\\n        for(var i in aryDateTime)\\r\\n        {\\r\\n            aryDateTime[i].Index=-1;\\r\\n        }\\r\\n\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            for(var j in aryDateTime)\\r\\n            {\\r\\n                var findItem=aryDateTime[j];\\r\\n                if (findItem.Index>=0) continue;\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(findItem.Time))\\r\\n                {\\r\\n                    if (findItem.Date==item.Date && findItem.Time==item.Time)\\r\\n                    {\\r\\n                        findItem.Index=parseInt(i);\\r\\n                        ++findCount;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (findItem.Date==item.Date)\\r\\n                    {\\r\\n                        findItem.Index=parseInt(i);\\r\\n                        ++findCount;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (findCount>=aryDateTime.length) break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //深拷贝数据\\r\\n    this.CloneData=function(className)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (className==\\\"HistoryData\\\")\\r\\n        {\\r\\n            for(var i in this.Data)\\r\\n            {\\r\\n                var item=this.Data[i];\\r\\n                var newItem=HistoryData.Copy(item);\\r\\n                result.push(newItem);\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetAPIDataIndex=function(date,time)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (date && time)\\r\\n        {\\r\\n            var count=this.Data.length;         //原始K线数据\\r\\n            var indexCount=date.length;         //拟合数据\\r\\n            var firstItem=ChartData.GetKLineDataTime(this.Data[0]);\\r\\n            var indexStart=indexCount;  //拟合数据的起始位置\\r\\n\\r\\n            var indexStart=indexCount;  //拟合数据的起始位置\\r\\n            for(var i=0;i<indexCount;++i)\\r\\n            {\\r\\n                var itemDate=date[i];\\r\\n                var itemTime=time[i];\\r\\n\\r\\n                if (itemDate>firstItem.Date || (itemDate == firstItem.Date && itemTime >= firstItem.Time))\\r\\n                {\\r\\n                    indexStart = i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for(var i=0, j=indexStart; i<count; )\\r\\n            {\\r\\n                var item=this.Data[i];\\r\\n                if (j>=indexCount)\\r\\n                {\\r\\n                    var fitItem={ KDate:item.Date, KTime:item.Time, KIndex:i, Index:-1 };\\r\\n                    result[i]=fitItem;\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n\\r\\n                var itemDate=date[j];\\r\\n                var itemTime=time[j];\\r\\n                if (itemDate == item.Date && itemTime == item.Time)\\r\\n                {\\r\\n                    var fitItem={ KDate:item.Date, KTime:item.Time, KIndex:i, Index:j, Data:itemDate, Time:itemTime };\\r\\n                    result[i]=fitItem;\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (j+1<indexCount)\\r\\n                    {\\r\\n                        var nextItemDate=date[j+1];\\r\\n                        var nextItemTime=time[j+1];\\r\\n\\r\\n                        if ( (itemDate<item.Date && nextItemDate>item.Date) ||\\r\\n                            (itemDate == item.Date && itemTime < item.Time && nextItemDate == item.Date && nextItemTime > item.Time) ||\\r\\n                            (itemDate == item.Date && itemTime < item.Time && nextItemDate > item.Date) ||\\r\\n                            (itemDate < item.Date && nextItemDate == item.Date && nextItemTime > item.Time) )\\r\\n                        {\\r\\n                            var fitItem={ KDate:item.Date, KTime:item.Time, KIndex:i, Index:j, Data:itemDate, Time:itemTime };\\r\\n                            result[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                        else if (nextItemDate < item.Date || (nextItemDate == item.Date && nextItemTime <= item.Time) )\\r\\n                        {\\r\\n                            ++j;\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var fitItem={ KDate:item.Date, KTime:item.Time, KIndex:i, Index:-1 };\\r\\n                            result[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        ++j;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (date)\\r\\n        {\\r\\n            var count=this.Data.length;         //原始K线数据\\r\\n            var indexCount=date.length;         //拟合数据\\r\\n            var firstItem=ChartData.GetKLineDataTime(this.Data[0]);\\r\\n\\r\\n            var indexStart=indexCount;  //拟合数据的起始位置\\r\\n            for(var i=0;i<indexCount;++i)\\r\\n            {\\r\\n                var item=date[i];\\r\\n\\r\\n                if (item>=firstItem.Date)\\r\\n                {\\r\\n                    indexStart = i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for(var i=0, j=indexStart; i<count; )\\r\\n            {\\r\\n                var item=this.Data[i];\\r\\n                if (j>=indexCount)\\r\\n                {\\r\\n                    var fitItem={ KDate:item.Date, KIndex:i, Index:-1 };\\r\\n                    result[i]=fitItem;\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n\\r\\n                var destDate=date[j];\\r\\n                if (destDate == item.Date)\\r\\n                {\\r\\n                    var fitItem={ KDate:item.Date, KIndex:i, Index:j, Data:destDate };\\r\\n                    result[i]=fitItem;\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (j+1<indexCount)\\r\\n                    {\\r\\n                        var nextDestDate=date[j+1];\\r\\n                        if ( destDate<=item.Date && nextDestDate>item.Date )\\r\\n                        {\\r\\n                            var fitItem={ KDate:item.Date, KIndex:i, Index:j, Data:destDate };\\r\\n                            result[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                        else if (nextDestDate <= item.Date )\\r\\n                        {\\r\\n                            ++j;\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var fitItem={ KDate:item.Date, KIndex:i, Index:-1 };\\r\\n                            result[i]=fitItem;\\r\\n                            ++i;\\r\\n                        }\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        ++j;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //K线数据拟合\\r\\n    this.FixKData=function(aryKData, period)\\r\\n    {\\r\\n        if (ChartData.IsDayPeriod(period,true))\\r\\n        {\\r\\n            return this.FixKData_Day(aryKData);\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(period,true))\\r\\n        {\\r\\n            return this.FixKData_Minute(aryKData);\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.FixKData_Day=function(aryKData)\\r\\n    {\\r\\n        var result=[];\\r\\n        var nOverlayDataCount=aryKData.length;\\r\\n        for(var i=0,j=0; i<this.Data.length;)\\r\\n        {\\r\\n            var kItem=this.Data[i];\\r\\n            if (j<nOverlayDataCount)\\r\\n            {\\r\\n                var fItem=aryKData[j];\\r\\n                if (fItem.Date>kItem.Date)\\r\\n                {\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (j+1<nOverlayDataCount)\\r\\n            {\\r\\n                var fItem = aryKData[j];\\r\\n                var fItem2 = aryKData[j + 1];\\r\\n\\r\\n                if (fItem.Date < kItem.Date && fItem2.Date <= kItem.Date)\\r\\n                {\\r\\n                    ++j;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new HistoryData();\\r\\n            item.Date=kItem.Date;\\r\\n            var index=j<nOverlayDataCount ? j : nOverlayDataCount-1;\\r\\n            var fItem=aryKData[index];\\r\\n\\r\\n            item.Close = fItem.Close;\\r\\n            item.High = fItem.High;\\r\\n            item.Low = fItem.Low;\\r\\n            item.Open = fItem.Open;\\r\\n            item.YClose = fItem.YClose;\\r\\n            item.Amount = fItem.Amount;\\r\\n            item.Vol = fItem.Vol;\\r\\n            item.ExDate = fItem.Date;   //对应叠加数据的日期 调试用\\r\\n\\r\\n            result[i]=item;\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.FixKData_Minute=function(aryKData)\\r\\n    {\\r\\n        var result=[];\\r\\n        var nOverlayDataCount=aryKData.length;\\r\\n        for(var i=0,j=0; i<this.Data.length;)\\r\\n        {\\r\\n            var kItem=this.Data[i];\\r\\n            var kDateTime=ChartData.DateTimeToNumber(kItem);\\r\\n\\r\\n            if (j<nOverlayDataCount)\\r\\n            {\\r\\n                var fItem=aryKData[j];\\r\\n                var fDateTime=ChartData.DateTimeToNumber(fItem);\\r\\n                if (fDateTime>kDateTime)\\r\\n                {\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (j+1<nOverlayDataCount)\\r\\n            {\\r\\n                var fItem = aryKData[j];\\r\\n                var fItem2 = aryKData[j + 1];\\r\\n                var fDateTime=ChartData.DateTimeToNumber(fItem);\\r\\n                var fDateTime2=ChartData.DateTimeToNumber(fItem2);\\r\\n\\r\\n                if (fDateTime < kDateTime && fDateTime2 <= kDateTime)\\r\\n                {\\r\\n                    ++j;\\r\\n                    continue;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var item=new HistoryData();\\r\\n            item.Date=kItem.Date;\\r\\n            item.Time=kItem.Time;\\r\\n            var index=j<nOverlayDataCount ? j : nOverlayDataCount-1;\\r\\n            var fItem=aryKData[index];\\r\\n\\r\\n            item.Close = fItem.Close;\\r\\n            item.High = fItem.High;\\r\\n            item.Low = fItem.Low;\\r\\n            item.Open = fItem.Open;\\r\\n            item.YClose = fItem.YClose;\\r\\n            item.Amount = fItem.Amount;\\r\\n            item.Vol = fItem.Vol;\\r\\n            item.ExDate = fItem.Date;   //对应叠加数据的日期 调试用\\r\\n            item.ExTime=fItem.Time;     //对应叠加数据的日期 调试用\\r\\n\\r\\n            result[i]=item;\\r\\n            ++i;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n}\\r\\n\\r\\nChartData.DateTimeToNumber=function(kItem)\\r\\n{\\r\\n    return kItem.Date*10000+kItem.Time;\\r\\n}\\r\\n\\r\\nChartData.GetKLineDataTime=function(kLineItem)   //获取K线的 日期和时间 如果时间没有就用0\\r\\n{\\r\\n    var result={ Date:kLineItem.Date, Time:0 };\\r\\n    if (IFrameSplitOperator.IsNumber(kLineItem.Time)) result.Time=kLineItem.Time;\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nChartData.GetFirday=function(value)\\r\\n{\\r\\n    var date=new Date(parseInt(value/10000),(value/100%100-1),value%100);\\r\\n    var day=date.getDay();\\r\\n    if (day==5) return value;\\r\\n\\r\\n    var timestamp=date.getTime();\\r\\n    if (day<5)\\r\\n    {\\r\\n        var prevTimestamp=(24*60*60*1000)*(5-day);\\r\\n        timestamp+=prevTimestamp;\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var prevTimestamp=(24*60*60*1000)*(day-5);\\r\\n        timestamp-=prevTimestamp;\\r\\n    }\\r\\n\\r\\n    date.setTime(timestamp);\\r\\n    var fridayDate= date.getFullYear()*10000+(date.getMonth()+1)*100+date.getDate();\\r\\n    var week=date.getDay();\\r\\n    return fridayDate;\\r\\n\\r\\n}\\r\\n\\r\\nChartData.GetSunday=function(value)\\r\\n{\\r\\n    var date=new Date(parseInt(value/10000),(value/100%100-1),value%100);\\r\\n    var day=date.getDay();\\r\\n    if (day==0) return value;\\r\\n\\r\\n    var timestamp=date.getTime();\\r\\n    if (day>0)\\r\\n    {\\r\\n        var prevTimestamp=(24*60*60*1000)*(7-day);\\r\\n        timestamp+=prevTimestamp;\\r\\n    }\\r\\n\\r\\n    date.setTime(timestamp);\\r\\n    var sundayDate= date.getFullYear()*10000+(date.getMonth()+1)*100+date.getDate();\\r\\n    var week=date.getDay();\\r\\n    return sundayDate;\\r\\n}\\r\\n\\r\\nChartData.GetQuarter=function(value)\\r\\n{\\r\\n    var month=parseInt(value%10000/100);\\r\\n    if (month==1 || month==2 || month==3) return 1;\\r\\n    else if (month==4 || month==5 || month==6) return 2;\\r\\n    else if (month==7 || month==8 || month==9) return 3;\\r\\n    else if (month==10 || month==11 || month==12) return 4;\\r\\n    else return 0;\\r\\n}\\r\\n\\r\\nChartData.GetHalfYear=function(value)\\r\\n{\\r\\n    var year=parseInt(value/10000);\\r\\n    var day=value%10000;\\r\\n    if (day<=630) return year*10000+630;\\r\\n    return year*10000+1231;\\r\\n}\\r\\n\\r\\n//是否是日线周期  0=日线 1=周线 2=月线 3=年线 9=季线 21=双周 22=半年 [40001-50000) 自定义日线 (isIncludeBase 是否包含基础日线周期)\\r\\nvar CUSTOM_DAY_PERIOD_START=40000, CUSTOM_DAY_PERIOD_END=49999;\\r\\nChartData.IsDayPeriod=function(period, isIncludeBase)\\r\\n{\\r\\n    if (period==1 || period==2 || period==3 || period==9 || period==21 || period==22) return true;\\r\\n    if (period>CUSTOM_DAY_PERIOD_START && period<=CUSTOM_DAY_PERIOD_END) return true;\\r\\n    if (period==0 && isIncludeBase==true) return true;\\r\\n\\r\\n    return false;\\r\\n}\\r\\n\\r\\n//是否是分钟周期 4=1分钟 5=5分钟 6=15分钟 7=30分钟 8=60分钟 11=120分钟 12=240分钟 [20001-30000) 自定义分钟 (isIncludeBase 是否包含基础1分钟周期)\\r\\nvar CUSTOM_MINUTE_PERIOD_START=20000, CUSTOM_MINUTE_PERIOD_END=29999;\\r\\nChartData.IsMinutePeriod=function(period,isIncludeBase)\\r\\n{\\r\\n    if (period==5 || period==6 || period==7 || period==8 ||period==11 || period==12) return true;\\r\\n    if (period>CUSTOM_MINUTE_PERIOD_START && period<=CUSTOM_MINUTE_PERIOD_END) return true;\\r\\n    if (period==4 && isIncludeBase==true) return true;\\r\\n\\r\\n    return false;\\r\\n}\\r\\n\\r\\n//是否是秒周期 [30001-32000)\\r\\nvar CUSTOM_SECOND_PERIOD_START=30000, CUSTOM_SECOND_PERIOD_END=32000;\\r\\nChartData.IsSecondPeriod=function(period)\\r\\n{\\r\\n    if (period>CUSTOM_SECOND_PERIOD_START && period<=CUSTOM_SECOND_PERIOD_END) return true;\\r\\n    return false;\\r\\n}\\r\\n\\r\\n\\r\\n//是否是分笔图 10=分笔\\r\\nChartData.IsTickPeriod=function(period)\\r\\n{\\r\\n    return period==10;\\r\\n}\\r\\n\\r\\n//获取周期名字\\r\\nChartData.GetPeriodName=function(period)\\r\\n{\\r\\n    var mapName=new Map(\\r\\n        [\\r\\n            [0, '日线'],[1, '周线'],[2, '月线'],[3, '年线'],[9, '季线'], [21,'双周'],[22,\\\"半年\\\"],\\r\\n            [4, '1分'], [5, '5分'], [6, '15分'],[7, '30分'],[8, '60分'],[11, '2小时'],[12, '4小时'],\\r\\n            [10, '分笔']\\r\\n        ]);\\r\\n\\r\\n    if (mapName.has(period)) return mapName.get(period);\\r\\n\\r\\n    return '';\\r\\n}\\r\\n\\r\\n\\r\\nfunction TooltipData()              //提示信息\\r\\n{\\r\\n    this.ChartPaint;\\r\\n    this.Data;\\r\\n    this.Type=0;\\r\\n}\\r\\n\\r\\nfunction Rect(x,y,width,height)\\r\\n{\\r\\n    this.X=x,\\r\\n        this.Y=y;\\r\\n    this.Width=width;\\r\\n    this.Height=height;\\r\\n}\\r\\n\\r\\n//图新画法接口类\\r\\nfunction IChartPainting()\\r\\n{\\r\\n    this.Canvas;                        //画布\\r\\n    this.ChartBorder;                   //边框信息\\r\\n    this.ChartFrame;                    //框架画法\\r\\n    this.Name;                          //名称\\r\\n    this.ClassName='IChartPainting';    //类名\\r\\n    this.Data=new ChartData();          //数据区\\r\\n\\r\\n    this.NotSupportMessage=null;\\r\\n    this.MessageFont=g_JSChartResource.Index.NotSupport.Font;\\r\\n    this.MessageColor=g_JSChartResource.Index.NotSupport.TextColor;\\r\\n    this.IsDrawFirst=false;\\r\\n    this.IsShow=true;\\r\\n    this.GetEventCallback;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetBorder=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsHScreen) return this.ChartBorder.GetHScreenBorder();\\r\\n        return this.ChartBorder.GetBorder();\\r\\n    }\\r\\n\\r\\n    this.ClipClient=function(isHScreen)          //裁剪客户端\\r\\n    {\\r\\n        if (isHScreen==true)\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeftEx();\\r\\n            var right=this.ChartBorder.GetRightEx();\\r\\n            var top=this.ChartBorder.GetTop();\\r\\n            var bottom=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeft();\\r\\n            var right=this.ChartBorder.GetRight();\\r\\n            var top=this.ChartBorder.GetTopEx();\\r\\n            var bottom=this.ChartBorder.GetBottomEx();\\r\\n        }\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,(right-left),(bottom-top));\\r\\n        //this.Canvas.stroke(); //调试用\\r\\n        this.Canvas.clip();\\r\\n    }\\r\\n\\r\\n    this.GetYFromData=function(value,isLimit)\\r\\n    {\\r\\n        return this.ChartFrame.GetYFromData(value,isLimit);\\r\\n    }\\r\\n\\r\\n    this.IsMinuteFrame=function()\\r\\n    {\\r\\n        var isMinute=(this.ChartFrame.ClassName==\\\"MinuteFrame\\\" || this.ChartFrame.ClassName==\\\"MinuteHScreenFrame\\\" ||\\r\\n            this.ChartFrame.ClassName==\\\"OverlayMinuteFrame\\\" || this.ChartFrame.ClassName==\\\"OverlayMinuteHScreenFrame\\\" );\\r\\n\\r\\n        return isMinute\\r\\n    }\\r\\n\\r\\n    this.DrawNotSupportmessage=function()\\r\\n    {\\r\\n        this.Canvas.font=this.MessageFont;\\r\\n        this.Canvas.fillStyle=this.MessageColor;\\r\\n\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var width=this.ChartBorder.GetWidth();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var height=this.ChartBorder.GetHeightEx();\\r\\n\\r\\n        var x=left+width/2;\\r\\n        var y=top+height/2;\\r\\n\\r\\n        this.Canvas.textAlign=\\\"center\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.fillText(this.NotSupportMessage,x,y);\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        if(!this.Data || !this.Data.Data) return range;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null || isNaN(value)) continue;\\r\\n\\r\\n            if (range.Max==null) range.Max=value;\\r\\n            if (range.Min==null) range.Min=value;\\r\\n\\r\\n            if (range.Max<value) range.Max=value;\\r\\n            if (range.Min>value) range.Min=value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.GetDynamicFont=function(dataWidth, distanceWidth,  maxSize, minSize, zoom, fontname)    //根据宽度自动获取对应字体\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        maxSize*=pixelTatio;\\r\\n        minSize*=pixelTatio;\\r\\n\\r\\n        if (maxSize==minSize)   //固定大小\\r\\n        {\\r\\n            var font=`${maxSize.toFixed(0)}px ${fontname}` ;\\r\\n            return font;\\r\\n        }\\r\\n\\r\\n        var fontSize=(dataWidth+distanceWidth);\\r\\n        if (zoom)\\r\\n        {\\r\\n            if (zoom.Type==0)\\r\\n            {\\r\\n                if (zoom.Value>0) fontSize=(dataWidth*zoom.Value);\\r\\n            }\\r\\n            else if (zoom.Type==1)\\r\\n            {\\r\\n                if (zoom.Value>0) fontSize=(dataWidth+distanceWidth)*zoom.Value;\\r\\n            }\\r\\n            else if (zoom.Type==2)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(zoom.Value))\\r\\n                    fontSize=(dataWidth+distanceWidth) + (2*zoom.Value)*pixelTatio;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (fontSize<minSize) fontSize=minSize;\\r\\n        else if (fontSize>maxSize) fontSize=maxSize;\\r\\n\\r\\n        var font=`${fontSize.toFixed(0)}px ${fontname}` ;\\r\\n\\r\\n        /*\\r\\n        if (dataWidth < 5) font =4*pixelTatio + 'px Arial';           //字体根据数据宽度动态调整\\r\\n        else if (dataWidth < 7) font = 6*pixelTatio +'px Arial';\\r\\n        else if (dataWidth < 9) font = 8*pixelTatio +'px Arial';\\r\\n        else if (dataWidth < 11) font =10*pixelTatio +'px Arial';\\r\\n        else if (dataWidth < 13) font =12*pixelTatio +'px Arial';\\r\\n        else if (dataWidth < 15) font =14*pixelTatio + 'px Arial';\\r\\n        else font =16*pixelTatio + 'px Arial';\\r\\n        */\\r\\n\\r\\n        return font;\\r\\n    }\\r\\n\\r\\n    this.GetLockRect=function()\\r\\n    {\\r\\n        return this.ChartFrame.GetLockRect();\\r\\n    }\\r\\n\\r\\n    this.SetFillStyle=function(color, x0, y0, x1, y1)\\r\\n    {\\r\\n        if (Array.isArray(color))\\r\\n        {\\r\\n            let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1);\\r\\n            var offset=1/(color.length);\\r\\n            for(var i in color)\\r\\n            {\\r\\n                gradient.addColorStop(i*offset, color[i]);\\r\\n            }\\r\\n            this.Canvas.fillStyle=gradient;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillStyle=color;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetDynamicIconSize=function(dataWidth, distanceWidth, maxSize, minSize, zoom)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        maxSize*=pixelTatio;\\r\\n        minSize*=pixelTatio;\\r\\n\\r\\n        if (maxSize==minSize) return maxSize;\\r\\n\\r\\n        var iconSize=(dataWidth+distanceWidth)-2*pixelTatio;\\r\\n\\r\\n        if (zoom)\\r\\n        {\\r\\n            if (zoom.Type==0)\\r\\n            {\\r\\n                if (zoom.Value>0) iconSize=(dataWidth*zoom.Value);\\r\\n            }\\r\\n            else if (zoom.Type==1)\\r\\n            {\\r\\n                if (zoom.Value>0) iconSize=(dataWidth+distanceWidth)*zoom.Value;\\r\\n            }\\r\\n            else if (zoom.Type==2)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(zoom.Value))\\r\\n                    iconSize=(dataWidth+distanceWidth) + (2*zoom.Value)*pixelTatio;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (iconSize<minSize) iconSize=minSize;\\r\\n        else if (iconSize>maxSize) iconSize=maxSize;\\r\\n\\r\\n        return iconSize;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n\\r\\n//缩放因子\\r\\n/*\\r\\nvar ZOOM_SEED=\\r\\n[\\r\\n    [49,10],\\t[46,9],\\t\\t[43,8],\\r\\n    [41,7.5],\\t[39,7],\\t\\t[37,6],\\r\\n    [31,5.5],\\t[27,5],\\t\\t[23,4.5],\\r\\n    [21,4],\\t\\t[18,3.5],\\t[16,3],\\r\\n    [13,2.5],\\t[11,2],\\t\\t[8,1.5],\\r\\n    [6,1],\\t\\t[3,0.6],\\t[2.2,0.5],\\r\\n    //太多了卡,\\r\\n    //[1.1,0.3],\\r\\n    //[0.9,0.2],\\t[0.7,0.15],\\r\\n    //[0.6,0.12],\\t[0.5,0.1],\\t[0.4,0.08],\\r\\n    //[0.3,0.06],\\t[0.2,0.04],\\t[0.1,0.02]\\r\\n];\\r\\n*/\\r\\n\\r\\n\\r\\nvar ZOOM_SEED=  //0=柱子宽度  1=间距\\r\\n    [\\r\\n        [48,10],\\t[44,10],\\r\\n        [40,9],     [36,9],\\r\\n        [32,8],     [28,8],\\r\\n        [24,7],     [20,7],\\r\\n        [18,6],     [16,6],\\r\\n        [14,5],     [12,5],\\r\\n        [8,4], [6,4], [4,4],\\r\\n\\r\\n        [3,3],\\r\\n        [3,1], [2,1], [1,1], [1,0],\\r\\n\\r\\n        //[0.5,0],[0.4,0],[0.3,0],[0.2,0],[0.1,0]\\r\\n    ];\\r\\n\\r\\n\\r\\n//K线画法 支持横屏\\r\\nfunction ChartKLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartKLine';    //类名\\r\\n    this.Symbol;        //股票代码\\r\\n    this.DrawType=0;    // 0=实心K线柱子  1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图\\r\\n    this.CloseLineColor=g_JSChartResource.CloseLineColor;\\r\\n    this.CloseLineAreaColor=g_JSChartResource.CloseLineAreaColor;\\r\\n    this.CloseLineWidth=g_JSChartResource.CloseLineWidth;\\r\\n    this.UpColor=g_JSChartResource.UpBarColor;\\r\\n    this.DownColor=g_JSChartResource.DownBarColor;\\r\\n    this.UnchagneColor=g_JSChartResource.UnchagneBarColor;          //平盘\\r\\n    this.ColorData;             //五彩K线颜色 >0：g_JSChartResource.UpBarColor 其他：g_JSChartResource.DownBarColor\\r\\n    this.TradeData;             //交易系统 包含买卖数据{Buy:, Sell:, Name:指标名称 }\\r\\n    this.TradeIcon=g_JSChartResource.KLine.TradeIcon;\\r\\n    this.TooltipRect=[];                    //2位数组 0 数据序号 1 区域\\r\\n    this.InfoTooltipRect=[];                //2维数组 0 数据,  1 区域\\r\\n    this.TradeIconTooltipRect=[];           //2维数组 0 数据,  1 区域\\r\\n\\r\\n    this.IsShowMaxMinPrice=true;                 //是否显示最大最小值\\r\\n    this.IsShowKTooltip=true;                    //是否显示K线tooltip\\r\\n    this.TextFont=g_JSChartResource.KLine.MaxMin.Font;\\r\\n    this.TextColor=g_JSChartResource.KLine.MaxMin.Color;\\r\\n\\r\\n    this.InfoData;          //信息地雷 key=日期  value=信息数据\\r\\n    this.InfoPosition=0;    // 0=K线上 1 底部\\r\\n\\r\\n    this.PtMax;     //最大值的位置\\r\\n    this.PtMin;     //最小值的位置\\r\\n\\r\\n    this.TickSymbol='╳';    //分笔显示的图标\\r\\n    this.TickFontName='arial';\\r\\n    this.Period;            //周期\\r\\n    this.ShowRange={ };     //K线显示范围 { Start:, End:,  DataCount:, ShowCount: }\\r\\n    this.CustomKLine;       //自定义K线, key=date*1000000+time,  key={ Color:, DrawType: }\\r\\n\\r\\n    /*\\r\\n    this.CustomKLine=new Map([\\r\\n        [20210415*1000000, { Color:'rgb(255,0,255)', DrawType:3, BGColor:\\\"rgba(135,206,250,0.5)\\\" }],\\r\\n        [20210412*1000000, { DrawType:3 }],\\r\\n        [20210108*1000000, { DrawType:3,BGColor:\\\"rgba(135,206,250,0.5)\\\"  }],\\r\\n        [20210122*1000000, {Color:'rgb(122,135,155)'}]\\r\\n    ]);\\r\\n    */\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        this.TextFont=g_JSChartResource.KLine.MaxMin.Font;\\r\\n        this.TextColor=g_JSChartResource.KLine.MaxMin.Color;\\r\\n\\r\\n        this.CloseLineColor=g_JSChartResource.CloseLineColor;\\r\\n        this.CloseLineAreaColor=g_JSChartResource.CloseLineAreaColor;\\r\\n        this.CloseLineWidth=g_JSChartResource.CloseLineWidth;\\r\\n\\r\\n        this.UpColor=g_JSChartResource.UpBarColor;\\r\\n        this.DownColor=g_JSChartResource.DownBarColor;\\r\\n        this.UnchagneColor=g_JSChartResource.UnchagneBarColor;          //平盘\\r\\n    }\\r\\n\\r\\n    this.ClearCustomKLine=function()\\r\\n    {\\r\\n        this.CustomKLine=null;\\r\\n    }\\r\\n\\r\\n    this.GetCustomKLine=function(kItem)\\r\\n    {\\r\\n        if (!this.CustomKLine) return null;\\r\\n        if (!kItem) return null;\\r\\n\\r\\n        var key=kItem.Date*1000000;\\r\\n        if (IFrameSplitOperator.IsNumber(kItem.Time)) key+=kItem.Time;\\r\\n        if (!this.CustomKLine.has(key)) return null;\\r\\n\\r\\n        var value=this.CustomKLine.get(key);\\r\\n        return value;\\r\\n    }\\r\\n\\r\\n    this.DrawAKLine=function()  //美国线\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.RightEx;\\r\\n        }\\r\\n\\r\\n        var upColor=this.UpColor;\\r\\n        var downColor=this.DownColor;\\r\\n        var unchagneColor=this.UnchagneColor;\\r\\n\\r\\n        var ptMax={X:null,Y:null,Value:null,Align:'left'};\\r\\n        var ptMin={X:null,Y:null,Value:null,Align:'left'};\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yLow=this.GetYFromData(data.Low,false);\\r\\n            var yHigh=this.GetYFromData(data.High,false);\\r\\n            var yOpen=this.GetYFromData(data.Open,false);\\r\\n            var yClose=this.GetYFromData(data.Close,false);\\r\\n\\r\\n            if (ptMax.Value==null || ptMax.Value<data.High)     //求最大值\\r\\n            {\\r\\n                ptMax.X=x;\\r\\n                ptMax.Y=yHigh;\\r\\n                ptMax.Value=data.High;\\r\\n                ptMax.Align=j<xPointCount/2?'left':'right';\\r\\n            }\\r\\n\\r\\n            if (ptMin.Value==null || ptMin.Value>data.Low)      //求最小值\\r\\n            {\\r\\n                ptMin.X=x;\\r\\n                ptMin.Y=yLow;\\r\\n                ptMin.Value=data.Low;\\r\\n                ptMin.Align=j<xPointCount/2?'left':'right';\\r\\n            }\\r\\n\\r\\n            if (data.Open<data.Close) this.Canvas.strokeStyle=this.UpColor; //阳线\\r\\n            else if (data.Open>data.Close) this.Canvas.strokeStyle=this.DownColor; //阳线\\r\\n            else this.Canvas.strokeStyle=this.UnchagneColor; //平线\\r\\n\\r\\n            if (this.ColorData) ///五彩K线颜色设置\\r\\n            {\\r\\n                if (i<this.ColorData.length)\\r\\n                    upColor=downColor=unchagneColor=(this.ColorData[i]>0?this.UpColor:this.DownColor);\\r\\n                else\\r\\n                    upColor=downColor=unchagneColor=this.DownColor;\\r\\n            }\\r\\n\\r\\n            this.Canvas.beginPath();   //最高-最低\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            if (dataWidth>=4)\\r\\n            {\\r\\n                this.Canvas.beginPath();    //开盘\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(yOpen),left);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yOpen),x);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(left,ToFixedPoint(yOpen));\\r\\n                    this.Canvas.lineTo(x,ToFixedPoint(yOpen));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n\\r\\n                this.Canvas.beginPath();    //收盘\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(yClose),right);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yClose),x);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(right,ToFixedPoint(yClose));\\r\\n                    this.Canvas.lineTo(x,ToFixedPoint(yClose));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n\\r\\n            if(this.Data.DataType==0)\\r\\n            {\\r\\n                var infoItem={Xleft:left,XRight:right, YMax:yHigh, XCenter:x, YMin:yLow, DayData:data, Index:j};\\r\\n                this.DrawInfo(infoItem);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.PtMax=ptMax;\\r\\n        this.PtMin=ptMin;\\r\\n    }\\r\\n\\r\\n    this.DrawCloseArea=function()   //收盘价面积图\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.RightEx;\\r\\n        }\\r\\n\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var firstPoint=null;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.strokeStyle=this.CloseLineColor;\\r\\n        if (IFrameSplitOperator.IsNumber(this.CloseLineWidth)) this.Canvas.lineWidth=this.CloseLineWidth;\\r\\n        var ptLast=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yClose=this.GetYFromData(data.Close,false);\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(yClose,x);\\r\\n                    firstPoint={ X:yClose, Y:x };\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(x,yClose);\\r\\n                    firstPoint={ X:x, Y:yClose };\\r\\n                }\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(yClose,x);\\r\\n                else this.Canvas.lineTo(x,yClose);\\r\\n            }\\r\\n\\r\\n            if (i==this.Data.Data.length-1)\\r\\n            {\\r\\n                ptLast={ X:x, Y:yClose, XLeft:left, XRight:right, KItem:data, ChartRight:chartright };\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.DrawLastPointEvent(ptLast);  //通知外部绘制最后一个点\\r\\n\\r\\n        if (bFirstPoint) return;\\r\\n\\r\\n        this.Canvas.stroke();\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            this.Canvas.lineTo(border.Left,x);\\r\\n            this.Canvas.lineTo(border.Left,firstPoint.Y);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.lineTo(x,border.Bottom);\\r\\n            this.Canvas.lineTo(firstPoint.X,border.Bottom);\\r\\n        }\\r\\n        this.Canvas.closePath();\\r\\n        if (Array.isArray(this.CloseLineAreaColor))\\r\\n        {\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                let gradient = this.Canvas.createLinearGradient(this.ChartBorder.GetRightEx(),this.ChartBorder.GetTop(), this.ChartBorder.GetLeft(),this.ChartBorder.GetTop());\\r\\n                gradient.addColorStop(0, this.CloseLineAreaColor[0]);\\r\\n                gradient.addColorStop(1, this.CloseLineAreaColor[1]);\\r\\n                this.Canvas.fillStyle=gradient;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                let gradient = this.Canvas.createLinearGradient(firstPoint.X,this.ChartBorder.GetTopEx(), firstPoint.X,this.ChartBorder.GetBottom());\\r\\n                gradient.addColorStop(0, this.CloseLineAreaColor[0]);\\r\\n                gradient.addColorStop(1, this.CloseLineAreaColor[1]);\\r\\n                this.Canvas.fillStyle=gradient;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.CloseLineAreaColor;\\r\\n        }\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.DrawCloseLine=function()   //收盘价线\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.RightEx;\\r\\n        }\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.strokeStyle=this.CloseLineColor;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yClose=this.GetYFromData(data.Close,false);\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.moveTo(yClose,x);\\r\\n                else this.Canvas.moveTo(x,yClose);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(yClose,x);\\r\\n                else this.Canvas.lineTo(x,yClose);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bFirstPoint==false) this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawKBar=function()        //蜡烛头\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var chartright=border.RightEx;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            chartright=border.BottomEx;\\r\\n        }\\r\\n\\r\\n        var ptMax={X:null,Y:null,Value:null,Align:'left'};\\r\\n        var ptMin={X:null,Y:null,Value:null,Align:'left'};\\r\\n\\r\\n        var upColor=this.UpColor;\\r\\n        var downColor=this.DownColor;\\r\\n        var unchagneColor=this.UnchagneColor;\\r\\n\\r\\n        this.ShowRange.Start=this.Data.DataOffset;\\r\\n        this.ShowRange.End=this.ShowRange.Start;\\r\\n        this.ShowRange.DataCount=0;\\r\\n        this.ShowRange.ShowCount=xPointCount;\\r\\n        var ptLast=null;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            this.ShowRange.End=i;\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yLow=this.GetYFromData(data.Low, false);\\r\\n            var yHigh=this.GetYFromData(data.High, false);\\r\\n            var yOpen=this.GetYFromData(data.Open, false);\\r\\n            var yClose=this.GetYFromData(data.Close, false);\\r\\n            var y=yHigh;\\r\\n\\r\\n            if (ptMax.Value==null || ptMax.Value<data.High)     //求最大值\\r\\n            {\\r\\n                ptMax.X=x;\\r\\n                ptMax.Y=yHigh;\\r\\n                ptMax.Value=data.High;\\r\\n                ptMax.Align=j<xPointCount/2?'left':'right';\\r\\n            }\\r\\n\\r\\n            if (ptMin.Value==null || ptMin.Value>data.Low)      //求最小值\\r\\n            {\\r\\n                ptMin.X=x;\\r\\n                ptMin.Y=yLow;\\r\\n                ptMin.Value=data.Low;\\r\\n                ptMin.Align=j<xPointCount/2?'left':'right';\\r\\n            }\\r\\n\\r\\n            if (this.ColorData) ///五彩K线颜色设置\\r\\n            {\\r\\n                if (i<this.ColorData.length)\\r\\n                    upColor=downColor=unchagneColor=(this.ColorData[i]>0?this.UpColor:this.DownColor);\\r\\n                else\\r\\n                    upColor=downColor=unchagneColor=this.DownColor;\\r\\n            }\\r\\n\\r\\n            var kLineOption=this.GetCustomKLine(data);\\r\\n\\r\\n            if (kLineOption)\\r\\n            {\\r\\n                var barColor=kLineOption.Color;\\r\\n                if (!barColor)\\r\\n                {\\r\\n                    if (data.Open<data.Close) barColor=upColor;\\r\\n                    else if (data.Open>data.Close) barColor=downColor;\\r\\n                    else barColor=unchagneColor;\\r\\n                }\\r\\n\\r\\n                var drawType=this.DrawType;\\r\\n                if (IFrameSplitOperator.IsNumber(kLineOption.DrawType)) drawType=kLineOption.DrawType;\\r\\n\\r\\n                this.DrawKBar_Custom(data, dataWidth, barColor, drawType, kLineOption, x, y, left, right, yLow, yHigh, yOpen, yClose, border, isHScreen);\\r\\n            }\\r\\n            else if (data.Open<data.Close)       //阳线\\r\\n            {\\r\\n                this.DrawKBar_Up(data, dataWidth, upColor, this.DrawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);\\r\\n            }\\r\\n            else if (data.Open>data.Close)  //阴线\\r\\n            {\\r\\n                this.DrawKBar_Down(data, dataWidth, downColor, this.DrawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);\\r\\n            }\\r\\n            else // 平线\\r\\n            {\\r\\n                this.DrawKBar_Unchagne(data, dataWidth, unchagneColor, this.DrawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);\\r\\n            }\\r\\n\\r\\n            if (this.IsShowKTooltip && !isHScreen)    //添加tooltip区域\\r\\n            {\\r\\n                var yTop=Math.min(yOpen,yClose);\\r\\n                var yBottom=Math.max(yOpen,yClose);\\r\\n                if (Math.abs(yOpen-yClose)<5)   //高度太小了, 上下各+5px\\r\\n                {\\r\\n                    yTop=Math.min(yHigh,yTop-5);\\r\\n                    yBottom=Math.max(yLow,yBottom+5);\\r\\n                }\\r\\n                var rect=new Rect(left,yTop,dataWidth,yBottom-yTop);\\r\\n                //this.Canvas.fillStyle=\\\"rgb(0,0,100)\\\";\\r\\n                //this.Canvas.fillRect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n                this.TooltipRect.push([i,rect]);    //[0]数据索引 [1]数据区域\\r\\n            }\\r\\n\\r\\n            if(this.Data.DataType==0)\\r\\n            {\\r\\n                var infoItem={Xleft:left,XRight:right, XCenter:x, YMax:yHigh, YMin:yLow, DayData:data, Index:j};\\r\\n                this.DrawInfo(infoItem);\\r\\n            }\\r\\n\\r\\n            if (i==this.Data.Data.length-1)\\r\\n            {\\r\\n                ptLast={ X:x, Y:yClose, XLeft:left, XRight:right, KItem:data, ChartRight:chartright };\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.DrawLastPointEvent(ptLast);  //通知外部绘制最后一个点\\r\\n\\r\\n        this.PtMax=ptMax;\\r\\n        this.PtMin=ptMin;\\r\\n    }\\r\\n\\r\\n    this.DrawKBar_Up=function(data, dataWidth, upColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen) //阳线\\r\\n    {\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=upColor;\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(drawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.min(yClose,yOpen):yClose));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                y=yClose;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yClose;\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=upColor;\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                if (Math.abs(yOpen-y)<1)\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (drawType==3) //空心柱\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (Math.abs(yOpen-y)<1)\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (drawType==3) //空心柱\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(drawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.strokeStyle=upColor;\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawKBar_Down=function(data, dataWidth, downColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen) //阴线\\r\\n    {\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=downColor;\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yOpen),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yOpen));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                y=yOpen;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yOpen\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=downColor;\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                if (Math.abs(yClose-y)<1) this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                else this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yClose-y),ToFixedRect(dataWidth));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (Math.abs(yClose-y)<1) this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                else this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yClose)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yClose-y)));\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.strokeStyle=downColor;\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawKBar_Unchagne=function(data, dataWidth, unchagneColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen) //平线\\r\\n    {\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=unchagneColor;\\r\\n            this.Canvas.beginPath();\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(yOpen,ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),yOpen);\\r\\n                }\\r\\n                y=yOpen;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yOpen;\\r\\n            }\\r\\n\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(left));\\r\\n                this.Canvas.lineTo(ToFixedPoint(y),ToFixedPoint(right));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));\\r\\n                this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(y));\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.strokeStyle=unchagneColor;\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawKBar_Custom=function(data, dataWidth, barColor, drawType, option, x, y, left, right, yLow, yHigh, yOpen, yClose, border, isHScreen)\\r\\n    {\\r\\n        if (option.BGColor) //画背景色\\r\\n        {\\r\\n            this.Canvas.fillStyle=option.BGColor;\\r\\n            var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                var yLeft=left-(distanceWidth/2);\\r\\n                var yRight=right+(distanceWidth/2);\\r\\n                var xTop=border.RightEx;\\r\\n                var xBottom=border.LeftEx;\\r\\n\\r\\n                this.Canvas.fillRect(ToFixedRect(xBottom),ToFixedRect(yLeft),ToFixedRect(xTop-xBottom),ToFixedRect(yRight-yLeft));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var xLeft=left-(distanceWidth/2);\\r\\n                var xRight=right+(distanceWidth/2);\\r\\n                var yTop=border.TopEx;\\r\\n                var yBottom=border.BottomEx;\\r\\n\\r\\n                this.Canvas.fillRect(ToFixedRect(xLeft),ToFixedRect(yTop),ToFixedRect(xRight-xLeft),ToFixedRect(yBottom-yTop));\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=barColor;\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(drawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.min(yClose,yOpen):yClose));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                y=yClose;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yClose;\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=barColor;\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                if (Math.abs(yOpen-y)<1)\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (drawType==3) //空心柱\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (Math.abs(yOpen-y)<1)\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (drawType==3) //空心柱\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(drawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.strokeStyle=barColor;\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawTrade=function()       //交易系统\\r\\n    {\\r\\n        if (!this.TradeData) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n            chartright=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n\\r\\n        var sellData=this.TradeData.Sell;\\r\\n        var buyData=this.TradeData.Buy;\\r\\n        var arrowWidth=dataWidth;\\r\\n        if (arrowWidth>10) arrowWidth=10;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var buy=false,sell=false;\\r\\n            if (sellData && i<sellData.length) sell=sellData[i]>0;\\r\\n            if (buyData && i<buyData.length) buy=buyData[i]>0;\\r\\n            if (!sell && !buy) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yLow=this.GetYFromData(data.Low,false);\\r\\n            var yHigh=this.GetYFromData(data.High,false);\\r\\n            var yOpen=this.GetYFromData(data.Open,false);\\r\\n            var yClose=this.GetYFromData(data.Close,false);\\r\\n            var y=yHigh;\\r\\n\\r\\n            if (buy)\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.UpColor;\\r\\n                this.Canvas.strokeStyle=this.UnchagneColor;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(yLow-1,x);\\r\\n                    this.Canvas.lineTo(yLow-arrowWidth-1,x-arrowWidth/2);\\r\\n                    this.Canvas.lineTo(yLow-arrowWidth-1,x+arrowWidth/2);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(x,yLow+1);\\r\\n                    this.Canvas.lineTo(x-arrowWidth/2,yLow+arrowWidth+1);\\r\\n                    this.Canvas.lineTo(x+arrowWidth/2,yLow+arrowWidth+1);\\r\\n                }\\r\\n                this.Canvas.closePath();\\r\\n                this.Canvas.fill();\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n\\r\\n            if (sell)\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.DownColor;\\r\\n                this.Canvas.strokeStyle=this.UnchagneColor;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(yHigh+1,x);\\r\\n                    this.Canvas.lineTo(yHigh+arrowWidth+1,x-arrowWidth/2);\\r\\n                    this.Canvas.lineTo(yHigh+arrowWidth+1,x+arrowWidth/2);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(x,yHigh-1);\\r\\n                    this.Canvas.lineTo(x-arrowWidth/2,yHigh-arrowWidth-1);\\r\\n                    this.Canvas.lineTo(x+arrowWidth/2,yHigh-arrowWidth-1);\\r\\n                }\\r\\n                this.Canvas.closePath();\\r\\n                this.Canvas.fill();\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawTick=function()        //分笔图\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var fontSize=parseInt(dataWidth);\\r\\n        if (fontSize<=1) fontSize=2;\\r\\n        else if (fontSize>=18) fontSize=18;\\r\\n        var bFirstPoint=true;\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        var textSize=fontSize*pixelRatio;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.font=fontSize*pixelRatio+'px '+this.TickFontName;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yClose=this.ChartFrame.GetYFromData(data.Close,false);\\r\\n\\r\\n            if (data.Flag===0) this.Canvas.fillStyle=this.UpColor;\\r\\n            else if (data.Flag==1) this.Canvas.fillStyle=this.DownColor;\\r\\n            else this.Canvas.fillStyle=this.UnchagneColor;\\r\\n\\r\\n            this.Canvas.textAlign='center'\\r\\n            this.Canvas.textBaseline='middle';\\r\\n            if (isHScreen)  this.Canvas.fillText(this.TickSymbol,yClose,x);\\r\\n            else this.Canvas.fillText(this.TickSymbol,x,yClose);\\r\\n\\r\\n            if (this.IsShowKTooltip && !isHScreen)    //添加tooltip区域\\r\\n            {\\r\\n                var rect=new Rect(x-textSize/2,yClose-textSize/2,textSize,textSize);\\r\\n                //this.Canvas.fillStyle=\\\"rgb(0,0,100)\\\";\\r\\n                //this.Canvas.fillRect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n                this.TooltipRect.push([i,rect]);    //[0]数据索引 [1]数据区域\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ClipTickClient=function(isHScreen)\\r\\n    {\\r\\n        var border=this.GetBorder();\\r\\n        if (isHScreen==true)\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeftEx();\\r\\n            var right=this.ChartBorder.GetRightEx();\\r\\n            var top=this.ChartBorder.GetTop();\\r\\n            var bottom=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=border.Left;\\r\\n            var right=border.Right;\\r\\n            var top=border.TopTitle;\\r\\n            var bottom=border.Bottom;\\r\\n        }\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,(right-left),(bottom-top));\\r\\n        this.Canvas.clip();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.TooltipRect=[];\\r\\n        this.InfoTooltipRect=[];\\r\\n        this.TradeIconTooltipRect=[];\\r\\n        this.PtMax={X:null,Y:null,Value:null,Align:'left'}; //清空最大\\r\\n        this.PtMin={X:null,Y:null,Value:null,Align:'left'}; //清空最小\\r\\n\\r\\n        this.ChartFrame.ChartKLine={Max:null, Min:null };   //保存K线上 显示最大最小值坐标\\r\\n\\r\\n        if (!this.IsShow) return;\\r\\n\\r\\n        if (ChartData.IsTickPeriod(this.Period))    //分笔图\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n\\r\\n\\r\\n            if (this.DrawType==1)\\r\\n            {\\r\\n                this.ClipClient(this.ChartFrame.IsHScreen);\\r\\n                this.DrawCloseLine();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.ClipTickClient(this.ChartFrame.IsHScreen);\\r\\n                this.DrawTick();\\r\\n            }\\r\\n\\r\\n\\r\\n            this.Canvas.restore();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.ClipClient(this.ChartFrame.IsHScreen);\\r\\n\\r\\n        if (this.DrawType==1)\\r\\n        {\\r\\n            this.DrawCloseLine();\\r\\n            this.Canvas.restore();\\r\\n            return;\\r\\n        }\\r\\n        else if (this.DrawType==2)\\r\\n        {\\r\\n            this.DrawAKLine();\\r\\n        }\\r\\n        else if (this.DrawType==4)\\r\\n        {\\r\\n            this.DrawCloseArea();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.DrawKBar();\\r\\n        }\\r\\n\\r\\n        if (this.TradeIcon) this.DrawTradeIcon()\\r\\n        else this.DrawTrade();\\r\\n        this.Canvas.restore();\\r\\n\\r\\n        if (this.IsShowMaxMinPrice)     //标注最大值最小值\\r\\n        {\\r\\n            if (this.ChartFrame.IsHScreen===true) this.HScreenDrawMaxMinPrice(this.PtMax,this.PtMin);\\r\\n            else this.DrawMaxMinPrice(this.PtMax,this.PtMin);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawMaxMinPrice=function(ptMax,ptMin)\\r\\n    {\\r\\n        if (ptMax.X==null || ptMax.Y==null || ptMax.Value==null) return;\\r\\n        if (ptMin.X==null || ptMin.Y==null || ptMin.Value==null) return;\\r\\n\\r\\n        var leftArrow=g_JSChartResource.KLine.MaxMin.LeftArrow;\\r\\n        var rightArrow=g_JSChartResource.KLine.MaxMin.RightArrow;\\r\\n        var highYOffset=g_JSChartResource.KLine.MaxMin.HighYOffset;\\r\\n        var lowYOffset=g_JSChartResource.KLine.MaxMin.LowYOffset;\\r\\n\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        this.Canvas.font=this.TextFont;\\r\\n        this.Canvas.fillStyle=this.TextColor;\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n\\r\\n        var ptTop=ptMax;\\r\\n        if (this.ChartFrame.CoordinateType==1)  //反转坐标\\r\\n        {\\r\\n            if (ptMax.Y<ptMin.Y) ptTop=ptMin;\\r\\n            this.Canvas.textBaseline='top';\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (ptMax.Y>ptMin.Y) ptTop=ptMin;\\r\\n            this.Canvas.textBaseline='bottom';\\r\\n        }\\r\\n\\r\\n        this.Canvas.textAlign=ptTop.Align;\\r\\n        var left=ptTop.Align=='left'?ptTop.X:ptTop.X;\\r\\n        if (IFrameSplitOperator.IsNumber(highYOffset)) ptTop.Y+=highYOffset;\\r\\n        var text=ptTop.Value.toFixed(defaultfloatPrecision);\\r\\n        if (ptTop.Align=='left') text=leftArrow+text;\\r\\n        else text=text+rightArrow;\\r\\n        if (ptTop.Y>(top-2))\\r\\n        {\\r\\n            this.Canvas.fillText(text,left,ptTop.Y);\\r\\n            this.ChartFrame.ChartKLine.Max={X:left, Y:ptTop.Y, Text: { BaseLine:'bottom'}};\\r\\n        }\\r\\n\\r\\n        var ptBottom=ptMin;\\r\\n        if (this.ChartFrame.CoordinateType==1)\\r\\n        {\\r\\n            if (ptMin.Y>ptMax.Y) ptBottom=ptMax;\\r\\n            this.Canvas.textBaseline='bottom';\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (ptMax.Y>ptMin.Y) ptTop=ptMin;\\r\\n            this.Canvas.textBaseline='top';\\r\\n        }\\r\\n        this.Canvas.textAlign=ptBottom.Align;\\r\\n\\r\\n        var left=ptBottom.Align=='left'?ptBottom.X:ptBottom.X;\\r\\n        if (IFrameSplitOperator.IsNumber(lowYOffset)) ptBottom.Y+=lowYOffset;\\r\\n        var text=ptMin.Value.toFixed(defaultfloatPrecision);\\r\\n        if (ptBottom.Align=='left') text=leftArrow+text;\\r\\n        else  text=text+rightArrow;\\r\\n        if (ptBottom.Y<(bottom+1))\\r\\n        {\\r\\n            this.Canvas.fillText(text,left,ptBottom.Y);\\r\\n            this.ChartFrame.ChartKLine.Min={X:left, Y:ptBottom.Y, Text:{ BaseLine:'top'}};\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.HScreenDrawMaxMinPrice=function(ptMax,ptMin)   //横屏模式下显示最大最小值\\r\\n    {\\r\\n        if (ptMax.X==null || ptMax.Y==null || ptMax.Value==null) return;\\r\\n        if (ptMin.X==null || ptMin.Y==null || ptMin.Value==null) return;\\r\\n\\r\\n        var leftArrow=g_JSChartResource.KLine.MaxMin.LeftArrow;\\r\\n        var rightArrow=g_JSChartResource.KLine.MaxMin.RightArrow;\\r\\n        var highYOffset=g_JSChartResource.KLine.MaxMin.HighYOffset;\\r\\n        var lowYOffset=g_JSChartResource.KLine.MaxMin.LowYOffset;\\r\\n\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        var xText=ptMax.Y;\\r\\n        var yText=ptMax.X;\\r\\n        if (IFrameSplitOperator.IsNumber(highYOffset)) xText+=highYOffset;\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(xText, yText);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n        this.Canvas.font=this.TextFont;\\r\\n        this.Canvas.fillStyle=this.TextColor;\\r\\n        this.Canvas.textAlign=ptMax.Align;\\r\\n        this.Canvas.textBaseline='bottom';\\r\\n        var text=ptMax.Value.toFixed(defaultfloatPrecision);\\r\\n        if (ptMax.Align=='left') text=leftArrow+text;\\r\\n        else  text=text+rightArrow;\\r\\n        this.Canvas.fillText(text,0,0);\\r\\n        this.Canvas.restore();\\r\\n\\r\\n\\r\\n        var xText=ptMin.Y;\\r\\n        var yText=ptMin.X;\\r\\n        if (IFrameSplitOperator.IsNumber(lowYOffset)) xText+=lowYOffset;\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(xText, yText);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n        this.Canvas.font=this.TextFont;\\r\\n        this.Canvas.fillStyle=this.TextColor;\\r\\n        this.Canvas.textAlign=ptMin.Align;\\r\\n        this.Canvas.textBaseline='top';\\r\\n        var text=ptMin.Value.toFixed(defaultfloatPrecision);\\r\\n        if (ptMin.Align=='left') text=leftArrow+text;\\r\\n        else text=text+rightArrow;\\r\\n        this.Canvas.fillText(text,0,0);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //画某一天的信息地雷\\r\\n    this.DrawInfo=function(item)\\r\\n    {\\r\\n        if (!this.InfoData || this.InfoData.length<=0) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var bottom=this.ChartBorder.GetBottom();\\r\\n        var top=this.ChartBorder.GetTop();\\r\\n\\r\\n        var infoData=this.InfoData.get(item.DayData.Date.toString());\\r\\n        if (!infoData || infoData.Data.length<=0) return;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        var iconSize=dataWidth+distanceWidth;\\r\\n        var minIconSize=18*pixelTatio;\\r\\n        var bShowNum=true;\\r\\n        if (iconSize<=15) bShowNum=false;\\r\\n        if (iconSize<minIconSize) iconSize=minIconSize;\\r\\n\\r\\n        var text='', title='';\\r\\n        var mapImage=new Map();\\r\\n        var iconTop=item.YMax+1*pixelTatio;\\r\\n        var iconBottom=item.YMin+1*pixelTatio+iconSize;\\r\\n        var drawTop=true;\\r\\n        var yOffset=0;\\r\\n        for(var i in infoData.Data)\\r\\n        {\\r\\n            var infoItem=infoData.Data[i];\\r\\n            var imageInfo=mapImage.get(infoItem.InfoType);\\r\\n            if (!imageInfo)\\r\\n            {\\r\\n                var icon=JSKLineInfoMap.GetIconFont(infoItem.InfoType);\\r\\n                this.Canvas.fillStyle=icon.Color;\\r\\n                this.Canvas.font=iconSize+'px '+icon.Family;\\r\\n\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.fillText(icon.HScreenText,iconTop,item.XCenter,iconSize);\\r\\n\\r\\n                    var iconRect=new Rect(item.XCenter-iconSize/2,iconTop-iconSize,iconSize,iconSize);\\r\\n                    var infoCache={ Data:new Array(infoItem), Rect:iconRect, Type:infoItem.InfoType, TextRect:{X:iconTop, Y:item.XCenter} };\\r\\n                    mapImage.set(infoItem.InfoType,infoCache);\\r\\n\\r\\n                    iconTop+=iconSize;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n                    this.Canvas.textAlign=\\\"center\\\";\\r\\n                    if (this.InfoPosition===1)\\r\\n                    {\\r\\n                        var yBottom=bottom+yOffset;\\r\\n                        this.Canvas.fillText(icon.Text,item.XCenter,yBottom,iconSize);\\r\\n                        var iconRect=new Rect(item.XCenter-iconSize/2,yBottom-iconSize,iconSize,iconSize);\\r\\n                        var infoCache={ Data:new Array(infoItem), Rect:iconRect, Type:infoItem.InfoType, TextRect:{X:item.XCenter, Y:yBottom} };\\r\\n                        mapImage.set(infoItem.InfoType,infoCache);\\r\\n                        yOffset-=iconSize;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (drawTop)\\r\\n                        {\\r\\n                            this.Canvas.fillText(icon.Text,item.XCenter,iconTop,iconSize);\\r\\n                            var iconRect=new Rect(item.XCenter-iconSize/2,iconTop-iconSize,iconSize,iconSize);\\r\\n                            var infoCache={ Data:new Array(infoItem), Rect:iconRect, Type:infoItem.InfoType, TextRect:{X:item.XCenter, Y:iconTop} };\\r\\n                            mapImage.set(infoItem.InfoType,infoCache);\\r\\n                            iconTop-=iconSize;\\r\\n                            if (iconTop-iconSize<top ) drawTop=false;\\r\\n                        }\\r\\n                        else    //上面显示不下,就显示在下面\\r\\n                        {\\r\\n                            this.Canvas.fillText(icon.Text,item.XCenter,iconBottom,iconSize);\\r\\n                            var iconRect=new Rect(item.XCenter-iconSize/2,iconBottom-iconSize,iconSize,iconSize);\\r\\n                            var infoCache={ Data:new Array(infoItem), Rect:iconRect, Type:infoItem.InfoType, TextRect:{X:item.XCenter, Y:iconBottom} };\\r\\n                            mapImage.set(infoItem.InfoType,infoCache);\\r\\n                            iconBottom+=iconSize;\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                imageInfo.Data.push(infoItem);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var numText;\\r\\n        if (g_JSChartResource.KLine.NumIcon)\\r\\n        {\\r\\n            if (isHScreen) numText=g_JSChartResource.KLine.NumIcon.HScreenText;\\r\\n            else numText=g_JSChartResource.KLine.NumIcon.Text;\\r\\n        }\\r\\n        for(var item of mapImage)\\r\\n        {\\r\\n            var value=item[1];\\r\\n            if (value.Data.length>=2 && numText && bShowNum) //太小了 就不显示了\\r\\n            {\\r\\n                var iconID=value.Data.length;\\r\\n                if (iconID>=numText.length) iconID=0;\\r\\n                this.Canvas.fillStyle=g_JSChartResource.KLine.NumIcon.Color;\\r\\n                var text=numText[iconID];\\r\\n                this.Canvas.fillText(text,value.TextRect.X,value.TextRect.Y,iconSize);\\r\\n            }\\r\\n\\r\\n            if (!isHScreen) this.InfoTooltipRect.push(value);   //横屏没有tooltip\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画交易图标\\r\\n    this.DrawTradeIcon=function()\\r\\n    {\\r\\n        if (!this.TradeData) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n            chartright=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n\\r\\n        var sellData=this.TradeData.Sell;\\r\\n        var buyData=this.TradeData.Buy;\\r\\n        var iconSize=dataWidth+distanceWidth;\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        var iconSizeMax=24*pixelTatio,iconSizeMin=12*pixelTatio;\\r\\n        if (iconSize<iconSizeMin) iconSize=iconSizeMin;\\r\\n        else if (iconSize>iconSizeMax) iconSize=iconSizeMax;\\r\\n        this.Canvas.font=iconSize+'px '+this.TradeIcon.Family;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var buy=false,sell=false;\\r\\n            if (sellData && i<sellData.length) sell=sellData[i]>0;\\r\\n            if (buyData && i<buyData.length) buy=buyData[i]>0;\\r\\n            if (!sell && !buy) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yLow=this.GetYFromData(data.Low,false);\\r\\n            var yHigh=this.GetYFromData(data.High,false);\\r\\n            var yOpen=this.GetYFromData(data.Open,false);\\r\\n            var yClose=this.GetYFromData(data.Close,false);\\r\\n            var y=yHigh;\\r\\n\\r\\n            if (buy)\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.TradeIcon.Buy.Color;\\r\\n\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.textAlign='right';\\r\\n                    this.Canvas.textBaseline='middle';\\r\\n                    this.Canvas.fillText(this.TradeIcon.Buy.HScreenText,yLow,x);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textAlign='center';\\r\\n                    this.Canvas.textBaseline='top';\\r\\n                    this.Canvas.fillText(this.TradeIcon.Buy.Text,x,yLow);\\r\\n\\r\\n                    var iconRect=new Rect(x-iconSize/2,yLow,iconSize,iconSize);\\r\\n                    var iconData={ Data:{ Type:1, KData:data, Name:this.TradeData.Name, Param:this.TradeData.Param }, Rect:iconRect, TextRect:{X:x, Y:yLow} };\\r\\n                    this.TradeIconTooltipRect.push(iconData);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (sell)\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.TradeIcon.Sell.Color;\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.textAlign='left';\\r\\n                    this.Canvas.textBaseline='middle';\\r\\n                    this.Canvas.fillText(this.TradeIcon.Sell.HScreenText,yHigh,x);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textAlign='center';\\r\\n                    this.Canvas.textBaseline='bottom';\\r\\n                    this.Canvas.fillText(this.TradeIcon.Sell.Text,x,yHigh);\\r\\n\\r\\n                    var iconRect=new Rect(x-iconSize/2,yHigh-iconSize,iconSize,iconSize);\\r\\n                    var iconData={ Data:{ Type:2, KData:data, Name:this.TradeData.Name,Param:this.TradeData.Param }, Rect:iconRect, TextRect:{X:x, Y:yHigh} };\\r\\n                    this.TradeIconTooltipRect.push(iconData);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        for(var i in this.TradeIconTooltipRect)\\r\\n        {\\r\\n            var item=this.TradeIconTooltipRect[i];\\r\\n            if (!item.Rect) continue;\\r\\n            var rect=item.Rect;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                JSConsole.Chart.Log('[ChartKLine::GetTooltipData] trade icon ', item);\\r\\n                tooltip.Data=item;\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=2; //指标\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in this.InfoTooltipRect)\\r\\n        {\\r\\n            var item=this.InfoTooltipRect[i];\\r\\n            if (!item.Rect) continue;\\r\\n            var rect=item.Rect;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                //JSConsole.Chart.Log('[ChartKLine::GetTooltipData] info ', item);\\r\\n                tooltip.Data=item;\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=1; //信息地雷\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in this.TooltipRect)\\r\\n        {\\r\\n            var rect=this.TooltipRect[i][1];\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                var index=this.TooltipRect[i][0];\\r\\n                tooltip.Data=this.Data.Data[index];\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=0; //K线信息\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    //计算当天显示数据的最大最小值\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Max=null;\\r\\n        range.Min=null;\\r\\n        if (this.DrawType==1 || this.DrawType==4 )    // 1=收盘价线 4=收盘价面积图\\r\\n        {\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n            {\\r\\n                var data=this.Data.Data[i];\\r\\n                if (!IFrameSplitOperator.IsNumber(data.Close)) continue;\\r\\n\\r\\n                if (range.Max==null) range.Max=data.Close;\\r\\n                if (range.Min==null) range.Min=data.Close;\\r\\n\\r\\n                if (range.Max<data.Close) range.Max=data.Close;\\r\\n                if (range.Min>data.Close) range.Min=data.Close;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n            {\\r\\n                var data=this.Data.Data[i];\\r\\n                if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n\\r\\n                if (range.Max==null) range.Max=data.High;\\r\\n                if (range.Min==null) range.Min=data.Low;\\r\\n\\r\\n                if (range.Max<data.High) range.Max=data.High;\\r\\n                if (range.Min>data.Low) range.Min=data.Low;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    //获取所有的价格\\r\\n    this.GetAllPrice=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var setPrice=new Set();\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            var value=data.Close;\\r\\n            setPrice.add(value);\\r\\n        }\\r\\n\\r\\n        var aryPrice=[];\\r\\n        for(var item of setPrice)\\r\\n        {\\r\\n            aryPrice.push(item);\\r\\n        }\\r\\n\\r\\n        aryPrice.sort(function(a,b) { return a-b; });   //排序 升序\\r\\n\\r\\n        return aryPrice;\\r\\n    }\\r\\n\\r\\n    this.DrawLastPointEvent=function(ptLast)\\r\\n    {\\r\\n        if (!this.GetEventCallback)  return;\\r\\n\\r\\n        //通知外部绘制最后一个点\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_KLINE_LAST_POINT);\\r\\n        if (event)\\r\\n        {\\r\\n            var kWidth={ Data: this.ChartFrame.DataWidth, Distance:this.ChartFrame.DistanceWidth };\\r\\n            if (ptLast) var data={ LastPoint:{ X:ptLast.X, Y:ptLast.Y, XLeft:ptLast.XLeft, XRight:ptLast.XRight }, KItem:ptLast.KItem, DrawType:this.DrawType, KWidth:kWidth, ChartRight:ptLast.ChartRight };\\r\\n            else var data={ LastPoint:null, KItem:null, KWidth:kWidth };\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\nfunction ChartColorKline()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartColorKline';    //类名\\r\\n    this.Symbol;        //股票代码\\r\\n    this.Color='rgb(0,255,44)';\\r\\n    this.DrawType=0;    //0=实心K线柱子  3=空心K线柱子\\r\\n    this.KLineColor;    //Map key=K线索引 value=设置\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow) return;\\r\\n        if (!this.KLineColor) return;\\r\\n        this.DrawBar();\\r\\n    }\\r\\n\\r\\n    this.DrawUpBarItem=function(data, xOffset, dataWidth, option)\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var left=xOffset;\\r\\n        var right=xOffset+dataWidth;\\r\\n        var x=left+(right-left)/2;\\r\\n\\r\\n        var yLow=this.ChartFrame.GetYFromData(data.Low);\\r\\n        var yHigh=this.ChartFrame.GetYFromData(data.High);\\r\\n        var yOpen=this.ChartFrame.GetYFromData(data.Open);\\r\\n        var yClose=this.ChartFrame.GetYFromData(data.Close);\\r\\n        var y=yHigh;\\r\\n\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(this.DrawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(this.DrawType==3?Math.min(yClose,yOpen):yClose));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                y=yClose;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yClose;\\r\\n            }\\r\\n\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                if (Math.abs(yOpen-y)<1)\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.DrawType==3) //空心柱\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (Math.abs(yOpen-y)<1)\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.DrawType==3) //空心柱\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(this.DrawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(this.DrawType==3?Math.max(yClose,yOpen):y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawDownBarItem=function(data, xOffset, dataWidth, option)\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var left=xOffset;\\r\\n        var right=xOffset+dataWidth;\\r\\n        var x=left+(right-left)/2;\\r\\n\\r\\n        var yLow=this.ChartFrame.GetYFromData(data.Low);\\r\\n        var yHigh=this.ChartFrame.GetYFromData(data.High);\\r\\n        var yOpen=this.ChartFrame.GetYFromData(data.Open);\\r\\n        var yClose=this.ChartFrame.GetYFromData(data.Close);\\r\\n        var y=yHigh;\\r\\n\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yOpen),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yOpen));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                y=yOpen;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yOpen\\r\\n            }\\r\\n\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                if (Math.abs(yClose-y)<1) this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                else this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yClose-y),ToFixedRect(dataWidth));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (Math.abs(yClose-y)<1) this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                else this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yClose)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yClose-y)));\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawUnChangeBarItem=function(data, xOffset, dataWidth, option)\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var left=xOffset;\\r\\n        var right=xOffset+dataWidth;\\r\\n        var x=left+(right-left)/2;\\r\\n\\r\\n        var yLow=this.ChartFrame.GetYFromData(data.Low);\\r\\n        var yHigh=this.ChartFrame.GetYFromData(data.High);\\r\\n        var yOpen=this.ChartFrame.GetYFromData(data.Open);\\r\\n        var yClose=this.ChartFrame.GetYFromData(data.Close);\\r\\n        var y=yHigh;\\r\\n\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (data.High>data.Close)   //上影线\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(yOpen,ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),yOpen);\\r\\n                }\\r\\n                y=yOpen;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                y=yOpen;\\r\\n            }\\r\\n\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(left));\\r\\n                this.Canvas.lineTo(ToFixedPoint(y),ToFixedPoint(right));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));\\r\\n                this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(y));\\r\\n            }\\r\\n\\r\\n            if (data.Open>data.Low) //下影线\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawBar=function()\\r\\n    {\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n            chartright=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n            if (!this.KLineColor.has(i)) continue;\\r\\n            var itemOption=this.KLineColor.get(i);\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n\\r\\n            if (itemOption.Color)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=itemOption.Color;\\r\\n                this.Canvas.fillStyle=itemOption.Color;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.fillStyle=this.Color;\\r\\n            }\\r\\n\\r\\n            if (data.Open<data.Close)   //阳线\\r\\n            {\\r\\n                this.DrawUpBarItem(data,xOffset,dataWidth,itemOption);\\r\\n            }\\r\\n            else if (data.Open>data.Close)  //阴线\\r\\n            {\\r\\n                this.DrawDownBarItem(data,xOffset,dataWidth,itemOption);\\r\\n            }\\r\\n            else    //平线\\r\\n            {\\r\\n                this.DrawUnChangeBarItem(data,xOffset,dataWidth,itemOption);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={Max:null,Min:null };\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//K线叠加 支持横屏\\r\\nvar OVERLAY_STATUS_ID=\\r\\n    {\\r\\n        STATUS_NONE_ID:0,           //空闲状态\\r\\n        STATUS_REQUESTDATA_ID:1,    //请求数据\\r\\n        STATUS_RECVDATA_ID:2,       //接收到数据\\r\\n        STATUS_FINISHED_ID:3,       //数据下载完成\\r\\n    };\\r\\n\\r\\nfunction ChartOverlayKLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartOverlayKLine';    //类名\\r\\n    this.Color=\\\"rgb(65,105,225)\\\";\\r\\n    this.MainData;                  //主图K线数据\\r\\n    this.SourceData;                //叠加的原始数据\\r\\n    this.Title;\\r\\n    this.DrawType=0;\\r\\n    this.CustomDrawType=null;       //图形类型\\r\\n    this.Status=OVERLAY_STATUS_ID.STATUS_NONE_ID;\\r\\n    this.IsDelete=false;            //是否已经删除\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (!option) return;\\r\\n        if (IFrameSplitOperator.IsNumber(option.DrawType)) this.CustomDrawType=option.DrawType;\\r\\n    }\\r\\n\\r\\n    this.DrawKBar=function(firstOpen)   //firstOpen 当前屏第1个显示数据\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var drawType=this.DrawType;\\r\\n        if (this.CustomDrawType!=null) drawType=this.CustomDrawType;\\r\\n\\r\\n        var isFristDraw=true;\\r\\n        var firstOverlayOpen=null;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (!data || data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            if (firstOverlayOpen==null) firstOverlayOpen=data.Open;\\r\\n\\r\\n            if (isFristDraw)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.fillStyle=this.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                isFristDraw=false;\\r\\n            }\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yLow=this.GetYFromData(data.Low/firstOverlayOpen*firstOpen,false);\\r\\n            var yHigh=this.GetYFromData(data.High/firstOverlayOpen*firstOpen,false);\\r\\n            var yOpen=this.GetYFromData(data.Open/firstOverlayOpen*firstOpen,false);\\r\\n            var yClose=this.GetYFromData(data.Close/firstOverlayOpen*firstOpen,false);\\r\\n            var y=yHigh;\\r\\n\\r\\n            if (data.Open<data.Close)       //阳线\\r\\n            {\\r\\n                if (dataWidth>=4)\\r\\n                {\\r\\n                    if (data.High>data.Close)   //上影线\\r\\n                    {\\r\\n                        if (isHScreen)\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(this.DrawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(this.DrawType==3?Math.min(yClose,yOpen):yClose));\\r\\n                        }\\r\\n                        y=yClose;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        y=yClose;\\r\\n                    }\\r\\n\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        if (Math.abs(yOpen-y)<1)\\r\\n                        {\\r\\n                            this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            if (drawType==3) this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));   //空心柱\\r\\n                            else this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));\\r\\n                        }\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (Math.abs(yOpen-y)<1)\\r\\n                        {\\r\\n                            this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            if (drawType==3) this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));   //空心柱\\r\\n                            else this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    if (data.Open>data.Low)\\r\\n                    {\\r\\n                        if (isHScreen)\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(this.DrawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(this.DrawType==3?Math.max(yClose,yOpen):y));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else if (data.Open>data.Close)  //阴线\\r\\n            {\\r\\n                if (dataWidth>=4)\\r\\n                {\\r\\n                    if (data.High>data.Close)   //上影线\\r\\n                    {\\r\\n                        if (isHScreen)\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(yOpen),ToFixedPoint(x));\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yOpen));\\r\\n                        }\\r\\n                        y=yOpen;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        y=yOpen\\r\\n                    }\\r\\n\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        if (Math.abs(yClose-y)<1) this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));    //高度小于1,统一使用高度1\\r\\n                        else this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yClose-y),ToFixedRect(dataWidth));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (Math.abs(yClose-y)<1) this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);    //高度小于1,统一使用高度1\\r\\n                        else this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),ToFixedRect(yClose-y));\\r\\n                    }\\r\\n\\r\\n                    if (data.Open>data.Low) //下影线\\r\\n                    {\\r\\n                        if (isHScreen)\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else // 平线\\r\\n            {\\r\\n                if (dataWidth>=4)\\r\\n                {\\r\\n                    if (data.High>data.Close)   //上影线\\r\\n                    {\\r\\n                        if (isHScreen)\\r\\n                        {\\r\\n                            this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                            this.Canvas.lineTo(yOpen,ToFixedPoint(x));\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                            this.Canvas.lineTo(ToFixedPoint(x),yOpen);\\r\\n                        }\\r\\n\\r\\n                        y=yOpen;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        y=yOpen;\\r\\n                    }\\r\\n\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(left));\\r\\n                        this.Canvas.lineTo(ToFixedPoint(y),ToFixedPoint(right));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));\\r\\n                        this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(y));\\r\\n                    }\\r\\n\\r\\n                    if (data.Open>data.Low) //下影线\\r\\n                    {\\r\\n                        if (isHScreen)\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                            this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            //添加tooltip区域\\r\\n            {\\r\\n                var yTop=Math.min(yLow,yHigh,yOpen,yClose);\\r\\n                var yBottom=Math.max(yLow,yHigh,yOpen,yClose);\\r\\n                var rect=new Rect(left,yTop,dataWidth,yBottom-yTop);\\r\\n                //this.Canvas.fillStyle=\\\"rgb(0,0,100)\\\";\\r\\n                //this.Canvas.fillRect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n                this.TooltipRect.push([i,rect]);    //[0]数据索引 [1]数据区域\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (isFristDraw==false) this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawAKLine=function(firstOpen) //美国线\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var firstOverlayOpen=null;\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            if (firstOverlayOpen==null) firstOverlayOpen=data.Open;\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yLow=this.GetYFromData(data.Low/firstOverlayOpen*firstOpen,false);\\r\\n            var yHigh=this.GetYFromData(data.High/firstOverlayOpen*firstOpen,false);\\r\\n            var yOpen=this.GetYFromData(data.Open/firstOverlayOpen*firstOpen,false);\\r\\n            var yClose=this.GetYFromData(data.Close/firstOverlayOpen*firstOpen,false);\\r\\n\\r\\n            this.Canvas.beginPath();   //最高-最低\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(yHigh,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yLow,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),yHigh);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yLow);\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            if (dataWidth>=4)\\r\\n            {\\r\\n                this.Canvas.beginPath();    //开盘\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(yOpen),left);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yOpen),x);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(left,ToFixedPoint(yOpen));\\r\\n                    this.Canvas.lineTo(x,ToFixedPoint(yOpen));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n\\r\\n                this.Canvas.beginPath();    //收盘\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(yClose),right);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(yClose),x);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(right,ToFixedPoint(yClose));\\r\\n                    this.Canvas.lineTo(x,ToFixedPoint(yClose));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.DrawCloseLine=function(firstOpen)  //收盘价线\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var firstOverlayOpen=null;\\r\\n        var bFirstPoint=true;\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        this.Canvas.beginPath();\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            if (firstOverlayOpen==null) firstOverlayOpen=data.Open;\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n            var yClose=this.GetYFromData(data.Close/firstOverlayOpen*firstOpen,false);\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.moveTo(yClose,x);\\r\\n                else this.Canvas.moveTo(x,yClose);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(yClose,x);\\r\\n                else this.Canvas.lineTo(x,yClose);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bFirstPoint==false) this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.TooltipRect=[];\\r\\n        this.InfoTooltipRect=[];\\r\\n        if (!this.MainData || !this.Data) return;\\r\\n\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var firstOpen=null; //主线数据第1个开盘价\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var data=this.MainData.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n            firstOpen=data.Open;\\r\\n            break;\\r\\n        }\\r\\n\\r\\n        if (firstOpen==null) return;\\r\\n\\r\\n        var drawType=this.DrawType;\\r\\n        if (this.CustomDrawType!=null) drawType=this.CustomDrawType;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.ClipClient(this.ChartFrame.IsHScreen);\\r\\n\\r\\n        if (drawType==1) this.DrawCloseLine(firstOpen);\\r\\n        else if (drawType==2) this.DrawAKLine(firstOpen);\\r\\n        else this.DrawKBar(firstOpen);\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Max=null;\\r\\n        range.Min=null;\\r\\n\\r\\n        if (!this.MainData || !this.Data) return range;\\r\\n\\r\\n        var firstOpen=null; //主线数据第1个收盘价\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var data=this.MainData.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n            firstOpen=data.Close;\\r\\n            break;\\r\\n        }\\r\\n\\r\\n        if (firstOpen==null) return range;\\r\\n\\r\\n        var firstOverlayOpen=null;\\r\\n        var high,low;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (!data || data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n            if (firstOverlayOpen==null) firstOverlayOpen=data.Open;\\r\\n\\r\\n            high=data.High/firstOverlayOpen*firstOpen;\\r\\n            low=data.Low/firstOverlayOpen*firstOpen;\\r\\n            if (range.Max==null) range.Max=high;\\r\\n            if (range.Min==null) range.Min=low;\\r\\n\\r\\n            if (range.Max<high) range.Max=high;\\r\\n            if (range.Min>low) range.Min=low;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        for(var i in this.TooltipRect)\\r\\n        {\\r\\n            var rect=this.TooltipRect[i][1];\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                var index=this.TooltipRect[i][0];\\r\\n                tooltip.Data=this.Data.Data[index];\\r\\n                tooltip.ChartPaint=this;\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n//分钟成交量 支持横屏\\r\\nfunction ChartMinuteVolumBar()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartMinuteVolumBar';    //类名\\r\\n\\r\\n    this.UpColor = g_JSChartResource.UpBarColor;            //上涨\\r\\n    this.DownColor = g_JSChartResource.DownBarColor;        //下跌\\r\\n    this.UnchangeColor=g_JSChartResource.UnchagneBarColor;  //平盘\\r\\n\\r\\n    this.CustomColor=g_JSChartResource.Minute.VolBarColor;   //自定义颜色\\r\\n\\r\\n    this.YClose;    //前收盘\\r\\n    this.Symbol;\\r\\n    this.BeforeOpenData;    //盘前数据\\r\\n    this.AfterCloseData;    //盘后数据\\r\\n    this.BeforeVolColor=g_JSChartResource.Minute.Before.VolColor;\\r\\n\\r\\n    this.MultiDayBeforeOpenData;    //多日分时图 盘前数据 数组 1天一个\\r\\n    this.MultiDayAfterCloseData;    //多日分时图 盘后数据 数组 1天一个\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        var isHScreen = (this.ChartFrame.IsHScreen === true);\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            var chartright = border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var chartright=border.RightEx;\\r\\n        }\\r\\n\\r\\n        this.DrawBeforeOpen();\\r\\n        this.DrawMultiDayBeforeOpen();\\r\\n\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n        var yPrice=this.YClose; //上一分钟的价格\\r\\n        var data=this.Data;\\r\\n        var bShowColorBar=MARKET_SUFFIX_NAME.IsShowMinuteColorVolBar(this.Symbol);\\r\\n\\r\\n        if (bShowColorBar) this.Canvas.strokeStyle=this.CustomColor;\\r\\n        for(var i=data.DataOffset,j=0;i<data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var item = data.Data[i];\\r\\n            var vol=null;\\r\\n            if (!item) continue;\\r\\n            var price=null;\\r\\n\\r\\n            vol=item.Vol;\\r\\n            price=item.Close;\\r\\n\\r\\n            if (!vol) continue;\\r\\n\\r\\n            var y=this.ChartFrame.GetYFromData(vol);\\r\\n            var x=this.ChartFrame.GetXFromIndex(i);\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            //价格>=上一分钟价格 红色 否则绿色\\r\\n            if (!bShowColorBar) this.Canvas.strokeStyle = price >= yPrice ? this.UpColor:this.DownColor;\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yBottom,ToFixedPoint(x));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yBottom);\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n            if (price) yPrice=price;\\r\\n        }\\r\\n\\r\\n        this.DrawAfterClose();\\r\\n        this.DrawMultiDayAfterClose();\\r\\n    }\\r\\n\\r\\n    this.DrawBeforeOpen=function()\\r\\n    {\\r\\n        if (this.ChartBorder.LeftExtendWidth<10) return;\\r\\n        if (!this.BeforeOpenData) return;\\r\\n\\r\\n        this.DrawCallAuction(-1,this.BeforeOpenData,true);\\r\\n    }\\r\\n\\r\\n    this.DrawAfterClose=function()\\r\\n    {\\r\\n        if (this.ChartBorder.RightExtendWidth<10) return;\\r\\n        if (!this.AfterCloseData) return;\\r\\n\\r\\n        this.DrawCallAuction(-1,this.AfterCloseData,false);\\r\\n    }\\r\\n\\r\\n    this.DrawMultiDayBeforeOpen=function()\\r\\n    {\\r\\n        if (this.ChartBorder.MultiDayMinute.Count<=1 || this.ChartBorder.MultiDayMinute.Left<=0) return;\\r\\n        if (!this.MultiDayBeforeOpenData) return;\\r\\n\\r\\n        for(var i in this.MultiDayBeforeOpenData)\\r\\n        {\\r\\n            var dayItem=this.MultiDayBeforeOpenData[i];\\r\\n            this.DrawCallAuction(parseInt(i), dayItem, true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawMultiDayAfterClose=function()\\r\\n    {\\r\\n        if (this.ChartBorder.MultiDayMinute.Count<=1 || this.ChartBorder.MultiDayMinute.Right<=0) return;\\r\\n        if (!this.MultiDayAfterCloseData) return;\\r\\n\\r\\n        for(var i in this.MultiDayAfterCloseData)\\r\\n        {\\r\\n            var dayItem=this.MultiDayAfterCloseData[i];\\r\\n            this.DrawCallAuction(parseInt(i), dayItem, false);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCallAuction=function(indexDay, callAutionData, isBeforeOpen)\\r\\n    {\\r\\n        if (!callAutionData) return;\\r\\n\\r\\n        callAutionData.Index=indexDay;\\r\\n        var border=this.GetBorder();\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var yPrice=this.YClose;             //上一分钟的价格\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n        if (callAutionData.Ver==1.0)\\r\\n        {\\r\\n            for(var i in callAutionData.Data)\\r\\n            {\\r\\n                var item=callAutionData.Data[i];\\r\\n                if (!item || !IFrameSplitOperator.IsNumber(item.Vol[0])) continue;\\r\\n\\r\\n                if (isBeforeOpen)\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetLeftExtendXFromIndex(i,callAutionData);\\r\\n                    var y=this.ChartFrame.GetLeftExtendYFromData(item.Vol[0]);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetRightExtendXFromIndex(i,callAutionData);\\r\\n                    var y=this.ChartFrame.GetRightExtendYFromData(item.Vol[0]);\\r\\n                }\\r\\n\\r\\n\\r\\n                this.Canvas.strokeStyle = item.Price >= yPrice ? this.UpColor:this.DownColor;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(yBottom,ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),yBottom);\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                if (item.Price) yPrice=item.Price;\\r\\n            }\\r\\n        }\\r\\n        else if (callAutionData.Ver==2.0 || callAutionData.Ver==3.0)\\r\\n        {\\r\\n            var range={ Max: callAutionData.VolMax, Min:callAutionData.VolMin }\\r\\n\\r\\n            for(var i in callAutionData.Data)\\r\\n            {\\r\\n                var item=callAutionData.Data[i];\\r\\n                if (!item) continue;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.Vol[0]))\\r\\n                {\\r\\n                    if (isBeforeOpen)\\r\\n                    {\\r\\n                        var x=this.ChartFrame.GetLeftExtendXFromIndex(i,callAutionData);\\r\\n                        var y=this.ChartFrame.GetLeftExtendYFromData(item.Vol[0],false, { Range:range });\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var x=this.ChartFrame.GetRightExtendXFromIndex(i,callAutionData);\\r\\n                        var y=this.ChartFrame.GetRightExtendYFromData(item.Vol[0],false, { Range:range });\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.strokeStyle = this.GetBarColor(item.ColorID);\\r\\n\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(yBottom,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),yBottom);\\r\\n                    }\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.Vol[1]))\\r\\n                {\\r\\n                    if (isBeforeOpen)\\r\\n                    {\\r\\n                        var x=this.ChartFrame.GetLeftExtendXFromIndex(i,callAutionData);\\r\\n                        var y=this.ChartFrame.GetLeftExtendYFromData(item.Vol[1],false, { Range:range });\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var x=this.ChartFrame.GetRightExtendXFromIndex(i,callAutionData);\\r\\n                        var y=this.ChartFrame.GetRightExtendYFromData(item.Vol[1],false, { Range:range });\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.strokeStyle = this.GetBarColor(item.ColorID);\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        y-=yBottom;\\r\\n                        y=border.RightEx-y;\\r\\n                        this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(border.RightEx,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        y-=yBottom;\\r\\n                        y=border.TopEx-y;\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),border.TopEx);\\r\\n                    }\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetBarColor=function(id)\\r\\n    {\\r\\n        switch(id)\\r\\n        {\\r\\n            case 0:\\r\\n                return this.UnchangeColor;\\r\\n            case 1:\\r\\n                return this.UpColor;\\r\\n            case 2:\\r\\n                return this.DownColor;\\r\\n        }\\r\\n\\r\\n        if (this.BeforeVolColor && Array.isArray(this.BeforeVolColor))\\r\\n        {\\r\\n            var index=id-3;\\r\\n            if (index>=0 && index<this.BeforeVolColor.length)\\r\\n                return this.BeforeVolColor[index];\\r\\n        }\\r\\n\\r\\n        return this.UnchangeColor;\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=0;\\r\\n        range.Max=null;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var item = this.Data.Data[i];\\r\\n            if (!item || !item.Vol) continue;\\r\\n            if (range.Max == null) range.Max = item.Vol;\\r\\n            if (range.Max < item.Vol) range.Max = item.Vol;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction ChartErrorMessage()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartErrorMessage';    //类名\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow) return;\\r\\n        if (this.NotSupportMessage) this.DrawNotSupportmessage();\\r\\n    }\\r\\n}\\r\\n\\r\\n//线段 支持横屏\\r\\nfunction ChartLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartLine';    //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";   //线段颜色\\r\\n    this.LineWidth;                 //线段宽度\\r\\n    this.DrawType=0;                //画图方式  0=无效数平滑  1=无效数不画断开\\r\\n    this.IsDotLine=false;           //虚线\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        switch(this.DrawType)\\r\\n        {\\r\\n            case 0:\\r\\n                return this.DrawLine();\\r\\n            case 1:\\r\\n                return this.DrawStraightLine();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function()\\r\\n    {\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (bHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        if (this.LineWidth>0) this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        if (this.IsDotLine) this.Canvas.setLineDash(g_JSChartResource.DOTLINE.LineDash); //画虚线\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (bHScreen) this.Canvas.moveTo(y,x);  //横屏坐标轴对调\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (bHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //无效数不画\\r\\n    this.DrawStraightLine=function()\\r\\n    {\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var isMinute=this.IsMinuteFrame();\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (bHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            var chartright=border.BottomEx;\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.RightEx;\\r\\n        }\\r\\n\\r\\n        var lockRect=this.GetLockRect();\\r\\n        if (lockRect)\\r\\n        {\\r\\n            if (bHScreen) chartright=lockRect.Top;\\r\\n            else chartright=lockRect.Left;\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.ClipClient(bHScreen);\\r\\n        if (this.LineWidth>0) this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        if (this.IsDotLine) this.Canvas.setLineDash(g_JSChartResource.DOTLINE.LineDash); //画虚线\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            //for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null)\\r\\n            {\\r\\n                if (drawCount>0) this.Canvas.stroke();\\r\\n                bFirstPoint=true;\\r\\n                drawCount=0;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (isMinute)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n                var x=left+(right-left)/2;\\r\\n            }\\r\\n\\r\\n            var y=this.GetYFromData(value,false);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (bHScreen) this.Canvas.moveTo(y,x);  //横屏坐标轴对调\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (bHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//子线段\\r\\nfunction ChartSubLine()\\r\\n{\\r\\n    this.newMethod=ChartLine;       //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartSubLine';     //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";   //线段颜色\\r\\n    this.LineWidth;                 //线段宽度\\r\\n    this.DrawType=0;                //画图方式  0=无效数平滑  1=无效数不画断开\\r\\n    this.IsDotLine=false;           //虚线\\r\\n\\r\\n    this.SubFrame={ Max:null,Min:null };\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow) return;\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        this.CalculateDataMaxMin();\\r\\n\\r\\n        switch(this.DrawType)\\r\\n        {\\r\\n            case 0:\\r\\n                return this.DrawLine();\\r\\n            case 1:\\r\\n                return this.DrawStraightLine();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetYFromData=function(value)\\r\\n    {\\r\\n        var bHScreen = (this.ChartFrame.IsHScreen === true);\\r\\n\\r\\n        if (bHScreen)\\r\\n        {\\r\\n            if (value <= this.SubFrame.Min) return this.ChartBorder.GetLeftEx();\\r\\n            if (value >= this.SubFrame.Max) return this.ChartBorder.GetRightEx();\\r\\n\\r\\n            var width = this.ChartBorder.GetWidthEx() * (value - this.SubFrame.Min) / (this.SubFrame.Max - this.SubFrame.Min);\\r\\n            return this.ChartBorder.GetLeftEx() + width;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if(value<=this.SubFrame.Min) return this.ChartBorder.GetBottomEx();\\r\\n            if(value>=this.SubFrame.Max) return this.ChartBorder.GetTopEx();\\r\\n\\r\\n            var height=this.ChartBorder.GetHeightEx()*(value-this.SubFrame.Min)/(this.SubFrame.Max-this.SubFrame.Min);\\r\\n            return this.ChartBorder.GetBottomEx()-height;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateDataMaxMin=function()\\r\\n    {\\r\\n        this.SubFrame={ Max:null,Min:null };\\r\\n\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (bHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (this.SubFrame.Min==null || this.SubFrame.Min>value) this.SubFrame.Min=value;\\r\\n            if (this.SubFrame.Max==null || this.SubFrame.Max<value) this.SubFrame.Max=value;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()   //数据不参与坐标轴最大最小值计算\\r\\n    {\\r\\n        var range={Min:null, Max:null};\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//叠加线段\\r\\nfunction ChartOverlayLine()\\r\\n{\\r\\n    this.newMethod=ChartLine;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.MainData=new ChartData();  //主数据\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n        if (!this.MainData || !this.MainData.Data) return;\\r\\n\\r\\n        switch(this.DrawType)\\r\\n        {\\r\\n            case 0:\\r\\n                return this.DrawLine();\\r\\n            case 1:\\r\\n                return this.DrawStraightLine();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //获取第1个有效数据\\r\\n    this.GetFirstVaildIndex=function()\\r\\n    {\\r\\n        var startIndex=this.Data.DataOffset;\\r\\n        for(var i=startIndex, j=0 ; i<this.MainData.Data.length && i<this.Data.Data.length; ++i,++j )\\r\\n        {\\r\\n            var value=this.MainData.Data[i];\\r\\n            var overlayValue=this.Data.Data[i];\\r\\n            if (IFrameSplitOperator.IsNumber(value) && IFrameSplitOperator.IsNumber(overlayValue))\\r\\n                return { Index:j, DataOffset:i, OverlayValue:overlayValue, MainValue:value };\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    //无效数不画\\r\\n    this.DrawStraightLine=function()\\r\\n    {\\r\\n        var firstData=this.GetFirstVaildIndex();\\r\\n        if (!firstData) return;\\r\\n\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (bHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var lockRect=this.GetLockRect();\\r\\n        if (lockRect)\\r\\n        {\\r\\n            if (bHScreen) chartright=lockRect.Top;\\r\\n            else chartright=lockRect.Left;\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        if (this.LineWidth>0) this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        if (this.IsDotLine) this.Canvas.setLineDash([3,5]); //画虚线\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0,rate=0;\\r\\n        for(var i=firstData.DataOffset,j=firstData.Index;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null)\\r\\n            {\\r\\n                if (drawCount>0) this.Canvas.stroke();\\r\\n                bFirstPoint=true;\\r\\n                drawCount=0;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var diff=value-firstData.OverlayValue;\\r\\n            if (firstData.OverlayValue!=0) rate= 1+ diff/Math.abs(firstData.OverlayValue);\\r\\n            else rate=1+diff;\\r\\n            var fixedValue=firstData.MainValue*rate;\\r\\n            //var fixedValue=value/firstData.OverlayValue*firstData.MainValue;\\r\\n            var y=this.GetYFromData(fixedValue);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (bHScreen) this.Canvas.moveTo(y,x);  //横屏坐标轴对调\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (bHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        var firstData=this.GetFirstVaildIndex();\\r\\n        if (!firstData) return range;\\r\\n\\r\\n        for(var i=firstData.DataOffset,j=firstData.Index; i<this.Data.Data.length && j<xPointCount; ++i,++j)\\r\\n        {\\r\\n            var overlayValue=this.Data.Data[i];\\r\\n            if (!IFrameSplitOperator.IsNumber(overlayValue)) continue;\\r\\n\\r\\n            var diff=overlayValue-firstData.OverlayValue;\\r\\n            if (firstData.OverlayValue!=0) rate= 1+ diff/Math.abs(firstData.OverlayValue);\\r\\n            else rate=1+diff;\\r\\n            var value=firstData.MainValue*rate;\\r\\n            //var value=overlayValue/firstData.OverlayValue*firstData.MainValue;\\r\\n\\r\\n            if (range.Max==null) range.Max=value;\\r\\n            if (range.Min==null) range.Min=value;\\r\\n\\r\\n            if (range.Max<value) range.Max=value;\\r\\n            if (range.Min>value) range.Min=value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//彩色线段\\r\\nfunction ChartPartLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartPartLine';     //类名\\r\\n    this.LineWidth;                     //线段宽度\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        this.DrawLine();\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function()\\r\\n    {\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (bHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        if (this.LineWidth>0) this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        var lastColor;\\r\\n        var lastPoint={X:null,Y:null};\\r\\n        var isPerNull=false;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (item==null || item.Value==null)\\r\\n            {\\r\\n                lastPoint.X=null;\\r\\n                lastPoint.Y=null;\\r\\n                isPerNull=true;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var value=item.Value;\\r\\n            var color=item.RGB;\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (color!=lastColor || isPerNull==true)\\r\\n            {\\r\\n                if (lastColor && drawCount>0) this.Canvas.stroke();\\r\\n\\r\\n                drawCount=0;\\r\\n                lastColor=color;\\r\\n                this.Canvas.strokeStyle=color;\\r\\n                this.Canvas.beginPath();\\r\\n\\r\\n                if (lastPoint.X!=null && lastPoint.Y!=null) //接着上一个点连线\\r\\n                {\\r\\n                    if (bHScreen) this.Canvas.moveTo(lastPoint.Y,lastPoint.X);  //横屏坐标轴对调\\r\\n                    else this.Canvas.moveTo(lastPoint.X,lastPoint.Y);\\r\\n\\r\\n                    if (bHScreen) this.Canvas.lineTo(y,x);\\r\\n                    else this.Canvas.lineTo(x,y);\\r\\n\\r\\n                    ++drawCount;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (bHScreen) this.Canvas.moveTo(y,x);  //横屏坐标轴对调\\r\\n                    else this.Canvas.moveTo(x,y);\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (bHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n                ++drawCount;\\r\\n            }\\r\\n\\r\\n            lastPoint.X=x;\\r\\n            lastPoint.Y=y;\\r\\n            isPerNull=false;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var item = this.Data.Data[i];\\r\\n            if (!item || !item.Value) continue;\\r\\n            if (range.Max == null || range.Max<item.Value) range.Max = item.Value;\\r\\n            if (range.Min == null || range.Min>item.Value) range.Min = item.Value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//斜率线 DRAWSL()\\r\\nfunction ChartSlopeLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartSlopeLine';     //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";        //线段颜色\\r\\n    this.IsDotLine=false;\\r\\n    this.LineWidth;\\r\\n    this.Option;    //[ { Slope:slope, Length:len, Direct:direct } ]\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        if (this.IsDotLine) this.Canvas.setLineDash(g_JSChartResource.DOTLINE.LineDash); //画虚线\\r\\n\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var bottom=this.ChartBorder.GetBottom();\\r\\n\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,(right-left),(bottom-top));\\r\\n        this.Canvas.clip();\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n            var option=this.Option[i];\\r\\n            if (!option) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n            var z=option.Length*g_JSChartResource.DRAWSL.PixelWidth;\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            var x2=Math.sqrt((z*z)/(1+option.Slope*option.Slope));\\r\\n            var y2=x2*option.Slope;\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (option.Direct==2)\\r\\n            {\\r\\n                this.Canvas.moveTo(x-x2,y+y2);\\r\\n                this.Canvas.lineTo(x+x2,y-y2);\\r\\n            }\\r\\n            else if (option.Direct==1)\\r\\n            {\\r\\n                this.Canvas.moveTo(x,y);\\r\\n                this.Canvas.lineTo(x-x2,y+y2);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(x,y);\\r\\n                this.Canvas.lineTo(x+x2,y-y2);\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//POINTDOT 圆点 支持横屏\\r\\nfunction ChartPointDot()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartPointDot';    //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";   //线段颜色\\r\\n    this.Radius=1;                  //点半径\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (bHScreen===true) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.fillStyle=this.Color;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (bHScreen) this.Canvas.arc(y, x, this.Radius, 0, Math.PI*2, true);\\r\\n            else this.Canvas.arc(x, y, this.Radius, 0, Math.PI*2, true);\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//通达信语法  STICK 支持横屏\\r\\nfunction ChartStick()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";   //线段颜色\\r\\n    this.LineWidth;                 //线段宽度\\r\\n    this.ClassName='ChartStick';\\r\\n\\r\\n    this.DrawLine=function()\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen===true) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        if (this.LineWidth>0) this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawStick=function()\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n        var bHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (bHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var yBottom=this.ChartBorder.GetBottom();\\r\\n        var xLeft=this.ChartBorder.GetLeft();\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        if (this.LineWidth) this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        var lineWidth=this.Canvas.lineWidth;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (bHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(xLeft,x);\\r\\n                this.Canvas.lineTo(y,x);\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var xFix=ToFixedPoint2(lineWidth, x);\\r\\n                this.Canvas.moveTo(xFix,y);\\r\\n                this.Canvas.lineTo(xFix,yBottom);\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        this.DrawStick();\\r\\n    }\\r\\n}\\r\\n\\r\\n//通达信语法 LINESTICK 支持横屏\\r\\nfunction ChartLineStick()\\r\\n{\\r\\n    this.newMethod=ChartStick;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartLineStick';\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.DrawStick();\\r\\n        this.DrawLine();\\r\\n    }\\r\\n}\\r\\n\\r\\n//通达信语法 VOLSTICK 支持横屏\\r\\nfunction ChartVolStick()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.UpColor=g_JSChartResource.UpBarColor;\\r\\n    this.DownColor=g_JSChartResource.DownBarColor;\\r\\n    this.HistoryData;               //历史数据\\r\\n    this.KLineDrawType=0;\\r\\n    this.ClassName='ChartVolStick';\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.ChartFrame.IsHScreen===true)\\r\\n        {\\r\\n            this.HScreenDraw();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var chartright=border.RightEx;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var lockRect=this.GetLockRect();\\r\\n        if (lockRect) chartright=lockRect.Left;\\r\\n        var isMinute=this.IsMinuteFrame();\\r\\n\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            yBottom=ToFixedRect(yBottom);\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                var kItem=this.HistoryData.Data[i];\\r\\n                if (value==null || kItem==null) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n                var barColor=this.GetBarColor(kItem);\\r\\n                var bUp=barColor.IsUp;\\r\\n                this.Canvas.fillStyle=barColor.Color;\\r\\n\\r\\n                var height=ToFixedRect(Math.abs(yBottom-y)>=1?yBottom-y:1);//高度调整为整数, 如果小于1, 统一使用1\\r\\n                y=yBottom-height;\\r\\n                if (bUp && (this.KLineDrawType==1 || this.KLineDrawType==2 || this.KLineDrawType==3)) //空心柱子\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=this.UpColor;\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),height);\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillRect(ToFixedRect(left),y,ToFixedRect(dataWidth),height);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else    //太细了直接话线\\r\\n        {\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                var kItem=this.HistoryData.Data[i];\\r\\n                if (value==null || kItem==null) continue;\\r\\n\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n                if (isMinute)\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var left=xOffset;\\r\\n                    var right=xOffset+dataWidth;\\r\\n                    var x=left+(right-left)/2;\\r\\n                }\\r\\n\\r\\n                if (x>chartright) break;\\r\\n\\r\\n                var barColor=this.GetBarColor(kItem);\\r\\n                this.Canvas.strokeStyle=barColor.Color;\\r\\n\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yBottom);\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function() //横屏画法\\r\\n    {\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var chartBottom=border.BottomEx;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var lockRect=this.GetLockRect();\\r\\n        if (lockRect) chartBottom=lockRect.Top;\\r\\n\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            yBottom=ToFixedRect(yBottom);\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                var kItem=this.HistoryData.Data[i];\\r\\n                if (value==null || kItem==null) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartBottom) break;\\r\\n\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n                var bUp=false;\\r\\n                if (kItem.Close>=kItem.Open)\\r\\n                {\\r\\n                    bUp=true;\\r\\n                    this.Canvas.fillStyle=this.UpColor;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillStyle=this.DownColor;\\r\\n                }\\r\\n\\r\\n                var height=ToFixedRect(y-yBottom);  //高度调整为整数\\r\\n                if (bUp && (this.KLineDrawType==1 || this.KLineDrawType==2 || this.KLineDrawType==3)) //空心柱子\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=this.UpColor;\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.rect(ToFixedPoint(yBottom),ToFixedPoint(left),height,ToFixedRect(dataWidth));\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillRect(yBottom,ToFixedRect(left),height,ToFixedRect(dataWidth));\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else    //太细了直接话线\\r\\n        {\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                var kItem=this.HistoryData.Data[i];\\r\\n                if (value==null || kItem==null) continue;\\r\\n\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                if (x>chartBottom) break;\\r\\n\\r\\n                if (kItem.Close>kItem.Open)\\r\\n                    this.Canvas.strokeStyle=this.UpColor;\\r\\n                else\\r\\n                    this.Canvas.strokeStyle=this.DownColor;\\r\\n\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                this.Canvas.lineTo(yBottom,ToFixedPoint(x));\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=0;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (range.Max==null) range.Max=value;\\r\\n\\r\\n            if (range.Max<value) range.Max=value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.GetBarColor=function(kItem)\\r\\n    {\\r\\n        if (kItem.Close>=kItem.Open) return { Color:this.UpColor, IsUp:true };  //颜色, 是否是上涨\\r\\n        else return { Color:this.DownColor, IsUp:false };\\r\\n    }\\r\\n}\\r\\n\\r\\n// VERTLINE(HIGH>=HHV(HIGH,20),1)表示在创20天新高画垂直虚线。\\r\\n// 支持横屏\\r\\nfunction ChartVericaltLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartVericaltLine';    //类名\\r\\n    this.LineWidth=2;\\r\\n    this.LineCap;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        var isHScreen=this.ChartFrame.IsHScreen==true;\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.GetBorder();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var top=border.RightEx;\\r\\n            var bottom=border.LeftEx;\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var top=border.TopEx;\\r\\n            var bottom=border.BottomEx;\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        if (this.LineType) this.Canvas.setLineDash(this.LineType);\\r\\n        if (this.LineCap) this.Canvas.lineCap = this.LineCap;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        var lineWidth=this.Canvas.lineWidth;\\r\\n        if (this.LineWidth>0)\\r\\n        {\\r\\n            lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n            this.Canvas.lineWidth=lineWidth;\\r\\n        }\\r\\n        var drawCount=0;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (!item) continue;\\r\\n\\r\\n            var center=xOffset+dataWidth/2;\\r\\n            center=ToFixedPoint2(lineWidth, center);\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(top,center);\\r\\n                this.Canvas.lineTo(bottom,center);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(center, top);\\r\\n                this.Canvas.lineTo(center,bottom);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        return { Min:null, Max:null };\\r\\n    }\\r\\n}\\r\\n\\r\\n//HORLINE 支持横屏\\r\\nfunction ChartHorizontalLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartHorizontalLine';    //类名\\r\\n    this.LineWidth=2;\\r\\n    this.LineCap;\\r\\n    this.ExtendType=0;   //1=表示向左延长，2=表示向右延长，3=表示左右延长\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        var isHScreen=this.ChartFrame.IsHScreen==true;\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.GetBorder();\\r\\n\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var left=border.TopEx;\\r\\n            var right=border.BottomEx;\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=border.LeftEx\\r\\n            var right=border.RightEx;\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        if (this.LineType) this.Canvas.setLineDash(this.LineType);\\r\\n        if (this.LineCap) this.Canvas.lineCap = this.LineCap;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        var lineWidth=this.Canvas.lineWidth;\\r\\n        if (this.LineWidth>0)\\r\\n        {\\r\\n            lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n            this.Canvas.lineWidth=lineWidth;\\r\\n        }\\r\\n        var drawCount=0;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (!item) continue;\\r\\n            if (!IFrameSplitOperator.IsNumber(item)) continue;\\r\\n\\r\\n            var y=this.ChartFrame.GetYFromData(item);\\r\\n            y=ToFixedPoint2(lineWidth, y);\\r\\n            var center=xOffset+dataWidth/2;\\r\\n            center=ToFixedPoint2(lineWidth, center);\\r\\n            if (this.ExtendType==3) //左右延长\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(y, left);\\r\\n                    this.Canvas.lineTo(y, right);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(left, y);\\r\\n                    this.Canvas.lineTo(right, y);\\r\\n                }\\r\\n\\r\\n            }\\r\\n            else if (this.ExtendType==1) //左延长\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(y, left);\\r\\n                    this.Canvas.lineTo(y, center);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(left, y);\\r\\n                    this.Canvas.lineTo(center, y);\\r\\n                }\\r\\n\\r\\n            }\\r\\n            else    //右延长\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(y, center);\\r\\n                    this.Canvas.lineTo(y, right);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(center, y);\\r\\n                    this.Canvas.lineTo(right, y);\\r\\n                }\\r\\n\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n//线段 多数据(一个X点有多条Y数据) 支持横屏\\r\\nfunction ChartLineMultiData()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartLineMultiData';    //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\"; //线段颜色\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var aryValue=this.Data.Data[i];\\r\\n            if (aryValue==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            for(var index in aryValue)\\r\\n            {\\r\\n                var value =aryValue[index].Value;\\r\\n\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n                if (bFirstPoint)\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=this.Color;\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                    else this.Canvas.moveTo(x,y);\\r\\n                    bFirstPoint=false;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                    else this.Canvas.lineTo(x,y);\\r\\n                }\\r\\n\\r\\n                ++drawCount;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (drawCount>0)\\r\\n            this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        if(!this.Data || !this.Data.Data) return range;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var aryValue=this.Data.Data[i];\\r\\n            if (aryValue==null) continue;\\r\\n\\r\\n            for(var index in aryValue)\\r\\n            {\\r\\n                var value=aryValue[index].Value;\\r\\n                if (range.Max==null) range.Max=value;\\r\\n                if (range.Min==null) range.Min=value;\\r\\n\\r\\n                if (range.Max<value) range.Max=value;\\r\\n                if (range.Min>value) range.Min=value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//柱子 支持横屏\\r\\nfunction ChartStickLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartStickLine';    //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";               //线段颜色\\r\\n    this.BarType=0;                     //柱子类型 0=实心 1=空心 -1=画虚线空心柱\\r\\n    this.LineDotted=[3,3];              //虚线设置\\r\\n    this.Width=0;                       //柱子宽度 0=1 3,50=k线宽度 101=K线宽度+间距宽度\\r\\n\\r\\n    this.SetEmptyBar=function()         //设置空心柱子\\r\\n    {\\r\\n        if (this.BarType!=1 && this.BarType!=-1) return false;\\r\\n\\r\\n        this.Canvas.lineWidth=GetDevicePixelRatio();\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        var emptyBGColor=g_JSChartResource.EmptyBarBGColor;\\r\\n        if (emptyBGColor) this.Canvas.fillStyle=emptyBGColor;\\r\\n        if (this.BarType==-1)   //虚线\\r\\n        {\\r\\n            this.Canvas.setLineDash(this.LineDotted);   //虚线\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.IsEmptyBar=function()\\r\\n    {\\r\\n        return (this.BarType==1 || this.BarType==-1);\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var zoomIndex=this.ChartFrame.ZoomIndex;\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n\\r\\n        var isMinute=this.IsMinuteFrame();\\r\\n\\r\\n        this.Canvas.save();\\r\\n        var bFillBar=false;\\r\\n        var bFillKLine=false;\\r\\n        var emptyBGColor=g_JSChartResource.EmptyBarBGColor;\\r\\n\\r\\n        if (isMinute)\\r\\n        {\\r\\n            if (this.Width>1) this.Canvas.lineWidth=2*GetDevicePixelRatio();\\r\\n            else this.Canvas.lineWidth=GetDevicePixelRatio();\\r\\n            this.Canvas.strokeStyle=this.Color;\\r\\n        }\\r\\n        else if(this.Width==0)\\r\\n        {\\r\\n            this.SetEmptyBar();\\r\\n        }\\r\\n        else if (this.Width==3 || this.Width==50)   //3和50 K线宽度\\r\\n        {\\r\\n            if (dataWidth>=4)\\r\\n            {\\r\\n                bFillKLine=true;\\r\\n                this.SetEmptyBar();\\r\\n                if (!this.IsEmptyBar()) this.Canvas.fillStyle=this.Color;\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n            }\\r\\n            else    //太细了 画竖线\\r\\n            {\\r\\n                this.Canvas.lineWidth=GetDevicePixelRatio();\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n            }\\r\\n        }\\r\\n        else if (this.Width==101)\\r\\n        {\\r\\n            var lineWidth=dataWidth+distanceWidth+1*GetDevicePixelRatio();\\r\\n            this.Canvas.lineWidth=lineWidth;\\r\\n            this.Canvas.strokeStyle=this.Color;\\r\\n        }\\r\\n        else if (this.Width<=3)\\r\\n        {\\r\\n            var minWidth=2*GetDevicePixelRatio();\\r\\n            var barWidth=dataWidth*(this.Width/3);\\r\\n            if (barWidth<minWidth) barWidth=minWidth;\\r\\n            this.SetEmptyBar();\\r\\n            if (!this.IsEmptyBar()) this.Canvas.fillStyle=this.Color;\\r\\n            bFillBar=true;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var barWidth=this.Width*GetDevicePixelRatio()+dataWidth;\\r\\n            this.SetEmptyBar();\\r\\n            if (!this.IsEmptyBar()) this.Canvas.fillStyle=this.Color;\\r\\n            bFillBar=true;\\r\\n        }\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var price=value.Value;\\r\\n            var price2=value.Value2;\\r\\n            if (price2==null) price2=0;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(price);\\r\\n            var y2=this.ChartFrame.GetYFromData(price2);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (bFillBar)\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    var left=x-barWidth/2;\\r\\n                    var width=barWidth;\\r\\n                    if (this.IsEmptyBar()) //空心\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(Math.min(y,y2)),ToFixedPoint(left),ToFixedRect(Math.abs(y-y2)),ToFixedRect(width));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(Math.min(y,y2)),ToFixedRect(left),ToFixedRect(Math.abs(y-y2)),ToFixedRect(width));\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var left=x-barWidth/2;\\r\\n                    var width=barWidth;\\r\\n                    if (left+width>chartright) width=chartright-left; //不要超过右边框子\\r\\n                    if (this.IsEmptyBar()) //空心\\r\\n                    {\\r\\n                        if (emptyBGColor)\\r\\n                            this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,y2)),ToFixedRect(width),ToFixedRect(Math.abs(y-y2)));\\r\\n\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(Math.min(y,y2)),ToFixedRect(width),ToFixedRect(Math.abs(y-y2)));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,y2)),ToFixedRect(width),ToFixedRect(Math.abs(y-y2)));\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else if (bFillKLine)\\r\\n            {\\r\\n                if (this.IsEmptyBar())    //空心\\r\\n                {\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(Math.min(y,y2)),ToFixedPoint(xOffset),ToFixedRect(Math.abs(y-y2)),ToFixedRect(dataWidth));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (emptyBGColor)\\r\\n                            this.Canvas.fillRect(ToFixedRect(xOffset),ToFixedRect(Math.min(y,y2)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(y-y2)));\\r\\n\\r\\n                        this.Canvas.beginPath();\\r\\n                        this.Canvas.rect(ToFixedPoint(xOffset),ToFixedPoint(Math.min(y,y2)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(y-y2)));\\r\\n                        this.Canvas.stroke();\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isHScreen)\\r\\n                        this.Canvas.fillRect(ToFixedRect(Math.min(y,y2)),ToFixedRect(xOffset),ToFixedRect(Math.abs(y-y2)),ToFixedRect(dataWidth));\\r\\n                    else\\r\\n                        this.Canvas.fillRect(ToFixedRect(xOffset),ToFixedRect(Math.min(y,y2)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(y-y2)));\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(y,ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(y2,ToFixedPoint(x));\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var xFix=parseInt(x.toString())+0.5;\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(xFix,y);\\r\\n                    this.Canvas.lineTo(xFix,y2);\\r\\n                    this.Canvas.stroke();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        if(!this.Data || !this.Data.Data) return range;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data == null) continue;\\r\\n            var value2=data.Value2;\\r\\n            if (value2==null) value2=0;\\r\\n            if (data==null || isNaN(data.Value) ||isNaN(value2)) continue;\\r\\n\\r\\n            var valueMax=Math.max(data.Value,value2);\\r\\n            var valueMin=Math.min(data.Value,value2);\\r\\n\\r\\n            if (range.Max==null) range.Max=valueMax;\\r\\n            if (range.Min==null) range.Min=valueMin;\\r\\n\\r\\n            if (range.Max<valueMax) range.Max=valueMax;\\r\\n            if (range.Min>valueMin) range.Min=valueMin;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction ChartText()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartText';    //类名\\r\\n    this.TextFont=\\\"14px 微软雅黑\\\";\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        for(var i in this.Data.Data)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var price=value.Value;\\r\\n            var position=value.Position;\\r\\n\\r\\n            if (position=='Left')\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(0);\\r\\n                var y=this.ChartFrame.GetYFromData(price);\\r\\n\\r\\n                if (x>chartright) continue;\\r\\n\\r\\n                this.Canvas.textAlign='left';\\r\\n                this.Canvas.textBaseline='middle';\\r\\n                this.Canvas.fillStyle=value.Color;\\r\\n                this.Canvas.font=this.TextFont;\\r\\n                this.Canvas.fillText(value.Message,x,y);\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        if(!this.Data || !this.Data.Data) return range;\\r\\n\\r\\n        for(var i in this.Data.Data)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data==null || isNaN(data.Value)) continue;\\r\\n\\r\\n            var value=data.Value;\\r\\n\\r\\n            if (range.Max==null) range.Max=value;\\r\\n            if (range.Min==null) range.Min=value;\\r\\n\\r\\n            if (range.Max<value) range.Max=value;\\r\\n            if (range.Min>value) range.Min=value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    文字输出 支持横屏\\r\\n    数组(Data)不为null的数据中输出 this.Text文本\\r\\n*/\\r\\nfunction ChartSingleText()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartSingleText';    //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";           //线段颜色\\r\\n    this.TextFont=\\\"14px 微软雅黑\\\";           //线段宽度\\r\\n    this.Text;\\r\\n    this.TextAlign='left';\\r\\n    this.Direction=0;       //0=middle 1=bottom 2=top\\r\\n    this.YOffset=0;         //连线\\r\\n    this.Position;          //指定输出位置\\r\\n    this.IconFont;          //Iconfont\\r\\n    this.IconSize=\\r\\n        {\\r\\n            Max: g_JSChartResource.DRAWICON.Icon.MaxSize, Min:g_JSChartResource.DRAWICON.Icon.MinSize, //图标的最大最小值\\r\\n            Zoom:{ Type:g_JSChartResource.DRAWICON.Icon.Zoom.Type , Value:g_JSChartResource.DRAWICON.Icon.Zoom.Value }, //放大倍数\\r\\n            YOffset:g_JSChartResource.DRAWICON.Icon.YOffset //Direction==2的向下偏移\\r\\n        };\\r\\n\\r\\n    this.TextSize=\\r\\n        {\\r\\n            Max: g_JSChartResource.DRAWICON.Text.MaxSize, Min:g_JSChartResource.DRAWICON.Text.MinSize, //字体的最大最小值\\r\\n            Zoom:{ Type:g_JSChartResource.DRAWICON.Text.Zoom.Type , Value:g_JSChartResource.DRAWICON.Text.Zoom.Value }, //放大倍数\\r\\n            FontName:g_JSChartResource.DRAWICON.Text.FontName,\\r\\n            YOffset:g_JSChartResource.DRAWICON.Text.YOffset\\r\\n        }\\r\\n\\r\\n    this.Font=\\r\\n        {\\r\\n            DRAWTEXT_FIX:g_JSChartResource.DRAWTEXT_FIX.Font,\\r\\n            DRAWNUMBER_FIX: g_JSChartResource.DRAWNUMBER_FIX.Font\\r\\n        }\\r\\n\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        if (this.Name==\\\"DRAWTEXT\\\")\\r\\n        {\\r\\n            this.TextSize=\\r\\n                {\\r\\n                    Max: g_JSChartResource.DRAWTEXT.MaxSize, Min:g_JSChartResource.DRAWTEXT.MinSize, //字体的最大最小值\\r\\n                    Zoom:{ Type:g_JSChartResource.DRAWTEXT.Zoom.Type , Value:g_JSChartResource.DRAWTEXT.Zoom.Value }, //放大倍数\\r\\n                    FontName:g_JSChartResource.DRAWTEXT.FontName,\\r\\n                    YOffset:g_JSChartResource.DRAWTEXT.YOffset\\r\\n                }\\r\\n        }\\r\\n        else if (this.Name==\\\"DRAWNUMBER\\\")\\r\\n        {\\r\\n            this.TextSize=\\r\\n                {\\r\\n                    Max: g_JSChartResource.DRAWNUMBER.MaxSize, Min:g_JSChartResource.DRAWNUMBER.MinSize, //字体的最大最小值\\r\\n                    Zoom:{ Type:g_JSChartResource.DRAWNUMBER.Zoom.Type , Value:g_JSChartResource.DRAWNUMBER.Zoom.Value }, //放大倍数\\r\\n                    FontName:g_JSChartResource.DRAWNUMBER.FontName,\\r\\n                    YOffset:g_JSChartResource.DRAWNUMBER.YOffset\\r\\n                }\\r\\n        }\\r\\n        else if (this.Name==\\\"DRAWTEXT_FIX\\\")\\r\\n        {\\r\\n            this.Font.DRAWTEXT_FIX=g_JSChartResource.DRAWTEXT_FIX.Font;\\r\\n        }\\r\\n        else if (this.Name==\\\"DRAWNUMBER_FIX\\\")\\r\\n        {\\r\\n            this.Font.DRAWNUMBER_FIX=g_JSChartResource.DRAWNUMBER_FIX.Font;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SuperGetMaxMin=this.GetMaxMin;\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        if ( this.Name==\\\"DRAWTEXT_FIX\\\" || this.Name=='DRAWNUMBER_FIX')  //固定位置的 没有大小值\\r\\n        {\\r\\n            return { Min:null,Max:null };\\r\\n        }\\r\\n        else if (this.Name==\\\"DRAWTEXTREL\\\" || this.Name==\\\"DRAWTEXTABS\\\")\\r\\n        {\\r\\n            return { Min:null,Max:null };\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return this.SuperGetMaxMin();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawRectText=function()\\r\\n    {\\r\\n        if (!this.DrawData) return;\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true)\\r\\n        var border=this.ChartFrame.GetBorder();\\r\\n\\r\\n\\r\\n        if (this.Name==\\\"DRAWTEXTREL\\\")\\r\\n        {\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                var height=border.RightTitle-border.LeftEx;\\r\\n                var width=border.BottomEx-border.TopEx;\\r\\n                var x=this.DrawData.Point.X/1000*width+border.TopEx;\\r\\n                var y=border.RightTitle-this.DrawData.Point.Y/1000*width;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var width=border.RightEx-border.LeftEx;\\r\\n                var height=border.BottomEx-border.TopTitle;\\r\\n                var x=this.DrawData.Point.X/1000*width+border.LeftEx;\\r\\n                var y=this.DrawData.Point.Y/1000*height+border.TopTitle;\\r\\n            }\\r\\n\\r\\n        }\\r\\n        else if (this.Name==\\\"DRAWTEXTABS\\\")\\r\\n        {\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                var x=this.DrawData.Point.X+border.TopEx;\\r\\n                var y=border.RightTitle-this.DrawData.Point.Y;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var x=this.DrawData.Point.X+border.LeftEx;\\r\\n                var y=this.DrawData.Point.Y+border.TopTitle;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.Direction==1) this.Canvas.textBaseline='bottom';\\r\\n        else if (this.Direction==2) this.Canvas.textBaseline='top';\\r\\n        else this.Canvas.textBaseline='middle';\\r\\n        this.Canvas.textAlign='left';\\r\\n        this.Canvas.font=this.TextFont;\\r\\n        this.Canvas.fillStyle=this.Color;\\r\\n        this.DrawText(this.DrawData.Text,x,y,isHScreen);\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.Name==\\\"DRAWTEXTREL\\\" || this.Name==\\\"DRAWTEXTABS\\\")\\r\\n        {\\r\\n            this.DrawRectText();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.Position)\\r\\n        {\\r\\n            this.DrawPosition();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true)\\r\\n        var isMinute=this.IsMinuteFrame();\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            chartright=this.ChartBorder.GetBottom();\\r\\n            top=this.ChartBorder.GetRightEx();\\r\\n            bottom=this.ChartBorder.GetLeftEx();\\r\\n            xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        }\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var isArrayText=Array.isArray(this.Text);\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n\\r\\n        if (this.Direction==1) this.Canvas.textBaseline='bottom';\\r\\n        else if (this.Direction==2) this.Canvas.textBaseline='top';\\r\\n        else this.Canvas.textBaseline='middle';\\r\\n\\r\\n        if (this.IconFont)\\r\\n        {\\r\\n            this.Color=this.IconFont.Color;\\r\\n            this.Text=this.IconFont.Text;\\r\\n\\r\\n            var iconSize=this.GetDynamicIconSize(dataWidth,distanceWidth,this.IconSize.Max,this.IconSize.Min,this.IconSize.Zoom);\\r\\n            this.Canvas.font=iconSize+'px '+this.IconFont.Family;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.TextFont=this.GetDynamicFont(dataWidth,distanceWidth,this.TextSize.Max,this.TextSize.Min,this.TextSize.Zoom,this.TextSize.FontName);\\r\\n            this.Canvas.font=this.TextFont;\\r\\n        }\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            //for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            if (isMinute)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n                var x=left+(right-left)/2;\\r\\n            }\\r\\n\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            this.Canvas.textAlign=this.TextAlign;\\r\\n            this.Canvas.fillStyle=this.Color;\\r\\n\\r\\n            if (this.YOffset>0 && this.Direction>0)\\r\\n            {\\r\\n                var yPrice=y;\\r\\n\\r\\n                this.Canvas.setLineDash([5,10]);\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    if (this.Direction==1)\\r\\n                    {\\r\\n                        y=top-this.YOffset*pixelTatio;\\r\\n                        yPrice+=5*pixelTatio;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        y=bottom+this.YOffset*pixelTatio;\\r\\n                        yPrice-=5*pixelTatio;\\r\\n                    }\\r\\n                    this.Canvas.moveTo(ToFixedPoint(yPrice),ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(y),ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.Direction==1)\\r\\n                    {\\r\\n                        y=top+this.YOffset*pixelTatio;\\r\\n                        yPrice+=5*pixelTatio;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        y=bottom-this.YOffset*pixelTatio;\\r\\n                        yPrice-=5*pixelTatio;\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(yPrice));\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(y));\\r\\n                }\\r\\n                this.Canvas.stroke();\\r\\n                this.Canvas.setLineDash([]);\\r\\n            }\\r\\n\\r\\n            if (isArrayText)\\r\\n            {\\r\\n                var text=this.Text[i];\\r\\n                if (!text) continue;\\r\\n                if (this.Name=='DRAWNUMBER')\\r\\n                {\\r\\n                    if (this.Direction==1) y-=g_JSChartResource.DRAWABOVE.YOffset*pixelTatio;\\r\\n                    else if (this.Direction==2) y+=this.TextSize.YOffset*pixelTatio;\\r\\n                }\\r\\n                this.DrawText(text,x,y,isHScreen);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.Name=='DRAWICON')\\r\\n                {\\r\\n                    if (this.Direction==1) y-=g_JSChartResource.DRAWABOVE.YOffset*pixelTatio;\\r\\n                    else if (this.Direction==2)\\r\\n                    {\\r\\n                        if (this.IconFont) y+=this.IconSize.YOffset*pixelTatio;\\r\\n                        else y+=this.TextSize.YOffset*pixelTatio;\\r\\n                    }\\r\\n                }\\r\\n                else if (this.Name==\\\"DRAWTEXT\\\")\\r\\n                {\\r\\n                    if (this.Direction==1) y-=g_JSChartResource.DRAWABOVE.YOffset*pixelTatio;\\r\\n                    else if (this.Direction==2) y+=this.TextSize.YOffset*pixelTatio;\\r\\n                }\\r\\n                //JSConsole.Chart.Log('[ChartSingleText::Draw] ',this.Direction,this.Text)\\r\\n                this.DrawText(this.Text,x,y,isHScreen);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawPosition=function()    //绘制在指定位置上\\r\\n    {\\r\\n        if (!this.Text) return;\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true)\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var y=this.ChartBorder.GetRightEx()-this.ChartBorder.GetWidthEx()*this.Position.Y;\\r\\n            var x=this.ChartBorder.GetTop()+this.ChartBorder.GetHeight()*this.Position.X;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var x=this.ChartBorder.GetLeft()+this.ChartBorder.GetWidth()*this.Position.X;\\r\\n            var y=this.ChartBorder.GetTopEx()+this.ChartBorder.GetHeightEx()*this.Position.Y;\\r\\n        }\\r\\n\\r\\n        this.Canvas.fillStyle=this.Color;\\r\\n\\r\\n        if (this.Name==\\\"DRAWTEXT_FIX\\\") this.Canvas.font=this.Font.DRAWTEXT_FIX;\\r\\n        else if (this.Name==\\\"DRAWNUMBER_FIX\\\") this.Canvas.font=this.Font.DRAWNUMBER_FIX;\\r\\n\\r\\n        //TYPE:0为左对齐,1为右对齐.\\r\\n        if (this.Position.Type==0) this.Canvas.textAlign='left';\\r\\n        else if (this.Position.Type==1) this.Canvas.textAlign='right';\\r\\n        else this.Canvas.textAlign='center';\\r\\n\\r\\n        if (this.Direction==1) this.Canvas.textBaseline='bottom';\\r\\n        else if (this.Direction==2) this.Canvas.textBaseline='top';\\r\\n        else this.Canvas.textBaseline='middle';\\r\\n\\r\\n        if (Array.isArray(this.Text))\\r\\n        {\\r\\n            if (!this.Data || !this.Data.Data) return;\\r\\n            var xPointCount=this.ChartFrame.XPointCount;\\r\\n            for(var i=this.Data.DataOffset,j=0; i<this.Data.Data.length && j<xPointCount; ++i,++j)\\r\\n            {\\r\\n                var text=this.Text[i];\\r\\n                if (text)\\r\\n                {\\r\\n                    this.DrawText(text,x,y,isHScreen);\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.DrawText(this.Text,x,y,isHScreen);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawText=function(text,x,y,isHScreen)\\r\\n    {\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.translate(y, x);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            this.Canvas.fillText(text,0,0);\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillText(text,x,y);\\r\\n            /*\\r\\n            var textWidth=this.Canvas.measureText(text).width;\\r\\n            var rectSize=textWidth*2;\\r\\n            var xRect,yRect;\\r\\n            if (this.Direction==1)  yRect=y-rectSize;   //底部\\r\\n            else if (this.Direction==2) yRect=y;    //顶部\\r\\n            else yRect=y-rectSize/2; //居中\\r\\n\\r\\n            if (this.TextAlign=='left') xRect=x;\\r\\n            else if (this.TextAlign=='right') xRect=x-rectSize;\\r\\n            else xRect=x-rectSize/2;\\r\\n\\r\\n            this.Canvas.fillStyle=this.Color;\\r\\n            this.Canvas.fillRect(xRect,yRect,rectSize,rectSize);\\r\\n\\r\\n            this.Canvas.fillStyle='rgb(255,255,255)';\\r\\n            this.Canvas.fillText(text,x,y);\\r\\n            */\\r\\n\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//直线 水平直线 只有1个数据\\r\\nfunction ChartStraightLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartStraightLine';    //类名\\r\\n    this.Color=\\\"rgb(255,193,37)\\\";   //线段颜色\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n        if (this.Data.Data.length!=1) return;\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        var yValue=this.Data.Data[0];\\r\\n        var y=this.ChartFrame.GetYFromData(yValue);\\r\\n        var xLeft=this.ChartFrame.GetXFromIndex(0);\\r\\n        var xRight=this.ChartFrame.GetXFromIndex(xPointCount-1);\\r\\n\\r\\n        var yFix=parseInt(y.toString())+0.5;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(xLeft,yFix);\\r\\n        this.Canvas.lineTo(xRight,yFix);\\r\\n        this.Canvas.strokeStyle=this.Color;\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return range;\\r\\n        if (this.Data.Data.length!=1) return range;\\r\\n\\r\\n        range.Min=this.Data.Data[0];\\r\\n        range.Max=this.Data.Data[0];\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    水平面积 只有1个数据\\r\\n    Data 数据结构\\r\\n    Value, Value2  区间最大最小值\\r\\n    Color=面积的颜色\\r\\n    Title=标题 TitleColor=标题颜色\\r\\n    支持横屏\\r\\n*/\\r\\nfunction ChartStraightArea()\\r\\n{\\r\\n    this.newMethod = IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartStraightArea';    //类名\\r\\n    this.Color = \\\"rgb(255,193,37)\\\";   //线段颜色\\r\\n    this.Font ='11px 微软雅黑';\\r\\n\\r\\n    this.Draw = function ()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        if (this.ChartFrame.IsHScreen===true)\\r\\n        {\\r\\n            this.HScreenDraw();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var dataWidth = this.ChartFrame.DataWidth;\\r\\n        var distanceWidth = this.ChartFrame.DistanceWidth;\\r\\n        var chartright = this.ChartBorder.GetRight();\\r\\n        var bottom = this.ChartBorder.GetBottom();\\r\\n        var left = this.ChartBorder.GetLeft();\\r\\n        var xPointCount = this.ChartFrame.XPointCount;\\r\\n\\r\\n        var xRight = this.ChartFrame.GetXFromIndex(xPointCount - 1);\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            let item=this.Data.Data[i];\\r\\n            if (item==null || isNaN(item.Value) || isNaN(item.Value2)) continue;\\r\\n            if (item.Color==null) continue;\\r\\n\\r\\n            let valueMax=Math.max(item.Value,item.Value2);\\r\\n            let valueMin=Math.min(item.Value,item.Value2);\\r\\n\\r\\n            var yTop=this.ChartFrame.GetYFromData(valueMax);\\r\\n            var yBottom=this.ChartFrame.GetYFromData(valueMin);\\r\\n\\r\\n            this.Canvas.fillStyle = item.Color;\\r\\n            this.Canvas.fillRect(ToFixedRect(left), ToFixedRect(yTop), ToFixedRect(xRight - left), ToFixedRect(yBottom - yTop));\\r\\n\\r\\n            if(item.Title && item.TitleColor)\\r\\n            {\\r\\n                this.Canvas.textAlign = 'right';\\r\\n                this.Canvas.textBaseline = 'middle';\\r\\n                this.Canvas.fillStyle = item.TitleColor;\\r\\n                this.Canvas.font = this.Font;\\r\\n                let y = yTop + (yBottom - yTop)/2;\\r\\n                this.Canvas.fillText(item.Title, xRight, y);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function()\\r\\n    {\\r\\n        var bottom = this.ChartBorder.GetBottom();\\r\\n        var top=this.ChartBorder.GetTop();\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            let item=this.Data.Data[i];\\r\\n            if (item==null || isNaN(item.Value) || isNaN(item.Value2)) continue;\\r\\n            if (item.Color==null) continue;\\r\\n\\r\\n            let valueMax=Math.max(item.Value,item.Value2);\\r\\n            let valueMin=Math.min(item.Value,item.Value2);\\r\\n\\r\\n            var yTop=this.ChartFrame.GetYFromData(valueMax);\\r\\n            var yBottom=this.ChartFrame.GetYFromData(valueMin);\\r\\n\\r\\n            this.Canvas.fillStyle = item.Color;\\r\\n            this.Canvas.fillRect(ToFixedRect(yBottom), ToFixedRect(top), ToFixedRect(yTop-yBottom),ToFixedRect(height));\\r\\n\\r\\n            if(item.Title && item.TitleColor)\\r\\n            {\\r\\n                var xText=yTop + (yBottom - yTop)/2;\\r\\n                var yText=bottom;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n                this.Canvas.textAlign = 'right';\\r\\n                this.Canvas.textBaseline = 'middle';\\r\\n                this.Canvas.fillStyle = item.TitleColor;\\r\\n                this.Canvas.font = this.Font;\\r\\n                this.Canvas.fillText(item.Title, 0, -2);\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return range;\\r\\n\\r\\n        for (let i in this.Data.Data)\\r\\n        {\\r\\n            let item = this.Data.Data[i];\\r\\n            if (item==null || isNaN(item.Value) || isNaN(item.Value2)) continue;\\r\\n\\r\\n            let valueMax=Math.max(item.Value,item.Value2);\\r\\n            let valueMin=Math.min(item.Value,item.Value2);\\r\\n\\r\\n            if (range.Max==null) range.Max=valueMax;\\r\\n            if (range.Min==null) range.Min=valueMin;\\r\\n\\r\\n            if (range.Max<valueMax) range.Max=valueMax;\\r\\n            if (range.Min>valueMin) range.Min=valueMin;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//分钟线 支持横屏\\r\\nfunction ChartMinutePriceLine()\\r\\n{\\r\\n    this.newMethod=ChartLine;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartMinutePriceLine';    //类名\\r\\n    this.YClose;\\r\\n    this.IsDrawArea=true;    //是否画价格面积图\\r\\n    this.AreaColor='rgba(0,191,255,0.1)';\\r\\n    this.IsShowLead=false;\\r\\n    this.LeadData;\\r\\n    this.UpColor=g_JSChartResource.UpBarColor;\\r\\n    this.DownColor=g_JSChartResource.DownBarColor;\\r\\n\\r\\n    this.BeforeOpenData;    //盘前数据 Data:[] 数据, TotalCount:一共的数据个数\\r\\n    this.BeforeLineColor=g_JSChartResource.Minute.Before.LineColor;\\r\\n    this.BeforeAvPriceColor=g_JSChartResource.Minute.Before.AvPriceColor;\\r\\n    this.BeforePoint={ Color:g_JSChartResource.Minute.Before.Point.Color, Radius:g_JSChartResource.Minute.Before.Point.Radius };\\r\\n\\r\\n    this.AfterCloseData;    //盘后数据\\r\\n\\r\\n    this.MultiDayBeforeOpenData;    //多日分时图 盘前数据 数组 1天一个\\r\\n    this.MultiDayAfterCloseData;    //多日分时图 盘后数据 数组 1天一个\\r\\n\\r\\n    this.ColorLineData;     //自定义价格线分段颜色\\r\\n    this.Source;            //原始分钟数据\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.IsShow) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen===true) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var minuteCount=this.ChartFrame.MinuteCount;\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var left=this.ChartBorder.GetLeftEx();\\r\\n        var data=this.Data;\\r\\n\\r\\n        this.DrawBeforeOpen();   //盘前\\r\\n        this.DrawMultiDayBeforeOpen();\\r\\n\\r\\n        if (this.IsShowLead) this.DrawLead();   //领先指标\\r\\n\\r\\n        if (!data) return;\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var ptFirst={}; //第1个点\\r\\n        var ptLast={};  //最后一个点\\r\\n        var drawCount=0;\\r\\n        var pointCount=0;\\r\\n        for(var i=data.DataOffset,j=0;i<data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=null;\\r\\n            value=data.Data[i];\\r\\n            ++pointCount;\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n                ptFirst={X:x,Y:y};\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ptLast.X=x;\\r\\n            ptLast.Y=y;\\r\\n            ptLast.Price=value;\\r\\n\\r\\n            ++drawCount;\\r\\n\\r\\n            if (pointCount>=minuteCount) //上一天的数据和这天地数据线段要断开\\r\\n            {\\r\\n                bFirstPoint=true;\\r\\n                this.Canvas.stroke();\\r\\n                if (this.IsDrawArea)   //画面积\\r\\n                {\\r\\n                    if (isHScreen)\\r\\n                    {\\r\\n                        this.Canvas.lineTo(left,x);\\r\\n                        this.Canvas.lineTo(left,ptFirst.X);\\r\\n                        this.SetFillStyle(this.AreaColor,this.ChartBorder.GetRightEx(),bottom,this.ChartBorder.GetLeftEx(),bottom);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.lineTo(x,bottom);\\r\\n                        this.Canvas.lineTo(ptFirst.X,bottom);\\r\\n                        this.SetFillStyle(this.AreaColor, left,this.ChartBorder.GetTopEx(), left,bottom);\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.fill();\\r\\n                }\\r\\n                pointCount=0;\\r\\n                drawCount=0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (drawCount>0)\\r\\n        {\\r\\n            this.Canvas.stroke();\\r\\n            if (this.IsDrawArea)   //画面积\\r\\n            {\\r\\n                if (isHScreen)\\r\\n                {\\r\\n                    this.Canvas.lineTo(left,x);\\r\\n                    this.Canvas.lineTo(left,ptFirst.X);\\r\\n                    this.SetFillStyle(this.AreaColor,this.ChartBorder.GetRightEx(),bottom,this.ChartBorder.GetLeftEx(),bottom);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(x,bottom);\\r\\n                    this.Canvas.lineTo(ptFirst.X,bottom);\\r\\n                    this.SetFillStyle(this.AreaColor,left,this.ChartBorder.GetTopEx(), left,bottom);\\r\\n                }\\r\\n\\r\\n                this.Canvas.fill();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.DrawColorLine();\\r\\n        this.DrawAfterClose();      //收盘集合竞价\\r\\n        this.DrawMultiDayAfterClose();\\r\\n\\r\\n        if (this.GetEventCallback)\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_MINUTE_LAST_POINT);\\r\\n            if (event)\\r\\n            {\\r\\n                var data={ LastPoint:{X:ptLast.X, Y:ptLast.Y}, Price:ptLast.Price };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画领先指标\\r\\n    this.DrawLead=function()\\r\\n    {\\r\\n        if (!this.LeadData) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        //if (isHScreen) return;\\r\\n        //var dataWidth=this.ChartFrame.DataWidth;\\r\\n        //var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        //var chartright=this.ChartBorder.GetRight();\\r\\n\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var minuteCount=this.ChartFrame.MinuteCount;\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        if (isHScreen===true) top=this.ChartBorder.GetRightEx();\\r\\n\\r\\n        if (xPointCount>minuteCount) return;\\r\\n\\r\\n        var aryLead=[]; //{X: Value:}\\r\\n        var max=null, min=null;\\r\\n        var yCenter=this.ChartFrame.GetYFromData(this.YClose);\\r\\n        var leadHeight=(yCenter-top)/3;\\r\\n        var data=this.LeadData;\\r\\n        for(var i=data.DataOffset,j=0;i<data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=data.Data[i];\\r\\n            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n            if (value==0) continue;\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n\\r\\n            if (max==null || max<value) max=value;\\r\\n            if (min==null || min>value) min=value;\\r\\n\\r\\n            aryLead.push({X:x, Value:value})\\r\\n        }\\r\\n\\r\\n        if (aryLead.length<=0) return;\\r\\n        var maxValue=Math.max(Math.abs(max),Math.abs(min));\\r\\n\\r\\n        for(var i in aryLead)\\r\\n        {\\r\\n            var item=aryLead[i];\\r\\n            if (item.Value>0) this.Canvas.strokeStyle=this.UpColor;\\r\\n            else this.Canvas.strokeStyle=this.DownColor;\\r\\n\\r\\n            var y=yCenter-(item.Value*leadHeight/maxValue);\\r\\n            var x=ToFixedPoint(item.X);\\r\\n            this.Canvas.beginPath();\\r\\n            if (isHScreen===true)\\r\\n            {\\r\\n                this.Canvas.moveTo(yCenter,x);\\r\\n                this.Canvas.lineTo(y,x);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(x,yCenter);\\r\\n                this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawBeforeOpen=function()\\r\\n    {\\r\\n        if (this.ChartBorder.LeftExtendWidth<10) return;\\r\\n        if (!this.BeforeOpenData) return;\\r\\n\\r\\n        this.DrawCallAuction(-1, this.BeforeOpenData, true);\\r\\n    }\\r\\n\\r\\n    this.DrawAfterClose=function()\\r\\n    {\\r\\n        if (this.ChartBorder.RightExtendWidth<10) return;\\r\\n        if (!this.AfterCloseData) return;\\r\\n\\r\\n        this.DrawCallAuction(-1, this.AfterCloseData, false);\\r\\n    }\\r\\n\\r\\n    this.DrawMultiDayBeforeOpen=function()\\r\\n    {\\r\\n        if (this.ChartBorder.MultiDayMinute.Count<=1 || this.ChartBorder.MultiDayMinute.Left<=0) return;\\r\\n        if (!this.MultiDayBeforeOpenData) return;\\r\\n\\r\\n        for(var i in this.MultiDayBeforeOpenData)\\r\\n        {\\r\\n            var dayItem=this.MultiDayBeforeOpenData[i];\\r\\n            this.DrawCallAuction(parseInt(i), dayItem, true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawMultiDayAfterClose=function()\\r\\n    {\\r\\n        if (this.ChartBorder.MultiDayMinute.Count<=1 || this.ChartBorder.MultiDayMinute.Right<=0) return;\\r\\n        if (!this.MultiDayAfterCloseData) return;\\r\\n\\r\\n        for(var i in this.MultiDayAfterCloseData)\\r\\n        {\\r\\n            var dayItem=this.MultiDayAfterCloseData[i];\\r\\n            this.DrawCallAuction(parseInt(i), dayItem, false);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCallAuction=function(indexDay, callAutionData, isBeforeOpen)\\r\\n    {\\r\\n        if (!callAutionData) return;\\r\\n\\r\\n        callAutionData.Index=indexDay;\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        var callAutionInfo={ TotalCount:callAutionData.TotalCount };\\r\\n        if (callAutionData.Ver==3.0)   //均线\\r\\n        {\\r\\n            for(var i in callAutionData.Data)\\r\\n            {\\r\\n                var item=callAutionData.Data[i];\\r\\n                if (!item || !IFrameSplitOperator.IsNumber(item.AvPrice)) continue;\\r\\n\\r\\n                if (isBeforeOpen)\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetLeftExtendXFromIndex(i,callAutionData);\\r\\n                    var y=this.ChartFrame.GetLeftExtendYFromData(item.AvPrice);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetRightExtendXFromIndex(i,callAutionData);\\r\\n                    var y=this.ChartFrame.GetRightExtendYFromData(item.AvPrice);\\r\\n                }\\r\\n\\r\\n                if (bFirstPoint)\\r\\n                {\\r\\n                    this.Canvas.strokeStyle=this.BeforeAvPriceColor;\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                    else this.Canvas.moveTo(x,y);\\r\\n                    bFirstPoint=false;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                    else this.Canvas.lineTo(x,y);\\r\\n                }\\r\\n\\r\\n                ++drawCount;\\r\\n            }\\r\\n\\r\\n            if (drawCount>0)\\r\\n            {\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        var aryPoint=[];\\r\\n        for(var i in callAutionData.Data)\\r\\n        {\\r\\n            var item=callAutionData.Data[i];\\r\\n            if (!item || !IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                if (i==0 && isBeforeOpen && IFrameSplitOperator.IsNumber(this.YClose))\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetLeftExtendXFromIndex(i,callAutionData);\\r\\n                    var y=this.ChartFrame.GetLeftExtendYFromData(this.YClose);\\r\\n\\r\\n                    this.Canvas.strokeStyle=this.BeforeLineColor;\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                    else this.Canvas.moveTo(x,y);\\r\\n                    bFirstPoint=false;\\r\\n                }\\r\\n\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (isBeforeOpen)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetLeftExtendXFromIndex(i,callAutionData);\\r\\n                var y=this.ChartFrame.GetLeftExtendYFromData(item.Price);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var x=this.ChartFrame.GetRightExtendXFromIndex(i,callAutionData);\\r\\n                var y=this.ChartFrame.GetRightExtendYFromData(item.Price);\\r\\n            }\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.BeforeLineColor;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n\\r\\n                aryPoint.push({X:x, Y:y });\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n\\r\\n                aryPoint.push({X:x, Y:y });\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0)\\r\\n        {\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n        if (callAutionData.Ver==2.0 && this.BeforePoint.Radius>0)\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.BeforePoint.Color;\\r\\n            for(var i in aryPoint)\\r\\n            {\\r\\n                var item=aryPoint[i];\\r\\n\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen)  this.Canvas.arc(item.Y, item.X, this.BeforePoint.Radius, 0, 2 * Math.PI);\\r\\n                else  this.Canvas.arc(item.X, item.Y, this.BeforePoint.Radius, 0, 2 * Math.PI);\\r\\n                this.Canvas.fill();\\r\\n            }\\r\\n\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.FindColorLineItem=function(minuteItem)\\r\\n    {\\r\\n        if (!minuteItem || !this.ColorLineData) return null;\\r\\n\\r\\n        for(var i in this.ColorLineData)\\r\\n        {\\r\\n            var item=this.ColorLineData[i];\\r\\n            if (item.Date==minuteItem.Date && (minuteItem.Time>=item.Start && minuteItem.Time<=item.End))\\r\\n            {\\r\\n                return item;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.DrawColorLine=function()\\r\\n    {\\r\\n        if (!this.ColorLineData|| !this.Source || !this.Data) return;\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var minuteCount=this.ChartFrame.MinuteCount;\\r\\n        var data=this.Data;\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var ptLast={};  //最后一个点\\r\\n        var ptFirst={};\\r\\n        var drawCount=0;\\r\\n        var preColor=null;\\r\\n        this.Canvas.save();\\r\\n\\r\\n        for(var i=data.DataOffset,j=0;i<data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=null;\\r\\n            value=data.Data[i];\\r\\n            var item=this.Source.Data[i];\\r\\n            if (!value || !item) continue;\\r\\n\\r\\n            var colorItem=this.FindColorLineItem(item);\\r\\n            if (!colorItem)\\r\\n            {\\r\\n                if (drawCount>0)\\r\\n                {\\r\\n                    this.Canvas.stroke();\\r\\n                    bFirstPoint=true;\\r\\n                }\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (preColor && preColor!=colorItem.Color)\\r\\n            {\\r\\n                this.Canvas.stroke();\\r\\n                bFirstPoint=true;\\r\\n\\r\\n                /*\\r\\n                this.Canvas.strokeStyle=colorItem.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(ptLast.Y,ptLast.X);\\r\\n                else this.Canvas.moveTo(ptLast.X,ptLast.Y);\\r\\n                bFirstPoint=false;\\r\\n                preColor=colorItem.Color;\\r\\n                */\\r\\n            }\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=colorItem.Color;\\r\\n                if (IFrameSplitOperator.IsNumber(colorItem.LineWidth))\\r\\n                    this.Canvas.lineWidth=colorItem.LineWidth;\\r\\n\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n                ptFirst={X:x,Y:y};\\r\\n                preColor=colorItem.Color;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ptLast.X=x;\\r\\n            ptLast.Y=y;\\r\\n            ptLast.Price=value;\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0)\\r\\n        {\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        if (this.YClose==null) return range;\\r\\n        if (!this.IsShow) return range;\\r\\n\\r\\n        range.Min=this.YClose;\\r\\n        range.Max=this.YClose;\\r\\n\\r\\n        if (this.ChartBorder.LeftExtendWidth>10 && this.BeforeOpenData)\\r\\n        {\\r\\n            for(var i in this.BeforeOpenData.Data)\\r\\n            {\\r\\n                var item=this.BeforeOpenData.Data[i];\\r\\n                if (!item) continue;\\r\\n                if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n                {\\r\\n                    if (range.Max==null) range.Max=item.Price;\\r\\n                    if (range.Min==null) range.Min=item.Price;\\r\\n\\r\\n                    if (range.Max<item.Price) range.Max=item.Price;\\r\\n                    if (range.Min>item.Price) range.Min=item.Price;\\r\\n                }\\r\\n\\r\\n                //集合竞价均线统计\\r\\n                if (this.BeforeOpenData.Ver==3.0 && IFrameSplitOperator.IsNumber(item.AvPrice))\\r\\n                {\\r\\n                    if (range.Max==null) range.Max=item.AvPrice;\\r\\n                    if (range.Min==null) range.Min=item.AvPrice;\\r\\n\\r\\n                    if (range.Max<item.AvPrice) range.Max=item.AvPrice;\\r\\n                    if (range.Min>item.AvPrice) range.Min=item.AvPrice;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        var data=this.Data;\\r\\n        for(var i=data.DataOffset,j=0;i<data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=null;\\r\\n            value=data.Data[i];\\r\\n\\r\\n            if (value==null) continue;\\r\\n\\r\\n            if (range.Max==null) range.Max=value;\\r\\n            if (range.Min==null) range.Min=value;\\r\\n\\r\\n            if (range.Max<value) range.Max=value;\\r\\n            if (range.Min>value) range.Min=value;\\r\\n        }\\r\\n\\r\\n        if (range.Max==this.YClose && range.Min==this.YClose)\\r\\n        {\\r\\n            range.Max=this.YClose+this.YClose*0.1;\\r\\n            range.Min=this.YClose-this.YClose*0.1;\\r\\n            return range;\\r\\n        }\\r\\n\\r\\n        var distance=Math.max(Math.abs(this.YClose-range.Max),Math.abs(this.YClose-range.Min));\\r\\n        range.Max=this.YClose+distance;\\r\\n        range.Min=this.YClose-distance;\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        if (isHScreen) return false;\\r\\n        if (!this.IsShow) return false;\\r\\n        if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false;\\r\\n        var position=this.ChartBorder.PtInClient(x,y,this.Canvas,isHScreen);\\r\\n        if (position!=1) return false;\\r\\n\\r\\n        var data=this.Data;\\r\\n        var index=this.ChartFrame.GetXData(x);\\r\\n        var end=Math.ceil(index);\\r\\n        var start=Math.floor(index);\\r\\n\\r\\n        if (end>=data.Data.length || start>=data.Data.length) return false;\\r\\n\\r\\n        var lineWidth=5;\\r\\n        if (end==start)\\r\\n        {\\r\\n            var value=data.Data[start];\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var startValue=data.Data[start];\\r\\n            var endValue=data.Data[end];\\r\\n            var ptStart={X:this.ChartFrame.GetXFromIndex(start), Y:this.ChartFrame.GetYFromData(startValue)};\\r\\n            var ptEnd={X:this.ChartFrame.GetXFromIndex(end), Y:this.ChartFrame.GetYFromData(endValue)};\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ptStart.X,ptStart.Y+lineWidth);\\r\\n            this.Canvas.lineTo(ptStart.X,ptStart.Y-lineWidth);\\r\\n            this.Canvas.lineTo(ptEnd.X,ptEnd.Y-lineWidth);\\r\\n            this.Canvas.lineTo(ptEnd.X,ptEnd.Y+lineWidth);\\r\\n            this.Canvas.closePath();\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                tooltip.Data={ Index:index, Start:{ Index:start, Item:data.Data[start] }, End:{ Index:end, Value:data.Data[end]} };\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=5; //走势图线\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n//分钟线叠加 支持横屏\\r\\nfunction ChartOverlayMinutePriceLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Color=\\\"rgb(65,105,225)\\\";\\r\\n    this.MainData;                  //主图数据\\r\\n    this.MainYClose;                //主图股票的前收盘价\\r\\n    this.SourceData;                //原始数据\\r\\n\\r\\n    this.ClassName=\\\"ChartOverlayMinutePriceLine\\\";\\r\\n    this.Title;\\r\\n    this.Symbol;                    //叠加的股票代码\\r\\n    this.YClose;                    //叠加的股票前收盘\\r\\n    this.Status=OVERLAY_STATUS_ID.STATUS_NONE_ID;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data) return;\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen===true) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var minuteCount=this.ChartFrame.MinuteCount;\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        var xOffset=0;\\r\\n        for(var i=this.Data.DataOffset+xOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i].Close;\\r\\n            if (value==null) continue;\\r\\n            var showValue=value/this.YClose*this.MainYClose;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(showValue);\\r\\n\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(y,x);\\r\\n                else this.Canvas.moveTo(x,y);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(y,x);\\r\\n                else this.Canvas.lineTo(x,y);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n\\r\\n            if (drawCount>=minuteCount) //上一天的数据和这天地数据线段要断开\\r\\n            {\\r\\n                bFirstPoint=true;\\r\\n                this.Canvas.stroke();\\r\\n                drawCount=0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        if (this.YClose==null) return range;\\r\\n\\r\\n        range.Min=this.MainYClose;\\r\\n        range.Max=this.MainYClose;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i].Close;\\r\\n            if (value==null) continue;\\r\\n            var value=value/this.YClose*this.MainYClose;\\r\\n            if (range.Max==null) range.Max=value;\\r\\n            if (range.Min==null) range.Min=value;\\r\\n\\r\\n            if (range.Max<value) range.Max=value;\\r\\n            if (range.Min>value) range.Min=value;\\r\\n        }\\r\\n\\r\\n        if (range.Max==this.MainYClose && range.Min==this.MainYClose)\\r\\n        {\\r\\n            range.Max=this.MainYClose+this.MainYClose*0.1;\\r\\n            range.Min=this.MainYClose-this.MainYClose*0.1;\\r\\n            return range;\\r\\n        }\\r\\n\\r\\n        var distance=Math.max(Math.abs(this.MainYClose-range.Max),Math.abs(this.MainYClose-range.Min));\\r\\n        range.Max=this.MainYClose+distance;\\r\\n        range.Min=this.MainYClose-distance;\\r\\n\\r\\n        //JSConsole.Chart.Log(`[ChartOverlayMinutePriceLine::GetMaxMin] max=${range.Max} min=${range.Min}`);\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        if (isHScreen) return false;\\r\\n        if (!this.IsShow) return false;\\r\\n        if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false;\\r\\n        if (!IFrameSplitOperator.IsNumber(this.YClose) || !IFrameSplitOperator.IsNumber(this.MainYClose)) return false;\\r\\n\\r\\n        var position=this.ChartBorder.PtInClient(x,y,this.Canvas,isHScreen);\\r\\n        if (position!=1) return false;\\r\\n\\r\\n        var data=this.Data;\\r\\n        var index=this.ChartFrame.GetXData(x);\\r\\n        var end=Math.ceil(index);\\r\\n        var start=Math.floor(index);\\r\\n\\r\\n        if (end>=data.Data.length || start>=data.Data.length) return false;\\r\\n\\r\\n        var lineWidth=5;\\r\\n        if (end==start)\\r\\n        {\\r\\n            var value=data.Data[start];\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var startValue=data.Data[start].Close\\r\\n            startValue=startValue/this.YClose*this.MainYClose;\\r\\n            var endValue=data.Data[end].Close\\r\\n            endValue=endValue/this.YClose*this.MainYClose;\\r\\n            var ptStart={X:this.ChartFrame.GetXFromIndex(start), Y:this.ChartFrame.GetYFromData(startValue)};\\r\\n            var ptEnd={X:this.ChartFrame.GetXFromIndex(end), Y:this.ChartFrame.GetYFromData(endValue)};\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ptStart.X,ptStart.Y+lineWidth);\\r\\n            this.Canvas.lineTo(ptStart.X,ptStart.Y-lineWidth);\\r\\n            this.Canvas.lineTo(ptEnd.X,ptEnd.Y-lineWidth);\\r\\n            this.Canvas.lineTo(ptEnd.X,ptEnd.Y+lineWidth);\\r\\n            this.Canvas.closePath();\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                tooltip.Data={ Index:index, Start:{ Index:start, Item:data.Data[start] }, End:{ Index:end, Value:data.Data[end]} };\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=6; //走势图线\\r\\n                //tooltip.Stock={Symbol:this.Symbol, Name:this.Title };\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n//分钟信息地雷 支持横屏\\r\\nfunction ChartMinuteInfo()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMinuteInfo\\\";\\r\\n    this.Data=new Map()  //Map key=date-time, value=[{Date, Time, Title, Type, ID:}]\\r\\n    this.SourceData;\\r\\n    this.ChartMinutePrice;\\r\\n    this.YClose;\\r\\n    this.HQChartBorder;\\r\\n\\r\\n    this.TextColor=g_JSChartResource.MinuteInfo.TextColor;\\r\\n    this.Font=g_JSChartResource.MinuteInfo.Font;\\r\\n    this.PointColor=g_JSChartResource.MinuteInfo.PointColor;\\r\\n    this.LineColor=g_JSChartResource.MinuteInfo.LineColor;\\r\\n    this.TextBGColor=g_JSChartResource.MinuteInfo.TextBGColor;\\r\\n    this.PixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n    this.TextHeight=20;\\r\\n\\r\\n    this.TextRectCache=[];\\r\\n    this.InfoDrawCache=[];\\r\\n    this.FrameBottom;\\r\\n    this.FrameTop;\\r\\n    this.FrameLeft;\\r\\n    this.FrameRight;\\r\\n    this.YOffset=5;\\r\\n    this.IsHScreen=false;\\r\\n    this.IsDrawFull=false;   //是否全屏画\\r\\n\\r\\n    this.TooltipRect=[];    //Rect\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (option.TextColor) this.TextColor=option.TextColor;\\r\\n        if (option.TextBGColor) this.TextBGColor=option.TextBGColor;\\r\\n        if (option.Font) this.Font=option.Font;\\r\\n        if (option.PointColor) this.PointColor=option.PointColor;\\r\\n        if (option.LineColor) this.LineColor=option.LineColor;\\r\\n        if (option.TextHeight>0) this.TextHeight=option.TextHeight;\\r\\n        if (option.IsDrawFull==true) this.IsDrawFull=true;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.TooltipRect=[];\\r\\n        if (!this.ChartMinutePrice) return;\\r\\n        if (!this.Data || this.Data.size<=0) return;\\r\\n\\r\\n        this.TextRectCache=[];\\r\\n        this.InfoDrawCache=[];\\r\\n        this.PixelTatio=GetDevicePixelRatio();\\r\\n        this.YOffset=5*this.PixelTatio;\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var minuteCount=this.ChartFrame.MinuteCount;\\r\\n\\r\\n        this.FrameBottom=this.ChartBorder.GetBottom();\\r\\n        if (this.IsDrawFull && this.HQChartBorder) this.FrameBottom=this.HQChartBorder.GetBottom();\\r\\n        this.FrameTop=this.ChartBorder.GetTop();\\r\\n        this.FrameLeft=this.ChartBorder.GetLeft();\\r\\n        this.FrameRight=this.ChartBorder.GetRight();\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.FrameRight=this.ChartBorder.GetBottom();\\r\\n            this.FrameLeft=this.ChartBorder.GetTop();\\r\\n            this.FrameBottom=this.ChartBorder.GetLeft();\\r\\n            this.FrameTop=this.ChartBorder.GetRight();\\r\\n        }\\r\\n\\r\\n        this.YClose=this.ChartMinutePrice.YClose;\\r\\n\\r\\n        var data=this.ChartMinutePrice.Source;\\r\\n\\r\\n        for(var i=data.DataOffset,j=0;i<data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var item=data.Data[i];\\r\\n            if (!item) continue;\\r\\n\\r\\n            var dateTime=item.DateTime;\\r\\n            if (!this.Data.has(dateTime)) continue;\\r\\n            if (this.IsHScreen)\\r\\n                this.CalcuateInfoHScreenPosition(this.Data.get(dateTime), j, item);\\r\\n            else\\r\\n                this.CalcuateInfoPosition(this.Data.get(dateTime), j, item);\\r\\n        }\\r\\n\\r\\n        for(var i in this.InfoDrawCache)\\r\\n        {\\r\\n            var item=this.InfoDrawCache[i];\\r\\n            this.DrawInfoLines(item);\\r\\n        }\\r\\n\\r\\n        for(var i in this.InfoDrawCache)\\r\\n        {\\r\\n            var item=this.InfoDrawCache[i];\\r\\n            this.DrawInfoText(item);\\r\\n            if (!this.IsHScreen)\\r\\n            {\\r\\n                var rtBorder=item.Border;\\r\\n                var textRect=new Rect(rtBorder.X,rtBorder.Y,rtBorder.Width,rtBorder.Height);\\r\\n                var tooltipData={ Data:{ Item:item }, Rect:textRect };\\r\\n                this.TooltipRect.push(tooltipData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.TextRectCache=[];\\r\\n        this.InfoDrawCache=[];\\r\\n    }\\r\\n\\r\\n    this.CalcuateInfoPosition=function(infoItem, index, minuteItem)\\r\\n    {\\r\\n        if (!infoItem  || !infoItem.Data || infoItem.Data.length<=0) return;\\r\\n\\r\\n        var showItem=infoItem.Data[0];\\r\\n        this.Canvas.font = this.Font;\\r\\n        var textWidth=this.Canvas.measureText(showItem.Title).width+4*this.PixelTatio;\\r\\n        var textHeight=this.TextHeight*this.PixelTatio;\\r\\n\\r\\n        var x=this.ChartFrame.GetXFromIndex(index);\\r\\n        var y;\\r\\n        if (IFrameSplitOperator.IsNumber(showItem.Price)) y=this.ChartFrame.GetYFromData(showItem.Price);\\r\\n        else y=this.ChartFrame.GetYFromData(minuteItem.Close);\\r\\n        x=ToFixedPoint(x);\\r\\n\\r\\n        var isDrawLeft=x<(this.FrameLeft+Math.abs(this.FrameLeft-this.FrameRight)/2);\\r\\n\\r\\n        var ARRAY_OFFSET=[2,4,6,8,3,5,7];\\r\\n        var offset=textHeight+ARRAY_OFFSET[index%ARRAY_OFFSET.length]*this.PixelTatio;\\r\\n        var yData=\\r\\n            {\\r\\n                Y:\\r\\n                    [\\r\\n                        {Value:y+(textHeight+this.YOffset), Offset: offset},\\r\\n                        {Value:y-(2*textHeight+this.YOffset), Offset:-offset}\\r\\n                    ]\\r\\n            };\\r\\n\\r\\n        if (minuteItem.Close<this.YClose)\\r\\n            yData.Y=yData.Y.reverse();\\r\\n\\r\\n        var rtBorder={X:x, Y:null, Width:textWidth,Height:textHeight};\\r\\n        if (!isDrawLeft) rtBorder.X-=rtBorder.Width;\\r\\n\\r\\n        this.FixTextRect(rtBorder,yData);\\r\\n        var InfoDrawItem= {  Border:rtBorder, Start:{X:x,Y:y}, IsLeft:isDrawLeft, Title:showItem.Title, Date:showItem.Date, Time:showItem.Time };\\r\\n        if (showItem.Content) InfoDrawItem.Content=showItem.Content;\\r\\n        if (showItem.Link) InfoDrawItem.Link=showItem.Link;\\r\\n        if (showItem.Color) InfoDrawItem.Color=showItem.Color;\\r\\n        if (showItem.BGColor) InfoDrawItem.BGColor=showItem.BGColor;\\r\\n\\r\\n        this.InfoDrawCache.push(InfoDrawItem);\\r\\n        this.TextRectCache.push(rtBorder);\\r\\n    }\\r\\n\\r\\n    this.CalcuateInfoHScreenPosition=function(infoItem, index, minuteItem)\\r\\n    {\\r\\n        if (!infoItem  || !infoItem.Data || infoItem.Data.length<=0) return;\\r\\n\\r\\n        var showItem=infoItem.Data[0];\\r\\n        this.Canvas.font = this.Font;\\r\\n        var textHeight=this.Canvas.measureText(showItem.Title).width+4*this.PixelTatio;\\r\\n        var textWidth=this.TextHeight*this.PixelTatio;\\r\\n\\r\\n        var y=this.ChartFrame.GetXFromIndex(index);\\r\\n        var x;\\r\\n        if (IFrameSplitOperator.IsNumber(showItem.Price)) x=this.ChartFrame.GetYFromData(showItem.Price);\\r\\n        else x=this.ChartFrame.GetYFromData(minuteItem.Close);\\r\\n        y=ToFixedPoint(y);\\r\\n\\r\\n        var isDrawLeft=y<(this.FrameLeft+Math.abs(this.FrameLeft-this.FrameRight)/2);\\r\\n\\r\\n        var ARRAY_OFFSET=[2,4,6,8,3,5,7];\\r\\n        var offset=textWidth+ARRAY_OFFSET[index%ARRAY_OFFSET.length]*this.PixelTatio;\\r\\n        var xData=\\r\\n            {\\r\\n                X:\\r\\n                    [\\r\\n                        {Value:x+(textWidth+this.YOffset), Offset: offset},\\r\\n                        {Value:x-(2*textWidth+this.YOffset), Offset:-offset}\\r\\n                    ]\\r\\n            };\\r\\n\\r\\n        if (minuteItem.Close>this.YClose)\\r\\n            xData.X=xData.X.reverse();\\r\\n\\r\\n        var rtBorder={X:null, Y:y, Width:textWidth,Height:textHeight};\\r\\n        if (!isDrawLeft) rtBorder.Y-=rtBorder.Height;\\r\\n\\r\\n        this.FixHScreenTextRect(rtBorder,xData);\\r\\n        var InfoDrawItem={ Border:rtBorder, Start:{X:x,Y:y}, IsLeft:isDrawLeft, Title:showItem.Title };\\r\\n\\r\\n        this.InfoDrawCache.push(InfoDrawItem);\\r\\n        this.TextRectCache.push(rtBorder);\\r\\n    }\\r\\n\\r\\n    this.DrawInfoLines=function(item)\\r\\n    {\\r\\n        var rtBorder=item.Border;\\r\\n        var isDrawLeft=item.IsLeft;\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ToFixedPoint(item.Start.X),item.Start.Y);\\r\\n        if (isDrawLeft)\\r\\n        {\\r\\n            this.Canvas.lineTo(ToFixedPoint(item.Start.X),rtBorder.Y);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.IsHScreen) this.Canvas.lineTo(rtBorder.X,rtBorder.Y+rtBorder.Height);\\r\\n            else this.Canvas.lineTo(ToFixedPoint(item.Start.X),rtBorder.Y);\\r\\n        }\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        this.Canvas.fillStyle = this.PointColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.arc(item.Start.X,item.Start.Y, 5, 0, 2 * Math.PI);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.DrawInfoText=function(item)\\r\\n    {\\r\\n        var rtBorder=item.Border;\\r\\n        var x=rtBorder.X, y=rtBorder.Y;\\r\\n        if (item.BGColor) this.Canvas.fillStyle=item.BGColor\\r\\n        else this.Canvas.fillStyle=this.TextBGColor;\\r\\n        this.Canvas.fillRect(x, y, rtBorder.Width,rtBorder.Height);\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(x,y,rtBorder.Width,rtBorder.Height);\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.translate(rtBorder.X,rtBorder.Y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            x=0;y=0;\\r\\n        }\\r\\n\\r\\n        this.Canvas.textAlign = 'left'\\r\\n        this.Canvas.textBaseline = 'middle';\\r\\n        if (item.Color) this.Canvas.fillStyle=item.Color;\\r\\n        else this.Canvas.fillStyle = this.TextColor;\\r\\n        this.Canvas.font = this.Font;\\r\\n        if (this.IsHScreen) this.Canvas.fillText(item.Title, x+2*this.PixelTatio, y-rtBorder.Width/2);\\r\\n        else this.Canvas.fillText(item.Title, x+2*this.PixelTatio, y+rtBorder.Height/2);\\r\\n\\r\\n        if (this.IsHScreen) this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.FixTextRect=function(rect,yData)\\r\\n    {\\r\\n        for(var k in yData.Y)\\r\\n        {\\r\\n            var yItem=yData.Y[k];\\r\\n            rect.Y=yItem.Value;\\r\\n\\r\\n            var y;\\r\\n            for(var j=0;j<10;++j)\\r\\n            {\\r\\n                var isOverlap=false;\\r\\n                for(var i in this.TextRectCache)\\r\\n                {\\r\\n                    var item=this.TextRectCache[i];\\r\\n                    if (this.IsOverlap(item, rect))\\r\\n                    {\\r\\n                        isOverlap=true;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (isOverlap==false) return;\\r\\n\\r\\n                y=rect.Y;\\r\\n                y+=yItem.Offset;\\r\\n                if (y+rect.Height>this.FrameBottom || y<this.FrameTop) break;\\r\\n\\r\\n                rect.Y=y;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.FixHScreenTextRect=function(rect,xData)\\r\\n    {\\r\\n        for(var k in xData.X)\\r\\n        {\\r\\n            var xItem=xData.X[k];\\r\\n            rect.X=xItem.Value;\\r\\n\\r\\n            var x;\\r\\n            for(var j=0;j<10;++j)\\r\\n            {\\r\\n                var isOverlap=false;\\r\\n                for(var i in this.TextRectCache)\\r\\n                {\\r\\n                    var item=this.TextRectCache[i];\\r\\n                    if (this.IsOverlap(item, rect))\\r\\n                    {\\r\\n                        isOverlap=true;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (isOverlap==false) return;\\r\\n\\r\\n                x=rect.X;\\r\\n                x+=xItem.Offset;\\r\\n                if (x+rect.Width<this.FrameBottom || x>this.FrameTop) break;\\r\\n\\r\\n                rect.X=x;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.IsOverlap=function(rc1, rc2)\\r\\n    {\\r\\n        if (rc1.X + rc1.Width  > rc2.X &&rc2.X + rc2.Width  > rc1.X &&rc1.Y + rc1.Height > rc2.Y &&rc2.Y + rc2.Height > rc1.Y)\\r\\n            return true;\\r\\n        else\\r\\n            return false;\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={Min:null, Max:null};\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        for(var i in this.TooltipRect)\\r\\n        {\\r\\n            var item=this.TooltipRect[i];\\r\\n            if (!item.Rect) continue;\\r\\n            var rect=item.Rect;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                //JSConsole.Chart.Log('[ChartMinuteInfo::GetTooltipData] info ', item);\\r\\n                tooltip.Data=item;\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=3; //异动信息\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n//MACD森林线 支持横屏\\r\\nfunction ChartMACD()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMACD\\\";\\r\\n    this.UpColor=g_JSChartResource.UpBarColor;\\r\\n    this.DownColor=g_JSChartResource.DownBarColor;\\r\\n    this.LineWidth=1;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.ChartFrame.IsHScreen===true)\\r\\n        {\\r\\n            this.HScreenDraw();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var isMinute=this.IsMinuteFrame();\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.ChartBorder.GetBorder();\\r\\n        var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var chartright=border.RightEx;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var lockRect=this.GetLockRect();\\r\\n        if (lockRect) chartright=lockRect.Left;\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n\\r\\n        var lineWidth=this.LineWidth*GetDevicePixelRatio();\\r\\n        if (this.LineWidth==50) lineWidth=dataWidth;\\r\\n        else if (lineWidth>dataWidth) lineWidth=dataWidth;\\r\\n\\r\\n        var backupLineWidth=this.Canvas.lineWidth;\\r\\n        this.Canvas.lineWidth=lineWidth;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            //for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            if (isMinute)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n                var x=left+(right-left)/2;\\r\\n            }\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            var xFix=ToFixedPoint2(lineWidth, x); //毛边修正\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(xFix,yBottom);\\r\\n            this.Canvas.lineTo(xFix,y);\\r\\n\\r\\n            if (value>=0) this.Canvas.strokeStyle=this.UpColor;\\r\\n            else this.Canvas.strokeStyle=this.DownColor;\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n\\r\\n        this.Canvas.lineWidth=backupLineWidth;\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function()\\r\\n    {\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var border=this.ChartBorder.GetHScreenBorder();\\r\\n        var chartright=border.BottomEx;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var lockRect=this.GetLockRect();\\r\\n        if (lockRect) chartright=lockRect.Top;\\r\\n\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n\\r\\n        var lineWidth=this.LineWidth*GetDevicePixelRatio();\\r\\n        if (this.LineWidth==50) lineWidth=dataWidth;\\r\\n        else if (lineWidth>dataWidth) lineWidth=dataWidth;\\r\\n\\r\\n        var backupLineWidth=this.Canvas.lineWidth;\\r\\n        this.Canvas.lineWidth=lineWidth;\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(yBottom,ToFixedPoint(x));\\r\\n            this.Canvas.lineTo(y,ToFixedPoint(x));\\r\\n\\r\\n            if (value>=0) this.Canvas.strokeStyle=this.UpColor;\\r\\n            else this.Canvas.strokeStyle=this.DownColor;\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n\\r\\n        this.Canvas.lineWidth=backupLineWidth;\\r\\n    }\\r\\n}\\r\\n\\r\\n//柱子\\r\\nfunction ChartBar()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartBar\\\";\\r\\n    this.UpBarColor=g_JSChartResource.UpBarColor;\\r\\n    this.DownBarColor=g_JSChartResource.DownBarColor;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        var yBottom=this.ChartFrame.GetYFromData(0);\\r\\n        if (dataWidth>=4)\\r\\n        {\\r\\n            yBottom=ToFixedRect(yBottom);   //调整为整数\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                if (value==null || value==0) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n\\r\\n                if (value>0) this.Canvas.fillStyle=this.UpBarColor;\\r\\n                else this.Canvas.fillStyle=this.DownBarColor;\\r\\n\\r\\n                //高度调整为整数\\r\\n                var height=ToFixedRect(Math.abs(yBottom-y));\\r\\n                if(yBottom-y>0) y=yBottom-height;\\r\\n                else y=yBottom+height;\\r\\n                this.Canvas.fillRect(ToFixedRect(left),y,ToFixedRect(dataWidth),height);\\r\\n            }\\r\\n        }\\r\\n        else    //太细了 直接画柱子\\r\\n        {\\r\\n            for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                if (value==null || value==0) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                var y=this.ChartFrame.GetYFromData(value);\\r\\n\\r\\n                if (value>0) this.Canvas.strokeStyle=this.UpBarColor;\\r\\n                else this.Canvas.strokeStyle=this.DownBarColor;\\r\\n\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),y);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),yBottom);\\r\\n                this.Canvas.stroke();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=0;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (range.Max==null) range.Max=value;\\r\\n            if (range.Max<value) range.Max=value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n// 面积图\\r\\nfunction ChartBand()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.IsDrawFirst = true;\\r\\n\\r\\n    this.ClassName=\\\"ChartBand\\\";\\r\\n    this.FirstColor = g_JSChartResource.Index.LineColor[0];\\r\\n    this.SecondColor = g_JSChartResource.Index.LineColor[1];\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n        var x = 0;\\r\\n        var y = 0;\\r\\n        var y2 = 0;\\r\\n        var firstlinePoints = [];\\r\\n        var secondlinePoints = [];\\r\\n        for(var i=this.Data.DataOffset,j=0; i<this.Data.Data.length && j<xPointCount;++i, ++j, xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            firstlinePoints = [];\\r\\n            secondlinePoints = [];\\r\\n            for(;i<this.Data.Data.length && j<xPointCount;++i, ++j, xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var value=this.Data.Data[i];\\r\\n                if (value==null || value.Value==null || value.Value2 == null) break;\\r\\n                x=this.ChartFrame.GetXFromIndex(j);\\r\\n                y=this.ChartFrame.GetYFromData(value.Value);\\r\\n                y2 = this.ChartFrame.GetYFromData(value.Value2);\\r\\n                firstlinePoints.push({x:x,y:y});\\r\\n                secondlinePoints.push({x:x,y:y2});\\r\\n            }\\r\\n\\r\\n            if (firstlinePoints.length>1 && secondlinePoints.length>1)\\r\\n            {\\r\\n                this.DrawBand(firstlinePoints, secondlinePoints);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawBand=function(aryFrist, arySecond)\\r\\n    {\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.beginPath();\\r\\n        for(var i=0;i<aryFrist.length;++i)\\r\\n        {\\r\\n            if (i == 0)\\r\\n                this.Canvas.moveTo(aryFrist[i].x, aryFrist[i].y);\\r\\n            else\\r\\n                this.Canvas.lineTo(aryFrist[i].x, aryFrist[i].y);\\r\\n        }\\r\\n\\r\\n        for (var i = arySecond.length-1; i >= 0; --i)\\r\\n        {\\r\\n            this.Canvas.lineTo(arySecond[i].x, arySecond[i].y);\\r\\n        }\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.clip();\\r\\n\\r\\n        this.Canvas.moveTo(aryFrist[0].x, this.ChartBorder.GetBottom());\\r\\n        for (var i = 0; i < aryFrist.length; ++i)\\r\\n        {\\r\\n            this.Canvas.lineTo(aryFrist[i].x, aryFrist[i].y);\\r\\n        }\\r\\n        this.Canvas.lineTo(aryFrist[aryFrist.length-1].x, this.ChartBorder.GetBottom());\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fillStyle = this.FirstColor;\\r\\n        this.Canvas.fill();\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(arySecond[0].x, this.ChartBorder.GetBottom());\\r\\n        for (var i = 0; i < arySecond.length; ++i)\\r\\n        {\\r\\n            this.Canvas.lineTo(arySecond[i].x, arySecond[i].y);\\r\\n        }\\r\\n        this.Canvas.lineTo(arySecond[arySecond.length-1].x, this.ChartBorder.GetBottom());\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fillStyle = this.SecondColor;\\r\\n        this.Canvas.fill();\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null || value.Value==null || value.Value2 == null) continue;\\r\\n            var maxData = value.Value>value.Value2?value.Value:value.Value2;\\r\\n            var minData = value.Value<value.Value2?value.Value:value.Value2;\\r\\n            if (range.Max==null)\\r\\n                range.Max = maxData;\\r\\n            else if (range.Max < maxData)\\r\\n                range.Max = maxData;\\r\\n\\r\\n            if (range.Min==null)\\r\\n                range.Min = minData;\\r\\n            else if (range.Min > minData)\\r\\n                range.Min = minData;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 线段围成的面积图 支持横屏\\r\\nfunction ChartLineArea()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.IsDrawFirst = true;    //面积图在K线前面画,否则回挡住K线的\\r\\n\\r\\n    this.ClassName=\\\"ChartLineArea\\\";\\r\\n    this.Color='rgb(56,67,99)';\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var x = 0, y = 0, y2 = 0;\\r\\n        var aryPoint=[];\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            aryPoint[i]=null;\\r\\n            if (value==null || value.Value==null || value.Value2 == null) continue;\\r\\n            x=this.ChartFrame.GetXFromIndex(j);\\r\\n            y=this.ChartFrame.GetYFromData(value.Value);\\r\\n            y2 = this.ChartFrame.GetYFromData(value.Value2);\\r\\n\\r\\n            if (this.IsHScreen)\\r\\n                aryPoint[i]={ Line:{ X:y, Y:x }, Line2:{ X:y2, Y:x }};\\r\\n            else\\r\\n                aryPoint[i]={ Line:{ X:x, Y:y }, Line2:{ X:x, Y:y2 }};\\r\\n        }\\r\\n\\r\\n        this.Canvas.fillStyle = this.Color;\\r\\n        var firstPoint=true;\\r\\n        var pointCount=0;\\r\\n        var aryLine2=[];\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (!item)\\r\\n            {\\r\\n                if (pointCount>0)\\r\\n                {\\r\\n                    for(var j=aryLine2.length-1; j>=0; --j)\\r\\n                    {\\r\\n                        var item2=aryLine2[j];\\r\\n                        this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y);\\r\\n                    }\\r\\n                    this.Canvas.closePath();\\r\\n                    this.Canvas.fill();\\r\\n                }\\r\\n\\r\\n                firstPoint=true;\\r\\n                pointCount=0;\\r\\n                aryLine2=[];\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (firstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(item.Line.X, item.Line.Y);\\r\\n                firstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.lineTo(item.Line.X, item.Line.Y);\\r\\n            }\\r\\n\\r\\n            aryLine2.push(item);\\r\\n            ++pointCount;\\r\\n        }\\r\\n\\r\\n        if (pointCount>0)\\r\\n        {\\r\\n            for(var j=aryLine2.length-1; j>=0; --j)\\r\\n            {\\r\\n                var item2=aryLine2[j];\\r\\n                this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (!value || value.Value==null || value.Value2 == null) continue;\\r\\n\\r\\n            var maxData = value.Value>value.Value2?value.Value:value.Value2;\\r\\n            var minData = value.Value<value.Value2?value.Value:value.Value2;\\r\\n\\r\\n            if (range.Max==null)  range.Max = maxData;\\r\\n            else if (range.Max < maxData) range.Max = maxData;\\r\\n\\r\\n            if (range.Min==null) range.Min = minData;\\r\\n            else if (range.Min > minData) range.Min = minData;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 线段围成的面积图 支持横屏\\r\\nfunction ChartFillRGN()\\r\\n{\\r\\n    this.newMethod=ChartLineArea;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.IsDrawFirst = true;    //面积图在K线前面画,否则回挡住K线的\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.ClassName=\\\"ChartFillRGN\\\";\\r\\n\\r\\n    this.DrawRGB=function(aryPoint)\\r\\n    {\\r\\n        var firstPoint=true;\\r\\n        var pointCount=0;\\r\\n        var aryLine2=[];\\r\\n        var color=null;\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (!item || (color && item.Color!=color) )\\r\\n            {\\r\\n                if (pointCount>0)\\r\\n                {\\r\\n                    for(var j=aryLine2.length-1; j>=0; --j)\\r\\n                    {\\r\\n                        var item2=aryLine2[j];\\r\\n                        this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y);\\r\\n                    }\\r\\n                    this.Canvas.closePath();\\r\\n                    this.Canvas.fillStyle = color;\\r\\n                    this.Canvas.fill();\\r\\n                }\\r\\n\\r\\n                firstPoint=true;\\r\\n                pointCount=0;\\r\\n                aryLine2=[];\\r\\n                color=null;\\r\\n            }\\r\\n\\r\\n            if (!item) continue;\\r\\n\\r\\n            if (firstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(item.Line.X, item.Line.Y);\\r\\n                firstPoint=false;\\r\\n                color=item.Color;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.lineTo(item.Line.X, item.Line.Y);\\r\\n            }\\r\\n\\r\\n            aryLine2.push(item);\\r\\n            ++pointCount;\\r\\n        }\\r\\n\\r\\n        if (pointCount>0)\\r\\n        {\\r\\n            for(var j=aryLine2.length-1; j>=0; --j)\\r\\n            {\\r\\n                var item2=aryLine2[j];\\r\\n                this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fillStyle = color;\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var x = 0, y = 0, y2 = 0;\\r\\n        var aryPoint=[];    //点坐标\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            aryPoint[i]=null;\\r\\n            if (value==null || value.Value==null || value.Value2 == null || !value.Color) continue;\\r\\n\\r\\n            x=this.ChartFrame.GetXFromIndex(j);\\r\\n            y=this.ChartFrame.GetYFromData(value.Value);\\r\\n            y2 = this.ChartFrame.GetYFromData(value.Value2);\\r\\n\\r\\n            if (this.IsHScreen)\\r\\n                aryPoint[i]={ Line:{ X:y, Y:x }, Line2:{ X:y2, Y:x }, Color:value.Color };\\r\\n            else\\r\\n                aryPoint[i]={ Line:{ X:x, Y:y }, Line2:{ X:x, Y:y2 }, Color:value.Color };\\r\\n        }\\r\\n\\r\\n        this.DrawRGB(aryPoint);\\r\\n    }\\r\\n}\\r\\n\\r\\n//支持横屏\\r\\n//用法:FLOATRGN(PRICE,WIDTH,COND1,COLOR1,COND2,COLOR2...),以PRICE为基础填充宽度为WIDTH像素的区域,WIDTH为负则向下填充,当COND1条件满足时,用COLOR1颜色,当COND2条件满足时,用COLOR2颜色,否则不填充,从COND1之后的参数均可以省略,最多可以有10组条件\\r\\n//例如:FLOATRGN(CLOSE,VOL/HHV(VOL,10)*15,CLOSE>OPEN,RGB(255,0,0),1,RGB(0,255,0)) 表示沿收盘价填充宽度为成交量的区域,区域最大宽度为15像素,阳线时用红色,阴线时用绿色。\\r\\nfunction ChartFLOATRGN()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.IsDrawFirst = false;    //面积图在K线前面画,否则回挡住K线的\\r\\n\\r\\n    this.ClassName=\\\"ChartFLOATRGN\\\";\\r\\n    this.Color='rgb(56,67,99)';\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n\\r\\n        var x = 0, y = 0, y2 = 0;\\r\\n        var aryPoint=[];    //点坐标\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            aryPoint[i]=null;\\r\\n            if (!item || !IFrameSplitOperator.IsNumber(item.Value)|| !IFrameSplitOperator.IsNumber(item.Value2) || !item.Color) continue;\\r\\n\\r\\n            x=this.ChartFrame.GetXFromIndex(j);\\r\\n            y=this.ChartFrame.GetYFromData(item.Value);\\r\\n\\r\\n            if (this.IsHScreen)\\r\\n                aryPoint[i]={ Line:{ X:y, Y:x }, Line2:{ X:y+item.Value2*GetDevicePixelRatio(), Y:x }, Color:item.Color };\\r\\n            else\\r\\n                aryPoint[i]={ Line:{ X:x, Y:y }, Line2:{ X:x, Y:y-item.Value2*GetDevicePixelRatio() }, Color:item.Color };\\r\\n        }\\r\\n\\r\\n        //计算左右位置的点\\r\\n        var preItem=null;\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (preItem && item)\\r\\n            {\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    var xWidth=(item.Line.Y-preItem.Line.Y);\\r\\n                    x=preItem.Line.Y+xWidth/2;\\r\\n                    y=preItem.Line.X+(item.Line.X-preItem.Line.X)/2;\\r\\n                    y2=preItem.Line2.X+(item.Line2.X-preItem.Line2.X)/2;\\r\\n\\r\\n                    preItem.RightLine={X:y, Y:x};\\r\\n                    preItem.RightLine2={X:y2, Y:x};\\r\\n                    item.LeftLine={X:y, Y:x};\\r\\n                    item.LeftLine2={X:y2, Y:x};\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var xWidth=(item.Line.X-preItem.Line.X);\\r\\n                    x=preItem.Line.X+xWidth/2;\\r\\n                    y=preItem.Line.Y+(item.Line.Y-preItem.Line.Y)/2;\\r\\n                    y2=preItem.Line2.Y+(item.Line2.Y-preItem.Line2.Y)/2;\\r\\n                    preItem.RightLine={X:x, Y:y};\\r\\n                    preItem.RightLine2={X:x, Y:y2};\\r\\n                    item.LeftLine={X:x, Y:y};\\r\\n                    item.LeftLine2={X:x, Y:y2};\\r\\n                }\\r\\n            }\\r\\n\\r\\n            preItem=item;  //上一个点\\r\\n        }\\r\\n\\r\\n        this.DrawRGB(aryPoint);\\r\\n    }\\r\\n\\r\\n    this.DrawRGB=function(aryPoint)\\r\\n    {\\r\\n        var firstPoint=true;\\r\\n        var pointCount=0;\\r\\n        var aryLine2=[];\\r\\n        var color=null;\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeftEx();\\r\\n            var right=this.ChartBorder.GetRightEx();\\r\\n            var top=this.ChartBorder.GetTop();\\r\\n            var bottom=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeft();\\r\\n            var right=this.ChartBorder.GetRight();\\r\\n            var top=this.ChartBorder.GetTopEx();\\r\\n            var bottom=this.ChartBorder.GetBottomEx();\\r\\n        }\\r\\n\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,(right-left),(bottom-top));\\r\\n        this.Canvas.clip();\\r\\n\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (!item || (color && item.Color!=color) )\\r\\n            {\\r\\n                if (pointCount>0)\\r\\n                {\\r\\n                    var lastItem=aryLine2[aryLine2.length-1];\\r\\n                    var firstItem=aryLine2[0];\\r\\n                    if (lastItem.RightLine)\\r\\n                    {\\r\\n                        this.Canvas.lineTo(lastItem.RightLine.X, lastItem.RightLine.Y);\\r\\n                        this.Canvas.lineTo(lastItem.RightLine2.X, lastItem.RightLine2.Y);\\r\\n                    }\\r\\n\\r\\n                    for(var j=aryLine2.length-1; j>=0; --j)\\r\\n                    {\\r\\n                        var item2=aryLine2[j];\\r\\n                        this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y);\\r\\n                    }\\r\\n\\r\\n                    if (firstItem.LeftLine2)\\r\\n                    {\\r\\n                        this.Canvas.lineTo(firstItem.LeftLine2.X, firstItem.LeftLine2.Y);\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.closePath();\\r\\n                    this.Canvas.fillStyle = color;\\r\\n                    this.Canvas.fill();\\r\\n                }\\r\\n\\r\\n                firstPoint=true;\\r\\n                pointCount=0;\\r\\n                aryLine2=[];\\r\\n                color=null;\\r\\n            }\\r\\n\\r\\n            if (!item) continue;\\r\\n\\r\\n            if (firstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (item.LeftLine)\\r\\n                {\\r\\n                    this.Canvas.moveTo(item.LeftLine.X, item.LeftLine.Y);\\r\\n                    this.Canvas.lineTo(item.Line.X, item.Line.Y);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(item.Line.X, item.Line.Y);\\r\\n                }\\r\\n                firstPoint=false;\\r\\n                color=item.Color;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.lineTo(item.Line.X, item.Line.Y);\\r\\n            }\\r\\n\\r\\n            aryLine2.push(item);\\r\\n            ++pointCount;\\r\\n        }\\r\\n\\r\\n        if (pointCount>0)\\r\\n        {\\r\\n            var lastItem=aryLine2[aryLine2.length-1];\\r\\n            var firstItem=aryLine2[0];\\r\\n            if (lastItem.RightLine)\\r\\n            {\\r\\n                this.Canvas.lineTo(lastItem.RightLine.X, lastItem.RightLine.Y);\\r\\n                this.Canvas.lineTo(lastItem.RightLine2.X, lastItem.RightLine2.Y);\\r\\n            }\\r\\n\\r\\n            for(var j=aryLine2.length-1; j>=0; --j)\\r\\n            {\\r\\n                var item2=aryLine2[j];\\r\\n                this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y);\\r\\n            }\\r\\n\\r\\n            if (firstItem.LeftLine2)\\r\\n            {\\r\\n                this.Canvas.lineTo(firstItem.LeftLine2.X, firstItem.LeftLine2.Y);\\r\\n            }\\r\\n\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fillStyle = color;\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (!item || !IFrameSplitOperator.IsNumber(item.Value)) continue;\\r\\n            var value=item.Value;\\r\\n\\r\\n            if (range.Max==null) range.Max = value;\\r\\n            else if (range.Max < value) range.Max = value;\\r\\n\\r\\n            if (range.Min==null) range.Min = value;\\r\\n            else if (range.Min > value) range.Min = value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//线段围城的顶部或底部面积图 TODO:支持横屏\\r\\nfunction ChartFillBGRGN()\\r\\n{\\r\\n    this.newMethod=ChartFillRGN;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.IsDrawFirst = true;    //面积图在K线前面画,否则回挡住K线的\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.ClassName=\\\"ChartFillBGRGN\\\";\\r\\n\\r\\n\\r\\n    this.DrawVerticalRGN=function()\\r\\n    {\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n\\r\\n        var y=top, y2=bottom;\\r\\n\\r\\n        var aryPoint=[];    //点坐标\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            aryPoint[i]=null;\\r\\n            if (!value || !value.Color) continue;\\r\\n\\r\\n            x=this.ChartFrame.GetXFromIndex(j);\\r\\n\\r\\n            if (this.IsHScreen)\\r\\n                aryPoint[i]={ Line:{ X:y, Y:x }, Line2:{ X:y2, Y:x }, Color:value.Color };\\r\\n            else\\r\\n                aryPoint[i]={ Line:{ X:x, Y:y }, Line2:{ X:x, Y:y2 }, Color:value.Color };\\r\\n        }\\r\\n\\r\\n        this.DrawRGB(aryPoint);\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        if (this.Name==\\\"FILLVERTICALRGN\\\")\\r\\n        {\\r\\n            this.DrawVerticalRGN();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var x = 0, y = 0, y2 = top;\\r\\n        if (this.Name==\\\"FILLBOTTOMRGN\\\")  y2=bottom;\\r\\n\\r\\n        var aryPoint=[];    //点坐标\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            aryPoint[i]=null;\\r\\n            if (value==null || value.Value==null || !value.Color) continue;\\r\\n\\r\\n            x=this.ChartFrame.GetXFromIndex(j);\\r\\n            y=this.ChartFrame.GetYFromData(value.Value);\\r\\n\\r\\n            if (this.IsHScreen)\\r\\n                aryPoint[i]={ Line:{ X:y, Y:x }, Line2:{ X:y2, Y:x }, Color:value.Color };\\r\\n            else\\r\\n                aryPoint[i]={ Line:{ X:x, Y:y }, Line2:{ X:x, Y:y2 }, Color:value.Color };\\r\\n        }\\r\\n\\r\\n        this.DrawRGB(aryPoint);\\r\\n    }\\r\\n\\r\\n    this.DrawRGB=function(aryPoint)\\r\\n    {\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var halfWidth=(distanceWidth+dataWidth)/2;\\r\\n        var firstPoint=true;\\r\\n        var pointCount=0;\\r\\n        var aryLine2=[];\\r\\n        var color=null;\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (!item || (color && item.Color!=color) )\\r\\n            {\\r\\n                if (pointCount>0)\\r\\n                {\\r\\n                    for(var j=aryLine2.length-1; j>=0; --j)\\r\\n                    {\\r\\n                        var item2=aryLine2[j];\\r\\n                        this.Canvas.lineTo(item2.Line2.X+halfWidth, item2.Line2.Y);\\r\\n                        this.Canvas.lineTo(item2.Line2.X-halfWidth, item2.Line2.Y);\\r\\n                    }\\r\\n                    this.Canvas.closePath();\\r\\n                    this.Canvas.fillStyle = color;\\r\\n                    this.Canvas.fill();\\r\\n                }\\r\\n\\r\\n                firstPoint=true;\\r\\n                pointCount=0;\\r\\n                aryLine2=[];\\r\\n                color=null;\\r\\n            }\\r\\n\\r\\n            if (!item) continue;\\r\\n\\r\\n            if (firstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(item.Line.X-halfWidth, item.Line.Y);\\r\\n                this.Canvas.lineTo(item.Line.X+halfWidth, item.Line.Y);\\r\\n                firstPoint=false;\\r\\n                color=item.Color;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.lineTo(item.Line.X-halfWidth, item.Line.Y);\\r\\n                this.Canvas.lineTo(item.Line.X+halfWidth, item.Line.Y);\\r\\n            }\\r\\n\\r\\n            aryLine2.push(item);\\r\\n            ++pointCount;\\r\\n        }\\r\\n\\r\\n        if (pointCount>0)\\r\\n        {\\r\\n            for(var j=aryLine2.length-1; j>=0; --j)\\r\\n            {\\r\\n                var item2=aryLine2[j];\\r\\n                this.Canvas.lineTo(item2.Line2.X+halfWidth, item2.Line2.Y);\\r\\n                this.Canvas.lineTo(item2.Line2.X-halfWidth, item2.Line2.Y);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fillStyle = color;\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={};\\r\\n        range.Min=null;\\r\\n        range.Max=null;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (!value || value.Value==null ) continue;\\r\\n\\r\\n            var value=value.Value;\\r\\n\\r\\n            if (range.Max==null)  range.Max = value;\\r\\n            else if (range.Max < value) range.Max = value;\\r\\n\\r\\n            if (range.Min==null) range.Min = value;\\r\\n            else if (range.Min > value) range.Min = value;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 通道面积图 支持横屏\\r\\nfunction ChartChannel()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.IsDrawFirst = true;\\r\\n\\r\\n    this.ClassName=\\\"ChartChannel\\\";\\r\\n    this.IsHScreen=false;   //是否是横屏\\r\\n    this.PointCount=0;\\r\\n    this.DataWidth=0;\\r\\n    this.DistanceWidth=0;\\r\\n    this.ChartRight=0;      //可以绘制的最右边\\r\\n    this.LineColor='RGB(255,0,0)';\\r\\n    this.LineDotted=[3,3];\\r\\n    this.AreaColor='RGB(255,222,173)';\\r\\n    this.LineWidth=1;\\r\\n\\r\\n    this.CalculateData=function()   //把数据通过nul值分割开, 并计算坐标\\r\\n    {\\r\\n        var data=[];\\r\\n        var lineData=[];\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<this.PointCount;++i,++j)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (!item || !IFrameSplitOperator.IsNumber(item.Value) || !IFrameSplitOperator.IsNumber(item.Value2))\\r\\n            {\\r\\n                if (lineData.length>0)\\r\\n                {\\r\\n                    data.push(lineData);\\r\\n                    lineData=[];    //创建新的一组数据\\r\\n                }\\r\\n\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            if (x>this.ChartRight) break;\\r\\n            var y=this.ChartFrame.GetYFromData(item.Value);\\r\\n            var y2=this.ChartFrame.GetYFromData(item.Value2);\\r\\n\\r\\n            lineData.push({X:x, Y:y,Y2:y2});\\r\\n        }\\r\\n\\r\\n        if (lineData.length>0) data.push(lineData);\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function(lineData)\\r\\n    {\\r\\n        if (lineData.length<=0) return;\\r\\n        this.Canvas.beginPath();\\r\\n\\r\\n        var drawCount=0;\\r\\n        var firstItem=lineData[0];\\r\\n        if (this.IsHScreen) this.Canvas.moveTo(firstItem.Y,firstItem.X);\\r\\n        else this.Canvas.moveTo(firstItem.X,firstItem.Y);\\r\\n        for(var i=1;i<lineData.length;++i)\\r\\n        {\\r\\n            var item=lineData[i];\\r\\n            if (this.IsHScreen) this.Canvas.lineTo(item.Y,item.X);\\r\\n            else this.Canvas.lineTo(item.X,item.Y);\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        for(var i=lineData.length-1;i>=0;--i)\\r\\n        {\\r\\n            var item=lineData[i];\\r\\n            if (this.IsHScreen) this.Canvas.lineTo(item.Y2,item.X);\\r\\n            else this.Canvas.lineTo(item.X,item.Y2);\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fillStyle = this.AreaColor;\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(lineData)\\r\\n    {\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        for(var k=0;k<2;++k)\\r\\n        {\\r\\n            var bFirstPoint=true;\\r\\n            var drawCount=0;\\r\\n            for(var i=0;i<lineData.length;++i)\\r\\n            {\\r\\n                var item=lineData[i];\\r\\n\\r\\n                if (bFirstPoint)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (this.IsHScreen) this.Canvas.moveTo(k===0?item.Y:item.Y2,item.X);\\r\\n                    else this.Canvas.moveTo(item.X, k===0?item.Y:item.Y2 );\\r\\n                    bFirstPoint=false;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsHScreen) this.Canvas.lineTo(k===0?item.Y:item.Y2,item.X);\\r\\n                    else this.Canvas.lineTo(item.X,k===0?item.Y:item.Y2);\\r\\n                }\\r\\n\\r\\n                ++drawCount;\\r\\n            }\\r\\n            if (drawCount>0) this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsMinSize) return;\\r\\n\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        this.PointCount=this.ChartFrame.XPointCount;\\r\\n        this.DataWidth=this.ChartFrame.DataWidth;\\r\\n        this.DistanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        if (this.IsHScreen) this.ChartRight=this.ChartBorder.GetBottom();\\r\\n        else this.ChartRight=this.ChartBorder.GetRight();\\r\\n\\r\\n        var drawData=this.CalculateData();\\r\\n        if (!drawData || drawData.length<=0) return;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.lineWidth=this.LineWidth*GetDevicePixelRatio();\\r\\n        this.Canvas.setLineDash(this.LineDotted);   //虚线\\r\\n        for(var i=0;i<drawData.length;++i)\\r\\n        {\\r\\n            var lineData=drawData[i];\\r\\n            this.DrawArea(lineData);\\r\\n            this.DrawLine(lineData);\\r\\n        }\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var range={Min:null, Max:null};\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null || value.Value==null || value.Value2 == null) continue;\\r\\n            var maxData = value.Value>value.Value2?value.Value:value.Value2;\\r\\n            var minData = value.Value<value.Value2?value.Value:value.Value2;\\r\\n            if (range.Max==null)\\r\\n                range.Max = maxData;\\r\\n            else if (range.Max < maxData)\\r\\n                range.Max = maxData;\\r\\n\\r\\n            if (range.Min==null)\\r\\n                range.Min = minData;\\r\\n            else if (range.Min > minData)\\r\\n                range.Min = minData;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//填充背景 支持横屏\\r\\nfunction ChartBackground()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartBackground\\\";\\r\\n    this.Color=null;\\r\\n    this.ColorAngle=0;  //0 竖向 1 横向\\r\\n    this.IsDrawFirst = true;    //面积图在K线前面画,否则回挡住K线的\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Color) return;\\r\\n        if (this.Color.length<=0) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n\\r\\n        if (this.Color.length==2)\\r\\n        {\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                if (this.ColorAngle==0)\\r\\n                {\\r\\n                    var ptStart={ X:this.ChartBorder.GetRight(), Y:this.ChartBorder.GetTopEx() };\\r\\n                    var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };\\r\\n                    var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetBottomEx() };\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.ColorAngle==0)\\r\\n                {\\r\\n                    var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };\\r\\n                    var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetBottomEx() };\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };\\r\\n                    var ptEnd={ X:this.ChartBorder.GetRight(), Y:this.ChartBorder.GetTopEx() };\\r\\n                }\\r\\n            }\\r\\n\\r\\n            let gradient = this.Canvas.createLinearGradient(ptStart.X,ptStart.Y, ptEnd.X,ptEnd.Y);\\r\\n            gradient.addColorStop(0, this.Color[0]);\\r\\n            gradient.addColorStop(1, this.Color[1]);\\r\\n            this.Canvas.fillStyle=gradient;\\r\\n        }\\r\\n        else if (this.Color.length==1)\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.Color[0];\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.Name==\\\"DRAWGBK2\\\" || this.Name==\\\"KLINE_BG\\\")\\r\\n        {\\r\\n            this.DrawRegion();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeftEx();\\r\\n            var top=this.ChartBorder.GetTop();\\r\\n            var width=this.ChartBorder.GetWidthEx();\\r\\n            var height=this.ChartBorder.GetHeight();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeft();\\r\\n            var top=this.ChartBorder.GetTopEx();\\r\\n            var width=this.ChartBorder.GetWidth();\\r\\n            var height=this.ChartBorder.GetHeightEx();\\r\\n        }\\r\\n        this.Canvas.fillRect(left, top,width, height);\\r\\n    }\\r\\n\\r\\n    this.DrawRegion=function()\\r\\n    {\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            top=this.ChartBorder.GetRightEx();\\r\\n            bottom=this.ChartBorder.GetLeftEx();\\r\\n        }\\r\\n\\r\\n        var aryPoint=[];    //点坐标\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            aryPoint[i]=null;\\r\\n            if (!IFrameSplitOperator.IsNumber(value) || value<=0) continue;\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            var y=this.ChartFrame.GetYFromData(value.Value);\\r\\n\\r\\n            if (this.IsHScreen)\\r\\n                aryPoint[i]={ Line:{ X:bottom, Y:x }, Line2:{ X:top, Y:x } };\\r\\n            else\\r\\n                aryPoint[i]={ Line:{ X:x, Y:top }, Line2:{ X:x, Y:bottom } };\\r\\n        }\\r\\n\\r\\n        this.DrawBG(aryPoint);\\r\\n    }\\r\\n\\r\\n    this.DrawBG=function(aryPoint)\\r\\n    {\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var halfWidth=(distanceWidth+dataWidth)/2;\\r\\n        var firstPoint=true;\\r\\n        var pointCount=0;\\r\\n        var aryLine2=[];\\r\\n        var color=null;\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (!item || (color && item.Color!=color) )\\r\\n            {\\r\\n                if (pointCount>0)\\r\\n                {\\r\\n                    for(var j=aryLine2.length-1; j>=0; --j)\\r\\n                    {\\r\\n                        var item2=aryLine2[j];\\r\\n                        if (this.IsHScreen)\\r\\n                        {\\r\\n                            this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y+halfWidth);\\r\\n                            this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y-halfWidth);\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.Canvas.lineTo(item2.Line2.X+halfWidth, item2.Line2.Y);\\r\\n                            this.Canvas.lineTo(item2.Line2.X-halfWidth, item2.Line2.Y);\\r\\n                        }\\r\\n                    }\\r\\n                    this.Canvas.closePath();\\r\\n                    this.Canvas.fill();\\r\\n                }\\r\\n\\r\\n                firstPoint=true;\\r\\n                pointCount=0;\\r\\n                aryLine2=[];\\r\\n                color=null;\\r\\n            }\\r\\n\\r\\n            if (!item) continue;\\r\\n\\r\\n            if (firstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(item.Line.X, item.Line.Y-halfWidth);\\r\\n                    this.Canvas.lineTo(item.Line.X, item.Line.Y+halfWidth);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(item.Line.X-halfWidth, item.Line.Y);\\r\\n                    this.Canvas.lineTo(item.Line.X+halfWidth, item.Line.Y);\\r\\n                }\\r\\n                firstPoint=false;\\r\\n                color=item.Color;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    this.Canvas.lineTo(item.Line.X, item.Line.Y-halfWidth);\\r\\n                    this.Canvas.lineTo(item.Line.X, item.Line.Y+halfWidth);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(item.Line.X-halfWidth, item.Line.Y);\\r\\n                    this.Canvas.lineTo(item.Line.X+halfWidth, item.Line.Y);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            aryLine2.push(item);\\r\\n            ++pointCount;\\r\\n        }\\r\\n\\r\\n        if (pointCount>0)\\r\\n        {\\r\\n            for(var j=aryLine2.length-1; j>=0; --j)\\r\\n            {\\r\\n                var item2=aryLine2[j];\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y+halfWidth);\\r\\n                    this.Canvas.lineTo(item2.Line2.X, item2.Line2.Y-halfWidth);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(item2.Line2.X+halfWidth, item2.Line2.Y);\\r\\n                    this.Canvas.lineTo(item2.Line2.X-halfWidth, item2.Line2.Y);\\r\\n                }\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        return { Min:null, Max:null };\\r\\n    }\\r\\n}\\r\\n\\r\\n//画矩形\\r\\nfunction ChartRectangle()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartRectangle\\\";\\r\\n\\r\\n    this.Color=[];\\r\\n    this.Rect;\\r\\n    this.BorderColor=g_JSChartResource.FrameBorderPen;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Color || !this.Rect) return;\\r\\n        if (this.Color.length<=0) return;\\r\\n\\r\\n        this.Canvas.strokeStyle=this.BorderColor;\\r\\n        var bFill=false;\\r\\n        if (this.Color.length==2)\\r\\n        {\\r\\n            /*  TODO 渐变下次做吧\\r\\n            if (this.ColorAngle==0)\\r\\n            {\\r\\n                var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };\\r\\n                var ptEnd={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetBottomEx() };\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var ptStart={ X:this.ChartBorder.GetLeft(), Y:this.ChartBorder.GetTopEx() };\\r\\n                var ptEnd={ X:this.ChartBorder.GetRight(), Y:this.ChartBorder.GetTopEx() };\\r\\n            }\\r\\n\\r\\n            let gradient = this.Canvas.createLinearGradient(ptStart.X,ptStart.Y, ptEnd.X,ptEnd.Y);\\r\\n            gradient.addColorStop(0, this.Color[0]);\\r\\n            gradient.addColorStop(1, this.Color[1]);\\r\\n            this.Canvas.fillStyle=gradient;\\r\\n            */\\r\\n\\r\\n            this.Canvas.fillStyle=this.Color[0];\\r\\n            bFill=true;\\r\\n        }\\r\\n        else if (this.Color.length==1)\\r\\n        {\\r\\n            if (this.Color[0])\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.Color[0];\\r\\n                bFill=true;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var chartWidth=this.ChartBorder.GetWidth();\\r\\n        var chartHeight=this.ChartBorder.GetHeightEx();\\r\\n        var left=this.Rect.Left/1000*chartWidth;\\r\\n        var top=this.Rect.Top/1000*chartHeight;\\r\\n        var right=this.Rect.Right/1000*chartWidth;\\r\\n        var bottom=this.Rect.Bottom/1000*chartHeight;\\r\\n\\r\\n        left=this.ChartBorder.GetLeft()+left\\r\\n        top=this.ChartBorder.GetTopEx()+top;\\r\\n        right=this.ChartBorder.GetLeft()+right;\\r\\n        bottom=this.ChartBorder.GetTopEx()+bottom;\\r\\n        var width=Math.abs(left-right);\\r\\n        var height=Math.abs(top-bottom);\\r\\n        if (bFill) this.Canvas.fillRect(left, top,width, height);\\r\\n        this.Canvas.rect(ToFixedPoint(left), ToFixedPoint(top),ToFixedRect(width), ToFixedRect(height));\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n}\\r\\n\\r\\n// 文字+线段输出\\r\\nfunction ChartTextLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartTextLine\\\";\\r\\n\\r\\n    this.Text;  //Text=内容 Color\\r\\n    this.Line;  //Type=线段类型 0=不画 1=直线 2=虚线, Color\\r\\n    this.Price;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Text || !this.Line || !IFrameSplitOperator.IsNumber(this.Price)) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var y=this.ChartFrame.GetYFromData(this.Price);\\r\\n        var textWidth=0;\\r\\n        if (this.Text.Title)\\r\\n        {\\r\\n            var x=left+2*GetDevicePixelRatio();\\r\\n            var yText=y;\\r\\n            this.Canvas.textAlign = 'left';\\r\\n            this.Canvas.textBaseline = 'middle';\\r\\n            var offsetY=8*GetDevicePixelRatio();\\r\\n            if (y-offsetY<top)\\r\\n            {\\r\\n                this.Canvas.textBaseline='top';\\r\\n                yText=top;\\r\\n            }\\r\\n            else if (y+offsetY>bottom)\\r\\n            {\\r\\n                this.Canvas.textBaseline='bottom';\\r\\n                yText=bottom;\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle = this.Text.Color;\\r\\n            this.Canvas.font = this.Text.Font;\\r\\n            this.Canvas.fillText(this.Text.Title, x, yText);\\r\\n            textWidth=this.Canvas.measureText(this.Text.Title).width+4*GetDevicePixelRatio();\\r\\n        }\\r\\n\\r\\n        if (this.Line.Type>0)\\r\\n        {\\r\\n            if (this.Line.Type==2)  //虚线\\r\\n            {\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.setLineDash([3,5]);   //虚线\\r\\n            }\\r\\n\\r\\n            var x=left+textWidth;\\r\\n            this.Canvas.strokeStyle=this.Line.Color;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(x,ToFixedPoint(y));\\r\\n            this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            if (this.Line.Type==2)\\r\\n            {\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={Min:null, Max:null};\\r\\n        if (IFrameSplitOperator.IsNumber(this.Price))\\r\\n        {\\r\\n            range.Min=this.Price;\\r\\n            range.Max=this.Price;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 柱子集合  支持横屏\\r\\nfunction ChartMultiBar()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMultiBar\\\";\\r\\n    this.Bars=[];   // [ {Point:[ {Index, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Data || this.Data.length<=0) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var offset=this.Data.DataOffset;\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n\\r\\n        var drawBars=[];\\r\\n        for(var i in this.Bars)\\r\\n        {\\r\\n            var item=this.Bars[i];\\r\\n            var drawPoints={ Point:[], Color:item.Color, Width:dataWidth, Type:0 };\\r\\n            if (item.Type>0) drawPoints.Type=item.Type;\\r\\n            if (item.Width>0)\\r\\n            {\\r\\n                drawPoints.Width=item.Width*pixelRatio;\\r\\n                if (drawPoints.Width>dataWidth) drawPoints.Width=dataWidth;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if(drawPoints.Width<4) drawPoints.Width=1*pixelRatio;\\r\\n            }\\r\\n\\r\\n            for(var j in item.Point)\\r\\n            {\\r\\n                var point=item.Point[j];\\r\\n                if (!IFrameSplitOperator.IsNumber(point.Index)) continue;\\r\\n\\r\\n                var index=point.Index-offset;\\r\\n                if (index>=0 && index<xPointCount)\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetXFromIndex(index);\\r\\n                    var y=this.ChartFrame.GetYFromData(point.Value);\\r\\n                    var y2=this.ChartFrame.GetYFromData(point.Value2);\\r\\n                    drawPoints.Point.push({X:x, Y:y, Y2:y2});\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (drawPoints.Point.length>0) drawBars.push(drawPoints)\\r\\n        }\\r\\n\\r\\n        for(var i in drawBars)\\r\\n        {\\r\\n            var item=drawBars[i];\\r\\n            if (item.Width>=4)\\r\\n            {\\r\\n                if (item.Type==1) this.DrawHollowBar(item);\\r\\n                else this.DrawFillBar(item);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.DrawLineBar(item);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawLineBar=function(bar)\\r\\n    {\\r\\n        this.Canvas.strokeStyle=bar.Color;\\r\\n        var backupLineWidth=this.Canvas.lineWidth;\\r\\n        this.Canvas.lineWidth=bar.Width;\\r\\n        for(var i in bar.Point)\\r\\n        {\\r\\n            var item=bar.Point[i];\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));\\r\\n                this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));\\r\\n                this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n        this.Canvas.lineWidth=backupLineWidth;\\r\\n    }\\r\\n\\r\\n    this.DrawFillBar=function(bar)\\r\\n    {\\r\\n        this.Canvas.fillStyle=bar.Color;\\r\\n        for(var i in bar.Point)\\r\\n        {\\r\\n            var item=bar.Point[i];\\r\\n            var x=item.X-(bar.Width/2);\\r\\n            var y=Math.min(item.Y,item.Y2);\\r\\n            var barWidth=bar.Width;\\r\\n            var barHeight=Math.abs(item.Y-item.Y2);\\r\\n            if (this.IsHScreen)\\r\\n                this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth));\\r\\n            else\\r\\n                this.Canvas.fillRect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight));\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawHollowBar=function(bar)    //空心柱子\\r\\n    {\\r\\n        this.Canvas.strokeStyle=bar.Color;\\r\\n        var backupLineWidth=1;\\r\\n        for(var i in bar.Point)\\r\\n        {\\r\\n            var item=bar.Point[i];\\r\\n            var x=item.X-(bar.Width/2);\\r\\n            var y=Math.min(item.Y,item.Y2);\\r\\n            var barWidth=bar.Width;\\r\\n            var barHeight=Math.abs(item.Y-item.Y2);\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.IsHScreen)\\r\\n                this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedRect(barHeight),ToFixedRect(barWidth));\\r\\n            else\\r\\n                this.Canvas.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(barWidth),ToFixedRect(barHeight));\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n\\r\\n        this.Canvas.lineWidth=backupLineWidth;\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={ Min:null, Max:null };\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var start=this.Data.DataOffset;\\r\\n        var end=start+xPointCount;\\r\\n        for(var i in this.Bars)\\r\\n        {\\r\\n            var item=this.Bars[i];\\r\\n            for(var j in item.Point)\\r\\n            {\\r\\n                var point=item.Point[j];\\r\\n                if (point.Index>=start && point.Index<end)\\r\\n                {\\r\\n                    var minValue=Math.min(point.Value,point.Value2);\\r\\n                    var maxValue=Math.max(point.Value,point.Value2);\\r\\n                    if (range.Max==null) range.Max=maxValue;\\r\\n                    else if (range.Max<maxValue) range.Max=maxValue;\\r\\n                    if (range.Min==null) range.Min=minValue;\\r\\n                    else if (range.Min>minValue) range.Min=minValue;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 线段集合 支持横屏\\r\\nfunction ChartMultiLine()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMultiLine\\\";\\r\\n    this.Lines=[];   // [ {Point:[ {Index, Value }, ], Color:  }, ]\\r\\n    this.LineDash;\\r\\n    this.LineWidth=1;\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    //箭头配置\\r\\n    this.ArrawAngle=35;     //三角斜边一直线夹角\\r\\n    this.ArrawLength=10;    //三角斜边长度\\r\\n    this.ArrawLineWidth=5;  //箭头粗细\\r\\n    this.Arrow={ Start:false, End:false };  //Start=是否绘制开始箭头 <-   End=是否绘制结束箭头 ->\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Data || this.Data.length<=0) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var offset=this.Data.DataOffset;\\r\\n\\r\\n        var drawLines=[];\\r\\n        var arrowLines=[];\\r\\n        for(var i in this.Lines)\\r\\n        {\\r\\n            var line=this.Lines[i];\\r\\n            var drawPoints={ Point:[], Color:line.Color };\\r\\n            var drawArrowPoints={ Start:[], End:[] };\\r\\n            if (line.BGColor) drawPoints.BGColor=line.BGColor;\\r\\n            for(var j in line.Point)\\r\\n            {\\r\\n                var point=line.Point[j];\\r\\n                if (!IFrameSplitOperator.IsNumber(point.Index)) continue;\\r\\n\\r\\n                var index=point.Index-offset;\\r\\n                if (index>=0 && index<xPointCount)\\r\\n                {\\r\\n                    var x=this.ChartFrame.GetXFromIndex(index);\\r\\n                    var y=this.ChartFrame.GetYFromData(point.Value);\\r\\n                    var pointItem={X:x, Y:y, End:false};\\r\\n                    drawPoints.Point.push(pointItem);\\r\\n\\r\\n                    if (j==0 || j==1) drawArrowPoints.Start.push(pointItem);    //起始点\\r\\n                    if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem);  //结束点\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true;  //点断开\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (drawPoints.Point.length>=2)\\r\\n            {\\r\\n                drawLines.push(drawPoints);\\r\\n                arrowLines.push(drawArrowPoints);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        this.Canvas.save();\\r\\n        for(var i in drawLines)\\r\\n        {\\r\\n            if (this.LineDash) this.Canvas.setLineDash(this.LineDash);\\r\\n            if (IFrameSplitOperator.IsPlusNumber(this.LineWidth)) this.Canvas.lineWidth=this.LineWidth*pixelRatio;\\r\\n            else this.Canvas.lineWidth=1*pixelRatio;\\r\\n            var item=drawLines[i];\\r\\n            this.DrawLine(item, arrowLines[i]);\\r\\n        }\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(line, arrow)\\r\\n    {\\r\\n        if (line.BGColor)   //背景色\\r\\n        {\\r\\n            this.Canvas.fillStyle=line.BGColor;\\r\\n            for(var i in line.Point)\\r\\n            {\\r\\n                var item=line.Point[i];\\r\\n                if (i==0)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (this.IsHScreen) this.Canvas.moveTo(item.Y,item.X);\\r\\n                    else this.Canvas.moveTo(item.X,item.Y);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsHScreen) this.Canvas.lineTo(item.Y,item.X);\\r\\n                    else this.Canvas.lineTo(item.X,item.Y);\\r\\n                }\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n\\r\\n        this.Canvas.strokeStyle=line.Color;\\r\\n        var drawCount=0;\\r\\n        for(var i in line.Point)\\r\\n        {\\r\\n            var item=line.Point[i];\\r\\n            if (drawCount==0)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (this.IsHScreen) this.Canvas.moveTo(item.Y,item.X);\\r\\n                else this.Canvas.moveTo(item.X,item.Y);\\r\\n                ++drawCount;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.IsHScreen) this.Canvas.lineTo(item.Y,item.X);\\r\\n                else this.Canvas.lineTo(item.X,item.Y);\\r\\n                ++drawCount;\\r\\n            }\\r\\n\\r\\n            if (item.End==true) //点断了 要重新画\\r\\n            {\\r\\n                if (drawCount>0) this.Canvas.stroke();\\r\\n                drawCount=0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n\\r\\n        //绘制箭头\\r\\n        if (arrow.End.length==2 && this.Arrow.End==true)\\r\\n            this.DrawArrow(arrow.End[0],arrow.End[1]);\\r\\n\\r\\n        if (arrow.Start.length==2 && this.Arrow.Start==true)\\r\\n            this.DrawArrow(arrow.Start[1],arrow.Start[0]);\\r\\n\\r\\n    }\\r\\n\\r\\n    this.DrawArrow=function(ptStart,ptEnd)\\r\\n    {\\r\\n        //计算箭头\\r\\n        var theta=this.ArrawAngle;       //三角斜边一直线夹角\\r\\n        var headlen=this.ArrawLength;    //三角斜边长度\\r\\n        var angle = Math.atan2(ptStart.Y - ptEnd.Y, ptStart.X - ptEnd.X) * 180 / Math.PI,\\r\\n            angle1 = (angle + theta) * Math.PI / 180,\\r\\n            angle2 = (angle - theta) * Math.PI / 180,\\r\\n            topX = headlen * Math.cos(angle1),\\r\\n            topY = headlen * Math.sin(angle1),\\r\\n            botX = headlen * Math.cos(angle2),\\r\\n            botY = headlen * Math.sin(angle2);\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        var arrowX = ptEnd.X + topX;\\r\\n        var arrowY = ptEnd.Y + topY;\\r\\n        this.Canvas.moveTo(arrowX,arrowY);\\r\\n\\r\\n        this.Canvas.lineTo(ptEnd.X, ptEnd.Y);\\r\\n\\r\\n        arrowX = ptEnd.X + botX;\\r\\n        arrowY = ptEnd.Y + botY;\\r\\n        this.Canvas.lineTo(arrowX,arrowY);\\r\\n\\r\\n        this.Canvas.setLineDash([]);\\r\\n        this.Canvas.lineWidth=this.ArrawLineWidth*GetDevicePixelRatio();\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={ Min:null, Max:null };\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var start=this.Data.DataOffset;\\r\\n        var end=start+xPointCount;\\r\\n\\r\\n        for(var i in this.Lines)\\r\\n        {\\r\\n            var line=this.Lines[i];\\r\\n            for(var j in line.Point)\\r\\n            {\\r\\n                var point=line.Point[j];\\r\\n                if (point.Index>=start && point.Index<end)\\r\\n                {\\r\\n                    if (range.Max==null) range.Max=point.Value;\\r\\n                    else if (range.Max<point.Value) range.Max=point.Value;\\r\\n                    if (range.Min==null) range.Min=point.Value;\\r\\n                    else if (range.Min>point.Value) range.Min=point.Value;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 多文本集合 支持横屏\\r\\nfunction ChartMultiText()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMultiText\\\";\\r\\n    this.Texts=[];  //[ {Index:, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:\\\"H/L\\\", Offset:[5,10], Width:线粗细 }} ]\\r\\n    this.Font=g_JSChartResource.DefaultTextFont;\\r\\n    this.Color=g_JSChartResource.DefaultTextColor;\\r\\n    this.IsHScreen=false;   //是否横屏\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Data || this.Data.length<=0) return;\\r\\n        if (!this.Texts) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var offset=this.Data.DataOffset;\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            left=this.ChartBorder.GetTop();\\r\\n            right=this.ChartBorder.GetBottom();\\r\\n        }\\r\\n\\r\\n        for(var i in this.Texts)\\r\\n        {\\r\\n            var item=this.Texts[i];\\r\\n\\r\\n            if (!item.Text) continue;\\r\\n            if (!IFrameSplitOperator.IsNumber(item.Index)) continue;\\r\\n\\r\\n            var index=item.Index-offset;\\r\\n            if (index>=0 && index<xPointCount)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(index);\\r\\n                var y=this.ChartFrame.GetYFromData(item.Value);\\r\\n\\r\\n                if (item.Color)  this.Canvas.fillStyle = item.Color;\\r\\n                else this.Canvas.fillStyle = this.Color;\\r\\n                if (item.Font) this.Canvas.font = item.Font;\\r\\n                else this.Canvas.font=this.Font;\\r\\n\\r\\n                var textWidth=this.Canvas.measureText(item.Text).width;\\r\\n                this.Canvas.textAlign='center';\\r\\n                if (x+textWidth/2>=right)\\r\\n                {\\r\\n                    this.Canvas.textAlign='right';\\r\\n                    x=right;\\r\\n                }\\r\\n                else if (x-textWidth/2<left)\\r\\n                {\\r\\n                    this.Canvas.textAlign = 'left';\\r\\n                    x=left;\\r\\n                }\\r\\n                if (item.Baseline==1) this.Canvas.textBaseline='top';\\r\\n                else if (item.Baseline==2) this.Canvas.textBaseline='bottom';\\r\\n                else this.Canvas.textBaseline = 'middle';\\r\\n\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.translate(y, x);\\r\\n                    this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                    this.Canvas.fillText(item.Text,0,0);\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillText(item.Text, x, y);\\r\\n                }\\r\\n\\r\\n                if (item.Line)\\r\\n                {\\r\\n                    var kItem=this.Data.Data[item.Index];\\r\\n                    var price=item.Line.KData==\\\"H\\\"? kItem.High:kItem.Low;\\r\\n                    var yPrice=this.ChartFrame.GetYFromData(price);\\r\\n                    var yText=y;\\r\\n                    if (Array.isArray(item.Line.Offset) && item.Line.Offset.length==2)\\r\\n                    {\\r\\n                        if (yText>yPrice) //文字在下方\\r\\n                        {\\r\\n                            yText-=item.Line.Offset[1];\\r\\n                            yPrice+=item.Line.Offset[0]\\r\\n                        }\\r\\n                        else if (yText<yPrice)\\r\\n                        {\\r\\n                            yText+=item.Line.Offset[1];\\r\\n                            yPrice-=item.Line.Offset[0]\\r\\n                        }\\r\\n                    }\\r\\n                    this.Canvas.save();\\r\\n                    if (item.Line.Dash) this.Canvas.setLineDash(item.Line.Dash);    //虚线\\r\\n                    if (item.Line.Width>0) this.Canvas.lineWidth=item.Line.Width;   //线宽\\r\\n                    this.Canvas.strokeStyle = item.Line.Color;\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (this.IsHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(yText, ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(yPrice,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),yText);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),yPrice);\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={ Min:null, Max:null };\\r\\n        if (!this.Texts) return range;\\r\\n\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var start=this.Data.DataOffset;\\r\\n        var end=start+xPointCount;\\r\\n\\r\\n        for(var i in this.Texts)\\r\\n        {\\r\\n            var item=this.Texts[i];\\r\\n            if (item.Index>=start && item.Index<end)\\r\\n            {\\r\\n                if (range.Max==null) range.Max=item.Value;\\r\\n                else if (range.Max<item.Value) range.Max=item.Value;\\r\\n                if (range.Min==null) range.Min=item.Value;\\r\\n                else if (range.Min>item.Value) range.Min=item.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 图标集合 支持横屏\\r\\nfunction ChartMultiSVGIcon()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMultiSVGIcon\\\";\\r\\n    this.Icon;  //[ {Index:, Value:, Symbol:, Color:, Baseline:, Line:{ Color:, Dash:[虚线点], KData:\\\"H/L\\\", Offset:[5,10], Width:线粗细 } } ]\\r\\n    this.IconSize={ Max: g_JSChartResource.DRAWICON.Icon.MaxSize, Min:g_JSChartResource.DRAWICON.Icon.MinSize ,    //图标的最大最小值\\r\\n        Zoom:{ Type:g_JSChartResource.DRAWICON.Icon.Zoom.Type , Value:g_JSChartResource.DRAWICON.Icon.Zoom.Value } //放大倍数\\r\\n    };\\r\\n    this.Family;\\r\\n    this.Color=g_JSChartResource.DefaultTextColor;\\r\\n    this.IsHScreen=false;\\r\\n    this.IconRect=[];   //0=序号,1=区域\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.IconRect=[];\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Data || this.Data.length<=0) return;\\r\\n        if (!this.Family || !this.Icon) return;\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(this.Icon)) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var offset=this.Data.DataOffset;\\r\\n        this.DataWidth=this.ChartFrame.DataWidth;\\r\\n        this.DistanceWidth=this.ChartFrame.DistanceWidth;\\r\\n\\r\\n        var border=this.GetBorder();\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var left=border.TopEx;\\r\\n            var right=border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=border.LeftEx;\\r\\n            var right=border.RightEx;\\r\\n        }\\r\\n\\r\\n        var fontSize=this.GetDynamicIconSize(this.DataWidth,this.DistanceWidth,this.IconSize.Max,this.IconSize.Min,this.IconSize.Zoom);\\r\\n        this.Canvas.font=fontSize+'px '+this.Family;\\r\\n\\r\\n        for(var i=0; i<this.Icon.length; ++i)\\r\\n        {\\r\\n            var item=this.Icon[i];\\r\\n            if (!IFrameSplitOperator.IsNumber(item.Index)) continue;\\r\\n\\r\\n            var index=item.Index-offset;\\r\\n            if (index>=0 && index<xPointCount)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(index);\\r\\n                var y=this.ChartFrame.GetYFromData(item.Value);\\r\\n\\r\\n                if (item.Color)  this.Canvas.fillStyle = item.Color;\\r\\n                else this.Canvas.fillStyle = this.Color;\\r\\n\\r\\n                var textWidth=this.Canvas.measureText(item.Text).width;\\r\\n                this.Canvas.textAlign='center';\\r\\n                var rtIcon=new Rect(x-fontSize/2,y-fontSize/2,fontSize,fontSize);\\r\\n                if (x+textWidth/2>=right)\\r\\n                {\\r\\n                    this.Canvas.textAlign='right';\\r\\n                    x+=this.DataWidth/2;\\r\\n                    rtIcon.X=x-fontSize;\\r\\n                }\\r\\n                else if (x-textWidth/2<left)\\r\\n                {\\r\\n                    this.Canvas.textAlign = 'left';\\r\\n                    x-=this.DataWidth/2;\\r\\n                    rtIcon.X=x;\\r\\n                }\\r\\n\\r\\n                if (item.Baseline==1)\\r\\n                {\\r\\n                    this.Canvas.textBaseline='top';\\r\\n                    rtIcon.Y=y;\\r\\n                }\\r\\n                else if (item.Baseline==2)\\r\\n                {\\r\\n                    this.Canvas.textBaseline='bottom';\\r\\n                    rtIcon.Y=y-fontSize;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.textBaseline = 'middle';\\r\\n                    rtIcon.Y=y-fontSize/2;\\r\\n                }\\r\\n\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    this.Canvas.save();\\r\\n                    this.Canvas.translate(y, x);\\r\\n                    this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                    this.Canvas.fillText(item.Symbol,0,0);\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillText(item.Symbol, x, y);\\r\\n                    if (item.Text) this.IconRect.push({ Index:i, Rect:rtIcon , Item:item });\\r\\n                }\\r\\n\\r\\n                if (item.Line)\\r\\n                {\\r\\n                    var kItem=this.Data.Data[item.Index];\\r\\n                    var price=item.Line.KData==\\\"H\\\"? kItem.High:kItem.Low;\\r\\n                    var yPrice=this.ChartFrame.GetYFromData(price);\\r\\n                    var yText=y;\\r\\n                    if (Array.isArray(item.Line.Offset) && item.Line.Offset.length==2)\\r\\n                    {\\r\\n                        if (yText>yPrice) //文字在下方\\r\\n                        {\\r\\n                            yText-=item.Line.Offset[1];\\r\\n                            yPrice+=item.Line.Offset[0]\\r\\n                        }\\r\\n                        else if (yText<yPrice)\\r\\n                        {\\r\\n                            yText+=item.Line.Offset[1];\\r\\n                            yPrice-=item.Line.Offset[0]\\r\\n                        }\\r\\n                    }\\r\\n                    this.Canvas.save();\\r\\n                    if (item.Line.Dash) this.Canvas.setLineDash(item.Line.Dash);    //虚线\\r\\n                    if (item.Line.Width>0) this.Canvas.lineWidth=item.Line.Width;   //线宽\\r\\n                    this.Canvas.strokeStyle = item.Line.Color;\\r\\n                    this.Canvas.beginPath();\\r\\n                    if (this.IsHScreen)\\r\\n                    {\\r\\n                        this.Canvas.moveTo(yText, ToFixedPoint(x));\\r\\n                        this.Canvas.lineTo(yPrice,ToFixedPoint(x));\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),yText);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),yPrice);\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.stroke();\\r\\n                    this.Canvas.restore();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(this.IconRect)) return false;\\r\\n        for(var i=0; i<this.IconRect.length; ++i)\\r\\n        {\\r\\n            var item=this.IconRect[i];\\r\\n            if (!item.Rect) continue;\\r\\n            var rect=item.Rect;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                JSConsole.Chart.Log('[ChartMultiSVGIcon::GetTooltipData] icon ', item);\\r\\n                tooltip.Data=item;\\r\\n                tooltip.ChartPaint=this;\\r\\n                tooltip.Type=4; //指标\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={ Min:null, Max:null };\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var start=this.Data.DataOffset;\\r\\n        var end=start+xPointCount;\\r\\n\\r\\n        for(var i in this.Icon)\\r\\n        {\\r\\n            var item=this.Icon[i];\\r\\n            if (item.Index>=start && item.Index<end)\\r\\n            {\\r\\n                if (range.Max==null) range.Max=item.Value;\\r\\n                else if (range.Max<item.Value) range.Max=item.Value;\\r\\n                if (range.Min==null) range.Min=item.Value;\\r\\n                else if (range.Min>item.Value) range.Min=item.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n// 多dom节点\\r\\nfunction ChartMultiHtmlDom()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartMultiHtmlDom\\\";\\r\\n    this.Texts=[];  //[ {Index:, Value:, Text: ] Text=dom内容\\r\\n    this.IsHScreen=false;   //是否横屏\\r\\n    this.DrawCallback;  //function(op, obj)  op:1=开始 2=结束 3=绘制单个数据\\r\\n    this.DrawItem=[];\\r\\n    this.EnableDraw=true;   //是否允许绘制\\r\\n    this.HQChart;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.EnableDraw) return;\\r\\n\\r\\n        this.DrawItem=[];\\r\\n        if (this.DrawCallback) this.DrawCallback(1, {Self:this} );\\r\\n\\r\\n        this.DrawDom();\\r\\n\\r\\n        if (this.DrawCallback) this.DrawCallback(2, { Self:this, DrawItem:this.DrawItem } );\\r\\n    }\\r\\n\\r\\n    this.DrawDom=function()\\r\\n    {\\r\\n        if (!this.IsShow || this.ChartFrame.IsMinSize) return;\\r\\n        if (!this.Data || this.Data.length<=0) return;\\r\\n\\r\\n        this.IsHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var offset=this.Data.DataOffset;\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        if (this.HQChart)\\r\\n        {\\r\\n            var elementLeft=this.HQChart.UIElement.getBoundingClientRect().left;\\r\\n            var elementTop=this.HQChart.UIElement.getBoundingClientRect().top;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var elementLeft=null,elementTop=null;\\r\\n        }\\r\\n\\r\\n\\r\\n        for(var i in this.Texts)\\r\\n        {\\r\\n            var item=this.Texts[i];\\r\\n\\r\\n            if (!item.Text) continue;\\r\\n            if (!IFrameSplitOperator.IsNumber(item.Index)) continue;\\r\\n\\r\\n            var isMinuteFrame=this.IsMinuteFrame();\\r\\n\\r\\n            var index=item.Index-offset;\\r\\n            var kItem=this.Data.Data[item.Index];   //K线数据\\r\\n            var obj={ KData:kItem, Item:item, IsShow:false, Self:this };\\r\\n            if (index>=0 && index<xPointCount)\\r\\n            {\\r\\n                var x=this.ChartFrame.GetXFromIndex(index);\\r\\n                if (item.Value==\\\"Top\\\")\\r\\n                {\\r\\n                    var y=top;\\r\\n                }\\r\\n                else if (item.Value==\\\"Bottom\\\")\\r\\n                {\\r\\n                    var y=bottom;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var y=this.ChartFrame.GetYFromData(item.Value);\\r\\n                }\\r\\n\\r\\n                obj.X=x/pixelTatio;\\r\\n                obj.Y=y/pixelTatio;\\r\\n                obj.UIElement={Left:elementLeft, Top:elementTop};\\r\\n                obj.IsShow=true;\\r\\n            }\\r\\n\\r\\n            this.DrawItem.push(obj);\\r\\n            if (this.DrawCallback) this.DrawCallback(3, obj);\\r\\n\\r\\n            if (item.Line)\\r\\n            {\\r\\n                if (isMinuteFrame)\\r\\n                {\\r\\n                    var price=this.Data.Data[item.Index];\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var kItem=this.Data.Data[item.Index];\\r\\n                    var price=item.Line.KData==\\\"H\\\"? kItem.High:kItem.Low;\\r\\n                }\\r\\n\\r\\n                var yPrice=this.ChartFrame.GetYFromData(price);\\r\\n                var yText=y;\\r\\n                if (Array.isArray(item.Line.Offset) && item.Line.Offset.length==2)\\r\\n                {\\r\\n                    if (yText>yPrice) //文字在下方\\r\\n                    {\\r\\n                        yText-=item.Line.Offset[1];\\r\\n                        yPrice+=item.Line.Offset[0]\\r\\n                    }\\r\\n                    else if (yText<yPrice)\\r\\n                    {\\r\\n                        yText+=item.Line.Offset[1];\\r\\n                        yPrice-=item.Line.Offset[0]\\r\\n                    }\\r\\n                }\\r\\n                this.Canvas.save();\\r\\n                if (item.Line.Dash) this.Canvas.setLineDash(item.Line.Dash);    //虚线\\r\\n                var pixelRatio=GetDevicePixelRatio();\\r\\n                var lineWidth=1*pixelRatio;\\r\\n                if (item.Line.Width>0) lineWidth=item.Line.Width*pixelRatio;\\r\\n                this.Canvas.lineWidth=lineWidth;   //线宽\\r\\n                this.Canvas.strokeStyle = item.Line.Color;\\r\\n                this.Canvas.beginPath();\\r\\n                if (this.IsHScreen)\\r\\n                {\\r\\n                    this.Canvas.moveTo(yText, ToFixedPoint(x));\\r\\n                    this.Canvas.lineTo(yPrice,ToFixedPoint(x));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);\\r\\n                    this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);\\r\\n                }\\r\\n\\r\\n                this.Canvas.stroke();\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={ Min:null, Max:null };\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n        var start=this.Data.DataOffset;\\r\\n        var end=start+xPointCount;\\r\\n\\r\\n        for(var i in this.Texts)\\r\\n        {\\r\\n            var item=this.Texts[i];\\r\\n            if (!IFrameSplitOperator.IsNumber(item.Index)) continue;\\r\\n            if (item.Index>=start && item.Index<end)\\r\\n            {\\r\\n                if (range.Max==null) range.Max=item.Value;\\r\\n                else if (range.Max<item.Value) range.Max=item.Value;\\r\\n                if (range.Min==null) range.Min=item.Value;\\r\\n                else if (range.Min>item.Value) range.Min=item.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n//锁  支持横屏\\r\\nfunction ChartLock()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartLock\\\";\\r\\n    this.WidthDiv = 0.2;  // 框子宽度占比\\r\\n    this.LockCount = 20; // 锁最新的几个数据\\r\\n    this.BGColor = g_JSChartResource.LockBGColor;\\r\\n    this.TextColor = g_JSChartResource.LockTextColor;\\r\\n    this.Font = g_JSChartResource.DefaultTextFont;\\r\\n    this.Title = '🔒开通权限';\\r\\n    this.LockRect=null; //上锁区域\\r\\n    this.LockID;        //锁ID\\r\\n    this.Callback;      //回调\\r\\n    this.IndexName;     //指标名字\\r\\n    this.MinWidth=null;  //最小宽度\\r\\n\\r\\n    this.Draw=function(isDraw)\\r\\n    {\\r\\n        this.LockRect=null;\\r\\n        if (this.NotSupportMessage)\\r\\n        {\\r\\n            this.DrawNotSupportmessage();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.ChartFrame.IsHScreen===true)\\r\\n        {\\r\\n            this.HScreenDraw(isDraw);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var xOffset = this.ChartBorder.GetRight();\\r\\n        var lOffsetWidth = 0;\\r\\n        if (this.ChartFrame.Data != null)\\r\\n        {\\r\\n            var dataWidth=this.ChartFrame.DataWidth;\\r\\n            var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n            xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;\\r\\n            var chartright=this.ChartBorder.GetRight();\\r\\n            var xPointCount=this.ChartFrame.XPointCount;\\r\\n            for(var i=this.ChartFrame.Data.DataOffset,j=0;i<this.ChartFrame.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var data=this.ChartFrame.Data.Data[i];\\r\\n                if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n            }\\r\\n            lOffsetWidth = (dataWidth + distanceWidth) * this.LockCount;\\r\\n        }\\r\\n        if (lOffsetWidth == 0)\\r\\n        {\\r\\n            lOffsetWidth = (xOffset - this.ChartBorder.GetLeft()) * this.WidthDiv;\\r\\n        }\\r\\n        var lLeft = xOffset - lOffsetWidth;\\r\\n        if (lLeft < this.ChartBorder.GetLeft())\\r\\n            lLeft = this.ChartBorder.GetLeft();\\r\\n        var lHeight = this.ChartBorder.GetBottom() - this.ChartBorder.GetTop();\\r\\n        var lWidth = this.ChartBorder.GetRight() - lLeft;\\r\\n\\r\\n        if (this.MinWidth>10 && lWidth<this.MinWidth)\\r\\n        {\\r\\n            lWidth=this.MinWidth;\\r\\n            lLeft=this.ChartBorder.GetRight()-lWidth;\\r\\n            if (lLeft < this.ChartBorder.GetLeft()) lLeft = this.ChartBorder.GetLeft();\\r\\n        }\\r\\n\\r\\n        if (isDraw)\\r\\n        {\\r\\n            this.Canvas.fillStyle = this.BGColor;\\r\\n            this.Canvas.fillRect(lLeft, this.ChartBorder.GetTop(), lWidth, lHeight);\\r\\n            var xCenter = lLeft + lWidth / 2;\\r\\n            var yCenter = this.ChartBorder.GetTop() + lHeight / 2;\\r\\n            this.Canvas.textAlign = 'center';\\r\\n            this.Canvas.textBaseline = 'middle';\\r\\n            this.Canvas.fillStyle = this.TextColor;\\r\\n            this.Canvas.font = this.Font;\\r\\n            this.Canvas.fillText(this.Title, xCenter, yCenter);\\r\\n        }\\r\\n\\r\\n        this.LockRect={Left:lLeft,Top:this.ChartBorder.GetTop(),Width:lWidth,Heigh:lHeight};    //保存上锁区域\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function(isDraw)\\r\\n    {\\r\\n        var xOffset = this.ChartBorder.GetBottom();\\r\\n\\r\\n        var lOffsetWidth = 0;\\r\\n        if (this.ChartFrame.Data != null)\\r\\n        {\\r\\n            var dataWidth=this.ChartFrame.DataWidth;\\r\\n            var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n            xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;\\r\\n            var chartright=this.ChartBorder.GetBottom();\\r\\n            var xPointCount=this.ChartFrame.XPointCount;\\r\\n            //求最后1个数据的位置\\r\\n            for(var i=this.ChartFrame.Data.DataOffset,j=0;i<this.ChartFrame.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n            {\\r\\n                var data=this.ChartFrame.Data.Data[i];\\r\\n                if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n                var left=xOffset;\\r\\n                var right=xOffset+dataWidth;\\r\\n                if (right>chartright) break;\\r\\n            }\\r\\n            lOffsetWidth = (dataWidth + distanceWidth) * this.LockCount;\\r\\n        }\\r\\n        if (lOffsetWidth == 0)\\r\\n        {\\r\\n            lOffsetWidth = (xOffset - this.ChartBorder.GetTop()) * this.WidthDiv;\\r\\n        }\\r\\n\\r\\n        var lLeft = xOffset - lOffsetWidth;\\r\\n        if (lLeft < this.ChartBorder.GetTop()) lLeft = this.ChartBorder.GetTop();\\r\\n        var lHeight =  this.ChartBorder.GetRight()-this.ChartBorder.GetLeft();\\r\\n        var lWidth = this.ChartBorder.GetBottom() - lLeft;\\r\\n        this.Canvas.fillStyle = this.BGColor;\\r\\n        this.Canvas.fillRect(this.ChartBorder.GetLeft(), lLeft,lHeight,lWidth);\\r\\n\\r\\n        var xCenter = this.ChartBorder.GetLeft() + lHeight / 2;\\r\\n        var yCenter = lLeft + lWidth / 2;\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(xCenter, yCenter);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        this.Canvas.textAlign = 'center';\\r\\n        this.Canvas.textBaseline = 'middle';\\r\\n        this.Canvas.fillStyle = this.TextColor;\\r\\n        this.Canvas.font = this.Font;\\r\\n        this.Canvas.fillText(this.Title, 0, 0);\\r\\n        this.Canvas.restore();\\r\\n\\r\\n        this.LockRect={Left:this.ChartBorder.GetLeft(),Top:lLeft,Width:lHeight,Heigh:lWidth};    //保存上锁区域\\r\\n    }\\r\\n\\r\\n    //x,y是否在上锁区域\\r\\n    this.GetTooltipData=function(x,y,tooltip)\\r\\n    {\\r\\n        if (this.LockRect==null) return false;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.LockRect.Left,this.LockRect.Top,this.LockRect.Width,this.LockRect.Heigh);\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n        {\\r\\n            tooltip.Data={ ID:this.LockID, Callback:this.Callback, IndexName:this.IndexName };\\r\\n            tooltip.ChartPaint=this;\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n//买卖盘\\r\\nfunction ChartBuySell()\\r\\n{\\r\\n    this.newMethod=ChartSingleText;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartBuySell\\\";\\r\\n    this.TextFont=g_JSChartResource.KLineTrain.Font;                //\\\"bold 14px arial\\\";           //买卖信息字体\\r\\n    this.LastDataIcon=g_JSChartResource.KLineTrain.LastDataIcon;    //{Color:'rgb(0,0,205)',Text:'↓'};\\r\\n    this.BuyIcon=g_JSChartResource.KLineTrain.BuyIcon;              //{Color:'rgb(0,0,205)',Text:'B'};\\r\\n    this.SellIcon=g_JSChartResource.KLineTrain.SellIcon;            //{Color:'rgb(0,0,205)',Text:'S'};\\r\\n    this.BuySellData=new Map();                                     //Key=数据索引index Value:Data:[ { Op: 买/卖 0=buy 1=sell, Date:, Time, Price: Vol:}, ]\\r\\n    this.IconFont=g_JSChartResource.KLineTrain.IconFont;\\r\\n\\r\\n    this.AddTradeItem=function(tradeItem)\\r\\n    {\\r\\n        if (this.BuySellData.has(tradeItem.Key))\\r\\n        {\\r\\n            var Trade=this.BuySellData.get(tradeItem.Key);\\r\\n            Trade.Data.push(tradeItem);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.BuySellData.set(tradeItem.Key, { Data:[tradeItem] });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ClearTradeData=function()\\r\\n    {\\r\\n        this.BuySellData=new Map();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartFrame.DistanceWidth;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen===true) chartright=this.ChartBorder.GetBottom();\\r\\n        var xPointCount=this.ChartFrame.XPointCount;\\r\\n\\r\\n        if (this.IconFont)\\r\\n        {\\r\\n            var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n            var iconSize=dataWidth+distanceWidth;\\r\\n            var minIconSize=18*pixelTatio;\\r\\n            if (iconSize<minIconSize) iconSize=minIconSize;\\r\\n            this.Canvas.font=iconSize+'px '+this.IconFont.Family;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.font=this.TextFont;\\r\\n        }\\r\\n\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var value=this.Data.Data[i];\\r\\n            if (value==null) continue;\\r\\n            var x=this.ChartFrame.GetXFromIndex(j);\\r\\n            if (x>chartright) break;\\r\\n\\r\\n            if (i==this.Data.Data.length-1)\\r\\n            {\\r\\n                //最后一个位置 画一个箭头\\r\\n                var x=this.ChartFrame.GetXFromIndex(j);\\r\\n                var yHigh=this.ChartFrame.GetYFromData(value.High);\\r\\n                this.Canvas.textAlign='center';\\r\\n                this.Canvas.textBaseline='bottom';\\r\\n                if (this.IconFont)\\r\\n                {\\r\\n                    this.Canvas.fillStyle=this.IconFont.Last.Color\\r\\n                    this.DrawText(this.IconFont.Last.Text,x,yHigh,isHScreen);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillStyle=this.LastDataIcon.Color;\\r\\n                    this.Canvas.font=this.TextFont;\\r\\n                    this.DrawText(this.LastDataIcon.Text,x,yHigh,isHScreen);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var key=i;\\r\\n            if (!this.BuySellData.has(key)) continue;\\r\\n\\r\\n            var trade=this.BuySellData.get(key);\\r\\n            var yHigh=this.ChartFrame.GetYFromData(value.High);\\r\\n            var yLow=this.ChartFrame.GetYFromData(value.Low);\\r\\n            var drawInfo=[false, false];    //0=buy 1=sell\\r\\n            for(var k in trade.Data)\\r\\n            {\\r\\n                if (drawInfo[0]==true && drawInfo[1]==true) break;  //买卖图标只画一次\\r\\n\\r\\n                var bsItem=trade.Data[k];\\r\\n                if (bsItem.Op==0 && drawInfo[0]==false)   //买 标识在最低价上\\r\\n                {\\r\\n                    this.Canvas.textAlign='center';\\r\\n                    this.Canvas.textBaseline='top';\\r\\n                    if (this.IconFont)\\r\\n                    {\\r\\n                        this.Canvas.fillStyle=this.IconFont.Buy.Color\\r\\n                        this.DrawText(this.IconFont.Buy.Text,x,yLow,isHScreen);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillStyle=this.BuyIcon.Color;\\r\\n                        this.DrawText(this.BuyIcon.Text,x,yLow,isHScreen);\\r\\n                    }\\r\\n\\r\\n                    drawInfo[0]=true;\\r\\n                }\\r\\n                else if (bsItem.Op==1 && drawInfo[1]==false)   //卖 标识在最高价上\\r\\n                {\\r\\n                    this.Canvas.textAlign='center';\\r\\n                    this.Canvas.textBaseline='bottom';\\r\\n                    if (this.IconFont)\\r\\n                    {\\r\\n                        this.Canvas.fillStyle=this.IconFont.Sell.Color\\r\\n                        this.DrawText(this.IconFont.Sell.Text,x,yHigh,isHScreen);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Canvas.fillStyle=this.SellIcon.Color;\\r\\n                        this.DrawText(this.SellIcon.Text,x,yHigh,isHScreen);\\r\\n                    }\\r\\n\\r\\n                    drawInfo[1]=true;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//深度图\\r\\nfunction ChartOrderbookDepth()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ChartOrderbookDepth\\\";\\r\\n    this.Data=null;\\r\\n\\r\\n    this.AskColor={ Line:g_JSChartResource.DepthChart.AskColor.Line, Area:g_JSChartResource.DepthChart.AskColor.Area }      //卖\\r\\n    this.BidColor={ Line:g_JSChartResource.DepthChart.BidColor.Line, Area:g_JSChartResource.DepthChart.BidColor.Area }      //买\\r\\n    this.LineWidth=g_JSChartResource.DepthChart.LineWidth;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data) return;\\r\\n\\r\\n        var lineWidthBackup=this.Canvas.lineWidth;\\r\\n        this.Canvas.lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        this.DrawArea(this.Data.Bids, this.BidColor.Line, this.BidColor.Area, true);\\r\\n        this.DrawArea(this.Data.Asks, this.AskColor.Line, this.AskColor.Area, false);\\r\\n        this.Canvas.lineWidth=lineWidthBackup;\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function(aryData, colorLine, colorArea, isLeft)\\r\\n    {\\r\\n        var xRange=this.ChartFrame.VerticalRange;\\r\\n        var aryPoint=[];\\r\\n        for(var i in aryData)\\r\\n        {\\r\\n            var item=aryData[i];\\r\\n            if (isLeft)\\r\\n            {\\r\\n                if (item.Price<xRange.Min) break;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (item.Price>xRange.Max) break;\\r\\n            }\\r\\n\\r\\n            var x=this.ChartFrame.GetXFromIndex(item.Price);\\r\\n            var y=this.ChartFrame.GetYFromData(item.Vol);\\r\\n            aryPoint.push({X:x,Y:y});\\r\\n        }\\r\\n        if (aryPoint.length<=1) return;\\r\\n\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var bottom=this.ChartBorder.GetBottom();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(aryPoint[0].X, bottom);\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            this.Canvas.lineTo(item.X,item.Y);\\r\\n        }\\r\\n\\r\\n        this.Canvas.lineTo(isLeft?left:right,aryPoint[aryPoint.length-1].Y);\\r\\n        this.Canvas.lineTo(isLeft?left:right,bottom);\\r\\n        this.Canvas.lineTo(aryPoint[0].X,bottom);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fillStyle = colorArea;\\r\\n        this.Canvas.fill();\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(aryPoint[0].X, bottom);\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            this.Canvas.lineTo(item.X,item.Y);\\r\\n        }\\r\\n        this.Canvas.lineTo(isLeft?left:right,aryPoint[aryPoint.length-1].Y);\\r\\n        this.Canvas.strokeStyle=colorLine;\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()\\r\\n    {\\r\\n        var range={ Min:null, Max:null, XMin:null, XMax:null };\\r\\n        var xRange=this.ChartFrame.VerticalRange;\\r\\n\\r\\n        for(var i in this.Data.Asks)\\r\\n        {\\r\\n            var item=this.Data.Asks[i];\\r\\n            if (item.Price>xRange.Max) break;\\r\\n\\r\\n            if (range.XMin==null || range.XMin>item.Price) range.XMin=item.Price;\\r\\n            if (range.XMax==null || range.XMax<item.Price) range.XMax=item.Price;\\r\\n            if (range.Min==null || range.Min>item.Vol) range.Min=item.Vol;\\r\\n            if (range.Max==null || range.Max<item.Vol) range.Max=item.Vol;\\r\\n        }\\r\\n\\r\\n        for(var i in this.Data.Bids)\\r\\n        {\\r\\n            var item=this.Data.Bids[i];\\r\\n            if (item.Price<xRange.Min) break;\\r\\n\\r\\n            if (range.XMin==null || range.XMin>item.Price) range.XMin=item.Price;\\r\\n            if (range.XMax==null || range.XMax<item.Price) range.XMax=item.Price;\\r\\n            if (range.Min==null || range.Min>item.Vol) range.Min=item.Vol;\\r\\n            if (range.Max==null || range.Max<item.Vol) range.Max=item.Vol;\\r\\n        }\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    饼图\\r\\n*/\\r\\nfunction ChartPie()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Radius = 100; //半径默认值\\r\\n    this.Distance = 30; //指示线超出圆饼的距离\\r\\n    this.txtLine = 20; // 文本下划线\\r\\n    this.paddingX = 20 / 3;// 设置文本的移动\\r\\n\\r\\n    // return;\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0)) return this.DrawEmptyData();\\r\\n\\r\\n        let left=this.ChartBorder.GetLeft();\\r\\n        let right=this.ChartBorder.GetRight();\\r\\n        let top=this.ChartBorder.GetTop();\\r\\n        let bottom=this.ChartBorder.GetBottom();\\r\\n        let width=this.ChartBorder.GetWidth();\\r\\n        let height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        if(isNaN(this.Radius)){\\r\\n            let str = this.Radius.replace(\\\"%\\\",\\\"\\\");\\r\\n            str = str/100;\\r\\n            if(width >= height){\\r\\n                this.Radius = str*height;\\r\\n            }\\r\\n            if(width < height) this.Radius = str*width;\\r\\n        }\\r\\n\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(width/2,height/2);\\r\\n\\r\\n        let totalValue=0;   //求和\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            totalValue += this.Data.Data[i].Value;\\r\\n        }\\r\\n        let start = 0;\\r\\n        let end = 0;\\r\\n        //画饼图\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            let item =this.Data.Data[i];\\r\\n            let rate=(item.Value/totalValue).toFixed(2); //占比\\r\\n            //JSConsole.Chart.Log('[ChartPie::Draw]', i, rate, item);\\r\\n\\r\\n            // 绘制扇形\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(0,0);\\r\\n\\r\\n            end += rate*2*Math.PI;//终止角度\\r\\n            this.Canvas.strokeStyle = \\\"white\\\";\\r\\n            this.Canvas.fillStyle = item.Color;\\r\\n            this.Canvas.arc(0,0,this.Radius,start,end);\\r\\n            this.Canvas.fill();\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            // 绘制直线\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.strokeStyle = item.Color;\\r\\n            this.Canvas.moveTo(0,0);\\r\\n            let x = (this.Radius + this.Distance)*Math.cos(end- (end-start)/2);\\r\\n            let y = (this.Radius + this.Distance)*Math.sin(end - (end-start)/2);\\r\\n            this.Canvas.lineTo(x,y);\\r\\n            // JSConsole.Chart.Log(x,y,\\\"xy\\\")\\r\\n\\r\\n            // 绘制横线\\r\\n            let txtLine = this.txtLine;\\r\\n            let paddingX = this.paddingX;\\r\\n            this.Canvas.textAlign = 'left';\\r\\n            if( end - (end-start)/2 < 1.5*Math.PI && end - (end-start)/2 > 0.5*Math.PI ){\\r\\n\\r\\n                txtLine = - this.txtLine;\\r\\n                paddingX = - this.paddingX;\\r\\n                this.Canvas.textAlign = 'right';\\r\\n            }\\r\\n            this.Canvas.lineTo( x + txtLine, y );\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            // 写文字\\r\\n            if(item.Text){\\r\\n                this.Canvas.fillText( item.Text, x + txtLine + paddingX, y );\\r\\n            }else{\\r\\n                let text = `${item.Name}:${item.Value}`;\\r\\n                this.Canvas.fillText( text, x + txtLine + paddingX, y );\\r\\n            }\\r\\n\\r\\n\\r\\n            start += rate*2*Math.PI;//起始角度\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //空数据\\r\\n    this.DrawEmptyData=function()\\r\\n    {\\r\\n        JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    雷达图\\r\\n*/\\r\\nfunction ChartRadar()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.BorderPoint=[];    //边框点\\r\\n    this.DataPoint=[];      //数据点\\r\\n    this.CenterPoint={};\\r\\n    this.StartAngle=0;\\r\\n    this.Color='rgb(198,198,198)';\\r\\n    this.AreaColor='rgba(242,154,118,0.4)';    //面积图颜色\\r\\n    this.AreaLineColor='rgb(242,154,118)';\\r\\n    this.TitleFont=24*GetDevicePixelRatio()+'px 微软雅黑';\\r\\n    this.TitleColor='rgb(102,102,102)';\\r\\n    this.BGColor = ['rgb(255,255,255)', 'rgb(224,224,224)']//背景色\\r\\n\\r\\n    this.DrawBorder=function()  //画边框\\r\\n    {\\r\\n        if (this.BorderPoint.length<=0) return;\\r\\n\\r\\n        this.Canvas.font=this.TitleFont;\\r\\n        this.Canvas.strokeStyle = this.Color;\\r\\n        const aryBorder=[1,0.8,0.6,0.4,0.2];\\r\\n        for (let j in aryBorder)\\r\\n        {\\r\\n            var rate = aryBorder[j];\\r\\n            var isFirstDraw=true;\\r\\n            for(let i in this.BorderPoint)\\r\\n            {\\r\\n                var item=this.BorderPoint[i];\\r\\n                item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180) * rate;\\r\\n                item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180) * rate;\\r\\n                if (isFirstDraw)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(item.X,item.Y);\\r\\n                    isFirstDraw=false;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(item.X,item.Y);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.closePath();\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.fillStyle = this.BGColor[j%2==0?0:1];\\r\\n            this.Canvas.fill();\\r\\n        }\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        for(let i in this.BorderPoint)\\r\\n        {\\r\\n            var item=this.BorderPoint[i];\\r\\n            item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);\\r\\n            item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);\\r\\n            this.Canvas.moveTo(this.CenterPoint.X,this.CenterPoint.Y);\\r\\n            this.Canvas.lineTo(item.X,item.Y);\\r\\n            this.DrawText(item);\\r\\n        }\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        if (!this.DataPoint || this.DataPoint.length<=0) return;\\r\\n\\r\\n        this.Canvas.fillStyle = this.AreaColor;\\r\\n        this.Canvas.strokeStyle = this.AreaLineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        var isFirstDraw=true;\\r\\n        for(let i in this.DataPoint)\\r\\n        {\\r\\n            var item=this.DataPoint[i];\\r\\n            if (isFirstDraw)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(item.X,item.Y);\\r\\n                isFirstDraw=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.lineTo(item.X,item.Y);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawText=function(item)\\r\\n    {\\r\\n        if (!item.Text) return;\\r\\n\\r\\n        //JSConsole.Chart.Log(item.Text, item.Angle);\\r\\n        this.Canvas.fillStyle = this.TitleColor;\\r\\n        var xText = item.X, yText = item.Y;\\r\\n\\r\\n        //显示每个角度的位置\\r\\n        if (item.Angle > 0 && item.Angle < 45) {\\r\\n            this.Canvas.textAlign = 'left';\\r\\n            this.Canvas.textBaseline = 'middle';\\r\\n            xText += 2;\\r\\n        }\\r\\n        else if (item.Angle >= 0 && item.Angle < 90) {\\r\\n            this.Canvas.textAlign = 'left';\\r\\n            this.Canvas.textBaseline = 'top';\\r\\n            xText += 2;\\r\\n        }\\r\\n        else if (item.Angle >= 90 && item.Angle < 135) {\\r\\n            this.Canvas.textAlign = 'right';\\r\\n            this.Canvas.textBaseline = 'top';\\r\\n            xText -= 2;\\r\\n        }\\r\\n        else if (item.Angle >= 135 && item.Angle < 180) {\\r\\n            this.Canvas.textAlign = 'right';\\r\\n            this.Canvas.textBaseline = 'top';\\r\\n            xText -= 2;\\r\\n        }\\r\\n        else if (item.Angle >= 180 && item.Angle < 225) {\\r\\n            this.Canvas.textAlign = 'right';\\r\\n            this.Canvas.textBaseline = 'middle';\\r\\n            xText -= 2;\\r\\n        }\\r\\n        else if (item.Angle >= 225 && item.Angle <= 270) {\\r\\n            this.Canvas.textAlign = 'center';\\r\\n            this.Canvas.textBaseline = 'bottom';\\r\\n        }\\r\\n        else if (item.Angle > 270 && item.Angle < 315) {\\r\\n            this.Canvas.textAlign = 'left';\\r\\n            this.Canvas.textBaseline = 'bottom';\\r\\n            xText += 2;\\r\\n        }\\r\\n        else {\\r\\n            this.Canvas.textAlign = 'left';\\r\\n            this.Canvas.textBaseline = 'middle';\\r\\n            xText += 2;\\r\\n        }\\r\\n\\r\\n        this.Canvas.fillText(item.Text, xText, yText);\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.BorderPoint=[];\\r\\n        this.DataPoint=[];\\r\\n        this.CenterPoint={};\\r\\n        if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0))\\r\\n            this.CalculatePoints(null);\\r\\n        else\\r\\n            this.CalculatePoints(this.Data.Data);\\r\\n\\r\\n        this.DrawBorder();\\r\\n        this.DrawArea();\\r\\n    }\\r\\n\\r\\n    this.CalculatePoints=function(data)\\r\\n    {\\r\\n        let left=this.ChartBorder.GetLeft();\\r\\n        let right=this.ChartBorder.GetRight();\\r\\n        let top=this.ChartBorder.GetTop();\\r\\n        let bottom=this.ChartBorder.GetBottom();\\r\\n        let width=this.ChartBorder.GetWidth();\\r\\n        let height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        let ptCenter={X:left+width/2, Y:top+height/2};  //中心点\\r\\n        let radius=Math.min(width/2,height/2)-2         //半径\\r\\n        let count=Math.max(5,data?data.length:0);\\r\\n        let averageAngle=360/count;\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n            let ptBorder = { Index: i, Radius: radius, Angle: i * averageAngle + this.StartAngle };\\r\\n            let angle = ptBorder.Angle;\\r\\n\\r\\n            if (data && i<data.length)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                let ptData={Index:i,Text:item.Text};\\r\\n                ptBorder.Text=item.Name;\\r\\n                if (!item.Value)\\r\\n                {\\r\\n                    ptData.X=ptCenter.X;\\r\\n                    ptData.Y=ptCenter.Y;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var value=item.Value;\\r\\n                    if (value>=1) value=1;\\r\\n                    var dataRadius=radius*value;\\r\\n                    ptData.X=ptCenter.X+dataRadius*Math.cos(angle*Math.PI/180);\\r\\n                    ptData.Y=ptCenter.Y+dataRadius*Math.sin(angle*Math.PI/180);\\r\\n                }\\r\\n\\r\\n                this.DataPoint.push(ptData);\\r\\n            }\\r\\n\\r\\n            this.BorderPoint.push(ptBorder);\\r\\n        }\\r\\n\\r\\n        this.CenterPoint=ptCenter;\\r\\n    }\\r\\n\\r\\n    //空数据\\r\\n    this.DrawEmptyData=function()\\r\\n    {\\r\\n        JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    中国地图\\r\\n*/\\r\\n\\r\\n\\r\\nfunction ChartChinaMap()\\r\\n{\\r\\n    this.newMethod=IChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ImageData=null;\\r\\n    this.Left;\\r\\n    this.Top;\\r\\n    this.Width;\\r\\n    this.Height;\\r\\n    this.ImageWidth;\\r\\n    this.ImageHeight;\\r\\n\\r\\n    this.DefaultColor=[217,222,239];\\r\\n\\r\\n    this.Color=\\r\\n        [\\r\\n            {Name:'海南',       Color:'rgb(217,222,223)'},\\r\\n            {Name:'内蒙古',     Color:'rgb(217,222,225)'},\\r\\n            {Name:'新疆',       Color:'rgb(217,222,226)'},\\r\\n            {Name:'青海',       Color:'rgb(217,222,227)'},\\r\\n            {Name:'西藏',       Color:'rgb(217,222,228)'},\\r\\n            {Name:'云南',       Color:'rgb(217,222,229)'},\\r\\n            {Name:'黑龙江',     Color:'rgb(217,222,230)'},\\r\\n            {Name:'吉林',       Color:'rgb(217,222,231)'},\\r\\n            {Name:'辽宁',       Color:'rgb(217,222,232)'},\\r\\n            {Name:'河北',       Color:'rgb(217,222,233)'},\\r\\n            {Name:'山东',       Color:'rgb(217,222,234)'},\\r\\n            {Name:'江苏',       Color:'rgb(217,222,235)'},\\r\\n            {Name:'浙江',       Color:'rgb(217,222,236)'},\\r\\n            {Name:'福建',       Color:'rgb(217,222,237)'},\\r\\n            {Name:'广东',       Color:'rgb(217,222,238)'},\\r\\n            {Name:'广西',       Color:'rgb(217,222,239)'},\\r\\n            {Name:'贵州',       Color:'rgb(217,222,240)'},\\r\\n            {Name:'湖南',       Color:'rgb(217,222,241)'},\\r\\n            {Name:'江西',       Color:'rgb(217,222,242)'},\\r\\n            {Name:'安徽',       Color:'rgb(217,222,243)'},\\r\\n            {Name:'湖北',       Color:'rgb(217,222,244)'},\\r\\n            {Name:'重庆',       Color:'rgb(217,222,245)'},\\r\\n            {Name:'四川',       Color:'rgb(217,222,246)'},\\r\\n            {Name:'甘肃',       Color:'rgb(217,222,247)'},\\r\\n            {Name:'陕西',       Color:'rgb(217,222,248)'},\\r\\n            {Name:'山西',       Color:'rgb(217,222,249)'},\\r\\n            {Name:'河南',       Color:'rgb(217,222,250)'}\\r\\n        ];\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        let left=this.ChartBorder.GetLeft()+1;\\r\\n        let right=this.ChartBorder.GetRight()-1;\\r\\n        let top=this.ChartBorder.GetTop()+1;\\r\\n        let bottom=this.ChartBorder.GetBottom()-1;\\r\\n        let width=this.ChartBorder.GetWidth()-2;\\r\\n        let height=this.ChartBorder.GetHeight()-2;\\r\\n\\r\\n        let imageWidth=CHINA_MAP_IMAGE.width;\\r\\n        let imageHeight=CHINA_MAP_IMAGE.height;\\r\\n\\r\\n        let drawImageWidth=imageWidth;\\r\\n        let drawImageHeight=imageHeight;\\r\\n\\r\\n        if (height<drawImageHeight || width<drawImageWidth)\\r\\n        {\\r\\n            this.ImageData=null;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.Left!=left || this.Top!=top || this.Width!=width || this.Height!=height || this.ImageWidth!=imageWidth || this.ImageHeight!=imageHeight)\\r\\n        {\\r\\n            this.ImageData=null;\\r\\n\\r\\n            this.ImageWidth=imageWidth;\\r\\n            this.ImageHeight=imageHeight;\\r\\n            this.Left=left;\\r\\n            this.Top=top;\\r\\n            this.Width=width;\\r\\n            this.Height=height;\\r\\n\\r\\n            JSConsole.Chart.Log(imageWidth,imageHeight);\\r\\n        }\\r\\n\\r\\n        if (this.ImageData==null)\\r\\n        {\\r\\n            this.Canvas.drawImage(CHINA_MAP_IMAGE,0,0,imageWidth,imageHeight,left,top,drawImageWidth,drawImageHeight);\\r\\n            this.ImageData=this.Canvas.getImageData(left,top,drawImageWidth,drawImageHeight);\\r\\n\\r\\n            let defaultColorSet=new Set();  //默认颜色填充的色块\\r\\n            let colorMap=new Map();         //定义颜色填充的色块\\r\\n\\r\\n            let nameMap=new Map();\\r\\n            if (this.Data.length>0)\\r\\n            {\\r\\n                for(let i in this.Data)\\r\\n                {\\r\\n                    let item=this.Data[i];\\r\\n                    nameMap.set(item.Name,item.Color)\\r\\n                }\\r\\n            }\\r\\n\\r\\n            JSConsole.Chart.Log(this.Data);\\r\\n            for(let i in this.Color)\\r\\n            {\\r\\n                let item=this.Color[i];\\r\\n                if (nameMap.has(item.Name))\\r\\n                {\\r\\n                    colorMap.set(item.Color,nameMap.get(item.Name));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    defaultColorSet.add(item.Color);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var color;\\r\\n            for (let i=0;i<this.ImageData.data.length;i+=4)\\r\\n            {\\r\\n                color='rgb('+ this.ImageData.data[i] + ',' + this.ImageData.data[i+1] + ',' + this.ImageData.data[i+2] + ')';\\r\\n\\r\\n                if (defaultColorSet.has(color))\\r\\n                {\\r\\n                    this.ImageData.data[i]=this.DefaultColor[0];\\r\\n                    this.ImageData.data[i+1]=this.DefaultColor[1];\\r\\n                    this.ImageData.data[i+2]=this.DefaultColor[2];\\r\\n                }\\r\\n                else if (colorMap.has(color))\\r\\n                {\\r\\n                    let colorValue=colorMap.get(color);\\r\\n                    this.ImageData.data[i]=colorValue[0];\\r\\n                    this.ImageData.data[i+1]=colorValue[1];\\r\\n                    this.ImageData.data[i+2]=colorValue[2];\\r\\n                }\\r\\n            }\\r\\n            this.Canvas.clearRect(left,top,drawImageWidth,drawImageHeight);\\r\\n            this.Canvas.putImageData(this.ImageData,left,top,0,0,drawImageWidth,drawImageHeight);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.putImageData(this.ImageData,left,top,0,0,drawImageWidth,drawImageHeight);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    扩展图形\\r\\n*/\\r\\n\\r\\nfunction ExtendChartPaintFactory()\\r\\n{\\r\\n    this.DataMap=new Map(\\r\\n        [\\r\\n            [\\\"FrameSplitPaint\\\", { Create:function() { return new FrameSplitPaint(); } }],\\r\\n            [\\\"RectSelectPaint\\\", { Create:function() { return new RectSelectPaint(); } }]\\r\\n        ]\\r\\n    );\\r\\n\\r\\n    this.Create=function(name)\\r\\n    {\\r\\n        if (!this.DataMap.has(name)) return null;\\r\\n\\r\\n        var item=this.DataMap.get(name);\\r\\n        return item.Create();\\r\\n    }\\r\\n\\r\\n    this.Add=function(name, option)\\r\\n    {\\r\\n        this.DataMap.set(name, { Create:option.Create } );\\r\\n    }\\r\\n}\\r\\n\\r\\nvar g_ExtendChartPaintFactory=new ExtendChartPaintFactory();\\r\\n\\r\\nfunction IExtendChartPainting()\\r\\n{\\r\\n    this.Canvas;                        //画布\\r\\n    this.ChartBorder;                   //边框信息\\r\\n    this.ChartFrame;                    //框架画法\\r\\n    this.Name;                          //名称\\r\\n    this.Data;                          //数据区\\r\\n    this.IsDynamic=false;\\r\\n    this.IsAnimation=false;             //是否是动画\\r\\n    this.ClassName='IExtendChartPainting';\\r\\n    this.SizeChange=true;               //大小是否改变\\r\\n    this.IsEraseBG=false;               //是否每次画的时候需要擦除K线图背景\\r\\n    this.DrawAfterTitle=false;          //是否在动态标题画完以后再画,防止动态标题覆盖\\r\\n    this.IsCallbackDraw=false;          //在回调函数里绘制, 不在Draw()中绘制\\r\\n\\r\\n    //上下左右间距\\r\\n    this.Left=5;\\r\\n    this.Right=5;\\r\\n    this.Top=5;\\r\\n    this.Bottom=5;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    //设置参数接口\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetFontHeight=function(font)\\r\\n    {\\r\\n        return GetFontHeight(this.Canvas, font, \\\"擎\\\");\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//K线Tooltip, 显示在左边或右边\\r\\nfunction KLineTooltipPaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.IsDynamic=true;\\r\\n    this.IsEraseBG=true;\\r\\n    this.DrawAfterTitle=true;\\r\\n    this.ClassName='KLineTooltipPaint';\\r\\n    this.BorderColor=g_JSChartResource.TooltipPaint.BorderColor;    //边框颜色\\r\\n    this.BGColor=g_JSChartResource.TooltipPaint.BGColor;            //背景色\\r\\n    this.TitleColor=g_JSChartResource.TooltipPaint.TitleColor;      //标题颜色\\r\\n    this.DateTimeColor=g_JSChartResource.TooltipPaint.DateTimeColor;      //日期时间颜色\\r\\n    this.VolColor=g_JSChartResource.TooltipPaint.VolColor;       //标题成交量\\r\\n    this.AmountColor=g_JSChartResource.TooltipPaint.AmountColor;    //成交金额\\r\\n    this.LatestPoint;               //手势位置\\r\\n    this.ShowPosition=0;            //显示位置 0=左 1=右\\r\\n\\r\\n    this.Left=1*GetDevicePixelRatio();\\r\\n    this.Top=5*GetDevicePixelRatio();\\r\\n\\r\\n    this.Width=50;\\r\\n    this.Height=100;\\r\\n    this.LineHeight=15*GetDevicePixelRatio(); //行高\\r\\n\\r\\n    this.Font=[g_JSChartResource.TooltipPaint.TitleFont];\\r\\n\\r\\n    this.HQChart;\\r\\n    this.KLineTitlePaint;\\r\\n    this.IsHScreen=false;   //是否横屏\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        this.BorderColor=g_JSChartResource.TooltipPaint.BorderColor;    //边框颜色\\r\\n        this.BGColor=g_JSChartResource.TooltipPaint.BGColor;            //背景色\\r\\n        this.TitleColor=g_JSChartResource.TooltipPaint.TitleColor;      //标题颜色\\r\\n        this.DateTimeColor=g_JSChartResource.TooltipPaint.DateTimeColor;      //日期时间颜色\\r\\n        this.VolColor=g_JSChartResource.TooltipPaint.VolColor;       //标题成交量\\r\\n        this.AmountColor=g_JSChartResource.TooltipPaint.AmountColor;    //成交金额\\r\\n    }\\r\\n\\r\\n    this.GetLeft=function()\\r\\n    {\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            return this.ChartBorder.GetRightEx()-this.Height-this.Top;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.ShowPosition==0)\\r\\n                return this.ChartBorder.GetLeft()+this.Left;\\r\\n            else\\r\\n                return this.ChartBorder.GetRight()-this.Width-this.Left;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetTop=function()\\r\\n    {\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            if (this.ShowPosition==0)\\r\\n                return this.ChartBorder.GetTop()+this.Left;\\r\\n            else\\r\\n                return this.ChartBorder.GetBottom()-this.Width-this.Left;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return this.ChartBorder.GetTopEx()+this.Top;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.IsEnableDraw=function()\\r\\n    {\\r\\n        if (!this.HQChart || !this.HQChart.TitlePaint || !this.HQChart.TitlePaint[0]) return false;\\r\\n        if (this.HQChart.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n        {\\r\\n            if (this.HQChart.TouchStatus.CorssCursorShow==false) return false;\\r\\n        }\\r\\n        else if (!this.HQChart.IsOnTouch)\\r\\n        {\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        if (this.HQChart.CurrentChartDrawPicture) return false;   //画图工具操作的时候 不显示\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsEnableDraw()) return;\\r\\n\\r\\n        this.KLineTitlePaint=this.HQChart.TitlePaint[0];\\r\\n        var klineData=this.KLineTitlePaint.GetCurrentKLineData();\\r\\n        if (!klineData) return;\\r\\n\\r\\n        var lineCount=8;    //显示函数\\r\\n        var upperSymbol;\\r\\n        if (this.HQChart.Symbol) upperSymbol=this.HQChart.Symbol.toUpperCase();\\r\\n        if (this.ClassName==='MinuteTooltipPaint')\\r\\n        {\\r\\n            lineCount=7;\\r\\n            if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol)) ++lineCount;    //期货多一个持仓量\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(klineData.Time) ) ++lineCount;     //分钟K线多一列时间\\r\\n            if (MARKET_SUFFIX_NAME.IsSHSZStockA(this.HQChart.Symbol) && klineData.FlowCapital>0) ++lineCount;\\r\\n            if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol) && IFrameSplitOperator.IsNumber(klineData.Position)) ++lineCount;    //持仓\\r\\n        }\\r\\n\\r\\n        //this.TitleColor=this.KLineTitlePaint.UnchagneColor;\\r\\n        this.IsHScreen=this.ChartFrame.IsHScreen===true;\\r\\n        this.Canvas.font=this.Font[0];\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.HQChart.Symbol);//价格小数位数\\r\\n        var maxText=' 擎: 9999.99亿 ';\\r\\n        if (defaultfloatPrecision>=5) maxText=` 擎: ${99.99.toFixed(defaultfloatPrecision)} `;  //小数位数太多了\\r\\n        this.Width=this.Canvas.measureText(maxText).width;\\r\\n        var lineHeight=this.GetFontHeight();\\r\\n        if (lineHeight>this.LineHeight) this.LineHeight=lineHeight;\\r\\n        this.Height=this.LineHeight*lineCount+2*GetDevicePixelRatio()*2;\\r\\n        if (klineData && klineData.High>0)  //最大值显示宽度\\r\\n        {\\r\\n            maxText=` 擎: ${klineData.High.toFixed(defaultfloatPrecision)} `;\\r\\n            var textWidth=this.Canvas.measureText(maxText).width;\\r\\n            if (textWidth>this.Width) this.Width=textWidth;\\r\\n        }\\r\\n\\r\\n        this.CalculateShowPosition();\\r\\n        this.DrawBG();\\r\\n        this.DrawTooltipData(klineData);\\r\\n        this.DrawBorder();\\r\\n    }\\r\\n\\r\\n    //判断显示位置\\r\\n    this.CalculateShowPosition=function()\\r\\n    {\\r\\n        this.ShowPosition=0;\\r\\n        if (!this.LatestPoint) return;\\r\\n\\r\\n        if(this.IsHScreen)\\r\\n        {\\r\\n            var top=this.ChartBorder.GetTop();\\r\\n            var height=this.ChartBorder.GetHeight();\\r\\n            var yCenter=top+height/2;\\r\\n            if (this.LatestPoint.Y<yCenter) this.ShowPosition=1;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeft();\\r\\n            var width=this.ChartBorder.GetWidth();\\r\\n            var xCenter=left+width/2;\\r\\n            if (this.LatestPoint.X<xCenter) this.ShowPosition=1;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawTooltipData=function(item)\\r\\n    {\\r\\n        //JSConsole.Chart.Log('[KLineTooltipPaint::DrawKLineData] ', item);\\r\\n        var upperSymbol;\\r\\n        if (this.HQChart.Symbol) upperSymbol=this.HQChart.Symbol.toUpperCase();\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.HQChart.Symbol);//价格小数位数\\r\\n        var left=this.GetLeft()+2*GetDevicePixelRatio();\\r\\n        var top=this.GetTop()+3*GetDevicePixelRatio();\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            var x=this.GetLeft()+this.Height, y=this.GetTop();\\r\\n\\r\\n            this.Canvas.translate(x, y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n            //x, y 作为原点\\r\\n            left=2*GetDevicePixelRatio();\\r\\n            top=3*GetDevicePixelRatio();\\r\\n        }\\r\\n\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.font=this.Font[0];\\r\\n        var labelWidth=this.Canvas.measureText('擎: ').width;\\r\\n\\r\\n        var text=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n        this.Canvas.fillStyle=this.DateTimeColor;\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n\\r\\n        var period=this.HQChart.Period;\\r\\n        if (ChartData.IsMinutePeriod(period,true) && IFrameSplitOperator.IsNumber(item.Time))\\r\\n        {\\r\\n            top+=this.LineHeight;\\r\\n            text=IFrameSplitOperator.FormatTimeString(item.Time);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n        }\\r\\n        else if (ChartData.IsSecondPeriod(period) && IFrameSplitOperator.IsNumber(item.Time))\\r\\n        {\\r\\n            top+=this.LineHeight;\\r\\n            text=IFrameSplitOperator.FormatTimeString(item.Time,'HH:MM:SS');\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n        }\\r\\n\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Open',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var color=this.KLineTitlePaint.GetColor(item.Open,item.YClose);\\r\\n        text=item.Open.toFixed(defaultfloatPrecision);\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-High',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var color=this.KLineTitlePaint.GetColor(item.High,item.YClose);\\r\\n        var text=item.High.toFixed(defaultfloatPrecision);\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Low',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var color=this.KLineTitlePaint.GetColor(item.Low,item.YClose);\\r\\n        var text=item.Low.toFixed(defaultfloatPrecision);\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Close',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var color=this.KLineTitlePaint.GetColor(item.Close,item.YClose);\\r\\n        var text=item.Close.toFixed(defaultfloatPrecision);\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Increase',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        if (item.YFClose>0 && MARKET_SUFFIX_NAME.IsChinaFutures(upperSymbol))\\r\\n        {\\r\\n            var value=(item.Close-item.YFClose)/item.YFClose*100;\\r\\n            var color = this.KLineTitlePaint.GetColor(value, 0);\\r\\n            var text = value.toFixed(2)+'%';\\r\\n        }\\r\\n        else if (item.YClose>0)\\r\\n        {\\r\\n            var value=(item.Close-item.YClose)/item.YClose*100;\\r\\n            var color = this.KLineTitlePaint.GetColor(value, 0);\\r\\n            var text = value.toFixed(2)+'%';\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var text='--.--';\\r\\n            var color=this.KLineTitlePaint.GetColor(0, 0);\\r\\n        }\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n\\r\\n        top+=this.LineHeight;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Vol',this.LanguageID);\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var vol=item.Vol;\\r\\n        if (upperSymbol && MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol)) vol/=100; //A股统一转成手\\r\\n        var text=IFrameSplitOperator.FromatIntegerString(vol,2,this.LanguageID);\\r\\n        this.Canvas.fillStyle=this.VolColor;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(item.Amount))\\r\\n        {\\r\\n\\r\\n            top+=this.LineHeight;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-Amount',this.LanguageID);\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var text=IFrameSplitOperator.FormatValueString(item.Amount,2,this.LanguageID);\\r\\n            this.Canvas.fillStyle=this.AmountColor;\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        //换手率\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZStockA(this.HQChart.Symbol) && item.FlowCapital>0)\\r\\n        {\\r\\n            top+=this.LineHeight;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-Exchange',this.LanguageID);\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var value=item.Vol/item.FlowCapital*100;\\r\\n            var text=value.toFixed(2)+'%';\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        //持仓量\\r\\n        var upperSymbol=this.HQChart.Symbol.toUpperCase();\\r\\n        if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol) && IFrameSplitOperator.IsNumber(item.Position))\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            top+=this.LineHeight;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-Position',this.LanguageID);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var text=IFrameSplitOperator.FromatIntegerString(item.Position,2,this.LanguageID);\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        if (this.IsHScreen) this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawBorder=function()\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var left=this.GetLeft();\\r\\n        var top=this.GetTop();\\r\\n        this.Canvas.strokeStyle=this.BorderColor;\\r\\n        if (isHScreen)  this.Canvas.strokeRect(ToFixedPoint(left),ToFixedPoint(top),this.Height,this.Width);\\r\\n        else this.Canvas.strokeRect(ToFixedPoint(left),ToFixedPoint(top),ToFixedRect(this.Width),ToFixedRect(this.Height));\\r\\n    }\\r\\n\\r\\n    this.DrawBG=function()\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var left=this.GetLeft();\\r\\n        var top=this.GetTop();\\r\\n        this.Canvas.fillStyle=this.BGColor;\\r\\n        if (isHScreen)   this.Canvas.fillRect(left,top,this.Height,this.Width);\\r\\n        else  this.Canvas.fillRect(left,top,this.Width,this.Height);\\r\\n    }\\r\\n\\r\\n    //设置参数接口\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (option.LineHeight>0) this.LineHeight=option.LineHeight*GetDevicePixelRatio();\\r\\n        if (option.BGColor) this.BGColor=option.BGColor;\\r\\n        if (option.LanguageID>0) this.LanguageID=option.LanguageID;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction MinuteTooltipPaint()\\r\\n{\\r\\n    this.newMethod=KLineTooltipPaint;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='MinuteTooltipPaint';\\r\\n    this.Left=1*GetDevicePixelRatio();\\r\\n    this.Top=1*GetDevicePixelRatio();\\r\\n    this.YClose;\\r\\n    this.IsShowAveragePrice=true;   //是否显示均价\\r\\n\\r\\n    this.GetTop=function()\\r\\n    {\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            if (this.ShowPosition==0)\\r\\n                return border.TopEx+this.Left;\\r\\n            else\\r\\n                return border.BottomEx-this.Width-this.Left;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            return border.Top+this.Top;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetLeft=function()\\r\\n    {\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            return border.Right-this.Height-this.Top;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            if (this.ShowPosition==0)\\r\\n                return border.LeftEx+this.Left;\\r\\n            else\\r\\n                return border.RightEx-this.Width-this.Left;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawTooltipData=function(item)\\r\\n    {\\r\\n        //JSConsole.Chart.Log('[KLineTooltipPaint::DrawKLineData] ', item);\\r\\n        if (!this.HQChart.Symbol) return;\\r\\n\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.HQChart.Symbol);//价格小数位数\\r\\n        var left=this.GetLeft()+2*GetDevicePixelRatio();\\r\\n        var top=this.GetTop()+3*GetDevicePixelRatio();\\r\\n        this.YClose=this.KLineTitlePaint.YClose;\\r\\n        var upperSymbol=this.HQChart.Symbol.toUpperCase();\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            var x=this.GetLeft()+this.Height, y=this.GetTop();\\r\\n\\r\\n            this.Canvas.translate(x, y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n            //x, y 作为原点\\r\\n            left=2*GetDevicePixelRatio();\\r\\n            top=3*GetDevicePixelRatio();\\r\\n        }\\r\\n\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.font=this.Font[0];\\r\\n        var labelWidth=this.Canvas.measureText('擎: ').width;\\r\\n\\r\\n        var aryDateTime=item.DateTime.split(' ');\\r\\n        if (aryDateTime && aryDateTime.length==2)\\r\\n        {\\r\\n            var text=IFrameSplitOperator.FormatDateString(aryDateTime[0]);\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n\\r\\n            top+=this.LineHeight;\\r\\n            text=IFrameSplitOperator.FormatTimeString(aryDateTime[1]);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n        }\\r\\n\\r\\n        var close=item.Close;\\r\\n        var increase=item.Increase;\\r\\n        var vol=item.Vol;\\r\\n        var amount=item.Amount;\\r\\n        if (item.Before)    //读取盘前数据\\r\\n        {\\r\\n            close=item.Before.Close;\\r\\n            increase=item.Before.Increase;\\r\\n            vol=item.Before.Vol;\\r\\n            amount=item.Before.Amount;\\r\\n        }\\r\\n\\r\\n        //最新价格\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Price',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var color=this.KLineTitlePaint.GetColor(close,this.YClose);\\r\\n        var text=close.toFixed(defaultfloatPrecision);\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        var isShowAvPrice=true;\\r\\n        if (item.Before) isShowAvPrice=false;   //集合竞价均价\\r\\n        else if (MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol)) isShowAvPrice=false;     //外汇没有均价\\r\\n        else if (MARKET_SUFFIX_NAME.IsET(upperSymbol) && !MARKET_SUFFIX_NAME.IsETShowAvPrice(upperSymbol)) isShowAvPrice=false;\\r\\n        else if (MARKET_SUFFIX_NAME.IsShowAvPrice && !MARKET_SUFFIX_NAME.IsShowAvPrice(upperSymbol)) isShowAvPrice=false;\\r\\n\\r\\n        //均价\\r\\n        if (isShowAvPrice && IFrameSplitOperator.IsNumber(item.AvPrice) && this.IsShowAveragePrice)\\r\\n        {\\r\\n            top+=this.LineHeight;\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-AvPrice',this.LanguageID);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var color=this.KLineTitlePaint.GetColor(item.AvPrice,this.YClose);\\r\\n            var text=item.AvPrice.toFixed(defaultfloatPrecision);\\r\\n            this.Canvas.fillStyle=color;\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        //涨幅\\r\\n        top+=this.LineHeight;\\r\\n        this.Canvas.fillStyle=this.TitleColor;\\r\\n        text=g_JSChartLocalization.GetText('Tooltip-Increase',this.LanguageID);\\r\\n        this.Canvas.fillText(text, left,top);\\r\\n        var value=(close-this.YClose)/this.YClose*100;\\r\\n        var color = this.KLineTitlePaint.GetColor(value, 0);\\r\\n        var text = value.toFixed(2)+'%';\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.fillText(text,left+labelWidth,top);\\r\\n\\r\\n        //成交量\\r\\n        if (IFrameSplitOperator.IsNumber(vol))\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            top+=this.LineHeight;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-Vol',this.LanguageID);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var text=IFrameSplitOperator.FromatIntegerString(vol,2,this.LanguageID);\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        //成交金额\\r\\n        if (IFrameSplitOperator.IsNumber(amount))\\r\\n        {\\r\\n            top+=this.LineHeight;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-Amount',this.LanguageID);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var text=IFrameSplitOperator.FormatValueString(amount,2,this.LanguageID);\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(item.Position))\\r\\n        {\\r\\n            top+=this.LineHeight;\\r\\n            text=g_JSChartLocalization.GetText('Tooltip-Position',this.LanguageID);\\r\\n            this.Canvas.fillText(text, left,top);\\r\\n            var text=IFrameSplitOperator.FormatValueString(item.Position,2,this.LanguageID);\\r\\n            this.Canvas.fillText(text,left+labelWidth,top);\\r\\n        }\\r\\n\\r\\n        if (this.IsHScreen) this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//股票信息\\r\\nfunction StockInfoExtendChartPaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Left=80;\\r\\n    this.Right=1;\\r\\n    this.Top=1;\\r\\n    this.Bottom=1;\\r\\n\\r\\n    this.BorderColor=g_JSChartResource.FrameBorderPen;\\r\\n\\r\\n    this.Symbol;\\r\\n    this.Name;\\r\\n\\r\\n    this.TitleFont=[\\\"14px 微软雅黑\\\"];\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        var left=this.ChartBorder.GetRight()+this.Left;\\r\\n        var right=this.ChartBorder.GetChartWidth()-this.Right;\\r\\n        var y=this.Top+18;\\r\\n        var middle=left+(right-left)/2;\\r\\n\\r\\n        if (this.Symbol && this.Name)\\r\\n        {\\r\\n            this.Canvas.font=this.TitleFont[0];\\r\\n\\r\\n            this.Canvas.textAlign=\\\"right\\\";\\r\\n            this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n            this.Canvas.fillText(this.Symbol,middle-2,y);\\r\\n\\r\\n            this.Canvas.textAlign=\\\"left\\\";\\r\\n            this.Canvas.fillText(this.Name,middle+2,y);\\r\\n        }\\r\\n        ;\\r\\n        this.Canvas.strokeStyle=this.BorderColor;\\r\\n        this.Canvas.moveTo(left,y);\\r\\n        this.Canvas.lineTo(right,y);\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        y+=30;\\r\\n\\r\\n        this.DrawBorder();\\r\\n    }\\r\\n\\r\\n    this.DrawBorder=function()\\r\\n    {\\r\\n        var left=this.ChartBorder.GetRight()+this.Left;\\r\\n        var right=this.ChartBorder.GetChartWidth()-this.Right;\\r\\n        var top=this.Top;\\r\\n        var bottom=this.ChartBorder.GetChartHeight()-this.Bottom;\\r\\n\\r\\n        this.Canvas.strokeStyle=this.BorderColor;\\r\\n        this.Canvas.strokeRect(left,top,(right-left),(bottom-top));\\r\\n    }\\r\\n}\\r\\n\\r\\n//筹码分布\\r\\nfunction StockChip()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Name='筹码分布';\\r\\n    this.ClassName='StockChip';\\r\\n\\r\\n    this.HQChart;\\r\\n    this.PenBorder=g_JSChartResource.FrameBorderPen;    //边框\\r\\n    this.ColorProfit='rgb(255,0,0)';            //盈利的线段\\r\\n    this.ColorNoProfit='rgb(90,141,248)';       //非盈利\\r\\n    this.ColorAveragePrice='rgb(0,139,0)';   //平均价线\\r\\n    this.ColorBG='rgb(190,190,190)';           //筹码背景线段颜色\\r\\n\\r\\n    this.PixelRatio=GetDevicePixelRatio();\\r\\n    this.ShowType=0;    //0=所有筹码  1=周期前  2=周期内\\r\\n    this.IsDynamic=true;\\r\\n    this.ClientRect={};\\r\\n    this.Font=g_JSChartResource.TitleFont;\\r\\n    this.InfoColor=g_JSChartResource.StockChip.InfoColor;\\r\\n    this.DayInfoColor=g_JSChartResource.StockChip.DayInfoColor;\\r\\n    this.LineHeight=16;\\r\\n    this.Left=50*this.PixelRatio;         //左边间距\\r\\n    this.IsShowX=false;  //是否显示X刻度 成交量\\r\\n    this.ShowXCount=3;\\r\\n    this.Width=150*this.PixelRatio;       //筹码图宽度\\r\\n    this.CalculateType=0;   //0=平均分布 1=三角分布\\r\\n    this.PriceZoom=100;     //价格放大倍数\\r\\n\\r\\n    this.ButtonID=Guid();  //工具条Div id\\r\\n    this.NotSupportMessage=\\\"不支持筹码图\\\";\\r\\n\\r\\n    this.DAY_COLOR=\\r\\n        [\\r\\n            ['rgb(255,0,0)','rgb(255,128,128)','rgb(255,0,128)','rgb(255,100,0)','rgb(192,128,0)','rgb(255,192,0)'],\\r\\n            ['rgb(120,80,225)','rgb(160,160,225)','rgb(80,80,255)','rgb(120,120,255)','rgb(32,64,192)','rgb(0,64,128)'],\\r\\n        ];\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (!option) return;\\r\\n        if (option.ShowType>0) this.ShowType=option.ShowType;\\r\\n        if (option.IsShowX) this.IsShowX=option.IsShowX;\\r\\n        if (option.ShowXCount>0) this.ShowXCount=option.ShowXCount;\\r\\n        if (option.Width>100) this.Width=option.Width*GetDevicePixelRatio();\\r\\n        if (option.CalculateType>0) this.CalculateType=option.CalculateType;\\r\\n        if (IFrameSplitOperator.IsNumber(option.PriceZoom)) this.PriceZoom=option.PriceZoom;\\r\\n    }\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        this.PenBorder=g_JSChartResource.FrameBorderPen;\\r\\n        this.Font=g_JSChartResource.TitleFont;\\r\\n        this.InfoColor=g_JSChartResource.StockChip.InfoColor;\\r\\n        this.DayInfoColor=g_JSChartResource.StockChip.DayInfoColor;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.PixelRatio=GetDevicePixelRatio();\\r\\n        var left=ToFixedPoint(this.ChartBorder.GetRight()+this.Left);\\r\\n        var top=ToFixedPoint(this.ChartBorder.GetTop());\\r\\n        var right=ToFixedPoint(left+this.Width-1*this.PixelRatio);\\r\\n        var bottom=ToFixedPoint(this.ChartBorder.GetBottom());\\r\\n        var width=right-left;\\r\\n        var height=bottom-top;\\r\\n        this.ClientRect={Left:left,Top:top,Width:width,Height:height};\\r\\n\\r\\n        if (ChartData.IsTickPeriod(this.HQChart.Period))    //分笔图没有筹码\\r\\n        {\\r\\n            this.Canvas.font=this.Font;\\r\\n            this.Canvas.fillStyle=this.InfoColor;\\r\\n\\r\\n            var x=left+width/2;\\r\\n            var y=top+height/2;\\r\\n\\r\\n            this.Canvas.textAlign=\\\"center\\\";\\r\\n            this.Canvas.textBaseline=\\\"middle\\\";\\r\\n            this.Canvas.fillText(this.NotSupportMessage,x,y);\\r\\n\\r\\n            this.DrawBorder();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.CalculateChip())\\r\\n        {\\r\\n            this.DrawFrame();\\r\\n            this.DrawAllChip();\\r\\n            if (this.ShowType==1|| this.ShowType==2) this.DrawDayChip();\\r\\n\\r\\n            this.CalculateCast();   //计算成本\\r\\n            this.DrawChipInfo();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            JSConsole.Chart.Log('[StockChip::Draw] no data');\\r\\n        }\\r\\n\\r\\n        this.DrawBorder();\\r\\n        if (this.SizeChange==true) this.DrawButton();\\r\\n\\r\\n        this.SizeChange=false;\\r\\n    }\\r\\n\\r\\n    this.DrawChipInfo=function()\\r\\n    {\\r\\n        var bottom=this.ClientRect.Top+this.ClientRect.Height-1;\\r\\n        var left=this.ClientRect.Left+2;\\r\\n        var right=this.ClientRect.Left+this.ClientRect.Width;\\r\\n\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillStyle=this.InfoColor;\\r\\n        this.Canvas.textBaseline='bottom';\\r\\n        this.Canvas.textAlign='left';\\r\\n\\r\\n        var lineHeight=this.LineHeight*GetDevicePixelRatio();\\r\\n        var text='70%成本价'+ this.Data.Cast[1].MinPrice.toFixed(2)+'-'+this.Data.Cast[1].MaxPrice.toFixed(2)+'集中'+this.Data.Cast[1].Rate.toFixed(2)+'%';\\r\\n        this.Canvas.fillText(text,left,bottom);\\r\\n        bottom-=lineHeight;\\r\\n\\r\\n        text='90%成本价'+ this.Data.Cast[0].MinPrice.toFixed(2)+'-'+this.Data.Cast[0].MaxPrice.toFixed(2)+'集中'+this.Data.Cast[0].Rate.toFixed(2)+'%';;\\r\\n        this.Canvas.fillText(text,left,bottom);\\r\\n        bottom-=lineHeight;\\r\\n\\r\\n        text='平均成本：'+this.Data.ChipInfo.AveragePrice.toFixed(2)+'元';\\r\\n        this.Canvas.fillText(text,left,bottom);\\r\\n        bottom-=lineHeight;\\r\\n\\r\\n        text=+this.Data.YPrice.toFixed(2)+'处获利盘：'+this.Data.ChipInfo.YProfitRate.toFixed(2)+'%';\\r\\n        this.Canvas.fillText(text,left,bottom);\\r\\n        bottom-=lineHeight;\\r\\n\\r\\n        text='获利比例：';\\r\\n        this.Canvas.fillText(text,left,bottom);\\r\\n        var textWidth=this.Canvas.measureText(text).width+2;\\r\\n        var barLeft=left+textWidth;\\r\\n        var barWidth=(right-5-barLeft);\\r\\n        this.Canvas.strokeStyle=this.ColorNoProfit;\\r\\n        this.Canvas.strokeRect(barLeft,bottom-lineHeight,barWidth,lineHeight);\\r\\n        this.Canvas.strokeStyle=this.ColorProfit;\\r\\n        this.Canvas.strokeRect(barLeft,bottom-lineHeight,barWidth*(this.Data.ChipInfo.ProfitRate/100),lineHeight);\\r\\n        text=this.Data.ChipInfo.ProfitRate.toFixed(2)+'%';\\r\\n        this.Canvas.textAlign='center';\\r\\n        this.Canvas.fillText(text,barLeft+barWidth/2,bottom);\\r\\n        bottom-=lineHeight;\\r\\n\\r\\n        this.Canvas.textAlign='left';\\r\\n        text='成本分布,日期：'+IFrameSplitOperator.FormatDateString(this.Data.SelectData.Date);\\r\\n        if (this.Data.SelectData.Time) text+=' '+IFrameSplitOperator.FormatTimeString(this.Data.SelectData.Time);\\r\\n        this.Canvas.fillText(text,left,bottom);\\r\\n        bottom-=lineHeight;\\r\\n\\r\\n        if (this.ShowType!=1 && this.ShowType!=2) return;\\r\\n\\r\\n        var right=this.ClientRect.Left+this.ClientRect.Width-1;\\r\\n        this.Canvas.textAlign='right';\\r\\n        var textWidth=50;\\r\\n        this.Data.DayChip.sort(function(a,b){return b.Day-a.Day;})\\r\\n        for(var i in this.Data.DayChip)\\r\\n        {\\r\\n            var item=this.Data.DayChip[i];\\r\\n            var rate=0;\\r\\n            if (this.Data.ChipInfo && this.Data.ChipInfo.Vol>0) rate=item.Vol/this.Data.ChipInfo.Vol*100;\\r\\n            text=item.Day+'周期'+(this.ShowType==1?'前':'内')+'成本'+(IFrameSplitOperator.IsNumber(rate)? (rate.toFixed(2)+'%'):\\\"--.--%\\\");\\r\\n            if (i==0) textWidth=this.Canvas.measureText(text).width+8;\\r\\n            this.Canvas.fillStyle=item.Color;\\r\\n            this.Canvas.fillRect(right-textWidth,bottom-lineHeight,textWidth,lineHeight);\\r\\n\\r\\n            this.Canvas.fillStyle=this.DayInfoColor;\\r\\n            this.Canvas.fillText(text,right,bottom);\\r\\n            bottom-=lineHeight;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawDayChip=function()\\r\\n    {\\r\\n        var KLineFrame=this.HQChart.Frame.SubFrame[0].Frame;\\r\\n        for(var i in this.Data.DayChip)\\r\\n        {\\r\\n            var aryPoint=[];\\r\\n            var chipData=this.Data.DayChip[i].Chip;\\r\\n            if (!chipData) continue;\\r\\n            var totalVol=0;\\r\\n            for(var j=0;j<chipData.length;++j)\\r\\n            {\\r\\n                var vol=chipData[j];\\r\\n                if(!vol) continue;\\r\\n                totalVol+=vol;\\r\\n                var price=(j+this.Data.MinPrice)/100;\\r\\n                var y=KLineFrame.GetYFromData(price);\\r\\n                var x=(vol/this.Data.MaxVol)*this.ClientRect.Width+this.ClientRect.Left;\\r\\n                aryPoint.push({X:x,Y:y});\\r\\n            }\\r\\n            this.Data.DayChip[i].Vol=totalVol;\\r\\n            this.DrawArea(aryPoint,this.Data.DayChip[i].Color);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Clear=function()\\r\\n    {\\r\\n        var divButton=document.getElementById(this.ButtonID);\\r\\n        if (divButton) this.ChartBorder.UIElement.parentNode.removeChild(divButton);\\r\\n    }\\r\\n\\r\\n    this.DrawButton=function()  //顶部按钮\\r\\n    {\\r\\n        var divButton=document.getElementById(this.ButtonID);\\r\\n        if (!divButton)\\r\\n        {\\r\\n            divButton=document.createElement(\\\"div\\\");\\r\\n            divButton.className='klineframe-button';\\r\\n            divButton.id=this.ButtonID;\\r\\n            //为divToolbar添加属性identify\\r\\n            // divButton.setAttribute(\\\"identify\\\",this.Identify.toString());\\r\\n            this.ChartBorder.UIElement.parentNode.appendChild(divButton);\\r\\n        }\\r\\n\\r\\n        var pixelTatio = this.PixelRatio;\\r\\n        var left=this.ClientRect.Left;\\r\\n        var right=this.ClientRect.Left+this.ClientRect.Width;\\r\\n        var chartRight=this.ChartBorder.GetChartWidth();\\r\\n        var toolbarWidth=right-left;\\r\\n        var toolbarHeight=this.ChartBorder.GetTitleHeight();\\r\\n        // var left=this.ChartBorder.GetRight();\\r\\n        var top=this.ChartBorder.GetTop()/pixelTatio;\\r\\n\\r\\n        const spanStyle=\\\"<span class='{iconclass}' id='{iconid}' title='{icontitle}' style='cursor:pointer;display:inline-block;color:{iconcolor};font-size:{iconsize}px'></span>\\\";\\r\\n        const ICON_LIST=\\r\\n            [\\r\\n                {Class:'chip_default icon iconfont icon-chip_default', ID:'chip_default',Color:['#808080','#FF0000'],Title:'默认筹码分布图'},\\r\\n                {Class:'chip_long icon iconfont icon-chip_date',ID:'chip_long',Color:['#808080','#FF8000'],Title:'远期筹码分布图'},\\r\\n                {Class:'chip_recent icon iconfont icon-chip_date',ID:'chip_recent', Color:['#808080','#0000CC'],Title:'近期筹码分布图'}\\r\\n            ];\\r\\n\\r\\n        var spanHtml='';\\r\\n        for(var i in ICON_LIST)\\r\\n        {\\r\\n            var item=ICON_LIST[i];\\r\\n            var spanItem=spanStyle;\\r\\n            spanItem=spanItem.replace('{iconclass}',item.Class);\\r\\n            spanItem=spanItem.replace('{iconid}',item.ID);\\r\\n            spanItem=spanItem.replace('{iconcolor}',item.Color[i==this.ShowType?1:0]);\\r\\n            spanItem=spanItem.replace('{iconsize}',toolbarHeight);\\r\\n            spanItem=spanItem.replace('{icontitle}',item.Title);\\r\\n\\r\\n            if (spanHtml.length>0) spanHtml+='&nbsp;&nbsp;';\\r\\n            spanHtml+=spanItem;\\r\\n        }\\r\\n\\r\\n        divButton.style.right = Math.floor((chartRight-right+2)/pixelTatio) + \\\"px\\\";\\r\\n        divButton.style.top = top + \\\"px\\\";\\r\\n        //divButton.style.width=toolbarWidth+\\\"px\\\";\\r\\n        divButton.style.height=toolbarHeight+'px';\\r\\n        divButton.innerHTML=spanHtml;\\r\\n\\r\\n        var self = this;\\r\\n        for(var i in ICON_LIST)\\r\\n        {\\r\\n            var item=ICON_LIST[i];\\r\\n            $(\\\"#\\\"+this.ButtonID+\\\" .\\\"+item.ID).click(\\r\\n                {\\r\\n                    IconID:item.ID,\\r\\n                    ShowType:i\\r\\n                },\\r\\n                function (event)\\r\\n                {\\r\\n                    var id=event.data.IconID;\\r\\n                    var showType=event.data.ShowType;\\r\\n                    self.ShowType=showType;\\r\\n                    if (self.HQChart) self.HQChart.Draw();\\r\\n\\r\\n                    for(var i in ICON_LIST)\\r\\n                    {\\r\\n                        var item=ICON_LIST[i];\\r\\n                        var style=$(\\\"#\\\"+self.ButtonID+\\\" .\\\"+item.ID)[0].style;\\r\\n                        style['color']=item.Color[i==showType?1:0];\\r\\n                    }\\r\\n                }\\r\\n            )\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawAllChip=function()\\r\\n    {\\r\\n        var KLineFrame=this.HQChart.Frame.SubFrame[0].Frame;\\r\\n        var selectPrice=this.Data.SelectData.Close;\\r\\n        var aryProfitPoint=[];\\r\\n        var aryNoProfitPoint=[];\\r\\n        var totalVol=0,totalAmount=0,totalProfitVol=0, totalYProfitVol=0;   //总的成交量, 总的成交金额, 总的盈利的成交量\\r\\n        var yPrice=this.Data.YPrice;\\r\\n\\r\\n        var maxPrice=KLineFrame.HorizontalMax;\\r\\n        var minPrice=KLineFrame.HorizontalMin;\\r\\n\\r\\n        var MaxVol=1;\\r\\n        for(var i=0;i<this.Data.AllChip.length;++i)\\r\\n        {\\r\\n            var vol=this.Data.AllChip[i];\\r\\n            if(!vol) continue;\\r\\n            var price=(i+this.Data.MinPrice)/this.PriceZoom;\\r\\n            totalVol+=vol;\\r\\n            totalAmount+=price*vol;\\r\\n\\r\\n            if (price<yPrice) totalYProfitVol+=vol;     //获利的成交量\\r\\n            if (price<selectPrice) totalProfitVol+=vol; //鼠标当前位置 获利的成交量\\r\\n\\r\\n            if (price<=maxPrice && price>=minPrice)\\r\\n            {\\r\\n                if (MaxVol<vol) MaxVol=vol;\\r\\n            }\\r\\n        }\\r\\n        this.Data.MaxVol=MaxVol;    //把成交量最大值替换成 当前屏成交量最大值\\r\\n\\r\\n        for(var i=0;i<this.Data.AllChip.length;++i)\\r\\n        {\\r\\n            var vol=this.Data.AllChip[i];\\r\\n            if(!vol) continue;\\r\\n            var price=(i+this.Data.MinPrice)/this.PriceZoom;\\r\\n            if (price>maxPrice || price<minPrice) continue;\\r\\n\\r\\n            var y=KLineFrame.GetYFromData(price);\\r\\n            var x=(vol/this.Data.MaxVol)*this.ClientRect.Width+this.ClientRect.Left;\\r\\n\\r\\n            if (price<selectPrice) aryProfitPoint.push({X:x,Y:y});\\r\\n            else aryNoProfitPoint.push({X:x,Y:y});\\r\\n        }\\r\\n\\r\\n        this.Data.ChipInfo=\\r\\n            {\\r\\n                Vol:totalVol, AveragePrice:totalAmount/totalVol, ProfitVol:totalProfitVol,\\r\\n                ProfitRate:totalVol>0?totalProfitVol/totalVol*100:0,\\r\\n                YProfitRate:totalVol>0?totalYProfitVol/totalVol*100:0\\r\\n            };\\r\\n\\r\\n        if (this.ShowType==0)\\r\\n        {\\r\\n            this.DrawLines(aryProfitPoint,this.ColorProfit);\\r\\n            this.DrawLines(aryNoProfitPoint,this.ColorNoProfit);\\r\\n            var averagePrice=this.Data.ChipInfo.AveragePrice;\\r\\n            if (averagePrice>0 && averagePrice<=maxPrice && averagePrice>=minPrice)\\r\\n            {\\r\\n                averagePrice=averagePrice.toFixed(2);\\r\\n                this.DrawAveragePriceLine(aryProfitPoint,aryNoProfitPoint,KLineFrame.GetYFromData(averagePrice),this.ColorAveragePrice);\\r\\n            }\\r\\n        }\\r\\n        else    //在火焰山模式下, 筹码用一个颜色\\r\\n        {\\r\\n            this.DrawLines(aryProfitPoint,this.ColorBG);\\r\\n            this.DrawLines(aryNoProfitPoint,this.ColorBG);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateCast=function()   //计算 90% 70%的成本价\\r\\n    {\\r\\n        if (!this.Data.ChipInfo || !this.Data.ChipInfo.Vol) return;\\r\\n\\r\\n        var aryCast=\\r\\n            [\\r\\n                {Start:0.05,End:0.95, MaxPrice:0, MinPrice:0, Rate:0},\\r\\n                {Start:0.15,End:0.85, MaxPrice:0, MinPrice:0, Rate:0}\\r\\n            ];\\r\\n\\r\\n        var averagePrice=this.Data.ChipInfo.AveragePrice;\\r\\n        var totalProfitVol=this.Data.ChipInfo.ProfitVol;\\r\\n        var tempVol=0;\\r\\n        for(var i=0, castCount=0;i<this.Data.AllChip.length;++i)\\r\\n        {\\r\\n            if (castCount==4) break;\\r\\n            var vol=this.Data.AllChip[i];\\r\\n            if (vol<=0) continue;\\r\\n\\r\\n            var price=(i+this.Data.MinPrice)/this.PriceZoom;\\r\\n            tempVol+=vol;\\r\\n            var rate=tempVol/totalProfitVol;\\r\\n\\r\\n            for(var j in aryCast)\\r\\n            {\\r\\n                var itemCast=aryCast[j];\\r\\n                if (itemCast.MinPrice<=0 && rate>itemCast.Start)\\r\\n                {\\r\\n                    itemCast.MinPrice=price;\\r\\n                    ++castCount;\\r\\n                }\\r\\n\\r\\n                if (itemCast.MaxPrice<=0 && rate>itemCast.End)\\r\\n                {\\r\\n                    itemCast.MaxPrice=price;\\r\\n                    ++castCount;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in aryCast)\\r\\n        {\\r\\n            var item=aryCast[i];\\r\\n            var addPrice=item.MaxPrice+item.MinPrice;\\r\\n            if (addPrice) item.Rate=Math.abs(item.MaxPrice-item.MinPrice)/addPrice*100;\\r\\n        }\\r\\n\\r\\n        this.Data.Cast=aryCast;\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function(aryPoint,color)\\r\\n    {\\r\\n        if (aryPoint.length<=0) return;\\r\\n\\r\\n        this.Canvas.fillStyle=color;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(this.ClientRect.Left,aryPoint[0].Y);\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            this.Canvas.lineTo(item.X,item.Y);\\r\\n        }\\r\\n        this.Canvas.lineTo(this.ClientRect.Left,aryPoint[aryPoint.length-1].Y);\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.DrawLines=function(aryPoint,color)\\r\\n    {\\r\\n        if (aryPoint.length<=0) return;\\r\\n        this.Canvas.strokeStyle=color;\\r\\n        this.Canvas.beginPath();\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            this.Canvas.moveTo(this.ClientRect.Left,item.Y);\\r\\n            this.Canvas.lineTo(item.X,item.Y);\\r\\n        }\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawAveragePriceLine=function(aryProfitPoint,aryNoProfitPoint,y,color)\\r\\n    {\\r\\n        for(var i in aryProfitPoint)\\r\\n        {\\r\\n            var item=aryProfitPoint[i];\\r\\n            if (item.Y==y)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=color;\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(this.ClientRect.Left,item.Y);\\r\\n                this.Canvas.lineTo(item.X,item.Y);\\r\\n                this.Canvas.stroke();\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in aryNoProfitPoint)\\r\\n        {\\r\\n            var item=aryNoProfitPoint[i];\\r\\n            if (item.Y==y)\\r\\n            {\\r\\n                this.Canvas.strokeStyle=color;\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(this.ClientRect.Left,item.Y);\\r\\n                this.Canvas.lineTo(item.X,item.Y);\\r\\n                this.Canvas.stroke();\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawBorder=function()\\r\\n    {\\r\\n        this.Canvas.strokeStyle=this.PenBorder;\\r\\n        this.Canvas.strokeRect(this.ClientRect.Left,this.ClientRect.Top,this.ClientRect.Width,this.ClientRect.Height);\\r\\n    }\\r\\n\\r\\n    this.EvenlyDistribute=function(aryChip, data)    //平均分布 data={Low, High, Vol, MaxVol, MaxPrice, MinPrice }\\r\\n    {\\r\\n        var low=data.Low, high=data.High, maxPrice=data.MaxPrice, minPrice=data.MinPrice, maxVol=1;\\r\\n        if ( (high-low)== 0) return;\\r\\n        var averageVol=data.Vol/(high-low);\\r\\n\\r\\n        for(var j=low;j<=high && j<=maxPrice;++j)\\r\\n        {\\r\\n            var index=j-minPrice;\\r\\n            aryChip[index]+=averageVol;\\r\\n            if (maxVol<aryChip[index]) maxVol=aryChip[index];\\r\\n        }\\r\\n\\r\\n        data.MaxVol=maxVol;\\r\\n    }\\r\\n\\r\\n    this.TriangleDistribute=function(aryChip, data)  //三角分布\\r\\n    {\\r\\n        var low=data.Low, high=data.High, maxPrice=data.MaxPrice, minPrice=data.MinPrice, maxVol=1;\\r\\n        var ANGLE = 45, PI=3.1415926535;\\r\\n        var middlePrice = (high - low) / 2.0 + low;\\r\\n\\r\\n        var totalValue=0;\\r\\n        var aryVol=[];\\r\\n        for(var i=low+1, j=1 ;i<=middlePrice;++i,++j)\\r\\n        {\\r\\n            var y = Math.tan(ANGLE* PI / 180)*j;\\r\\n\\r\\n            totalValue+=y;\\r\\n            aryVol.push({Index:i-minPrice, Value:y});\\r\\n        }\\r\\n\\r\\n        for(var i=high-1, j=1 ;i>middlePrice;--i,++j)\\r\\n        {\\r\\n            var y = Math.tan(ANGLE* PI / 180)*j;\\r\\n\\r\\n            totalValue+=y\\r\\n            aryVol.push({Index:i-minPrice, Value:y});\\r\\n        }\\r\\n\\r\\n        if (totalValue>0)\\r\\n        {\\r\\n            for(var i=0;i<aryVol.length;++i)\\r\\n            {\\r\\n                var item=aryVol[i];\\r\\n                aryChip[item.Index]+=item.Value*data.Vol/totalValue;\\r\\n                if (maxVol<aryChip[item.Index]) maxVol=aryChip[item.Index];\\r\\n            }\\r\\n\\r\\n            data.MaxVol=maxVol;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateDistribute=function(aryChip, data)\\r\\n    {\\r\\n        if (this.CalculateType==1) this.TriangleDistribute(aryChip, data);\\r\\n        else this.EvenlyDistribute(aryChip, data);\\r\\n    }\\r\\n\\r\\n    this.CalculateChip=function()   //计算筹码\\r\\n    {\\r\\n        if (!this.HQChart) return false;\\r\\n        if (!this.HQChart.FlowCapitalReady) return false;\\r\\n        var symbol=this.HQChart.Symbol;\\r\\n        if (!symbol) return false;\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZIndex(symbol)) return false;   //指数暂时不支持移动筹码\\r\\n\\r\\n        var bindData=this.HQChart.ChartPaint[0].Data;\\r\\n        //if (bindData.Period>=4) return false;   //分钟K线不支持, 没时间做,以后再做吧\\r\\n        var count=bindData.DataOffset+parseInt(this.HQChart.CursorIndex);\\r\\n        if (count>=bindData.Data.length) count=bindData.Data.length-1;\\r\\n        var selData=bindData.Data[count];\\r\\n        var yPrice=selData.Close;\\r\\n\\r\\n        var mouseY=this.HQChart.LastPoint.Y;\\r\\n        if (mouseY) yPrice=this.HQChart.Frame.SubFrame[0].Frame.GetYData(mouseY);\\r\\n\\r\\n        //JSConsole.Chart.Log(\\\"[StockChip::CalculateChip]\\\",count,this.HQChart.CursorIndex,selData);\\r\\n        const rate=1;\\r\\n        var aryVol=[];\\r\\n        var seed=1,vol,maxPrice,minPrice;\\r\\n        for(let i=count;i>=0;--i)\\r\\n        {\\r\\n            var item=bindData.Data[i];\\r\\n            var changeRate=1;   //换手率\\r\\n            if (item.FlowCapital>0) changeRate=item.Vol/item.FlowCapital;\\r\\n            if (i==count) vol=item.Vol*changeRate;\\r\\n            else vol=item.Vol*seed;\\r\\n            var dataItem={Vol:vol,High:item.High,Low:item.Low};\\r\\n            aryVol.push(dataItem);\\r\\n            seed*=(1-changeRate*rate);\\r\\n\\r\\n            if (!maxPrice || maxPrice<item.High) maxPrice=item.High;\\r\\n            if (!minPrice || minPrice>item.Low) minPrice=item.Low;\\r\\n        }\\r\\n\\r\\n        //JSConsole.Chart.Log(\\\"[StockChip::CalculateChip]\\\",maxPrice,minPrice);\\r\\n        if (!maxPrice || !minPrice) return true;\\r\\n\\r\\n        var priceZoom=this.PriceZoom;\\r\\n\\r\\n        maxPrice=parseInt(maxPrice*priceZoom);\\r\\n        minPrice=parseInt(minPrice*priceZoom);\\r\\n\\r\\n        var dataCount=maxPrice-minPrice;\\r\\n        var aryChip=new Array()\\r\\n        for(let i=0;i<=dataCount;++i)\\r\\n        {\\r\\n            aryChip.push(0);\\r\\n        }\\r\\n\\r\\n        var dayChip=[];\\r\\n        var distributeData;\\r\\n        if (this.ShowType==2)\\r\\n        {\\r\\n            var dayChip=\\r\\n                [\\r\\n                    {Day:100, Color:this.DAY_COLOR[1][5]}, {Day:60, Color:this.DAY_COLOR[1][4]}, {Day:30, Color:this.DAY_COLOR[1][3]},\\r\\n                    {Day:20, Color:this.DAY_COLOR[1][2]}, {Day:10, Color:this.DAY_COLOR[1][1]}, {Day:5, Color:this.DAY_COLOR[1][0]}\\r\\n                ];\\r\\n            for(let i in aryVol)\\r\\n            {\\r\\n                var item=aryVol[i];\\r\\n                var high=parseInt(item.High*priceZoom);\\r\\n                var low=parseInt(item.Low*priceZoom);\\r\\n                var averageVol=item.Vol;\\r\\n                if (high-low>0) averageVol=item.Vol/(high-low);\\r\\n                if (averageVol<=0.000000001) continue;\\r\\n\\r\\n                for(var k=0;k<dayChip.length;++k)\\r\\n                {\\r\\n                    if (i==dayChip[k].Day)\\r\\n                    {\\r\\n                        dayChip[k].Chip=aryChip.slice(0);\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                distributeData={Low:low, High:high, Vol:item.Vol, MaxPrice:maxPrice, MinPrice:minPrice};\\r\\n                this.CalculateDistribute(aryChip, distributeData );\\r\\n            }\\r\\n        }\\r\\n        else if (this.ShowType==1)\\r\\n        {\\r\\n            var dayChip=\\r\\n                [\\r\\n                    {Day:5, Color:this.DAY_COLOR[0][0]},{Day:10, Color:this.DAY_COLOR[0][1]},{Day:20, Color:this.DAY_COLOR[0][2]},\\r\\n                    {Day:30, Color:this.DAY_COLOR[0][3]},{Day:60, Color:this.DAY_COLOR[0][4]},{Day:100, Color:this.DAY_COLOR[0][5]}\\r\\n                ];\\r\\n\\r\\n            for(let i=aryVol.length-1;i>=0;--i)\\r\\n            {\\r\\n                var item=aryVol[i];\\r\\n                var high=parseInt(item.High*priceZoom);\\r\\n                var low=parseInt(item.Low*priceZoom);\\r\\n                var averageVol=item.Vol;\\r\\n                if (high-low>0) averageVol=item.Vol/(high-low);\\r\\n                if (averageVol<=0.000000001) continue;\\r\\n\\r\\n                for(var k=0;k<dayChip.length;++k)\\r\\n                {\\r\\n                    if (i==dayChip[k].Day)\\r\\n                    {\\r\\n                        dayChip[k].Chip=aryChip.slice(0);\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                distributeData={Low:low, High:high, Vol:item.Vol, MaxPrice:maxPrice, MinPrice:minPrice};\\r\\n                this.CalculateDistribute(aryChip, distributeData);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(let i in aryVol)\\r\\n            {\\r\\n                var item=aryVol[i];\\r\\n                var high=parseInt(item.High*priceZoom);\\r\\n                var low=parseInt(item.Low*priceZoom);\\r\\n                var averageVol=item.Vol;\\r\\n                if (high-low>0) averageVol=item.Vol/(high-low);\\r\\n                if (averageVol<=0.000000001) continue;\\r\\n\\r\\n                distributeData={Low:low, High:high, Vol:item.Vol, MaxPrice:maxPrice, MinPrice:minPrice};\\r\\n                this.CalculateDistribute(aryChip, distributeData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Data={AllChip:aryChip, MaxVol:distributeData.MaxVol, MaxPrice:maxPrice, MinPrice:minPrice,SelectData:selData, DayChip:dayChip, YPrice:yPrice};\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.DrawFrame=function()  //X轴成交量坐标\\r\\n    {\\r\\n        if (this.IsShowX==false) return;\\r\\n        if (this.Data.MaxVol<=0) return;\\r\\n\\r\\n        var isDrawXFrame=this.HQChart.Frame.SubFrame.length===1 ? false:true;         //是否画X轴,如果只有1个窗口就不画\\r\\n        var KLineFrame=this.HQChart.Frame.SubFrame[0].Frame;\\r\\n        var chartBorder=KLineFrame.ChartBorder;\\r\\n        var bottom=ToFixedPoint(chartBorder.GetBottomEx()+1);\\r\\n        if (!isDrawXFrame) bottom=this.ClientRect.Top+this.ClientRect.Height;\\r\\n        var left=this.ClientRect.Left;\\r\\n        var right=left+this.ClientRect.Width;\\r\\n\\r\\n        this.Canvas.strokeStyle=this.PenBorder;\\r\\n        this.Canvas.beginPath();\\r\\n        if (isDrawXFrame)\\r\\n        {\\r\\n            this.Canvas.moveTo(left,bottom);\\r\\n            this.Canvas.lineTo(right,bottom);\\r\\n        }\\r\\n\\r\\n        var showCount=this.ShowXCount;\\r\\n        var maxValue=this.Data.MaxVol;\\r\\n        var perValue=Math.floor(maxValue/showCount);\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.textBaseline='top';\\r\\n        this.Canvas.fillStyle=this.InfoColor;\\r\\n        var xOffset=10*GetDevicePixelRatio();\\r\\n        for(var i=1;i<=showCount;++i)\\r\\n        {\\r\\n            var vol=perValue*i;\\r\\n            var x=(vol/this.Data.MaxVol)*this.ClientRect.Width+this.ClientRect.Left;\\r\\n            x=ToFixedPoint(x);\\r\\n            if (i==showCount)   //最后一个刻度不要画线了\\r\\n            {\\r\\n                this.Canvas.textAlign='right';\\r\\n                var text=IFrameSplitOperator.FormatValueString(maxValue, 1);\\r\\n                this.Canvas.fillText(text,x,bottom+2);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(x,this.ClientRect.Top);\\r\\n                this.Canvas.lineTo(x,bottom);\\r\\n\\r\\n                this.Canvas.textAlign='center';\\r\\n\\r\\n                var text=IFrameSplitOperator.FormatValueString(vol, 1);\\r\\n                var textWidth=this.Canvas.measureText(text).width;\\r\\n                this.Canvas.fillText(text,Math.floor(x-textWidth*0.25),bottom+2);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具条\\r\\nfunction DrawToolsButton()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='DrawToolsButton';\\r\\n    this.HQChart;\\r\\n    this.ID=Guid();\\r\\n    this.ToolsDiv;\\r\\n    // this.Color='rgb(105,105,105)';    //颜色\\r\\n    this.Color = \\\"#696969\\\";        //input type=\\\"color\\\"不支持rgb的颜色格式\\r\\n\\r\\n    //this.Left=5;\\r\\n    this.Top=5*GetDevicePixelRatio();\\r\\n    this.Width=45*GetDevicePixelRatio();         //宽度\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        if (!option) return;\\r\\n        if (option.Width>10) this.Width=option.Width*pixelRatio;\\r\\n    }\\r\\n\\r\\n    this.Clear=function()\\r\\n    {\\r\\n        if (this.ToolsDiv) this.ChartBorder.UIElement.parentNode.removeChild(this.ToolsDiv);\\r\\n    }\\r\\n\\r\\n    this.Draw = function () {\\r\\n        if (this.SizeChange == false) return;\\r\\n\\r\\n        //工具列表\\r\\n        const TOOL_LIST =\\r\\n            [\\r\\n                [\\r\\n                    { HTML: { Title: '线段', IClass: 'iconfont icon-draw_line', ID: 'icon-segment' }, Name: '线段' },\\r\\n                    { HTML: { Title: '尺子', IClass: 'iconfont icon-ruler', ID: 'icon_ruler' }, Name: '尺子' },\\r\\n                    { HTML: { Title: '射线', IClass: 'iconfont icon-draw_rays', ID: 'icon-beam' }, Name: '射线' },\\r\\n                    { HTML: { Title: '标价线', IClass: 'iconfont icon-price_line', ID: 'icon-price-line' }, Name: '标价线' },\\r\\n                    { HTML: { Title: '垂直线', IClass: 'iconfont icon-vertical_line', ID: 'icon-vertical-line' }, Name: '垂直线' },\\r\\n                    { HTML: { Title: '箭头', IClass: 'iconfont icon-draw_rays', ID: 'icon-beam2' }, Name: '箭头' },\\r\\n                    { HTML: { Title: '趋势线', IClass: 'iconfont icon-draw_trendline', ID: 'icon-trendline' }, Name: '趋势线' },\\r\\n                    { HTML: { Title: '水平线', IClass: 'iconfont icon-draw_hline', ID: 'icon-hline' }, Name: '水平线' },\\r\\n                    { HTML: { Title: '水平线段', IClass: 'iconfont icon-draw_hlinesegment', ID: 'icon-hlineseg' }, Name: '水平线段' },\\r\\n                    { HTML: { Title: '平行射线', IClass: 'iconfont icon-draw_p_rays_lines', ID: 'icon-rayslineseg' }, Name: '平行射线' },\\r\\n                    { HTML: { Title: '平行线', IClass: 'iconfont icon-draw_parallel_lines', ID: 'icon-parallellines' }, Name: '平行线' },\\r\\n                    { HTML: { Title: '平行通道', IClass: 'iconfont icon-draw_parallelchannel', ID: 'icon-parallelchannel' }, Name: '平行通道' },\\r\\n                    { HTML: { Title: '价格通道线', IClass: 'iconfont icon-draw_pricechannel', ID: 'icon-pricechannel' }, Name: '价格通道线' },\\r\\n                    { HTML: { Title: 'M头W底', IClass: 'iconfont icon-draw_wavemw', ID: 'icon-wavemw' }, Name: 'M头W底' },\\r\\n                    { HTML: { Title: '头肩型', IClass: 'iconfont icon-draw_head_shoulders_bt', ID: 'icon-Head-Shoulders' }, Name: '头肩型' },\\r\\n                    { HTML: { Title: '波浪尺', IClass: 'iconfont icon-waveruler', ID: 'icon-wave-ruler' }, Name: '波浪尺' },\\r\\n                    { HTML: { Title: 'AB波浪尺', IClass: 'iconfont icon-waveruler', ID: 'icon-wave-ruler' }, Name: 'AB波浪尺' },\\r\\n                    { HTML: { Title: '箱型线', IClass: 'iconfont icon-draw_box', ID: 'icon-drawbox' }, Name: '箱型线' },\\r\\n                ],\\r\\n                [\\r\\n                    { HTML: { Title: '圆弧', IClass: 'iconfont icon-draw_arc', ID: 'icon-arc' }, Name: '圆弧线' },\\r\\n                    { HTML: { Title: '矩形', IClass: 'iconfont icon-rectangle', ID: 'icon-rect' }, Name: '矩形' },\\r\\n                    { HTML: { Title: '平行四边形', IClass: 'iconfont icon-draw_quadrangle', ID: 'icon-quad' }, Name: '平行四边形' },\\r\\n                    { HTML: { Title: '三角形', IClass: 'iconfont icon-draw_triangle', ID: 'icon-triangle' }, Name: '三角形' },\\r\\n                    { HTML: { Title: '圆', IClass: 'iconfont icon-draw_circle', ID: 'icon-circle' }, Name: '圆' },\\r\\n                    { HTML: { Title: '对称角度', IClass: 'iconfont icon-draw_symangle', ID: 'icon-symangle' }, Name: '对称角度' },\\r\\n                ],\\r\\n                [\\r\\n                    { HTML: { Title: '文本', IClass: 'iconfont icon-draw_text', ID: 'icon-text' }, Name: '文本' },\\r\\n                    { HTML: { Title: '向上箭头', IClass: 'iconfont icon-arrow_up', ID: 'icon-arrowup' }, Name: 'icon-arrow_up' },\\r\\n                    { HTML: { Title: '向下箭头', IClass: 'iconfont icon-arrow_down', ID: 'icon-arrowdown' }, Name: 'icon-arrow_down' },\\r\\n                    { HTML: { Title: '向左箭头', IClass: 'iconfont icon-arrow_left', ID: 'icon-arrowleft' }, Name: 'icon-arrow_left' },\\r\\n                    { HTML: { Title: '向右箭头', IClass: 'iconfont icon-arrow_right', ID: 'icon-arrowright' }, Name: 'icon-arrow_right' },\\r\\n                ],\\r\\n                [\\r\\n                    { HTML: { Title: '江恩角度线', IClass: 'iconfont icon-draw_gannfan', ID: 'icon-gannfan' }, Name: '江恩角度线' },\\r\\n                    { HTML: { Title: '斐波那契周期线', IClass: 'iconfont icon-draw_fibonacci', ID: 'icon-fibonacci' }, Name: '斐波那契周期线' },\\r\\n                    { HTML: { Title: '阻速线', IClass: 'iconfont icon-draw_resline', ID: 'icon-resline' }, Name: '阻速线' },\\r\\n                    { HTML: { Title: '黄金分割', IClass: 'iconfont icon-draw_goldensection', ID: 'icon-goldensection' }, Name: '黄金分割' },\\r\\n                    { HTML: { Title: '百分比线', IClass: 'iconfont icon-draw_percentage', ID: 'icon-percentage' }, Name: '百分比线' },\\r\\n                    { HTML: { Title: '波段线', IClass: 'iconfont icon-draw_waveband', ID: 'icon-waveband' }, Name: '波段线' },\\r\\n                    { HTML: { Title: '线形回归线', IClass: 'iconfont icon-linear_3', ID: 'icon-waveband2' }, Name: '线形回归线' },\\r\\n                    { HTML: { Title: '线形回归带', IClass: 'iconfont icon-linear_1', ID: 'icon-waveband3' }, Name: '线形回归带' },\\r\\n                    { HTML: { Title: '延长线形回归带', IClass: 'iconfont icon-linear_2', ID: 'icon-waveband5' }, Name: '延长线形回归带' },\\r\\n                ],\\r\\n                [{ HTML: { Title: '全部删除', IClass: 'iconfont icon-recycle_bin', ID: 'icon-delete' }, Name: '全部删除' }]\\r\\n            ];\\r\\n\\r\\n        var hqChart = this.HQChart;\\r\\n\\r\\n        if (!this.ToolsDiv) {\\r\\n            var div = document.createElement(\\\"div\\\");\\r\\n            div.className = 'drawtools';\\r\\n            div.id = this.ID;\\r\\n\\r\\n            var spanList = \\\"\\\";  //一层菜单\\r\\n            var menuTwoList = \\\"\\\"; //二层菜单\\r\\n            var menuOne = new Array();\\r\\n            TOOL_LIST.forEach(function(item,index){\\r\\n                menuOne.push(item[0]);\\r\\n            });\\r\\n            for (var i = 0; i < TOOL_LIST.length; i++) {\\r\\n                var itemOut = menuOne[i];\\r\\n                var itemIn = TOOL_LIST[i];\\r\\n                var menuTwoStr = \\\"\\\";\\r\\n                var contentArrow = \\\"\\\";\\r\\n                for (var j = 0; j < itemIn.length; j++) {\\r\\n                    var currentItem = itemIn[j];\\r\\n                    var menuTwoName = currentItem.Name;\\r\\n                    if(menuTwoName.indexOf('up') > -1){\\r\\n                        menuTwoName = \\\"向上箭头\\\";\\r\\n                    }else if(menuTwoName.indexOf('down') > -1){\\r\\n                        menuTwoName = \\\"向下箭头\\\";\\r\\n                    }else if(menuTwoName.indexOf('left') > -1){\\r\\n                        menuTwoName = \\\"向左箭头\\\";\\r\\n                    }else if(menuTwoName.indexOf('right') > -1){\\r\\n                        menuTwoName = \\\"向右箭头\\\";\\r\\n                    }\\r\\n                    menuTwoStr += '<p class=\\\"menuTwoItem ' + currentItem.HTML.ID + '\\\">' + menuTwoName + '<i class=\\\"' + currentItem.HTML.IClass + '\\\" title=\\\"' + currentItem.HTML.Title + '\\\"></i></p>';\\r\\n                }\\r\\n                if (i !== TOOL_LIST.length - 1) { //不是“全部删除”项\\r\\n                    menuTwoList = '<div class=\\\"menuTwo\\\">' + menuTwoStr + '</div>';\\r\\n                    contentArrow = '<i class=\\\"contentArrow iconfont icon-menu_arraw_left\\\"></i>';\\r\\n                } else {\\r\\n                    menuTwoList = \\\"\\\";\\r\\n                    contentArrow = \\\"\\\";\\r\\n                }\\r\\n\\r\\n                var spanNode = '<div class=\\\"icon-image ' + 'first-' + itemOut.HTML.ID + '\\\"><i class=\\\"' + itemOut.HTML.IClass + '\\\" title=\\\"' + itemOut.HTML.Title + '\\\"></i>' + menuTwoList + contentArrow +'</div>';\\r\\n                spanList += spanNode;\\r\\n            }\\r\\n            this.ChartBorder.UIElement.parentNode.appendChild(div);\\r\\n\\r\\n            div.innerHTML = spanList;\\r\\n            this.ToolsDiv = div;\\r\\n\\r\\n            for (var i in TOOL_LIST) {\\r\\n                var item = TOOL_LIST[i][0];\\r\\n                $('#' + this.ID + \\\" .first-\\\" + item.HTML.ID).hover(function(){  //箭头的旋转过渡\\r\\n                    $(\\\".drawtools\\\").find(\\\".contentArrow\\\").hide();\\r\\n                    $(this).find(\\\".contentArrow\\\").removeClass(\\\"trans\\\").show();\\r\\n                });\\r\\n                $('#' + this.ID + \\\" .first-\\\" + item.HTML.ID+\\\" .contentArrow\\\").click(function(event){ //点击三角展示二级菜单\\r\\n                    event.stopPropagation();\\r\\n                    $(\\\".drawtools\\\").find(\\\".menuTwo\\\").hide();\\r\\n                    $(this).siblings('.menuTwo').show();\\r\\n                });\\r\\n                $('#' + this.ID + \\\" .first-\\\" + item.HTML.ID+\\\" .trans\\\").click(function(){ //点击三角隐藏二级菜单\\r\\n                    event.stopPropagation();\\r\\n                    $(this).siblings('.menuTwo').hide();\\r\\n                });\\r\\n\\r\\n\\r\\n                if (item.Name == '全部删除') {\\r\\n                    $('#' + this.ID + \\\" .first-icon-delete\\\").click(function () {\\r\\n                        $(\\\".drawtools\\\").find(\\\".menuTwo\\\").hide();\\r\\n                        $(this).siblings().removeClass('active');\\r\\n                        $(this).addClass('active');\\r\\n                        hqChart.ClearChartDrawPicture();\\r\\n                        $(\\\".subTolls\\\").css(\\\"display\\\", \\\"none\\\");\\r\\n                    });\\r\\n                }\\r\\n                else {\\r\\n                    $('#' + this.ID + \\\" .first-\\\" + menuOne[i].HTML.ID).click( //一层菜单类名是：“first-”+item.HTML.ID\\r\\n                        {\\r\\n                            // DrawName: menuOne[i].Name,  //把画法名字传进去\\r\\n                            CurrentIndex:i\\r\\n                        },\\r\\n                        function (event) {\\r\\n                            $(\\\".drawtools\\\").find(\\\".menuTwo\\\").hide();\\r\\n                            $(this).siblings().removeClass('active');\\r\\n                            $(this).addClass('active');\\r\\n                            hqChart.CreateChartDrawPicture(menuOne[event.data.CurrentIndex].Name);\\r\\n                        }\\r\\n                    );\\r\\n                    for (var j in TOOL_LIST[i]) {\\r\\n                        var itemTwo = TOOL_LIST[i][j];\\r\\n                        let classname = itemTwo.HTML.IClass;  //闭包问题\\r\\n                        $('#' + this.ID + ' .' + itemTwo.HTML.ID).hover(function(event){\\r\\n                            event.stopPropagation();\\r\\n                            $(this).closest('.icon-image').find(\\\".contentArrow\\\").addClass(\\\"trans\\\");\\r\\n                        });\\r\\n                        $('#' + this.ID + ' .' + itemTwo.HTML.ID).click(//二层菜单\\r\\n                            {\\r\\n                                DrawName: itemTwo.Name,  //把画法名字传进去\\r\\n                                CurrentIndex:i,\\r\\n                                CurrentData:itemTwo\\r\\n                            },\\r\\n                            function (event) {\\r\\n                                event.stopPropagation();\\r\\n                                $(this).closest('.icon-image').find(\\\".contentArrow\\\").hide();\\r\\n                                $(this).siblings().removeClass(\\\"current\\\");\\r\\n                                $(this).addClass(\\\"current\\\");\\r\\n                                $(this).closest('.icon-image').children('i').eq(0).removeClass().addClass(classname,\\\"active\\\").attr('title',event.data.CurrentData.HTML.Title);\\r\\n                                menuOne.splice(event.data.CurrentIndex,1,event.data.CurrentData);\\r\\n                                $(this).parent().hide();\\r\\n                                hqChart.CreateChartDrawPicture(event.data.DrawName);\\r\\n                            }\\r\\n                        );\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n        var curID = this.ID;\\r\\n        $(document).click(function(event){\\r\\n            if(!($(\\\"#\\\"+curID).is(event.target)) && ($(\\\"#\\\"+curID).has(event.target).length === 0)){\\r\\n                $(\\\"#\\\"+curID+\\\" .menuTwo\\\").hide();\\r\\n                $(\\\"#\\\"+curID+\\\" .contentArrow\\\").hide();\\r\\n            }\\r\\n        });\\r\\n        var scrollPos = GetScrollPosition();\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        // var left=this.ChartBorder.GetChartWidth()-this.Right-this.ToolsWidth;\\r\\n        var left=ToFixedPoint(this.ChartBorder.GetRight()+this.Left);\\r\\n        // var top = this.Top+this.ChartBorder.UIElement.getBoundingClientRect().top+scrollPos.Top;\\r\\n        var top = this.ChartBorder.GetTop();\\r\\n        this.ToolsDiv.style.left = left/pixelRatio + \\\"px\\\";\\r\\n        this.ToolsDiv.style.top = top/pixelRatio + \\\"px\\\";\\r\\n        this.ToolsDiv.style.width = (this.Width-5)/pixelRatio + \\\"px\\\";\\r\\n        this.ToolsDiv.style.height = 'auto';\\r\\n        this.ToolsDiv.style.position = \\\"absolute\\\";\\r\\n        this.ToolsDiv.style.display = \\\"block\\\";\\r\\n        // this.ToolsDiv.style.paddingLeft = \\\"10px\\\";\\r\\n\\r\\n        this.SizeChange == true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//窗口分割\\r\\nfunction FrameSplitPaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='FrameSplitPaint';\\r\\n    this.LineColor='rgb(255,0,0)';\\r\\n    this.TextColor=\\\"rgb(255,0,0)\\\";\\r\\n    this.LineWidth=2;\\r\\n    this.Font='bold '+18*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.TextTopOffset=10*GetDevicePixelRatio();\\r\\n\\r\\n    //设置参数接口\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.LineColor) this.LineColor=option.LineColor;\\r\\n            if (option.TextColor) this.TextColor=option.TextColor;\\r\\n            if (option.Font) this.Font=option.Font;\\r\\n            if (IFrameSplitOperator.IsNumber(option.LineWidth)) this.LineWidth=option.LineWidth;\\r\\n            if (IFrameSplitOperator.IsNumber(option.TextTopOffset)) this.TextTopOffset=option.TextTopOffset;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.HQChart) return;\\r\\n        if (this.HQChart.Period!=0 && this.HQChart.Period!=1) return;\\r\\n\\r\\n        if (!this.HQChart.ChartPaint[0]) return;\\r\\n        var data=this.HQChart.ChartPaint[0].Data;\\r\\n        if (!data) return;\\r\\n        this.Data=data;\\r\\n        if (!this.ChartFrame || !this.ChartFrame.SubFrame) return;\\r\\n        var subFrame=this.ChartFrame.SubFrame[0].Frame;\\r\\n        if (!subFrame) return;\\r\\n\\r\\n        var isHScreen=(subFrame.IsHScreen===true);\\r\\n        var dataWidth=subFrame.DataWidth;\\r\\n        var distanceWidth=subFrame.DistanceWidth;\\r\\n        var xPointCount=subFrame.XPointCount;\\r\\n\\r\\n        var lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=this.ChartBorder.GetHScreenBorder();\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.ChartBorder.GetBorder();\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.RightEx;\\r\\n            var drawHeight=border.ChartHeight-border.TopTitle-5*GetDevicePixelRatio();\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.lineWidth=lineWidth;\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.textAlign='center';\\r\\n        this.Canvas.textBaseline='top';\\r\\n        var preQuarter={ Left:border.LeftEx, Top:ToFixedPoint2(lineWidth,border.TopTitle), Height:drawHeight, LineWidth:lineWidth };\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (!item) continue;\\r\\n\\r\\n            var dateInfo=this.GetQuarter(item.Date);\\r\\n            if (!dateInfo) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n\\r\\n\\r\\n            if (!preQuarter.DateInfo)\\r\\n            {\\r\\n                preQuarter.DateInfo=dateInfo;\\r\\n                preQuarter.Right=x;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var preDateInfo=preQuarter.DateInfo;\\r\\n                if (preDateInfo.Year!=dateInfo.Year || preDateInfo.Quarter!=dateInfo.Quarter)\\r\\n                {\\r\\n                    preQuarter.Right=x;\\r\\n                    this.DrawQuarter(preQuarter);\\r\\n\\r\\n                    preQuarter.Left=x;\\r\\n                    preQuarter.Right=null;\\r\\n                    preQuarter.DateInfo=dateInfo;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    preQuarter.Right=x;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.DrawQuarter(preQuarter);\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawQuarter=function(quarterInfo)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(quarterInfo.Left) || !IFrameSplitOperator.IsNumber(quarterInfo.Right)) return;\\r\\n\\r\\n        var left=ToFixedPoint2(quarterInfo.LineWidth,quarterInfo.Left);\\r\\n        var right=ToFixedPoint2(quarterInfo.LineWidth,quarterInfo.Right);\\r\\n        var drawWidth=right-left;\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.strokeRect(left, quarterInfo.Top, drawWidth, quarterInfo.Height);\\r\\n\\r\\n        var date=quarterInfo.DateInfo;\\r\\n        var shortYear=date.Year%100;\\r\\n        if (shortYear<10) var strYear='0'+shortYear;\\r\\n        else var strYear=shortYear.toString();\\r\\n        var text=`${strYear}年${date.Quarter}季度`;\\r\\n        var textWidth = this.Canvas.measureText(text).width;\\r\\n        if (textWidth<(drawWidth+5))\\r\\n        {\\r\\n            var x=left+drawWidth/2;\\r\\n            var y=quarterInfo.Top+this.TextTopOffset;\\r\\n            this.Canvas.fillStyle=this.TextColor;\\r\\n            this.Canvas.fillText(text,x,y);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetQuarter=function(date)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(date)) return null;\\r\\n\\r\\n        var year=parseInt(date/10000);\\r\\n        var month=parseInt((date%10000)/100);\\r\\n\\r\\n        switch(month)\\r\\n        {\\r\\n            case 1:\\r\\n            case 2:\\r\\n            case 3:\\r\\n                var quarter=1;\\r\\n                break;\\r\\n            case 4:\\r\\n            case 5:\\r\\n            case 6:\\r\\n                var quarter=2;\\r\\n                break;\\r\\n            case 7:\\r\\n            case 8:\\r\\n            case 9:\\r\\n                var quarter=3;\\r\\n                break;\\r\\n            case 10:\\r\\n            case 11:\\r\\n            case 12:\\r\\n                var quarter=4;\\r\\n                break;\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n\\r\\n        return { Year:year, Month:month, Quarter:quarter };\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction RectSelectPaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='RectSelectPaint';\\r\\n    this.LineColor=g_JSChartResource.RectSelect.LineColor;          //竖线\\r\\n    this.LineWidth=g_JSChartResource.RectSelect.LineWidth;\\r\\n    this.LineDotted=g_JSChartResource.RectSelect.LineDotted;\\r\\n    this.AreaColor=g_JSChartResource.RectSelect.AreaColor;     //面积\\r\\n\\r\\n    this.FirstPoint;\\r\\n    this.SecondPoint;\\r\\n    this.PreventClose=false;        //如果外面有div,可以设置成true, 有外面控制\\r\\n\\r\\n    this.StartDate; //{ Date:, Index: }\\r\\n    this.EndDate;   //{ Date:, Index: }\\r\\n\\r\\n    this.HQChart;\\r\\n    this.DragRect;      //拖拽边框区域\\r\\n\\r\\n    //设置参数接口\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.LineColor) this.LineColor=option.LineColor;\\r\\n            if (option.AreaColor) this.AreaColor=option.AreaColor;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        this.LineColor=g_JSChartResource.RectSelect.LineColor;     //竖线\\r\\n        this.LineWidth=g_JSChartResource.RectSelect.LineWidth;\\r\\n        this.LineDotted=g_JSChartResource.RectSelect.LineDotted;\\r\\n        this.AreaColor=g_JSChartResource.RectSelect.AreaColor;     //面积\\r\\n    }\\r\\n\\r\\n    this.IsMinuteChart=function()\\r\\n    {\\r\\n        var className=this.HQChart.ClassName;\\r\\n        var isMinuteChart=(className==\\\"MinuteChartContainer\\\" || className==\\\"MinuteChartHScreenContainer\\\") ? true:false;\\r\\n        return isMinuteChart;\\r\\n    }\\r\\n\\r\\n    this.GetKData=function()\\r\\n    {\\r\\n        if (!this.HQChart) return null;\\r\\n        var isMinuteChart=this.IsMinuteChart();\\r\\n\\r\\n        var data=null;\\r\\n        if (isMinuteChart)\\r\\n        {\\r\\n            if (!this.HQChart.SourceData) return null;\\r\\n            data=this.HQChart.SourceData;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (!this.HQChart.ChartPaint[0]) return null;\\r\\n            data=this.HQChart.ChartPaint[0].Data;\\r\\n            if (!data) return null;\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetPointCount=function()\\r\\n    {\\r\\n        var count=0;\\r\\n        if (this.FirstPoint) ++count;\\r\\n        if (this.SecondPoint) ++count;\\r\\n        return count;\\r\\n    }\\r\\n\\r\\n    this.DateToNumber=function(value, isMinuteChart)\\r\\n    {\\r\\n        if (isMinuteChart)\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(value.Date)) return value.Date*10000+value.Time;\\r\\n            else return value.Time;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var period=this.HQChart.Period;\\r\\n            if (ChartData.IsDayPeriod(period, true)) return value.Date; //YYYYMMDD\\r\\n            else if (ChartData.IsMinutePeriod(period, true)) return value.Date*10000+value.Time; //YYYYMMDDHHMM\\r\\n            else if (ChartData.IsSecondPeriod(period) || ChartData.IsTickPeriod(period)) return value.Date*1000000+value.Time;  //YYYYMMDDHHMMSS\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetSelectRectData=function()\\r\\n    {\\r\\n        if (!this.FirstPoint && !this.SecondPoint) return null;\\r\\n\\r\\n        var data=this.GetKData();\\r\\n        if (!data) return null;\\r\\n        var isMinuteChart=this.IsMinuteChart();\\r\\n        var firstDate=this.DateToNumber(this.FirstPoint,isMinuteChart);\\r\\n        var secondDate=this.DateToNumber(this.SecondPoint,isMinuteChart);\\r\\n        var selectData={ Start:null, End:null, Data:data };\\r\\n        for(var i=0;i<data.Data.length;++i)\\r\\n        {\\r\\n            var item=data.Data[i];\\r\\n            if (!item) continue;\\r\\n            var value=this.DateToNumber(item,isMinuteChart);\\r\\n\\r\\n            if (firstDate==value) selectData.Start=i;\\r\\n            if (secondDate==value) selectData.End=i;\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(selectData.Start) && IFrameSplitOperator.IsNumber(selectData.End))\\r\\n            {\\r\\n                if (selectData.Start>selectData.End)\\r\\n                {\\r\\n                    var temp=selectData.Start;\\r\\n                    selectData.Start=selectData.End;\\r\\n                    selectData.End=temp;\\r\\n                }\\r\\n                return selectData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.SortPoint=function()\\r\\n    {\\r\\n        var isMinuteChart=this.IsMinuteChart();\\r\\n        if (this.FirstPoint && !this.SecondPoint)\\r\\n        {\\r\\n            this.StartDate={ Date:this.DateToNumber(this.FirstPoint,isMinuteChart), Index:0 };\\r\\n        }\\r\\n        else if (this.FirstPoint && this.SecondPoint)\\r\\n        {\\r\\n            var firstValue=this.DateToNumber(this.FirstPoint,isMinuteChart);\\r\\n            var secondValue=this.DateToNumber(this.SecondPoint,isMinuteChart);\\r\\n            if (firstValue<secondValue)\\r\\n            {\\r\\n                this.StartDate={ Date:firstValue, Index:0 };\\r\\n                this.EndDate={ Date:secondValue, Index:1 };\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.StartDate={ Date:secondValue, Index:1 };\\r\\n                this.EndDate={ Date:firstValue, Index:0 };\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetPoint=function(kItem, option)\\r\\n    {\\r\\n        if (!option)\\r\\n        {\\r\\n            if (!this.FirstPoint)\\r\\n            {\\r\\n                this.FirstPoint={ Date:kItem.Date, Time:kItem.Time };\\r\\n                return true;\\r\\n            }\\r\\n\\r\\n            if (!this.SecondPoint)\\r\\n            {\\r\\n                this.SecondPoint={ Date:kItem.Date, Time:kItem.Time };\\r\\n                return true;\\r\\n            }\\r\\n            return false;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            switch(option.Index)\\r\\n            {\\r\\n                case 0:\\r\\n                    this.FirstPoint={ Date:kItem.Date, Time:kItem.Time };\\r\\n                    return true;\\r\\n                case 1:\\r\\n                    this.SecondPoint={ Date:kItem.Date, Time:kItem.Time };\\r\\n                    return true;\\r\\n                default:\\r\\n                    return false;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ClearPoint=function()\\r\\n    {\\r\\n        if (this.PreventClose) return false;\\r\\n\\r\\n        var bRedraw=false;\\r\\n        if (this.FirstPoint)\\r\\n        {\\r\\n            this.FirstPoint=null;\\r\\n            bRedraw=true;\\r\\n        }\\r\\n\\r\\n        if (this.SecondPoint)\\r\\n        {\\r\\n            this.SecondPoint=null;\\r\\n            bRedraw=true;\\r\\n        }\\r\\n\\r\\n        return bRedraw;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.StartDate=null;\\r\\n        this.EndDate=null;\\r\\n        this.DragRect=[];\\r\\n        if (!this.FirstPoint && !this.SecondPoint) return;\\r\\n        this.SortPoint();\\r\\n\\r\\n        var data=this.GetKData();\\r\\n        if (!data) return;\\r\\n        this.Data=data;\\r\\n        if (!this.ChartFrame || !this.ChartFrame.SubFrame) return;\\r\\n        var subFrame=this.ChartFrame.SubFrame[0].Frame;\\r\\n        if (!subFrame) return;\\r\\n\\r\\n        var isHScreen=(subFrame.IsHScreen===true);\\r\\n        var dataWidth=subFrame.DataWidth;\\r\\n        var distanceWidth=subFrame.DistanceWidth;\\r\\n        var xPointCount=subFrame.XPointCount;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var border=subFrame.GetBorder();\\r\\n            var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.BottomEx;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=subFrame.GetBorder();\\r\\n            var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n            var chartright=border.RightEx;\\r\\n            var drawHeight=border.ChartHeight-border.TopTitle-5*GetDevicePixelRatio();\\r\\n            var top=border.TopEx;\\r\\n            var bottom=border.BottomEx;\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n\\r\\n        var isDayPeriod=ChartData.IsDayPeriod(this.HQChart.Period,true);\\r\\n        var isMinuteChart=this.IsMinuteChart();\\r\\n        var startPoint=null, endPoint=null;\\r\\n        var startDate=null, startEnd=null;\\r\\n        var aryLines=[];\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (!item) continue;\\r\\n\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n\\r\\n            if (isMinuteChart)\\r\\n                var x=subFrame.GetXFromIndex(j);\\r\\n            else\\r\\n                var x=left+(right-left)/2;\\r\\n\\r\\n            var value=this.DateToNumber(item, isMinuteChart);\\r\\n\\r\\n            if (this.StartDate && value==this.StartDate.Date)\\r\\n            {\\r\\n                startPoint={ XIndex:i, X:x, Top:top, Bottom: bottom, PointIndex:this.StartDate.Index };\\r\\n                aryLines.push(startPoint);\\r\\n            }\\r\\n\\r\\n            if (this.EndDate && value==this.EndDate.Date)\\r\\n            {\\r\\n                endPoint={ XIndex:i, X:x , Top:top, Bottom: bottom, PointIndex:this.EndDate.Index };\\r\\n                aryLines.push(endPoint);\\r\\n            }\\r\\n\\r\\n\\r\\n            if (!startDate)\\r\\n            {\\r\\n                startDate={ Date:value, X:x, Top:top, Bottom: bottom };\\r\\n                startEnd={ Date:value, X:x, Top:top, Bottom: bottom };\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                startEnd.Date=value;\\r\\n                startEnd.X=x;\\r\\n            }\\r\\n\\r\\n            if (startPoint && endPoint) break;\\r\\n        }\\r\\n\\r\\n        this.DrawLines(aryLines);\\r\\n        this.DrawArea(startPoint, endPoint, startDate, startEnd);\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawLines=function(aryLines)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(aryLines)) return;\\r\\n\\r\\n        var lineWidth=this.LineWidth * GetDevicePixelRatio();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.lineWidth=lineWidth;\\r\\n        if (this.LineDotted) this.Canvas.setLineDash(this.LineDotted);   //虚线\\r\\n        this.Canvas.beginPath();\\r\\n\\r\\n        for(var i=0;i<aryLines.length;++i)\\r\\n        {\\r\\n            var item=aryLines[i];\\r\\n            var left=ToFixedPoint2(lineWidth,item.X);\\r\\n            this.Canvas.moveTo(left,item.Top);\\r\\n            this.Canvas.lineTo(left,item.Bottom);\\r\\n\\r\\n            var rtLine=new Rect(left-3,item.Top,10,item.Bottom-item.Top);\\r\\n            this.DragRect[i]={ Rect:rtLine, PointIndex:item.PointIndex };\\r\\n        }\\r\\n\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.PtInPaint=function(x,y)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(this.DragRect)) return null;\\r\\n\\r\\n        for(var i=0;i<this.DragRect.length;++i)\\r\\n        {\\r\\n            var item=this.DragRect[i];\\r\\n            var rtLine=item.Rect;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.rect(rtLine.X,rtLine.Y,rtLine.Width,rtLine.Height);\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n            {\\r\\n                return { Index:i, PointIndex:item.PointIndex, Self:this };\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function(startPoint, endPoint, startDate, startEnd)\\r\\n    {\\r\\n        if (!startDate || !startEnd || !this.StartDate || !this.EndDate) return;\\r\\n\\r\\n        var aryArea;\\r\\n        if (startPoint && endPoint)\\r\\n            aryArea=[startPoint, endPoint];\\r\\n        else if (!startPoint && endPoint)\\r\\n            aryArea=[startDate, endPoint];\\r\\n        else if (startPoint && !endPoint)\\r\\n            aryArea=[startPoint, startEnd];\\r\\n        else if (startDate.Date>this.StartDate.Date && startEnd.Date<this.EndDate.Date)\\r\\n            aryArea=[startDate,startEnd];\\r\\n\\r\\n        if (aryArea && aryArea.length==2)\\r\\n        {\\r\\n            var start=aryArea[0],end=aryArea[1];\\r\\n            var left=ToFixedPoint(start.X);\\r\\n            var right=ToFixedPoint(end.X);\\r\\n            var drawWidth=right-left;\\r\\n            var drawHeight=start.Bottom-start.Top;\\r\\n            this.Canvas.fillStyle=this.AreaColor;\\r\\n            this.Canvas.fillRect(left, start.Top, drawWidth, drawHeight);\\r\\n        }\\r\\n    }\\r\\n\\r\\n}\\r\\n//深度图 支持横屏\\r\\n/*\\r\\n    数据格式:\\r\\n    [\\r\\n        {\\r\\n            Data:[ {X,Y}, ],\\r\\n            Type: 1=Up 2=Down 0=Default,\\r\\n            LineColor:\\r\\n            AreaColor:\\r\\n            TextColor:\\r\\n            Range:{X:{Max,Min:}, Y:{Max:,Min:} }\\r\\n            Height:高度 百分比,\\r\\n            Order:\\\"ASC\\\", //DESC=降序 ASC=升序\\r\\n            IsShowCorssCursor:true/false;         //是否显示十字光标的提示信息\\r\\n        },\\r\\n    ]\\r\\n*/\\r\\n\\r\\nfunction DepthMapPaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='DepthMapPaint';\\r\\n\\r\\n    this.LineColor=\\\"rgba(0,139,0,0.6)\\\";\\r\\n    this.AreaColor=[\\\"rgba(0,139,0,0.5)\\\",\\\"rgba(0,139,0,0.4)\\\",\\\"rgba(0,139,0,0.3)\\\",'rgba(0,139,0,0.2)'];\\r\\n    this.TextColor=\\\"rgba(0,0,0)\\\";\\r\\n    this.TextBGColor=\\\"rgba(0,139,0)\\\";\\r\\n\\r\\n    this.Width=200*GetDevicePixelRatio();\\r\\n    this.FrameID=0;\\r\\n    this.ID=Guid(); //唯一的ID\\r\\n\\r\\n    this.IsDynamic=false;\\r\\n    this.IsCallbackDraw=true;   //在回调函数里绘制, 不在Draw()中绘制\\r\\n\\r\\n    this.YRange;    //Y值范围\\r\\n\\r\\n    /*\\r\\n    this.Data=[\\r\\n       {\\r\\n           Data: [ {X:100,Y:20}, {X:110,Y:30}, {X:120,Y:40},{X:130,Y:50} ],\\r\\n           Type:1,\\r\\n           Range:{ X:{Max:130, Min:100}, Y:{ Max:50, Min:0} },\\r\\n           Height:0.5,\\r\\n           LineColor:'rgba(255,106,106,0.6)',\\r\\n           AreaColor:['rgba(255,106,106,0.5)','rgba(255,106,106,0.4)','rgba(255,106,106,0.3)','rgba(255,106,106,0.2)'],\\r\\n           IsASC:false, //true=升序 false=降序\\r\\n       },\\r\\n       {\\r\\n            Data: [ {X:100,Y:20}, {X:110,Y:30}, {X:120,Y:40},{X:130,Y:50} ],\\r\\n            Type:2,\\r\\n            Range:{ X:{Max:130, Min:100}, Y:{ Max:50, Min:0} },\\r\\n            Height:0.5,\\r\\n            IsASC:true, //true=升序 false=降序\\r\\n        },\\r\\n        {\\r\\n            Data:[ {X:11.60, Y:50}, {X:11.65, Y:80}, {X:11.68, Y:85},{X:11.70, Y:55}],\\r\\n            Type:0,\\r\\n            Range:{ Y:{ Max:100, Min:0} },\\r\\n\\r\\n            LineColor:'rgba(255,165,0,0.6)',\\r\\n            AreaColor:['rgba(255,165,0,0.5)','rgba(255,165,0,0.4)','rgba(255,165,0,0.3)','rgba(255,165,0,0.2)']\\r\\n        }\\r\\n    ];\\r\\n    */\\r\\n\\r\\n    this.SetOption=function(option) //设置\\r\\n    {\\r\\n        if (option.FrameID>0) this.FrameID=option.FrameID;\\r\\n        if (option.Width>0) this.Width=option.Width;\\r\\n        if (IFrameSplitOperator.IsObjectExist(option.ID)) this.ID=option.ID;\\r\\n        if (option.IsShowCorssCursor) this.IsShowCorssCursor=option.IsShowCorssCursor;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data) return;\\r\\n        if (!this.ChartFrame || !this.ChartFrame.SubFrame || this.ChartFrame.SubFrame.length<=this.FrameID) return;\\r\\n\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var frame=this.ChartFrame.SubFrame[this.FrameID].Frame;\\r\\n        var chartBorder=frame.ChartBorder;\\r\\n\\r\\n        var height=chartBorder.GetHeightEx();\\r\\n        var left=chartBorder.GetRight();\\r\\n        var top=chartBorder.GetTopEx();\\r\\n        var bottom=chartBorder.GetBottomEx();\\r\\n        var width=this.Width;\\r\\n        if (width>this.ChartBorder.Right) width=this.ChartBorder.Right;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            left=chartBorder.GetBottom();\\r\\n            top=chartBorder.GetRight();\\r\\n            bottom=chartBorder.GetLeft();\\r\\n            var width=this.Width;\\r\\n            if (width>this.ChartBorder.Bottom) width=this.ChartBorder.Bottom;\\r\\n        }\\r\\n\\r\\n        var rtClient={ Left:left, Top:top, Right:left+width, Bottom:bottom, Height:height, Width:width };\\r\\n        this.YRange={ Max:null, Min:0 };\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            this.CalculateYRange(item, this.YRange);\\r\\n        }\\r\\n\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            if (item.Height>0 && item.Height<=1) rtClient.Height=height*item.Height;\\r\\n            else rtClient.Height=height;\\r\\n\\r\\n            if (item.Type==1)\\r\\n            {\\r\\n                rtClient.Top=top;\\r\\n                rtClient.Bottom=top+rtClient.Height;\\r\\n                this.DrawUpArea(item,rtClient);\\r\\n            }\\r\\n            else if (item.Type==2)\\r\\n            {\\r\\n                rtClient.Bottom=bottom;\\r\\n                rtClient.Top=rtClient.Bottom-rtClient.Height;\\r\\n                this.DrawDownArea(item,rtClient);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                rtClient.Top=top;\\r\\n                rtClient.Bottom=bottom;\\r\\n                this.DrawDefaultArea(item,rtClient);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateYRange=function(drawData, yRange)\\r\\n    {\\r\\n        for(var i in drawData.Data)\\r\\n        {\\r\\n            var item=drawData.Data[i];\\r\\n            if (yRange.Max==null || yRange.Max<item.Y) yRange.Max=item.Y;\\r\\n            if (yRange.Min==null || yRange.Min>item.Y) yRange.Min=item.Y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetXFromData=function(value, rtClient, minMax)    //获取X轴坐标\\r\\n    {\\r\\n        var width = rtClient.Width * (value - minMax.Min) / (minMax.Max - minMax.Min);\\r\\n        return rtClient.Left + width;\\r\\n    }\\r\\n\\r\\n    this.GetYFromData=function(value, rtClient, minMax, isASC)\\r\\n    {\\r\\n        if (isASC)\\r\\n        {\\r\\n            var height = rtClient.Height * (value - minMax.Min) / (minMax.Max - minMax.Min);\\r\\n            return rtClient.Bottom - height;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var height = rtClient.Height * (value - minMax.Min) / (minMax.Max - minMax.Min);\\r\\n            return rtClient.Top + height;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawDefaultArea=function(drawData, rtClient)\\r\\n    {\\r\\n        var frame=this.ChartFrame.SubFrame[this.FrameID].Frame;\\r\\n        var yRange=(drawData.Range && drawData.Range.Y) ? drawData.Range.Y : this.YRange;\\r\\n\\r\\n        var aryPoint=[];\\r\\n        for(var i in drawData.Data)\\r\\n        {\\r\\n            var item=drawData.Data[i];\\r\\n            var x=this.GetXFromData(item.Y,rtClient,yRange);\\r\\n            if (item.X>frame.HorizontalMax || item.X<frame.HorizontalMin) continue;\\r\\n            var y=frame.GetYFromData(item.X);\\r\\n\\r\\n            aryPoint.push({X:x,Y:y});\\r\\n        }\\r\\n\\r\\n        var lineColor=drawData.LineColor? drawData.LineColor: this.LineColor;\\r\\n        var areaColor=drawData.AreaColor? drawData.AreaColor: this.AreaColor;\\r\\n        if (aryPoint.length>0) this.DrawLine(aryPoint,lineColor, areaColor,rtClient);\\r\\n    }\\r\\n\\r\\n    this.DrawUpArea=function(drawData,rtClient)\\r\\n    {\\r\\n        var aryPoint=[];\\r\\n        for(var i in drawData.Data)\\r\\n        {\\r\\n            var item=drawData.Data[i];\\r\\n            var x=this.GetXFromData(item.Y,rtClient,drawData.Range.Y);\\r\\n            var y=this.GetYFromData(item.X,rtClient,drawData.Range.X,drawData.IsASC);\\r\\n\\r\\n            aryPoint.push({X:x,Y:y});\\r\\n        }\\r\\n\\r\\n        var lineColor=drawData.LineColor? drawData.LineColor: this.LineColor;\\r\\n        var areaColor=drawData.AreaColor? drawData.AreaColor: this.AreaColor;\\r\\n        if (aryPoint.length>0) this.DrawLine(aryPoint,lineColor, areaColor,rtClient);\\r\\n    }\\r\\n\\r\\n    this.DrawDownArea=function(drawData,rtClient)\\r\\n    {\\r\\n        var aryPoint=[];\\r\\n        for(var i in drawData.Data)\\r\\n        {\\r\\n            var item=drawData.Data[i];\\r\\n            var x=this.GetXFromData(item.Y,rtClient,drawData.Range.Y);\\r\\n            var y=this.GetYFromData(item.X,rtClient,drawData.Range.X,drawData.IsASC);\\r\\n\\r\\n            aryPoint.push({X:x,Y:y});\\r\\n        }\\r\\n\\r\\n        var lineColor=drawData.LineColor? drawData.LineColor: this.LineColor;\\r\\n        var areaColor=drawData.AreaColor? drawData.AreaColor: this.AreaColor;\\r\\n        if (aryPoint.length>0) this.DrawLine(aryPoint,lineColor, areaColor,rtClient);\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(aryPoint,lineColor, areaColor,rtClient)\\r\\n    {\\r\\n        var isHScreen=(this.ChartFrame.IsHScreen===true);\\r\\n        var bFirstPoint=true;\\r\\n        var drawCount=0;\\r\\n        this.Canvas.strokeStyle=lineColor;\\r\\n\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n            if (bFirstPoint)\\r\\n            {\\r\\n                this.Canvas.beginPath();\\r\\n                if (isHScreen) this.Canvas.moveTo(item.Y,item.X);\\r\\n                else this.Canvas.moveTo(item.X,item.Y);\\r\\n                bFirstPoint=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isHScreen) this.Canvas.lineTo(item.Y,item.X);\\r\\n                else this.Canvas.lineTo(item.X,item.Y);\\r\\n            }\\r\\n\\r\\n            ++drawCount;\\r\\n        }\\r\\n\\r\\n        if (drawCount>0) this.Canvas.stroke();\\r\\n\\r\\n        //面积\\r\\n        var firstPoint=aryPoint[0];\\r\\n        var lastPoint=aryPoint[aryPoint.length-1];\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            this.Canvas.lineTo(lastPoint.Y,rtClient.Left);\\r\\n            this.Canvas.lineTo(firstPoint.Y,rtClient.Left);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.lineTo(rtClient.Left,lastPoint.Y);\\r\\n            this.Canvas.lineTo(rtClient.Left,firstPoint.Y);\\r\\n        }\\r\\n        this.Canvas.closePath();\\r\\n\\r\\n        if (Array.isArray(areaColor))\\r\\n        {\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                let gradient = this.Canvas.createLinearGradient(this.ChartBorder.GetRightEx(),this.ChartBorder.GetTop(), this.ChartBorder.GetLeft(),this.ChartBorder.GetTop());\\r\\n                gradient.addColorStop(0, areaColor[0]);\\r\\n                gradient.addColorStop(1, areaColor[1]);\\r\\n                this.Canvas.fillStyle=gradient;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                let gradient = this.Canvas.createLinearGradient(rtClient.Right,rtClient.Top, rtClient.Left,rtClient.Top);\\r\\n                var offset=1/areaColor.length;\\r\\n                for(var i in areaColor)\\r\\n                {\\r\\n                    gradient.addColorStop(i*offset, areaColor[i]);\\r\\n                }\\r\\n                this.Canvas.fillStyle=gradient;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillStyle=areaColor;\\r\\n        }\\r\\n\\r\\n        this.Canvas.fill();\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetYValueByXValue=function(x,floatPrecision)\\r\\n    {\\r\\n        var aryXValue=[];\\r\\n        var value=0;\\r\\n        var zoom=ZOOM_VALUE[floatPrecision];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            if (item.Type!=0 || !item.Data || item.Data.length<0 || item.IsShowCorssCursor==false) continue;\\r\\n\\r\\n            var bFind=false;\\r\\n            for(var j in item.Data)\\r\\n            {\\r\\n                var dataItem=item.Data[j];\\r\\n                value=parseInt(dataItem.X*zoom);\\r\\n                if (value==x)\\r\\n                {\\r\\n                    bFind=true;\\r\\n                    var findItem=\\r\\n                        {\\r\\n                            X:dataItem.X, Y:dataItem.Y,\\r\\n                            TextColor:item.TextColor? item.TextColor: this.TextColor,\\r\\n                            TextBGColor:item.TextBGColor? item.TextBGColor: this.TextBGColor\\r\\n                        };\\r\\n                    if (dataItem.YText) findItem.YText=dataItem.YText;\\r\\n\\r\\n                    aryXValue.push(findItem);\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!bFind)\\r\\n            {\\r\\n                var first=item.Data[0];\\r\\n                var last=item.Data[item.Data.length-1];\\r\\n                if (x>first.X*zoom && x<last.X*zoom)\\r\\n                {\\r\\n                    aryXValue.push(\\r\\n                        {\\r\\n                            X:null, Y:null,\\r\\n                            TextColor:item.TextColor? item.TextColor: this.TextColor,\\r\\n                            TextBGColor:item.TextBGColor? item.TextBGColor: this.TextBGColor\\r\\n                        } );\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return aryXValue;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//背景图 支持横屏\\r\\nfunction BackgroundPaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='BackgroundPaint';\\r\\n\\r\\n    this.IsDynamic=false;\\r\\n    this.IsCallbackDraw=true;   //在回调函数里绘制, 不在Draw()中绘制\\r\\n\\r\\n    this.FrameID=0;\\r\\n    this.Data;      //背景数据 { Start:, End:, Color:[] }\\r\\n    this.ID=Guid(); //唯一的ID\\r\\n\\r\\n    /*\\r\\n    this.Data=\\r\\n    [\\r\\n        { Start:{ Date:20181201 }, End:{ Date:20181230 }, Color:'rgb(44,55,44)' } ,\\r\\n        { Start:{ Date:20190308 }, End:{ Date:20190404 }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }\\r\\n    ]\\r\\n    */\\r\\n\\r\\n    this.ChartSubFrame;\\r\\n    this.ChartBorder;\\r\\n    this.KData;\\r\\n    this.Period;\\r\\n    this.XPointCount=0;\\r\\n\\r\\n    this.SetOption=function(option) //设置\\r\\n    {\\r\\n        if (option.FrameID>0) this.FrameID=option.FrameID;\\r\\n        if (IFrameSplitOperator.IsObjectExist(option.ID)) this.ID=option.ID;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.Data || !this.HQChart) return;\\r\\n        if (!this.ChartFrame || !this.ChartFrame.SubFrame || this.ChartFrame.SubFrame.length<=this.FrameID) return;\\r\\n        var klineChart=this.HQChart.ChartPaint[0];\\r\\n        if (!klineChart || !klineChart.Data) return;\\r\\n\\r\\n        this.ChartSubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;\\r\\n        this.ChartBorder=this.ChartSubFrame.ChartBorder;\\r\\n        this.KData=klineChart.Data;\\r\\n        this.Period=this.HQChart.Period;\\r\\n        if (!this.KData || this.KData.Data.length<=0) return;\\r\\n\\r\\n        var isHScreen=(this.ChartSubFrame.IsHScreen===true);\\r\\n        this.XPointCount=this.ChartSubFrame.XPointCount;\\r\\n        var xPointCount=this.ChartSubFrame.XPointCount;\\r\\n\\r\\n        var firstKItem=this.KData.Data[this.KData.DataOffset];\\r\\n        var endIndex=this.KData.DataOffset+xPointCount-1;\\r\\n        if (endIndex>=this.KData.Data.length) endIndex=this.KData.Data.length-1;\\r\\n        var endKItem=this.KData.Data[endIndex];\\r\\n        var showData=this.GetShowData(firstKItem,endKItem);\\r\\n        if (!showData || showData.length<=0) return;\\r\\n\\r\\n        var kLineMap=this.BuildKLineMap();\\r\\n        var bottom=this.ChartBorder.GetBottomEx();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var height=this.ChartBorder.GetHeightEx();\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            top=this.ChartBorder.GetRightEx();\\r\\n            bottom=this.ChartBorder.GetLeftEx();\\r\\n            height=this.ChartBorder.GetWidthEx();\\r\\n        }\\r\\n\\r\\n        for(var i in showData)\\r\\n        {\\r\\n            var item=showData[i];\\r\\n            var rt=this.GetBGCoordinate(item,kLineMap);\\r\\n            if (!rt) continue;\\r\\n\\r\\n            if (Array.isArray(item.Color))\\r\\n            {\\r\\n                var gradient;\\r\\n                if (isHScreen) gradient = this.Canvas.createLinearGradient(bottom,rt.Left, top, rt.Left);\\r\\n                else gradient = this.Canvas.createLinearGradient(rt.Left,top, rt.Left,bottom);\\r\\n                var offset=1/item.Color.length;\\r\\n                for(var i in item.Color)\\r\\n                {\\r\\n                    gradient.addColorStop(i*offset, item.Color[i]);\\r\\n                }\\r\\n                this.Canvas.fillStyle=gradient;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.fillStyle=item.Color;\\r\\n            }\\r\\n\\r\\n            if (isHScreen) this.Canvas.fillRect(ToFixedRect(bottom),ToFixedRect(rt.Left),ToFixedRect(height),ToFixedRect(rt.Width));\\r\\n            else this.Canvas.fillRect(ToFixedRect(rt.Left),ToFixedRect(top),ToFixedRect(rt.Width),ToFixedRect(height));\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetShowData=function(first, end)\\r\\n    {\\r\\n        var aryData=[];\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            var showItem={ };\\r\\n            if (item.Start.Date>=first.Date && item.Start.Date<=end.Date) showItem.Start=item.Start;\\r\\n            if (item.End.Date>=first.Date && item.End.Date<=end.Date) showItem.End=item.End;\\r\\n            if (showItem.Start || showItem.End)\\r\\n            {\\r\\n                showItem.Color=item.Color;\\r\\n                aryData.push(showItem);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //JSConsole.Chart.Log('[BackgroundPaint::GetShowData]  aryData ', aryData);\\r\\n        return aryData;\\r\\n    }\\r\\n\\r\\n    this.BuildKLineMap=function()\\r\\n    {\\r\\n        var isHScreen=(this.ChartSubFrame.IsHScreen===true);\\r\\n        var dataWidth=this.ChartSubFrame.DataWidth;\\r\\n        var distanceWidth=this.ChartSubFrame.DistanceWidth;\\r\\n        var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;\\r\\n        var chartright=this.ChartBorder.GetRight();\\r\\n        if (isHScreen) chartright=this.ChartBorder.GetBottom();\\r\\n\\r\\n        var mapKLine={ Data:new Map() ,Start:null, End:null } ; //Key: date / date time, Value:索引\\r\\n        for(var i=this.KData.DataOffset,j=0; i<this.KData.Data.length && j<this.XPointCount; ++i,++j,xOffset+=(dataWidth+distanceWidth))\\r\\n        {\\r\\n            var kItem=this.KData.Data[i];\\r\\n            var left=xOffset;\\r\\n            var right=xOffset+dataWidth;\\r\\n            if (right>chartright) break;\\r\\n            var x=left+(right-left)/2;\\r\\n\\r\\n            if (j==0) mapKLine.XLeft=left;\\r\\n            mapKLine.XRight=right;\\r\\n\\r\\n            var value={ Index:i, ShowIndex:j , X:x, Right:right, Left:left, Date:kItem.Date };\\r\\n            if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n            {\\r\\n                var key=`Date:${kItem.Date} Time:${kItem.Time}`;\\r\\n                value.Time=kItem.Time;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var key=`Date:${kItem.Date}`;\\r\\n            }\\r\\n\\r\\n            mapKLine.Data.set(key,value);\\r\\n\\r\\n            //保存下起始和结束位置\\r\\n            if (j==0) mapKLine.Start=value;\\r\\n            mapKLine.End=value;\\r\\n        }\\r\\n\\r\\n        return mapKLine;\\r\\n    }\\r\\n\\r\\n    this.GetBGCoordinate=function(item,kLineMap)\\r\\n    {\\r\\n        var xLeft=null, xRight=null;\\r\\n        var isMinutePeriod=ChartData.IsMinutePeriod(this.Period,true);\\r\\n        var bSingleDate=false;\\r\\n        //JSConsole.Chart.Log('[BackgroundPaint::GetBGCoordinate]  item ', item);\\r\\n        if (isMinutePeriod)\\r\\n        {\\r\\n            if (item.Start && item.End && item.Start.Date==item.End.Date && item.Start.Time==item.End.Time) bSingleDate=true;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (item.Start && item.End && item.Start.Date==item.End.Date) bSingleDate=true;\\r\\n        }\\r\\n\\r\\n        if (bSingleDate)\\r\\n        {\\r\\n            if (isMinutePeriod)\\r\\n                var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;\\r\\n            else\\r\\n                var key=`Date:${item.Start.Date}`;\\r\\n\\r\\n            if (!kLineMap.Data.has(key)) return null;\\r\\n            var findItem=kLineMap.Data.get(key);\\r\\n            xLeft=findItem.Left;\\r\\n            xRight=findItem.Right;\\r\\n            return { Left:xLeft, Right:xRight, Width:xRight-xLeft };\\r\\n        }\\r\\n\\r\\n        if (item.Start)\\r\\n        {\\r\\n            if (isMinutePeriod)\\r\\n                var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;\\r\\n            else\\r\\n                var key=`Date:${item.Start.Date}`;\\r\\n\\r\\n            if (kLineMap.Data.has(key))\\r\\n            {\\r\\n                var findItem=kLineMap.Data.get(key);\\r\\n                xLeft=findItem.Left;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isMinutePeriod)\\r\\n                {\\r\\n                    if (item.Start.Date<kLineMap.Start.Date || (item.Start.Date==kLineMap.Start.Date && item.Start.Time<=kLineMap.Start.Time) )\\r\\n                    {\\r\\n                        xLeft=kLineMap.Start.Left;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        for(var kItem of kLineMap.Data)\\r\\n                        {\\r\\n                            var value=kItem[1];\\r\\n                            if (value.Date>item.Start.Date || (value.Date==item.Start.Date && value.Time>item.Start.Time))\\r\\n                            {\\r\\n                                xLeft=value.Left;\\r\\n                                break;\\r\\n                            }\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (item.Start.Date<=kLineMap.Start.Date)\\r\\n                    {\\r\\n                        xLeft=kLineMap.Start.Left;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        for(var kItem of kLineMap.Data)\\r\\n                        {\\r\\n                            var value=kItem[1];\\r\\n                            if (value.Date>item.Start.Date)\\r\\n                            {\\r\\n                                xLeft=value.Left;\\r\\n                                break;\\r\\n                            }\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            xLeft=kLineMap.XLeft;\\r\\n        }\\r\\n\\r\\n        if (item.End)\\r\\n        {\\r\\n            if (isMinutePeriod)\\r\\n                var key=`Date:${item.End.Date} Time:${item.End.Time}`;\\r\\n            else\\r\\n                var key=`Date:${item.End.Date}`;\\r\\n\\r\\n            if (kLineMap.Data.has(key))\\r\\n            {\\r\\n                var findItem=kLineMap.Data.get(key);\\r\\n                xRight=findItem.Right;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isMinutePeriod)\\r\\n                {\\r\\n                    if (item.End.Date<kLineMap.End.Date || (item.End.Date==kLineMap.End.Date && item.End.Time>=kLineMap.End.Time) )\\r\\n                    {\\r\\n                        xRight=kLineMap.End.Right;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var previousX=null;\\r\\n                        for(var kItem of kLineMap.Data)\\r\\n                        {\\r\\n                            var value=kItem[1];\\r\\n                            if (value.Date>item.End.Date || (value.Date==item.End.Date && value.Time>item.End.Time) )\\r\\n                            {\\r\\n                                xRight=previousX;\\r\\n                                break;\\r\\n                            }\\r\\n                            previousX=value.Right;\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (item.End.Date<=kLineMap.End.Date)\\r\\n                    {\\r\\n                        xRight=kLineMap.End.Right;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var previousX=null;\\r\\n                        for(var kItem of kLineMap.Data)\\r\\n                        {\\r\\n                            var value=kItem[1];\\r\\n                            if (value.Date>item.End.Date)\\r\\n                            {\\r\\n                                xRight=previousX;\\r\\n                                break;\\r\\n                            }\\r\\n                            previousX=value.Right;\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            xRight=kLineMap.XRight;\\r\\n        }\\r\\n\\r\\n        if (xLeft==null || xRight==null) return null;\\r\\n\\r\\n        return { Left:xLeft, Right:xRight, Width:xRight-xLeft };\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//弹幕数据 { X:X偏移, Y:Y偏移, Text:内容, Color:颜色 }\\r\\nfunction BarrageList()\\r\\n{\\r\\n    this.PlayList=[];   //正在播放队列\\r\\n    this.Cache=[];      //没有播放的弹幕数据\\r\\n    this.MinLineHeight=40*GetDevicePixelRatio();\\r\\n    this.Height;        //高度\\r\\n    this.Step=1;\\r\\n\\r\\n    //{Canves:画布, Right:右边坐标, Left:左边坐标, Font:默认字体 }\\r\\n    this.GetPlayList=function(obj)\\r\\n    {\\r\\n        var canves=obj.Canves;\\r\\n        var right=obj.Right;\\r\\n        var left=obj.Left;\\r\\n        var width=right-left;\\r\\n        var isMoveStep=obj.IsMoveStep;\\r\\n\\r\\n        var list=[];\\r\\n        var yOffset=0;\\r\\n        for(var i=0;i<this.PlayList.length;++i)\\r\\n        {\\r\\n            var ary=this.PlayList[i];\\r\\n            var lineHeight=this.MinLineHeight;\\r\\n            if (ary.Height>this.MinLineHeight) lineHeight=ary.Height;\\r\\n\\r\\n            var bAddNewItem=true;  //是否需要加入新弹幕\\r\\n            var bRemoveFirst=false; //是否删除第1个数据\\r\\n            for(var j=0;j<ary.Data.length;++j)\\r\\n            {\\r\\n                var item=ary.Data[j];\\r\\n                var playItem={ X:item.X, Y:yOffset, Text:item.Text, Color:item.Color, Height:lineHeight, Font:item.Font, Info:item.Info };\\r\\n                list.push(playItem);\\r\\n\\r\\n                if (!isMoveStep) continue;\\r\\n\\r\\n                if(j==ary.Data.length-1 && this.Cache.length>0)    //最后一个数据了 判断是否需要增加弹幕\\r\\n                {\\r\\n                    bAddNewItem=false;\\r\\n                    if (!item.TextWidth)\\r\\n                    {\\r\\n                        if (item.Font && item.Font.Name) canves.font=item.Font.Name;\\r\\n                        else canves.font=obj.Font;\\r\\n                        item.TextWidth=canves.measureText(playItem.Text+'擎擎').width;\\r\\n                    }\\r\\n\\r\\n                    if (item.X>=item.TextWidth)\\r\\n                        bAddNewItem=true;\\r\\n                }\\r\\n                else if (j==0)\\r\\n                {\\r\\n                    bRemoveFirst=false;\\r\\n                    if (!item.TextWidth)\\r\\n                    {\\r\\n                        if (item.Font && item.Font.Name) canves.font=item.Font.Name;\\r\\n                        else canves.font=obj.Font;\\r\\n                        item.TextWidth=canves.measureText(playItem.Text+'擎擎').width;\\r\\n                    }\\r\\n\\r\\n                    if (item.X>width+item.TextWidth) bRemoveFirst=true;\\r\\n                }\\r\\n\\r\\n                item.X+=this.Step;\\r\\n            }\\r\\n\\r\\n            if(isMoveStep && bAddNewItem && this.Cache.length>0)    //最后一个数据了 判断是否需要增加弹幕\\r\\n            {\\r\\n                var cacheItem=this.Cache.shift();\\r\\n                var newItem={ X:0, Text:cacheItem.Text, Color:cacheItem.Color , Font:cacheItem.Font, Info:cacheItem.Info };\\r\\n                ary.Data.push(newItem);\\r\\n            }\\r\\n\\r\\n            if (isMoveStep && bRemoveFirst && ary.Data.length>0)\\r\\n            {\\r\\n                var removeItem=ary.Data.shift();\\r\\n                this.OnItemPlayEnd(obj.HQChart,removeItem);\\r\\n            }\\r\\n\\r\\n            yOffset+=lineHeight;\\r\\n        }\\r\\n\\r\\n        return list;\\r\\n    }\\r\\n\\r\\n    //根据高度计算播放队列个数\\r\\n    this.CacluatePlayLine=function(height)\\r\\n    {\\r\\n        this.Height=height;\\r\\n        var lineCount=parseInt(height/this.MinLineHeight);\\r\\n        if (this.PlayList.length<lineCount)\\r\\n        {\\r\\n            var addCount=lineCount-this.PlayList.length;\\r\\n            for(var i=0;i<addCount;++i)\\r\\n            {\\r\\n                this.PlayList.push({Data:[]});\\r\\n            }\\r\\n        }\\r\\n        else if (this.PlayList.length>lineCount)\\r\\n        {\\r\\n            var removeCount=this.PlayList.length-lineCount;\\r\\n            for(var i=0;i<removeCount;++i)\\r\\n            {\\r\\n                var ary=this.PlayList.pop();\\r\\n                for(var j=0;j<ary.Data.length;++j)\\r\\n                {\\r\\n                    var item=ary.Data[j];\\r\\n                    var cacheItem={ Text:item.Text, Color:item.Color, Font:item.Font, Info:item.Info };\\r\\n                    this.Cache.unshift(cacheItem);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log(`[BarrageList::CacluatePlayLine] LineCount=${this.PlayList.length} Height=${this.Height}` )\\r\\n    }\\r\\n\\r\\n    //添加弹幕\\r\\n    this.AddBarrage=function(barrageData)\\r\\n    {\\r\\n        for(var i in barrageData)\\r\\n        {\\r\\n            var item=barrageData[i];\\r\\n            this.Cache.push(item);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnItemPlayEnd=function(hqChart, item)  //单挑弹幕播放完毕\\r\\n    {\\r\\n        //监听事件\\r\\n        if (!hqChart.mapEvent.has(JSCHART_EVENT_ID.BARRAGE_PLAY_END)) return;\\r\\n        var event=hqChart.mapEvent.get(JSCHART_EVENT_ID.BARRAGE_PLAY_END);\\r\\n        if (!event.Callback) return;\\r\\n\\r\\n        event.Callback(event,item,this);\\r\\n    }\\r\\n\\r\\n    this.Count=function() { return this.Cache.length; } //未播放的弹幕个数\\r\\n}\\r\\n\\r\\n//弹幕\\r\\nfunction BarragePaint()\\r\\n{\\r\\n    this.newMethod=IExtendChartPainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='BarragePaint';\\r\\n    this.IsAnimation=true;\\r\\n    this.IsEraseBG=true;\\r\\n    this.HQChart;\\r\\n\\r\\n    this.Font=g_JSChartResource.Barrage.Font;\\r\\n    this.TextColor=g_JSChartResource.Barrage.Color;\\r\\n    this.FontHeight=g_JSChartResource.Barrage.Height;\\r\\n\\r\\n    this.BarrageList=new BarrageList();  //字幕列表\\r\\n    this.IsMoveStep=false;\\r\\n\\r\\n\\r\\n    //设置参数接口\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.Step>0) this.BarrageList.Step=option.Step;\\r\\n            if (option.MinLineHeight) this.Barrage.MinLineHeight=option.MinLineHeight;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawHScreen=function()\\r\\n    {\\r\\n        var height=this.ChartBorder.GetWidth();\\r\\n        var left=this.ChartBorder.GetTop();\\r\\n        var right=this.ChartBorder.GetBottom();\\r\\n        var top=this.ChartBorder.GetRightEx();\\r\\n        var wdith=this.ChartBorder.GetChartWidth();\\r\\n\\r\\n        if (height!=this.BarrageList.Height)\\r\\n            this.BarrageList.CacluatePlayLine(height);\\r\\n\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n\\r\\n        var play=this.BarrageList.GetPlayList({Canves:this.Canvas, Right:right, Left:left, Font:this.Font, IsMoveStep:this.IsMoveStep, HQChart:this.HQChart});\\r\\n        this.IsMoveStep=false;\\r\\n        if (!play) return;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(this.ChartBorder.GetChartHeight(), 0);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n        for(var i=0;i<play.length;++i)\\r\\n        {\\r\\n            var item=play[i];\\r\\n            if (item.Color) this.Canvas.fillStyle=item.Color;\\r\\n            else this.Canvas.fillStyle=this.TextColor;\\r\\n            if (item.Font) this.Canvas.font=item.Font.Name;\\r\\n            else this.Canvas.font=this.Font;\\r\\n\\r\\n            var fontHeight=this.FontHeight;\\r\\n            if (item.Font && item.Font.Height>0) fontHeight=item.Font.Height;\\r\\n            var yOffset=item.Y+parseInt((item.Height-fontHeight)/2);\\r\\n\\r\\n            this.Canvas.fillText(item.Text, right-item.X,top+yOffset);\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.ChartFrame.IsHScreen)\\r\\n        {\\r\\n            this.DrawHScreen();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var left=this.ChartBorder.GetLeft();\\r\\n        var right=this.ChartBorder.GetRight();\\r\\n        var top=this.ChartBorder.GetTopEx();\\r\\n        var height=this.ChartBorder.GetHeight();\\r\\n\\r\\n        if (height!=this.BarrageList.Height)\\r\\n            this.BarrageList.CacluatePlayLine(height);\\r\\n\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n\\r\\n        var play=this.BarrageList.GetPlayList({Canves:this.Canvas, Right:right, Left:left, Font:this.Font, IsMoveStep:this.IsMoveStep, HQChart:this.HQChart});\\r\\n        this.IsMoveStep=false;\\r\\n        if (!play) return;\\r\\n\\r\\n        for(var i=0;i<play.length;++i)\\r\\n        {\\r\\n            var item=play[i];\\r\\n            if (item.Color) this.Canvas.fillStyle=item.Color;\\r\\n            else this.Canvas.fillStyle=this.TextColor;\\r\\n            if (item.Font) this.Canvas.font=item.Font.Name;\\r\\n            else this.Canvas.font=this.Font;\\r\\n\\r\\n            var fontHeight=this.FontHeight;\\r\\n            if (item.Font && item.Font.Height>0) fontHeight=item.Font.Height;\\r\\n            var yOffset=item.Y+parseInt((item.Height-fontHeight)/2);\\r\\n\\r\\n            this.Canvas.fillText(item.Text, right-item.X,top+yOffset);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//坐标分割\\r\\n//\\r\\n//\\r\\n////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\nfunction IFrameSplitOperator()\\r\\n{\\r\\n    this.ChartBorder;                   //边框信息\\r\\n    this.Frame;                         //框架信息\\r\\n    this.FrameSplitData;                //坐标轴分割方法\\r\\n    this.SplitCount=5;                  //刻度个数\\r\\n    this.StringFormat=0;                //刻度字符串格式\\r\\n    this.IsShowLeftText=true;           //显示左边刻度\\r\\n    this.IsShowRightText=true;          //显示右边刻度\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.GetEventCallback;              //事件回调\\r\\n\\r\\n    //////////////////////\\r\\n    // data.Min data.Max data.Interval data.Count\\r\\n    //\\r\\n    this.IntegerCoordinateSplit=function(data)\\r\\n    {\\r\\n        var splitItem=this.FrameSplitData.Find(data.Interval);\\r\\n        if (!splitItem) return false;\\r\\n\\r\\n        if (data.Interval==splitItem.FixInterval) return true;\\r\\n\\r\\n        var fixMax=data.Max, fixMin=data.Min;\\r\\n\\r\\n        var maxValue=data.Max/splitItem.FixInterval;\\r\\n        var minValue=data.Min/splitItem.FixInterval;\\r\\n        //调整到整数倍数,不能整除的 +1\\r\\n        if (IFrameSplitOperator.IsFloat(maxValue)) fixMax=parseInt((maxValue+0.5).toFixed(0))*splitItem.FixInterval;\\r\\n        if (IFrameSplitOperator.IsFloat(minValue)) fixMin=parseInt((minValue-0.5).toFixed(0))*splitItem.FixInterval;\\r\\n\\r\\n        if (data.Min==0) fixMin=0;  //最小值是0 不用调整了.\\r\\n        if (fixMin<0 && data.Min>0) fixMin=0;   //都是正数的, 最小值最小调整为0\\r\\n\\r\\n        var count=0;\\r\\n        for(var i=fixMin;(i-fixMax)<0.00000001;i+=splitItem.FixInterval)\\r\\n        {\\r\\n            ++count;\\r\\n        }\\r\\n\\r\\n        data.Interval=splitItem.FixInterval;\\r\\n        data.Max=fixMax;\\r\\n        data.Min=fixMin;\\r\\n        data.Count=count;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.Filter = function (aryInfo,keepZero)\\r\\n    {\\r\\n        if (this.SplitCount <= 0 || aryInfo.length <= 0 || aryInfo.length <= this.SplitCount) return aryInfo;\\r\\n\\r\\n        //分割线比预设的多, 过掉一些\\r\\n        var filter = parseInt(aryInfo.length / this.SplitCount);\\r\\n        if (filter <= 1) filter = 2;\\r\\n        var data = [];\\r\\n        for (var i = 0; i < aryInfo.length; i += filter)\\r\\n        {\\r\\n            if (i + filter >= aryInfo.length && i != aryInfo.length - 1) //最后一个数据放进去\\r\\n            {\\r\\n                data.push(aryInfo[aryInfo.length - 1]);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                data.push(aryInfo[i]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.SplitCount == 2 && data.length>2) //之显示第1个和最后一个刻度\\r\\n        {\\r\\n            for(var i=1;i<data.length-1;++i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                item.Message[0]=null;\\r\\n                item.Message[1]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (keepZero)   //如果不存在0轴,增加一个0轴,刻度信息部显示\\r\\n        {\\r\\n            var bExsitZero=false;\\r\\n            for(var i=0;i<data;++i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (Math.abs(item.Value) < 0.00000001)\\r\\n                {\\r\\n                    bExsitZero=true;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (bExsitZero==false)\\r\\n            {\\r\\n                var zeroCoordinate = new CoordinateInfo();\\r\\n                zeroCoordinate.Value = 0;\\r\\n                zeroCoordinate.Message[0] = null\\r\\n                zeroCoordinate.Message[1] = null;\\r\\n                data.push(zeroCoordinate);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.RemoveZero = function (aryInfo)   //移除小数后面多余的0\\r\\n    {\\r\\n        //所有的数字小数点后面都0,才会去掉\\r\\n        var isAllZero = [true, true, true, true];\\r\\n        for (var i in aryInfo)\\r\\n        {\\r\\n            var item = aryInfo[i];\\r\\n            var message = item.Message[0];\\r\\n            if (!this.IsDecimalZeroEnd(message)) isAllZero[0] = false;\\r\\n\\r\\n            var message = item.Message[1];\\r\\n            if (!this.IsDecimalZeroEnd(message)) isAllZero[1] = false;\\r\\n\\r\\n            var message = item.Message[2];\\r\\n            if (!this.IsDecimalZeroEnd(message)) isAllZero[2] = false;\\r\\n\\r\\n            var message = item.Message[3];\\r\\n            if (!this.IsDecimalZeroEnd(message)) isAllZero[3] = false;\\r\\n        }\\r\\n\\r\\n        if (isAllZero[0] == false && isAllZero[1] == false && isAllZero[2]==false && isAllZero[3]==false) return;\\r\\n        for (var i in aryInfo)\\r\\n        {\\r\\n            var item = aryInfo[i];\\r\\n            if (isAllZero[0])\\r\\n            {\\r\\n                var message = item.Message[0];\\r\\n                if (message!=null)\\r\\n                {\\r\\n                    if (typeof (message) == 'number') message = message.toString();\\r\\n                    item.Message[0] = message.replace(/[.][0]+/g, '');\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (isAllZero[1])\\r\\n            {\\r\\n                var message = item.Message[1];\\r\\n                if (message!=null)\\r\\n                {\\r\\n                    if (typeof (message) == 'number') message = message.toString();\\r\\n                    item.Message[1] = message.replace(/[.][0]+/g, '');\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (isAllZero[2])\\r\\n            {\\r\\n                var message = item.Message[2];\\r\\n                if (message!=null)\\r\\n                {\\r\\n                    if (typeof (message) == 'number') message = message.toString();\\r\\n                    item.Message[2] = message.replace(/[.][0]+/g, '');\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (isAllZero[3])\\r\\n            {\\r\\n                var message = item.Message[3];\\r\\n                if (message!=null)\\r\\n                {\\r\\n                    if (typeof (message) == 'number') message = message.toString();\\r\\n                    item.Message[3] = message.replace(/[.][0]+/g, '');\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.IsDecimalZeroEnd = function (text)   //是否是0结尾的小数\\r\\n    {\\r\\n        if (text==null) return true;\\r\\n        if (typeof(text)=='number') text=text.toString();\\r\\n        if (text=='0') return true;\\r\\n\\r\\n        var pos = text.search(/[.]/);\\r\\n        if (pos < 0) return false;\\r\\n\\r\\n        for (var i = pos + 1; i < text.length; ++i)\\r\\n        {\\r\\n            var char = text.charAt(i);\\r\\n            if (char >= '1' && char <= '9') return false;\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//字符串格式化 千分位分割\\r\\nIFrameSplitOperator.FormatValueThousandsString=function(value,floatPrecision)\\r\\n{\\r\\n    if (value==null || isNaN(value))\\r\\n    {\\r\\n        if (floatPrecision>0)\\r\\n        {\\r\\n            var nullText='-.';\\r\\n            for(var i=0;i<floatPrecision;++i)\\r\\n                nullText+='-';\\r\\n            return nullText;\\r\\n        }\\r\\n\\r\\n        return '--';\\r\\n    }\\r\\n\\r\\n    var result='';\\r\\n    var num=value.toFixed(floatPrecision);\\r\\n    if(floatPrecision>0){\\r\\n        var numFloat = num.split('.')[1];\\r\\n        var numM = num.split('.')[0];\\r\\n        while (numM.length > 3)\\r\\n        {\\r\\n            result = ',' + numM.slice(-3) + result;\\r\\n            numM = numM.slice(0, numM.length - 3);\\r\\n        }\\r\\n        if (numM) { result = numM + result + '.' + numFloat; }\\r\\n    }else{\\r\\n        while (num.length > 3)\\r\\n        {\\r\\n            result = ',' + num.slice(-3) + result;\\r\\n            num = num.slice(0, num.length - 3);\\r\\n        }\\r\\n        if (num) { result = num + result; }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数据输出格式化 floatPrecision=小数位数\\r\\nIFrameSplitOperator.FormatValueString=function(value, floatPrecision,languageID)\\r\\n{\\r\\n    if (value==null || isNaN(value))\\r\\n    {\\r\\n        if (floatPrecision>0)\\r\\n        {\\r\\n            var nullText='-.';\\r\\n            for(var i=0;i<floatPrecision;++i)\\r\\n                nullText+='-';\\r\\n            return nullText;\\r\\n        }\\r\\n\\r\\n        return '--';\\r\\n    }\\r\\n\\r\\n    if (value<0.00000000001 && value>-0.00000000001)\\r\\n    {\\r\\n        return \\\"0\\\";\\r\\n    }\\r\\n\\r\\n    var absValue = Math.abs(value);\\r\\n    if (languageID===JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID)\\r\\n    {\\r\\n        if (absValue < 10000)\\r\\n            return value.toFixed(floatPrecision);\\r\\n        else if (absValue < 1000000)\\r\\n            return (value/1000).toFixed(floatPrecision)+\\\"K\\\";\\r\\n        else if (absValue < 1000000000)\\r\\n            return (value/1000000).toFixed(floatPrecision)+\\\"M\\\";\\r\\n        else if (absValue < 1000000000000)\\r\\n            return (value/1000000000).toFixed(floatPrecision)+\\\"B\\\";\\r\\n        else\\r\\n            return (value/1000000000000).toFixed(floatPrecision)+\\\"T\\\";\\r\\n    }\\r\\n    else if (languageID===JSCHART_LANGUAGE_ID.LANGUAGE_TRADITIONAL_CHINESE_ID)  //繁体\\r\\n    {\\r\\n        if (absValue < 10000)\\r\\n            return value.toFixed(floatPrecision);\\r\\n        else if (absValue < 100000000)\\r\\n            return (value/10000).toFixed(floatPrecision)+\\\"萬\\\";\\r\\n        else if (absValue < 1000000000000)\\r\\n            return (value/100000000).toFixed(floatPrecision)+\\\"億\\\";\\r\\n        else\\r\\n            return (value/1000000000000).toFixed(floatPrecision)+\\\"萬億\\\";\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        if (absValue < 10000)\\r\\n            return value.toFixed(floatPrecision);\\r\\n        else if (absValue < 100000000)\\r\\n            return (value/10000).toFixed(floatPrecision)+\\\"万\\\";\\r\\n        else if (absValue < 1000000000000)\\r\\n            return (value/100000000).toFixed(floatPrecision)+\\\"亿\\\";\\r\\n        else\\r\\n            return (value/1000000000000).toFixed(floatPrecision)+\\\"万亿\\\";\\r\\n    }\\r\\n\\r\\n    return '';\\r\\n}\\r\\n\\r\\n//整形输出格式化 floatPrecision=小数位数\\r\\nIFrameSplitOperator.FromatIntegerString=function(value, floatPrecision,languageID)\\r\\n{\\r\\n    if (value<10000 && IFrameSplitOperator.IsInteger(value)) floatPrecision=0;  //<10000的整形 去掉小数位数\\r\\n    return IFrameSplitOperator.FormatValueString(value, floatPrecision,languageID);\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.NumberToString=function(value)\\r\\n{\\r\\n    if (value<10) return '0'+value.toString();\\r\\n    return value.toString();\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.FormatDateString=function(value,format, languageID)\\r\\n{\\r\\n    var year=parseInt(value/10000);\\r\\n    var month=parseInt(value/100)%100;\\r\\n    var day=value%100;\\r\\n\\r\\n    switch(format)\\r\\n    {\\r\\n        case 'MM-DD':\\r\\n            return IFrameSplitOperator.NumberToString(month) + '-' + IFrameSplitOperator.NumberToString(day);\\r\\n        case \\\"YYYY/MM/DD\\\":\\r\\n            return year.toString() + '/' + IFrameSplitOperator.NumberToString(month) + '/' + IFrameSplitOperator.NumberToString(day);\\r\\n        case \\\"YYYY/MM/DD/W\\\":\\r\\n        {\\r\\n            var date=new Date(year,month-1,day);\\r\\n            var week=g_JSChartLocalization.GetText(WEEK_NAME[date.getDay()],languageID);\\r\\n            return year.toString() + '/' + IFrameSplitOperator.NumberToString(month) + '/' + IFrameSplitOperator.NumberToString(day)+\\\"/\\\"+ week.toString();\\r\\n        }\\r\\n        case \\\"DD/MM/YYYY\\\":\\r\\n            return IFrameSplitOperator.NumberToString(day) + '/' + IFrameSplitOperator.NumberToString(month) + '/' + year.toString();\\r\\n        default:\\r\\n            return year.toString() + '-' + IFrameSplitOperator.NumberToString(month) + '-' + IFrameSplitOperator.NumberToString(day);\\r\\n    }\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.FormatTimeString=function(value, format)    //format hh:mm:ss\\r\\n{\\r\\n    if (format=='HH:MM:SS')\\r\\n    {\\r\\n        var hour=parseInt(value/10000);\\r\\n        var minute=parseInt((value%10000)/100);\\r\\n        var second=value%100;\\r\\n        return IFrameSplitOperator.NumberToString(hour)+':'+ IFrameSplitOperator.NumberToString(minute) + ':' + IFrameSplitOperator.NumberToString(second);\\r\\n    }\\r\\n    else if (format=='HH:MM')\\r\\n    {\\r\\n        var hour=parseInt(value/100);\\r\\n        var minute=value%100;\\r\\n        return IFrameSplitOperator.NumberToString(hour)+':'+ IFrameSplitOperator.NumberToString(minute);\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        if (value<10000)\\r\\n        {\\r\\n            var hour=parseInt(value/100);\\r\\n            var minute=value%100;\\r\\n            return IFrameSplitOperator.NumberToString(hour)+':'+ IFrameSplitOperator.NumberToString(minute);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var hour=parseInt(value/10000);\\r\\n            var minute=parseInt((value%10000)/100);\\r\\n            var second=value%100;\\r\\n            return IFrameSplitOperator.NumberToString(hour)+':'+ IFrameSplitOperator.NumberToString(minute) + ':' + IFrameSplitOperator.NumberToString(second);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//报告格式化\\r\\nIFrameSplitOperator.FormatReportDateString=function(value)\\r\\n{\\r\\n    var year=parseInt(value/10000);\\r\\n    var month=parseInt(value/100)%100;\\r\\n    var monthText;\\r\\n    switch(month)\\r\\n    {\\r\\n        case 3:\\r\\n            monthText=\\\"一季度报\\\";\\r\\n            break;\\r\\n        case 6:\\r\\n            monthText=\\\"半年报\\\";\\r\\n            break;\\r\\n        case 9:\\r\\n            monthText=\\\"三季度报\\\";\\r\\n            break;\\r\\n        case 12:\\r\\n            monthText=\\\"年报\\\";\\r\\n            break;\\r\\n    }\\r\\n\\r\\n    return year.toString()+ monthText;\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.FormatDateTimeString=function(value,isShowDate,isShowTime)\\r\\n{\\r\\n    var aryValue=value.split(' ');\\r\\n    if (aryValue.length<2) return \\\"\\\";\\r\\n    var result=\\\"\\\";\\r\\n\\r\\n    if (isShowDate)\\r\\n    {\\r\\n        var date=parseInt(aryValue[0]);\\r\\n        var year=parseInt(date/10000);\\r\\n        var month=parseInt(date%10000/100);\\r\\n        var day=date%100;\\r\\n        var text=year.toString() +'-'+ (month<10? ('0'+month.toString()) :month.toString()) +'-'+ (day<10? ('0'+day.toString()):day.toString());\\r\\n        result+=text;\\r\\n    }\\r\\n\\r\\n    if (isShowTime)\\r\\n    {\\r\\n        var time=parseInt(aryValue[1]);\\r\\n        var minute=time%100;\\r\\n        var hour=parseInt(time/100);\\r\\n        var text=(hour<10? ('0'+hour.toString()):hour.toString()) + ':' + (minute<10?('0'+minute.toString()):minute.toString());\\r\\n        if (result.length>0) result+=\\\" \\\";\\r\\n        result+=text;\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//字段颜色格式化\\r\\nIFrameSplitOperator.FormatValueColor = function (value, value2)\\r\\n{\\r\\n    if (value != null && value2 == null)  //只传一个值的 就判断value正负\\r\\n    {\\r\\n        if (value == 0) return 'PriceNull';\\r\\n        else if (value > 0) return 'PriceUp';\\r\\n        else return 'PriceDown';\\r\\n    }\\r\\n\\r\\n    //2个数值对比 返回颜色\\r\\n    if (value == null || value2 == null) return 'PriceNull';\\r\\n    if (value == value2) return 'PriceNull';\\r\\n    else if (value > value2) return 'PriceUp';\\r\\n    else return 'PriceDown';\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.IsNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\n//判断是否是正数\\r\\nIFrameSplitOperator.IsPlusNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n\\r\\n    return value>0;\\r\\n}\\r\\n\\r\\n//是否是整形\\r\\nIFrameSplitOperator.IsInteger=function(x)\\r\\n{\\r\\n    return (typeof x === 'number') && (x % 1 === 0);\\r\\n}\\r\\n\\r\\n//判断字段是否存在\\r\\nIFrameSplitOperator.IsObjectExist=function(obj)\\r\\n{\\r\\n    if (obj===undefined) return false;\\r\\n    if (obj==null) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\n//是否时bool\\r\\nIFrameSplitOperator.IsBool=function(value)\\r\\n{\\r\\n    if (value===true || value===false) return true;\\r\\n    return false;\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.IsString=function(value)\\r\\n{\\r\\n    var type=typeof(value);\\r\\n    if (type=='string') return true;\\r\\n    return false;\\r\\n}\\r\\n\\r\\n//是否是非空的数组\\r\\nIFrameSplitOperator.IsNonEmptyArray=function(ary)\\r\\n{\\r\\n    if (!ary) return;\\r\\n    if (!Array.isArray(ary)) return;\\r\\n\\r\\n    return ary.length>0;\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.IsFloat=function(value)\\r\\n{\\r\\n    if (value===undefined) return false;\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n\\r\\n    return value!=parseInt(value);\\r\\n}\\r\\n\\r\\nIFrameSplitOperator.RemoveZero=function(strValue)\\r\\n{\\r\\n    while(strValue.length>0)\\r\\n    {\\r\\n        var index=strValue.length-1;\\r\\n        var ch=strValue[index];\\r\\n        if (ch==\\\"0\\\")\\r\\n        {\\r\\n            strValue=strValue.substr(0,index);\\r\\n        }\\r\\n        else if (ch==\\\".\\\")\\r\\n        {\\r\\n            strValue=strValue.substr(0,index);\\r\\n            break;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return strValue;\\r\\n}\\r\\n\\r\\nfunction FrameSplitKLinePriceY()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n    this.CoordinateType=0;  //坐标类型 0=普通坐标  1=百分比坐标 (右边坐标刻度) 2=对数对标 3=等比坐标 4=等分坐标 5=黄金分割\\r\\n    this.Symbol;\\r\\n    this.Data;              //K线数据 (计算百分比坐标)\\r\\n    this.FrameSplitData2;                //坐标轴分割方法(计算百分比刻度)\\r\\n    this.FloatPrecision=null;   //小数位数 (设置了就使用这个位数,否则使用品种对应的小数位数)\\r\\n\\r\\n    this.Period;            //周期\\r\\n    this.KLineChart;\\r\\n    this.Custom=[]; //[{Type:0}];   定制刻度 0=显示最后的价格刻度\\r\\n    this.SplitType=0;       //0=自动分割  1=固定分割 2=分笔图价格分割\\r\\n\\r\\n    this.DefaultYMaxMin;    //{ Max:null, Min:null };    //指定最大,最小, Y轴范围必须比最大值大， 比最小值小\\r\\n    this.FixedYMaxMin;      //{ Max, Min} 固定Y轴最大最小值\\r\\n    this.EnableZoomUpDown=false;    //上下左右拖拽\\r\\n    this.LastMaxMin;        //当前显示的最高最低范围\\r\\n\\r\\n    this.PercentageTextFormat=0;    //0=显示第1行  1=显示2行 2=单行格式: 价格/百分比\\r\\n\\r\\n    this.IsEnableDragY=function()\\r\\n    {\\r\\n        return this.CoordinateType==0 || this.CoordinateType==1;\\r\\n    }\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        var splitData={};\\r\\n        splitData.Max=this.Frame.HorizontalMax;\\r\\n        splitData.Min=this.Frame.HorizontalMin;\\r\\n        splitData.Count=this.SplitCount;\\r\\n\\r\\n        if (splitData.Max==splitData.Min)   //如果一样上下扩大下\\r\\n        {\\r\\n            splitData.Max+=splitData.Max*0.01;\\r\\n            splitData.Min-=splitData.Min*0.01\\r\\n        }\\r\\n\\r\\n        var isFixedMaxMin=(this.FixedYMaxMin && IFrameSplitOperator.IsNumber(this.FixedYMaxMin.Max) && IFrameSplitOperator.IsNumber(this.FixedYMaxMin.Min));\\r\\n        if (isFixedMaxMin)\\r\\n        {\\r\\n            splitData.Max=this.FixedYMaxMin.Max;\\r\\n            splitData.Min=this.FixedYMaxMin.Min;\\r\\n            //JSConsole.Chart.Log(`[FrameSplitKLinePriceY::Operator] FixedYMaxMin.Max=${this.FixedYMaxMin.Max} FixedYMaxMin.Min=${this.FixedYMaxMin.Min} `);\\r\\n        }\\r\\n        else if (this.DefaultYMaxMin)    //指定最小的Y轴范围\\r\\n        {\\r\\n            var range=this.DefaultYMaxMin;\\r\\n            if (IFrameSplitOperator.IsNumber(range.Max))\\r\\n            {\\r\\n                if (splitData.Min>range.Max) splitData.Min=range.Max;\\r\\n                else if (splitData.Max<range.Max) splitData.Max=range.Max;\\r\\n            }\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(range.Min))\\r\\n            {\\r\\n                if (splitData.Max<range.Min) splitData.Max=range.Min;\\r\\n                else if (splitData.Min>range.Min) splitData.Min=range.Min;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);\\r\\n        var pixelTatio = GetDevicePixelRatio();             //获取设备的分辨率\\r\\n        var width=this.Frame.ChartBorder.GetChartWidth();   //画布的宽度\\r\\n        var isPhoneModel=width<450*pixelTatio;\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        if (isPhoneModel && MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol)) defaultfloatPrecision = 0;    //手机端指数不显示小数位数,太长了\\r\\n        if (this.FloatPrecision!=null) defaultfloatPrecision=this.FloatPrecision;\\r\\n        JSConsole.Chart.Log(`[FrameSplitKLinePriceY::Operator] Max=${splitData.Max} Min=${splitData.Min} Count=${splitData.Count} isPhoneModel=${isPhoneModel} defaultfloatPrecision=${defaultfloatPrecision} `);\\r\\n\\r\\n        this.Frame.Logarithmic=null;\\r\\n        this.Frame.MultiTextFormat=0;\\r\\n        var bFilter=true;   //是否需要通过高度过滤刻度\\r\\n        splitData.IsFixedMaxMin=isFixedMaxMin;\\r\\n        splitData.IsFilter=bFilter;\\r\\n        if (ChartData.IsTickPeriod(this.Period))\\r\\n        {\\r\\n            this.SplitTickData(splitData,defaultfloatPrecision);\\r\\n            bFilter=splitData.IsFilter;\\r\\n        }\\r\\n        else if (FrameSplitKLinePriceY.SplitCustom)\\r\\n        {\\r\\n            FrameSplitKLinePriceY.SplitCustom(this,splitData,defaultfloatPrecision);    //自定义分割\\r\\n            bFilter=false;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            switch(this.CoordinateType)\\r\\n            {\\r\\n                case 1:\\r\\n                    if (!this.SplitPercentage(splitData,defaultfloatPrecision,isFixedMaxMin))\\r\\n                    {\\r\\n                        this.SplitDefault(splitData,defaultfloatPrecision,isFixedMaxMin);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.Frame.MultiTextFormat=this.PercentageTextFormat;\\r\\n                        bFilter=false;\\r\\n                    }\\r\\n                    break;\\r\\n                case 3: //等比坐标 +10%/-10% 涨幅分割\\r\\n                    if (!this.SplitIncrease(splitData,defaultfloatPrecision))\\r\\n                        this.SplitDefault(splitData,defaultfloatPrecision);\\r\\n                    else\\r\\n                        bFilter=false;\\r\\n                    break;\\r\\n                case 4: //等分坐标\\r\\n                    this.SplitAverage(splitData,defaultfloatPrecision);\\r\\n                    bFilter=false;\\r\\n                    break;\\r\\n                case 5: //黄金分割\\r\\n                    this.SplitGoldenSection(splitData,defaultfloatPrecision);\\r\\n                    bFilter=false;\\r\\n                    break;\\r\\n                case 2: //对数坐标\\r\\n                    if (this.SplitLogarithmic(splitData,defaultfloatPrecision))\\r\\n                    {\\r\\n                        bFilter=false;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.SplitDefault(splitData,defaultfloatPrecision);\\r\\n                    }\\r\\n                    break;\\r\\n                default:\\r\\n                    if (this.SplitType==1)\\r\\n                    {\\r\\n                        this.SplitFixed(splitData,defaultfloatPrecision);\\r\\n                        bFilter=false;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        this.SplitDefault(splitData,defaultfloatPrecision,isFixedMaxMin);\\r\\n                    }\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.CustomCoordinate(defaultfloatPrecision);\\r\\n        if (bFilter) this.Frame.HorizontalInfo = this.Filter(this.Frame.HorizontalInfo,false);\\r\\n        this.Frame.HorizontalMax=splitData.Max;\\r\\n        this.Frame.HorizontalMin=splitData.Min;\\r\\n\\r\\n        if (this.EnableZoomUpDown==true && !this.FixedYMaxMin)\\r\\n            this.FixedYMaxMin={ Max:splitData.Max, Min:splitData.Min };\\r\\n\\r\\n        /*\\r\\n        for(var i=0;i<this.Frame.HorizontalInfo.length;++i)\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[FrameSplitKLinePriceY::Operator] ${i}=${this.Frame.HorizontalInfo[i].Message[0]}`);\\r\\n        }\\r\\n        */\\r\\n\\r\\n        JSConsole.Chart.Log(`[FrameSplitKLinePriceY::Operator] fixed . Max=${splitData.Max} Min=${splitData.Min} Count=${splitData.Count}`);\\r\\n\\r\\n        if (this.GetEventCallback)\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_YCOORDINATE);\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data={ID:this.Frame.Identify, Frame:this.Frame };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitTickData=function(splitData,floatPrecision)\\r\\n    {\\r\\n        switch(this.CoordinateType)\\r\\n        {\\r\\n            case 1: //百分比\\r\\n                if (!this.SplitPercentage(splitData,floatPrecision,splitData.IsFixedMaxMin))\\r\\n                {\\r\\n                    this.SplitDefault(splitData,floatPrecision,splitData.IsFixedMaxMin);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Frame.MultiTextFormat=this.PercentageTextFormat;\\r\\n                    splitData.IsFilter=false;\\r\\n                }\\r\\n                break;\\r\\n            default:\\r\\n                if (this.SplitType==3)\\r\\n                {\\r\\n                    this.SplitTickPrice(splitData,floatPrecision);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.SplitDefault(splitData, floatPrecision, splitData.IsFixedMaxMin);\\r\\n                }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitTickPrice=function(splitData,floatPrecision)\\r\\n    {\\r\\n        var aryPrice=this.KLineChart.GetAllPrice();\\r\\n\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n        for(var i in aryPrice)\\r\\n        {\\r\\n            var value=aryPrice[i];\\r\\n            this.Frame.HorizontalInfo[i]= new CoordinateInfo();\\r\\n            this.Frame.HorizontalInfo[i].Value=value;\\r\\n            if (this.IsShowLeftText) this.Frame.HorizontalInfo[i].Message[0]=value.toFixed(floatPrecision);\\r\\n            if (this.IsShowRightText) this.Frame.HorizontalInfo[i].Message[1]=value.toFixed(floatPrecision);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitPercentage=function(splitData,floatPrecision,isFixedMaxMin)    //百分比坐标\\r\\n    {\\r\\n        var firstOpenPrice=this.GetFirstOpenPrice();\\r\\n        if (!IFrameSplitOperator.IsNumber(firstOpenPrice)) return false;\\r\\n\\r\\n        splitData.Max=(splitData.Max-firstOpenPrice)/firstOpenPrice;\\r\\n        splitData.Min=(splitData.Min-firstOpenPrice)/firstOpenPrice;\\r\\n        splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);\\r\\n        if (!isFixedMaxMin) this.IntegerCoordinateSplit2(splitData);\\r\\n\\r\\n        var minValue=(1+splitData.Min)*firstOpenPrice;\\r\\n        var maxValue=(1+splitData.Max)*firstOpenPrice;\\r\\n\\r\\n        var textColor;\\r\\n        if (g_JSChartResource.Frame && g_JSChartResource.Frame.PercentageText)\\r\\n        {\\r\\n            var item=g_JSChartResource.Frame.PercentageText;\\r\\n            textColor={PriceColor:item.PriceColor, PercentageColor:item.PercentageColor, SplitColor:item.SplitColor, Font:item.Font };\\r\\n        }\\r\\n\\r\\n        var aryHorizontal=[];\\r\\n        for(var value=0;value<=splitData.Max; value+=splitData.Interval)\\r\\n        {\\r\\n            var price=(value+1)*firstOpenPrice;\\r\\n            var item=new CoordinateInfo();\\r\\n            item.Value=price;\\r\\n            if (this.IsShowLeftText) item.Message[0]=price.toFixed(floatPrecision);     //左边价格坐标\\r\\n\\r\\n            if (this.IsShowRightText)\\r\\n            {\\r\\n                var strPrice=price.toFixed(floatPrecision);\\r\\n                var text=(value*100).toFixed(2);    //右边百分比\\r\\n                text=IFrameSplitOperator.RemoveZero(text);\\r\\n                text+='%';\\r\\n                item.Message[1]=[text,strPrice];\\r\\n                item.ExtendData=textColor;\\r\\n            }\\r\\n            aryHorizontal.push(item);\\r\\n        }\\r\\n\\r\\n        for(var value=-splitData.Interval;value>=splitData.Min;value-=splitData.Interval)\\r\\n        {\\r\\n            var price=(value+1)*firstOpenPrice;\\r\\n            if (price<minValue || price>maxValue) continue;\\r\\n\\r\\n            var item=new CoordinateInfo();\\r\\n            item.Value=price;\\r\\n            if (this.IsShowLeftText) item.Message[0]=price.toFixed(floatPrecision);   //左边价格坐标\\r\\n            if (this.IsShowRightText)\\r\\n            {\\r\\n                var strPrice=price.toFixed(floatPrecision);\\r\\n                var text=(value*100).toFixed(2);    //右边百分比\\r\\n                text=IFrameSplitOperator.RemoveZero(text);\\r\\n                text+='%';\\r\\n                item.Message[1]=[text,strPrice];\\r\\n                item.ExtendData=textColor;\\r\\n            }\\r\\n            aryHorizontal.push(item);\\r\\n        }\\r\\n\\r\\n        aryHorizontal.sort((left, right)=>\\r\\n        {\\r\\n            return left.Value - right.Value;\\r\\n        });\\r\\n\\r\\n        this.Frame.HorizontalInfo=aryHorizontal;\\r\\n\\r\\n        splitData.Min=minValue; //最大最小值调整\\r\\n        splitData.Max=maxValue;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //等比坐标 当前屏最后第2根K线的收盘加为基准, 上下涨幅10%分割\\r\\n    this.SplitIncrease=function(splitData,floatPrecision)\\r\\n    {\\r\\n        var basePrice=this.GetLast2ndClose();\\r\\n        if (!IFrameSplitOperator.IsNumber(basePrice)) return false;\\r\\n        this.IntegerCoordinateSplit(splitData);\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n\\r\\n        var increase=g_JSChartResource.FrameSplitIncrease.Increase;\\r\\n        var aryHorizontal=[];\\r\\n        for(var price=basePrice; price<splitData.Max; price=price*(1+increase))\\r\\n        {\\r\\n            var item= new CoordinateInfo();\\r\\n            item.Value=price;\\r\\n            var text=price.toFixed(floatPrecision);\\r\\n            if (this.IsShowLeftText) item.Message[0]=text;\\r\\n            if (this.IsShowRightText) item.Message[1]=text;\\r\\n            aryHorizontal.push(item);\\r\\n        }\\r\\n\\r\\n        for(var price=basePrice*0.9;price>splitData.Min; price=price*(1-increase))\\r\\n        {\\r\\n            var item= new CoordinateInfo();\\r\\n            item.Value=price;\\r\\n            var text=price.toFixed(floatPrecision);\\r\\n            if (this.IsShowLeftText) item.Message[0]=text;\\r\\n            if (this.IsShowRightText) item.Message[1]=text;\\r\\n            aryHorizontal.push(item);\\r\\n        }\\r\\n\\r\\n        this.Frame.HorizontalInfo=aryHorizontal;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //等分坐标：以画面显示的最高价、最低价为基准，对这个区域N等分，显示分割的数值线\\r\\n    this.SplitAverage=function(splitData,floatPrecision)\\r\\n    {\\r\\n        var max=splitData.Max;\\r\\n        var min=splitData.Min;\\r\\n        //this.IntegerCoordinateSplit(splitData);\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n        var count=g_JSChartResource.FrameSplitAverage.Count;\\r\\n        var interval=(max-min)/count;\\r\\n\\r\\n        for(var i=0;i<=count;++i)\\r\\n        {\\r\\n            var item=new CoordinateInfo();\\r\\n            item.Value=min+interval*i;\\r\\n            var text=item.Value.toFixed(floatPrecision);\\r\\n            if (this.IsShowLeftText)  item.Message[0]=text;\\r\\n            if (this.IsShowRightText)   item.Message[1]=text;\\r\\n\\r\\n            this.Frame.HorizontalInfo[i]=item;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitGoldenSection=function(splitData,floatPrecision)\\r\\n    {\\r\\n        var max=splitData.Max;\\r\\n        var min=splitData.Min;\\r\\n        //this.IntegerCoordinateSplit(splitData);\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n\\r\\n        var aryHorizontal=[];\\r\\n        var GOLDEN_ARRAY=g_JSChartResource.FrameGoldenSection.Golden;\\r\\n        for(var i in GOLDEN_ARRAY)\\r\\n        {\\r\\n            var value=(max-min)*GOLDEN_ARRAY[i]+min;\\r\\n            item=new CoordinateInfo();\\r\\n            item.Value=value;\\r\\n            var text=value.toFixed(floatPrecision);\\r\\n            if (this.IsShowLeftText)  item.Message[0]=text;\\r\\n            if (this.IsShowRightText)   item.Message[1]=text;\\r\\n            aryHorizontal.push(item);\\r\\n        }\\r\\n\\r\\n        this.Frame.HorizontalInfo=aryHorizontal;\\r\\n    }\\r\\n\\r\\n    this.SplitLogarithmic=function(splitData,floatPrecision) //对数坐标\\r\\n    {\\r\\n        var minInterval=g_JSChartResource.FrameLogarithmic.MinInterval;       //最小间距\\r\\n        var firstOpenPrice=this.GetFirstOpenPrice();    //获取当前屏第1个K线的开盘价\\r\\n        if (!IFrameSplitOperator.IsNumber(firstOpenPrice)) return false;\\r\\n        var height=this.ChartBorder.GetHeightEx();\\r\\n\\r\\n        var ARRAY_INCREASE=[0.01, 0.02, 0.04, 0.08, 0.1, 0.2];\\r\\n        var increase=ARRAY_INCREASE[ARRAY_INCREASE.length-1];\\r\\n        for(var i=0; i<ARRAY_INCREASE.length;++i)\\r\\n        {\\r\\n            var value=ARRAY_INCREASE[i];\\r\\n            var interval=(firstOpenPrice*value)*(height/(splitData.Max-splitData.Min));\\r\\n            if (interval>minInterval)\\r\\n            {\\r\\n                increase=value;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var aryUp=[];\\r\\n        var price=firstOpenPrice;\\r\\n        var i=increase;\\r\\n        do\\r\\n        {\\r\\n            var item={ Start:price };\\r\\n            price=firstOpenPrice*(1+i);\\r\\n            item.End=price;\\r\\n            aryUp.push(item);\\r\\n\\r\\n            i+=increase;\\r\\n        } while(price<splitData.Max);\\r\\n        var max=price;\\r\\n\\r\\n        var aryDown=[];\\r\\n        var price=firstOpenPrice;\\r\\n        var i=increase;\\r\\n        do\\r\\n        {\\r\\n            var item={ End:price };\\r\\n            price=firstOpenPrice*(1-i);\\r\\n            item.Start=price;\\r\\n            aryDown.push(item);\\r\\n\\r\\n            i+=increase;\\r\\n        } while(price>splitData.Min);\\r\\n        var min=price;\\r\\n\\r\\n        splitData.Max=max;\\r\\n        splitData.Min=min;\\r\\n\\r\\n        JSConsole.Chart.Log(\\\"[FrameSplitKLinePriceY::SplitLogarithmic] up, down\\\", aryUp, aryDown);\\r\\n\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n        var item=new CoordinateInfo();\\r\\n        item.Value=firstOpenPrice;\\r\\n        item.Font=g_JSChartResource.FrameLogarithmic.OpenPriceFont;\\r\\n        var strText=item.Value.toFixed(floatPrecision);\\r\\n        if (this.IsShowLeftText) item.Message[0]=strText;     //左边价格坐标\\r\\n        if (this.IsShowRightText) item.Message[1]=strText;    //右边价格坐标\\r\\n        this.Frame.HorizontalInfo.push(item);\\r\\n\\r\\n        for(var i in aryUp)\\r\\n        {\\r\\n            var item=new CoordinateInfo();\\r\\n            item.Value=aryUp[i].End;\\r\\n            var strText=item.Value.toFixed(floatPrecision);\\r\\n            if (this.IsShowLeftText) item.Message[0]=strText;     //左边价格坐标\\r\\n            if (this.IsShowRightText) item.Message[1]=strText;    //右边价格坐标\\r\\n            this.Frame.HorizontalInfo.push(item);\\r\\n        }\\r\\n\\r\\n        for(var i in aryDown)\\r\\n        {\\r\\n            var item=new CoordinateInfo();\\r\\n            item.Value=aryDown[i].End;\\r\\n            var strText=item.Value.toFixed(floatPrecision);\\r\\n            if (this.IsShowLeftText) item.Message[0]=strText;     //左边价格坐标\\r\\n            if (this.IsShowRightText) item.Message[1]=strText;    //右边价格坐标\\r\\n            this.Frame.HorizontalInfo.splice(0,0,item);\\r\\n        }\\r\\n\\r\\n        this.Frame.Logarithmic={ Up:aryUp, Down:aryDown, OpenPrice:firstOpenPrice };\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.SplitDefault=function(splitData,floatPrecision,isFixedMaxMin)       //默认坐标\\r\\n    {\\r\\n        //固定最大最小值 不自动调整范围\\r\\n        if (!isFixedMaxMin) this.IntegerCoordinateSplit(splitData);\\r\\n\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n        for(var i=0,value=splitData.Min;i<splitData.Count;++i,value+=splitData.Interval)\\r\\n        {\\r\\n            this.Frame.HorizontalInfo[i]= new CoordinateInfo();\\r\\n            this.Frame.HorizontalInfo[i].Value=value;\\r\\n            if (this.IsShowLeftText)  this.Frame.HorizontalInfo[i].Message[0]=value.toFixed(floatPrecision);\\r\\n            if (this.IsShowRightText)   this.Frame.HorizontalInfo[i].Message[1]=value.toFixed(floatPrecision);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitFixed=function(splitData,floatPrecision)      //固定分割坐标\\r\\n    {\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n        for(var i=0,value=splitData.Min;i<splitData.Count;++i,value+=splitData.Interval)\\r\\n        {\\r\\n            this.Frame.HorizontalInfo[i]= new CoordinateInfo();\\r\\n            this.Frame.HorizontalInfo[i].Value=value;\\r\\n            if (this.IsShowLeftText)  this.Frame.HorizontalInfo[i].Message[0]=value.toFixed(floatPrecision);\\r\\n            if (this.IsShowRightText)   this.Frame.HorizontalInfo[i].Message[1]=value.toFixed(floatPrecision);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CustomCoordinate=function(floatPrecision)\\r\\n    {\\r\\n        this.Frame.CustomHorizontalInfo=[];\\r\\n        for(var i in this.Custom)\\r\\n        {\\r\\n            var item=this.Custom[i];\\r\\n            if (item.Type==0)\\r\\n            {\\r\\n                var dec=floatPrecision;\\r\\n                //外部设置小数位数\\r\\n                if (IFrameSplitOperator.IsNumber(item.FloatPrecision) && item.FloatPrecision>=0) dec=item.FloatPrecision;\\r\\n                var latestItem=this.GetLatestPrice(dec,item);\\r\\n                if (latestItem) this.Frame.CustomHorizontalInfo.push(latestItem);\\r\\n            }\\r\\n            else if (item.Type==1)\\r\\n            {\\r\\n                this.CustomFixedCoordinate(item);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetLatestPrice=function(floatPrecision,option)\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return null;\\r\\n        if (this.Data.Data.length<=0) return null;\\r\\n        var latestItem=this.Data.Data[this.Data.Data.length-1];\\r\\n        var info=new CoordinateInfo();\\r\\n        info.Type=0;\\r\\n        info.Value=latestItem.Close;\\r\\n        info.TextColor=g_JSChartResource.FrameLatestPrice.TextColor;\\r\\n        info.LineType=2;    //虚线\\r\\n        var strPrice=latestItem.Close.toFixed(floatPrecision);\\r\\n        if (option.DateTime=='HH:MM' && ChartData.IsMinutePeriod(this.Period,true))\\r\\n        {\\r\\n            var strTime=IFrameSplitOperator.FormatTimeString(latestItem.Time,option.DateTime);\\r\\n            var aryText=[{Text:strPrice}, { Text:strTime} ];\\r\\n            if (option.Position=='left') info.Message[0]=aryText;\\r\\n            else info.Message[1]=aryText;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (option.Position=='left') info.Message[0]=strPrice\\r\\n            else info.Message[1]=strPrice;\\r\\n        }\\r\\n\\r\\n        if (latestItem.Close>latestItem.Open) info.LineColor=g_JSChartResource.FrameLatestPrice.UpBarColor;\\r\\n        else if (latestItem.Close<latestItem.Open) info.LineColor=g_JSChartResource.FrameLatestPrice.DownBarColor;\\r\\n        else info.LineColor=g_JSChartResource.FrameLatestPrice.UnchagneBarColor;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;\\r\\n        if (option.IsShowLine==false) info.LineType=-1;\\r\\n\\r\\n        return info;\\r\\n    }\\r\\n\\r\\n    this.GetFirstOpenPrice=function()   //获取显示第1个数据的开盘价\\r\\n    {\\r\\n        if (!this.Data) return null;\\r\\n\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            if (ChartData.IsTickPeriod(this.Period))\\r\\n                return data.YClose;\\r\\n            else\\r\\n                return data.Open;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetLast2ndClose=function() //获取最后第2根K线收盘加\\r\\n    {\\r\\n        if (!this.Data) return null;\\r\\n        if (this.Data.Data.length<=0) return null;\\r\\n\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        var endIndex=this.Data.DataOffset+xPointCount-1;\\r\\n        if (endIndex>=this.Data.Data.length) endIndex=this.Data.Data.length-1;\\r\\n        var price=null;\\r\\n        for(var i=endIndex, count=0; i>=0 && i<this.Data.Data.length; --i)\\r\\n        {\\r\\n            var data=this.Data.Data[i];\\r\\n            if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;\\r\\n\\r\\n            if (count==0) price=data.Open;\\r\\n            else if (count==1) price=data.Close;\\r\\n\\r\\n            ++count;\\r\\n            if (count>=2) break;\\r\\n        }\\r\\n\\r\\n        return price;\\r\\n    }\\r\\n\\r\\n    this.CustomFixedCoordinate=function(option)    //固定坐标刻度\\r\\n    {\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        for(var i in option.Data)\\r\\n        {\\r\\n            var item=option.Data[i];\\r\\n            var info=new CoordinateInfo();\\r\\n            info.Type=1;\\r\\n            info.TextColor=item.TextColor;\\r\\n            info.LineColor=item.Color;\\r\\n            info.LineType=2;    //虚线\\r\\n            if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;\\r\\n            if (option.IsShowLine==false) info.LineType=-1;\\r\\n\\r\\n            info.Value=item.Value;\\r\\n            var text;\\r\\n            if (item.Text) text=item.Text;\\r\\n            else text=info.Value.toFixed(defaultfloatPrecision);\\r\\n            if (option.Position=='left') info.Message[0]=text;\\r\\n            else info.Message[1]=text;\\r\\n\\r\\n            this.Frame.CustomHorizontalInfo.push(info);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //////////////////////\\r\\n    // data.Min data.Max data.Interval data.Count\\r\\n    //\\r\\n    this.IntegerCoordinateSplit2=function(data)\\r\\n    {\\r\\n        var splitItem=this.FrameSplitData2.Find(data.Interval);\\r\\n        if (!splitItem) return false;\\r\\n\\r\\n        if (data.Interval==splitItem.FixInterval) return true;\\r\\n\\r\\n        //调整到整数倍数,不能整除的 +1\\r\\n        var fixMax=parseInt((data.Max/(splitItem.FixInterval)+0.5).toFixed(0))*splitItem.FixInterval;\\r\\n        var fixMin=parseInt((data.Min/(splitItem.FixInterval)-0.5).toFixed(0))*splitItem.FixInterval;\\r\\n        if (data.Min==0) fixMin=0;  //最小值是0 不用调整了.\\r\\n        if (fixMin<0 && data.Min>0) fixMin=0;   //都是正数的, 最小值最小调整为0\\r\\n\\r\\n        var count=0;\\r\\n        for(var i=fixMin;(i-fixMax)<0.00000001;i+=splitItem.FixInterval)\\r\\n        {\\r\\n            ++count;\\r\\n        }\\r\\n\\r\\n        data.Interval=splitItem.FixInterval;\\r\\n        data.Max=fixMax;\\r\\n        data.Min=fixMin;\\r\\n        data.Count=count;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction FrameSplitY()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.SplitCount=3;                        //刻度个数\\r\\n    this.FloatPrecision = 2;                  //坐标小数位数(默认2)\\r\\n    this.FLOATPRECISION_RANGE=[1,0.1,0.01,0.001,0.0001];\\r\\n    this.SplitType=0;       //0=自动分割  1=固定分割\\r\\n    this.Custom=[];         //[{Type:0}]; 定制刻度\\r\\n    this.DefaultYMaxMin;    //{ Max:null, Min:null };    //指定最大,最小, Y轴范围必须比最大值大， 比最小值小\\r\\n    this.EnableRemoveZero=true;\\r\\n    this.LineType=null;     //线段样式\\r\\n    this.IgnoreYValue = null;                 //在这个数组里的数字不显示在刻度上\\r\\n    this.FixedYMaxMin;      //{ Max, Min} 固定Y轴最大最小值\\r\\n    this.EnableZoomUpDown=false;\\r\\n\\r\\n    this.IsBeforeData=false;\\r\\n    this.BeforeOpenData;\\r\\n\\r\\n    this.IsAfterData=false;\\r\\n    this.AfterCloseData;\\r\\n\\r\\n    this.MultiDayBeforeOpenData;\\r\\n    this.MultiDayAfterCloseData;\\r\\n\\r\\n    this.IsEnableDragY=function()\\r\\n    {\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetFloatPrecision=function(value,floatPrecision)\\r\\n    {\\r\\n        if (value>this.FLOATPRECISION_RANGE[0]) return floatPrecision;\\r\\n        if (floatPrecision<0) return 2;\\r\\n        for(;floatPrecision<this.FLOATPRECISION_RANGE.length;++floatPrecision)\\r\\n        {\\r\\n            if (value>this.FLOATPRECISION_RANGE[floatPrecision]) break;\\r\\n        }\\r\\n\\r\\n        return floatPrecision;\\r\\n    }\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        var splitData={};\\r\\n        splitData.Max=this.Frame.HorizontalMax;\\r\\n        splitData.Min=this.Frame.HorizontalMin;\\r\\n\\r\\n        if (splitData.Max==splitData.Min)   //如果一样上下扩大下\\r\\n        {\\r\\n            if (splitData.Max==0)\\r\\n            {\\r\\n                splitData.Max=1;\\r\\n                splitData.Min=-1;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                splitData.Max+=splitData.Max*0.01;\\r\\n                splitData.Min-=splitData.Min*0.01;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var isFixedMaxMin=false;\\r\\n        if (this.FixedYMaxMin && IFrameSplitOperator.IsNumber(this.FixedYMaxMin.Max) && IFrameSplitOperator.IsNumber(this.FixedYMaxMin.Min)) isFixedMaxMin=true;\\r\\n        if (isFixedMaxMin)\\r\\n        {\\r\\n            splitData.Max=this.FixedYMaxMin.Max;\\r\\n            splitData.Min=this.FixedYMaxMin.Min;\\r\\n        }\\r\\n        else if (this.DefaultYMaxMin)    //指定最小的Y轴范围\\r\\n        {\\r\\n            var range=this.DefaultYMaxMin;\\r\\n            if (IFrameSplitOperator.IsNumber(range.Max))\\r\\n            {\\r\\n                if (splitData.Min>range.Max) splitData.Min=range.Max;\\r\\n                else if (splitData.Max<range.Max) splitData.Max=range.Max;\\r\\n            }\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(range.Min))\\r\\n            {\\r\\n                if (splitData.Max<range.Min) splitData.Max=range.Min;\\r\\n                else if (splitData.Min>range.Min) splitData.Min=range.Min;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if(this.Frame.YSpecificMaxMin)\\r\\n        {\\r\\n            splitData.Count=this.Frame.YSpecificMaxMin.Count;\\r\\n            splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);\\r\\n        }\\r\\n        else if (this.SplitType==1 || isFixedMaxMin)\\r\\n        {\\r\\n            splitData.Count=this.SplitCount;\\r\\n            splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            splitData.Count=this.SplitCount;\\r\\n            splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);\\r\\n            this.IntegerCoordinateSplit(splitData);\\r\\n        }\\r\\n\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n\\r\\n        if (this.Frame.YSplitScale) //固定坐标\\r\\n        {\\r\\n            for(var i in this.Frame.YSplitScale)\\r\\n            {\\r\\n                var value=this.Frame.YSplitScale[i];\\r\\n                var coordinate=new CoordinateInfo();\\r\\n                coordinate.Value=value;\\r\\n                if (IFrameSplitOperator.IsNumber(this.LineType)) coordinate.LineType=this.LineType;\\r\\n\\r\\n                var absValue=Math.abs(value);\\r\\n                if (absValue<0.0000000001)\\r\\n                {\\r\\n                    coordinate.Message[1]=0;\\r\\n                }\\r\\n                else if (absValue<this.FLOATPRECISION_RANGE[this.FLOATPRECISION_RANGE.length-1])\\r\\n                {\\r\\n                    coordinate.Message[1] = value.toExponential(2).toString();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var floatPrecision=this.GetFloatPrecision(absValue,this.FloatPrecision); //数据比小数位数还小, 调整小数位数\\r\\n                    coordinate.Message[1] = IFrameSplitOperator.FormatValueString(value, floatPrecision,this.LanguageID);\\r\\n                }\\r\\n\\r\\n                coordinate.Message[0]=coordinate.Message[1];\\r\\n\\r\\n                if (this.IsShowLeftText==false) this.Frame.HorizontalInfo[i].Message[0]=null;\\r\\n                if (this.IsShowRightText==false) this.Frame.HorizontalInfo[i].Message[1]=null;\\r\\n\\r\\n                this.Frame.HorizontalInfo.push(coordinate);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0,value=splitData.Min;i<splitData.Count;++i,value+=splitData.Interval)\\r\\n            {\\r\\n                var coordinate=new CoordinateInfo();\\r\\n                this.Frame.HorizontalInfo[i]= coordinate;\\r\\n                coordinate.Value=value;\\r\\n                if (IFrameSplitOperator.IsNumber(this.LineType)) coordinate.LineType=this.LineType;\\r\\n\\r\\n                if (this.StringFormat==1)   //手机端格式 如果有万,亿单位了 去掉小数\\r\\n                {\\r\\n                    var floatPrecision=this.FloatPrecision;\\r\\n                    if (!isNaN(value) && Math.abs(value) > 1000) floatPrecision=0;\\r\\n                    this.Frame.HorizontalInfo[i].Message[1]=IFrameSplitOperator.FormatValueString(value,floatPrecision,this.LanguageID);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var absValue=Math.abs(value);\\r\\n                    if (absValue<0.0000000001)\\r\\n                    {\\r\\n                        this.Frame.HorizontalInfo[i].Message[1]=0;\\r\\n                    }\\r\\n                    else if (absValue<this.FLOATPRECISION_RANGE[this.FLOATPRECISION_RANGE.length-1])\\r\\n                    {\\r\\n                        this.Frame.HorizontalInfo[i].Message[1] = value.toExponential(2).toString();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var floatPrecision=this.GetFloatPrecision(absValue,this.FloatPrecision); //数据比小数位数还小, 调整小数位数\\r\\n                        this.Frame.HorizontalInfo[i].Message[1] = IFrameSplitOperator.FormatValueString(value, floatPrecision,this.LanguageID);\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                this.Frame.HorizontalInfo[i].Message[0]=this.Frame.HorizontalInfo[i].Message[1];\\r\\n                if (this.IsShowLeftText==false) this.Frame.HorizontalInfo[i].Message[0]=null;\\r\\n                if (this.IsShowRightText==false) this.Frame.HorizontalInfo[i].Message[1]=null;\\r\\n                //this.Frame.HorizontalInfo[i].Font=\\\"14px 微软雅黑\\\";\\r\\n                //this.Frame.HorizontalInfo[i].TextColor=\\\"rgb(100,0,200)\\\";\\r\\n                //this.Frame.HorizontalInfo[i].LineColor=\\\"rgb(220,220,220)\\\";\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.FilterIgnoreYValue();\\r\\n\\r\\n        this.CustomCoordinate();\\r\\n        if (this.SplitType!=1) this.Frame.HorizontalInfo = this.Filter(this.Frame.HorizontalInfo,(splitData.Max>0 && splitData.Min<0));\\r\\n        if (this.EnableRemoveZero) this.RemoveZero(this.Frame.HorizontalInfo);\\r\\n        this.Frame.HorizontalMax=splitData.Max;\\r\\n        this.Frame.HorizontalMin=splitData.Min;\\r\\n\\r\\n        if (this.EnableZoomUpDown==true && !this.FixedYMaxMin)\\r\\n            this.FixedYMaxMin={ Max:splitData.Max, Min:splitData.Min };\\r\\n\\r\\n        this.RightFrameSplitY();\\r\\n        this.CallAcutionSplitY(this.SplitCount,splitData);\\r\\n\\r\\n        if (this.GetEventCallback)\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_YCOORDINATE);\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data={ID:this.Frame.Identify, Frame:this.Frame };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.FilterIgnoreYValue = function ()\\r\\n    {\\r\\n        if (!this.IgnoreYValue || this.IgnoreYValue.length <= 0) return;\\r\\n\\r\\n        var setValue = new Set(this.IgnoreYValue);\\r\\n        this.Frame.HorizontalInfo = this.Frame.HorizontalInfo.filter(item => !setValue.has(item.Value));\\r\\n    }\\r\\n\\r\\n    this.CallAcutionSplitY=function(count,splitData)\\r\\n    {\\r\\n        if (this.Frame.Identify!=1) return null;\\r\\n        var aryCallAcution=this.GetCallAcutionSplitY(count,splitData);\\r\\n        if (!aryCallAcution) return;\\r\\n\\r\\n        for(var i in this.Frame.HorizontalInfo) //把显示的数据迁移到 Message[2] Message[3]\\r\\n        {\\r\\n            var item=this.Frame.HorizontalInfo[i];\\r\\n            if (aryCallAcution.IsBeforeData)\\r\\n            {\\r\\n                item.Message[2]=item.Message[0];\\r\\n                item.Message[0]=null;\\r\\n            }\\r\\n\\r\\n            if (aryCallAcution.IsAfterData)\\r\\n            {\\r\\n                item.Message[3]=item.Message[1];\\r\\n                item.Message[1]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //集合竞价的坐标插入最后\\r\\n        for(var i in aryCallAcution.HorizontalInfo)\\r\\n        {\\r\\n            var item=aryCallAcution.HorizontalInfo[i];\\r\\n            this.Frame.HorizontalInfo.push(item);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetCallAcutionSplitY=function(count,splitData)\\r\\n    {\\r\\n        if (this.Frame.Identify!=1) return null;\\r\\n\\r\\n        var isBeforeData=(this.IsBeforeData==true && this.BeforeOpenData && (this.BeforeOpenData.Ver==2.0 || this.BeforeOpenData.Ver==3.0));\\r\\n        var isAfterData=(this.IsAfterData==true && this.AfterCloseData && (this.AfterCloseData.Ver==2.0 || this.AfterCloseData.Ver==3.0));\\r\\n\\r\\n        if (isBeforeData || isAfterData)\\r\\n        {\\r\\n            var intervalY=(splitData.Max-splitData.Min)/(count-1);\\r\\n            if (isBeforeData) var intervalLeft=(this.BeforeOpenData.VolMax-this.BeforeOpenData.VolMin)/(count-1);\\r\\n            if (isAfterData)  var intervalRight=(this.AfterCloseData.VolMax-this.AfterCloseData.VolMin)/(count-1);\\r\\n\\r\\n            var aryHorizontalInfo=[];\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                var item=new CoordinateInfo();\\r\\n                var yValue=intervalY*i;\\r\\n                item.Value=yValue;\\r\\n                item.LineType=8;\\r\\n                if (isBeforeData)\\r\\n                {\\r\\n                    var leftValue=intervalLeft*i;\\r\\n                    item.Message[0]=leftValue.toFixed(0);\\r\\n                }\\r\\n\\r\\n                if (isAfterData)\\r\\n                {\\r\\n                    var rightValue=intervalRight*i;\\r\\n                    item.Message[1]=rightValue.toFixed(0);\\r\\n                }\\r\\n                aryHorizontalInfo.push(item);\\r\\n            }\\r\\n            return { HorizontalInfo:aryHorizontalInfo,  IsBeforeData:isBeforeData, IsAfterData:isAfterData };\\r\\n        }\\r\\n\\r\\n        var isMultiDayBeforeData=false;\\r\\n        var intervalLeft=null;\\r\\n        if (this.MultiDayBeforeOpenData && IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData))\\r\\n        {\\r\\n            isMultiDayBeforeData=true;\\r\\n            var firstDayData=this.MultiDayBeforeOpenData[0];\\r\\n            if (firstDayData.Ver==2.0 || firstDayData.Ver==3.0)\\r\\n            {\\r\\n                var intervalLeft=(firstDayData.VolMax-firstDayData.VolMin)/(count-1);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var isMultiDayAfterData=false;\\r\\n        var intervalRight=null;\\r\\n        if (this.MultiDayAfterCloseData && IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData))\\r\\n        {\\r\\n            isMultiDayAfterData=true;\\r\\n            var firstDayData=this.MultiDayAfterCloseData[0];\\r\\n            if (firstDayData.Ver==2.0 || firstDayData.Ver==3.0)\\r\\n            {\\r\\n                var intervalRight=(firstDayData.VolMax-firstDayData.VolMin)/(count-1);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (isMultiDayBeforeData || isMultiDayAfterData)\\r\\n        {\\r\\n            var intervalY=(splitData.Max-splitData.Min)/(count-1);\\r\\n            var aryHorizontalInfo=[];\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                var item=new CoordinateInfo();\\r\\n                var yValue=intervalY*i;\\r\\n                item.Value=yValue;\\r\\n                item.LineType=9;\\r\\n                if (intervalLeft!=null)\\r\\n                {\\r\\n                    var leftValue=intervalLeft*i;\\r\\n                    item.Message[0]=leftValue.toFixed(0);\\r\\n                }\\r\\n\\r\\n                if (intervalRight!=null)\\r\\n                {\\r\\n                    var rightValue=intervalRight*i;\\r\\n                    item.Message[1]=rightValue.toFixed(0);\\r\\n                }\\r\\n                aryHorizontalInfo.push(item);\\r\\n            }\\r\\n            return { HorizontalInfo:aryHorizontalInfo,  IsBeforeData:isMultiDayBeforeData, IsAfterData:isMultiDayAfterData };\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.RightFrameSplitY=function()\\r\\n    {\\r\\n        if (!this.Frame.RightFrame) return;\\r\\n\\r\\n        var rightFrame=this.Frame.RightFrame;\\r\\n        for(var i in this.Frame.HorizontalInfo)\\r\\n        {\\r\\n            var item=this.Frame.HorizontalInfo[i];\\r\\n            var y=this.Frame.GetYFromData(item.Value);\\r\\n            var yValue=rightFrame.GetYData(y);\\r\\n            item.Message[1] = IFrameSplitOperator.FormatValueString(yValue, this.FloatPrecision,this.LanguageID);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CustomCoordinate=function()\\r\\n    {\\r\\n        this.Frame.CustomHorizontalInfo=[];\\r\\n        for(var i in this.Custom)\\r\\n        {\\r\\n            var item=this.Custom[i];\\r\\n            if (item.Type==0)\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else if (item.Type==1)\\r\\n            {\\r\\n                this.CustomFixedCoordinate(item);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CustomFixedCoordinate=function(option)    //固定坐标刻度\\r\\n    {\\r\\n        var defaultfloatPrecision=2;\\r\\n        for(var i in option.Data)\\r\\n        {\\r\\n            var item=option.Data[i];\\r\\n            var info=new CoordinateInfo();\\r\\n            info.Type=1;\\r\\n            info.TextColor=item.TextColor;\\r\\n            info.LineColor=item.Color;\\r\\n            info.LineType=2;    //虚线\\r\\n            if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;\\r\\n            if (option.IsShowLine==false) info.LineType=-1;\\r\\n\\r\\n            info.Value=item.Value;\\r\\n            var text;\\r\\n            if (item.Text) text=item.Text;\\r\\n            else text=info.Value.toFixed(defaultfloatPrecision);\\r\\n            if (option.Position=='left') info.Message[0]=text;\\r\\n            else info.Message[1]=text;\\r\\n\\r\\n            this.Frame.CustomHorizontalInfo.push(info);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction FrameSplitKLineX()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ShowText=true;                 //是否显示坐标信息\\r\\n    this.Period;                        //周期\\r\\n    this.Symbol;                        //股票代码\\r\\n    this.MinTextDistance=50*GetDevicePixelRatio();\\r\\n    this.MinBarDistance=5; //刻度间最小的K线间距\\r\\n\\r\\n\\r\\n    this.SplitDateTime=function()   //根据时间分割\\r\\n    {\\r\\n        this.Frame.VerticalInfo=[];\\r\\n        var itemWidth=this.Frame.DistanceWidth+this.Frame.DataWidth;\\r\\n        var xOffset=this.Frame.Data.DataOffset;\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        var lastYear=null, lastMonth=null;\\r\\n        var textDistance=0;\\r\\n        var barDistance=0;\\r\\n        for(var i=0, index=xOffset; i<xPointCount && index<this.Frame.Data.Data.length; ++i,++index)\\r\\n        {\\r\\n            textDistance+=itemWidth;\\r\\n            ++barDistance;\\r\\n            var infoData=null;\\r\\n            if (i==0)\\r\\n            {\\r\\n                var date=IFrameSplitOperator.FormatDateString(this.Frame.Data.Data[index].Date,'MM-DD');\\r\\n                infoData={Value:index-xOffset, Text:date};\\r\\n            }\\r\\n            else if (textDistance>this.MinTextDistance && barDistance>=this.MinBarDistance)\\r\\n            {\\r\\n                var time=IFrameSplitOperator.FormatTimeString(this.Frame.Data.Data[index].Time);\\r\\n                infoData={Value:index-xOffset, Text:time};\\r\\n            }\\r\\n\\r\\n            if (infoData)\\r\\n            {\\r\\n                var info= new CoordinateInfo();\\r\\n                info.Value=infoData.Value;\\r\\n                if (this.ShowText) info.Message[0]=infoData.Text;\\r\\n                if (info.Value==0) info.LineType=-1;    //第1个分割线不画\\r\\n                this.Frame.VerticalInfo.push(info);\\r\\n                textDistance=0;\\r\\n                barDistance=0;\\r\\n                if (i==0) textDistance=-(this.MinTextDistance/2);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitSecond=function()   //根据时间分割\\r\\n    {\\r\\n        this.Frame.VerticalInfo=[];\\r\\n        var itemWidth=this.Frame.DistanceWidth+this.Frame.DataWidth;\\r\\n        var xOffset=this.Frame.Data.DataOffset;\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        var textDistance=0;\\r\\n        var barDistance=0;\\r\\n\\r\\n        for(var i=0, index=xOffset; i<xPointCount && index<this.Frame.Data.Data.length; ++i,++index)\\r\\n        {\\r\\n            textDistance+=itemWidth;\\r\\n            ++barDistance;\\r\\n            var infoData=null;\\r\\n            if (i==0)\\r\\n            {\\r\\n                var date=IFrameSplitOperator.FormatDateString(this.Frame.Data.Data[index].Date,'MM-DD');\\r\\n                infoData={Value:index-xOffset, Text:date};\\r\\n            }\\r\\n            else if (textDistance>this.MinTextDistance && barDistance>=this.MinBarDistance)\\r\\n            {\\r\\n                var time=IFrameSplitOperator.FormatTimeString(this.Frame.Data.Data[index].Time,\\\"HH:MM:SS\\\");\\r\\n                infoData={Value:index-xOffset, Text:time};\\r\\n            }\\r\\n\\r\\n            if (infoData)\\r\\n            {\\r\\n                var info= new CoordinateInfo();\\r\\n                info.Value=infoData.Value;\\r\\n                if (this.ShowText) info.Message[0]=infoData.Text;\\r\\n                this.Frame.VerticalInfo.push(info);\\r\\n                textDistance=0;\\r\\n                barDistance=0;\\r\\n                if (i==0) textDistance=-(this.MinTextDistance/2);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SplitDate=function()   //根据日期分割\\r\\n    {\\r\\n        this.Frame.VerticalInfo=[];\\r\\n        var xOffset=this.Frame.Data.DataOffset;\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        var lastYear=null, lastMonth=null;\\r\\n        var minDistance=12;\\r\\n        var monthCount=0;\\r\\n        for(var i=0, index=xOffset, distance=minDistance;i<xPointCount && index<this.Frame.Data.Data.length ;++i,++index)\\r\\n        {\\r\\n            var year=parseInt(this.Frame.Data.Data[index].Date/10000);\\r\\n            var month=parseInt(this.Frame.Data.Data[index].Date/100)%100;\\r\\n\\r\\n            if (lastMonth!=month)\\r\\n                ++monthCount;\\r\\n\\r\\n            if (distance<minDistance ||\\r\\n                (lastYear!=null && lastYear==year && lastMonth!=null && lastMonth==month))\\r\\n            {\\r\\n                lastMonth=month;\\r\\n                ++distance;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var info= new CoordinateInfo();\\r\\n            info.Value=index-xOffset;\\r\\n            var text;\\r\\n            if (lastYear==null || lastYear!=year)\\r\\n            {\\r\\n                text=year.toString();\\r\\n            }\\r\\n            else if (lastMonth==null || lastMonth!=month)\\r\\n            {\\r\\n                text=month.toString()+'月';\\r\\n                text=g_JSChartLocalization.GetText(text, this.LanguageID);\\r\\n            }\\r\\n\\r\\n            lastYear=year;\\r\\n            lastMonth=month;\\r\\n            if (this.ShowText) info.Message[0]=text;\\r\\n            if (info.Value==0) info.LineType=-1;    //第1个分割线不画\\r\\n\\r\\n            this.Frame.VerticalInfo.push(info);\\r\\n            distance=0;\\r\\n        }\\r\\n\\r\\n        if (this.Period==0 && monthCount<=2)\\r\\n            this.SplitShortDate();\\r\\n    }\\r\\n\\r\\n    //分隔在2个月一下的格式\\r\\n    this.SplitShortDate=function()\\r\\n    {\\r\\n        this.Frame.VerticalInfo=[];\\r\\n        var xOffset=this.Frame.Data.DataOffset;\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        var minDistance=12;\\r\\n        var isFirstYear=true;\\r\\n        for(var i=0, index=xOffset, distance=minDistance;i<xPointCount && index<this.Frame.Data.Data.length ;++i,++index)\\r\\n        {\\r\\n            var year=parseInt(this.Frame.Data.Data[index].Date/10000);\\r\\n            //var month=parseInt(this.Frame.Data.Data[index].Date/100)%100;\\r\\n            //var day=parseInt(this.Frame.Data.Data[index].Date%100);\\r\\n\\r\\n            if (distance<minDistance)\\r\\n            {\\r\\n                ++distance;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var info= new CoordinateInfo();\\r\\n            info.Value=index-xOffset;\\r\\n            var text;\\r\\n            if (isFirstYear)\\r\\n            {\\r\\n                text=year.toString();\\r\\n                isFirstYear=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                text=IFrameSplitOperator.FormatDateString(this.Frame.Data.Data[index].Date,'MM-DD');\\r\\n            }\\r\\n\\r\\n            if (this.ShowText) info.Message[0]=text;\\r\\n            if (info.Value==0) info.LineType=-1;    //第1个分割线不画\\r\\n\\r\\n            this.Frame.VerticalInfo.push(info);\\r\\n            distance=0;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        if (this.Frame.Data==null) return;\\r\\n        if (FrameSplitKLineX.SplitCustom) FrameSplitKLineX.SplitCustom(this);   //自定义分割\\r\\n        else if (ChartData.IsMinutePeriod(this.Period, true)) this.SplitDateTime();\\r\\n        else if (ChartData.IsSecondPeriod(this.Period)) this.SplitSecond();\\r\\n        else if (ChartData.IsTickPeriod(this.Period)) this.SplitSecond();\\r\\n        else this.SplitDate();\\r\\n\\r\\n        if (this.GetEventCallback)\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_XCOORDINATE);\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data={ID:this.Frame.Identify, Frame:this.Frame };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateCoordinateInfo=function()\\r\\n    {\\r\\n        return new CoordinateInfo();\\r\\n    }\\r\\n}\\r\\n\\r\\n//FrameSplitKLineX.SplitCustom=function(split) { }\\r\\n\\r\\nfunction FrameSplitMinutePriceY()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.High=null;                 //最高最低价\\r\\n    this.Low=null;\\r\\n\\r\\n    this.YClose;                        //昨收\\r\\n    this.Data;                          //分钟数据\\r\\n    this.AverageData;                   //分钟均线数据\\r\\n    this.SourceData;                    //原始数据\\r\\n    this.OverlayChartPaint;\\r\\n    this.SplitCount=7;\\r\\n    this.Symbol;\\r\\n    this.SplitType=0;                   //0=默认根据最大最小值分割 1=涨跌停分割 2=数据最大最大值分割\\r\\n    this.LimitPrice;                    //{Max: Min:} 涨跌停价\\r\\n    this.Custom;\\r\\n    this.RightTextFormat=0;           //右边刻度显示模式 0=百分比  1=价格\\r\\n\\r\\n    this.BeforeOpenData;\\r\\n    this.IsBeforeData=false;\\r\\n    this.AfterCloseData;\\r\\n    this.IsAfterData=false;\\r\\n\\r\\n    this.MultiDayBeforeOpenData;\\r\\n    this.MultiDayAfterCloseData;\\r\\n\\r\\n    this.IsEnableDragY=function()\\r\\n    {\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        this.Frame.HorizontalInfo=[];\\r\\n        this.Frame.CustomHorizontalInfo=[];\\r\\n        if (!this.Data) return;\\r\\n\\r\\n        var range=this.GetMaxMin();\\r\\n\\r\\n        if (this.Symbol && MARKET_SUFFIX_NAME.IsUSA(this.Symbol.toUpperCase()))\\r\\n        {\\r\\n            this.USASplit(range);\\r\\n        }\\r\\n        else if (this.SplitType==2)\\r\\n        {\\r\\n            this.USASplit(range);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.DefaultSplit(range);\\r\\n        }\\r\\n\\r\\n        this.CustomCoordinate();\\r\\n\\r\\n        if (this.GetEventCallback)\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_YCOORDINATE);\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data={ID:this.Frame.Identify, Frame:this.Frame };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CustomCoordinate=function()    //自定义刻度\\r\\n    {\\r\\n        if (!this.Custom) return;\\r\\n\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        for(var i in this.Custom)\\r\\n        {\\r\\n            var item=this.Custom[i];\\r\\n            if (item.Type==1) this.CustomFixedCoordinate(item);\\r\\n            else if (item.Type==0)\\r\\n            {\\r\\n                var latestItem=this.GetLatestPrice(defaultfloatPrecision,item);\\r\\n                if (latestItem) this.Frame.CustomHorizontalInfo.push(latestItem);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetLatestPrice=function(floatPrecision,option)\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return null;\\r\\n        if (this.Data.Data.length<=0) return null;\\r\\n        var price=this.Data.Data[this.Data.Data.length-1];\\r\\n        if (!IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(this.YClose)) return null;\\r\\n\\r\\n        var info=new CoordinateInfo();\\r\\n        info.Type=0;\\r\\n        info.Value=price;\\r\\n        info.TextColor=g_JSChartResource.FrameLatestPrice.TextColor;\\r\\n        info.LineType=2;    //虚线\\r\\n\\r\\n        var strPrice=price.toFixed(floatPrecision);\\r\\n        if (option.DateTime=='HH:MM')\\r\\n        {\\r\\n            var latestItem=this.Frame.Data.Data[this.Frame.Data.Data.length-1];\\r\\n            var strTime=IFrameSplitOperator.FormatTimeString(latestItem.Time,option.DateTime);\\r\\n            var aryText=[{Text:strPrice}, { Text:strTime} ];\\r\\n            if (option.Position=='left') info.Message[0]=aryText;\\r\\n            else info.Message[1]=aryText;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (option.Position=='left') info.Message[0]=strPrice;\\r\\n            else info.Message[1]=strPrice;\\r\\n        }\\r\\n\\r\\n        if (price>this.YClose) info.LineColor=g_JSChartResource.FrameLatestPrice.UpBarColor;\\r\\n        else if (price<this.YClose) info.LineColor=g_JSChartResource.FrameLatestPrice.DownBarColor;\\r\\n        else info.LineColor=g_JSChartResource.FrameLatestPrice.UnchagneBarColor;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;\\r\\n        if (option.IsShowLine==false) info.LineType=-1;\\r\\n\\r\\n        return info;\\r\\n    }\\r\\n\\r\\n    this.CustomFixedCoordinate=function(option)    //固定坐标刻度\\r\\n    {\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        for(var i in option.Data)\\r\\n        {\\r\\n            var item=option.Data[i];\\r\\n            var info=new CoordinateInfo();\\r\\n            info.Type=1;\\r\\n            info.TextColor=item.TextColor;\\r\\n            info.LineColor=item.Color;\\r\\n            info.LineType=2;    //虚线\\r\\n            if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;\\r\\n            if (option.IsShowLine==false) info.LineType=-1;\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(item.Increase)) //涨幅计算价格\\r\\n            {\\r\\n                if (!IFrameSplitOperator.IsNumber(this.YClose)) continue;\\r\\n                info.Value=this.YClose*(1+item.Increase);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                info.Value=item.Value;\\r\\n            }\\r\\n\\r\\n            var text;\\r\\n            if (item.Text) text=item.Text;\\r\\n            else text=info.Value.toFixed(defaultfloatPrecision);\\r\\n            if (option.Position=='left') info.Message[0]=text;\\r\\n            else info.Message[1]=text;\\r\\n\\r\\n            this.Frame.CustomHorizontalInfo.push(info);\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetCallAuctionMaxMin=function(callAuctionData, range)\\r\\n    {\\r\\n        for(var i in callAuctionData.Data)\\r\\n        {\\r\\n            var item=callAuctionData.Data[i];\\r\\n            if (!item) continue;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                if (range.Max==null) range.Max=item.Price;\\r\\n                if (range.Min==null) range.Min=item.Price;\\r\\n\\r\\n                if (range.Max<item.Price) range.Max=item.Price;\\r\\n                if (range.Min>item.Price) range.Min=item.Price;\\r\\n            }\\r\\n\\r\\n            //集合竞价均线统计\\r\\n            if (callAuctionData.Ver==3.0 && IFrameSplitOperator.IsNumber(item.AvPrice))\\r\\n            {\\r\\n                if (range.Max==null) range.Max=item.AvPrice;\\r\\n                if (range.Min==null) range.Min=item.AvPrice;\\r\\n\\r\\n                if (range.Max<item.AvPrice) range.Max=item.AvPrice;\\r\\n                if (range.Min>item.AvPrice) range.Min=item.AvPrice;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMin=function()   //计算图中所有的数据的最大最小值\\r\\n    {\\r\\n        var max=this.YClose;\\r\\n        var min=this.YClose;\\r\\n        var data=this.Data;\\r\\n        var isBerforeData=false;\\r\\n        if (this.SourceData)\\r\\n        {\\r\\n            data=this.SourceData;\\r\\n            isBerforeData=true;\\r\\n        }\\r\\n\\r\\n        for(var i in data.Data)\\r\\n        {\\r\\n            var value=null;\\r\\n            if (isBerforeData)\\r\\n            {\\r\\n                var item=data.Data[i];\\r\\n                if (item.Before) value=item.Before.Close;\\r\\n                else value=item.Close;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                value=data.Data[i];\\r\\n            }\\r\\n            if (value==null) continue;\\r\\n            if (max<value) max=value;\\r\\n            if (min>value) min=value;\\r\\n        }\\r\\n\\r\\n        if (this.AverageData)\\r\\n        {\\r\\n            for(var i in this.AverageData.Data)\\r\\n            {\\r\\n                if (this.AverageData.Data[i]==null) continue;\\r\\n                if (max<this.AverageData.Data[i]) max=this.AverageData.Data[i];\\r\\n                if (min>this.AverageData.Data[i]) min=this.AverageData.Data[i];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            //if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;\\r\\n            var range=item.GetMaxMin();\\r\\n            if (range.Max && range.Max>max) max=range.Max;\\r\\n            if (range.Min && range.Min<min) min=range.Min;\\r\\n        }\\r\\n\\r\\n        if (this.SplitType==1 && this.LimitPrice)\\r\\n        {\\r\\n            if (max<this.LimitPrice.Max) max=this.LimitPrice.Max;\\r\\n            if (min>this.LimitPrice.Min) min=this.LimitPrice.Min;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(this.High) && IFrameSplitOperator.IsNumber(this.Low))\\r\\n        {\\r\\n            if (max<this.High) max=this.High;\\r\\n            if (min>this.Low) min=this.Low;\\r\\n        }\\r\\n\\r\\n        var range={ Max:null, Min:null };\\r\\n        if (this.IsAfterData && this.AfterCloseData)\\r\\n        {\\r\\n            this.GetCallAuctionMaxMin(this.AfterCloseData,range);\\r\\n        }\\r\\n\\r\\n        if (this.IsBeforeData && this.BeforeOpenData)\\r\\n        {\\r\\n            this.GetCallAuctionMaxMin(this.BeforeOpenData,range);\\r\\n        }\\r\\n\\r\\n        if (this.MultiDayBeforeOpenData && this.ChartBorder.MultiDayMinute.Count>1 && this.ChartBorder.MultiDayMinute.Left>0)\\r\\n        {\\r\\n            for(var i in this.MultiDayBeforeOpenData)\\r\\n            {\\r\\n                var dayItem=this.MultiDayBeforeOpenData[i];\\r\\n                this.GetCallAuctionMaxMin(dayItem,range);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.MultiDayAfterCloseData && this.ChartBorder.MultiDayMinute.Count>1 && this.ChartBorder.MultiDayMinute.Right>0)\\r\\n        {\\r\\n            for(var i in this.MultiDayAfterCloseData)\\r\\n            {\\r\\n                var dayItem=this.MultiDayAfterCloseData[i];\\r\\n                this.GetCallAuctionMaxMin(dayItem,range);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(range.Max) && max<range.Max) max=range.Max;\\r\\n        if (IFrameSplitOperator.IsNumber(range.Min) && min>range.Min) min=range.Min;\\r\\n\\r\\n        return { Max:max, Min:min };\\r\\n    }\\r\\n\\r\\n    this.USASplit=function(range)\\r\\n    {\\r\\n        var max=range.Max;\\r\\n        var min=range.Min;\\r\\n\\r\\n        if (max==min)\\r\\n        {\\r\\n            max=max+max*0.1;\\r\\n            min=min-min*0.1;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n            var height=this.Frame.ChartBorder.GetHeight();   //画布的高度\\r\\n            var spacePrice=5*pixelTatio*(max-min)/height;\\r\\n            max+=spacePrice;\\r\\n            min-=spacePrice;\\r\\n            if (min<0) min=range.Min;\\r\\n        }\\r\\n\\r\\n        var showCount=this.SplitCount;\\r\\n        var distance=(max-min)/(showCount-1);\\r\\n        const minDistance=[1, 0.1, 0.01, 0.001, 0.0001];\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        if (distance<minDistance[defaultfloatPrecision])\\r\\n        {\\r\\n            distance=minDistance[defaultfloatPrecision];\\r\\n            max=min+distance*showCount;\\r\\n            //min=this.YClose-(distance*(showCount-1)/2);\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<showCount;++i)\\r\\n        {\\r\\n            var price=min+(distance*i);\\r\\n            if (this.YClose && price==this.YClose) continue;\\r\\n            var coordinate=new CoordinateInfo();\\r\\n            coordinate.Value=price;\\r\\n            var strPrice=price.toFixed(defaultfloatPrecision);  //价格刻度字符串\\r\\n            if (this.IsShowLeftText) coordinate.Message[0]=strPrice;\\r\\n\\r\\n            if (this.YClose)\\r\\n            {\\r\\n                var per=(price/this.YClose-1)*100;\\r\\n                if (per>0) coordinate.TextColor=g_JSChartResource.UpTextColor;\\r\\n                else if (per<0) coordinate.TextColor=g_JSChartResource.DownTextColor;\\r\\n                if (this.IsShowRightText)\\r\\n                {\\r\\n                    if (this.RightTextFormat==1) coordinate.Message[1]=strPrice;\\r\\n                    else coordinate.Message[1]=IFrameSplitOperator.FormatValueString(per,2)+'%'; //百分比\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Frame.HorizontalInfo.push(coordinate);\\r\\n        }\\r\\n\\r\\n        if (this.YClose>min && this.YClose<max) //前收盘线\\r\\n        {\\r\\n            var coordinate=new CoordinateInfo();\\r\\n            coordinate.Value=this.YClose;\\r\\n            coordinate.LineType=2;//中间的线画虚线\\r\\n            if (g_JSChartResource.FrameDotSplitPen) coordinate.LineColor=g_JSChartResource.FrameDotSplitPen;\\r\\n\\r\\n            var strPrice=this.YClose.toFixed(defaultfloatPrecision);  //价格刻度字符串\\r\\n            if (this.IsShowLeftText) coordinate.Message[0]=strPrice;\\r\\n\\r\\n            if (this.IsShowRightText)\\r\\n            {\\r\\n                if (this.RightTextFormat==1) coordinate.Message[1]=strPrice;\\r\\n                else coordinate.Message[1]='0.00%'; //百分比\\r\\n            }\\r\\n\\r\\n            this.Frame.HorizontalInfo.push(coordinate);\\r\\n        }\\r\\n\\r\\n        this.Frame.HorizontalInfo.sort(function(a,b) { return a.Value-b.Value; });\\r\\n\\r\\n        this.Frame.HorizontalMax=max;\\r\\n        this.Frame.HorizontalMin=min;\\r\\n    }\\r\\n\\r\\n    this.DefaultSplit=function(range)\\r\\n    {\\r\\n        var max=range.Max;\\r\\n        var min=range.Min;\\r\\n\\r\\n        if (this.YClose==max && this.YClose==min)\\r\\n        {\\r\\n            max=this.YClose+this.YClose*0.1;\\r\\n            min=this.YClose-this.YClose*0.1\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var distanceValue=Math.max(Math.abs(this.YClose-max),Math.abs(this.YClose-min));\\r\\n            max=this.YClose+distanceValue;\\r\\n            min=this.YClose-distanceValue;\\r\\n            if (min<0) min=range.Min;\\r\\n        }\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n        var width=this.Frame.ChartBorder.GetChartWidth();   //画布的宽度\\r\\n        var isPhoneModel=width<450*pixelTatio;\\r\\n        JSConsole.Chart.Log('[FrameSplitMinutePriceY]'+ 'max='+ max + ' min='+ min +' isPhoneModel='+isPhoneModel);\\r\\n\\r\\n        var showCount=this.SplitCount;\\r\\n        var distance=(max-min)/(showCount-1);\\r\\n        const minDistance=[1, 0.1, 0.01, 0.001, 0.0001];\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        if (isPhoneModel && MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol)) defaultfloatPrecision = 0;    //手机端指数不显示小数位数,太长了\\r\\n        if (distance<minDistance[defaultfloatPrecision])\\r\\n        {\\r\\n            distance=minDistance[defaultfloatPrecision];\\r\\n            max=this.YClose+(distance*(showCount-1)/2);\\r\\n            min=this.YClose-(distance*(showCount-1)/2);\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<showCount;++i)\\r\\n        {\\r\\n            var price=min+(distance*i);\\r\\n            var coordinate=new CoordinateInfo();\\r\\n            this.Frame.HorizontalInfo[i]=coordinate\\r\\n            coordinate.Value=price;\\r\\n            var strPrice=price.toFixed(defaultfloatPrecision);  //价格刻度字符串\\r\\n            if (this.IsShowLeftText) coordinate.Message[0]=strPrice\\r\\n            if (price==this.YClose)\\r\\n            {\\r\\n                coordinate.LineType=2;//中间的线画虚线\\r\\n                if (g_JSChartResource.FrameDotSplitPen) coordinate.LineColor=g_JSChartResource.FrameDotSplitPen;\\r\\n            }\\r\\n\\r\\n            if (this.YClose)\\r\\n            {\\r\\n                var per=(price/this.YClose-1)*100;\\r\\n                if (per>0) coordinate.TextColor=g_JSChartResource.UpTextColor;\\r\\n                else if (per<0) coordinate.TextColor=g_JSChartResource.DownTextColor;\\r\\n\\r\\n                if (this.IsShowRightText)\\r\\n                {\\r\\n                    if (this.RightTextFormat==1)  coordinate.Message[1]=strPrice;\\r\\n                    else coordinate.Message[1]=IFrameSplitOperator.FormatValueString(per,2)+'%'; //百分比\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        this.Frame.HorizontalMax=max;\\r\\n        this.Frame.HorizontalMin=min;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\nfunction FrameSplitMinuteX()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ShowText=true;                 //是否显示坐标信息\\r\\n    this.Symbol=null;                   //股票代码 x轴刻度根据股票类型来调整\\r\\n    this.DayCount=1;\\r\\n    this.ShowDateFormate=1;             //0=YYYY-MM-DD  1=MM-DD\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        this.Frame.VerticalInfo=[];\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n        var width = this.Frame.ChartBorder.GetWidth();\\r\\n        var isHScreen=(this.Frame.IsHScreen===true);\\r\\n        if (isHScreen) width = this.Frame.ChartBorder.GetHeight();\\r\\n        width=width/GetDevicePixelRatio();\\r\\n\\r\\n        const minuteCoordinate = g_MinuteCoordinateData;\\r\\n        var xcoordinateData = minuteCoordinate.GetCoordinateData(this.Symbol,width);\\r\\n        var minuteCount=xcoordinateData.Count;\\r\\n        var minuteMiddleCount=xcoordinateData.MiddleCount>0? xcoordinateData.MiddleCount: parseInt(minuteCount/2);\\r\\n        var xcoordinate = xcoordinateData.Data;\\r\\n\\r\\n        this.Frame.XPointCount=minuteCount*this.DayCount;\\r\\n        this.Frame.MinuteCount=minuteCount;\\r\\n        this.Frame.VerticalInfo=[];\\r\\n\\r\\n        if (this.DayCount<=1)\\r\\n        {\\r\\n            for(var i in xcoordinate)\\r\\n            {\\r\\n                var info=new CoordinateInfo();\\r\\n                if (g_JSChartResource.Minute.FrameSplitTextColor) info.TextColor=g_JSChartResource.Minute.FrameSplitTextColor;\\r\\n                info.Value=xcoordinate[i][0];\\r\\n                if (this.ShowText)\\r\\n                    info.Message[0]=xcoordinate[i][3];\\r\\n                this.Frame.VerticalInfo[i]=info;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=this.DayData.length-1,j=0;i>=0;--i,++j)\\r\\n            {\\r\\n                var info=new CoordinateInfo();\\r\\n                info.Value=j*minuteCount+minuteMiddleCount;\\r\\n                info.LineType=-1;    //线段不画\\r\\n                if (this.ShowText) info.Message[0]=IFrameSplitOperator.FormatDateString(this.DayData[i].Date, this.ShowFormate==0?'YYYY-MM-DD':'MM-DD');\\r\\n                this.Frame.VerticalInfo.push(info);\\r\\n\\r\\n                var info=new CoordinateInfo();\\r\\n                info.Value=(j+1)*minuteCount;\\r\\n                this.Frame.VerticalInfo.push(info);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.GetEventCallback)\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_XCOORDINATE);\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data={ID:this.Frame.Identify, Frame:this.Frame };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction FrameSplitXData()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ShowText=true;                 //是否显示坐标信息\\r\\n    this.Symbol;                        //股票代码\\r\\n    this.MinTextDistance=50*GetDevicePixelRatio();\\r\\n    this.MinBarDistance=5; //刻度间最小的K线间距\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        if (this.Frame.Data==null || this.Frame.XData==null) return;\\r\\n        this.Frame.VerticalInfo=[];\\r\\n        var xOffset=this.Frame.Data.DataOffset;\\r\\n        var xPointCount=this.Frame.XPointCount;\\r\\n\\r\\n        for(var i=0, index=xOffset; i<xPointCount && index<this.Frame.Data.Data.length ;++i,++index)\\r\\n        {\\r\\n            var info= new CoordinateInfo();\\r\\n            info.Value=index-xOffset;\\r\\n\\r\\n            if (this.ShowText)\\r\\n                info.Message[0]=this.Frame.XData[i];\\r\\n\\r\\n            this.Frame.VerticalInfo.push(info);\\r\\n            distance=0;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//深度图X轴价格信息\\r\\nfunction FrameSplitXDepth()\\r\\n{\\r\\n    this.newMethod=IFrameSplitOperator;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ShowText=true;                 //是否显示坐标信息\\r\\n    this.SplitCount=3;\\r\\n    this.Symbol;\\r\\n    this.LineType=3;\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        var xRange=this.Frame.VerticalRange;\\r\\n        if (!xRange) return;\\r\\n        this.Frame.VerticalInfo=[];\\r\\n\\r\\n        var floatPrecision=2;\\r\\n        if (this.Symbol) floatPrecision=GetfloatPrecision(this.Symbol);\\r\\n        var xMax=xRange.Max;\\r\\n        var xMin=xRange.Min;\\r\\n        if (xRange.Bid)\\r\\n        {\\r\\n            var interval=(xRange.Bid.Max-xMin)/this.SplitCount;\\r\\n            for(var i=0;i<this.SplitCount;++i)\\r\\n            {\\r\\n                var info= new CoordinateInfo();\\r\\n                info.Value=xMin+(interval*i);\\r\\n                if (info.Value<=0) continue;\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(this.LineType)) info.LineType=this.LineType;\\r\\n                if (this.ShowText) info.Message[0]=info.Value.toFixed(floatPrecision);\\r\\n                this.Frame.VerticalInfo.push(info);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var info=new CoordinateInfo();\\r\\n        info.Value=xRange.Center;\\r\\n        //if (IFrameSplitOperator.IsNumber(this.LineType)) info.LineType=this.LineType;\\r\\n        this.Frame.VerticalInfo.push(info);\\r\\n\\r\\n        if (xRange.Ask)\\r\\n        {\\r\\n            var interval=(xMax-xRange.Ask.Min)/this.SplitCount;\\r\\n            for(var i=1;i<=this.SplitCount;++i)\\r\\n            {\\r\\n                var info= new CoordinateInfo();\\r\\n                info.Value=xRange.Ask.Min+(interval*i);\\r\\n                if (IFrameSplitOperator.IsNumber(this.LineType)) info.LineType=this.LineType;\\r\\n                if (this.ShowText) info.Message[0]=info.Value.toFixed(floatPrecision);\\r\\n                this.Frame.VerticalInfo.push(info);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//把X位置调整到有数据上面\\r\\nfunction CallAcutionXOperator()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.Value;\\r\\n    this.Point;\\r\\n    this.ClientPos;\\r\\n    this.BeforOpeneData;\\r\\n    this.AfterCloseData;\\r\\n    this.X;\\r\\n    this.Item;\\r\\n    this.DataIndex;\\r\\n    this.DayIndex;\\r\\n    this.MultiDayBeforeOpenData;\\r\\n    this.MultiDayAfterCloseData;\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        this.Item=null;\\r\\n        this.DataIndex=null;\\r\\n        this.DayIndex=null;\\r\\n\\r\\n        if (this.ClientPos==2)\\r\\n        {\\r\\n            return this.GetBeforeOpenXIndex();\\r\\n        }\\r\\n        else if (this.ClientPos==3)\\r\\n        {\\r\\n            return this.GetAfterCloseXIndex();\\r\\n        }\\r\\n        else if (this.ClientPos>=200 && this.ClientPos<=299)\\r\\n        {\\r\\n            return this.GetMultiDayBeforeOpenXIndex();\\r\\n        }\\r\\n        else if (this.ClientPos>=300 && this.ClientPos<=399)\\r\\n        {\\r\\n            return this.GetMultiDayAfterCloseXIndex();\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.GetBeforeOpenXIndex=function()\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(this.Value)) return false;\\r\\n        if (!this.BeforeOpenData || !this.BeforeOpenData.Data) return false;\\r\\n\\r\\n        var index=this.Frame.GetLeftExtendXData(this.Value, this.BeforeOpenData);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n\\r\\n        if (index>=0 && index<this.BeforeOpenData.Data.length)\\r\\n        {\\r\\n            var item=this.BeforeOpenData.Data[index];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                this.Item=item;\\r\\n                this.X=this.Value;\\r\\n                this.DataIndex=index;\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (index<0) index=0;\\r\\n        else if (index>=this.BeforeOpenData.Data.length) index=this.BeforeOpenData.Data.length-1;\\r\\n\\r\\n        var findIndex=-1;\\r\\n        for(var i=index; i>=0; --i)\\r\\n        {\\r\\n            var item=this.BeforeOpenData.Data[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                findIndex=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex<0)\\r\\n        {\\r\\n            for(var i=index+1; i<this.BeforeOpenData.Data.length;++i)\\r\\n            {\\r\\n                var item=this.BeforeOpenData.Data[i];\\r\\n                if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n                {\\r\\n                    findIndex=i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex<0) return false;\\r\\n\\r\\n        this.Item=item;\\r\\n        this.DataIndex=findIndex;\\r\\n        this.X=this.Frame.GetLeftExtendXFromIndex(findIndex, this.BeforeOpenData);  //调整X轴坐标\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayBeforeOpenXIndex=function()\\r\\n    {\\r\\n        if (!this.MultiDayBeforeOpenData || !IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData)) return;\\r\\n        var dayIndex=this.ClientPos-200;\\r\\n        if (dayIndex<0 || dayIndex>=this.MultiDayBeforeOpenData.length) return;\\r\\n\\r\\n        var dayData=this.MultiDayBeforeOpenData[dayIndex];\\r\\n        var indexData=this.Frame.GetLeftExtendXData(this.Value, this.MultiDayBeforeOpenData);\\r\\n        var index=parseInt(indexData.DataIndex.toFixed(0));\\r\\n        var dayIndex=indexData.DayIndex;\\r\\n\\r\\n        if (index>=0 && index<dayData.Data.length)\\r\\n        {\\r\\n            var item=dayData.Data[index];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                this.Item=item;\\r\\n                this.X=this.Value;\\r\\n                this.DataIndex=index;\\r\\n                this.DayIndex=dayIndex;\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (index<0) index=0;\\r\\n        else if (index>=dayData.Data.length) index=dayData.Data.length-1;\\r\\n        var findIndex=-1;\\r\\n        for(var i=index; i>=0; --i)\\r\\n        {\\r\\n            var item=dayData.Data[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                findIndex=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex<0) return false;\\r\\n\\r\\n        this.Item=item;\\r\\n        this.DataIndex=findIndex;\\r\\n        this.DayIndex=dayIndex;\\r\\n        this.X=this.Frame.GetLeftExtendXFromIndex(findIndex, dayData);  //调整X轴坐标\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetAfterCloseXIndex=function()\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(this.Value)) return false;\\r\\n        if (!this.AfterCloseData || !this.AfterCloseData.Data) return false;\\r\\n\\r\\n        var index=this.Frame.GetRightExtendXData(this.Value, this.AfterCloseData);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n\\r\\n        if (index>=0 && index<this.AfterCloseData.Data.length)\\r\\n        {\\r\\n            var item=this.AfterCloseData.Data[index];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                this.Item=item;\\r\\n                this.X=this.Value;\\r\\n                this.DataIndex=index;\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (index<0) index=0;\\r\\n        else if (index>=this.AfterCloseData.Data.length) index=this.AfterCloseData.Data.length-1;\\r\\n        var findIndex=-1;\\r\\n        for(var i=index; i>=0; --i)\\r\\n        {\\r\\n            var item=this.AfterCloseData.Data[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                findIndex=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex<0)\\r\\n        {\\r\\n            for(var i=index+1; i<this.AfterCloseData.Data.length;++i)\\r\\n            {\\r\\n                var item=this.AfterCloseData.Data[i];\\r\\n                if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n                {\\r\\n                    findIndex=i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex<0) return false;\\r\\n\\r\\n        this.Item=item;\\r\\n        this.DataIndex=findIndex;\\r\\n        this.X=this.Frame.GetRightExtendXFromIndex(findIndex, this.AfterCloseData);  //调整X轴坐标\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayAfterCloseXIndex=function()\\r\\n    {\\r\\n        if (!this.MultiDayAfterCloseData || !IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData)) return;\\r\\n        var dayIndex=this.ClientPos-300;\\r\\n        if (dayIndex<0 || dayIndex>=this.MultiDayAfterCloseData.length) return;\\r\\n\\r\\n        var dayData=this.MultiDayAfterCloseData[dayIndex];\\r\\n        var indexData=this.Frame.GetRightExtendXData(this.Value, this.MultiDayAfterCloseData);\\r\\n        var index=parseInt(indexData.DataIndex.toFixed(0));\\r\\n        var dayIndex=indexData.DayIndex;\\r\\n\\r\\n        if (index>=0 && index<dayData.Data.length)\\r\\n        {\\r\\n            var item=dayData.Data[index];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                this.Item=item;\\r\\n                this.X=this.Value;\\r\\n                this.DataIndex=index;\\r\\n                this.DayIndex=dayIndex;\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (index<0) index=0;\\r\\n        else if (index>=dayData.Data.length) index=dayData.Data.length-1;\\r\\n        var findIndex=-1;\\r\\n        for(var i=index; i>=0; --i)\\r\\n        {\\r\\n            var item=dayData.Data[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item.Price))\\r\\n            {\\r\\n                findIndex=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (findIndex<0) return false;\\r\\n\\r\\n        this.Item=item;\\r\\n        this.DataIndex=findIndex;\\r\\n        this.DayIndex=dayIndex;\\r\\n        this.X=this.Frame.GetRightExtendXFromIndex(findIndex, dayData);  //调整X轴坐标\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n///////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//十字光标\\r\\nfunction ChartCorssCursor()\\r\\n{\\r\\n    this.ClassName=\\\"ChartCorssCursor\\\";\\r\\n    this.Frame;\\r\\n    this.Canvas;                            //画布\\r\\n\\r\\n    this.HPenColor=g_JSChartResource.CorssCursorHPenColor; //水平线颜色\\r\\n    this.HPenType=0;  //水平线样式 0=虚线 1=实线\\r\\n\\r\\n    this.VPenColor=g_JSChartResource.CorssCursorVPenColor; //垂直线颜色\\r\\n    this.VPenType=0;  //垂直线颜色 0=虚线 1=实线 2=K线宽度\\r\\n    this.VLineType=0;   //垂直线 0=默认指标标题栏不画， 1=指标标题栏也画\\r\\n\\r\\n    this.Font=g_JSChartResource.CorssCursorTextFont;            //字体\\r\\n    this.TextColor=g_JSChartResource.CorssCursorTextColor;      //文本颜色\\r\\n    this.TextBGColor=g_JSChartResource.CorssCursorBGColor;      //文本背景色\\r\\n    this.BorderColor=g_JSChartResource.CorssCursorBorderColor;  //边框颜色\\r\\n    this.XRangeBGColor=g_JSChartResource.CorssCursorXRangeBGColor;\\r\\n    this.TextHeight=20;                                         //文本字体高度\\r\\n    this.LastPoint;\\r\\n    this.CursorIndex;\\r\\n    this.IsOnlyDrawKLine=false;                                 //是否只能画在K线上 (手机端)\\r\\n    this.IsOnlyDrawMinute=false;                                //是否只能画在走势图价格线上\\r\\n    this.IsFixXLastTime=false;                                  //是否修正X轴,超出当前时间的,X轴调整到当前最后的时间.\\r\\n    this.IsDrawXRangeBG=false;            //是否绘制十字光标背景\\r\\n\\r\\n    this.PointX;\\r\\n    this.PointY;\\r\\n\\r\\n    this.StringFormatX;\\r\\n    this.StringFormatY;\\r\\n\\r\\n    this.ShowTextMode={ Left:1, Right:1, Bottom:1 }; //0=不显示  1=显示在框架外 2=显示在框架内\\r\\n    this.TextFormat= { Right:0 };               //0=默认 1=价格显示(分时图才有用)\\r\\n    this.IsShowCorss=true;      //是否显示十字光标\\r\\n    this.IsShow=true;\\r\\n    this.IsShowClose=false;     //Y轴始终显示收盘价\\r\\n    this.ClientPos=-1;\\r\\n    this.CallAcutionXOperator;\\r\\n\\r\\n    this.RightButton=\\r\\n        {\\r\\n            Enable:false, Rect:null,\\r\\n            BGColor:g_JSChartResource.CorssCursor.RightButton.BGColor ,\\r\\n            PenColor:g_JSChartResource.CorssCursor.RightButton.PenColor,\\r\\n            Icon:g_JSChartResource.CorssCursor.RightButton.Icon\\r\\n        };\\r\\n\\r\\n    //内部使用\\r\\n    this.Close=null;     //收盘价格\\r\\n    this.Status=0;       //当前状态 0=隐藏 1=显示\\r\\n\\r\\n    this.ReloadResource=function(resource)\\r\\n    {\\r\\n        this.Font=g_JSChartResource.CorssCursorTextFont;            //字体\\r\\n\\r\\n        this.HPenColor=g_JSChartResource.CorssCursorHPenColor; //水平线颜色\\r\\n        this.VPenColor=g_JSChartResource.CorssCursorVPenColor; //垂直线颜色\\r\\n        this.TextColor=g_JSChartResource.CorssCursorTextColor;      //文本颜色\\r\\n        this.TextBGColor=g_JSChartResource.CorssCursorBGColor;      //文本背景色\\r\\n        this.BorderColor=g_JSChartResource.CorssCursorBorderColor;  //边框颜色\\r\\n        this.XRangeBGColor=g_JSChartResource.CorssCursorXRangeBGColor;\\r\\n    }\\r\\n\\r\\n    this.GetCloseYPoint=function(index)\\r\\n    {\\r\\n        if (!this.StringFormatX.Data) return null;\\r\\n        var data = this.StringFormatX.Data;\\r\\n        if (!data.Data || data.Data.length <= 0) return null;\\r\\n        var dataIndex = data.DataOffset + index;\\r\\n        if (dataIndex >= data.Data.length) dataIndex = data.Data.length - 1;\\r\\n        if (dataIndex < 0) return null;\\r\\n\\r\\n        var klineData = data.Data[dataIndex];\\r\\n        if (!klineData) return null;\\r\\n        this.Close=klineData.Close;\\r\\n        var yPoint = this.Frame.GetYFromData(this.Close);\\r\\n        return yPoint;\\r\\n    }\\r\\n\\r\\n    this.GetMinuteCloseYPoint=function(index)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(index)) return null;\\r\\n        index=parseInt(index);\\r\\n        if (!this.StringFormatX.Data) return null;\\r\\n        var data = this.StringFormatX.Data;\\r\\n        if (!data.Data || data.Data.length <= 0) return null;\\r\\n        var dataIndex = data.DataOffset + index;\\r\\n        if (dataIndex >= data.Data.length) dataIndex = data.Data.length - 1;\\r\\n        if (dataIndex < 0) return null;\\r\\n\\r\\n        var close = data.Data[dataIndex];\\r\\n        if (!IFrameSplitOperator.IsNumber(index)) return null;\\r\\n        this.Close=close;\\r\\n        var yPoint = this.Frame.GetYFromData(this.Close);\\r\\n        return yPoint;\\r\\n    }\\r\\n\\r\\n    this.GetDateTimeRange=function(index, option)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(index)) return null;\\r\\n        index=parseInt(index);\\r\\n        var data = this.StringFormatX.Data;\\r\\n        if (!data.Data || data.Data.length <= 0) return null;\\r\\n        var dataIndex = data.DataOffset + index;\\r\\n        if (dataIndex>=data.Data.length || dataIndex<0) return null;\\r\\n        if (!this.Frame || !this.Frame.SubFrame[0] || !this.Frame.SubFrame[0].Frame) return null;\\r\\n        var frame=this.Frame.SubFrame[0].Frame;\\r\\n\\r\\n        var dataWidth=frame.DataWidth;\\r\\n        var distanceWidth=frame.DistanceWidth;\\r\\n        var xPointCount=frame.XPointCount;\\r\\n\\r\\n        var kItem = data.Data[dataIndex];\\r\\n        if (!kItem) return null;\\r\\n\\r\\n        var date=kItem.Date*1000000;\\r\\n        var time=parseInt(kItem.Time/100)*100;\\r\\n        var startTime=date+time;\\r\\n        var endTime=date+time+59;\\r\\n\\r\\n        var endIndex=dataIndex;\\r\\n        for(var i=dataIndex; i<data.Data.length; ++i)\\r\\n        {\\r\\n            var item=data.Data[i];\\r\\n            var dateTime=item.Date*1000000+item.Time;\\r\\n            if (dateTime>endTime) break;\\r\\n            if (i-data.DataOffset>=xPointCount) break;\\r\\n            endIndex=i;\\r\\n        }\\r\\n\\r\\n        var startIndex=dataIndex;\\r\\n        for(var i=dataIndex;i>=0 && i>=data.DataOffset;--i)\\r\\n        {\\r\\n            var item=data.Data[i];\\r\\n            var dateTime=item.Date*1000000+item.Time;\\r\\n            if (dateTime<startTime) break;\\r\\n            startIndex=i;\\r\\n        }\\r\\n\\r\\n        var range={ StartIndex:startIndex, EndIndex:endIndex };\\r\\n\\r\\n        range.XStart=this.Frame.GetXFromIndex(startIndex-data.DataOffset);\\r\\n        range.XEnd=this.Frame.GetXFromIndex(endIndex-data.DataOffset);\\r\\n\\r\\n        range.XStart-=(distanceWidth+dataWidth)/2;\\r\\n        range.XEnd+=(distanceWidth+dataWidth)/2;\\r\\n\\r\\n        return range;\\r\\n    }\\r\\n\\r\\n    this.FixMinuteLastTimeXPoint=function(index)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(index)) return null;\\r\\n        index=parseInt(index);\\r\\n        if (!this.StringFormatX.Data) return null;\\r\\n        var data = this.StringFormatX.Data;\\r\\n        if (!data.Data || data.Data.length <= 0) return null;\\r\\n        var dataIndex = data.DataOffset + index;\\r\\n        if (dataIndex<data.Data.length) return null;\\r\\n\\r\\n        dataIndex=data.Data.length - 1;\\r\\n        dataIndex-=data.DataOffset;\\r\\n        var xPoint=this.Frame.GetXFromIndex(dataIndex);\\r\\n\\r\\n        return { X:xPoint, Index:dataIndex };\\r\\n    }\\r\\n\\r\\n    //返回 -1=不在客户区  1=在主区域  2=左边扩展  3=右边扩展\\r\\n    this.PtInClient=function(x,y)\\r\\n    {\\r\\n        this.Canvas.beginPath();\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            var border=this.Frame.ChartBorder.GetHScreenBorder();\\r\\n            this.Canvas.rect(border.Left,border.TopEx,border.Right-border.Left,border.BottomEx-border.TopEx);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var border=this.Frame.ChartBorder.GetBorder();\\r\\n            this.Canvas.rect(border.LeftEx,border.Top,border.RightEx-border.LeftEx,border.Bottom-border.Top);\\r\\n        }\\r\\n\\r\\n        if (this.Canvas.isPointInPath(x,y)) return 1;\\r\\n\\r\\n        if (this.Frame.ChartBorder.LeftExtendWidth>10)\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.Frame.IsHScreen===true)\\r\\n            {\\r\\n                this.Canvas.rect(border.Left,border.Top,border.Right-border.Left,border.TopEx-border.Top);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.rect(border.Left,border.Top,border.LeftEx-border.Left,border.Bottom-border.Top);\\r\\n            }\\r\\n\\r\\n            if (this.Canvas.isPointInPath(x,y)) return 2;\\r\\n        }\\r\\n\\r\\n        if (this.Frame.ChartBorder.RightExtendWidth>10)\\r\\n        {\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.Frame.IsHScreen===true)\\r\\n            {\\r\\n                this.Canvas.rect(border.Left,border.BottomEx,border.Right-border.Left,border.Bottom-border.BottomEx);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.rect(border.RightEx,border.Top,border.Right-border.RightEx,border.Bottom-border.Top);\\r\\n            }\\r\\n\\r\\n            if (this.Canvas.isPointInPath(x,y)) return 3;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.GetFontHeight=function(font)\\r\\n    {\\r\\n        return GetFontHeight(this.Canvas, font, \\\"擎\\\");\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.Status=0;\\r\\n        this.RightButton.Rect=null;\\r\\n\\r\\n        if (!this.LastPoint) return;\\r\\n\\r\\n        this.Close=null;\\r\\n        var x=this.LastPoint.X;\\r\\n        var y=this.LastPoint.Y;\\r\\n\\r\\n        var clientPos=this.PtInClient(x,y);\\r\\n\\r\\n        this.PointY=null;\\r\\n        this.PointY==null;\\r\\n        this.ClientPos=clientPos;\\r\\n        if (clientPos<=0) return;\\r\\n\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            this.HScreenDraw();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var border=this.Frame.ChartBorder.GetBorder();\\r\\n        var left=border.Left\\r\\n        var right=border.Right;\\r\\n        var top=border.TopTitle;\\r\\n        var bottom=border.Bottom;\\r\\n        var rightWidth=this.Frame.ChartBorder.Right;\\r\\n        var chartRight=border.ChartWidth;\\r\\n\\r\\n        if (this.IsOnlyDrawKLine)   //手机端 十字只能画在K线上\\r\\n        {\\r\\n            x=this.Frame.GetXFromIndex(this.CursorIndex);\\r\\n            if (this.IsShowClose)\\r\\n            {\\r\\n                var yPoint = this.GetCloseYPoint(this.CursorIndex);\\r\\n                if (yPoint != null) y=yPoint;\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsOnlyDrawMinute)\\r\\n        {\\r\\n            var yPoint = this.GetMinuteCloseYPoint(this.CursorIndex);\\r\\n            if (yPoint != null) y=yPoint;\\r\\n        }\\r\\n\\r\\n        if (this.CallAcutionXOperator)\\r\\n        {\\r\\n            this.CallAcutionXOperator.Value=x;\\r\\n            this.CallAcutionXOperator.Point={X:x, Y:y};\\r\\n            this.CallAcutionXOperator.ClientPos=clientPos;\\r\\n\\r\\n            if (this.CallAcutionXOperator.Operator())\\r\\n            {\\r\\n                x=this.CallAcutionXOperator.X;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.IsFixXLastTime)\\r\\n        {\\r\\n            var value=this.FixMinuteLastTimeXPoint(this.CursorIndex)\\r\\n            if (value)\\r\\n            {\\r\\n                x=value.X;\\r\\n                this.CursorIndex=value.Index;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.PointY=[[left,y],[right,y]];\\r\\n        this.PointX=[[x,top],[x,bottom]];\\r\\n\\r\\n        //十字线\\r\\n        if (this.IsShowCorss)\\r\\n        {\\r\\n            var rangeBG=null;\\r\\n            if (this.IsDrawXRangeBG)\\r\\n            {\\r\\n                rangeBG=this.GetDateTimeRange(this.CursorIndex);\\r\\n            }\\r\\n\\r\\n            var pixel=GetDevicePixelRatio();\\r\\n            if (this.HPenType==1 || this.HPenType==0)   //0=实线 1=虚线\\r\\n            {\\r\\n                this.Canvas.strokeStyle=this.HPenColor;\\r\\n                if (this.HPenType==0) this.Canvas.setLineDash([3*pixel,2*pixel]);   //虚线\\r\\n                //this.Canvas.lineWidth=0.5\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(left,ToFixedPoint(y));\\r\\n                this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n                this.Canvas.stroke();\\r\\n                if (this.HPenType==0) this.Canvas.setLineDash([]);\\r\\n            }\\r\\n\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.strokeStyle=this.VPenColor;\\r\\n            if (this.VPenType==0)\\r\\n            {\\r\\n                this.Canvas.setLineDash([3*pixel,2*pixel]);   //虚线\\r\\n            }\\r\\n            else if (this.VPenType==2)\\r\\n            {\\r\\n                let barWidth=this.Frame.SubFrame[0].Frame.DataWidth;    //和K线一样宽度\\r\\n                if (barWidth>2*pixel) this.Canvas.lineWidth=barWidth;\\r\\n            }\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.VLineType==1)\\r\\n            {\\r\\n                if (rangeBG)\\r\\n                {\\r\\n                    this.Canvas.fillStyle=this.XRangeBGColor;\\r\\n                    this.Canvas.fillRect(rangeBG.XStart, border.Top, (rangeBG.XEnd-rangeBG.XStart),(border.Bottom-border.Top));\\r\\n                }\\r\\n\\r\\n                this.Canvas.moveTo(ToFixedPoint(x),border.Top);\\r\\n                this.Canvas.lineTo(ToFixedPoint(x),border.Bottom);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.Frame.SubFrame.length>0)\\r\\n                {\\r\\n                    for(var i in this.Frame.SubFrame)\\r\\n                    {\\r\\n                        var frame=this.Frame.SubFrame[i].Frame;\\r\\n                        var subBorder=frame.ChartBorder.GetBorder();\\r\\n                        top=subBorder.TopTitle;\\r\\n                        bottom=subBorder.Bottom;\\r\\n\\r\\n                        if (rangeBG)\\r\\n                        {\\r\\n                            this.Canvas.fillStyle=this.XRangeBGColor;\\r\\n                            this.Canvas.fillRect(rangeBG.XStart, top, (rangeBG.XEnd-rangeBG.XStart),(bottom-top));\\r\\n                        }\\r\\n\\r\\n                        this.Canvas.moveTo(ToFixedPoint(x),top);\\r\\n                        this.Canvas.lineTo(ToFixedPoint(x),bottom);\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(ToFixedPoint(x),top);\\r\\n                    this.Canvas.lineTo(ToFixedPoint(x),bottom);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.restore();\\r\\n\\r\\n        }\\r\\n\\r\\n        var xValue=this.Frame.GetXData(x);\\r\\n        var yValueExtend={};\\r\\n        var yValue=this.Frame.GetYData(y,yValueExtend);\\r\\n        if ( (this.IsOnlyDrawMinute || this.IsShowClose) && this.Close != null) yValue=this.Close;\\r\\n\\r\\n        //this.StringFormatX.Value=xValue;\\r\\n        this.StringFormatX.Value=this.CursorIndex;\\r\\n        this.StringFormatX.Point={X:x, Y:y};\\r\\n        this.StringFormatX.ClientPos=clientPos;\\r\\n\\r\\n        this.StringFormatY.Value=yValue;\\r\\n        this.StringFormatY.RValue=yValueExtend.RightYValue; //右侧子坐标\\r\\n        this.StringFormatY.FrameID=yValueExtend.FrameID;\\r\\n        this.StringFormatY.Point={X:x, Y:y};\\r\\n        this.StringFormatY.ClientPos=clientPos;\\r\\n\\r\\n        this.Canvas.font=this.Font;\\r\\n        var textHeight=this.GetFontHeight();\\r\\n        if (textHeight>this.TextHeight) this.TextHeight=textHeight;\\r\\n\\r\\n        //Y轴\\r\\n        if ( ((this.ShowTextMode.Left==1 && this.Frame.ChartBorder.Left>=30) || this.ShowTextMode.Left==2 ||\\r\\n            (this.ShowTextMode.Right==1 && this.Frame.ChartBorder.Right>=30) || this.ShowTextMode.Right==2 ) && this.StringFormatY.Operator() )\\r\\n        {\\r\\n            var text=this.StringFormatY.Text;\\r\\n            this.Canvas.font=this.Font;\\r\\n            var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n            var buttonData={Y:y, YValue:yValue, FrameID:yValueExtend.FrameID };\\r\\n            if (this.Frame.ChartBorder.Left>=30 && this.ShowTextMode.Left==1)\\r\\n            {\\r\\n                if (left<textWidth ) //左边空白的地方太少了画布下\\r\\n                {\\r\\n                    this.DrawTextBGRect(ToFixedPoint(2),ToFixedPoint(y-this.TextHeight/2),ToFixedRect(textWidth),ToFixedRect(this.TextHeight));\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,2+2,y,textWidth);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.DrawTextBGRect(left-2,y-this.TextHeight/2,-textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,left-4,y,textWidth);\\r\\n                }\\r\\n            }\\r\\n            else if (this.ShowTextMode.Left==2) //在框架内显示\\r\\n            {\\r\\n                this.DrawTextBGRect(left,y-this.TextHeight/2,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,left+2,y,textWidth);\\r\\n            }\\r\\n\\r\\n            if (this.StringFormatY.PercentageText)\\r\\n            {\\r\\n                if (this.TextFormat.Right==0)\\r\\n                {\\r\\n                    text=this.StringFormatY.PercentageText+'%';\\r\\n                    textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (this.StringFormatY.RText)\\r\\n            {\\r\\n                text=this.StringFormatY.RText;\\r\\n                var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n            }\\r\\n\\r\\n            if (this.Frame.ChartBorder.Right>=30 && this.ShowTextMode.Right==1)\\r\\n            {\\r\\n                var isOverlayIndex=false;       //是否有叠加子坐标\\r\\n                var overlayIndexInterval=null;  //子坐标间距\\r\\n                if (yValueExtend.FrameID>=0)\\r\\n                {\\r\\n                    var frame=this.Frame.SubFrame[yValueExtend.FrameID];\\r\\n                    isOverlayIndex=frame.OverlayIndex.length>0;\\r\\n                    overlayIndexInterval=frame.Interval;\\r\\n                }\\r\\n\\r\\n                if (isOverlayIndex && textWidth>overlayIndexInterval)   //大于子坐标宽度\\r\\n                {\\r\\n                    var drawRight=right+overlayIndexInterval;\\r\\n                    if (drawRight>chartRight) drawRight=chartRight;\\r\\n                    this.DrawTextBGRect(drawRight-2-textWidth,y-this.TextHeight/2,textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,drawRight-4,y,textWidth);\\r\\n                }\\r\\n                else if (rightWidth<textWidth)   //右边空白显示不下,\\r\\n                {\\r\\n                    this.DrawTextBGRect(chartRight-2-textWidth,y-this.TextHeight/2,textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,chartRight-4,y,textWidth);\\r\\n\\r\\n                    if (this.RightButton.Enable) this.DrawRightButton(y-this.TextHeight/2, chartRight-2-textWidth,this.TextHeight,this.TextHeight,buttonData);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.DrawTextBGRect(right+2,y-this.TextHeight/2,textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,right+4,y,textWidth);\\r\\n\\r\\n                    if (this.RightButton.Enable) this.DrawRightButton(y-this.TextHeight/2, right+2,this.TextHeight,this.TextHeight,buttonData);\\r\\n                }\\r\\n\\r\\n                if (this.StringFormatY.RExtendText && this.StringFormatY.RExtendText.length>0)\\r\\n                {\\r\\n                    var yOffset=0;\\r\\n                    for(var i in this.StringFormatY.RExtendText)\\r\\n                    {\\r\\n                        var item=this.StringFormatY.RExtendText[i];\\r\\n                        var rText='--.--'\\r\\n                        if (item.YText) rText=item.YText;\\r\\n                        else if (IFrameSplitOperator.IsNumber(item.Y)) rText=item.Y.toFixed(0);\\r\\n                        var rTextWidth=this.Canvas.measureText(rText).width+4;    //前后各空2个像素\\r\\n\\r\\n                        if (rightWidth<rTextWidth)\\r\\n                        {\\r\\n                            this.DrawTextBGRect(chartRight-2-rTextWidth,y+yOffset+this.TextHeight/2,rTextWidth,this.TextHeight);\\r\\n                            this.Canvas.textAlign=\\\"right\\\";\\r\\n                            this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                            this.Canvas.fillStyle=item.TextColor;\\r\\n                            this.Canvas.fillText(rText,chartRight-4,y+yOffset+this.TextHeight,rTextWidth);\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            this.DrawTextBGRect(right+2,y+yOffset+this.TextHeight/2,rTextWidth,this.TextHeight);\\r\\n                            this.Canvas.textAlign=\\\"left\\\";\\r\\n                            this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                            this.Canvas.fillStyle=item.TextColor;\\r\\n                            this.Canvas.fillText(rText,right+4,y+yOffset+this.TextHeight,rTextWidth);\\r\\n                        }\\r\\n\\r\\n                        yOffset+=this.TextHeight;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else if (this.ShowTextMode.Right==2)\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.TextBGColor;\\r\\n                var showLeft=right-textWidth;\\r\\n                this.DrawTextBGRect(showLeft,y-this.TextHeight/2,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,showLeft+2,y,textWidth);\\r\\n\\r\\n                if (this.RightButton.Enable) this.DrawRightButton(y-this.TextHeight/2, showLeft,this.TextHeight,this.TextHeight,buttonData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //X轴\\r\\n        if (this.ShowTextMode.Bottom==1 && this.StringFormatX.Operator())\\r\\n        {\\r\\n            var text=this.StringFormatX.Text;\\r\\n            this.Canvas.font=this.Font;\\r\\n\\r\\n            this.Canvas.fillStyle=this.TextBGColor;\\r\\n            var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n            var yCenter=bottom+2+this.TextHeight/2;\\r\\n            //JSConsole.Chart.Log('[ChartCorssCursor::Draw] ',yCenter);\\r\\n            if (x-textWidth/2<3)    //左边位置不够了, 顶着左边画\\r\\n            {\\r\\n                this.DrawTextBGRect(x-1,bottom+2,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,x+1,yCenter,textWidth);\\r\\n            }\\r\\n            else if (x+textWidth/2>=right)\\r\\n            {\\r\\n                this.DrawTextBGRect(right-textWidth,bottom+2,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"right\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,right-2,yCenter,textWidth);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.DrawTextBGRect(x-textWidth/2,bottom+2,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"center\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,x,yCenter,textWidth);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //子坐标Y轴\\r\\n        if (yValueExtend.FrameID>=0)\\r\\n        {\\r\\n            var frame=this.Frame.SubFrame[yValueExtend.FrameID];\\r\\n            var isAutoRightBorder=false;\\r\\n            if (this.Frame.AutoRightBorder) isAutoRightBorder=true;\\r\\n            var overlayLeft=right;\\r\\n            if (isAutoRightBorder) overlayLeft=right+this.Frame.AuotRightWidth;\\r\\n            this.Canvas.font=this.Font;\\r\\n            for(var i in frame.OverlayIndex)\\r\\n            {\\r\\n                var item=frame.OverlayIndex[i];\\r\\n                if (item.Frame.IsShow===false) continue;\\r\\n\\r\\n                if (!isAutoRightBorder) overlayLeft+=frame.Interval;\\r\\n\\r\\n                if (overlayLeft+30>chartRight) break;\\r\\n                var yValue=item.Frame.GetYData(y);\\r\\n\\r\\n                for(var i=2;i>=0;--i)\\r\\n                {\\r\\n                    var text=IFrameSplitOperator.FormatValueString(yValue,i);\\r\\n                    var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n                    if (textWidth<frame.Interval) break;\\r\\n                }\\r\\n\\r\\n                this.Canvas.fillStyle=this.TextBGColor;\\r\\n                this.Canvas.fillRect(overlayLeft+2,y-this.TextHeight/2,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,overlayLeft+4,y,textWidth);\\r\\n\\r\\n                if (isAutoRightBorder) overlayLeft+=item.RightWidth.Width;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Status=1;\\r\\n    }\\r\\n\\r\\n    this.DrawRightButton=function(drawTop, drawRight, drawWidth, drawHeight, data)\\r\\n    {\\r\\n        this.Canvas.fillStyle=this.RightButton.BGColor;\\r\\n        var rtButtom={Left:drawRight-drawWidth, Top:drawTop, Width:drawWidth, Height:drawHeight };\\r\\n        this.RightButton.Rect=rtButtom;\\r\\n        this.RightButton.Data=data;\\r\\n        this.Canvas.fillRect(ToFixedPoint(rtButtom.Left+1),ToFixedPoint(rtButtom.Top),ToFixedRect(rtButtom.Width),ToFixedRect(rtButtom.Height));\\r\\n\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        var spaceWidth=3;\\r\\n        var yCenter=(rtButtom.Top+spaceWidth)+(rtButtom.Height-spaceWidth*2)/2;\\r\\n        var xCenter=(rtButtom.Left+spaceWidth)+(rtButtom.Width-spaceWidth*2)/2;\\r\\n\\r\\n        if (this.RightButton.Icon)\\r\\n        {\\r\\n            var icon=this.RightButton.Icon;\\r\\n            this.Canvas.font=`${icon.Size*pixelRatio}px ${icon.Family}`;\\r\\n            this.Canvas.textAlign=\\\"center\\\";\\r\\n            this.Canvas.textBaseline=\\\"middle\\\";\\r\\n            this.Canvas.fillStyle=icon.Color;\\r\\n            this.Canvas.fillText(\\\"\\\\ue6a3\\\",xCenter,yCenter);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //画加号\\r\\n            this.Canvas.strokeStyle=this.RightButton.PenColor;\\r\\n            var x=rtButtom.Left+spaceWidth;\\r\\n            var y=rtButtom.Top+spaceWidth;\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.linewidth=1*pixelRatio;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ToFixedPoint(x), ToFixedPoint(yCenter));\\r\\n            this.Canvas.lineTo(ToFixedPoint(x+rtButtom.Width-spaceWidth*2), ToFixedPoint(yCenter));\\r\\n\\r\\n            this.Canvas.moveTo(ToFixedPoint(xCenter),ToFixedPoint(y));\\r\\n            this.Canvas.lineTo(ToFixedPoint(xCenter), ToFixedPoint(y+rtButtom.Height-spaceWidth*2));\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.PtInButton=function(x,y)\\r\\n    {\\r\\n        if (!this.RightButton.Enable) return null;\\r\\n        if (!this.RightButton.Rect) return null;\\r\\n\\r\\n        var rect=this.RightButton.Rect;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(rect.Left,rect.Top,rect.Width,rect.Height);\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n        {\\r\\n            return { Data:this.RightButton.Data, Rect:rect };\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawTextBGRect=function(x,y, height, width)\\r\\n    {\\r\\n        this.Canvas.fillStyle=this.TextBGColor;\\r\\n        this.Canvas.fillRect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(height),ToFixedRect(width));\\r\\n\\r\\n        if (this.BorderColor)\\r\\n        {\\r\\n            this.Canvas.strokeStyle=this.BorderColor;\\r\\n            this.Canvas.strokeRect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(height),ToFixedRect(width))\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function()\\r\\n    {\\r\\n        var x=this.LastPoint.X;\\r\\n        var y=this.LastPoint.Y;\\r\\n\\r\\n        if (this.IsOnlyDrawKLine)   //手机端 十字只能画在K线上\\r\\n            y=this.Frame.GetXFromIndex(this.CursorIndex);\\r\\n\\r\\n        var border=this.Frame.ChartBorder.GetHScreenBorder();\\r\\n        var left=border.Left;\\r\\n        var right=border.Right;\\r\\n        var top=border.Top;\\r\\n        var bottom=border.Bottom;\\r\\n        var bottomWidth=this.Frame.ChartBorder.Bottom;\\r\\n\\r\\n        if (this.CallAcutionXOperator)\\r\\n        {\\r\\n            this.CallAcutionXOperator.Value=y;\\r\\n            this.CallAcutionXOperator.Point={X:x, Y:y};\\r\\n            this.CallAcutionXOperator.ClientPos=this.ClientPos;\\r\\n\\r\\n            if (this.CallAcutionXOperator.Operator())\\r\\n            {\\r\\n                y=this.CallAcutionXOperator.X;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.PointY=[[left,y],[right,y]];\\r\\n        this.PointX=[[x,top],[x,bottom]];\\r\\n\\r\\n        //十字线\\r\\n        if (this.IsShowCorss)\\r\\n        {\\r\\n            var pixel=GetDevicePixelRatio();\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.strokeStyle=this.HPenColor;\\r\\n            if (this.HPenType==0) this.Canvas.setLineDash([3*pixel,2*pixel]);   //虚线\\r\\n\\r\\n            //画竖线\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ToFixedPoint(x),top);\\r\\n            this.Canvas.lineTo(ToFixedPoint(x),bottom);\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.restore();\\r\\n\\r\\n            //画横线\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.strokeStyle=this.VPenColor;\\r\\n            if (this.VPenType==0)\\r\\n            {\\r\\n                this.Canvas.setLineDash([3*pixel,2*pixel]);   //虚线\\r\\n            }\\r\\n            else if (this.VPenType==2)\\r\\n            {\\r\\n                let barWidth=this.Frame.SubFrame[0].Frame.DataWidth;    //和K线一样宽度\\r\\n                if (barWidth>2*pixel) this.Canvas.lineWidth=barWidth;\\r\\n            }\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.VLineType==1)\\r\\n            {\\r\\n                this.Canvas.moveTo(left,ToFixedPoint(y));\\r\\n                this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.Frame.SubFrame.length>0)\\r\\n                {\\r\\n                    for(var i in this.Frame.SubFrame)\\r\\n                    {\\r\\n                        var frame=this.Frame.SubFrame[i].Frame;\\r\\n                        var subBorder=frame.ChartBorder.GetHScreenBorder();\\r\\n                        this.Canvas.moveTo(subBorder.Left,ToFixedPoint(y));\\r\\n                        this.Canvas.lineTo(subBorder.RightEx,ToFixedPoint(y));\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.moveTo(left,ToFixedPoint(y));\\r\\n                    this.Canvas.lineTo(right,ToFixedPoint(y));\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n\\r\\n        var xValue=this.Frame.GetXData(y);\\r\\n        var yValueExtend={};\\r\\n        var yValue=this.Frame.GetYData(x,yValueExtend);\\r\\n\\r\\n        this.StringFormatX.Value=xValue;\\r\\n        this.StringFormatX.Point={X:x, Y:y};\\r\\n        this.StringFormatX.ClientPos=this.ClientPos;\\r\\n\\r\\n        this.StringFormatY.Value=yValue;\\r\\n        this.StringFormatY.FrameID=yValueExtend.FrameID;\\r\\n        this.StringFormatY.Point={X:x, Y:y};\\r\\n        this.StringFormatY.ClientPos=this.ClientPos;\\r\\n\\r\\n        if ( ((this.ShowTextMode.Left==1 && this.Frame.ChartBorder.Top>=30) || this.ShowTextMode.Left==2 ||\\r\\n            (this.ShowTextMode.Right==1 && this.Frame.ChartBorder.Bottom>=30) || this.ShowTextMode.Right==2) && this.StringFormatY.Operator() )\\r\\n        {\\r\\n            var text=this.StringFormatY.Text;\\r\\n            this.Canvas.font=this.Font;\\r\\n            var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n\\r\\n            if (this.Frame.ChartBorder.Top>=30 && this.ShowTextMode.Left==1)\\r\\n            {\\r\\n                var xText=x;\\r\\n                var yText=top;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillStyle=this.TextBGColor;\\r\\n                if (top>=textWidth)\\r\\n                {\\r\\n                    this.Canvas.fillRect(0,-(this.TextHeight/2),-textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,-2,0,textWidth);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillRect((textWidth-top),-(this.TextHeight/2),-textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"right\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,(textWidth-top)-2,0,textWidth);\\r\\n                }\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            else if (this.ShowTextMode.Left==2)\\r\\n            {\\r\\n                var xText=x;\\r\\n                var yText=top;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillStyle=this.TextBGColor;\\r\\n                this.Canvas.fillRect(0,-(this.TextHeight/2),textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,2,0,textWidth);\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n\\r\\n            if (this.StringFormatY.RText)\\r\\n            {\\r\\n                text=this.StringFormatY.RText;\\r\\n                var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n            }\\r\\n\\r\\n            if (this.Frame.ChartBorder.Bottom>=30 && this.ShowTextMode.Right==1)\\r\\n            {\\r\\n                var xText=x;\\r\\n                var yText=bottom;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillStyle=this.TextBGColor;\\r\\n                if (bottomWidth>textWidth)\\r\\n                {\\r\\n                    this.Canvas.fillRect(0,-(this.TextHeight/2),textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,2,0,textWidth);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.fillRect((bottomWidth-textWidth),-(this.TextHeight/2),textWidth,this.TextHeight);\\r\\n                    this.Canvas.textAlign=\\\"left\\\";\\r\\n                    this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                    this.Canvas.fillStyle=this.TextColor;\\r\\n                    this.Canvas.fillText(text,(bottomWidth-textWidth)+2,0,textWidth);\\r\\n                }\\r\\n\\r\\n                if (this.StringFormatY.RExtendText && this.StringFormatY.RExtendText.length>0)\\r\\n                {\\r\\n                    var yOffset=0;\\r\\n                    for(var i in this.StringFormatY.RExtendText)\\r\\n                    {\\r\\n                        var item=this.StringFormatY.RExtendText[i];\\r\\n                        var rText='--.--'\\r\\n                        if (item.YText) rText=item.YText;\\r\\n                        else if (IFrameSplitOperator.IsNumber(item.Y)) rText=item.Y.toFixed(0);\\r\\n                        var rTextWidth=this.Canvas.measureText(rText).width+4;    //前后各空2个像素\\r\\n\\r\\n                        this.Canvas.fillStyle=item.TextBGColor;\\r\\n                        if (bottomWidth>rTextWidth)\\r\\n                        {\\r\\n                            this.Canvas.fillRect(0,yOffset+this.TextHeight/2,rTextWidth,this.TextHeight);\\r\\n                            this.Canvas.textAlign=\\\"left\\\";\\r\\n                            this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                            this.Canvas.fillStyle=item.TextColor;\\r\\n                            this.Canvas.fillText(rText,2,yOffset+this.TextHeight,rTextWidth);\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            var rTextLeft=bottomWidth-rTextWidth;\\r\\n                            this.Canvas.fillRect(rTextLeft,yOffset+this.TextHeight/2,rTextWidth,this.TextHeight);\\r\\n                            this.Canvas.textAlign=\\\"left\\\";\\r\\n                            this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                            this.Canvas.fillStyle=item.TextColor;\\r\\n                            this.Canvas.fillText(rText,rTextLeft+2,yOffset+this.TextHeight,rTextWidth);\\r\\n                        }\\r\\n\\r\\n\\r\\n                        yOffset+=this.TextHeight;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            else if (this.ShowTextMode.Right==2)\\r\\n            {\\r\\n                var xText=x;\\r\\n                var yText=bottom;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillStyle=this.TextBGColor;\\r\\n                this.Canvas.fillRect(0,-(this.TextHeight/2),-textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"right\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,-2,0,textWidth);\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.ShowTextMode.Bottom===1 && this.StringFormatX.Operator())\\r\\n        {\\r\\n            var text=this.StringFormatX.Text;\\r\\n            this.Canvas.font=this.Font;\\r\\n\\r\\n            this.Canvas.fillStyle=this.TextBGColor;\\r\\n            var textWidth=this.Canvas.measureText(text).width+4;    //前后各空2个像素\\r\\n            if (y-textWidth/2<3)    //左边位置不够了, 顶着左边画\\r\\n            {\\r\\n                var xText=left;\\r\\n                var yText=y;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillRect(0,0,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"left\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,2,this.TextHeight/2,textWidth);\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            else if (y+textWidth/2>=bottom)\\r\\n            {\\r\\n                var xText=left;\\r\\n                var yText=y;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillRect(-textWidth,0,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"right\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,-2,this.TextHeight/2,textWidth);\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var xText=left;\\r\\n                var yText=y;\\r\\n\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(xText, yText);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n                this.Canvas.fillRect(-textWidth/2,0,textWidth,this.TextHeight);\\r\\n                this.Canvas.textAlign=\\\"center\\\";\\r\\n                this.Canvas.textBaseline=\\\"middle\\\";\\r\\n                this.Canvas.fillStyle=this.TextColor;\\r\\n                this.Canvas.fillText(text,0,this.TextHeight/2,textWidth);\\r\\n\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Status=1;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n//深度图十字光标\\r\\nfunction DepthChartCorssCursor()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.HQChart;\\r\\n    this.Canvas;                            //画布\\r\\n    this.Data;\\r\\n    this.Symbol;\\r\\n\\r\\n    this.HPenType=0;  //水平线样式 0=虚线 1=实线\\r\\n    this.VPenType=0;  //垂直线颜色 0=虚线 1=实线\\r\\n    this.LineDash=g_JSChartResource.DepthCorss.LineDash;\\r\\n    this.IsShowTooltip=true;\\r\\n\\r\\n    this.AskColor=g_JSChartResource.DepthCorss.AskColor.Line;   //卖\\r\\n    this.BidColor=g_JSChartResource.DepthCorss.BidColor.Line;   //买\\r\\n    this.LineWidth=g_JSChartResource.DepthCorss.LineWidth;\\r\\n\\r\\n    this.ClassName=\\\"DepthChartCorssCursor\\\";\\r\\n\\r\\n    this.Tooltip=\\r\\n        {\\r\\n            LineHeight:g_JSChartResource.DepthCorss.Tooltip.LineHeight,\\r\\n            Border:\\r\\n                {\\r\\n                    Top:g_JSChartResource.DepthCorss.Tooltip.Border.Top,\\r\\n                    Left:g_JSChartResource.DepthCorss.Tooltip.Border.Left,\\r\\n                    Bottom:g_JSChartResource.DepthCorss.Tooltip.Border.Bottom,\\r\\n                    Center: g_JSChartResource.DepthCorss.Tooltip.Border.Center\\r\\n                },\\r\\n            Font:g_JSChartResource.DepthCorss.Tooltip.Font,\\r\\n            TextColor:g_JSChartResource.DepthCorss.Tooltip.TextColor,\\r\\n            BGColor:g_JSChartResource.DepthCorss.Tooltip.BGColor\\r\\n        };    // Width: Height:\\r\\n\\r\\n    this.Font=g_JSChartResource.CorssCursorTextFont;            //字体\\r\\n    this.TextColor=g_JSChartResource.CorssCursorTextColor;      //文本颜色\\r\\n    this.TextBGColor=g_JSChartResource.CorssCursorBGColor;      //文本背景色\\r\\n    this.TextHeight=20;                                         //文本字体高度\\r\\n    this.LastPoint;\\r\\n\\r\\n    this.PointX;\\r\\n    this.PointY;\\r\\n\\r\\n    this.StringFormatX;\\r\\n    this.StringFormatY;\\r\\n\\r\\n    this.IsShowCorss=true;  //是否显示十字光标\\r\\n    this.IsShow=true;\\r\\n\\r\\n    this.GetVol=function(price, isAsk)\\r\\n    {\\r\\n        if (!this.Data) return null;\\r\\n        var aryData=isAsk? this.Data.Asks:this.Data.Bids;\\r\\n        if (!aryData || !Array.isArray(aryData) || aryData.length<=0) return null;\\r\\n\\r\\n        for(var i in aryData)\\r\\n        {\\r\\n            var item=aryData[i];\\r\\n            if (item.Price==price) return item.Vol;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.Status=0;\\r\\n        if (!this.LastPoint) return;\\r\\n        if (!this.Data) return;\\r\\n        if (!this.IsShow) return;\\r\\n\\r\\n        var x=this.LastPoint.X;\\r\\n        var y=this.LastPoint.Y;\\r\\n\\r\\n        var isInClient=false;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());\\r\\n        isInClient=this.Canvas.isPointInPath(x,y);\\r\\n\\r\\n        this.PointY=null;\\r\\n        this.PointY==null;\\r\\n\\r\\n        if (!isInClient) return;\\r\\n\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var left=this.Frame.ChartBorder.GetLeft();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        var top=this.Frame.ChartBorder.GetTopTitle();\\r\\n        var bottom=this.Frame.ChartBorder.GetBottom();\\r\\n        var rightWidth=this.Frame.ChartBorder.Right;\\r\\n        var chartRight=this.Frame.ChartBorder.GetChartWidth();\\r\\n\\r\\n        var xValue=this.Frame.GetXData(x);\\r\\n        var xInfo=this.Frame.GetXFromPrice(xValue); //调整价格到有数据的点上\\r\\n\\r\\n        if (!xInfo) return;\\r\\n\\r\\n        var yVol=this.GetVol(xInfo.Price, xInfo.IsAsk);\\r\\n        y=this.Frame.GetYFromData(yVol);    //调整Y轴, 让它在线段上\\r\\n\\r\\n        xInfo.Vol=yVol;\\r\\n        xInfo.Y=y;\\r\\n\\r\\n        this.PointY=[[left,y],[right,y]];\\r\\n        this.PointX=[[x,top],[x,bottom]];\\r\\n\\r\\n        if (this.IsShowCorss)\\r\\n        {\\r\\n            if (xInfo.IsAsk) this.Canvas.strokeStyle=this.AskColor;\\r\\n            else this.Canvas.strokeStyle=this.BidColor;\\r\\n            var lineWidthBackup=this.Canvas.lineWidth;\\r\\n            var pixel=GetDevicePixelRatio();\\r\\n            this.Canvas.lineWidth=this.LineWidth*pixel;\\r\\n            var lineWidth=this.Canvas.lineWidth;\\r\\n\\r\\n            if (this.HPenType==1 || this.HPenType==0)   //0=实线 1=虚线\\r\\n            {\\r\\n                if (this.HPenType==0) this.Canvas.setLineDash(this.LineDash);   //虚线\\r\\n                var yFix=ToFixedPoint2(lineWidth, y);\\r\\n                this.Canvas.beginPath();\\r\\n                this.Canvas.moveTo(left,yFix);\\r\\n                this.Canvas.lineTo(right,yFix);\\r\\n                this.Canvas.stroke();\\r\\n                if (this.HPenType==0) this.Canvas.setLineDash([]);\\r\\n            }\\r\\n\\r\\n            if (this.VPenType==0) this.Canvas.setLineDash(this.LineDash);   //虚线\\r\\n            var xFix=ToFixedPoint2(lineWidth, xInfo.X);\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(xFix,top);\\r\\n            this.Canvas.lineTo(xFix,bottom);\\r\\n            this.Canvas.stroke();\\r\\n            if (this.VPenType==0) this.Canvas.setLineDash([]);\\r\\n\\r\\n            this.Canvas.lineWidth=lineWidthBackup;\\r\\n        }\\r\\n\\r\\n        if (this.HQChart)\\r\\n        {\\r\\n            var event=this.HQChart.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_DEPTH_TOOLTIP);\\r\\n            if (event)\\r\\n            {\\r\\n                event.Callback(event,xInfo,this);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.IsShowTooltip) this.DrawTooltip(xInfo);\\r\\n    }\\r\\n\\r\\n    this.DrawTooltip=function(data)\\r\\n    {\\r\\n        var price=data.Price;\\r\\n        var vol=data.Vol;\\r\\n        var pixel=GetDevicePixelRatio();\\r\\n        var border=this.Tooltip.Border;\\r\\n        this.Canvas.font=this.Tooltip.Font;\\r\\n        var floatPrecision=2;\\r\\n        if (this.Symbol) floatPrecision=GetfloatPrecision(this.Symbol);//价格小数位数\\r\\n        var maxText='擎擎: 9999.99亿 ';\\r\\n        if (floatPrecision>=5) maxText=`擎擎: ${99.99.toFixed(floatPrecision)} `;  //小数位数太多了\\r\\n        this.Tooltip.Width=this.Canvas.measureText(maxText).width+border.Left*pixel;\\r\\n        this.Tooltip.Height=this.Tooltip.LineHeight*pixel*4+border.Top*pixel+border.Bottom*pixel+border.Center*pixel;\\r\\n\\r\\n        var chartRight=this.Frame.ChartBorder.GetRight();\\r\\n        var chartTop=this.Frame.ChartBorder.GetTop();\\r\\n\\r\\n        var left=data.X+2*pixel;\\r\\n        var top=data.Y-this.Tooltip.Height-2*pixel;\\r\\n        if (left+this.Tooltip.Width>=chartRight) left=data.X-this.Tooltip.Width-2*pixel;\\r\\n        if (top<chartTop) top=data.Y+2*pixel;\\r\\n\\r\\n        this.Canvas.fillStyle=this.Tooltip.BGColor;\\r\\n        this.Canvas.fillRect(left,top,this.Tooltip.Width,this.Tooltip.Height);\\r\\n\\r\\n        var x=border.Left*pixel+left;\\r\\n        var y=border.Top*pixel+top;\\r\\n\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.fillStyle=this.Tooltip.TextColor;\\r\\n        this.Canvas.fillText(\\\"委托价\\\",x,y);\\r\\n        y+=this.Tooltip.LineHeight*pixel;\\r\\n        this.Canvas.fillText(data.Price.toFixed(floatPrecision),x,y);\\r\\n        y+=this.Tooltip.LineHeight*pixel;\\r\\n        y+=border.Center*pixel;\\r\\n\\r\\n        this.Canvas.fillText(\\\"累计\\\",x,y);\\r\\n        y+=this.Tooltip.LineHeight*pixel;\\r\\n        this.Canvas.fillText(data.Vol.toFixed(4),x,y);\\r\\n    }\\r\\n\\r\\n    this.PtInButton=function(x,y)\\r\\n    {\\r\\n        return null;\\r\\n    }\\r\\n}\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n// 等待提示\\r\\nfunction ChartSplashPaint()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.Canvas;                            //画布\\r\\n    this.Font=g_JSChartResource.DefaultTextFont;            //字体\\r\\n    this.TextColor=g_JSChartResource.DefaultTextColor;      //文本颜色\\r\\n    this.IsEnableSplash=false;\\r\\n    this.SplashTitle='数据加载中';\\r\\n    this.HQChart;\\r\\n\\r\\n    this.EnableSplash=function(bEnable)\\r\\n    {\\r\\n        this.IsEnableSplash=bEnable;\\r\\n        if (this.HQChart)\\r\\n        {\\r\\n            var event=this.HQChart.GetEventCallback(JSCHART_EVENT_ID.ON_ENABLE_SPLASH_DRAW);\\r\\n            if (event)\\r\\n            {\\r\\n                var data={ Enable:bEnable };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetTitle=function(title)\\r\\n    {\\r\\n        this.SplashTitle=title;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsEnableSplash) return;\\r\\n\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            this.HScreenDraw();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var xCenter = (this.Frame.ChartBorder.GetLeft() + this.Frame.ChartBorder.GetRight()) / 2;\\r\\n        var yCenter = (this.Frame.ChartBorder.GetTop() + this.Frame.ChartBorder.GetBottom()) / 2;\\r\\n        this.Canvas.textAlign='center';\\r\\n        this.Canvas.textBaseline='middle';\\r\\n        this.Canvas.fillStyle=this.TextColor;\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillText(this.SplashTitle,xCenter,yCenter);\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function() //横屏\\r\\n    {\\r\\n        var xCenter = (this.Frame.ChartBorder.GetLeft() + this.Frame.ChartBorder.GetRight()) / 2;\\r\\n        var yCenter = (this.Frame.ChartBorder.GetTop() + this.Frame.ChartBorder.GetBottom()) / 2;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.translate(xCenter, yCenter);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n\\r\\n        this.Canvas.textAlign='center';\\r\\n        this.Canvas.textBaseline='middle';\\r\\n        this.Canvas.fillStyle=this.TextColor;\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillText(this.SplashTitle,0,0);\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////////\\r\\n//\\r\\n\\r\\nfunction IChangeStringFormat()\\r\\n{\\r\\n    this.Data;\\r\\n    this.Value;     //数据\\r\\n    this.Text;      //输出字符串\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n//数值放大\\r\\nvar ZOOM_VALUE= [1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000];\\r\\n\\r\\nfunction HQPriceStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Symbol;\\r\\n    this.FrameID;\\r\\n    this.Frame;\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.YClose;            //收盘价\\r\\n    this.PercentageText;    //百分比\\r\\n    this.RValue;            //右边值\\r\\n    this.RText;\\r\\n    this.Point;\\r\\n    this.ClientPos=-1;\\r\\n\\r\\n    this.ExtendChartPaint;\\r\\n    this.RExtendText=[];\\r\\n    this.BeforeOpenData;\\r\\n    this.AfterCloseData;\\r\\n    this.MultiDayBeforeOpenData;\\r\\n    this.MultiDayAfterCloseData;\\r\\n\\r\\n    //盘前集合竞价\\r\\n    this.GetBeforeOpen=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n\\r\\n        var item=this.Frame.SubFrame[this.FrameID];\\r\\n        if (!item || !item.Frame) return false;\\r\\n\\r\\n        var range={ Max:this.BeforeOpenData.VolMax, Min:this.BeforeOpenData.VolMin };\\r\\n        var y=this.Frame.IsHScreen? this.Point.X: this.Point.Y;\\r\\n        var value=item.Frame.GetLeftExtendYData(y,false,{ Range:range } );\\r\\n        var defaultfloatPrecision=2;     //价格小数位数\\r\\n        if (IFrameSplitOperator.IsNumber(value))\\r\\n        {\\r\\n            this.RText=this.Text;\\r\\n            this.Text=IFrameSplitOperator.FormatValueString(value,defaultfloatPrecision,this.LanguageID);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //收盘集合竞价\\r\\n    this.GetAfterClose=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n\\r\\n        var item=this.Frame.SubFrame[this.FrameID];\\r\\n        if (!item || !item.Frame) return false;\\r\\n\\r\\n        var range={ Max:this.AfterCloseData.VolMax, Min:this.AfterCloseData.VolMin };\\r\\n        var y=this.Frame.IsHScreen? this.Point.X: this.Point.Y;\\r\\n        var value=item.Frame.GetRightExtendYData(y,false,{ Range:range } );\\r\\n        var defaultfloatPrecision=2;     //价格小数位数\\r\\n        if (IFrameSplitOperator.IsNumber(value))\\r\\n        {\\r\\n            this.RText=IFrameSplitOperator.FormatValueString(value,defaultfloatPrecision,this.LanguageID);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayBeforeOpen=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var item=this.Frame.SubFrame[this.FrameID];\\r\\n        if (!item || !item.Frame) return false;\\r\\n        if (!this.MultiDayBeforeOpenData || !IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData)) return;\\r\\n        var dayIndex=this.ClientPos-200;\\r\\n        if (dayIndex<0 || dayIndex>=this.MultiDayBeforeOpenData.length) return false;\\r\\n        var dayData=this.MultiDayBeforeOpenData[dayIndex];\\r\\n        var range={ Max:dayData.VolMax, Min:dayData.VolMin };\\r\\n        var y=this.Frame.IsHScreen? this.Point.X: this.Point.Y;\\r\\n        var value=item.Frame.GetLeftExtendYData(y,false,{ Range:range } );\\r\\n        var defaultfloatPrecision=2;     //价格小数位数\\r\\n        if (IFrameSplitOperator.IsNumber(value))\\r\\n        {\\r\\n            this.RText=this.Text;\\r\\n            this.Text=IFrameSplitOperator.FormatValueString(value,defaultfloatPrecision,this.LanguageID);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayAfterClose=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var item=this.Frame.SubFrame[this.FrameID];\\r\\n        if (!item || !item.Frame) return false;\\r\\n        if (!this.MultiDayAfterCloseData || !IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData)) return;\\r\\n        var dayIndex=this.ClientPos-300;\\r\\n        if (dayIndex<0 || dayIndex>=this.MultiDayAfterCloseData.length) return false;\\r\\n        var dayData=this.MultiDayAfterCloseData[dayIndex];\\r\\n\\r\\n        var range={ Max:dayData.VolMax, Min:dayData.VolMin };\\r\\n        var y=this.Frame.IsHScreen? this.Point.X: this.Point.Y;\\r\\n        var value=item.Frame.GetRightExtendYData(y,false,{ Range:range } );\\r\\n        var defaultfloatPrecision=2;     //价格小数位数\\r\\n        if (IFrameSplitOperator.IsNumber(value))\\r\\n        {\\r\\n            this.RText=IFrameSplitOperator.FormatValueString(value,defaultfloatPrecision,this.LanguageID);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        this.RText=null;\\r\\n        this.RExtendText=[];\\r\\n        if (IFrameSplitOperator.IsString(this.RValue)) this.RText=this.RValue;\\r\\n        if (!this.Value) return false;\\r\\n\\r\\n        this.PercentageText=null;\\r\\n        var defaultfloatPrecision=2;     //价格小数位数\\r\\n        if (this.FrameID==0)    //第1个窗口显示原始价格\\r\\n        {\\r\\n            var defaultfloatPrecision=GetfloatPrecision(this.Symbol);\\r\\n            this.Text=this.Value.toFixed(defaultfloatPrecision);\\r\\n            if (this.YClose>0) this.PercentageText=((this.Value-this.YClose)*100/this.YClose).toFixed(2);   //走势图右边坐标显示百分比\\r\\n\\r\\n            this.GetExtendPaintData(defaultfloatPrecision);\\r\\n        }\\r\\n        else if (this.FrameID==1)\\r\\n        {\\r\\n            this.Text=IFrameSplitOperator.FormatValueString(this.Value,defaultfloatPrecision,this.LanguageID);\\r\\n            if (IFrameSplitOperator.IsNumber(this.RValue)) this.RText=IFrameSplitOperator.FormatValueString(this.RValue,defaultfloatPrecision,this.LanguageID);\\r\\n            if (this.ClientPos==2) this.GetBeforeOpen();\\r\\n            else if (this.ClientPos==3) this.GetAfterClose();\\r\\n            else if (this.ClientPos>=200 && this.ClientPos<=299) this.GetMultiDayBeforeOpen();\\r\\n            else if (this.ClientPos>=300 && this.ClientPos<=399) this.GetMultiDayAfterClose();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Text=IFrameSplitOperator.FormatValueString(this.Value,defaultfloatPrecision,this.LanguageID);\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //深度图刻度\\r\\n    this.GetExtendPaintData=function(floatPrecision)\\r\\n    {\\r\\n        var value=parseInt(this.Value*ZOOM_VALUE[floatPrecision]);\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName=='DepthMapPaint' && item.FrameID==this.FrameID)\\r\\n            {\\r\\n                var aryData=item.GetYValueByXValue(value,floatPrecision);\\r\\n                for(var j in aryData)\\r\\n                {\\r\\n                    this.RExtendText.push(aryData[j]);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction HQDateStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.DateFormatType=0;  //0=YYYY-MM-DD 1=YYYY/MM/DD  2=YYYY/MM/DD/W 3=DD/MM/YYYY\\r\\n    this.LanguageID=0;\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(this.Value)) return false;\\r\\n        if (!this.Data) return false;\\r\\n\\r\\n        var index=this.Value;\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        if (this.Data.DataOffset+index>=this.Data.Data.length) return false;\\r\\n        var currentData = this.Data.Data[this.Data.DataOffset+index];\\r\\n        var dateFormatString=\\\"YYYY-MM-DD\\\";\\r\\n        if (this.DateFormatType==1) dateFormatString=\\\"YYYY/MM/DD\\\";\\r\\n        else if (this.DateFormatType==2) dateFormatString=\\\"YYYY/MM/DD/W\\\";\\r\\n        else if (this.DateFormatType==3) dateFormatString=\\\"DD/MM/YYYY\\\";\\r\\n        this.Text=IFrameSplitOperator.FormatDateString(currentData.Date, dateFormatString,this.LanguageID);\\r\\n        if (ChartData.IsMinutePeriod(this.Data.Period,true) ) // 分钟周期\\r\\n        {\\r\\n            var time = IFrameSplitOperator.FormatTimeString(currentData.Time);\\r\\n            this.Text = this.Text + \\\"  \\\" + time;\\r\\n        }\\r\\n        else if (ChartData.IsSecondPeriod(this.Data.Period))\\r\\n        {\\r\\n            var time = IFrameSplitOperator.FormatTimeString(currentData.Time,'HH:MM:SS');\\r\\n            this.Text = this.Text + \\\"  \\\" + time;\\r\\n        }\\r\\n        else if (ChartData.IsTickPeriod(this.Data.Period))  //分笔\\r\\n        {\\r\\n            var time = IFrameSplitOperator.FormatTimeString(currentData.Time);\\r\\n            this.Text = this.Text + \\\"  \\\" + time;\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction HQMinuteTimeStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Frame;\\r\\n    this.Symbol;\\r\\n    this.Point;\\r\\n    this.ClientPos=-1;\\r\\n    this.BeforeOpenData;    //单日分时图 盘前数据\\r\\n    this.AfterCloseData;    //单日分时图 收盘数据\\r\\n\\r\\n    this.MultiDayBeforeOpenData;    //多日分时图 盘前数据\\r\\n    this.MultiDayAfterCloseData;    //多日分时图 收盘数据\\r\\n\\r\\n    this.GetBeforeOpen=function()\\r\\n    {\\r\\n        if (!this.BeforeOpenData || !this.BeforeOpenData.Data) return false;\\r\\n\\r\\n        var x=this.Frame.IsHScreen==true?this.Point.Y:this.Point.X;\\r\\n        var index=this.Frame.GetLeftExtendXData(x, this.BeforeOpenData);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        if (index>=this.BeforeOpenData.Data.length) return false;\\r\\n\\r\\n        var item=this.BeforeOpenData.Data[index];\\r\\n        this.Text=this.FormatCallAcutionDateTime(item, this.BeforeOpenData);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetAfterClose=function()\\r\\n    {\\r\\n        if (!this.AfterCloseData || !this.AfterCloseData.Data) return false;\\r\\n\\r\\n        var x=this.Frame.IsHScreen==true?this.Point.Y:this.Point.X;\\r\\n        var index=this.Frame.GetRightExtendXData(x, this.AfterCloseData);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        if (index>=this.AfterCloseData.Data.length) return false;\\r\\n\\r\\n        var item=this.AfterCloseData.Data[index];\\r\\n        this.Text=this.FormatCallAcutionDateTime(item, this.AfterCloseData);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayBeforeOpen=function()\\r\\n    {\\r\\n        if (!this.MultiDayBeforeOpenData || !this.MultiDayBeforeOpenData ) return false;\\r\\n        if (this.Frame.ChartBorder.MultiDayMinute.Count<=1 || this.Frame.ChartBorder.MultiDayMinute.Left<=0) return false;\\r\\n\\r\\n        var x=this.Frame.IsHScreen==true?this.Point.Y:this.Point.X;\\r\\n        var index=this.Frame.GetLeftExtendXData(x, this.MultiDayBeforeOpenData);\\r\\n        if (!index) return false;\\r\\n\\r\\n        if (index.DayIndex>=this.MultiDayBeforeOpenData.length) return false;\\r\\n        var dayItem=this.MultiDayBeforeOpenData[index.DayIndex];\\r\\n        index.DataIndex=parseInt(index.DataIndex.toFixed(0));\\r\\n        if (index.DataIndex>=dayItem.Data.length) return false;\\r\\n\\r\\n        var item=dayItem.Data[index.DataIndex];\\r\\n        this.Text=this.FormatCallAcutionDateTime(item, dayItem);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetMultiDayAfterClose=function()\\r\\n    {\\r\\n        if (!this.MultiDayAfterCloseData) return false;\\r\\n        if (this.Frame.ChartBorder.MultiDayMinute.Count<=1 || this.Frame.ChartBorder.MultiDayMinute.Right<=0) return false;\\r\\n\\r\\n        var x=this.Frame.IsHScreen==true?this.Point.Y:this.Point.X;\\r\\n        var index=this.Frame.GetRightExtendXData(x, this.MultiDayAfterCloseData);\\r\\n        if (!index) return false;\\r\\n        if (index.DayIndex>=this.MultiDayAfterCloseData.length) return false;\\r\\n        var dayItem=this.MultiDayAfterCloseData[index.DayIndex];\\r\\n        index.DataIndex=parseInt(index.DataIndex.toFixed(0));\\r\\n        if (index.DataIndex>=dayItem.Data.length) return false;\\r\\n\\r\\n        var item=dayItem.Data[index.DataIndex];\\r\\n        this.Text=this.FormatCallAcutionDateTime(item, dayItem);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.FormatCallAcutionDateTime=function(item, callAcutionData)\\r\\n    {\\r\\n        var time=item.Time;\\r\\n        if (callAcutionData.Ver==1.0)\\r\\n            return IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM\\\");\\r\\n        else\\r\\n            return IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM:SS\\\");\\r\\n    }\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        if (this.ClientPos==2) return this.GetBeforeOpen();\\r\\n        else if (this.ClientPos==3) return this.GetAfterClose();\\r\\n        else if (this.ClientPos>=200 && this.ClientPos<=299) return this.GetMultiDayBeforeOpen();\\r\\n        else if (this.ClientPos>=300 && this.ClientPos<=399) return this.GetMultiDayAfterClose();\\r\\n\\r\\n        if (!IFrameSplitOperator.IsNumber(this.Value)) return false;\\r\\n\\r\\n        var index=Math.abs(this.Value);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var showIndex=index;\\r\\n        if (this.Frame && this.Frame.MinuteCount) showIndex=index%this.Frame.MinuteCount;\\r\\n\\r\\n        var timeStringData=g_MinuteTimeStringData;\\r\\n        var timeData=timeStringData.GetTimeData(this.Symbol);\\r\\n        if (!timeData) return false;\\r\\n\\r\\n        if (showIndex<0) showIndex=0;\\r\\n        else if (showIndex>timeData.length) showIndex=timeData.length-1;\\r\\n        if (this.Frame && index>=this.Frame.XPointCount)\\r\\n            showIndex=timeData.length-1;\\r\\n\\r\\n        var time=timeData[showIndex];\\r\\n        this.Text=IFrameSplitOperator.FormatTimeString(time);\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//行情tooltip提示信息格式\\r\\nvar WEEK_NAME=[\\\"日\\\",\\\"一\\\",\\\"二\\\",\\\"三\\\",\\\"四\\\",\\\"五\\\",\\\"六\\\"];\\r\\nfunction HistoryDataStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Symbol;\\r\\n    this.UpColor=g_JSChartResource.UpTextColor;\\r\\n    this.DownColor=g_JSChartResource.DownTextColor;\\r\\n    this.UnchagneColor=g_JSChartResource.UnchagneTextColor;\\r\\n\\r\\n    this.VolColor=g_JSChartResource.Title.VolColor;\\r\\n    this.AmountColor=g_JSChartResource.Title.AmountColor;\\r\\n    this.TurnoverRateColor=g_JSChartResource.Title.TurnoverRateColor;\\r\\n    this.PositionColor=g_JSChartResource.Title.PositionColor;\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.LineCount=0;                   //一共几行\\r\\n    this.LineHeight=g_JSChartResource.PCTooltip.LineHeight;                 //单行高度\\r\\n    this.Width=157;                     //宽度\\r\\n    this.Height=this.LineHeight*5;      //高度\\r\\n\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        var data=this.Value.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        this.Width=157;\\r\\n        if (this.LanguageID==JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID) this.Width=180;\\r\\n\\r\\n        var date=new Date(parseInt(data.Date/10000),(data.Date/100%100-1),data.Date%100);\\r\\n        var strDate=IFrameSplitOperator.FormatDateString(data.Date);\\r\\n        var title2=g_JSChartLocalization.GetText(WEEK_NAME[date.getDay()],this.LanguageID);\\r\\n        var isTickPeriod=ChartData.IsTickPeriod(this.Value.ChartPaint.Data.Period);\\r\\n        if (ChartData.IsMinutePeriod(this.Value.ChartPaint.Data.Period,true)) // 分钟周期\\r\\n        {\\r\\n            title2=IFrameSplitOperator.FormatTimeString(data.Time);\\r\\n        }\\r\\n        else if (ChartData.IsSecondPeriod(this.Value.ChartPaint.Data.Period) || isTickPeriod)\\r\\n        {\\r\\n            title2=IFrameSplitOperator.FormatTimeString(data.Time,'HH:MM:SS');\\r\\n        }\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);//价格小数位数\\r\\n        var increase=null;\\r\\n        if (data.YClose>0) increase=(data.Close-data.YClose)/data.YClose*100;\\r\\n        if (isTickPeriod)\\r\\n        {\\r\\n            var strText=\\r\\n                \\\"<span class='tooltip-title'>\\\"+strDate+\\\"&nbsp&nbsp\\\"+title2+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Price',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(data.Open,data.YClose)+\\\";'>\\\"+data.Open.toFixed(defaultfloatPrecision)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Increase',this.LanguageID)+\\\"</span>\\\"+\\r\\n                (increase==null? \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(0,0)+\\\";'>\\\"+'--'+\\\"</span><br/>\\\" :\\r\\n                    \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(increase,0)+\\\";'>\\\"+increase.toFixed(2)+'%'+\\\"</span><br/>\\\");\\r\\n\\r\\n            this.LineCount=4;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var vol=data.Vol;\\r\\n            if (upperSymbol && MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol)) vol/=100; //A股统一转成手\\r\\n            var strText=\\r\\n                \\\"<span class='tooltip-title'>\\\"+strDate+\\\"&nbsp&nbsp\\\"+title2+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Open',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(data.Open,data.YClose)+\\\";'>\\\"+data.Open.toFixed(defaultfloatPrecision)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-High',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(data.High,data.YClose)+\\\";'>\\\"+data.High.toFixed(defaultfloatPrecision)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Low',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(data.Low,data.YClose)+\\\";'>\\\"+data.Low.toFixed(defaultfloatPrecision)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Close',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(data.Close,data.YClose)+\\\";'>\\\"+data.Close.toFixed(defaultfloatPrecision)+\\\"</span><br/>\\\"+\\r\\n                //\\\"<span style='color:\\\"+this.YClose+\\\";font:微软雅黑;font-size:12px'>&nbsp;前收: \\\"+IFrameSplitOperator.FormatValueString(data.YClose,2)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Vol',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.VolColor+\\\";'>\\\"+IFrameSplitOperator.FormatValueString(vol,2,this.LanguageID)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Amount',this.LanguageID)+\\\"</span>\\\"+\\r\\n                \\\"<span class='tooltip-num' style='color:\\\"+this.AmountColor+\\\";'>\\\"+IFrameSplitOperator.FormatValueString(data.Amount,2,this.LanguageID)+\\\"</span><br/>\\\"+\\r\\n                \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Increase',this.LanguageID)+\\\"</span>\\\"+\\r\\n                (increase==null? \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(0,0)+\\\";'>\\\"+'--'+\\\"</span><br/>\\\" :\\r\\n                    \\\"<span class='tooltip-num' style='color:\\\"+this.GetColor(increase,0)+\\\";'>\\\"+increase.toFixed(2)+'%'+\\\"</span><br/>\\\");\\r\\n\\r\\n            this.LineCount=8;\\r\\n\\r\\n            if(MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol) && data.FlowCapital>0)  //换手率\\r\\n            {\\r\\n                var value=data.Vol/data.FlowCapital*100;\\r\\n                strText+= \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Exchange',this.LanguageID)+\\\"</span>\\\" +\\r\\n                    \\\"<span class='tooltip-num' style='color:\\\"+this.TurnoverRateColor+\\\";'>\\\"+value.toFixed(2)+'%'+\\\"</span><br/>\\\";\\r\\n                ++this.LineCount;\\r\\n            }\\r\\n\\r\\n            if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol) && IFrameSplitOperator.IsNumber(data.Position))\\r\\n            {\\r\\n                strText+= \\\"<span class='tooltip-con'>\\\"+g_JSChartLocalization.GetText('DivTooltip-Position',this.LanguageID)+\\\"</span>\\\" +\\r\\n                    \\\"<span class='tooltip-num' style='color:\\\"+this.PositionColor+\\\";'>\\\"+data.Position+\\\"</span><br/>\\\";\\r\\n                ++this.LineCount;\\r\\n            }\\r\\n\\r\\n            //叠加股票\\r\\n            if (this.Value.ChartPaint.Name==\\\"Overlay-KLine\\\")\\r\\n            {\\r\\n                var title=\\\"<span style='color:rgb(0,0,0);font:微软雅黑;font-size:12px;text-align:center;display: block;'>\\\"+this.Value.ChartPaint.Title+\\\"</span>\\\";\\r\\n                strText=title+strText;\\r\\n                ++this.LineCount;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Text=strText;\\r\\n\\r\\n        this.Height=this.LineCount*this.LineHeight;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.GetColor=function(price,yclse)\\r\\n    {\\r\\n        if(price>yclse) return this.UpColor;\\r\\n        else if (price<yclse) return this.DownColor;\\r\\n        else return this.UnchagneColor;\\r\\n    }\\r\\n}\\r\\n\\r\\n//K线信息地雷提示信息格式\\r\\nfunction KLineInfoDataStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.UpColor=g_JSChartResource.UpTextColor;\\r\\n    this.DownColor=g_JSChartResource.DownTextColor;\\r\\n    this.UnchagneColor=g_JSChartResource.UnchagneTextColor;\\r\\n    this.Width=500;\\r\\n\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        if (!this.Value) return false;\\r\\n\\r\\n        var infoList=this.Value.Data.Data;  //数据\\r\\n        var infoType=this.Value.Data.Type;  //类型\\r\\n        var strText='';\\r\\n\\r\\n        for(var i in infoList)\\r\\n        {\\r\\n            var item=infoList[i];\\r\\n            var tempText='';\\r\\n            switch(infoType)\\r\\n            {\\r\\n                case KLINE_INFO_TYPE.BLOCKTRADING:\\r\\n                    tempText=this.BlockTradingFormat(item);\\r\\n                    break;\\r\\n                case KLINE_INFO_TYPE.TRADEDETAIL:\\r\\n                    tempText=this.TradeDetailFormat(item);\\r\\n                    break;\\r\\n                case KLINE_INFO_TYPE.RESEARCH:\\r\\n                    tempText=this.ResearchFormat(item);\\r\\n                    break;\\r\\n                case KLINE_INFO_TYPE.PFORECAST:\\r\\n                    tempText=this.PerformanceForecastFormat(item);\\r\\n                    break;\\r\\n                default:\\r\\n                    tempText=this.DefaultFormat(item);\\r\\n                    break;\\r\\n            }\\r\\n\\r\\n            strText+=tempText;\\r\\n        }\\r\\n\\r\\n        var html=\\\"<div class='title-length'>\\\"+strText+\\\"</div>\\\";\\r\\n\\r\\n        if(infoList.length > 8)\\r\\n        {\\r\\n            var strBox=\\\"<div class='total-list'>共\\\"+infoList.length+\\\"条</div>\\\";\\r\\n            html+=strBox;\\r\\n        }\\r\\n\\r\\n        this.Text=html;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.DefaultFormat=function(item)\\r\\n    {\\r\\n        var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n        var strText=\\\"<span>\\\"+strDate+\\\"&nbsp;&nbsp;&nbsp;\\\"+item.Title+\\\"</span>\\\";\\r\\n        return strText;\\r\\n    }\\r\\n\\r\\n    //大宗交易\\r\\n    this.BlockTradingFormat=function(item)\\r\\n    {\\r\\n        var showPriceInfo = item.ExtendData;\\r\\n        var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n        var strText=\\\"<span><i class='date-tipbox'>\\\"+strDate+\\\"</i>&nbsp;&nbsp;<i class='tipBoxTitle'>成交价:&nbsp;\\\"+showPriceInfo.Price.toFixed(2)+\\\"</i><i class='tipBoxTitle'>收盘价:&nbsp;\\\"+showPriceInfo.ClosePrice.toFixed(2)+\\r\\n            \\\"</i><br/><i class='rate-discount tipBoxTitle'>溢折价率:&nbsp;<strong style='color:\\\"+ this.GetColor(showPriceInfo.Premium.toFixed(2))+\\\"'>\\\"+\\r\\n            showPriceInfo.Premium.toFixed(2)+\\\"%</strong></i><i class='tipBoxTitle'>成交量(万股):&nbsp;\\\"+showPriceInfo.Vol.toFixed(2)+\\\"</i></span>\\\";\\r\\n\\r\\n        return strText;\\r\\n    }\\r\\n\\r\\n    //龙虎榜\\r\\n    this.TradeDetailFormat=function(item)\\r\\n    {\\r\\n        /*var detail=\\r\\n            [\\r\\n                \\\"日价格涨幅偏离值达到9.89%\\\",\\r\\n                \\\"日价格涨幅偏离值达格涨幅偏离值达格涨幅偏离值达到9.89%\\\"\\r\\n            ]\\r\\n        */\\r\\n\\r\\n        var detail=item.ExtendData.Detail;\\r\\n        //格式：日期 上榜原因:  detail[0].TypeExplain\\r\\n        //                    detail[1].TypeExplain\\r\\n        //      一周后涨幅: xx 四周后涨幅: xx\\r\\n        var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n        var reasons = [];\\r\\n        for(var i in detail)\\r\\n        {\\r\\n            reasons += \\\"<i>\\\"+detail[i].TypeExplain+\\\"</i><br/>\\\"\\r\\n            // reasons += detail[i] + \\\"<br/>\\\"\\r\\n        }\\r\\n\\r\\n        var strText= \\\"<span><i class='trade-time'>\\\"+strDate+\\\"&nbsp;&nbsp;&nbsp;上榜原因:&nbsp;&nbsp;</i><i class='reason-list'>\\\"+reasons+\\\"</i><br/><i class='trade-detall'>一周后涨幅:&nbsp;<strong style='color:\\\"+\\r\\n            this.GetColor(item.ExtendData.FWeek.Week1.toFixed(2))+\\\"'>\\\"+ item.ExtendData.FWeek.Week1.toFixed(2)+\\r\\n            \\\"%</strong>&nbsp;&nbsp;&nbsp;四周后涨幅:&nbsp;<strong style='color:\\\"+this.GetColor(item.ExtendData.FWeek.Week4.toFixed(2))+\\\";'>\\\"+\\r\\n            item.ExtendData.FWeek.Week4.toFixed(2)+\\\"%</strong></i></span>\\\";\\r\\n\\r\\n        return strText;\\r\\n    }\\r\\n\\r\\n    //调研\\r\\n    this.ResearchFormat=function(item)\\r\\n    {\\r\\n        var levels=item.ExtendData.Level;\\r\\n        var recPerson='';\\r\\n        if(levels.length==0)\\r\\n        {\\r\\n            recPerson = \\\"<i>一般调研</i>\\\"\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var j in levels)\\r\\n            {\\r\\n                if(levels[j]==0) recPerson+=\\\"<i style='color:#00a0e9'>证券代表&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                else if(levels[j]==1) recPerson+=\\\"<i>董秘&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                else if(levels[j]==2) recPerson+=\\\"<i style='color:#00a0e9'>总经理&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                else if(levels[j]==3) recPerson+=\\\"<i style='color:#00a0e9'>董事长&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n            }\\r\\n\\r\\n            recPerson='接待:&nbsp;&nbsp;&nbsp;'+recPerson;\\r\\n        }\\r\\n\\r\\n        var researchType='';\\r\\n        if (item.ExtendData.Type && item.ExtendData.Type!='其他')\\r\\n        {\\r\\n            researchType='&nbsp;&nbsp;&nbsp;'+'<i>'+item.ExtendData.Type+'</i>';\\r\\n            if (levels.length==0) recPerson='';\\r\\n        }\\r\\n\\r\\n        var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n        var strText=\\\"<span>\\\"+strDate+\\\"&nbsp;&nbsp;&nbsp;\\\"+researchType+recPerson+\\\"</span>\\\";\\r\\n        return strText;\\r\\n    }\\r\\n\\r\\n    //业绩预测\\r\\n    this.PerformanceForecastFormat=function(item)\\r\\n    {\\r\\n        var reportDate=item.ExtendData.ReportDate;\\r\\n        var year=parseInt(reportDate/10000);  //年份\\r\\n        var day=reportDate%10000;   //比较 这个去掉年份的日期\\r\\n        var reportType;\\r\\n        if(day == 1231){\\r\\n            reportType = \\\"年报\\\"\\r\\n        }else if(day == 331){\\r\\n            reportType = \\\"一季度报\\\"\\r\\n        }else if(day == 630){\\r\\n            reportType = \\\"半年度报\\\"\\r\\n        }else if(day == 930){\\r\\n            reportType = \\\"三季度报\\\"\\r\\n        }\\r\\n\\r\\n        var weekData=\\\"\\\";\\r\\n        if (item.ExtendData.FWeek)\\r\\n        {\\r\\n            if (item.ExtendData.FWeek.Week1!=null) weekData+=\\\"一周后涨幅:<i class='increase' style='color:\\\"+this.GetColor(item.ExtendData.FWeek.Week1.toFixed(2))+\\\"'>\\\"+ item.ExtendData.FWeek.Week1.toFixed(2)+\\\"%</i>\\\";\\r\\n            if (item.ExtendData.FWeek.Week4!=null) weekData+=\\\"&nbsp;四周后涨幅:<i class='increase' style='color:\\\"+this.GetColor(item.ExtendData.FWeek.Week4.toFixed(2))+\\\"'>\\\"+ item.ExtendData.FWeek.Week4.toFixed(2)+\\\"%</i>\\\";\\r\\n            if (weekData.length>0) weekData=\\\"<br/>&nbsp;&nbsp;<i class='prorecast-week'>\\\"+weekData+\\\"</i>\\\";\\r\\n        }\\r\\n        var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n        var strText=\\\"<span>\\\"+strDate+\\\"&nbsp;&nbsp;\\\"+year+reportType+item.Title+\\\"&nbsp;\\\"+weekData+\\\"</span>\\\";\\r\\n        return strText;\\r\\n    }\\r\\n\\r\\n    this.GetColor=function(price)\\r\\n    {\\r\\n        if(price>0) return this.UpColor;\\r\\n        else if (price<0) return this.DownColor;\\r\\n        else return this.UnchagneColor;\\r\\n    }\\r\\n}\\r\\n\\r\\n//交易信息提示信息格式\\r\\nfunction KLineTradeDataStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Width=120;\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        var data=this.Value.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var item=data.Data;\\r\\n        var title=`<span class='tooltip-index-name'>${item.Name}${item.Param}:</span>`;\\r\\n        var content;\\r\\n        if (item.Type==1) content=`<span class='tooltip-index-buy'>买入</span>`;\\r\\n        else content=`<span class='tooltip-index-sell'>卖出</span>`;\\r\\n\\r\\n        this.Text=title+content;\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n//分时图异动信息格式化\\r\\nfunction MinuteInfoDataStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Width=200;\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        var data=this.Value.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var item=data.Data.Item;\\r\\n        var strTime=IFrameSplitOperator.FormatTimeString(item.Time);\\r\\n        var time=`<span class='tooltip-minuteinfo-time'>${strTime} </span>`;\\r\\n        var content=`<span class='tooltip-minuteinfo-content'>${item.Title}</span>`;\\r\\n        if (item.Content) content=`<span class='tooltip-minuteinfo-content'>${item.Content}</span>`;\\r\\n\\r\\n        this.Text=time+content;\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction IconDataStringFormat()\\r\\n{\\r\\n    this.newMethod=IChangeStringFormat;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Width=200;\\r\\n    this.Operator=function()\\r\\n    {\\r\\n        if (!this.Value || !this.Value.Data) return false;\\r\\n        var data=this.Value.Data;\\r\\n        if (!data.Item) return false;\\r\\n        if (!data.Item.Text) return false;\\r\\n\\r\\n        this.Text=data.Item.Text;\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction DivTooltipDataForamt()\\r\\n{\\r\\n    this.DataMap=new Map(\\r\\n        [\\r\\n            [\\\"KLineTradeDataStringFormat\\\",      { Create:function() { return new KLineTradeDataStringFormat(); }  }],\\r\\n            [\\\"MinuteInfoDataStringFormat\\\",      { Create:function() { return new MinuteInfoDataStringFormat(); }  }],\\r\\n            [\\\"HistoryDataStringFormat\\\",         { Create:function() { return new HistoryDataStringFormat(); }  }],\\r\\n            [\\\"KLineInfoDataStringFormat\\\",       { Create:function() { return new KLineInfoDataStringFormat(); }  }],\\r\\n            [\\\"IconDataStringFormat\\\",            { Create:function() { return new IconDataStringFormat(); } }],\\r\\n\\r\\n            [\\\"CorssCursor_XStringFormat\\\", { Create:function() { return new HQDateStringFormat(); } }],\\r\\n            [\\\"CorssCursor_YStringFormat\\\", { Create:function() { return new HQPriceStringFormat(); } }]\\r\\n        ]\\r\\n    );\\r\\n\\r\\n    this.Create=function(name)\\r\\n    {\\r\\n        if (!this.DataMap.has(name)) return null;\\r\\n\\r\\n        var item=this.DataMap.get(name);\\r\\n        return item.Create();\\r\\n    }\\r\\n}\\r\\n\\r\\nvar g_DivTooltipDataForamt=new DivTooltipDataForamt();\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//                      标题\\r\\n//\\r\\n//\\r\\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n\\r\\nfunction IChartTitlePainting()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.Data=new Array();\\r\\n    this.Canvas;                        //画布\\r\\n    this.IsDynamic=false;               //是否是动态标题\\r\\n    this.Position=0;                    //标题显示位置 0 框架里的标题  1 框架上面\\r\\n    this.CursorIndex;                   //数据索引\\r\\n    this.Font=g_JSChartResource.TitleFont;\\r\\n    this.Title;                         //固定标题(可以为空)\\r\\n    this.TitleColor=g_JSChartResource.DefaultTextColor;\\r\\n    this.ClassName='IChartTitlePainting';\\r\\n    this.DrawStatus;\\r\\n    this.GetEventCallback;\\r\\n\\r\\n    this.ReloadResource=function()\\r\\n    {\\r\\n        this.Font=g_JSChartResource.TitleFont;\\r\\n        this.TitleColor=g_JSChartResource.DefaultTextColor;\\r\\n    }\\r\\n}\\r\\n\\r\\n//var PERIOD_NAME=[\\\"日线\\\",\\\"周线\\\",\\\"月线\\\",\\\"年线\\\",\\\"1分\\\",\\\"5分\\\",\\\"15分\\\",\\\"30分\\\",\\\"60分\\\",\\\"季线\\\",\\\"分笔\\\", \\\"2小时\\\",\\\"4小时\\\",\\\"双周\\\",\\\"\\\",\\\"\\\"];\\r\\nvar RIGHT_NAME=['不复权','前复权','后复权'];\\r\\n\\r\\nfunction DynamicKLineTitlePainting()\\r\\n{\\r\\n    this.newMethod=IChartTitlePainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='DynamicKLineTitlePainting';\\r\\n    this.IsDynamic=true;\\r\\n    this.IsShow=true;       //是否显示\\r\\n    this.Period;            //周期\\r\\n\\r\\n    this.UpColor=g_JSChartResource.UpTextColor;\\r\\n    this.DownColor=g_JSChartResource.DownTextColor;\\r\\n    this.UnchagneColor=g_JSChartResource.UnchagneTextColor;\\r\\n\\r\\n    this.VolColor=g_JSChartResource.Title.VolColor;\\r\\n    this.AmountColor=g_JSChartResource.Title.AmountColor;\\r\\n    this.DateTimeColor=g_JSChartResource.Title.DateTimeColor;\\r\\n    this.NameColor = g_JSChartResource.Title.NameColor;\\r\\n    this.SettingColor=g_JSChartResource.Title.SettingColor;   //周期 复权\\r\\n    this.TurnoverRateColor=g_JSChartResource.Title.TurnoverRateColor;   //换手率\\r\\n    this.PositionColor=g_JSChartResource.Title.PositionColor;   //持仓\\r\\n\\r\\n    this.Symbol;\\r\\n    this.Name;\\r\\n\\r\\n    this.SpaceWidth=2*GetDevicePixelRatio(); //获取设备的分辨率;\\r\\n    this.OverlayChartPaint;         //叠加画法\\r\\n\\r\\n    this.IsShowName=true;           //是否显示股票名称\\r\\n    this.IsShowSettingInfo=true;    //是否显示设置信息(周期 复权)\\r\\n    this.IsShowDateTime=true;       //是否显示日期\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.OnDrawEvent;\\r\\n\\r\\n    this.ReloadResource=function()\\r\\n    {\\r\\n        this.Font=g_JSChartResource.TitleFont;\\r\\n\\r\\n        this.TitleColor=g_JSChartResource.DefaultTextColor;\\r\\n\\r\\n        this.UpColor=g_JSChartResource.UpTextColor;\\r\\n        this.DownColor=g_JSChartResource.DownTextColor;\\r\\n        this.UnchagneColor=g_JSChartResource.UnchagneTextColor;\\r\\n\\r\\n        this.VolColor=g_JSChartResource.Title.VolColor;\\r\\n        this.AmountColor=g_JSChartResource.Title.AmountColor;\\r\\n        this.DateTimeColor=g_JSChartResource.Title.DateTimeColor;\\r\\n        this.NameColor = g_JSChartResource.Title.NameColor;\\r\\n        this.SettingColor=g_JSChartResource.Title.SettingColor;\\r\\n        this.TurnoverRateColor=g_JSChartResource.Title.TurnoverRateColor;   //换手率\\r\\n        this.PositionColor=g_JSChartResource.Title.PositionColor;   //持仓\\r\\n    }\\r\\n\\r\\n    this.GetCurrentKLineData=function() //获取当天鼠标位置所在的K线数据\\r\\n    {\\r\\n        if (this.CursorIndex==null || !this.Data) return null;\\r\\n        if (this.Data.length<=0) return null;\\r\\n\\r\\n        var index=this.CursorIndex;\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var dataIndex=this.Data.DataOffset+index;\\r\\n        if (dataIndex>=this.Data.Data.length) dataIndex=this.Data.Data.length-1;\\r\\n        if (dataIndex<0) return null;\\r\\n\\r\\n        var item=this.Data.Data[dataIndex];\\r\\n        return item;\\r\\n    }\\r\\n\\r\\n    this.DrawItem=function(item)\\r\\n    {\\r\\n        var isHScreen=this.Frame.IsHScreen===true;\\r\\n        var left=this.Frame.ChartBorder.GetLeft();\\r\\n        var bottom=this.Frame.ChartBorder.GetTop()-this.Frame.ChartBorder.Top/2;\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);//价格小数位数\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            if (this.Frame.ChartBorder.Right<5) return;\\r\\n            var left=2;\\r\\n            var bottom=this.Frame.ChartBorder.Right/2;    //上下居中显示\\r\\n            var right=this.Frame.ChartBorder.GetHeight();\\r\\n            var xText=this.Frame.ChartBorder.GetChartWidth();\\r\\n            var yText=this.Frame.ChartBorder.GetTop();\\r\\n            this.Canvas.translate(xText, yText);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.Frame.ChartBorder.Top<5*GetDevicePixelRatio()) return;\\r\\n        }\\r\\n\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        var position = { Left: left, Bottom: bottom, IsHScreen: isHScreen };\\r\\n\\r\\n        if (this.IsShowName)\\r\\n        {\\r\\n            if (!this.DrawText(this.Name,this.NameColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (this.IsShowSettingInfo)\\r\\n        {\\r\\n            var periodName='';\\r\\n            if (this.Data.Period>CUSTOM_MINUTE_PERIOD_START && this.Data.Period<=CUSTOM_MINUTE_PERIOD_END)\\r\\n                periodName=(this.Data.Period-CUSTOM_MINUTE_PERIOD_START)+g_JSChartLocalization.GetText('自定义分钟',this.LanguageID);\\r\\n            else if (this.Data.Period>CUSTOM_DAY_PERIOD_START && this.Data.Period<=CUSTOM_DAY_PERIOD_END)\\r\\n                periodName=(this.Data.Period-CUSTOM_DAY_PERIOD_START)+g_JSChartLocalization.GetText('自定义日线',this.LanguageID);\\r\\n            else if (this.Data.Period>CUSTOM_SECOND_PERIOD_START && this.Data.Period<=CUSTOM_SECOND_PERIOD_END)\\r\\n                periodName=(this.Data.Period-CUSTOM_SECOND_PERIOD_START)+g_JSChartLocalization.GetText('自定义秒',this.LanguageID);\\r\\n            else\\r\\n                periodName=g_JSChartLocalization.GetText(ChartData.GetPeriodName(this.Data.Period),this.LanguageID);\\r\\n            var rightName=g_JSChartLocalization.GetText(RIGHT_NAME[this.Data.Right],this.LanguageID);\\r\\n            var text=\\\"(\\\"+periodName+\\\" \\\"+rightName+\\\")\\\";\\r\\n\\r\\n            if (!MARKET_SUFFIX_NAME.IsEnableRight(this.Data.Period, this.Symbol)) text=\\\"(\\\"+periodName+\\\")\\\";\\r\\n            if (!this.DrawText(text,this.SettingColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (this.IsShowDateTime)    //是否显示日期\\r\\n        {\\r\\n            var text=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n            if (!this.DrawText(text,this.DateTimeColor,position)) return;\\r\\n        }\\r\\n\\r\\n        var isTickPeriod=ChartData.IsTickPeriod(this.Period);\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(this.Period,true) && IFrameSplitOperator.IsNumber(item.Time))\\r\\n        {\\r\\n            var text=IFrameSplitOperator.FormatTimeString(item.Time);\\r\\n            if (!this.DrawText(text,this.DateTimeColor,position)) return;\\r\\n        }\\r\\n        else if (ChartData.IsSecondPeriod(this.Period) && IFrameSplitOperator.IsNumber(item.Time))\\r\\n        {\\r\\n            var text=IFrameSplitOperator.FormatTimeString(item.Time, \\\"HH:MM:SS\\\");\\r\\n            if (!this.DrawText(text,this.DateTimeColor,position)) return;\\r\\n        }\\r\\n        else if (isTickPeriod)\\r\\n        {\\r\\n            var text=IFrameSplitOperator.FormatTimeString(item.Time, \\\"HH:MM:SS\\\");\\r\\n            if (!this.DrawText(text,this.DateTimeColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (isTickPeriod)\\r\\n        {\\r\\n            var color=this.GetColor(item.Open,item.YClose);\\r\\n            var text=g_JSChartLocalization.GetText('KTitle-Price',this.LanguageID)+item.Open.toFixed(defaultfloatPrecision);\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n\\r\\n            if (item.YClose>0)\\r\\n            {\\r\\n                var value=(item.Close-item.YClose)/item.YClose*100;\\r\\n                var color = this.GetColor(value, 0);\\r\\n                var text = g_JSChartLocalization.GetText('KTitle-Increase',this.LanguageID) + value.toFixed(2)+'%';\\r\\n                if (!this.DrawText(text,color,position)) return;\\r\\n            }\\r\\n\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var color=this.GetColor(item.Open,item.YClose);\\r\\n        var text=g_JSChartLocalization.GetText('KTitle-Open',this.LanguageID)+item.Open.toFixed(defaultfloatPrecision);\\r\\n        if (!this.DrawText(text,color,position)) return;\\r\\n\\r\\n        var color=this.GetColor(item.High,item.YClose);\\r\\n        var text=g_JSChartLocalization.GetText('KTitle-High',this.LanguageID)+item.High.toFixed(defaultfloatPrecision);\\r\\n        if (!this.DrawText(text,color,position)) return;\\r\\n\\r\\n        var color=this.GetColor(item.Low,item.YClose);\\r\\n        var text=g_JSChartLocalization.GetText('KTitle-Low',this.LanguageID)+item.Low.toFixed(defaultfloatPrecision);\\r\\n        if (!this.DrawText(text,color,position)) return;\\r\\n\\r\\n        var color=this.GetColor(item.Close,item.YClose);\\r\\n        var text=g_JSChartLocalization.GetText('KTitle-Close',this.LanguageID)+item.Close.toFixed(defaultfloatPrecision);\\r\\n        if (!this.DrawText(text,color,position)) return;\\r\\n\\r\\n        if (item.YFClose>0 && MARKET_SUFFIX_NAME.IsChinaFutures(upperSymbol))\\r\\n        {\\r\\n            var value=(item.Close-item.YFClose)/item.YFClose*100;\\r\\n            var color = this.GetColor(value, 0);\\r\\n            var text = g_JSChartLocalization.GetText('KTitle-Increase',this.LanguageID) + value.toFixed(2)+'%';\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n        else if (item.YClose>0)\\r\\n        {\\r\\n            var value=(item.Close-item.YClose)/item.YClose*100;\\r\\n            var color = this.GetColor(value, 0);\\r\\n            var text = g_JSChartLocalization.GetText('KTitle-Increase',this.LanguageID) + value.toFixed(2)+'%';\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n\\r\\n        var vol=item.Vol;\\r\\n        if (upperSymbol && MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol)) vol/=100;   //A股原始单位股, 转成股\\r\\n        var text=g_JSChartLocalization.GetText('KTitle-Vol',this.LanguageID)+IFrameSplitOperator.FromatIntegerString(vol,2,this.LanguageID);\\r\\n        if (!this.DrawText(text,this.VolColor,position)) return;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(item.Amount))\\r\\n        {\\r\\n            var text=g_JSChartLocalization.GetText('KTitle-Amount',this.LanguageID)+IFrameSplitOperator.FormatValueString(item.Amount,2,this.LanguageID);\\r\\n            if (!this.DrawText(text,this.AmountColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol) && item.FlowCapital>0)   //A股有换手率\\r\\n        {\\r\\n            var value=item.Vol/item.FlowCapital*100;    //成交量/流通A股*100\\r\\n            var text=g_JSChartLocalization.GetText('KTitle-Exchange',this.LanguageID)+IFrameSplitOperator.FormatValueString(value,2,this.LanguageID)+'%';\\r\\n            if (!this.DrawText(text,this.TurnoverRateColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol) && IFrameSplitOperator.IsNumber(item.Position))  //持仓量\\r\\n        {\\r\\n            var text=g_JSChartLocalization.GetText('KTitle-Position',this.LanguageID)+item.Position;\\r\\n            if (!this.DrawText(text,this.PositionColor,position)) return;\\r\\n        }\\r\\n\\r\\n        //叠加股票的名字\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.Symbol || !item.Title) continue;\\r\\n\\r\\n            var name=item.Title;\\r\\n            var clrText=item.Color;\\r\\n            var text='['+name+']';\\r\\n            if (!this.DrawText(text,clrText,position)) return;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (!this.IsShow) return;\\r\\n        if (this.CursorIndex==null || !this.Data || this.Data.length<=0)\\r\\n        {\\r\\n            this.OnDrawEventCallback(null);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.SpaceWidth = this.Canvas.measureText('0').width;\\r\\n\\r\\n        var index=this.CursorIndex;\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var dataIndex=this.Data.DataOffset+index;\\r\\n        if (dataIndex>=this.Data.Data.length) dataIndex=this.Data.Data.length-1;\\r\\n        if (dataIndex<0)\\r\\n        {\\r\\n            this.OnDrawEventCallback(null);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var item=this.Data.Data[dataIndex];\\r\\n        this.OnDrawEventCallback(item);\\r\\n        this.Canvas.save();\\r\\n        this.DrawItem(item);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.OnDrawEventCallback=function(drawData)\\r\\n    {\\r\\n        if (!this.OnDrawEvent || !this.OnDrawEvent.Callback) return;\\r\\n        var data={ Draw: drawData, Name:this.ClassName};\\r\\n        if (this.Data && this.Data.Data)\\r\\n        {\\r\\n            var index=Math.abs(this.CursorIndex);\\r\\n            index=parseInt(index.toFixed(0));\\r\\n            var dataIndex=this.Data.DataOffset+index;\\r\\n            var dataCount=this.Data.Data.length;\\r\\n\\r\\n            data.DataIndex=dataIndex;\\r\\n            data.DataCount=dataCount;\\r\\n        }\\r\\n\\r\\n        //叠加股票\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint))\\r\\n        {\\r\\n            data.OverlayStock=[];\\r\\n            for(var i=0; i<this.OverlayChartPaint.length; ++i)\\r\\n            {\\r\\n                var item=this.OverlayChartPaint[i];\\r\\n                if (!item.Symbol || !item.Title) continue;\\r\\n\\r\\n                data.OverlayStock.push({ Symbol:item.Symbol, Name:item.Title });\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        this.OnDrawEvent.Callback(this.OnDrawEvent,data,this);\\r\\n    }\\r\\n\\r\\n    this.GetColor=function(price,yclse)\\r\\n    {\\r\\n        if(price>yclse) return this.UpColor;\\r\\n        else if (price<yclse) return this.DownColor;\\r\\n        else return this.UnchagneColor;\\r\\n    }\\r\\n\\r\\n    this.DrawText=function(title,color,position)\\r\\n    {\\r\\n        if (!title) return true;\\r\\n\\r\\n        var isHScreen=this.Frame.IsHScreen===true;\\r\\n        var right = this.Frame.ChartBorder.GetRight();\\r\\n        if (isHScreen) right=this.Frame.ChartBorder.GetHeight();\\r\\n\\r\\n        this.Canvas.fillStyle = color;\\r\\n        var textWidth = this.Canvas.measureText(title).width;\\r\\n        if (position.Left + textWidth > right) return false;\\r\\n        this.Canvas.fillText(title, position.Left, position.Bottom, textWidth);\\r\\n\\r\\n        position.Left += textWidth + this.SpaceWidth;\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\nfunction DynamicMinuteTitlePainting()\\r\\n{\\r\\n    this.newMethod=DynamicKLineTitlePainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='DynamicMinuteTitlePainting';\\r\\n\\r\\n    this.SpaceWidth=1*GetDevicePixelRatio();\\r\\n    this.YClose;\\r\\n    this.IsShowDate=false;  //标题是否显示日期\\r\\n    this.IsShowTime=true;   //标题是否显示时间\\r\\n    this.IsShowName=true;   //标题是否显示股票名字\\r\\n    this.IsShowAveragePrice=true;   //是否显示均线价格\\r\\n    this.OverlayChartPaint; //叠加画法\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.LastShowData;  //保存最后显示的数据 给tooltip用\\r\\n    this.OnDrawEvent;\\r\\n    this.PointInfo=null;\\r\\n\\r\\n    this.MultiDayBeforeOpenData;    //多日分时图 盘前数据\\r\\n    this.MultiDayAfterCloseData;    //多日分时图 收盘数据\\r\\n\\r\\n    this.GetCurrentKLineData=function() //获取当天鼠标位置所在的K线数据\\r\\n    {\\r\\n        if (this.LastShowData) return this.LastShowData;\\r\\n\\r\\n        if (this.CursorIndex==null || !this.Data) return null;\\r\\n        if (this.Data.length<=0) return null;\\r\\n\\r\\n        var index=Math.abs(this.CursorIndex);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var dataIndex=this.Data.DataOffset+index;\\r\\n        if (dataIndex>=this.Data.Data.length) dataIndex=this.Data.Data.length-1;\\r\\n        if (dataIndex<0) return null;\\r\\n\\r\\n        var item=this.Data.Data[dataIndex];\\r\\n        return item;\\r\\n    }\\r\\n\\r\\n    this.GetLatestKLineData=function()  //获取最新一个K线数据\\r\\n    {\\r\\n        if (!this.Data || !this.Data.Data) return null;\\r\\n        var count=this.Data.Data.length;\\r\\n        if (count<=0) return null;\\r\\n\\r\\n        return this.Data.Data[count-1];\\r\\n    }\\r\\n\\r\\n    this.DrawItem=function(item)\\r\\n    {\\r\\n        var isHScreen=this.Frame.IsHScreen===true;\\r\\n        var border=this.Frame.GetBorder();\\r\\n        var left=border.Left;\\r\\n        var bottom=border.Top-this.Frame.ChartBorder.Top/2;\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);//价格小数位数\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            if (this.Frame.ChartBorder.Right<5) return;\\r\\n            var left=2;\\r\\n            var bottom=this.Frame.ChartBorder.Right/2;    //上下居中显示\\r\\n            var xText=border.ChartWidth;\\r\\n            var yText=border.Top;\\r\\n            this.Canvas.translate(xText, yText);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.Frame.ChartBorder.Top<5) return;\\r\\n        }\\r\\n\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        var position = { Left: left, Bottom: bottom, IsHScreen: isHScreen };\\r\\n        if(this.IsShowName)\\r\\n        {\\r\\n            if (!this.DrawText(this.Name,this.NameColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (this.IsShowDate || this.IsShowTime)\\r\\n        {\\r\\n            var text=IFrameSplitOperator.FormatDateTimeString(item.DateTime,this.IsShowDate, this.IsShowTime);\\r\\n            if (!this.DrawText(text,this.DateTimeColor,position)) return;\\r\\n        }\\r\\n\\r\\n        var close=item.Close;\\r\\n        var increase=item.Increase;\\r\\n        var vol=item.Vol;\\r\\n        var amount=item.Amount;\\r\\n        if (item.Before)    //读取盘前数据\\r\\n        {\\r\\n            close=item.Before.Close;\\r\\n            increase=item.Before.Increase;\\r\\n            vol=item.Before.Vol;\\r\\n            amount=item.Before.Amount;\\r\\n        }\\r\\n\\r\\n        if (close)\\r\\n        {\\r\\n            var color=this.GetColor(close,this.YClose);\\r\\n            var text=g_JSChartLocalization.GetText('MTitle-Close',this.LanguageID)+close.toFixed(defaultfloatPrecision);\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n\\r\\n        if (increase!=null)\\r\\n        {\\r\\n            var color=this.GetColor(increase,0);\\r\\n            var text=g_JSChartLocalization.GetText('MTitle-Increase',this.LanguageID)+increase.toFixed(2)+'%';\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n\\r\\n        var isShowAvPrice=true;\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        if (MARKET_SUFFIX_NAME.IsET(upperSymbol) && !MARKET_SUFFIX_NAME.IsETShowAvPrice(upperSymbol)) isShowAvPrice=false;\\r\\n        else if (MARKET_SUFFIX_NAME.IsShowAvPrice && !MARKET_SUFFIX_NAME.IsShowAvPrice(upperSymbol)) isShowAvPrice=false;\\r\\n\\r\\n        if (item.AvPrice && isShowAvPrice && this.IsShowAveragePrice)\\r\\n        {\\r\\n            var color=this.GetColor(item.AvPrice,this.YClose);\\r\\n            var text=g_JSChartLocalization.GetText('MTitle-AvPrice',this.LanguageID)+item.AvPrice.toFixed(defaultfloatPrecision);\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n\\r\\n        var text=g_JSChartLocalization.GetText('MTitle-Vol',this.LanguageID)+IFrameSplitOperator.FromatIntegerString(vol,2);\\r\\n        if (!this.DrawText(text,this.VolColor,position)) return;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(amount))\\r\\n        {\\r\\n            var text=g_JSChartLocalization.GetText('MTitle-Amount',this.LanguageID)+IFrameSplitOperator.FormatValueString(amount,2);\\r\\n            if (!this.DrawText(text,this.AmountColor,position)) return;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(item.Position))\\r\\n        {\\r\\n            var text=g_JSChartLocalization.GetText('MTitle-Position',this.LanguageID)+IFrameSplitOperator.FromatIntegerString(item.Position,2);\\r\\n            if (!this.DrawText(text,this.VolColor,position)) return;\\r\\n        }\\r\\n\\r\\n        //叠加股票的名字\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.Symbol || !item.Title) continue;\\r\\n\\r\\n            var name=item.Title;\\r\\n            var clrText=item.Color;\\r\\n            var text='['+name+']';\\r\\n            if (!this.DrawText(text,clrText,position)) return;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawCallAuction=function() //集合竞价标题\\r\\n    {\\r\\n        var isHScreen=this.Frame.IsHScreen===true;\\r\\n        var border=this.Frame.GetBorder();\\r\\n\\r\\n        var left=border.Left;\\r\\n        var bottom=border.Top-this.Frame.ChartBorder.Top/2;\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.Symbol);//价格小数位数\\r\\n        var bDraw=true;\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            var left=2;\\r\\n            var bottom=this.Frame.ChartBorder.Right/2;    //上下居中显示\\r\\n            var xText=border.ChartWidth;\\r\\n            var yText=border.Top;\\r\\n            this.Canvas.translate(xText, yText);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.Frame.ChartBorder.Top<5) bDraw=false;\\r\\n        }\\r\\n\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        var position = { Left: left, Bottom: bottom, IsHScreen: isHScreen };\\r\\n        if(bDraw && this.IsShowName)\\r\\n        {\\r\\n            if (!this.DrawText(this.Name,this.NameColor,position)) return;\\r\\n        }\\r\\n\\r\\n        var strTime;\\r\\n        var dataVersion=1;\\r\\n        if (this.PointInfo.ClientPos==2)\\r\\n        {\\r\\n            if (!this.BeforeOpenData) return;\\r\\n            if (!this.CallAcutionXOperator) return;\\r\\n\\r\\n            this.CallAcutionXOperator.Value=isHScreen?this.PointInfo.Point.Y:this.PointInfo.Point.X;\\r\\n            this.CallAcutionXOperator.Point={X:this.PointInfo.Point.X, Y:this.PointInfo.Point.Y};\\r\\n            this.CallAcutionXOperator.ClientPos=this.PointInfo.ClientPos;\\r\\n            var callbackData={Explain:\\\"BeforeOpen\\\", Data:null, DataIndex:null, DataTotalCount:this.BeforeOpenData.TotalCount };\\r\\n            if (!this.CallAcutionXOperator.Operator())\\r\\n            {\\r\\n                this.OnDrawCallAuctionEventCallback(callbackData);\\r\\n                return false;\\r\\n            }\\r\\n\\r\\n            callbackData.DataIndex=this.CallAcutionXOperator.DataIndex;\\r\\n            var item=this.CallAcutionXOperator.Item;\\r\\n            var time=item.Time;\\r\\n            if (this.BeforeOpenData.Ver==1.0) strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM\\\");\\r\\n            else strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM:SS\\\");\\r\\n\\r\\n            dataVersion=this.BeforeOpenData.Ver;\\r\\n            callbackData.Data=item;\\r\\n        }\\r\\n        else if (this.PointInfo.ClientPos==3)\\r\\n        {\\r\\n            if (!this.AfterCloseData) return;\\r\\n            if (!this.CallAcutionXOperator) return;\\r\\n\\r\\n            this.CallAcutionXOperator.Value=isHScreen?this.PointInfo.Point.Y:this.PointInfo.Point.X;\\r\\n            this.CallAcutionXOperator.Point={X:this.PointInfo.Point.X, Y:this.PointInfo.Point.Y};\\r\\n            this.CallAcutionXOperator.ClientPos=this.PointInfo.ClientPos;\\r\\n            var callbackData={Explain:\\\"AfterClose\\\", Data:null, DataIndex:null, DataTotalCount:this.AfterCloseData.TotalCount };\\r\\n            if (!this.CallAcutionXOperator.Operator())\\r\\n            {\\r\\n                this.OnDrawCallAuctionEventCallback(callbackData);\\r\\n                return false;\\r\\n            }\\r\\n\\r\\n            callbackData.DataIndex=this.CallAcutionXOperator.DataIndex;\\r\\n            var item=this.CallAcutionXOperator.Item;\\r\\n\\r\\n            var time=item.Time;\\r\\n            if (this.AfterCloseData.Ver==1.0) strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM\\\");\\r\\n            else strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM:SS\\\");\\r\\n            dataVersion=this.AfterCloseData.Ver;\\r\\n            callbackData.Data=item;\\r\\n        }\\r\\n        else if (this.PointInfo.ClientPos>=200 && this.PointInfo.ClientPos<=299)\\r\\n        {\\r\\n            if (!this.MultiDayBeforeOpenData || !IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData) ) return;\\r\\n\\r\\n            var x=this.Frame.IsHScreen==true?this.PointInfo.Point.Y:this.PointInfo.Point.X;\\r\\n            this.CallAcutionXOperator.Value=x;\\r\\n            this.CallAcutionXOperator.Point={X:this.PointInfo.Point.X, Y:this.PointInfo.Point.Y};\\r\\n            this.CallAcutionXOperator.ClientPos=this.PointInfo.ClientPos;\\r\\n            var callbackData={Explain:\\\"MultiDayBeforeOpen\\\", Data:null, DataIndex:null };\\r\\n            if (!this.CallAcutionXOperator.Operator())\\r\\n            {\\r\\n                this.OnDrawCallAuctionEventCallback(callbackData);\\r\\n                return false;\\r\\n            }\\r\\n\\r\\n            callbackData.DataIndex=this.CallAcutionXOperator.DataIndex;\\r\\n            callbackData.DayIndex=this.CallAcutionXOperator.DayIndex;\\r\\n            var dayItem=this.MultiDayBeforeOpenData[this.CallAcutionXOperator.DayIndex];\\r\\n            var item=this.CallAcutionXOperator.Item;\\r\\n            var time=item.Time;\\r\\n            if (dayItem.Ver==1.0) strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM\\\");\\r\\n            else strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM:SS\\\");\\r\\n            var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n\\r\\n            strTime=`${strDate} ${strTime}`;\\r\\n\\r\\n            dataVersion=dayItem.Ver;\\r\\n            callbackData.Data=item;\\r\\n        }\\r\\n        else if (this.PointInfo.ClientPos>=300 && this.PointInfo.ClientPos<=399)\\r\\n        {\\r\\n            if (!this.MultiDayAfterCloseData || !IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData) ) return;\\r\\n\\r\\n            var x=this.Frame.IsHScreen==true?this.PointInfo.Point.Y:this.PointInfo.Point.X;\\r\\n            this.CallAcutionXOperator.Value=x;\\r\\n            this.CallAcutionXOperator.Point={X:this.PointInfo.Point.X, Y:this.PointInfo.Point.Y};\\r\\n            this.CallAcutionXOperator.ClientPos=this.PointInfo.ClientPos;\\r\\n            var callbackData={Explain:\\\"MultiDayAfterClose\\\", Data:null, DataIndex:null };\\r\\n            if (!this.CallAcutionXOperator.Operator())\\r\\n            {\\r\\n                this.OnDrawCallAuctionEventCallback(callbackData);\\r\\n                return false;\\r\\n            }\\r\\n\\r\\n            callbackData.DataIndex=this.CallAcutionXOperator.DataIndex;\\r\\n            callbackData.DayIndex=this.CallAcutionXOperator.DayIndex;\\r\\n            var dayItem=this.MultiDayAfterCloseData[this.CallAcutionXOperator.DayIndex];\\r\\n            var item=this.CallAcutionXOperator.Item;\\r\\n            var time=item.Time;\\r\\n            if (dayItem.Ver==1.0) strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM\\\");\\r\\n            else strTime=IFrameSplitOperator.FormatTimeString(time,\\\"HH:MM:SS\\\");\\r\\n            var strDate=IFrameSplitOperator.FormatDateString(item.Date);\\r\\n\\r\\n            strTime=`${strDate} ${strTime}`;\\r\\n\\r\\n            dataVersion=dayItem.Ver;\\r\\n            callbackData.Data=item;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (bDraw && this.IsShowTime && strTime )\\r\\n        {\\r\\n            if (!this.DrawText(strTime,this.DateTimeColor,position)) return;\\r\\n        }\\r\\n\\r\\n        //匹配价\\r\\n        if (bDraw && item && IFrameSplitOperator.IsNumber(item.Price))\\r\\n        {\\r\\n            var color=this.GetColor(item.Price,this.YClose);\\r\\n            var filedName='MTitle-AC-Price';\\r\\n            if (this.BeforeOpenData && this.BeforeOpenData.Ver==1.0) filedName=\\\"MTitle-Close\\\";\\r\\n            var text=g_JSChartLocalization.GetText(filedName,this.LanguageID)+item.Price.toFixed(defaultfloatPrecision);\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n\\r\\n        //竞价涨幅\\r\\n        if (bDraw && item && IFrameSplitOperator.IsPlusNumber(this.YClose) && IFrameSplitOperator.IsNumber(item.Price))\\r\\n        {\\r\\n            var value=(item.Price-this.YClose)/this.YClose*100;\\r\\n            var color=this.GetColor(value,0);\\r\\n            var filedName='MTitle-AC-Increase';\\r\\n            if (this.BeforeOpenData && this.BeforeOpenData.Ver==1.0) filedName=\\\"MTitle-Increase\\\";\\r\\n            var text=g_JSChartLocalization.GetText(filedName,this.LanguageID)+value.toFixed(2)+\\\"%\\\";\\r\\n            if (!this.DrawText(text,color,position)) return;\\r\\n        }\\r\\n\\r\\n        if (dataVersion==3.0)\\r\\n        {\\r\\n            if (bDraw && item && IFrameSplitOperator.IsNumber(item.AvPrice))\\r\\n            {\\r\\n                var color=this.GetColor(item.Price,this.YClose);\\r\\n                var text=g_JSChartLocalization.GetText('MTitle-AC-AvPrice',this.LanguageID)+item.AvPrice.toFixed(defaultfloatPrecision);\\r\\n                if (!this.DrawText(text,color,position)) return;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //匹配量\\r\\n        if (bDraw && IFrameSplitOperator.IsNumber(item.Vol[0]))\\r\\n        {\\r\\n            var filedName='MTitle-AC-Vol';\\r\\n            if (this.BeforeOpenData && this.BeforeOpenData.Ver==1.0) filedName=\\\"MTitle-Vol\\\";\\r\\n            var text=g_JSChartLocalization.GetText(filedName,this.LanguageID)+IFrameSplitOperator.FromatIntegerString(item.Vol[0],2);\\r\\n            if (!this.DrawText(text,this.VolColor,position)) return;\\r\\n        }\\r\\n\\r\\n        //未匹配量\\r\\n        if (bDraw && IFrameSplitOperator.IsNumber(item.Vol[1]))\\r\\n        {\\r\\n            var text=g_JSChartLocalization.GetText('MTitle-AC-NotMatchVol',this.LanguageID)+IFrameSplitOperator.FromatIntegerString(item.Vol[1],2);\\r\\n            if (!this.DrawText(text,this.VolColor,position)) return;\\r\\n        }\\r\\n\\r\\n        this.OnDrawCallAuctionEventCallback(callbackData);\\r\\n    }\\r\\n\\r\\n    this.OnDrawCallAuctionEventCallback=function(drawData)\\r\\n    {\\r\\n        if (!this.OnDrawEvent || !this.OnDrawEvent.Callback) return;\\r\\n        var data={ Draw: drawData, Name:this.ClassName };\\r\\n        this.OnDrawEvent.Callback(this.OnDrawEvent,data,this);\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LastShowData=null;\\r\\n        if (!this.IsShow) return;\\r\\n        if (this.PointInfo &&\\r\\n            ( this.PointInfo.ClientPos==2 || this.PointInfo.ClientPos==3 ||\\r\\n                (this.PointInfo.ClientPos>=200&& this.PointInfo.ClientPos<=299) ||\\r\\n                (this.PointInfo.ClientPos>=300&& this.PointInfo.ClientPos<=399) ) )\\r\\n        {   //集合竞价区域\\r\\n            this.Canvas.save();\\r\\n            this.DrawCallAuction();\\r\\n            this.Canvas.restore();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.CursorIndex==null || !this.Data || !this.Data.Data || this.Data.Data.length<=0)\\r\\n        {\\r\\n            this.OnDrawEventCallback(null);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.SpaceWidth = this.Canvas.measureText('0').width;\\r\\n\\r\\n        var isShowLastData=false;\\r\\n        if (this.DrawStatus && this.DrawStatus.IsTitleShowLatestData)\\r\\n        {\\r\\n            var status=this.DrawStatus;\\r\\n            if (!IFrameSplitOperator.IsNumber(status.FrameID) || status.FrameID<0)\\r\\n                isShowLastData=true;\\r\\n            else if (status.CorssCursorTouchEnd && status.IsOnTouch==false)\\r\\n                isShowLastData=true;\\r\\n        }\\r\\n\\r\\n        if (isShowLastData)\\r\\n        {\\r\\n            var item=this.GetLatestKLineData();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //var index=Math.abs(this.CursorIndex-0.5);\\r\\n            var index=this.CursorIndex;\\r\\n            index=parseInt(index.toFixed(0));\\r\\n            var dataIndex=index+this.Data.DataOffset;\\r\\n            if (dataIndex>=this.Data.Data.length) dataIndex=this.Data.Data.length-1;\\r\\n            var item=this.Data.Data[dataIndex];\\r\\n        }\\r\\n\\r\\n        this.LastShowData=item;\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.OnDrawEventCallback(item);\\r\\n        this.DrawItem(item);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//字符串输出格式\\r\\nvar STRING_FORMAT_TYPE =\\r\\n    {\\r\\n        DEFAULT: 1,     //默认 2位小数 单位自动转化 (万 亿)\\r\\n        ORIGINAL:2,     //原始数据\\r\\n        INTEGER:3,      //整形数据输出 如果不是整形使用 DEFAULT\\r\\n        THOUSANDS:21,   //千分位分割\\r\\n    };\\r\\n\\r\\nfunction DynamicTitleData(data,name,color)\\r\\n{\\r\\n    this.Data=data;\\r\\n    this.Name=name;\\r\\n    this.Color=color;   //字体颜色\\r\\n    this.DataType;      //数据类型\\r\\n    this.StringFormat=STRING_FORMAT_TYPE.DEFAULT;   //字符串格式\\r\\n    this.FloatPrecision=2;                          //小数位数\\r\\n    this.IsShow=true;   //是否显示\\r\\n}\\r\\n\\r\\nfunction DynamicChartTitlePainting()\\r\\n{\\r\\n    this.newMethod=IChartTitlePainting;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='DynamicChartTitlePainting';\\r\\n\\r\\n    this.IsDynamic=true;\\r\\n    this.Data=[];\\r\\n    this.Explain;\\r\\n\\r\\n    this.ColorIndex;    //五彩K线名字 {Name:'名字'}\\r\\n    this.IsShowColorIndexTitle=true;\\r\\n    this.IsShowUpDownArrow=true;   //指标数据是否显示 上涨下跌箭头\\r\\n    this.IsShowIndexName=true;     //是否显示指标名字\\r\\n    this.IsShowIndexTitle=true;    //是否显示指标标题信息\\r\\n\\r\\n    this.TradeIndex;    //专家系统名字{Name:'名字', Param:'参数'}\\r\\n    this.IsShowTradeIndexTitle=true;\\r\\n\\r\\n    this.OverlayIndex=new Map();        //叠加指标 key=Identify value={ Data:数据, Title:标题, Identify:标识}\\r\\n    this.IsShowOverlayIndexName=true;   //是否显示叠加指标名字\\r\\n    this.OverlayIndexType={ Position:0, LineSpace:5, BGColor:g_JSChartResource.OverlayIndexTitleBGColor };        //Position 0=主图指标后面显示 1=叠加指标单行显示\\r\\n    //LineSpace 行间距\\r\\n\\r\\n    this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;\\r\\n    this.TitleRect;              //指标名字显示区域\\r\\n    this.IsDrawTitleBG=false;    //是否绘制指标名字背景色\\r\\n    this.BGColor=g_JSChartResource.IndexTitleBGColor;\\r\\n    this.OnDrawEvent;\\r\\n    this.ParamSpace=2;           //参数显示的间距\\r\\n\\r\\n    this.IsKLineFrame=false;    //是否是K线框架标题\\r\\n\\r\\n\\r\\n    //动态标题\\r\\n    //动态标题\\r\\n    this.DynamicTitle={ OutName:null, OutValue:null };\\r\\n    this.OverlayDynamicTitle=new Map();  //key , value={ OutName, OutValue }\\r\\n\\r\\n    this.ReloadResource=function()\\r\\n    {\\r\\n        this.Font=g_JSChartResource.TitleFont;\\r\\n        this.TitleColor=g_JSChartResource.DefaultTextColor;\\r\\n        this.OverlayIndexType.BGColor=g_JSChartResource.OverlayIndexTitleBGColor;\\r\\n    }\\r\\n\\r\\n    this.SetDynamicTitleData=function(outName, args, data)\\r\\n    {\\r\\n        if (!data.OutName) data.OutName=new Map();\\r\\n        else data.OutName.clear();\\r\\n\\r\\n        if (!data.OutValue) data.OutValue=new Map();\\r\\n        else data.OutValue.clear();\\r\\n\\r\\n        var mapArgs=new Map();\\r\\n        for(var i in args)\\r\\n        {\\r\\n            var item=args[i];\\r\\n            mapArgs.set(`{${item.Name}}`, item);\\r\\n        }\\r\\n\\r\\n        for(var i in outName)\\r\\n        {\\r\\n            var item=outName[i];\\r\\n            if (item.DynamicName)\\r\\n            {\\r\\n                var aryFond = item.DynamicName.match(/{\\\\w*}/i);\\r\\n                if (!aryFond || aryFond.length<=0)\\r\\n                {\\r\\n                    data.OutName.set(item.Name, item.DynamicName);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var dyName=item.DynamicName;\\r\\n                    var bFind=true;\\r\\n                    for(var j=0;j<aryFond.length;++j)\\r\\n                    {\\r\\n                        var findItem=aryFond[j];\\r\\n                        if (mapArgs.has(findItem))\\r\\n                        {\\r\\n                            var value=mapArgs.get(findItem).Value;\\r\\n                            dyName=dyName.replace(findItem,value.toString());\\r\\n                        }\\r\\n                        else\\r\\n                        {\\r\\n                            bFind=false;\\r\\n                            break;\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    if (bFind) data.OutName.set(item.Name, dyName);\\r\\n                }\\r\\n\\r\\n            }\\r\\n\\r\\n            if (item.DynamicValue)\\r\\n            {\\r\\n                data.OutValue.set(item.Name, item.DynamicValue);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetDynamicTitle=function(outName, args, overlayID)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsString(overlayID))\\r\\n        {\\r\\n            var dynamicTitle=null;\\r\\n            if (this.OverlayDynamicTitle.has(overlayID))\\r\\n            {\\r\\n                dynamicTitle=this.OverlayDynamicTitle.get(overlayID);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                dynamicTitle={ OutName:null, OutValue:null };\\r\\n                this.OverlayDynamicTitle.set(overlayID, dynamicTitle);\\r\\n            }\\r\\n\\r\\n            this.SetDynamicTitleData(outName, args, dynamicTitle);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.SetDynamicTitleData(outName, args, this.DynamicTitle);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetDynamicOutName=function(key, overlayID)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsString(overlayID))\\r\\n        {\\r\\n            if (!this.OverlayDynamicTitle.has(overlayID)) return null;\\r\\n            var dynamicTitle=this.OverlayDynamicTitle.get(overlayID);\\r\\n            var outName=dynamicTitle.OutName;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var outName=this.DynamicTitle.OutName;\\r\\n        }\\r\\n\\r\\n        if (!outName || outName.size<=0) return null;\\r\\n        if (!outName.has(key)) return null;\\r\\n\\r\\n        return outName.get(key);\\r\\n    }\\r\\n\\r\\n    this.GetDynamicOutValue=function(key, value)\\r\\n    {\\r\\n        var outValue=this.DynamicTitle.OutValue;\\r\\n\\r\\n        if (!outValue || outValue.size<=0) return null;\\r\\n        if (!outValue.has(key)) return null;\\r\\n\\r\\n        var strFormat=outValue.get(key);\\r\\n        strFormat=strFormat.replace('{Value}',value);\\r\\n        return strFormat;\\r\\n    }\\r\\n\\r\\n    this.IsClickTitle=function(x,y) //是否点击了指标标题\\r\\n    {\\r\\n        if (!this.TitleRect) return false;\\r\\n\\r\\n        if (x>this.TitleRect.Left && x<this.TitleRect.Left+this.TitleRect.Width && y>this.TitleRect.Top && y<this.TitleRect.Top+this.TitleRect.Height)\\r\\n        {\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.FormatValue=function(value,item)\\r\\n    {\\r\\n        if (item.StringFormat==STRING_FORMAT_TYPE.DEFAULT)\\r\\n            return IFrameSplitOperator.FormatValueString(value,item.FloatPrecision,this.LanguageID);\\r\\n        else if (item.StringFormat==STRING_FORMAT_TYPE.THOUSANDS)\\r\\n            return IFrameSplitOperator.FormatValueThousandsString(value,item.FloatPrecision);\\r\\n        else if (item.StringFormat==STRING_FORMAT_TYPE.ORIGINAL)\\r\\n            return value.toFixed(item.FloatPrecision).toString();\\r\\n        else if (item.StringFormat==STRING_FORMAT_TYPE.INTEGER)\\r\\n            return IFrameSplitOperator.FromatIntegerString(value,item.FloatPrecision,this.LanguageID);\\r\\n    }\\r\\n\\r\\n    this.FormatMultiReport=function(data,format)\\r\\n    {\\r\\n        var text=\\\"\\\";\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item = data[i];\\r\\n            let quarter=item.Quarter;\\r\\n            let year=item.Year;\\r\\n            let value=item.Value;\\r\\n\\r\\n            if (text.length>0) text+=',';\\r\\n\\r\\n            text+=year.toString();\\r\\n            switch(quarter)\\r\\n            {\\r\\n                case 1:\\r\\n                    text+='一季报 ';\\r\\n                    break;\\r\\n                case 2:\\r\\n                    text+='半年报 ';\\r\\n                    break;\\r\\n                case 3:\\r\\n                    text+='三季报 ';\\r\\n                    break;\\r\\n                case 4:\\r\\n                    text+='年报 ';\\r\\n                    break;\\r\\n            }\\r\\n\\r\\n            text+=this.FormatValue(value,format);\\r\\n        }\\r\\n\\r\\n        return text;\\r\\n    }\\r\\n\\r\\n    this.IsShowLastData=function()\\r\\n    {\\r\\n        var isShowLastData=false;\\r\\n        if (this.DrawStatus && this.DrawStatus.IsTitleShowLatestData)\\r\\n        {\\r\\n            var status=this.DrawStatus;\\r\\n            if (!IFrameSplitOperator.IsNumber(status.FrameID) || status.FrameID<0)\\r\\n                isShowLastData=true;\\r\\n            else if (status.CorssCursorTouchEnd && status.IsOnTouch==false)\\r\\n                isShowLastData=true;\\r\\n        }\\r\\n\\r\\n        return isShowLastData;\\r\\n    }\\r\\n\\r\\n    this.OnDrawTitleEvent=function()\\r\\n    {\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_INDEXTITLE_DRAW);\\r\\n        if (!event) return;\\r\\n\\r\\n        var data={ Index:null, Data:this.Data ,Title:this.Title, FrameID:this.Frame.Identify, OverlayIndex:this.OverlayIndex };\\r\\n        if (IFrameSplitOperator.IsNumber(this.CursorIndex))\\r\\n        {\\r\\n            var index=Math.abs(this.CursorIndex);\\r\\n            index=parseInt(index.toFixed(0));\\r\\n            data.Index=index;   //当前屏数据索引\\r\\n        }\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var border=this.Frame.GetBorder();\\r\\n        data.Left=border.LeftEx/pixelTatio;\\r\\n        data.Top=border.Top/pixelTatio;\\r\\n        data.Right=border.RightEx/pixelTatio;\\r\\n\\r\\n        event.Callback(event,data,this);\\r\\n\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.Frame.IsMinSize) return;\\r\\n\\r\\n        this.IsKLineFrame= this.Frame.ClassName=='KLineFrame' || this.Frame.ClassName=='KLineHScreenFrame';\\r\\n        this.IsDrawTitleBG=this.Frame.IsDrawTitleBG;\\r\\n        this.IsShowUpDownArrow=this.Frame.IsShowTitleArraw;\\r\\n        this.IsShowIndexName=this.Frame.IsShowIndexName;\\r\\n        this.IsShowOverlayIndexName=this.Frame.IsShowOverlayIndexName;\\r\\n        this.OverlayIndexType.Position=this.Frame.OverlayIndexType.Position;\\r\\n        this.OverlayIndexType.LineSpace=this.Frame.OverlayIndexType.LineSpace;\\r\\n        this.ParamSpace=this.Frame.IndexParamSpace;\\r\\n        this.TitleRect=null;\\r\\n\\r\\n        this.OnDrawTitleEvent();\\r\\n\\r\\n        if (this.Frame.IsShowIndexTitle==false) return;\\r\\n        if (this.CursorIndex==null ) return;\\r\\n        if (!this.Data) return;\\r\\n        if (this.Frame.ChartBorder.TitleHeight<5) return;\\r\\n\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            this.HScreenDraw();\\r\\n            this.Canvas.restore();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var left=this.Frame.ChartBorder.GetLeft()+1;\\r\\n        var bottom=this.Frame.ChartBorder.GetTop()+this.Frame.ChartBorder.TitleHeight/2;    //上下居中显示\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n\\r\\n        if (this.Title && this.IsShowIndexName)\\r\\n        {\\r\\n            var textWidth=this.Canvas.measureText(this.Title).width+2;\\r\\n            if (this.IsDrawTitleBG)\\r\\n            {\\r\\n                var spaceSize=GetDevicePixelRatio()*2;\\r\\n                this.Canvas.fillStyle=this.BGColor;\\r\\n                this.TitleRect={Left:left, Top:this.Frame.ChartBorder.GetTop()+spaceSize, Width:textWidth, Height:this.Frame.ChartBorder.TitleHeight-(spaceSize*2)};    //保存下标题的坐标\\r\\n                this.Canvas.fillRect(this.TitleRect.Left,this.TitleRect.Top,this.TitleRect.Width,this.TitleRect.Height);\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            this.Canvas.fillText(this.Title,left,bottom,textWidth);\\r\\n            left+=textWidth;\\r\\n        }\\r\\n\\r\\n        var isShowLastData=this.IsShowLastData();\\r\\n        var lockRect=this.Frame.GetLockRect();\\r\\n        if (lockRect)   //指标上锁区域不显示动态标题\\r\\n        {\\r\\n            var index=Math.abs(this.CursorIndex);\\r\\n            if (this.IsKLineFrame) index=this.CursorIndex;\\r\\n            var x=this.Frame.GetXFromIndex(index.toFixed(0));\\r\\n            if (x>=lockRect.Left) return;\\r\\n            if (isShowLastData) return;\\r\\n        }\\r\\n\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            if (!item || !item.Data || !item.Data.Data) continue;\\r\\n\\r\\n            if (item.Data.Data.length<=0) continue;\\r\\n            if (item.IsShow===false) continue;\\r\\n\\r\\n            var value=null;\\r\\n            var valueText=null;\\r\\n            if (item.DataType==\\\"StraightLine\\\")  //直线只有1个数据\\r\\n            {\\r\\n                value=item.Data.Data[0];\\r\\n                valueText=this.FormatValue(value,item);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isShowLastData)\\r\\n                {\\r\\n                    var dataIndex=item.Data.Data.length-1;  //显示最后一个数据\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var index=Math.abs(this.CursorIndex);\\r\\n                    index=parseInt(index.toFixed(0));\\r\\n                    if (this.IsKLineFrame) index=this.CursorIndex;\\r\\n                    var dataIndex=item.Data.DataOffset+index;\\r\\n                    if (dataIndex>=item.Data.Data.length) dataIndex=item.Data.Data.length-1;\\r\\n                    if (dataIndex<0) continue;\\r\\n                    //if (item.Data.DataOffset+index>=item.Data.Data.length) continue;\\r\\n                }\\r\\n\\r\\n                value=item.Data.Data[dataIndex];\\r\\n                if (value==null) continue;\\r\\n\\r\\n                if (item.DataType==\\\"HistoryData-Vol\\\")\\r\\n                {\\r\\n                    value=value.Vol;\\r\\n                    valueText=this.FormatValue(value,item);\\r\\n                }\\r\\n                else if (item.DataType==\\\"MultiReport\\\")\\r\\n                {\\r\\n                    valueText=this.FormatMultiReport(value,item);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var arrow=null;\\r\\n                    if (this.IsShowUpDownArrow)\\r\\n                    {\\r\\n                        var proValue=null;\\r\\n                        if (dataIndex-1>=0) proValue=item.Data.Data[dataIndex-1];\\r\\n                        if (IFrameSplitOperator.IsNumber(proValue))\\r\\n                        {\\r\\n                            if (proValue>value) arrow='↓';\\r\\n                            else if (proValue<value) arrow='↑';\\r\\n                            else arrow='→';\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    valueText=this.FormatValue(value,item);\\r\\n                    if (item.Name)\\r\\n                    {\\r\\n                        var dyValue=this.GetDynamicOutValue(item.Name, valueText);\\r\\n                        if (dyValue) valueText=dyValue;\\r\\n                    }\\r\\n\\r\\n                    if (arrow) valueText+=arrow;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=item.Color;\\r\\n\\r\\n            var text=valueText;\\r\\n            if (item.Name)\\r\\n            {\\r\\n                var dyTitle=this.GetDynamicOutName(item.Name);\\r\\n                if (dyTitle) text=dyTitle+\\\":\\\"+valueText;\\r\\n                else text=item.Name+\\\":\\\"+valueText;\\r\\n            }\\r\\n            var space=this.ParamSpace*GetDevicePixelRatio();\\r\\n            var textWidth=this.Canvas.measureText(text).width+space;    //后空2个像素\\r\\n            if ((left+textWidth)>right) break;\\r\\n\\r\\n            this.Canvas.fillText(text,left,bottom,textWidth);\\r\\n            left+=textWidth;\\r\\n        }\\r\\n\\r\\n        if (this.Explain)   //说明信息\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            var text=\\\"说明:\\\"+this.Explain;\\r\\n            var textWidth=this.Canvas.measureText(text).width+2;\\r\\n            if (left+textWidth<right)\\r\\n            {\\r\\n                this.Canvas.fillText(text,left,bottom,textWidth);\\r\\n                left+=textWidth;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.ColorIndex && this.IsShowColorIndexTitle)\\r\\n        {\\r\\n            this.Canvas.fillStyle=g_JSChartResource.Title.ColorIndexColor;\\r\\n            var tradeName=this.ColorIndex.Name+this.ColorIndex.Param;\\r\\n            var textWidth=this.Canvas.measureText(tradeName).width+2;    //后空2个像素\\r\\n            this.Canvas.fillText(tradeName,left,bottom,textWidth);\\r\\n            left+=textWidth;\\r\\n        }\\r\\n\\r\\n        if (this.TradeIndex && this.IsShowTradeIndexTitle)\\r\\n        {\\r\\n            this.Canvas.fillStyle=g_JSChartResource.Title.TradeIndexColor;\\r\\n            var tradeName=this.TradeIndex.Name+this.TradeIndex.Param;\\r\\n            var textWidth=this.Canvas.measureText(tradeName).width+2;    //后空2个像素\\r\\n            this.Canvas.fillText(tradeName,left,bottom,textWidth);\\r\\n            left+=textWidth;\\r\\n        }\\r\\n\\r\\n        if (this.OverlayIndexType.Position==1) this.DrawOverlayIndexSingleLine();\\r\\n        else this.DrawOverlayIndex(left+10*GetDevicePixelRatio());   //间距都空点 和主指标区分开\\r\\n    }\\r\\n\\r\\n    this.DrawOverlayIndexSingleLine=function()   //叠加指标单行显示\\r\\n    {\\r\\n        var pixelRatio=GetDevicePixelRatio();\\r\\n        var border=this.Frame.GetBorder();\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            var left=1;\\r\\n            var top=2*pixelRatio;\\r\\n            var right=this.Frame.ChartBorder.GetHeight();\\r\\n            var bottom=this.Frame.ChartBorder.GetWidthEx();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var top=border.TopTitle+2*pixelRatio;\\r\\n            var left=border.Left+1;\\r\\n            var right=border.Right;\\r\\n            var bottom=border.Bottom;\\r\\n        }\\r\\n\\r\\n\\r\\n        var lineSpace=this.OverlayIndexType.LineSpace*pixelRatio;\\r\\n        var x=left, y=top;\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n        var fontHeight=GetFontHeight(this.Canvas,this.Font,\\\"擎\\\");\\r\\n        for(item of this.OverlayIndex)\\r\\n        {\\r\\n            var overlayItem=item[1];\\r\\n            var overlayID=item[0];\\r\\n            x=left;\\r\\n            if (overlayItem.Title && this.IsShowOverlayIndexName)\\r\\n            {\\r\\n\\r\\n                var textWidth=this.Canvas.measureText(overlayItem.Title).width+2;\\r\\n                if ((x+textWidth)<right)\\r\\n                {\\r\\n                    if (this.OverlayIndexType.BGColor)\\r\\n                    {\\r\\n                        this.Canvas.fillStyle=this.OverlayIndexType.BGColor;\\r\\n                        var rtBG={Left:x, Top:y, Width:textWidth, Height: fontHeight+lineSpace };    //保存下标题的坐标\\r\\n                        this.Canvas.fillRect(rtBG.Left,rtBG.Top,rtBG.Width,rtBG.Height);\\r\\n                    }\\r\\n\\r\\n                    this.Canvas.fillStyle=this.TitleColor;\\r\\n                    this.Canvas.fillText(overlayItem.Title,x,y,textWidth);\\r\\n                }\\r\\n                x+=textWidth;\\r\\n            }\\r\\n\\r\\n            for(var i=0; i<overlayItem.Data.length; ++i)\\r\\n            {\\r\\n                var item=overlayItem.Data[i];\\r\\n                if (!item || !item.Data || !item.Data.Data || !item.Name) continue;\\r\\n                if (item.Data.Data.length<=0) continue;\\r\\n\\r\\n                var value=null;\\r\\n                var valueText=null;\\r\\n                if (item.DataType==\\\"StraightLine\\\")  //直线只有1个数据\\r\\n                {\\r\\n                    value=item.Data.Data[0];\\r\\n                    valueText=this.FormatValue(value,item);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var index=Math.abs(this.CursorIndex-0.5);\\r\\n                    index=parseInt(index.toFixed(0));\\r\\n                    if (this.IsKLineFrame) index=this.CursorIndex;\\r\\n                    var dataIndex=item.Data.DataOffset+index;\\r\\n                    if (dataIndex>=item.Data.Data.length) dataIndex=item.Data.Data.length-1;\\r\\n                    if (dataIndex<0) continue;\\r\\n\\r\\n                    value=item.Data.Data[dataIndex];\\r\\n                    if (value==null) continue;\\r\\n\\r\\n                    if (item.DataType==\\\"HistoryData-Vol\\\")\\r\\n                    {\\r\\n                        value=value.Vol;\\r\\n                        valueText=this.FormatValue(value,item);\\r\\n                    }\\r\\n                    else if (item.DataType==\\\"MultiReport\\\")\\r\\n                    {\\r\\n                        valueText=this.FormatMultiReport(value,item);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        valueText=this.FormatValue(value,item);\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                var text=valueText;\\r\\n                if (item.Name)\\r\\n                {\\r\\n                    var dyTitle=this.GetDynamicOutName(item.Name,overlayID);\\r\\n                    if (dyTitle) text=dyTitle+\\\":\\\"+valueText;\\r\\n                    else text=item.Name+\\\":\\\"+valueText;\\r\\n                }\\r\\n\\r\\n                var textWidth=this.Canvas.measureText(text).width+2;    //后空2个像素\\r\\n                if ((x+textWidth)>right) break;\\r\\n                if (this.OverlayIndexType.BGColor)\\r\\n                {\\r\\n                    this.Canvas.fillStyle=this.OverlayIndexType.BGColor;\\r\\n                    var rtBG={Left:x, Top:y, Width:textWidth, Height: fontHeight+lineSpace };    //保存下标题的坐标\\r\\n                    this.Canvas.fillRect(rtBG.Left,rtBG.Top,rtBG.Width,rtBG.Height);\\r\\n                }\\r\\n\\r\\n                this.Canvas.fillStyle=item.Color;\\r\\n                this.Canvas.fillText(text,x,y,textWidth);\\r\\n                x+=textWidth;\\r\\n            }\\r\\n\\r\\n            y+=fontHeight+lineSpace;\\r\\n            if ((y+fontHeight+lineSpace)>=bottom) break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawOverlayIndex=function(left)    //叠加指标标题\\r\\n    {\\r\\n        var bottom=this.Frame.ChartBorder.GetTop()+this.Frame.ChartBorder.TitleHeight/2;    //上下居中显示\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        if (this.Frame.IsHScreen===true)\\r\\n        {\\r\\n            bottom=-this.Frame.ChartBorder.TitleHeight/2;\\r\\n            right=this.Frame.ChartBorder.GetHeight();\\r\\n        }\\r\\n        if (left>right) return;\\r\\n\\r\\n        var spaceWidth=5*GetDevicePixelRatio();\\r\\n        var drawLeft=left;\\r\\n        for(item of this.OverlayIndex)\\r\\n        {\\r\\n            left+=spaceWidth;\\r\\n            var overlayItem=item[1];\\r\\n            if (overlayItem.Title && this.IsShowOverlayIndexName)\\r\\n            {\\r\\n                this.Canvas.fillStyle=this.TitleColor;\\r\\n                var textWidth=this.Canvas.measureText(overlayItem.Title).width+2;\\r\\n                drawLeft=left;\\r\\n                left+=textWidth;\\r\\n                if (left>right) break;\\r\\n                this.Canvas.fillText(overlayItem.Title,drawLeft,bottom,textWidth);\\r\\n            }\\r\\n\\r\\n            for(var i in overlayItem.Data)\\r\\n            {\\r\\n                var item=overlayItem.Data[i];\\r\\n                if (!item || !item.Data || !item.Data.Data || !item.Name) continue;\\r\\n                if (item.Data.Data.length<=0) continue;\\r\\n\\r\\n                var value=null;\\r\\n                var valueText=null;\\r\\n                if (item.DataType==\\\"StraightLine\\\")  //直线只有1个数据\\r\\n                {\\r\\n                    value=item.Data.Data[0];\\r\\n                    valueText=this.FormatValue(value,item);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var index=Math.abs(this.CursorIndex-0.5);\\r\\n                    index=parseInt(index.toFixed(0));\\r\\n                    if (this.IsKLineFrame) index=this.CursorIndex;\\r\\n                    var dataIndex=item.Data.DataOffset+index;\\r\\n                    if (dataIndex>=item.Data.Data.length) dataIndex=item.Data.Data.length-1;\\r\\n                    if (dataIndex<0) continue;\\r\\n\\r\\n                    value=item.Data.Data[dataIndex];\\r\\n                    if (value==null) continue;\\r\\n\\r\\n                    if (item.DataType==\\\"HistoryData-Vol\\\")\\r\\n                    {\\r\\n                        value=value.Vol;\\r\\n                        valueText=this.FormatValue(value,item);\\r\\n                    }\\r\\n                    else if (item.DataType==\\\"MultiReport\\\")\\r\\n                    {\\r\\n                        valueText=this.FormatMultiReport(value,item);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        valueText=this.FormatValue(value,item);\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                this.Canvas.fillStyle=item.Color;\\r\\n\\r\\n                var text=item.Name+\\\":\\\"+valueText;\\r\\n                var textWidth=this.Canvas.measureText(text).width+2;    //后空2个像素\\r\\n                drawLeft=left;\\r\\n                left+=textWidth;\\r\\n                if (left>right) break;\\r\\n                this.Canvas.fillText(text,drawLeft,bottom,textWidth);\\r\\n            }\\r\\n\\r\\n            if (left>right) break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.HScreenDraw=function()\\r\\n    {\\r\\n        var border=this.Frame.ChartBorder.GetHScreenBorder();\\r\\n        var xText=this.Frame.ChartBorder.GetRightTitle();\\r\\n        var yText=border.TopEx;\\r\\n        this.Canvas.translate(xText, yText);\\r\\n        this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n        var left=1;\\r\\n        var bottom=-this.Frame.ChartBorder.TitleHeight/2;    //上下居中显示\\r\\n        var right=this.Frame.ChartBorder.GetHeight();\\r\\n\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n\\r\\n        if (this.Title && this.IsShowIndexName)\\r\\n        {\\r\\n            var textWidth=this.Canvas.measureText(this.Title).width+2;\\r\\n\\r\\n            if (this.IsDrawTitleBG)\\r\\n            {\\r\\n                var spaceSize=GetDevicePixelRatio()*2;\\r\\n                this.Canvas.fillStyle=this.BGColor;\\r\\n                this.TitleRect= {Left:this.Frame.ChartBorder.GetRightTitle(),Top:border.TopEx,Width:this.Frame.ChartBorder.TitleHeight ,Height:textWidth};   //保存下标题的坐标\\r\\n                let drawRect={Left:left, Top:-this.Frame.ChartBorder.TitleHeight+spaceSize, Width:textWidth, Height:this.Frame.ChartBorder.TitleHeight-(spaceSize*2)};\\r\\n                this.Canvas.fillRect(drawRect.Left,drawRect.Top,drawRect.Width,drawRect.Height);\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            this.Canvas.fillText(this.Title,left,bottom,textWidth);\\r\\n            left+=textWidth;\\r\\n        }\\r\\n\\r\\n        var lockRect=this.Frame.GetLockRect();\\r\\n        if (lockRect)   //指标上锁区域不显示动态标题\\r\\n        {\\r\\n            var index=Math.abs(this.CursorIndex-0.5);\\r\\n            if (this.IsKLineFrame) index=this.CursorIndex;\\r\\n            var x=this.Frame.GetXFromIndex(index.toFixed(0));\\r\\n            if (x>=lockRect.Top) return;\\r\\n        }\\r\\n\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            if (!item || !item.Data || !item.Data.Data || !item.Name) continue;\\r\\n\\r\\n            if (item.Data.Data.length<=0) continue;\\r\\n\\r\\n            var value=null;\\r\\n            var valueText=null;\\r\\n            if (item.DataType==\\\"StraightLine\\\")  //直线只有1个数据\\r\\n            {\\r\\n                value=item.Data.Data[0];\\r\\n                valueText=this.FormatValue(value,item);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var index=Math.abs(this.CursorIndex-0.5);\\r\\n                index=parseInt(index.toFixed(0));\\r\\n                if (this.IsKLineFrame) index=this.CursorIndex;\\r\\n                var dataIndex=item.Data.DataOffset+index;\\r\\n                if (dataIndex>=item.Data.Data.length) dataIndex=item.Data.Data.length-1;\\r\\n                if (dataIndex<0) continue;\\r\\n\\r\\n                value=item.Data.Data[dataIndex];\\r\\n                if (value==null) continue;\\r\\n\\r\\n                if (item.DataType==\\\"HistoryData-Vol\\\")\\r\\n                {\\r\\n                    value=value.Vol;\\r\\n                    valueText=this.FormatValue(value,item);\\r\\n                }\\r\\n                else if (item.DataType==\\\"MultiReport\\\")\\r\\n                {\\r\\n                    valueText=this.FormatMultiReport(value,item);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    valueText=this.FormatValue(value,item);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=item.Color;\\r\\n\\r\\n            var text=item.Name+\\\":\\\"+valueText;\\r\\n            var textWidth=this.Canvas.measureText(text).width+2;    //后空2个像素\\r\\n            if ((left+textWidth)>right) break;\\r\\n\\r\\n            this.Canvas.fillText(text,left,bottom,textWidth);\\r\\n            left+=textWidth;\\r\\n        }\\r\\n\\r\\n        if (this.Explain)   //说明信息\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n            var text=\\\"说明:\\\"+this.Explain;\\r\\n            var textWidth=this.Canvas.measureText(text).width+2;\\r\\n            if (left+textWidth<right)\\r\\n            {\\r\\n                this.Canvas.fillText(text,left,bottom,textWidth);\\r\\n                left+=textWidth;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.OverlayIndexType.Position==1) this.DrawOverlayIndexSingleLine();\\r\\n        else this.DrawOverlayIndex(left+5*GetDevicePixelRatio());   //间距都空点 和主指标区分开\\r\\n    }\\r\\n\\r\\n    this.OnDrawEventCallback=function(drawData)\\r\\n    {\\r\\n        if (!this.OnDrawEvent || !this.OnDrawEvent.Callback) return;\\r\\n        var data={ Draw: drawData, Name:'DynamicChartTitlePainting'};\\r\\n        this.OnDrawEvent.Callback(this.OnDrawEvent,data,this);\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具\\r\\nfunction IChartDrawPicture()\\r\\n{\\r\\n    this.Frame;\\r\\n    this.Canvas;\\r\\n    this.Point=new Array()                      //画图的点\\r\\n    this.Value=new Array();                     //XValue,YValue\\r\\n    this.LinePoint=[];\\r\\n    this.PointCount=2;                          //画点的个数\\r\\n    this.Status=0;                              //0=开始画 1=完成第1个点  2=完成第2个点 3=完成第3个点  10=完成 20=移动\\r\\n    this.PointStatus=0;                         //2=第2个点完成\\r\\n    this.MovePointIndex=null;                   //移动哪个点 0-10 对应Point索引  100 整体移动\\r\\n    this.ClassName='IChartDrawPicture';\\r\\n    this.FinishedCallback;                      //画图完成回调通知\\r\\n    this.Guid=Guid();                            //ID标识\\r\\n    this.Symbol;        //对应的股票\\r\\n    this.Period;        //对应的周期\\r\\n    this.Right;         //对应的复权\\r\\n    this.IsSelected=false;  //是否选中\\r\\n    this.Option;\\r\\n    this.EnableMove=true;   //是否可以移动\\r\\n\\r\\n    this.IsDrawFirst=false;\\r\\n\\r\\n    // this.LineColor=g_JSChartResource.DrawPicture.LineColor[0];                            //线段颜色\\r\\n    this.LineColor=\\\"#1e90ff\\\";      //线段颜色，input type=\\\"color\\\" 不支持rgb和rgba 的格式\\r\\n    this.LineWidth=2;              //线段宽度\\r\\n    this.BackupLineWidth=null;\\r\\n    this.AreaColor='rgba(25,25,25,0.4)';    //面积颜色\\r\\n    this.PointColor=g_JSChartResource.DrawPicture.PointColor[0];\\r\\n\\r\\n\\r\\n    //接口函数\\r\\n    this.SetLastPoint=null; //this.SetLastPoint=function(obj)  obj={X:,Y:}\\r\\n    this.Update=null;       //更新数据回调\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (!option) return;\\r\\n\\r\\n        if (option.LineColor) this.LineColor=option.LineColor;\\r\\n        if (option.LineWidth>0) this.LineWidth=option.LineWidth;\\r\\n        if (option.AreaColor) this.AreaColor=option.AreaColor;\\r\\n        if (option.PointColor) this.PointColor=option.PointColor;\\r\\n    }\\r\\n\\r\\n    this.SetLineWidth=function()\\r\\n    {\\r\\n        this.BackupLineWidth=null;\\r\\n        if (this.LineWidth>0)\\r\\n        {\\r\\n            this.BackupLineWidth=this.Canvas.lineWidth;\\r\\n            this.Canvas.lineWidth=this.LineWidth*GetDevicePixelRatio();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetFontHeight=function(font)\\r\\n    {\\r\\n        return GetFontHeight(this.Canvas, font, \\\"擎\\\");\\r\\n    }\\r\\n\\r\\n    this.RestoreLineWidth=function()\\r\\n    {\\r\\n        if (this.BackupLineWidth!=null)\\r\\n        {\\r\\n            this.Canvas.lineWidth=this.BackupLineWidth;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //Point => Value\\r\\n    this.PointToValue=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n\\r\\n        if (this.Frame.ClassName==\\\"MinuteFrame\\\" || this.Frame.Class==\\\"MinuteHScreenFrame\\\")\\r\\n        {\\r\\n            return this.PointToValue_Minute();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return this.PointToValue_KLine();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.PointToKLine=function(aryPoint)\\r\\n    {\\r\\n        if (!this.Frame) return null;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return null;\\r\\n\\r\\n        var kLine=[];\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            for(var i in aryPoint)\\r\\n            {\\r\\n                var item=aryPoint[i];\\r\\n                var xValue=parseInt(this.Frame.GetXData(item.Y))+data.DataOffset;\\r\\n                var yValue=this.Frame.GetYData(item.X);\\r\\n\\r\\n                var valueItem={ XValue:xValue, YValue:yValue };\\r\\n                var kline=data.Data[xValue];\\r\\n                valueItem.DateTime={ Date:kline.Date };\\r\\n                if (IFrameSplitOperator.IsNumber(kline.Time)) valueItem.DateTime.Time=kline.Time;\\r\\n\\r\\n                kLine[i]=valueItem;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in aryPoint)\\r\\n            {\\r\\n                var item=aryPoint[i];\\r\\n                var index=parseInt(this.Frame.GetXData(item.X,false));\\r\\n                var xValue=index+data.DataOffset;\\r\\n                if (xValue<0) xValue=0;\\r\\n                else if (xValue>=data.Data.length)\\r\\n                {\\r\\n                    xValue=data.Data.length-1;\\r\\n                    index=xValue-data.DataOffset;\\r\\n                }\\r\\n                var yValue=this.Frame.GetYData(item.Y,false);\\r\\n\\r\\n                var valueItem={ XValue:xValue, YValue:yValue, XIndex:index };\\r\\n                var kline=data.Data[xValue];\\r\\n                valueItem.DateTime={ Date:kline.Date };\\r\\n                if (IFrameSplitOperator.IsNumber(kline.Time)) valueItem.DateTime.Time=kline.Time;\\r\\n\\r\\n                kLine[i]=valueItem;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return kLine;\\r\\n    }\\r\\n\\r\\n    this.PointToValue_KLine=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            for(var i in this.Point)\\r\\n            {\\r\\n                var item=this.Point[i];\\r\\n                var xValue=parseInt(this.Frame.GetXData(item.Y))+data.DataOffset;\\r\\n                var yValue=this.Frame.GetYData(item.X);\\r\\n\\r\\n                var valueItem={ XValue:xValue, YValue:yValue };\\r\\n                var kline=data.Data[xValue];\\r\\n                valueItem.DateTime={ Date:kline.Date };\\r\\n                if (IFrameSplitOperator.IsNumber(kline.Time)) valueItem.DateTime.Time=kline.Time;\\r\\n\\r\\n                this.Value[i]=valueItem;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in this.Point)\\r\\n            {\\r\\n                var item=this.Point[i];\\r\\n                var xValue=parseInt(this.Frame.GetXData(item.X,false))+data.DataOffset;\\r\\n                if (xValue<0) xValue=0;\\r\\n                else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n                var yValue=this.Frame.GetYData(item.Y,false);\\r\\n\\r\\n                var valueItem={ XValue:xValue, YValue:yValue };\\r\\n                var kline=data.Data[xValue];\\r\\n                valueItem.DateTime={ Date:kline.Date };\\r\\n                if (IFrameSplitOperator.IsNumber(kline.Time)) valueItem.DateTime.Time=kline.Time;\\r\\n\\r\\n                this.Value[i]=valueItem;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.PointToValue_Minute=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            for(var i in this.Point)\\r\\n            {\\r\\n                var item=this.Point[i];\\r\\n                var xValue=parseInt(this.Frame.GetXData(item.Y));\\r\\n                var yValue=this.Frame.GetYData(item.X);\\r\\n\\r\\n                var valueItem={ XValue:xValue, YValue:yValue };\\r\\n                var minuteItem=data.Data[xValue];\\r\\n                valueItem.DateTime={ Date:minuteItem.Date ,Time:minuteItem.Time};\\r\\n                this.Value[i]=valueItem;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in this.Point)\\r\\n            {\\r\\n                var item=this.Point[i];\\r\\n                var xValue=parseInt(this.Frame.GetXData(item.X));\\r\\n                var yValue=this.Frame.GetYData(item.Y);\\r\\n\\r\\n                var valueItem={ XValue:xValue, YValue:yValue };\\r\\n                var minuteItem=data.Data[xValue];\\r\\n                valueItem.DateTime={ Date:minuteItem.Date, Time:minuteItem.Time };\\r\\n                this.Value[i]=valueItem;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    //Value => Point\\r\\n    this.ValueToPoint=function()\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        //this.UpdateXValue();\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        this.Point=[];\\r\\n        for(var i in this.Value)\\r\\n        {\\r\\n            var item=this.Value[i];\\r\\n            var pt=new Point();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                pt.Y=this.Frame.GetXFromIndex(item.XValue-data.DataOffset);\\r\\n                pt.X=this.Frame.GetYFromData(item.YValue);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                pt.X=this.Frame.GetXFromIndex(item.XValue-data.DataOffset, false);\\r\\n                pt.Y=this.Frame.GetYFromData(item.YValue,false);\\r\\n            }\\r\\n            this.Point[i]=pt;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.UpdateXValue=function()    //通过datetime更新x的索引\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        var aryDateTime=[];\\r\\n        for(var i in this.Value)\\r\\n        {\\r\\n            var item=this.Value[i];\\r\\n            var dateTime={ Date:item.DateTime.Date };\\r\\n            if (IFrameSplitOperator.IsNumber(item.DateTime.Time)) dateTime.Time=item.DateTime.Time;\\r\\n            aryDateTime[i]=dateTime;\\r\\n        }\\r\\n\\r\\n        data.FindDataIndexByDateTime(aryDateTime);\\r\\n        for(var i in aryDateTime)\\r\\n        {\\r\\n            var findItem=aryDateTime[i];\\r\\n            var valueItem=this.Value[i];\\r\\n            if (findItem.Index>=0) valueItem.XValue=findItem.Index;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //xStep,yStep 移动的偏移量\\r\\n    this.Move=function(xStep,yStep)\\r\\n    {\\r\\n        if (this.Status!=20) return fasle;\\r\\n        if (!this.Frame) return false;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return false;\\r\\n        if (this.MovePointIndex==null) return false;\\r\\n\\r\\n        var index=parseInt(this.MovePointIndex);\\r\\n        if (index===100)    //整体移动\\r\\n        {\\r\\n            for(var i in this.Point)\\r\\n            {\\r\\n                this.Point[i].X+=xStep;\\r\\n                this.Point[i].Y+=yStep;\\r\\n            }\\r\\n        }\\r\\n        else if (index===0 || index===1 || index===2 || index===3 || index===4 || index===5)\\r\\n        {\\r\\n            if (index<this.Point.length)\\r\\n            {\\r\\n                this.Point[index].X+=xStep;\\r\\n                this.Point[index].Y+=yStep;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return false;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ClipFrame=function()\\r\\n    {\\r\\n        if (this.Frame.IsHScreen)\\r\\n        {\\r\\n            var left=this.Frame.ChartBorder.GetLeftEx();\\r\\n            var top=this.Frame.ChartBorder.GetTop();\\r\\n            var width=this.Frame.ChartBorder.GetWidthEx();\\r\\n            var height=this.Frame.ChartBorder.GetHeight();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var left=this.Frame.ChartBorder.GetLeft();\\r\\n            var top=this.Frame.ChartBorder.GetTopEx();\\r\\n            var width=this.Frame.ChartBorder.GetWidth();\\r\\n            var height=this.Frame.ChartBorder.GetHeightEx();\\r\\n        }\\r\\n\\r\\n        this.Canvas.save();\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(left,top,width,height);\\r\\n        this.Canvas.clip();\\r\\n    }\\r\\n\\r\\n    //计算需要画的点的坐标option:{IsCheckX:是否检测X值, IsCheckY:是否检测Y值}\\r\\n    this.CalculateDrawPoint=function(option)\\r\\n    {\\r\\n        if (this.Status<2) return null;\\r\\n        if(!this.Point.length || !this.Frame) return null;\\r\\n\\r\\n        var drawPoint=new Array();\\r\\n        if (this.Status==10)\\r\\n        {\\r\\n            var data=this.Frame.Data;\\r\\n            if (!data) return null;\\r\\n\\r\\n            var showCount=this.Frame.XPointCount;\\r\\n            var invaildX=0; //超出范围的x点个数\\r\\n            var isHScreen=this.Frame.IsHScreen;\\r\\n            for(var i in this.Value)\\r\\n            {\\r\\n                var item=this.Value[i];\\r\\n                var dataIndex=item.XValue-data.DataOffset;\\r\\n                if (dataIndex<0 || dataIndex>=showCount) ++invaildX;\\r\\n\\r\\n                var pt=new Point();\\r\\n                if (isHScreen)  //横屏X,Y对调\\r\\n                {\\r\\n                    pt.Y=this.Frame.GetXFromIndex(item.XValue-data.DataOffset,false);\\r\\n                    pt.X=this.Frame.GetYFromData(item.YValue,false);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    pt.X=this.Frame.GetXFromIndex(item.XValue-data.DataOffset,false);\\r\\n                    pt.Y=this.Frame.GetYFromData(item.YValue,false);\\r\\n                }\\r\\n                drawPoint.push(pt);\\r\\n            }\\r\\n\\r\\n            if (option && option.IsCheckX===true)\\r\\n            {\\r\\n                if (invaildX==this.Value.length) return null;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            drawPoint=this.Point;\\r\\n        }\\r\\n\\r\\n        return drawPoint;\\r\\n    }\\r\\n\\r\\n    this.IsYValueInFrame=function(yValue)\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n\\r\\n        if (yValue>this.Frame.HorizontalMax || yValue<this.Frame.HorizontalMin) return false;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.DrawPoint=function(aryPoint)\\r\\n    {\\r\\n        if (!aryPoint || aryPoint.length<=0) return;\\r\\n\\r\\n        //画点\\r\\n        this.ClipFrame();\\r\\n        var pixel=GetDevicePixelRatio();\\r\\n        for(var i in aryPoint)\\r\\n        {\\r\\n            var item=aryPoint[i];\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.arc(item.X,item.Y,5*pixel,0,360,false);\\r\\n            this.Canvas.fillStyle=this.PointColor;      //填充颜色\\r\\n            this.Canvas.fill();                         //画实心圆\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //计算2个点线的,左右的延长线的点\\r\\n    this.CalculateExtendLinePoint=function(ptStart,ptEnd)\\r\\n    {\\r\\n        var result={};\\r\\n\\r\\n        var left=this.Frame.ChartBorder.GetLeft();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        var top=this.Frame.ChartBorder.GetTopEx();\\r\\n        var bottom=this.Frame.ChartBorder.GetBottom();\\r\\n\\r\\n        var a=ptEnd.X-ptStart.X;\\r\\n        var b=ptEnd.Y-ptStart.Y;\\r\\n\\r\\n        if (a>0)\\r\\n        {\\r\\n            var b2=bottom-ptStart.Y;\\r\\n            var a2=a*b2/b;\\r\\n\\r\\n            var pt=new Point();\\r\\n            pt.X=ptStart.X+a2;\\r\\n            pt.Y=bottom;\\r\\n            result.End=pt;\\r\\n\\r\\n\\r\\n            var b2=ptEnd.Y-top;\\r\\n            var a2=a*b2/b;\\r\\n            var pt2=new Point();\\r\\n            pt2.Y=top;\\r\\n            pt2.X=ptEnd.X-a2;\\r\\n            result.Start=pt2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var b2=bottom-ptStart.Y;\\r\\n            var a2=Math.abs(a)*b2/b;\\r\\n\\r\\n            var pt=new Point();\\r\\n            pt.X=ptStart.X-a2;;\\r\\n            pt.Y=bottom;\\r\\n            result.End=pt;\\r\\n\\r\\n            var b2=ptEnd.Y-top;\\r\\n            var a2=Math.abs(a)*b2/b;\\r\\n            var pt2=new Point();\\r\\n            pt2.Y=top;\\r\\n            pt2.X=ptEnd.X+a2;\\r\\n            result.Start=pt2;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //计算2个点线的,点0->点1->延长线的点\\r\\n    this.CalculateExtendLineEndPoint=function(aryPoint)\\r\\n    {\\r\\n        var left=this.Frame.ChartBorder.GetLeft();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n\\r\\n        var a=aryPoint[1].X-aryPoint[0].X;\\r\\n        var b=aryPoint[1].Y-aryPoint[0].Y;\\r\\n\\r\\n        if (a>0)\\r\\n        {\\r\\n            var a1=right-aryPoint[0].X;\\r\\n            var b1=a1*b/a;\\r\\n            var y=b1+aryPoint[0].Y;\\r\\n\\r\\n            var pt=new Point();\\r\\n            pt.X=right;\\r\\n            pt.Y=y;\\r\\n            return pt;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var a1=aryPoint[0].X-left;\\r\\n            var b1=a1*b/Math.abs(a);\\r\\n            var y=b1+aryPoint[0].Y;\\r\\n\\r\\n            var pt=new Point();\\r\\n            pt.X=left;\\r\\n            pt.Y=y;\\r\\n            return pt;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //坐标是否在点上 返回在第几个点上\\r\\n    this.IsPointInXYValue=function(x,y)\\r\\n    {\\r\\n        if (!this.Frame) return -1;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return -1;\\r\\n        if (!this.Value) return -1;\\r\\n\\r\\n        var radius=5;\\r\\n        if (this.Option) radius+=this.Option.Zoom;\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        radius*=GetDevicePixelRatio();\\r\\n        for(var i=0;i<this.Value.length; ++i)   //是否在点上\\r\\n        {\\r\\n            var item=this.Value[i];\\r\\n            var pt=new Point();\\r\\n            if (isHScreen)\\r\\n            {\\r\\n                pt.Y=this.Frame.GetXFromIndex(item.XValue-data.DataOffset);\\r\\n                pt.X=this.Frame.GetYFromData(item.YValue);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                pt.X=this.Frame.GetXFromIndex(item.XValue-data.DataOffset);\\r\\n                pt.Y=this.Frame.GetYFromData(item.YValue);\\r\\n            }\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.arc(pt.X,pt.Y,radius,0,360);\\r\\n            if (this.Canvas.isPointInPath(x,y))  return i;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    //坐标是否在线段上 返回在第几个线段上\\r\\n    this.IsPointInLine=function(x,y)\\r\\n    {\\r\\n        if (!this.LinePoint) return -1;\\r\\n\\r\\n        var lineWidth=5;\\r\\n        if (this.Option) lineWidth+=this.Option.Zoom;\\r\\n        var pixel=GetDevicePixelRatio();\\r\\n        lineWidth*=pixel;\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            var ptStart=item.Start;\\r\\n            var ptEnd=item.End;\\r\\n            this.Canvas.beginPath();\\r\\n            if (ptStart.X==ptEnd.X) //竖线\\r\\n            {\\r\\n                this.Canvas.moveTo(ptStart.X-lineWidth,ptStart.Y);\\r\\n                this.Canvas.lineTo(ptStart.X+lineWidth,ptStart.Y);\\r\\n                this.Canvas.lineTo(ptEnd.X+lineWidth,ptEnd.Y);\\r\\n                this.Canvas.lineTo(ptEnd.X-lineWidth,ptEnd.Y);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.moveTo(ptStart.X,ptStart.Y+lineWidth);\\r\\n                this.Canvas.lineTo(ptStart.X,ptStart.Y-lineWidth);\\r\\n                this.Canvas.lineTo(ptEnd.X,ptEnd.Y-lineWidth);\\r\\n                this.Canvas.lineTo(ptEnd.X,ptEnd.Y+lineWidth);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n                return i;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    //0-10 鼠标对应的点索引   100=鼠标在正个图形上  -1 鼠标不在图形上\\r\\n    this.IsPointIn_XYValue_Line=function(x,y)\\r\\n    {\\r\\n        if (this.Status!=10) return -1;\\r\\n\\r\\n        var value=this.IsPointInXYValue(x,y);\\r\\n        if (value>=0) return value;\\r\\n\\r\\n        value=this.IsPointInLine(x,y);\\r\\n        if (value>=0) return 100;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(ptStart,ptEnd,isDottedline)\\r\\n    {\\r\\n        if (isDottedline) this.Canvas.setLineDash([5,10]);\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        if (isDottedline) this.Canvas.setLineDash([]);\\r\\n    }\\r\\n\\r\\n    this.CreateLineData=function(ptStart,ptEnd)\\r\\n    {\\r\\n        var line={Start:new Point(), End:new Point()};\\r\\n        line.Start.Y=ptStart.Y;\\r\\n        line.Start.X=ptStart.X;\\r\\n        line.End.Y=ptEnd.Y;\\r\\n        line.End.X=ptEnd.X;\\r\\n\\r\\n        return line;\\r\\n    }\\r\\n\\r\\n    //导出成存储格式\\r\\n    this.ExportStorageData=function()\\r\\n    {\\r\\n        var storageData=\\r\\n            {\\r\\n                ClassName:this.ClassName,\\r\\n                Symbol:this.Symbol, Guid:this.Guid, Period:this.Period,Value:[] ,\\r\\n                FrameID:this.Frame.Identify, LineColor:this.LineColor, AreaColor:this.AreaColor,\\r\\n                LineWidth:this.LineWidth, Right:this.Right\\r\\n            };\\r\\n        for(var i in this.Value)\\r\\n        {\\r\\n            var item=this.Value[i];\\r\\n            storageData.Value.push({ XValue:item.XValue, YValue:item.YValue, DateTime:item.DateTime });\\r\\n        }\\r\\n\\r\\n        if (this.Text) storageData.Text=this.Text;  //如果有文本, 也导出\\r\\n        if (this.FontOption) storageData.FontOption=this.FontOption;    //字体也导出\\r\\n\\r\\n        return storageData;\\r\\n    }\\r\\n\\r\\n    this.IsFrameMinSize=function()   //框架是否是最小化模式\\r\\n    {\\r\\n        return this.Frame && this.Frame.IsMinSize;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\nIChartDrawPicture.ColorToRGBA=function(color,opacity)\\r\\n{\\r\\n    var reg = /^(rgb|RGB)/;\\r\\n    if (reg.test(color))\\r\\n    {\\r\\n        var strHex = \\\"#\\\";\\r\\n        var colorArr = color.replace(/(?:\\\\(|\\\\)|rgb|RGB)*/g, \\\"\\\").split(\\\",\\\");    // 把RGB的3个数值变成数组\\r\\n        // 转成16进制\\r\\n        for (var i = 0; i < colorArr.length; i++)\\r\\n        {\\r\\n            var hex = Number(colorArr[i]).toString(16);\\r\\n            if (hex === \\\"0\\\")  hex += hex;\\r\\n            strHex += hex;\\r\\n        }\\r\\n\\r\\n        color=strHex;\\r\\n    }\\r\\n\\r\\n    return \\\"rgba(\\\" + parseInt(\\\"0x\\\" + color.slice(1, 3)) + \\\",\\\" + parseInt(\\\"0x\\\" + color.slice(3, 5)) + \\\",\\\" + parseInt(\\\"0x\\\" + color.slice(5, 7)) + \\\",\\\" + opacity + \\\")\\\";\\r\\n}\\r\\n\\r\\nIChartDrawPicture.ArrayDrawPricture=\\r\\n    [\\r\\n        { Name:\\\"线段\\\", ClassName:'ChartDrawPictureLine',  Create:function() { return new ChartDrawPictureLine(); } },\\r\\n        { Name:\\\"射线\\\", ClassName:'ChartDrawPictureHaflLine',  Create:function() { return new ChartDrawPictureHaflLine(); } },\\r\\n        { Name:\\\"箭头\\\", ClassName:\\\"ChartDrawArrowLine\\\", Create:function() { return new ChartDrawArrowLine(); } },\\r\\n        { Name:\\\"水平线\\\", ClassName:'ChartDrawPictureHorizontalLine',  Create:function() { return new ChartDrawPictureHorizontalLine(); }},\\r\\n        { Name:\\\"趋势线\\\", ClassName:'ChartDrawPictureTrendLine',  Create:function() { return new ChartDrawPictureTrendLine(); }},\\r\\n        { Name:\\\"矩形\\\", ClassName:'ChartDrawPictureRect', Create:function() { return new ChartDrawPictureRect(); }},\\r\\n        { Name:\\\"圆弧线\\\", ClassName:'ChartDrawPictureArc',  Create:function() { return new ChartDrawPictureArc(); }},\\r\\n        { Name:\\\"M头W底\\\", ClassName:'ChartDrawPictureWaveMW',  Create:function() { return new ChartDrawPictureWaveMW(); }},\\r\\n        { Name:\\\"头肩型\\\", ClassName:\\\"ChartDrawHeadShouldersBT\\\", Create:function() { return new ChartDrawHeadShouldersBT(); }},\\r\\n        { Name:\\\"平行线\\\", ClassName:'ChartDrawPictureParallelLines',  Create:function() { return new ChartDrawPictureParallelLines(); }},\\r\\n        { Name:\\\"平行通道\\\", ClassName:'ChartDrawPictureParallelChannel',  Create:function() { return new ChartDrawPictureParallelChannel(); }},\\r\\n        { Name:\\\"价格通道线\\\", ClassName:'ChartDrawPicturePriceChannel',  Create:function() { return new ChartDrawPicturePriceChannel(); }},\\r\\n        { Name:\\\"文本\\\", ClassName:'ChartDrawPictureText', Create:function() { return new ChartDrawPictureText(); }},\\r\\n        { Name:\\\"江恩角度线\\\", ClassName:'ChartDrawPictureGannFan',  Create:function() { return new ChartDrawPictureGannFan(); }},\\r\\n        { Name:\\\"阻速线\\\", ClassName:'ChartDrawPictureResistanceLine',  Create:function() { return new ChartDrawPictureResistanceLine(); }},\\r\\n        { Name:\\\"黄金分割\\\", ClassName:'ChartDrawPictureGoldenSection',  Create:function() { return new ChartDrawPictureGoldenSection(); }},\\r\\n        { Name:\\\"百分比线\\\", ClassName:'ChartDrawPicturePercentage',  Create:function() { return new ChartDrawPicturePercentage(); }},\\r\\n        { Name:\\\"波段线\\\", ClassName:'ChartDrawPictureWaveBand',  Create:function() { return new ChartDrawPictureWaveBand(); }},\\r\\n        { Name:\\\"三角形\\\", ClassName:'ChartDrawPictureTriangle',  Create:function() { return new ChartDrawPictureTriangle(); }},\\r\\n        { Name:\\\"对称角度\\\", ClassName:'ChartDrawPictureSymmetryAngle',  Create:function() { return new ChartDrawPictureSymmetryAngle(); }},\\r\\n        { Name:\\\"圆\\\", ClassName:'ChartDrawPictureCircle',  Create:function() { return new ChartDrawPictureCircle(); }},\\r\\n        { Name:\\\"平行四边形\\\", ClassName:'ChartDrawPictureQuadrangle',  Create:function() { return new ChartDrawPictureQuadrangle(); }},\\r\\n        { Name:\\\"斐波那契周期线\\\", ClassName:'ChartDrawPictureFibonacci',  Create:function() { return new ChartDrawPictureFibonacci(); }},\\r\\n        { Name:\\\"线形回归线\\\", ClassName:\\\"ChartDrawLinearRegression\\\", Create:function() { return new ChartDrawLinearRegression(); } },\\r\\n        { Name:\\\"线形回归带\\\", ClassName:\\\"ChartDrawLinearRegression\\\", Create:function() { return new ChartDrawLinearRegression({ IsShowMaxMinLine:true }); } },\\r\\n        { Name:\\\"延长线形回归带\\\", ClassName:\\\"ChartDrawLinearRegression\\\", Create:function() { return new ChartDrawLinearRegression({ IsShowMaxMinLine:true, IsShowExtendLine:true }); } },\\r\\n        { Name:\\\"尺子\\\", ClassName:\\\"ChartDrawRuler\\\", Create:function() { return new ChartDrawRuler(); } },\\r\\n        { Name:\\\"标价线\\\", ClassName:\\\"ChartDrawPriceLine\\\", Create:function() { return new ChartDrawPriceLine(); } },\\r\\n        { Name:\\\"标价线2\\\", ClassName:\\\"ChartDrawPriceLineV2\\\", Create:function() { return new ChartDrawPriceLineV2(); } },\\r\\n        { Name:\\\"垂直线\\\", ClassName:\\\"ChartDrawVerticalLine\\\", Create:function() { return new ChartDrawVerticalLine(); } },\\r\\n        { Name:\\\"波浪尺\\\", ClassName:\\\"ChartDrawWaveRuler\\\", Create:function() { return new ChartDrawWaveRuler(); } },\\r\\n        { Name:\\\"AB波浪尺\\\", ClassName:\\\"ChartDrawWaveRuler2Point\\\", Create:function() { return new ChartDrawWaveRuler2Point(); } },\\r\\n        { Name:\\\"箱型线\\\", ClassName:\\\"ChartDrawBox\\\", Create:function() { return new ChartDrawBox(); } },\\r\\n        { Name:\\\"2点画图例子\\\", ClassName:\\\"ChartDrawTwoPointDemo\\\", Create:function() { return new ChartDrawTwoPointDemo(); } },\\r\\n        { Name:\\\"3点画图例子\\\", ClassName:\\\"ChartDrawThreePointDemo\\\", Create:function() { return new ChartDrawThreePointDemo(); } },\\r\\n        { Name:\\\"水平线段\\\", ClassName:\\\"ChartDrawHLineSegment\\\", Create:function() { return new ChartDrawHLineSegment();} },\\r\\n        { Name:\\\"平行射线\\\", ClassName:\\\"ChartDrawParallelRaysLines\\\", Create:function() { return new ChartDrawParallelRaysLines();}},\\r\\n        { ClassName:'ChartDrawPictureIconFont',  Create:function() { return new ChartDrawPictureIconFont(); }}\\r\\n\\r\\n    ];\\r\\n\\r\\nIChartDrawPicture.MapIonFont=new Map(\\r\\n    [\\r\\n        [\\\"icon-arrow_up\\\", { Text:'\\\\ue683', Color:'#318757', Family:\\\"iconfont\\\"}],\\r\\n        [\\\"icon-arrow_down\\\", { Text:'\\\\ue681', Color:'#db563e', Family:\\\"iconfont\\\"}],\\r\\n        [\\\"icon-arrow_right\\\", {  Text:'\\\\ue682', Color:'#318757', Family:\\\"iconfont\\\"}],\\r\\n        [\\\"icon-arrow_left\\\", {  Text:'\\\\ue680',Color:'#318757', Family:\\\"iconfont\\\"}]\\r\\n    ]);\\r\\n\\r\\nIChartDrawPicture.GetDrawPictureByName=function(value)\\r\\n{\\r\\n    for(var i in IChartDrawPicture.ArrayDrawPricture)\\r\\n    {\\r\\n        var item=IChartDrawPicture.ArrayDrawPricture[i];\\r\\n        if (item.Name==value) return item;\\r\\n    }\\r\\n\\r\\n    return null;\\r\\n}\\r\\n\\r\\nIChartDrawPicture.GetDrawPictureByClassName=function(value)\\r\\n{\\r\\n    for(var i in IChartDrawPicture.ArrayDrawPricture)\\r\\n    {\\r\\n        var item=IChartDrawPicture.ArrayDrawPricture[i];\\r\\n        if (item.ClassName==value) return item;\\r\\n    }\\r\\n\\r\\n    return null;\\r\\n}\\r\\n\\r\\n//注册一个新的画图工具 {Name:中文名字, ClassName:类名, Create:function()}\\r\\nIChartDrawPicture.RegisterDrawPicture=function(obj)\\r\\n{\\r\\n    if (!obj.Name || !obj.ClassName || !obj.Create) return false;\\r\\n\\r\\n    var item={ Name:obj.Name, ClassName:obj.ClassName, Create:obj.Create };\\r\\n    IChartDrawPicture.ArrayDrawPricture.push(item);\\r\\n\\r\\n    JSConsole.Chart.Log('[IChartDrawPicture.RegisterDrawPicture] registered new draw picture class. item=',item);\\r\\n    return true;\\r\\n}\\r\\n\\r\\n//注册一个新图标 {Name:, Text: , Color:, Family:}\\r\\nIChartDrawPicture.RegisterIonFont=function(obj)\\r\\n{\\r\\n    if (!obj.Name || !obj.Text || !obj.Family) return false;\\r\\n\\r\\n    var isOverwirte=IChartDrawPicture.MapIonFont.has(obj.Name);\\r\\n    IChartDrawPicture.MapIonFont.set(obj.Name, obj);\\r\\n\\r\\n    JSConsole.Chart.Log('[IChartDrawPicture.RegisterIonFont] registered new icon font, obj=, isOverwirte=',obj, isOverwirte);\\r\\n    return true;\\r\\n}\\r\\n\\r\\nIChartDrawPicture.CreateChartDrawPicture=function(obj)    //创建画图工具\\r\\n{\\r\\n    var item=IChartDrawPicture.GetDrawPictureByClassName(obj.ClassName);\\r\\n    if (!item) return null;\\r\\n\\r\\n    var chartDraw=item.Create();\\r\\n\\r\\n    if (obj.Period>=0) chartDraw.Period=obj.Period;\\r\\n    if (obj.Right>=0) chartDraw.Right=obj.Right;\\r\\n    if (obj.Guid) chartDraw.Guid=obj.Guid;\\r\\n    if (obj.Symbol) chartDraw.Symbol=obj.Symbol;\\r\\n    if (obj.Value) chartDraw.Value=obj.Value;\\r\\n    if (obj.Text) chartDraw.Text=obj.Text;\\r\\n    if (obj.LineColor) chartDraw.LineColor=obj.LineColor;\\r\\n    if (obj.AreaColor) chartDraw.AreaColor=obj.AreaColor;\\r\\n    if (obj.FontOption) chartDraw.FontOption=obj.FontOption;\\r\\n    if (obj.Label) chartDraw.Label=obj.Label;\\r\\n    if (obj.LineWidth>0) chartDraw.LineWidth=obj.LineWidth;\\r\\n    if (obj.EnableMove===false) chartDraw.EnableMove=obj.EnableMove;\\r\\n\\r\\n    return chartDraw;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//画图工具-线段\\r\\nfunction ChartDrawPictureLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureLine';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=2) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        /*\\r\\n        if (this.IsSelected)\\r\\n        {\\r\\n            this.Canvas.strokeStyle='rgba(255,0,0,0.5)';\\r\\n            this.Canvas.lineWidth=20 * GetDevicePixelRatio();\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n        */\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-箭头线\\r\\nfunction ChartDrawArrowLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawArrowLine';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.ArrawLineWidth=5;\\r\\n    this.ArrawLength=15;        //三角斜边长度\\r\\n    this.ArrawAngle=35;         //三角斜边一直线夹角\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=2) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n\\r\\n        //计算箭头\\r\\n        var theta=this.ArrawAngle;       //三角斜边一直线夹角\\r\\n        var headlen=this.ArrawLength;    //三角斜边长度\\r\\n        var angle = Math.atan2(ptStart.Y - ptEnd.Y, ptStart.X - ptEnd.X) * 180 / Math.PI,\\r\\n            angle1 = (angle + theta) * Math.PI / 180,\\r\\n            angle2 = (angle - theta) * Math.PI / 180,\\r\\n            topX = headlen * Math.cos(angle1),\\r\\n            topY = headlen * Math.sin(angle1),\\r\\n            botX = headlen * Math.cos(angle2),\\r\\n            botY = headlen * Math.sin(angle2);\\r\\n\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n\\r\\n        var arrowX = ptEnd.X + topX;\\r\\n        var arrowY = ptEnd.Y + topY;\\r\\n        this.Canvas.moveTo(arrowX,arrowY);\\r\\n\\r\\n        this.Canvas.lineTo(ptEnd.X, ptEnd.Y);\\r\\n\\r\\n        arrowX = ptEnd.X + botX;\\r\\n        arrowY = ptEnd.Y + botY;\\r\\n        this.Canvas.lineTo(arrowX,arrowY);\\r\\n\\r\\n        this.Canvas.lineWidth=this.ArrawLineWidth*GetDevicePixelRatio();\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        /*\\r\\n        if (this.IsSelected)\\r\\n        {\\r\\n            this.Canvas.strokeStyle='rgba(255,0,0,0.5)';\\r\\n            this.Canvas.lineWidth=20 * GetDevicePixelRatio();\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n        */\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint([drawPoint[0]]);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-射线\\r\\nfunction ChartDrawPictureHaflLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureHaflLine';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint || drawPoint.length!=2) return;\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(drawPoint[0].X,drawPoint[0].Y);\\r\\n        this.Canvas.lineTo(drawPoint[1].X,drawPoint[1].Y);\\r\\n        var endPoint=this.CalculateExtendLineEndPoint(drawPoint);\\r\\n        this.Canvas.lineTo(endPoint.X,endPoint.Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n// 画图工具-水平线 支持横屏\\r\\nfunction ChartDrawPictureHorizontalLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Super_SetOption=this.SetOption;    //父类函数\\r\\n    this.Super_ExportStorageData=this.ExportStorageData;\\r\\n\\r\\n    this.Label; //{Text:文本, Position: 0=左, 1=右 }\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (this.Super_SetOption) this.Super_SetOption(option);\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.Label) this.Label=option.Label;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ExportStorageData=function()\\r\\n    {\\r\\n        var storageData;\\r\\n        if (this.Super_ExportStorageData)\\r\\n        {\\r\\n            storageData=this.Super_ExportStorageData();\\r\\n            if (this.Label) storageData.Label=this.Label;\\r\\n        }\\r\\n\\r\\n        return storageData;\\r\\n    }\\r\\n\\r\\n    this.PointCount=1;\\r\\n    this.ClassName='ChartDrawPictureHorizontalLine';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint();\\r\\n        if (!drawPoint || drawPoint.length!=1) return;\\r\\n        if (!this.Frame) return;\\r\\n        if (this.Value.length!=1) return;\\r\\n        if (!this.IsYValueInFrame(this.Value[0].YValue)) return null;\\r\\n\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        var left=this.Frame.ChartBorder.GetLeft();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            left=this.Frame.ChartBorder.GetTop();\\r\\n            right=this.Frame.ChartBorder.GetBottom();\\r\\n        }\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.beginPath();\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            this.Canvas.moveTo(drawPoint[0].X,left);\\r\\n            this.Canvas.lineTo(drawPoint[0].X,right);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.moveTo(left,drawPoint[0].Y);\\r\\n            this.Canvas.lineTo(right,drawPoint[0].Y);\\r\\n        }\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:new Point(), End:new Point()};\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            line.Start.X=drawPoint[0].X;\\r\\n            line.Start.Y=left;\\r\\n            line.End.X=drawPoint[0].X;\\r\\n            line.End.Y=right;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            line.Start.X=left;\\r\\n            line.Start.Y=drawPoint[0].Y;\\r\\n            line.End.X=right;\\r\\n            line.End.Y=drawPoint[0].Y;\\r\\n        }\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        //画点\\r\\n        this.DrawPoint(drawPoint);\\r\\n\\r\\n        //显示价格\\r\\n\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.font=this.Font;\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            this.Canvas.textAlign=\\\"left\\\";\\r\\n            this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n            var xText=drawPoint[0].X;\\r\\n            var yText=left;\\r\\n            this.Canvas.translate(xText, yText);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度\\r\\n            var yValue=this.Frame.GetYData(drawPoint[0].X);\\r\\n            var text=yValue.toFixed(2);\\r\\n            if (this.Label)\\r\\n            {\\r\\n                if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);\\r\\n                else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;\\r\\n            }\\r\\n            this.Canvas.fillText(text,0,0);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.textAlign=\\\"left\\\";\\r\\n            this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n            var yValue=this.Frame.GetYData(drawPoint[0].Y);\\r\\n            var text=yValue.toFixed(2);\\r\\n            if (this.Label)\\r\\n            {\\r\\n                if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);\\r\\n                else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;\\r\\n            }\\r\\n            this.Canvas.fillText(text,left,drawPoint[0].Y);\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//趋势线\\r\\nfunction ChartDrawPictureTrendLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureTrendLine';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint || drawPoint.length!=2) return;\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n        var extendLine=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(extendLine.Start.X,extendLine.Start.Y);\\r\\n        this.Canvas.lineTo(extendLine.End.X,extendLine.End.Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//画图工具-矩形\\r\\nfunction ChartDrawPictureRect()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureRect';\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint || drawPoint.length!=2) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(drawPoint[0].X,drawPoint[0].Y,drawPoint[1].X-drawPoint[0].X,drawPoint[1].Y-drawPoint[0].Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        //透明背景\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.fillRect(drawPoint[0].X,drawPoint[0].Y,drawPoint[1].X-drawPoint[0].X,drawPoint[1].Y-drawPoint[0].Y);\\r\\n        this.Canvas.restore();\\r\\n\\r\\n        //画点\\r\\n        this.DrawPoint(drawPoint);\\r\\n    }\\r\\n\\r\\n    //0-10 鼠标对应的点索引   100=鼠标在正个图形上  -1 鼠标不在图形上\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        if (this.IsFrameMinSize()) return -1;\\r\\n        if (!this.Frame || this.Status!=10) return -1;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return -1;\\r\\n\\r\\n        var nIndex=this.IsPointInXYValue(x,y);\\r\\n        if (nIndex>=0) return nIndex;\\r\\n\\r\\n        var aryPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!aryPoint || aryPoint.length!=2) return -1;\\r\\n\\r\\n        //是否在矩形边框上\\r\\n        var linePoint=[ {X:aryPoint[0].X,Y:aryPoint[0].Y},{X:aryPoint[1].X,Y:aryPoint[0].Y}];\\r\\n        if (this.IsPointInLine(linePoint,x,y))\\r\\n            return 100;\\r\\n\\r\\n        linePoint=[ {X:aryPoint[1].X,Y:aryPoint[0].Y},{X:aryPoint[1].X,Y:aryPoint[1].Y}];\\r\\n        if (this.IsPointInLine2(linePoint,x,y))\\r\\n            return 100;\\r\\n\\r\\n        linePoint=[ {X:aryPoint[1].X,Y:aryPoint[1].Y},{X:aryPoint[0].X,Y:aryPoint[1].Y}];\\r\\n        if (this.IsPointInLine(linePoint,x,y))\\r\\n            return 100;\\r\\n\\r\\n        linePoint=[ {X:aryPoint[0].X,Y:aryPoint[1].Y},{X:aryPoint[0].X,Y:aryPoint[0].Y}];\\r\\n        if (this.IsPointInLine2(linePoint,x,y))\\r\\n            return 100;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    //点是否在线段上 水平线段\\r\\n    this.IsPointInLine=function(aryPoint,x,y)\\r\\n    {\\r\\n        var radius=5;\\r\\n        if (this.Option) radius+=this.Option.Zoom;\\r\\n        var pixel=GetDevicePixelRatio();\\r\\n        radius*=pixel;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(aryPoint[0].X,aryPoint[0].Y+radius);\\r\\n        this.Canvas.lineTo(aryPoint[0].X,aryPoint[0].Y-radius);\\r\\n        this.Canvas.lineTo(aryPoint[1].X,aryPoint[1].Y-radius);\\r\\n        this.Canvas.lineTo(aryPoint[1].X,aryPoint[1].Y+radius);\\r\\n        this.Canvas.closePath();\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n            return true;\\r\\n    }\\r\\n\\r\\n    //垂直线段\\r\\n    this.IsPointInLine2=function(aryPoint,x,y)\\r\\n    {\\r\\n        var radius=5;\\r\\n        if (this.Option) radius+=this.Option.Zoom;\\r\\n        var pixel=GetDevicePixelRatio();\\r\\n        radius*=pixel;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(aryPoint[0].X-radius,aryPoint[0].Y);\\r\\n        this.Canvas.lineTo(aryPoint[0].X+radius,aryPoint[0].Y);\\r\\n        this.Canvas.lineTo(aryPoint[1].X+radius,aryPoint[1].Y);\\r\\n        this.Canvas.lineTo(aryPoint[1].X-radius,aryPoint[1].Y);\\r\\n        this.Canvas.closePath();\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n            return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//画图工具-弧形\\r\\nfunction ChartDrawPictureArc()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureArc';\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint();\\r\\n        if (!drawPoint || drawPoint.length!=2) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        //this.Canvas.beginPath();\\r\\n        //this.Canvas.rect(drawPoint[0].X,drawPoint[0].Y,drawPoint[1].X-drawPoint[0].X,drawPoint[1].Y-drawPoint[0].Y);\\r\\n        this.SetLineWidth();\\r\\n        if (drawPoint[0].X < drawPoint[1].X && drawPoint[0].Y > drawPoint[1].Y) // 第一象限\\r\\n        {\\r\\n            var a = drawPoint[1].X - drawPoint[0].X;\\r\\n            var b = drawPoint[0].Y - drawPoint[1].Y;\\r\\n            var step = (a > b) ? 1/a : 1 / b;\\r\\n            var xcenter = drawPoint[0].X;\\r\\n            var ycenter = drawPoint[1].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(drawPoint[0].X, drawPoint[0].Y);\\r\\n            for (var i = 1.5*Math.PI; i < 2*Math.PI; i+=step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+a*Math.cos(i), ycenter+b*Math.sin(i)*-1);\\r\\n            }\\r\\n            for (var j = 0; j <= 0.5*Math.PI; j += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+a*Math.cos(j), ycenter+b*Math.sin(j)*-1);\\r\\n            }\\r\\n        }\\r\\n        else if (drawPoint[0].X > drawPoint[1].X && drawPoint[0].Y > drawPoint[1].Y) // 第二象限\\r\\n        {\\r\\n            var a = drawPoint[0].X - drawPoint[1].X;\\r\\n            var b = drawPoint[0].Y - drawPoint[1].Y;\\r\\n            var step = (a > b) ? 1/a:1/b;\\r\\n            var xcenter = drawPoint[1].X;\\r\\n            var ycenter = drawPoint[0].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(drawPoint[0].X, drawPoint[0].Y);\\r\\n            for (var i = 0; i <= Math.PI; i += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + a*Math.cos(i), ycenter + b*Math.sin(i)*-1);\\r\\n            }\\r\\n        }\\r\\n        else if (drawPoint[0].X > drawPoint[1].X && drawPoint[0].Y < drawPoint[1].Y) // 第三象限\\r\\n        {\\r\\n            var a = drawPoint[0].X - drawPoint[1].X;\\r\\n            var b = drawPoint[1].Y - drawPoint[0].Y;\\r\\n            var step = (a > b) ? 1/a:1/b;\\r\\n            var xcenter = drawPoint[0].X;\\r\\n            var ycenter = drawPoint[1].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(drawPoint[0].X, drawPoint[0].Y);\\r\\n            for (var i = 0.5*Math.PI; i <= 1.5*Math.PI; i += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + a*Math.cos(i), ycenter + b*Math.sin(i)*-1);\\r\\n            }\\r\\n        }\\r\\n        else if (drawPoint[0].X < drawPoint[1].X && drawPoint[0].Y < drawPoint[1].Y) // 第四象限\\r\\n        {\\r\\n            var a = drawPoint[1].X - drawPoint[0].X;\\r\\n            var b = drawPoint[1].Y - drawPoint[0].Y;\\r\\n            var step = (a > b) ? 1/a : 1/b;\\r\\n            var xcenter = drawPoint[1].X;\\r\\n            var ycenter = drawPoint[0].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(drawPoint[0].X, drawPoint[0].Y);\\r\\n            for (var i = Math.PI; i <= 2*Math.PI; i += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+a*Math.cos(i), ycenter + b*Math.sin(i)*-1);\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n        //this.Canvas.closePath();\\r\\n        this.Canvas.restore();\\r\\n\\r\\n        //画点\\r\\n        this.DrawPoint(drawPoint);\\r\\n    }\\r\\n\\r\\n    //0-10 鼠标对应的点索引   100=鼠标在正个图形上  -1 鼠标不在图形上\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        if (this.IsFrameMinSize()) return -1;\\r\\n        if (!this.Frame || this.Status!=10) return -1;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return -1;\\r\\n\\r\\n        //是否在点上\\r\\n        var nIndex=this.IsPointInXYValue(x,y);\\r\\n        if (nIndex>=0) return nIndex;\\r\\n\\r\\n        var aryPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!aryPoint || aryPoint.length!=2) return -1;\\r\\n\\r\\n        //是否在弧线上\\r\\n        var ArcPoint=[ {X:aryPoint[0].X,Y:aryPoint[0].Y},{X:aryPoint[1].X,Y:aryPoint[1].Y}];\\r\\n        if (this.IsPointInArc(ArcPoint, x, y))\\r\\n            return 100;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n    this.IsPointInArc=function(aryPoint,x,y)\\r\\n    {\\r\\n        if (aryPoint.length != 2)\\r\\n            return false;\\r\\n        if (aryPoint[0].X < aryPoint[1].X && aryPoint[0].Y > aryPoint[1].Y) // 第一象限\\r\\n        {\\r\\n            var a = aryPoint[1].X - aryPoint[0].X;\\r\\n            var b = aryPoint[0].Y - aryPoint[1].Y;\\r\\n            var step = (a > b) ? 1/a : 1 / b;\\r\\n            var ainer = a * 0.8;\\r\\n            var biner = b * 0.8;\\r\\n            var stepiner = (ainer > biner) ? 1/ainer : 1/biner;\\r\\n            var xcenter = aryPoint[0].X;\\r\\n            var ycenter = aryPoint[1].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(aryPoint[0].X, aryPoint[0].Y);\\r\\n            for (var i = 1.5*Math.PI; i < 2*Math.PI; i+=step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+a*Math.cos(i), ycenter+b*Math.sin(i)*-1);\\r\\n            }\\r\\n            for (var j = 0; j <= 0.5*Math.PI; j += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+a*Math.cos(j), ycenter+b*Math.sin(j)*-1);\\r\\n            }\\r\\n            for (var k = 0.5*Math.PI; k >= 0; k -= stepiner)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+ainer*Math.cos(k), ycenter + biner*Math.sin(j)*-1);\\r\\n            }\\r\\n            for (var l = 2*Math.PI; l >= 1.5*Math.PI; l -= stepiner)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + ainer*Math.cos(l), ycenter + biner*Math.sin(l)*-1);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n        else if (aryPoint[0].X > aryPoint[1].X && aryPoint[0].Y > aryPoint[1].Y) // 第二象限\\r\\n        {\\r\\n            var a = aryPoint[0].X - aryPoint[1].X;\\r\\n            var b = aryPoint[0].Y - aryPoint[1].Y;\\r\\n            var step = (a > b) ? 1/a:1/b;\\r\\n            var ainer = a * 0.8;\\r\\n            var biner = b * 0.8;\\r\\n            var stepiner = (ainer > biner) ? 1 / ainer : 1 / biner;\\r\\n            var xcenter = aryPoint[1].X;\\r\\n            var ycenter = aryPoint[0].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(aryPoint[0].X, aryPoint[0].Y);\\r\\n            for (var i = 0; i <= Math.PI; i += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + a*Math.cos(i), ycenter + b*Math.sin(i)*-1);\\r\\n            }\\r\\n            for (var j = Math.PI; j >= 0; j -= stepiner)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + ainer * Math.cos(j), ycenter + biner*Math.sin(j)*-1);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n        else if (aryPoint[0].X > aryPoint[1].X && aryPoint[0].Y < aryPoint[1].Y) // 第三象限\\r\\n        {\\r\\n            var a = aryPoint[0].X - aryPoint[1].X;\\r\\n            var b = aryPoint[1].Y - aryPoint[0].Y;\\r\\n            var step = (a > b) ? 1/a:1/b;\\r\\n            var ainer = a * 0.8;\\r\\n            var biner = b * 0.8;\\r\\n            var stepiner = (ainer > biner) ? 1/ainer : 1/biner;\\r\\n            var xcenter = aryPoint[0].X;\\r\\n            var ycenter = aryPoint[1].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(aryPoint[0].X, aryPoint[0].Y);\\r\\n            for (var i = 0.5*Math.PI; i <= 1.5*Math.PI; i += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + a*Math.cos(i), ycenter + b*Math.sin(i)*-1);\\r\\n            }\\r\\n            for (var j = 1.5*Math.PI; j >= 0.5*Math.PI; j -= stepiner)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + ainer * Math.cos(j), ycenter + biner*Math.sin(j)*-1);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n        else if (aryPoint[0].X < aryPoint[1].X && aryPoint[0].Y < aryPoint[1].Y) // 第四象限\\r\\n        {\\r\\n            var a = aryPoint[1].X - aryPoint[0].X;\\r\\n            var b = aryPoint[1].Y - aryPoint[0].Y;\\r\\n            var step = (a > b) ? 1/a : 1/b;\\r\\n            var ainer = a * 0.8;\\r\\n            var biner = b * 0.8;\\r\\n            var stepiner = (ainer > biner) ? 1/ainer : 1/biner;\\r\\n            var xcenter = aryPoint[1].X;\\r\\n            var ycenter = aryPoint[0].Y;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(aryPoint[0].X, aryPoint[0].Y);\\r\\n            for (var i = Math.PI; i <= 2*Math.PI; i += step)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter+a*Math.cos(i), ycenter + b*Math.sin(i)*-1);\\r\\n            }\\r\\n            for (var j = 2*Math.PI; j >= Math.PI; j -= stepiner)\\r\\n            {\\r\\n                this.Canvas.lineTo(xcenter + ainer*Math.cos(j), ycenter + biner*Math.sin(j)*-1);\\r\\n            }\\r\\n            this.Canvas.closePath();\\r\\n        }\\r\\n        if (this.Canvas.isPointInPath(x,y))\\r\\n            return true;\\r\\n        else\\r\\n            return false;\\r\\n\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//M头W底 支持横屏\\r\\nfunction ChartDrawPictureWaveMW()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureWaveMW';\\r\\n    this.PointCount=5;\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        //var points=drawPoint.slice(0);\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.CalculateLines(drawPoint);\\r\\n        this.SetLineWidth();\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n        if (points.length<2) return;\\r\\n\\r\\n        if (this.Status==2)\\r\\n        {\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[0].Y;\\r\\n            line.Start.X=points[0].X;\\r\\n            line.End.Y=points[1].Y;\\r\\n            line.End.X=points[1].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var xMove=points[1].X-points[0].X;\\r\\n            var yMove=points[1].Y-points[0].Y;\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                line.Start.Y=points[1].Y;\\r\\n                line.Start.X=points[1].X;\\r\\n                line.End.Y=points[1].Y+yMove;\\r\\n                line.End.X=points[0].X;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                line.Start.Y=points[1].Y;\\r\\n                line.Start.X=points[1].X;\\r\\n                line.End.Y=points[0].Y;\\r\\n                line.End.X=points[1].X+xMove;\\r\\n            }\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var ptStart=line.End;\\r\\n            var newPt=new Point();\\r\\n            newPt.X=ptStart.X;\\r\\n            newPt.Y=ptStart.Y;\\r\\n            this.Point[2]=newPt;\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=ptStart.Y+yMove;\\r\\n                line.End.X=points[1].X;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=points[1].Y;\\r\\n                line.End.X=ptStart.X+xMove;\\r\\n            }\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var ptStart=line.End;\\r\\n            var newPt=new Point();\\r\\n            newPt.X=ptStart.X;\\r\\n            newPt.Y=ptStart.Y;\\r\\n            this.Point[3]=newPt;\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=ptStart.Y+yMove;\\r\\n                line.End.X=points[0].X;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=points[0].Y;\\r\\n                line.End.X=ptStart.X+xMove;\\r\\n            }\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var ptStart=line.End;\\r\\n            var newPt=new Point();\\r\\n            newPt.X=ptStart.X;\\r\\n            newPt.Y=ptStart.Y;\\r\\n            this.Point[4]=newPt;\\r\\n\\r\\n            this.PointCount=this.Point.length;\\r\\n        }\\r\\n        else if (points.length==5)\\r\\n        {\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[0].Y;\\r\\n            line.Start.X=points[0].X;\\r\\n            line.End.Y=points[1].Y;\\r\\n            line.End.X=points[1].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[1].Y;\\r\\n            line.Start.X=points[1].X;\\r\\n            line.End.Y=points[2].Y;\\r\\n            line.End.X=points[2].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[2].Y;\\r\\n            line.Start.X=points[2].X;\\r\\n            line.End.Y=points[3].Y;\\r\\n            line.End.X=points[3].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[3].Y;\\r\\n            line.Start.X=points[3].X;\\r\\n            line.End.Y=points[4].Y;\\r\\n            line.End.X=points[4].X;\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//头肩 头肩顶(Head and shoulders top)以及头肩底(Head and shoulders bottom)两种形态\\r\\n//支持横屏\\r\\nfunction ChartDrawHeadShouldersBT()\\r\\n{\\r\\n    this.newMethod=ChartDrawPictureWaveMW;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawHeadShouldersBT';\\r\\n\\r\\n    this.CalculateLines_Backup=this.CalculateLines;\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n        if (points.length<2) return;\\r\\n\\r\\n        if (this.Status==2)\\r\\n        {\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[0].Y;\\r\\n            line.Start.X=points[0].X;\\r\\n            line.End.Y=points[1].Y;\\r\\n            line.End.X=points[1].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var xMove=points[1].X-points[0].X;\\r\\n            var yMove=points[1].Y-points[0].Y;\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                line.Start.Y=points[1].Y;\\r\\n                line.Start.X=points[1].X;\\r\\n\\r\\n                line.End.Y=points[1].Y+yMove;\\r\\n                line.End.X=points[0].X-xMove;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                line.Start.Y=points[1].Y;\\r\\n                line.Start.X=points[1].X;\\r\\n                line.End.Y=points[0].Y-yMove;\\r\\n                line.End.X=points[1].X+xMove;\\r\\n            }\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var ptStart=line.End;\\r\\n            var newPt=new Point();\\r\\n            newPt.X=ptStart.X;\\r\\n            newPt.Y=ptStart.Y;\\r\\n            this.Point[2]=newPt;\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=ptStart.Y+yMove;\\r\\n                line.End.X=points[1].X;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=points[1].Y;\\r\\n                line.End.X=ptStart.X+xMove;\\r\\n            }\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var ptStart=line.End;\\r\\n            var newPt=new Point();\\r\\n            newPt.X=ptStart.X;\\r\\n            newPt.Y=ptStart.Y;\\r\\n            this.Point[3]=newPt;\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=ptStart.Y+yMove;\\r\\n                line.End.X=points[0].X;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                line.Start.Y=ptStart.Y;\\r\\n                line.Start.X=ptStart.X;\\r\\n                line.End.Y=points[0].Y;\\r\\n                line.End.X=ptStart.X+xMove;\\r\\n            }\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            var ptStart=line.End;\\r\\n            var newPt=new Point();\\r\\n            newPt.X=ptStart.X;\\r\\n            newPt.Y=ptStart.Y;\\r\\n            this.Point[4]=newPt;\\r\\n\\r\\n            this.PointCount=this.Point.length;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return this.CalculateLines_Backup(points);\\r\\n        }\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//平行线\\r\\nfunction ChartDrawPictureParallelLines()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureParallelLines';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.PointCount=3;\\r\\n    this.LastPoint;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        var points=drawPoint.slice(0);\\r\\n        this.CalculateLines(points);\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n\\r\\n        this.DrawArea();\\r\\n        this.DrawPoint(points);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.SetLastPoint=function(obj)\\r\\n    {\\r\\n        this.LastPoint={X:obj.X,Y:obj.Y};\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        if (this.LinePoint.length!=2) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(this.LinePoint[0].Start.X,this.LinePoint[0].Start.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[0].End.X,this.LinePoint[0].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[1].End.X,this.LinePoint[1].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[1].Start.X,this.LinePoint[1].Start.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            points[2]=pt;\\r\\n        }\\r\\n\\r\\n        if (points.length==2)\\r\\n        {\\r\\n            var linePoint=this.CalculateExtendLinePoint(points[0],points[1]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n        else if (points.length==3)\\r\\n        {\\r\\n            var linePoint=this.CalculateExtendLinePoint(points[0],points[1]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            //计算平行线\\r\\n            var xMove=points[2].X-points[1].X;\\r\\n            var yMove=points[2].Y-points[1].Y;\\r\\n\\r\\n            var ptStart=new Point();\\r\\n            var ptEnd=new Point();\\r\\n            ptStart.X=points[0].X+xMove;\\r\\n            ptStart.Y=points[0].Y+yMove;\\r\\n            ptEnd.X=points[1].X+xMove;\\r\\n            ptEnd.Y=points[1].Y+yMove;\\r\\n            linePoint=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//平行射线\\r\\nfunction ChartDrawParallelRaysLines()\\r\\n{\\r\\n    this.newMethod=ChartDrawPictureParallelLines;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawParallelRaysLines';\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            points[2]=pt;\\r\\n        }\\r\\n\\r\\n        if (points.length==2)\\r\\n        {\\r\\n            var endPoint=this.CalculateExtendLineEndPoint([points[0],points[1]]);\\r\\n            this.LinePoint.push({ Start:points[0], End:endPoint });\\r\\n        }\\r\\n        else if (points.length==3)\\r\\n        {\\r\\n            var endPoint=this.CalculateExtendLineEndPoint([points[0],points[1]]);\\r\\n            this.LinePoint.push({ Start:points[0], End:endPoint });\\r\\n\\r\\n            //计算平行线\\r\\n            var xMove=points[2].X-points[1].X;\\r\\n            var yMove=points[2].Y-points[1].Y;\\r\\n\\r\\n            var ptStart=new Point();\\r\\n            var ptEnd=new Point();\\r\\n            ptStart.X=points[0].X+xMove;\\r\\n            ptStart.Y=points[0].Y+yMove;\\r\\n            ptEnd.X=points[1].X+xMove;\\r\\n            ptEnd.Y=points[1].Y+yMove;\\r\\n            endPoint=this.CalculateExtendLineEndPoint([ptStart,ptEnd]);\\r\\n            this.LinePoint.push({ Start:points[2], End:endPoint });\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//价格通道线\\r\\nfunction ChartDrawPicturePriceChannel()\\r\\n{\\r\\n    this.newMethod=ChartDrawPictureParallelLines;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPicturePriceChannel';\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            points[2]=pt;\\r\\n        }\\r\\n\\r\\n        if (points.length==2)\\r\\n        {\\r\\n            var linePoint=this.CalculateExtendLinePoint(points[0],points[1]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n        else if (points.length==3)\\r\\n        {\\r\\n            var linePoint=this.CalculateExtendLinePoint(points[0],points[1]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            //计算平行线\\r\\n            var xMove=points[2].X-points[1].X;\\r\\n            var yMove=points[2].Y-points[1].Y;\\r\\n\\r\\n            var ptStart=new Point();\\r\\n            var ptEnd=new Point();\\r\\n            ptStart.X=points[0].X+xMove;\\r\\n            ptStart.Y=points[0].Y+yMove;\\r\\n            ptEnd.X=points[1].X+xMove;\\r\\n            ptEnd.Y=points[1].Y+yMove;\\r\\n            linePoint=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            var ptStart=new Point();\\r\\n            var ptEnd=new Point();\\r\\n            ptStart.X=points[0].X-xMove;\\r\\n            ptStart.Y=points[0].Y-yMove;\\r\\n            ptEnd.X=points[1].X-xMove;\\r\\n            ptEnd.Y=points[1].Y-yMove;\\r\\n            linePoint=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        if (this.LinePoint.length!=3) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(this.LinePoint[1].Start.X,this.LinePoint[1].Start.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[1].End.X,this.LinePoint[1].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[2].End.X,this.LinePoint[2].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[2].Start.X,this.LinePoint[2].Start.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n}\\r\\n\\r\\n//平行通道\\r\\nfunction ChartDrawPictureParallelChannel()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureParallelChannel';\\r\\n    this.ChannelWidth=50;\\r\\n    this.AreaColor='rgba(25,25,25,0.4)';\\r\\n    this.LinePoint=[];\\r\\n\\r\\n    //计算需要画的点的坐标\\r\\n    this.CalculateDrawPoint=function()\\r\\n    {\\r\\n        if (this.Status<2) return null;\\r\\n        if(!this.Point.length || !this.Frame) return null;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return null;\\r\\n\\r\\n        var drawPoint=[];\\r\\n        if (this.Status==10)    //完成\\r\\n        {\\r\\n            for(var i=0; i<2; ++i)\\r\\n            {\\r\\n                var item=this.Value[i];\\r\\n                var pt=new Point();\\r\\n                pt.X=this.Frame.GetXFromIndex(item.XValue-data.DataOffset);\\r\\n                pt.Y=this.Frame.GetYFromData(item.YValue);\\r\\n                drawPoint.push(pt);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0; i<this.Point.length; ++i)\\r\\n            {\\r\\n                var item=this.Point[i];\\r\\n                var pt=new Point();\\r\\n                pt.X=item.X;\\r\\n                pt.Y=item.Y;\\r\\n                drawPoint.push(pt);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (drawPoint.length>=2)\\r\\n        {\\r\\n            var linePoint={Start:new Point(), End:new Point() };\\r\\n            linePoint.Start.X=drawPoint[0].X;\\r\\n            linePoint.Start.Y=drawPoint[0].Y;\\r\\n            linePoint.End.X=drawPoint[1].X;\\r\\n            linePoint.End.Y=drawPoint[1].Y;\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            if (drawPoint.length==3 || this.Status==10)\\r\\n            {\\r\\n                var x=linePoint.End.X-linePoint.Start.X;\\r\\n                var y=linePoint.End.Y-linePoint.Start.Y;\\r\\n                var angle=Math.atan(Math.abs(x/y));\\r\\n                var yMove=this.ChannelWidth/Math.sin(angle);\\r\\n\\r\\n                //JSConsole.Chart.Log('[ChartDrawPictureParallelChannel::CalculateDrawPoint]',xMove);\\r\\n\\r\\n                linePoint={Start:new Point(), End:new Point() };\\r\\n                linePoint.Start.X=drawPoint[0].X;\\r\\n                linePoint.Start.Y=drawPoint[0].Y-yMove;\\r\\n                linePoint.End.X=drawPoint[1].X;\\r\\n                linePoint.End.Y=drawPoint[1].Y-yMove;\\r\\n                this.LinePoint.push(linePoint);\\r\\n\\r\\n                var ptCenter=new Point();\\r\\n                ptCenter.X=linePoint.Start.X+(linePoint.End.X-linePoint.Start.X)/2;\\r\\n                ptCenter.Y=linePoint.Start.Y+(linePoint.End.Y-linePoint.Start.Y)/2;\\r\\n                drawPoint[3]=ptCenter;\\r\\n\\r\\n                this.Point[2]=ptCenter;\\r\\n                var xValue=parseInt(this.Frame.GetXData(ptCenter.X))+data.DataOffset;\\r\\n                var yValue=this.Frame.GetYData(ptCenter.Y);\\r\\n                this.Value[2]={XValue:xValue,YValue:yValue};\\r\\n                this.PointCount=this.Point.length;  //完成以后是3个点\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return drawPoint;\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(ptStart,ptEnd)\\r\\n    {\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function(pt,pt2,pt3,pt4)\\r\\n    {\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(pt.X,pt.Y);\\r\\n        this.Canvas.lineTo(pt2.X,pt2.Y);\\r\\n        this.Canvas.lineTo(pt3.X,pt3.Y);\\r\\n        this.Canvas.lineTo(pt4.X,pt4.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint();\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n\\r\\n        if (this.LinePoint.length==2)\\r\\n        {\\r\\n            this.DrawArea(this.LinePoint[0].Start,this.LinePoint[0].End,this.LinePoint[1].End,this.LinePoint[1].Start);\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n    }\\r\\n\\r\\n    //xStep,yStep 移动的偏移量\\r\\n    this.Move=function(xStep,yStep)\\r\\n    {\\r\\n        if (this.Status!=20) return fasle;\\r\\n        if (!this.Frame) return false;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return false;\\r\\n\\r\\n        if (this.MovePointIndex==100)    //整体移动\\r\\n        {\\r\\n            for(var i in this.Point)\\r\\n            {\\r\\n                this.Point[i].X+=xStep;\\r\\n                this.Point[i].Y+=yStep;\\r\\n            }\\r\\n        }\\r\\n        else if (this.MovePointIndex==0 || this.MovePointIndex==1)\\r\\n        {\\r\\n            if (this.MovePointIndex<this.Point.length)\\r\\n            {\\r\\n                this.Point[this.MovePointIndex].X+=xStep;\\r\\n                this.Point[this.MovePointIndex].Y+=yStep;\\r\\n            }\\r\\n        }\\r\\n        else if (this.MovePointIndex==2)    //宽度的点要计算\\r\\n        {\\r\\n            this.Point[this.MovePointIndex].X+=xStep;\\r\\n            this.Point[this.MovePointIndex].Y+=yStep;\\r\\n\\r\\n            var x=this.Point[1].X-this.Point[0].X;\\r\\n            var y=this.Point[1].Y-this.Point[0].Y;\\r\\n            var angle=Math.atan(Math.abs(x/y));\\r\\n            var yMove=this.ChannelWidth/Math.sin(angle)-yStep;\\r\\n            this.ChannelWidth=Math.sin(angle)*yMove;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //0-10 鼠标对应的点索引   100=鼠标在正个图形上  -1 鼠标不在图形上\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        if (!this.Frame || this.Status!=10) return -1;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return -1;\\r\\n\\r\\n        //是否在点上\\r\\n        for(var i=0;i<this.Value.length; ++i)\\r\\n        {\\r\\n            var item=this.Value[i];\\r\\n            var pt=new Point();\\r\\n            if (i<2)\\r\\n            {\\r\\n                pt.X=this.Frame.GetXFromIndex(item.XValue-data.DataOffset);\\r\\n                pt.Y=this.Frame.GetYFromData(item.YValue);\\r\\n            }\\r\\n            else    //第3个点使用实际坐标\\r\\n            {\\r\\n                if (i>=this.Point.length) continue;\\r\\n                pt.X=this.Point[i].X;\\r\\n                pt.Y=this.Point[i].Y;\\r\\n            }\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.arc(pt.X,pt.Y,5,0,360);\\r\\n            if (this.Canvas.isPointInPath(x,y))  return i;\\r\\n        }\\r\\n\\r\\n        //是否在线段上\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            var ptStart=item.Start;\\r\\n            var ptEnd=item.End;\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ptStart.X,ptStart.Y+5);\\r\\n            this.Canvas.lineTo(ptStart.X,ptStart.Y-5);\\r\\n            this.Canvas.lineTo(ptEnd.X,ptEnd.Y-5);\\r\\n            this.Canvas.lineTo(ptEnd.X,ptEnd.Y+5);\\r\\n            this.Canvas.closePath();\\r\\n            if (this.Canvas.isPointInPath(x,y))\\r\\n                return 100;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n}\\r\\n\\r\\n//文本\\r\\nfunction ChartDrawPictureText()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureText';\\r\\n    this.Text='文本';\\r\\n    this.PointCount=1;\\r\\n    this.FontOption={ Family:'微软雅黑', Size:20, Weight:null, Style:null };    //Weight(bold 粗体), Style(italic)\\r\\n    //矢量图片\\r\\n    //this.Text=\\\"\\\\ue606\\\";\\r\\n    //this.FontOption={ Family:'iconfont', Size:20, Weight:null, Style:null };    //Weight(bold 粗体), Style(italic)\\r\\n    this.TextRect=null;   //文字区域\\r\\n    this.IsInitialized=false;   //是否初始化了\\r\\n    this.SettingMenu;\\r\\n    this.HQChart;\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (!option) return;\\r\\n\\r\\n        if (option.LineColor) this.LineColor=option.LineColor;\\r\\n        if (option.Text) this.Text=option.Text;\\r\\n        if (option.FontOption) this.FontOption=option.FontOption;\\r\\n    }\\r\\n\\r\\n    this.Draw=function(textFont)\\r\\n    {\\r\\n        this.TextRect=null;\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint || drawPoint.length!=1) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"center\\\";\\r\\n        this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n        this.Canvas.font=this.GetTextFont();\\r\\n        this.Canvas.fillText(this.Text,drawPoint[0].X,drawPoint[0].Y);\\r\\n        var textWidth=this.Canvas.measureText(this.Text).width;\\r\\n\\r\\n        var textHeight=this.FontOption.Size*GetDevicePixelRatio();\\r\\n        this.TextRect={};\\r\\n        this.TextRect.Left=drawPoint[0].X-textWidth/2;\\r\\n        this.TextRect.Top=drawPoint[0].Y-textHeight;\\r\\n        this.TextRect.Width=textWidth;\\r\\n        this.TextRect.Height=textHeight\\r\\n        //this.Canvas.strokeRect(this.TextRect.Left,this.TextRect.Top,this.TextRect.Width,this.TextRect.Height);\\r\\n        this.Canvas.restore();\\r\\n\\r\\n        if (this.IsInitialized===false)\\r\\n        {\\r\\n            this.SetTextOption();\\r\\n            this.IsInitialized=true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //根据设置动态生成字体\\r\\n    this.GetTextFont=function()\\r\\n    {\\r\\n        const defaultFont=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n        if (!this.FontOption || !this.FontOption.Family || this.FontOption.Size<=0) return defaultFont;\\r\\n\\r\\n        var font='';\\r\\n        if (this.FontOption.Color) font+=this.FontOption.Color+' ';\\r\\n        if (this.FontOption.Style) font+=this.FontOption.Style+' ';\\r\\n        if (this.FontOption.Weight) font+=this.FontOption.Weight+' ';\\r\\n        if (this.FontOption.Size>=0) font+=this.FontOption.Size*GetDevicePixelRatio()+'px ';\\r\\n        font+=this.FontOption.Family;\\r\\n\\r\\n        return font;\\r\\n    }\\r\\n\\r\\n    this.SetTextOption=function()\\r\\n    {\\r\\n        JSConsole.Chart.Log('[ChartDrawPictureText::SetTextOption]');\\r\\n        //创建div设置窗口\\r\\n        if (!this.SettingMenu) this.SettingMenu=new ChartPictureTextSettingMenu(this.Frame.ChartBorder.UIElement.parentNode);\\r\\n\\r\\n        this.SettingMenu.ChartPicture=this;\\r\\n        this.SettingMenu.HQChart=this.HQChart;\\r\\n        this.SettingMenu.Position={Left:this.TextRect.Left+this.TextRect.Width,Top:this.TextRect.Top};\\r\\n        this.SettingMenu.DoModal();\\r\\n    }\\r\\n\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        if (!this.Frame || this.Status!=10) return -1;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return -1;\\r\\n        if (!this.TextRect) return -1;\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.TextRect.Left,this.TextRect.Top,this.TextRect.Width,this.TextRect.Height);\\r\\n        if (this.Canvas.isPointInPath(x,y)) return 100;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n}\\r\\n\\r\\n//iconfont 图片\\r\\nfunction ChartDrawPictureIconFont()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureIconFont';\\r\\n    this.PointCount=1;\\r\\n    //矢量图片\\r\\n    this.Text=\\\"\\\\ue606\\\";\\r\\n    this.FontOption={ Family:'iconfont', Size:24};    //Weight(bold 粗体), Style(italic)\\r\\n    this.TextRect=null;         //文字区域\\r\\n    this.SettingMenu;\\r\\n    this.Angle=0;   //旋转角度\\r\\n\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (!option) return;\\r\\n\\r\\n        if (option.LineColor) this.LineColor=option.LineColor;\\r\\n        if (option.FontOption && option.FontOption.Size>0) this.FontOption.Size=option.FontOption.Size;\\r\\n        if (IFrameSplitOperator.IsNumber(option.Angle)) this.Angle=option.Angle;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.TextRect=null;\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint || drawPoint.length!=1) return;\\r\\n        var font=this.GetTextFont();\\r\\n        if (!font) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        var pixel=GetDevicePixelRatio();\\r\\n\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"center\\\";\\r\\n        this.Canvas.textBaseline=\\\"middle\\\";\\r\\n        this.Canvas.font=font;\\r\\n\\r\\n        if (isHScreen)\\r\\n        {\\r\\n            this.Canvas.translate(drawPoint[0].X, drawPoint[0].Y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            this.Canvas.fillText(this.Text,0,0);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.Angle!=0)\\r\\n            {\\r\\n                this.Canvas.translate(drawPoint[0].X, drawPoint[0].Y);\\r\\n                this.Canvas.rotate(this.Angle*(Math.PI / 180));\\r\\n                this.Canvas.fillText(this.Text,0,0);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.Canvas.fillText(this.Text,drawPoint[0].X,drawPoint[0].Y);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var textWidth=this.Canvas.measureText(this.Text).width;\\r\\n        this.TextRect={};\\r\\n        this.TextRect.Left=drawPoint[0].X-textWidth/2;\\r\\n        this.TextRect.Top=drawPoint[0].Y-this.FontOption.Size*pixel;\\r\\n        this.TextRect.Width=textWidth;\\r\\n        this.TextRect.Height=this.FontOption.Size*pixel;\\r\\n\\r\\n        //this.Canvas.strokeRect(this.TextRect.Left,this.TextRect.Top,this.TextRect.Width,this.TextRect.Height);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //根据设置动态生成字体\\r\\n    this.GetTextFont=function()\\r\\n    {\\r\\n        if (!this.FontOption || !this.FontOption.Family || this.FontOption.Size<=0) return null;\\r\\n\\r\\n        var font='';\\r\\n        if (this.FontOption.Size>=0) font+=this.FontOption.Size*GetDevicePixelRatio()+'px ';\\r\\n        font+=this.FontOption.Family;\\r\\n\\r\\n        return font;\\r\\n    }\\r\\n\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        if (!this.Frame || this.Status!=10) return -1;\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return -1;\\r\\n        if (!this.TextRect) return -1;\\r\\n\\r\\n        var offset=0;\\r\\n        if (this.Option && this.Option.Zoom>=1)\\r\\n        {\\r\\n            offset=this.Option.Zoom*GetDevicePixelRatio();\\r\\n        }\\r\\n\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.TextRect.Left-offset,this.TextRect.Top-offset,this.TextRect.Width+offset*2,this.TextRect.Height+offset*2);\\r\\n        if (this.Canvas.isPointInPath(x,y)) return 100;\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n}\\r\\n\\r\\n//江恩角度线（Gann Fan），亦又称作甘氏线的\\r\\nfunction ChartDrawPictureGannFan()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureGannFan';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.LinePoint=[];\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=2) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n        var quadrant=this.GetQuadrant(drawPoint[0],drawPoint[1]);\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        if (quadrant===1 || quadrant===4)\\r\\n        {\\r\\n            this.CalculateLines(drawPoint[0],drawPoint[1],quadrant);\\r\\n            this.DrawArea();\\r\\n\\r\\n            for(var i in this.LinePoint)\\r\\n            {\\r\\n                var item=this.LinePoint[i];\\r\\n                this.DrawLine(item.Start,item.End,item.IsDottedLine);\\r\\n            }\\r\\n\\r\\n            for(var i in this.LinePoint)\\r\\n            {\\r\\n                var item =this.LinePoint[i];\\r\\n                if (item.Text && item.PtEnd) this.DrawTitle(item.PtEnd,item.Text);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.DrawLine(drawPoint[0],drawPoint[1],false);\\r\\n        }\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        this.Canvas.restore();\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n    }\\r\\n\\r\\n    //获取在第几象限\\r\\n    this.GetQuadrant=function(ptStart,ptEnd)\\r\\n    {\\r\\n        if (ptStart.X<ptEnd.X && ptStart.Y>ptEnd.Y) return 1;\\r\\n        else if (ptStart.X<ptEnd.X && ptStart.Y>ptEnd.Y) return 2;\\r\\n        else if (ptStart.X < ptEnd.X && ptStart.Y< ptEnd.Y) return 4;\\r\\n        else return 3;\\r\\n    }\\r\\n\\r\\n    //isDotline 是否是虚线\\r\\n    this.DrawLine=function(ptStart,ptEnd,isDottedline)\\r\\n    {\\r\\n        if (isDottedline) this.Canvas.setLineDash([5,10]);\\r\\n\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n\\r\\n        if (isDottedline) this.Canvas.setLineDash([]);\\r\\n    }\\r\\n\\r\\n    this.DrawTitle=function(pt,text)\\r\\n    {\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillText(text,pt.X,pt.Y);\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        var lineStart=null,lineEnd=null;\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            if (item.Text=='1:8') lineStart=this.LinePoint[i];\\r\\n            else if (item.Text=='8:1') lineEnd=this.LinePoint[i];\\r\\n        }\\r\\n\\r\\n        if (!lineStart || !lineEnd) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(lineStart.End.X,lineStart.End.Y);\\r\\n        this.Canvas.lineTo(lineStart.Start.X,lineStart.Start.Y);\\r\\n        this.Canvas.lineTo(lineEnd.End.X,lineEnd.End.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    //计算线段\\r\\n    this.CalculateLines=function(ptStart,ptEnd,quadrant)\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var top=this.Frame.ChartBorder.GetTopEx();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        var bottom=this.Frame.ChartBorder.GetBottom();\\r\\n\\r\\n        const SPLIT_LINE_VALUE=[0.5, 1.0/3, 0.25, 0.125, 2.0/3];\\r\\n        const SPLIT_LINE_X_TITLE=[\\\"1:2\\\",\\\"1:3\\\",\\\"1:4\\\",\\\"1:8\\\",\\\"2:3\\\"];\\r\\n        const SPLIT_LINE_Y_TITLE=[\\\"2:1\\\",\\\"3:1\\\",\\\"4:1\\\",\\\"8:1\\\",\\\"3:2\\\"];\\r\\n        var ptLineStart=new Point();\\r\\n        var ptLineEnd=new Point();\\r\\n        ptLineStart.X=ptStart.X;\\r\\n        ptLineStart.Y=ptStart.Y;\\r\\n        ptLineEnd.X=ptEnd.X;\\r\\n        ptLineEnd.Y=ptEnd.Y;\\r\\n        var lineWidth=Math.abs(ptStart.X-ptEnd.X);\\r\\n        var lineHeight=Math.abs(ptStart.Y-ptEnd.Y);\\r\\n        if (quadrant===1)\\r\\n        {\\r\\n            /*\\r\\n            var line={Start:ptLineStart, End:new Point(), IsDottedLine:false};\\r\\n            line.End.X=ptStart.X;\\r\\n            line.End.Y=top;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            line={Start:ptLineStart, End:new Point(), IsDottedLine:false};\\r\\n            line.End.X=right;\\r\\n            line.End.Y=ptStart.Y;\\r\\n            this.LinePoint.push(line);\\r\\n            */\\r\\n\\r\\n            var extendLine=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            var line={Start:ptLineStart, End:extendLine.Start, IsDottedLine:false,PtEnd:ptLineEnd, Text:'1:1'};\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            for(var i in SPLIT_LINE_VALUE)\\r\\n            {\\r\\n                if (lineWidth>5)\\r\\n                {\\r\\n                    line={Start:ptLineStart, End:null, IsDottedLine:false,PtEnd:new Point(),Text:SPLIT_LINE_X_TITLE[i]};\\r\\n                    line.PtEnd.Y=ptEnd.Y;\\r\\n                    line.PtEnd.X=ptStart.X+lineWidth*SPLIT_LINE_VALUE[i];\\r\\n                    var extendLine=this.CalculateExtendLinePoint(line.Start,line.PtEnd);\\r\\n                    line.End=extendLine.Start;\\r\\n                    this.LinePoint.push(line);\\r\\n                }\\r\\n                if (lineHeight>5)\\r\\n                {\\r\\n                    line={Start:ptLineStart, End:null, IsDottedLine:false,PtEnd:new Point(), Text:SPLIT_LINE_Y_TITLE[i]};\\r\\n                    line.PtEnd.Y=ptStart.Y-lineHeight*SPLIT_LINE_VALUE[i];\\r\\n                    line.PtEnd.X=ptEnd.X;\\r\\n                    var extendLine=this.CalculateExtendLinePoint(line.Start,line.PtEnd);\\r\\n                    line.End=extendLine.Start;\\r\\n                    this.LinePoint.push(line);\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n        else if (quadrant==4)\\r\\n        {\\r\\n            /*\\r\\n            var line={Start:ptLineStart, End:new Point(), IsDottedLine:false};\\r\\n            line.End.X=ptStart.X;\\r\\n            line.End.Y=bottom;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            line={Start:ptLineStart, End:new Point(), IsDottedLine:false};\\r\\n            line.End.X=right;\\r\\n            line.End.Y=ptStart.Y;\\r\\n            this.LinePoint.push(line);\\r\\n            */\\r\\n\\r\\n            var extendLine=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            var line={Start:ptLineStart, End:extendLine.End, IsDottedLine:false,PtEnd:ptLineEnd, Text:'1:1'};\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            for(var i in SPLIT_LINE_VALUE)\\r\\n            {\\r\\n                if (lineWidth>5)\\r\\n                {\\r\\n                    line={Start:ptLineStart, End:null, IsDottedLine:false,PtEnd:new Point(),Text:SPLIT_LINE_X_TITLE[i]};\\r\\n                    line.PtEnd.Y=ptEnd.Y;\\r\\n                    line.PtEnd.X=ptStart.X+lineWidth*SPLIT_LINE_VALUE[i];\\r\\n                    var extendLine=this.CalculateExtendLinePoint(line.Start,line.PtEnd);\\r\\n                    line.End=extendLine.End;\\r\\n                    this.LinePoint.push(line);\\r\\n                }\\r\\n                if (lineHeight>5)\\r\\n                {\\r\\n                    line={Start:ptLineStart, End:null, IsDottedLine:false,PtEnd:new Point(), Text:SPLIT_LINE_Y_TITLE[i]};\\r\\n                    line.PtEnd.Y=ptStart.Y+lineHeight*SPLIT_LINE_VALUE[i];\\r\\n                    line.PtEnd.X=ptEnd.X;\\r\\n                    var extendLine=this.CalculateExtendLinePoint(line.Start,line.PtEnd);\\r\\n                    line.End=extendLine.End;\\r\\n                    this.LinePoint.push(line);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else return false;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n//阻速线  （高 3等份）\\r\\nfunction ChartDrawPictureResistanceLine()\\r\\n{\\r\\n    this.newMethod=ChartDrawPictureGannFan;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureResistanceLine';\\r\\n\\r\\n    //计算线段\\r\\n    this.CalculateLines=function(ptStart,ptEnd,quadrant)\\r\\n    {\\r\\n        if (!this.Frame) return false;\\r\\n        var top=this.Frame.ChartBorder.GetTopEx();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        var bottom=this.Frame.ChartBorder.GetBottom();\\r\\n\\r\\n        const SPLIT_LINE_VALUE=[1.0/3, 2.0/3];\\r\\n        const SPLIT_LINE_Y_TITLE=[\\\"3:1\\\",\\\"3:2\\\"];\\r\\n        var ptLineStart=new Point();\\r\\n        var ptLineEnd=new Point();\\r\\n        ptLineStart.X=ptStart.X;\\r\\n        ptLineStart.Y=ptStart.Y;\\r\\n        ptLineEnd.X=ptEnd.X;\\r\\n        ptLineEnd.Y=ptEnd.Y;\\r\\n        var lineWidth=Math.abs(ptStart.X-ptEnd.X);\\r\\n        var lineHeight=Math.abs(ptStart.Y-ptEnd.Y);\\r\\n        if (quadrant===1)\\r\\n        {\\r\\n            var extendLine=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            var line={Start:ptLineStart, End:extendLine.Start, IsDottedLine:false,PtEnd:ptLineEnd, Text:'1:1'};\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            for(var i in SPLIT_LINE_VALUE)\\r\\n            {\\r\\n                if (lineHeight>5)\\r\\n                {\\r\\n                    line={Start:ptLineStart, End:null, IsDottedLine:false,PtEnd:new Point(), Text:SPLIT_LINE_Y_TITLE[i]};\\r\\n                    line.PtEnd.Y=ptStart.Y-lineHeight*SPLIT_LINE_VALUE[i];\\r\\n                    line.PtEnd.X=ptEnd.X;\\r\\n                    var extendLine=this.CalculateExtendLinePoint(line.Start,line.PtEnd);\\r\\n                    line.End=extendLine.Start;\\r\\n                    this.LinePoint.push(line);\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n        else if (quadrant==4)\\r\\n        {\\r\\n            var extendLine=this.CalculateExtendLinePoint(ptStart,ptEnd);\\r\\n            var line={Start:ptLineStart, End:extendLine.End, IsDottedLine:false,PtEnd:ptLineEnd, Text:'1:1'};\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            for(var i in SPLIT_LINE_VALUE)\\r\\n            {\\r\\n                if (lineHeight>5)\\r\\n                {\\r\\n                    line={Start:ptLineStart, End:null, IsDottedLine:false,PtEnd:new Point(), Text:SPLIT_LINE_Y_TITLE[i]};\\r\\n                    line.PtEnd.Y=ptStart.Y+lineHeight*SPLIT_LINE_VALUE[i];\\r\\n                    line.PtEnd.X=ptEnd.X;\\r\\n                    var extendLine=this.CalculateExtendLinePoint(line.Start,line.PtEnd);\\r\\n                    line.End=extendLine.End;\\r\\n                    this.LinePoint.push(line);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else return false;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        var lineStart=null,lineEnd=null;\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            if (item.Text=='1:1') lineStart=this.LinePoint[i];\\r\\n            else if (item.Text=='3:1') lineEnd=this.LinePoint[i];\\r\\n        }\\r\\n\\r\\n        if (!lineStart || !lineEnd) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(lineStart.End.X,lineStart.End.Y);\\r\\n        this.Canvas.lineTo(lineStart.Start.X,lineStart.Start.Y);\\r\\n        this.Canvas.lineTo(lineEnd.End.X,lineEnd.End.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n}\\r\\n\\r\\n//黄金分割线\\r\\nfunction ChartDrawPictureGoldenSection()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureGoldenSectionLine';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.Font=14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n\\r\\n    this.GetSectionData=function()\\r\\n    {\\r\\n        const GOLDEN_SECTION_DATA= [0,0.236,0.382,0.5,0.618,0.80,1,1.236,1.382,1.5,1.618,1.8,2];\\r\\n        return GOLDEN_SECTION_DATA;\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint();\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=2) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n\\r\\n        this.CalculateLines(drawPoint[0],drawPoint[1]);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End,item.IsDottedLine);\\r\\n        }\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item =this.LinePoint[i];\\r\\n            if (item.Text) this.DrawTitle(item.Start,item.Text);\\r\\n        }\\r\\n\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.Canvas.restore();\\r\\n\\r\\n    }\\r\\n\\r\\n    this.CalculateHSCreenLines=function(ptStart,ptEnd)\\r\\n    {\\r\\n        var sectionData=this.GetSectionData();\\r\\n        var left=this.Frame.ChartBorder.GetTop();\\r\\n        var right=this.Frame.ChartBorder.GetBottom();\\r\\n        var lineHeight=ptStart.X-ptEnd.X;\\r\\n\\r\\n        for(var i=0;i<sectionData.length;++i)\\r\\n        {\\r\\n            var yMove=lineHeight*sectionData[i];\\r\\n\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.X=ptStart.X-yMove;\\r\\n            line.Start.Y=left;\\r\\n            line.End.X=ptStart.X-yMove;\\r\\n            line.End.Y=right;\\r\\n\\r\\n            var text='';\\r\\n            if (i==0) text='Base '\\r\\n            else text=(sectionData[i]*100).toFixed(2)+'% ';\\r\\n\\r\\n            var yValue=this.Frame.GetYData(line.Start.Y);\\r\\n            text+=yValue.toFixed(2);\\r\\n\\r\\n            line.Text=text;\\r\\n\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(ptStart,ptEnd)\\r\\n    {\\r\\n        if (this.Frame.IsHScreen)\\r\\n        {\\r\\n            this.CalculateHSCreenLines(ptStart,ptEnd);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var sectionData=this.GetSectionData();\\r\\n        var left=this.Frame.ChartBorder.GetLeft();\\r\\n        var right=this.Frame.ChartBorder.GetRight();\\r\\n        var lineHeight=ptStart.Y-ptEnd.Y;\\r\\n        for(var i=0;i<sectionData.length;++i)\\r\\n        {\\r\\n            var yMove=lineHeight*sectionData[i];\\r\\n\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=ptStart.Y-yMove;\\r\\n            line.Start.X=left;\\r\\n            line.End.Y=ptStart.Y-yMove;\\r\\n            line.End.X=right;\\r\\n\\r\\n            var text='';\\r\\n            if (i==0) text='Base '\\r\\n            else text=(sectionData[i]*100).toFixed(2)+'% ';\\r\\n\\r\\n            var yValue=this.Frame.GetYData(line.Start.Y);\\r\\n            text+=yValue.toFixed(2);\\r\\n\\r\\n            line.Text=text;\\r\\n\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawLine=function(ptStart,ptEnd)\\r\\n    {\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n    }\\r\\n\\r\\n    this.DrawTitle=function(pt,text)\\r\\n    {\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n\\r\\n        if (this.Frame.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.translate(pt.X,pt.Y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n            this.Canvas.fillText(text,0,0);\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillText(text,pt.X,pt.Y);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//百分比线\\r\\nfunction ChartDrawPicturePercentage()\\r\\n{\\r\\n    this.newMethod=ChartDrawPictureGoldenSection;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPicturePercentage';\\r\\n\\r\\n    this.GetSectionData=function()\\r\\n    {\\r\\n        const GOLDEN_SECTION_DATA= [0, 0.25, 0.333, 0.50, 1];\\r\\n        return GOLDEN_SECTION_DATA;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//波段线\\r\\nfunction ChartDrawPictureWaveBand()\\r\\n{\\r\\n    this.newMethod=ChartDrawPictureGoldenSection;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureWaveBand';\\r\\n\\r\\n    this.GetSectionData=function()\\r\\n    {\\r\\n        const GOLDEN_SECTION_DATA= [0,0.125, 0.25, 0.375, 0.50, 0.625, 0.75, 0.875,1];\\r\\n        return GOLDEN_SECTION_DATA;\\r\\n    }\\r\\n}\\r\\n\\r\\n//三角形\\r\\nfunction ChartDrawPictureTriangle()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureTriangle';\\r\\n    this.PointCount=3;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.LastPoint;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        var points=drawPoint.slice(0);\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.CalculateLines(points);\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n\\r\\n        this.DrawArea(points);\\r\\n        this.DrawPoint(points); //画点\\r\\n        this.DrawTitle(points);\\r\\n\\r\\n        this.Canvas.restore();\\r\\n\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function(points)\\r\\n    {\\r\\n        if (points.length!=3) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(points[0].X,points[0].Y);\\r\\n        this.Canvas.lineTo(points[1].X,points[1].Y);\\r\\n        this.Canvas.lineTo(points[2].X,points[2].Y);\\r\\n        this.Canvas.lineTo(points[0].X,points[0].Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    //显示角度数据\\r\\n    this.DrawTitle=function(points)\\r\\n    {\\r\\n        if (this.Status!=10) return;   //拖拽完成以后才显示角度数据\\r\\n\\r\\n        //输出3个点的角度\\r\\n        /*\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillText('∠60',points[0].X,points[0].Y);\\r\\n        */\\r\\n    }\\r\\n\\r\\n    this.SetLastPoint=function(obj)\\r\\n    {\\r\\n        this.LastPoint={X:obj.X,Y:obj.Y};\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            points[2]=pt;\\r\\n        }\\r\\n\\r\\n        if (points.length===2)\\r\\n        {\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[0].Y;\\r\\n            line.Start.X=points[0].X;\\r\\n            line.End.Y=points[1].Y;\\r\\n            line.End.X=points[1].X;\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n        else if (points.length===3)\\r\\n        {\\r\\n            var line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[0].Y;\\r\\n            line.Start.X=points[0].X;\\r\\n            line.End.Y=points[1].Y;\\r\\n            line.End.X=points[1].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[1].Y;\\r\\n            line.Start.X=points[1].X;\\r\\n            line.End.Y=points[2].Y;\\r\\n            line.End.X=points[2].X;\\r\\n            this.LinePoint.push(line);\\r\\n\\r\\n            line={Start:new Point(), End:new Point()};\\r\\n            line.Start.Y=points[2].Y;\\r\\n            line.Start.X=points[2].X;\\r\\n            line.End.Y=points[0].Y;\\r\\n            line.End.X=points[0].X;\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//对称角度\\r\\nfunction ChartDrawPictureSymmetryAngle()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureSymmetryAngle';\\r\\n    this.PointCount=2;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        //var points=drawPoint.slice(0);\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.CalculateLines(drawPoint);\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n        this.DrawArea();\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.DrawTitle(drawPoint);\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (points.length!=2) return;\\r\\n        if (!this.Frame) return;\\r\\n\\r\\n        var line={Start:new Point(), End:new Point()};\\r\\n        line.Start.Y=points[0].Y;\\r\\n        line.Start.X=points[0].X;\\r\\n        line.End.Y=points[1].Y;\\r\\n        line.End.X=points[1].X;\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        line={Start:new Point(), End:new Point()};\\r\\n        line.Start.Y=points[0].Y;\\r\\n        line.Start.X=points[0].X;\\r\\n        line.End.Y=points[1].Y;\\r\\n        line.End.X=points[0].X;\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        var xMove=points[0].X-points[1].X;\\r\\n        line={Start:new Point(), End:new Point()};\\r\\n        line.Start.Y=points[0].Y;\\r\\n        line.Start.X=points[0].X;\\r\\n        line.End.Y=points[1].Y;\\r\\n        line.End.X=points[0].X+xMove;\\r\\n        this.LinePoint.push(line);\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        if (this.LinePoint.length!=3) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(this.LinePoint[0].Start.X,this.LinePoint[0].Start.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[0].End.X,this.LinePoint[0].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[2].End.X,this.LinePoint[2].End.Y);\\r\\n        this.Canvas.moveTo(this.LinePoint[0].Start.X,this.LinePoint[0].Start.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    //显示角度数据\\r\\n    this.DrawTitle=function(points)\\r\\n    {\\r\\n        if (this.Status!=10) return;   //拖拽完成以后才显示角度数据\\r\\n\\r\\n        //输出点的角度\\r\\n        /*\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"bottom\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillText('∠60',points[0].X,points[0].Y);\\r\\n        */\\r\\n    }\\r\\n}\\r\\n\\r\\n//圆\\r\\nfunction ChartDrawPictureCircle()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureCircle';\\r\\n    this.PointCount=2;\\r\\n    this.CircleData;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint || drawPoint.length!=2) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        this.ClipFrame();\\r\\n\\r\\n        var x=drawPoint[0].X-drawPoint[1].X;\\r\\n        var y=drawPoint[0].Y-drawPoint[1].Y;\\r\\n        var r=Math.sqrt(x*x+y*y);\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.DrawLine(drawPoint[0],drawPoint[1]);\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.arc(drawPoint[0].X,drawPoint[0].Y,r,0,2*Math.PI);\\r\\n        this.Canvas.stroke();\\r\\n        this.Canvas.fill();\\r\\n        this.CircleData={X:drawPoint[0].X, Y:drawPoint[0].Y, R:r};\\r\\n\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //0-10 鼠标对应的点索引   100=鼠标在正个图形上  -1 鼠标不在图形上\\r\\n    this.IsPointIn=function(x,y)\\r\\n    {\\r\\n        if (this.IsFrameMinSize()) return -1;\\r\\n        if (this.Status!=10) return -1;\\r\\n\\r\\n        var value=this.IsPointInXYValue(x,y);\\r\\n        if (value>=0) return value;\\r\\n\\r\\n        if (this.CircleData && this.CircleData.R>8)\\r\\n        {\\r\\n            var triangleX=this.CircleData.X-x;\\r\\n            var triangleY=this.CircleData.Y-y;\\r\\n            var r=Math.sqrt(triangleX*triangleX+triangleY*triangleY);   //计算直径\\r\\n            if (r<this.CircleData.R && r>this.CircleData.R-8) return 100;\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n}\\r\\n\\r\\n//四边形\\r\\nfunction ChartDrawPictureQuadrangle()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureQuadrangle';\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.PointCount=3;\\r\\n    this.LastPoint;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);\\r\\n        var points=drawPoint.slice(0);\\r\\n        this.CalculateLines(points);\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n\\r\\n        this.DrawArea();\\r\\n        this.DrawPoint(points);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.SetLastPoint=function(obj)\\r\\n    {\\r\\n        this.LastPoint={X:obj.X,Y:obj.Y};\\r\\n    }\\r\\n\\r\\n    this.DrawArea=function()\\r\\n    {\\r\\n        if (this.LinePoint.length!=4) return;\\r\\n\\r\\n        this.Canvas.fillStyle=this.AreaColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(this.LinePoint[0].Start.X,this.LinePoint[0].Start.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[0].End.X,this.LinePoint[0].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[1].End.X,this.LinePoint[1].End.Y);\\r\\n        this.Canvas.lineTo(this.LinePoint[2].End.X,this.LinePoint[2].End.Y);\\r\\n        this.Canvas.closePath();\\r\\n        this.Canvas.fill();\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            points[2]=pt;\\r\\n        }\\r\\n\\r\\n        if (points.length==2)\\r\\n        {\\r\\n            var linePoint=this.CreateLineData(points[0],points[1]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n        else if (points.length==3)\\r\\n        {\\r\\n            var linePoint=this.CreateLineData(points[0],points[1]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            var linePoint=this.CreateLineData(points[1],points[2]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            //计算平行线\\r\\n            var xMove=points[2].X-points[1].X;\\r\\n            var yMove=points[2].Y-points[1].Y;\\r\\n\\r\\n            var pt4=new Point();    //第4个点的坐标\\r\\n            pt4.X=points[0].X+xMove;\\r\\n            pt4.Y=points[0].Y+yMove;\\r\\n\\r\\n            var linePoint=this.CreateLineData(points[2],pt4);\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            var linePoint=this.CreateLineData(pt4,points[0]);\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//斐波那契周期线\\r\\nfunction ChartDrawPictureFibonacci()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPictureFibonacci';\\r\\n    this.PointCount=1;\\r\\n    this.Font=14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint();\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.CalculateLines();\\r\\n        if (this.LinePoint.length<=0) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n            this.DrawTitle(item.Start,item.Title);\\r\\n        }\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawTitle=function(pt,text)\\r\\n    {\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.textAlign=\\\"left\\\";\\r\\n        this.Canvas.textBaseline=\\\"top\\\";\\r\\n        this.Canvas.font=this.Font;\\r\\n        if (this.Frame.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.translate(pt.X,pt.Y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n\\r\\n            this.Canvas.fillText(text,2,10);\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillText(text,pt.X+2,pt.Y+10);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateHSCreenLines=function()\\r\\n    {\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return;\\r\\n\\r\\n        var xStart=null;\\r\\n        if (this.Status==10)\\r\\n        {\\r\\n            if (this.Value.length!=1) return;\\r\\n            xStart=this.Value[0].XValue;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.Point.length!=1) return;\\r\\n            xStart=parseInt(this.Frame.GetXData(this.Point[0].Y))+data.DataOffset;\\r\\n        }\\r\\n\\r\\n        var top=this.Frame.ChartBorder.GetRightEx();\\r\\n        var bottom=this.Frame.ChartBorder.GetLeftEx();\\r\\n        var showCount=this.Frame.XPointCount;\\r\\n        const LINE_DATA=[1,2,3,5,8,13,21,34,55,89,144,233];\\r\\n        for(var i=0;i<LINE_DATA.length;++i)\\r\\n        {\\r\\n            var xValue=xStart+LINE_DATA[i];\\r\\n            var dataIndex=xValue-data.DataOffset;\\r\\n            if (dataIndex<0 || dataIndex>=showCount) continue;\\r\\n\\r\\n            var x=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            var line={Start:new Point(), End:new Point(), Title:LINE_DATA[i]};\\r\\n            line.Start.X=top;\\r\\n            line.Start.Y=x;\\r\\n            line.End.X=bottom;\\r\\n            line.End.Y=x;\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function()\\r\\n    {\\r\\n        if (this.Status<2) return;\\r\\n        if (!this.Frame) return;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return;\\r\\n\\r\\n        if (this.Frame.IsHScreen)\\r\\n        {\\r\\n            this.CalculateHSCreenLines();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var xStart=null;\\r\\n        if (this.Status==10)\\r\\n        {\\r\\n            if (this.Value.length!=1) return;\\r\\n            xStart=this.Value[0].XValue;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.Point.length!=1) return;\\r\\n            xStart=parseInt(this.Frame.GetXData(this.Point[0].X))+data.DataOffset;\\r\\n        }\\r\\n\\r\\n        var top=this.Frame.ChartBorder.GetTopEx();\\r\\n        var bottom=this.Frame.ChartBorder.GetBottom();\\r\\n        var showCount=this.Frame.XPointCount;\\r\\n        const LINE_DATA=[1,2,3,5,8,13,21,34,55,89,144,233];\\r\\n        for(var i=0;i<LINE_DATA.length;++i)\\r\\n        {\\r\\n            var xValue=xStart+LINE_DATA[i];\\r\\n            var dataIndex=xValue-data.DataOffset;\\r\\n            if (dataIndex<0 || dataIndex>=showCount) continue;\\r\\n\\r\\n            var x=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            var line={Start:new Point(), End:new Point(), Title:LINE_DATA[i]};\\r\\n            line.Start.Y=top;\\r\\n            line.Start.X=x;\\r\\n            line.End.Y=bottom;\\r\\n            line.End.X=x;\\r\\n            this.LinePoint.push(line);\\r\\n        }\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//线性回归\\r\\nfunction ChartDrawLinearRegression(option)\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawLinearRegression';\\r\\n    this.PointCount=2;\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.ChartBorder;\\r\\n    this.Lines=[];  //回归线 { XValue:, YValue: }\\r\\n    this.IsShowMaxMinLine=false;     //是否显示最高 最低价通道\\r\\n    this.IsShowExtendLine=false;     //是否显示延长线\\r\\n    this.ExtendLineDash=[5,5];       //延长线虚线\\r\\n    this.MaxPoint;\\r\\n    this.MinPoint;\\r\\n\\r\\n    if (option)\\r\\n    {\\r\\n        if (option.IsShowMaxMinLine==true) this.IsShowMaxMinLine=true;\\r\\n        if (option.IsShowExtendLine==true) this.IsShowExtendLine=true;\\r\\n    }\\r\\n\\r\\n    //导入\\r\\n    this.ImportStorageData=function(storageData)\\r\\n    {\\r\\n        if (storageData.IsShowMaxMinLine==true) this.IsShowMaxMinLine=true;\\r\\n        if (storageData.IsShowExtendLine==true) this.IsShowExtendLine=true;\\r\\n        if (storageData.Lines) this.Lines=storageData.Lines;\\r\\n        if (storageData.MaxPoint && storageData.MinPoint)\\r\\n        {\\r\\n            this.MaxPoint=storageData.MaxPoint;\\r\\n            this.MinPoint=storageData.MinPoint;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //导出\\r\\n    this.Super_ExportStorageData=this.ExportStorageData;\\r\\n    this.ExportStorageData=function()\\r\\n    {\\r\\n        var storageData;\\r\\n        if (this.Super_ExportStorageData)\\r\\n        {\\r\\n            storageData=this.Super_ExportStorageData();\\r\\n            storageData.IsShowMaxMinLine=this.IsShowMaxMinLine;\\r\\n            storageData.IsShowExtendLine=this.IsShowExtendLine;\\r\\n            storageData.Lines=this.Lines;\\r\\n            if (this.IsShowMaxMinLine)\\r\\n            {\\r\\n                storageData.MaxPoint=this.MaxPoint;\\r\\n                storageData.MinPoint=this.MinPoint;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return storageData;\\r\\n    }\\r\\n\\r\\n\\r\\n    this.PointToValue_Backup=this.PointToValue;\\r\\n\\r\\n    this.PointToValue=function()\\r\\n    {\\r\\n        //拖拽完成 把点移动到线段头尾\\r\\n        this.Point[0]={X:this.Lines[0].X, Y:this.Lines[0].Y};\\r\\n        this.Point[1]={X:this.Lines[this.Lines.length-1].X, Y:this.Lines[this.Lines.length-1].Y};\\r\\n        this.PointToValue_Backup();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( { IsCheckX:true, IsCheckY:true} );\\r\\n        if (!drawPoint || drawPoint.length!=2)\\r\\n        {\\r\\n            if (this.Status==10)\\r\\n            {\\r\\n                this.ClipFrame();\\r\\n                this.ChartBorder=this.Frame.ChartBorder;\\r\\n                this.SetLineWidth();\\r\\n                this.Canvas.strokeStyle=this.LineColor;\\r\\n                this.DrawLinearLines();\\r\\n                this.RestoreLineWidth();\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.ClipFrame();\\r\\n        this.ChartBorder=this.Frame.ChartBorder;\\r\\n\\r\\n        //0=开始画 1=完成第1个点  2=完成第2个点 3=完成第3个点  10=完成 20=移动)\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n\\r\\n        if (this.Status==10)\\r\\n        {\\r\\n            this.DrawLinearLines();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var top=this.ChartBorder.GetTopEx();\\r\\n            var bottom=this.ChartBorder.GetBottomEx();\\r\\n\\r\\n            var kPoint=this.PointToKLine([ptStart,ptEnd]);\\r\\n            //JSConsole.Chart.Log('[ChartDrawLinearRegression::Draw] kPoint', kPoint);\\r\\n            var linear=this.Calculate(kPoint);\\r\\n            //JSConsole.Chart.Log('[ChartDrawLinearRegression::Draw] linear', linear);\\r\\n\\r\\n            this.Lines=linear.Points;\\r\\n            this.MaxPoint=linear.Max;\\r\\n            this.MinPoint=linear.Min;\\r\\n\\r\\n            this.DrawLinearLines();\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ptStart.X,top);\\r\\n            this.Canvas.lineTo(ptStart.X,bottom);\\r\\n\\r\\n            this.Canvas.moveTo(ptEnd.X,top);\\r\\n            this.Canvas.lineTo(ptEnd.X,bottom);\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n        }\\r\\n\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.Calculate=function(kPoint)\\r\\n    {\\r\\n        var startPoint=kPoint[0];\\r\\n        var endPoint=kPoint[1];\\r\\n        if (startPoint.XValue>endPoint.XValue)\\r\\n        {\\r\\n            startPoint=kPoint[1];\\r\\n            endPoint=kPoint[0];\\r\\n        }\\r\\n\\r\\n        var num=(endPoint.XValue-startPoint.XValue)+1;\\r\\n        var data=this.Frame.Data.Data;\\r\\n        var i=endPoint.XValue;\\r\\n        var Ex = 0, Ey = 0, Sxy = 0, Sxx = 0, Const, Slope;\\r\\n        var i, j,x, k;\\r\\n        for(j = 0, x=num; j < num && j <= i; ++j, --x)\\r\\n        {\\r\\n            Ex += x;\\r\\n            Ey += data[i - j].Close;\\r\\n        }\\r\\n        Ex /= num;\\r\\n        Ey /= num;\\r\\n        for(j = 0, x=num; j < num && j <= i; ++j,--x)\\r\\n        {\\r\\n            Sxy += (x-Ex)*(data[i-j].Close-Ey);\\r\\n            Sxx += (x-Ex)*(x-Ex);\\r\\n        }\\r\\n        Slope = Sxy / Sxx;  //斜率\\r\\n        Const = Ey - Ex*Slope;\\r\\n        //value=Slope * num + Const; //Y轴值 线性回归公式\\r\\n\\r\\n        var points=[];\\r\\n        var max=null, min=null;\\r\\n        for(j = 0, k=num; j < num && j <= i; ++j,--k)\\r\\n        {\\r\\n            var xIndex=endPoint.XIndex-j;\\r\\n            var xValue=endPoint.XValue-j;\\r\\n            var x=this.Frame.GetXFromIndex(xIndex);\\r\\n\\r\\n            var yValue=Slope * k + Const;\\r\\n            var y=this.Frame.GetYFromData(yValue,false);\\r\\n\\r\\n            var item={ X:x, Y:y, XValue:xValue, YValue:yValue };\\r\\n            points.push(item);\\r\\n\\r\\n            if (max==null || max.High<data[xValue].High)\\r\\n            {\\r\\n                max={X:x,Y:y,XValue:xValue, YValue:yValue, High:data[xValue].High };\\r\\n            }\\r\\n\\r\\n            if (min==null || min.Low>data[xValue].Low)\\r\\n            {\\r\\n                min={X:x,Y:y,XValue:xValue, YValue:yValue, Low:data[xValue].Low };\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return { Points:points, Slope:Slope, Const:Const , Max:max, Min:min };\\r\\n    }\\r\\n\\r\\n    this.DrawLinearLines=function()\\r\\n    {\\r\\n        if (!this.Frame) return null;\\r\\n        var data=this.Frame.Data;\\r\\n        if (!data) return null;\\r\\n\\r\\n        var showCount=this.Frame.XPointCount;\\r\\n        var dataOffset=data.DataOffset;\\r\\n        var isHScreen=this.Frame.IsHScreen;\\r\\n        var drawLines=[];\\r\\n        for(var i in this.Lines)\\r\\n        {\\r\\n            var item=this.Lines[i];\\r\\n            var dataIndex=item.XValue-dataOffset;\\r\\n            if (dataIndex<0 || dataIndex>=showCount) continue;\\r\\n            var pt={};\\r\\n            if (isHScreen)  //横屏X,Y对调\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                pt.X=this.Frame.GetXFromIndex(dataIndex,false);\\r\\n                pt.Y=this.Frame.GetYFromData(item.YValue,false);\\r\\n                pt.YValue=item.YValue;\\r\\n            }\\r\\n\\r\\n            drawLines.push(pt);\\r\\n        }\\r\\n\\r\\n        if (drawLines.length>1)\\r\\n        {\\r\\n            for(var i in drawLines)\\r\\n            {\\r\\n                var item=drawLines[i];\\r\\n\\r\\n                if (i==0)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(item.X,item.Y);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(item.X,item.Y);\\r\\n                    if (i==drawLines.length-1) this.Canvas.stroke();\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.DrawExtendLine(drawLines);\\r\\n        }\\r\\n\\r\\n        //最大 最小通道\\r\\n        if (this.IsShowMaxMinLine && drawLines.length>1 && this.MaxPoint && this.MinPoint)\\r\\n        {\\r\\n            var highOffset=this.MaxPoint.High-this.MaxPoint.YValue;\\r\\n            for(var i in drawLines)\\r\\n            {\\r\\n                var item=drawLines[i];\\r\\n                item.Y=this.Frame.GetYFromData((item.YValue+highOffset),false);\\r\\n\\r\\n                if (i==0)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(item.X,item.Y);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(item.X,item.Y);\\r\\n                    if (i==drawLines.length-1) this.Canvas.stroke();\\r\\n                }\\r\\n            }\\r\\n            this.DrawExtendLine(drawLines);\\r\\n\\r\\n            var lowOffset=this.MinPoint.Low-this.MinPoint.YValue;\\r\\n            for(var i in drawLines)\\r\\n            {\\r\\n                var item=drawLines[i];\\r\\n                item.Y=this.Frame.GetYFromData((item.YValue+lowOffset),false);\\r\\n\\r\\n                if (i==0)\\r\\n                {\\r\\n                    this.Canvas.beginPath();\\r\\n                    this.Canvas.moveTo(item.X,item.Y);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    this.Canvas.lineTo(item.X,item.Y);\\r\\n                    if (i==drawLines.length-1) this.Canvas.stroke();\\r\\n                }\\r\\n            }\\r\\n            this.DrawExtendLine(drawLines);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //画延长线\\r\\n    this.DrawExtendLine=function(lines)\\r\\n    {\\r\\n        if (!this.IsShowExtendLine) return;\\r\\n\\r\\n        var ptStart=lines[0];\\r\\n        var ptEnd=lines[lines.length-1];\\r\\n        var aryPoint;\\r\\n        if (ptEnd.X>ptStart.X) aryPoint=[ptStart, ptEnd];\\r\\n        else aryPoint=[ptEnd, ptStart];\\r\\n\\r\\n        var ptExtend=this.CalculateExtendLineEndPoint(aryPoint);\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.lineTo(ptExtend.X,ptExtend.Y);\\r\\n        this.Canvas.setLineDash(this.ExtendLineDash);\\r\\n        this.Canvas.stroke();\\r\\n        this.Canvas.setLineDash([]);\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//尺子\\r\\nfunction ChartDrawRuler()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawRuler';\\r\\n    this.PointCount=2;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.TitleColor=g_JSChartResource.ChartDrawRuler.TitleColor;\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=2) return;\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n\\r\\n        var kPoint=this.PointToKLine([ptStart,ptEnd]);\\r\\n        //JSConsole.Chart.Log('[ChartDrawLinearRegression::ChartDrawRuler] kPoint', kPoint);\\r\\n        var kDataInfo=this.Calculate(kPoint);\\r\\n        //JSConsole.Chart.Log('[ChartDrawLinearRegression::ChartDrawRuler] kDataInfo', kDataInfo);\\r\\n\\r\\n        var increase=IFrameSplitOperator.IsNumber(kDataInfo.Increase)? kDataInfo.Increase.toFixed(2)+'%': \\\"--\\\";\\r\\n        var risefall=IFrameSplitOperator.IsNumber(kDataInfo.Risefall)? kDataInfo.Risefall.toFixed(2): \\\"--\\\";\\r\\n        var title=`间距:${kDataInfo.Count} 涨跌:${risefall} 涨幅:${increase}`;\\r\\n        //JSConsole.Chart.Log('[ChartDrawLinearRegression::ChartDrawRuler] title', title);\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n\\r\\n        //绘制信息\\r\\n        this.Canvas.textBaseline='bottom';\\r\\n        this.Canvas.textAlign='left';\\r\\n        this.Canvas.font=this.Font;\\r\\n        if (this.TitleColor)\\r\\n        {\\r\\n            this.Canvas.fillStyle=this.TitleColor;\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsNumber(kDataInfo.Increase))\\r\\n        {\\r\\n            if (kDataInfo.Increase>0) this.Canvas.fillStyle=g_JSChartResource.UpTextColor;\\r\\n            else if (kDataInfo.Increase<0) this.Canvas.fillStyle=g_JSChartResource.DownTextColor;\\r\\n            else this.Canvas.fillStyle=g_JSChartResource.UnchagneTextColor;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillStyle=g_JSChartResource.UnchagneTextColor;\\r\\n        }\\r\\n\\r\\n        var offset=3*GetDevicePixelRatio();\\r\\n        var xText=ptStart.X\\r\\n        var yText=ptStart.Y\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.translate(xText+offset,yText+offset);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            this.Canvas.fillText(title,0,0);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillText(title,xText+offset,yText-offset);\\r\\n        }\\r\\n\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.Calculate=function(kPoint)\\r\\n    {\\r\\n        var startPoint=kPoint[0];\\r\\n        var endPoint=kPoint[1];\\r\\n        if (startPoint.XValue>endPoint.XValue)\\r\\n        {\\r\\n            startPoint=kPoint[1];\\r\\n            endPoint=kPoint[0];\\r\\n        }\\r\\n\\r\\n        var data=this.Frame.Data.Data;\\r\\n        var open, high, low, yClose, close;\\r\\n        var count=0;\\r\\n        for(var i=startPoint.XValue;i<=endPoint.XValue;++i, ++count)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (count==0)\\r\\n            {\\r\\n                yClose=item.YClose;\\r\\n                open=item.Open;\\r\\n                close=item.Close;\\r\\n                low=item.Low;\\r\\n                high=item.High;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                close=item.Close;\\r\\n                if (low>item.Low) low=item.Low;\\r\\n                if (high<item.High)  high=item.High;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!IFrameSplitOperator.IsPlusNumber(yClose))  //前收盘无效， 取上一个交易日的收盘价\\r\\n        {\\r\\n            var index=startPoint.XValue-1;\\r\\n            if (index>=0 && index<data.length) yClose=data[index].Close;\\r\\n        }\\r\\n\\r\\n        var result={ YClose:yClose, Open:open, High:high, Low:low, Close:close, Count:count };\\r\\n        if (IFrameSplitOperator.IsPlusNumber(yClose))\\r\\n        {\\r\\n            result.Increase=(close-yClose)/yClose*100;\\r\\n            result.Risefall=(close-yClose);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//画图工具-标价线 支持横屏\\r\\nfunction ChartDrawPriceLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPriceLine';\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.PointCount=1;\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( { IsCheckX:false, IsCheckY:true } );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=1) return;\\r\\n\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        var ptStart=drawPoint[0];\\r\\n        var chartBorder=this.Frame.ChartBorder;\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var left=chartBorder.GetLeftEx();\\r\\n            var right=chartBorder.GetRightEx();\\r\\n            if (ptStart.X<left || ptStart.X>right) return;\\r\\n\\r\\n            var bottom=chartBorder.GetBottom();\\r\\n            var ptEnd={X:ptStart.X, Y:bottom};\\r\\n            var price=this.Frame.GetYData(ptStart.X, false);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var bottom=chartBorder.GetBottomEx();\\r\\n            var top=chartBorder.GetTopEx();\\r\\n            if (ptStart.Y<top || ptStart.Y>bottom) return;\\r\\n\\r\\n            var right=chartBorder.GetRight();\\r\\n            var ptEnd={X:right, Y:ptStart.Y};\\r\\n            var price=this.Frame.GetYData(ptStart.Y, false);\\r\\n        }\\r\\n\\r\\n\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n\\r\\n        this.Canvas.textBaseline='bottom';\\r\\n        this.Canvas.textAlign='left';\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.font=this.Font;\\r\\n        var offset=2*GetDevicePixelRatio();\\r\\n        var xText=ptStart.X;\\r\\n        var yText=ptStart.Y;\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.translate(xText+offset,yText+offset);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            this.Canvas.fillText(price.toFixed(2),0,0);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillText(price.toFixed(2),xText+offset,yText-offset);\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-标价线2 不支持横屏\\r\\nfunction ChartDrawPriceLineV2()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawPriceLineV2';\\r\\n    this.Font=12*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.PointCount=1;\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.IsHScreen=false;\\r\\n    this.LineWidth=1;\\r\\n    this.IsDrawFirst=true;\\r\\n    this.TextColor=\\\"rgb(255,255,255)\\\";\\r\\n\\r\\n    this.Super_SetOption=this.SetOption;    //父类函数\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (this.Super_SetOption) this.Super_SetOption(option);\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.TextColor) this.TextColor=option.TextColor;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( { IsCheckX:false, IsCheckY:true } );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=1) return;\\r\\n        if (!this.IsYValueInFrame(this.Value[0].YValue)) return;\\r\\n\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        var ptStart=drawPoint[0];\\r\\n        var chartBorder=this.Frame.ChartBorder;\\r\\n        var border=this.Frame.GetBorder();\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            return;\\r\\n\\r\\n            var left=chartBorder.GetLeftEx();\\r\\n            var right=chartBorder.GetRightEx();\\r\\n\\r\\n            var bottom=chartBorder.GetBottom();\\r\\n            var ptEnd={X:ptStart.X, Y:bottom};\\r\\n            var price=this.Frame.GetYData(ptStart.X, false);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var bottom=border.BottomEx;\\r\\n            var top=border.TopTitle;\\r\\n            if (ptStart.Y<top || ptStart.Y>bottom) return;\\r\\n\\r\\n            var left=border.Left;\\r\\n            var right=border.Right;\\r\\n            var price=this.Frame.GetYData(ptStart.Y, false);\\r\\n        }\\r\\n\\r\\n        //this.ClipFrame();\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(ptStart.Y));\\r\\n        this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(ptStart.Y));\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:{X:left, Y:ptStart.Y}, End:{X:right, Y:ptStart.Y}};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        this.Canvas.font=this.Font;\\r\\n        var offset=2*pixelTatio;\\r\\n        var xText=right;\\r\\n        var yText=ptStart.Y;\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            //this.Canvas.translate(xText+offset,yText+offset);\\r\\n            //this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            //this.Canvas.fillText(price.toFixed(2),0,0);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.textBaseline='middle';\\r\\n            this.Canvas.textAlign='left';\\r\\n            var textHeight=this.GetFontHeight();\\r\\n            var text=price.toFixed(2);\\r\\n            var textWidth=this.Canvas.measureText(text).width+2*offset;\\r\\n\\r\\n            if (chartBorder.Right>10)\\r\\n            {\\r\\n                var rtBG={ Left:xText, Top:(yText-textHeight/2-1*pixelTatio) , Width:textWidth, Height: textHeight};\\r\\n                if (rtBG.Left+rtBG.Width>border.ChartWidth) rtBG.Left=border.ChartWidth-rtBG.Width-2*pixelTatio;\\r\\n            }\\r\\n            else    //框架内部显示\\r\\n            {\\r\\n                var rtBG={ Left:xText-textWidth, Top:(yText-textHeight/2-1*pixelTatio) , Width:textWidth, Height: textHeight};\\r\\n            }\\r\\n\\r\\n            this.Canvas.fillStyle=this.LineColor;\\r\\n            this.Canvas.fillRect(rtBG.Left, rtBG.Top, rtBG.Width, rtBG.Height);\\r\\n\\r\\n            this.Canvas.fillStyle=this.TextColor;\\r\\n            this.Canvas.fillText(text, rtBG.Left+offset, yText);\\r\\n        }\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawPrice=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-竖线 支持横屏\\r\\nfunction ChartDrawVerticalLine()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawVerticalLine';\\r\\n    this.PointCount=1;\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        if (!this.Frame || !this.Frame.Data) return;\\r\\n        var data=this.Frame.Data;\\r\\n        var drawPoint=this.CalculateDrawPoint( { IsCheckX:true, IsCheckY:true } );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=1) return;\\r\\n\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        var pt=drawPoint[0];\\r\\n\\r\\n        var chartBorder=this.Frame.ChartBorder;\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var xValue=Math.round(this.Frame.GetXData(pt.Y,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var yLine=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n            yLine=ToFixedPoint2(this.LineWidth,yLine);\\r\\n            var left=chartBorder.GetLeftEx();\\r\\n            var right=chartBorder.GetRightEx();\\r\\n            var ptStart={ X:left, Y:yLine };\\r\\n            var ptEnd={ X:right, Y:yLine };\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var xValue=Math.round(this.Frame.GetXData(pt.X,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var xLine=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n            xLine=ToFixedPoint2(this.LineWidth,xLine);\\r\\n            var top=chartBorder.GetTopEx();\\r\\n            var bottom=chartBorder.GetBottomEx();\\r\\n            var ptStart={ X:xLine, Y:top };\\r\\n            var ptEnd={ X:xLine, Y:bottom };\\r\\n        }\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.moveTo(ptStart.X,ptStart.Y);\\r\\n        this.Canvas.lineTo(ptEnd.X,ptEnd.Y);\\r\\n        this.Canvas.stroke();\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={Start:ptStart, End:ptEnd};\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        if (this.Status==10) this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-波浪尺\\r\\nfunction ChartDrawWaveRuler()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawWaveRuler';\\r\\n    this.PointCount=3;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.LastPoint;\\r\\n    this.LinePoint;\\r\\n    this.ScaleRuler=g_JSChartResource.ChartDrawWaveRuler.ScaleRuler;\\r\\n    this.RulerWidth=g_JSChartResource.ChartDrawWaveRuler.RulerWidth;;       //刻度尺长度\\r\\n    this.RulerLineWidth=g_JSChartResource.ChartDrawWaveRuler.RulerLineWidth;\\r\\n    this.MaxScaleRuler=g_JSChartResource.ChartDrawWaveRuler.MaxScaleRuler;   //尺子最大的高度比\\r\\n    this.Font=g_JSChartResource.ChartDrawWaveRuler.MaxScaleRuler;\\r\\n    this.IsHScreen=false;\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        this.CalculateLines(drawPoint);\\r\\n\\r\\n        this.ClipFrame();\\r\\n        this.SetLineWidth();\\r\\n\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n\\r\\n        //绘制波浪信息\\r\\n        if (drawPoint.length==3) this.DrawWaveRuler(drawPoint);\\r\\n\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.SetLastPoint=function(obj)\\r\\n    {\\r\\n        this.LastPoint={X:obj.X,Y:obj.Y};\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        if (this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            points[2]=pt;\\r\\n        }\\r\\n\\r\\n        if (points.length==2)\\r\\n        {\\r\\n            var linePoint=\\r\\n                {\\r\\n                    Start:{X:points[0].X,Y:points[0].Y},\\r\\n                    End:{X:points[1].X,Y:points[1].Y}\\r\\n                };\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n        else if (points.length==3)\\r\\n        {\\r\\n            var linePoint=\\r\\n                {\\r\\n                    Start:{X:points[0].X,Y:points[0].Y},\\r\\n                    End:{X:points[1].X,Y:points[1].Y}\\r\\n                };\\r\\n            this.LinePoint.push(linePoint);\\r\\n\\r\\n            linePoint=\\r\\n                {\\r\\n                    Start:{X:points[1].X,Y:points[1].Y},\\r\\n                    End:{X:points[2].X,Y:points[2].Y}\\r\\n                };\\r\\n\\r\\n            this.LinePoint.push(linePoint);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawWaveRuler=function(points)\\r\\n    {\\r\\n        var ptBottom=points[1];\\r\\n        var ptStart=points[0];\\r\\n        var ptEnd=points[2];\\r\\n\\r\\n        var lineWidth=this.RulerLineWidth*GetDevicePixelRatio();\\r\\n        this.Canvas.lineWidth=lineWidth;\\r\\n        this.Canvas.textBaseline='middle';\\r\\n        this.Canvas.textAlign='left';\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.font=this.Font;\\r\\n        var rulerWidth=this.RulerWidth*GetDevicePixelRatio();//刻度线长度\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var rulerHeight=ptStart.X-ptBottom.X;\\r\\n            var ptExtendBottom={ X:ptEnd.X-this.MaxScaleRuler*rulerHeight, Y:ptEnd.Y};\\r\\n            this.DrawLine(ptEnd,ptExtendBottom);\\r\\n            this.LinePoint.push({Start:ptEnd, End:ptExtendBottom});\\r\\n            var y=ptEnd.Y-rulerWidth/2, y2=ptEnd.Y+rulerWidth/2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var rulerHeight=ptStart.Y-ptBottom.Y;\\r\\n            var ptExtendBottom={ X:ToFixedPoint2(lineWidth,ptEnd.X), Y:ptEnd.Y-this.MaxScaleRuler*rulerHeight };\\r\\n            this.DrawLine({X:ToFixedPoint2(lineWidth,ptEnd.X), Y:ptEnd.Y},ptExtendBottom);\\r\\n            this.LinePoint.push({Start:ptEnd, End:ptExtendBottom});\\r\\n            var x=ptEnd.X-rulerWidth/2, x2=ptEnd.X+rulerWidth/2;\\r\\n        }\\r\\n\\r\\n        var textOffset=4*GetDevicePixelRatio();\\r\\n        for(var i in this.ScaleRuler)\\r\\n        {\\r\\n            var item=this.ScaleRuler[i];\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                var x=ptEnd.X - item.Value*rulerHeight;\\r\\n                var price=this.Frame.GetYData(x, false);\\r\\n                this.DrawLine({X:x, Y:y}, {X:x, Y:y2});\\r\\n                var text=`${price.toFixed(2)}  ${item.Text? item.Text: item.Value.toFixed(3)}`;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(x,ptEnd.Y);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(text,textOffset,0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var y=ptEnd.Y - item.Value*rulerHeight;\\r\\n                var price=this.Frame.GetYData(y, false);\\r\\n                this.DrawLine({X:x, Y:ToFixedPoint2(lineWidth,y)}, {X:x2, Y:ToFixedPoint2(lineWidth,y)});\\r\\n                var text=`${price.toFixed(2)}  ${item.Text? item.Text: item.Value.toFixed(3)}`;\\r\\n                this.Canvas.fillText(text,x2+textOffset,y);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-波浪尺 2个点的\\r\\nfunction ChartDrawWaveRuler2Point()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawWaveRuler2Point';\\r\\n    this.PointCount=2;\\r\\n    this.Font=14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.PointRate=[ 510, 517, 511.4];\\r\\n    this.LinePoint;\\r\\n    this.CPoint;\\r\\n    this.ScaleRuler=g_JSChartResource.ChartDrawWaveRuler2Point.ScaleRuler;\\r\\n    this.RulerWidth=g_JSChartResource.ChartDrawWaveRuler2Point.RulerWidth;;       //刻度尺长度\\r\\n    this.RulerLineWidth=g_JSChartResource.ChartDrawWaveRuler2Point.RulerLineWidth;\\r\\n    this.MaxScaleRuler=g_JSChartResource.ChartDrawWaveRuler2Point.MaxScaleRuler;   //尺子最大的高度比\\r\\n    this.Font=g_JSChartResource.ChartDrawWaveRuler2Point.MaxScaleRuler;\\r\\n    this.IsHScreen=false;\\r\\n    this.Super_SetOption=this.SetOption;    //父类函数\\r\\n\\r\\n    this.SetOption=function(option)\\r\\n    {\\r\\n        if (this.Super_SetOption) this.Super_SetOption(option);\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.PointRate) this.PointRate=option.PointRate;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        this.CalculateLines(drawPoint);\\r\\n\\r\\n        this.ClipFrame();\\r\\n        this.SetLineWidth();\\r\\n\\r\\n        for(var i in this.LinePoint)\\r\\n        {\\r\\n            var item=this.LinePoint[i];\\r\\n            this.DrawLine(item.Start,item.End);\\r\\n        }\\r\\n\\r\\n        var points=[drawPoint[0],drawPoint[1],this.CPoint];\\r\\n        this.DrawWaveRuler(points);\\r\\n\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.CalculateLines=function(points)\\r\\n    {\\r\\n        var firstLine=\\r\\n            {\\r\\n                Start:{ X:points[0].X,Y:points[0].Y },\\r\\n                End:{ X:points[1].X,Y:points[1].Y }\\r\\n            };\\r\\n        this.LinePoint.push(firstLine);\\r\\n\\r\\n        var a=points[0].Y;\\r\\n        var b=points[1].Y;\\r\\n\\r\\n        var width=this.PointRate[1]-this.PointRate[0];\\r\\n        var offset=this.PointRate[2]-this.PointRate[0];\\r\\n\\r\\n        var c=a-((a-b)*offset)/width;\\r\\n\\r\\n        this.CPoint={ X:points[1].X, Y:c };\\r\\n    }\\r\\n\\r\\n    this.DrawWaveRuler=function(points)\\r\\n    {\\r\\n        var ptBottom=points[1];\\r\\n        var ptStart=points[0];\\r\\n        var ptEnd=points[2];\\r\\n\\r\\n        var lineWidth=this.RulerLineWidth*GetDevicePixelRatio();\\r\\n        this.Canvas.lineWidth=lineWidth;\\r\\n        this.Canvas.textBaseline='middle';\\r\\n        this.Canvas.textAlign='left';\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        this.Canvas.font=this.Font;\\r\\n        var rulerWidth=this.RulerWidth*GetDevicePixelRatio();//刻度线长度\\r\\n\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var rulerHeight=ptStart.X-ptBottom.X;\\r\\n            var ptExtendBottom={ X:ptEnd.X-this.MaxScaleRuler*rulerHeight, Y:ptEnd.Y};\\r\\n            this.DrawLine(ptEnd,ptExtendBottom);\\r\\n            this.LinePoint.push({Start:ptEnd, End:ptExtendBottom});\\r\\n            var y=ptEnd.Y-rulerWidth/2, y2=ptEnd.Y+rulerWidth/2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var rulerHeight=ptStart.Y-ptBottom.Y;\\r\\n            var ptExtendBottom={ X:ToFixedPoint2(lineWidth,ptEnd.X), Y:ptEnd.Y-this.MaxScaleRuler*rulerHeight };\\r\\n            this.DrawLine({X:ToFixedPoint2(lineWidth,ptEnd.X), Y:ptEnd.Y},ptExtendBottom);\\r\\n            this.LinePoint.push({Start:ptEnd, End:ptExtendBottom});\\r\\n            var x=ptEnd.X, x2=ptEnd.X+rulerWidth;\\r\\n        }\\r\\n\\r\\n        var textOffset=4*GetDevicePixelRatio();\\r\\n        for(var i in this.ScaleRuler)\\r\\n        {\\r\\n            var item=this.ScaleRuler[i];\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                var x=ptEnd.X - item.Value*rulerHeight;\\r\\n                var price=this.Frame.GetYData(x, false);\\r\\n                this.DrawLine({X:x, Y:y}, {X:x, Y:y2});\\r\\n                var text=`${price.toFixed(2)}  ${item.Text? item.Text: item.Value.toFixed(3)}`;\\r\\n                this.Canvas.save();\\r\\n                this.Canvas.translate(x,ptEnd.Y);\\r\\n                this.Canvas.rotate(90 * Math.PI / 180);\\r\\n                this.Canvas.fillText(text,textOffset,0);\\r\\n                this.Canvas.restore();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var y=ptEnd.Y - item.Value*rulerHeight;\\r\\n                var price=this.Frame.GetYData(y, false);\\r\\n                this.DrawLine({X:x, Y:ToFixedPoint2(lineWidth,y)}, {X:x2, Y:ToFixedPoint2(lineWidth,y)});\\r\\n                var text=`${price.toFixed(2)}  ${item.Text? item.Text: item.Value.toFixed(3)}`;\\r\\n                this.Canvas.fillText(text,x2+textOffset,y);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-箱型线 支持横屏\\r\\nfunction ChartDrawBox()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawBox';\\r\\n    this.PointCount=2;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.IsHScreen=false;\\r\\n    this.AvPriceLineDash=[5*GetDevicePixelRatio(),5*GetDevicePixelRatio()];\\r\\n    this.KLineBorder;\\r\\n\\r\\n    this.PointToValue_Backup=this.PointToValue;\\r\\n    this.PointToValue=function()\\r\\n    {\\r\\n        //拖拽完成 把点移动到线段头尾\\r\\n        this.Point[0]={X:this.KLineBorder.Left, Y:this.KLineBorder.Top};\\r\\n        this.Point[1]={X:this.KLineBorder.Right, Y:this.KLineBorder.Bottom};\\r\\n        this.PointToValue_Backup();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );\\r\\n        if (!drawPoint) return;\\r\\n        if (drawPoint.length!=2) return;\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n\\r\\n        this.ClipFrame();\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n\\r\\n        var kPoint=this.PointToKLine([ptStart,ptEnd]);\\r\\n        JSConsole.Chart.Log('[ChartDrawBox::Draw] kPoint', kPoint);\\r\\n        var kDataInfo=this.Calculate(kPoint);\\r\\n        JSConsole.Chart.Log('[ChartDrawBox::Draw] kDataInfo', kDataInfo);\\r\\n        var klineBorder=this.GetKLineBorder(drawPoint, kDataInfo);\\r\\n        this.KLineBorder=klineBorder;\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        this.Canvas.strokeRect(ToFixedRect(klineBorder.Left), ToFixedRect(klineBorder.Top), ToFixedRect(klineBorder.Right-klineBorder.Left), ToFixedRect(klineBorder.Bottom-klineBorder.Top));\\r\\n\\r\\n        //均价\\r\\n        var avPriceText;\\r\\n        if (kDataInfo.Amount>0 && kDataInfo.Vol>0)\\r\\n        {\\r\\n            var price=kDataInfo.Amount/kDataInfo.Vol;\\r\\n            avPriceText=`均价${price.toFixed(2)}`;\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            if (this.IsHScreen)\\r\\n            {\\r\\n                var x=this.Frame.GetYFromData(price,false);\\r\\n                this.Canvas.moveTo(ToFixedPoint2(this.Canvas.lineWidth,x),klineBorder.Top);\\r\\n                this.Canvas.lineTo(ToFixedPoint2(this.Canvas.lineWidth,x),klineBorder.Bottom);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var y=this.Frame.GetYFromData(price,false);\\r\\n                this.Canvas.moveTo(klineBorder.Left,ToFixedPoint2(this.Canvas.lineWidth,y));\\r\\n                this.Canvas.lineTo(klineBorder.Right,ToFixedPoint2(this.Canvas.lineWidth,y));\\r\\n            }\\r\\n\\r\\n            this.Canvas.setLineDash(this.AvPriceLineDash);\\r\\n            this.Canvas.stroke();\\r\\n            this.Canvas.setLineDash([]);\\r\\n        }\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n\\r\\n        //绘制信息\\r\\n        this.Canvas.textBaseline='top';\\r\\n        this.Canvas.textAlign='left';\\r\\n        this.Canvas.font=this.Font;\\r\\n        this.Canvas.fillStyle=this.LineColor;\\r\\n        var textOffset=2*GetDevicePixelRatio();\\r\\n        var text=`K线数${kDataInfo.Count}`;\\r\\n        if (this.IsHScreen) this.DrawText(text,klineBorder.Right,klineBorder.Top, textOffset, textOffset);\\r\\n        else this.DrawText(text,klineBorder.Left,klineBorder.Top, textOffset, textOffset);\\r\\n\\r\\n        if (avPriceText)\\r\\n        {\\r\\n            if (this.IsHScreen) this.DrawText(avPriceText,x,klineBorder.Top, textOffset, textOffset);   //均价\\r\\n            else this.DrawText(avPriceText,klineBorder.Left,y, textOffset, textOffset);   //均价\\r\\n        }\\r\\n\\r\\n        var yClose=IFrameSplitOperator.IsNumber(kDataInfo.YClose)? kDataInfo.YClose:kDataInfo.Open;\\r\\n        var value=(kDataInfo.Close-yClose)/yClose*100;\\r\\n        text=`${value.toFixed(2)}%`;\\r\\n        if (this.IsHScreen) this.DrawText(text,klineBorder.Right,klineBorder.Bottom, textOffset, textOffset);\\r\\n        else this.DrawText(text,klineBorder.Right,klineBorder.Top, textOffset, textOffset);\\r\\n\\r\\n        value=kDataInfo.Close-yClose;\\r\\n        text=`${value.toFixed(2)}`;\\r\\n        this.Canvas.textBaseline='bottom';\\r\\n        if (this.IsHScreen) this.DrawText(text,klineBorder.Left,klineBorder.Bottom, textOffset, 0);\\r\\n        else this.DrawText(text,klineBorder.Right,klineBorder.Bottom, textOffset, 0);\\r\\n\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.Calculate=function(kPoint)\\r\\n    {\\r\\n        var startPoint=kPoint[0];\\r\\n        var endPoint=kPoint[1];\\r\\n        if (startPoint.XValue>endPoint.XValue)\\r\\n        {\\r\\n            startPoint=kPoint[1];\\r\\n            endPoint=kPoint[0];\\r\\n        }\\r\\n\\r\\n        var data=this.Frame.Data.Data;\\r\\n        var open, high, low, yClose, close, vol=0, amount=0;\\r\\n        var count=0;\\r\\n        for(var i=startPoint.XValue;i<=endPoint.XValue;++i, ++count)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (count==0)\\r\\n            {\\r\\n                yClose=item.YClose;\\r\\n                open=item.Open;\\r\\n                close=item.Close;\\r\\n                low=item.Low;\\r\\n                high=item.High;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                close=item.Close;\\r\\n                if (low>item.Low) low=item.Low;\\r\\n                if (high<item.High)  high=item.High;\\r\\n            }\\r\\n\\r\\n            vol+=item.Vol;\\r\\n            amount+=item.Amount;\\r\\n        }\\r\\n\\r\\n        var result={ YClose:yClose, Open:open, High:high, Low:low, Close:close, Count:count,Vol:vol, Amount:amount  };\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetKLineBorder=function(drawPoint, kInfo)\\r\\n    {\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n        var data=this.Frame.Data;\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var xValue=Math.round(this.Frame.GetXData(ptStart.Y,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var yStart=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            xValue=Math.round(this.Frame.GetXData(ptEnd.Y,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var yEnd=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            var xHigh=this.Frame.GetYFromData(kInfo.High,false);\\r\\n            var xLow=this.Frame.GetYFromData(kInfo.Low,false);\\r\\n\\r\\n            var result= { Left:xLow, Top:yStart, Right:xHigh, Bottom:yEnd };\\r\\n\\r\\n            this.LinePoint.push({Start:{X:xLow, Y:yStart}, End:{X:yEnd, Y:yStart}});\\r\\n            this.LinePoint.push({Start:{X:xLow, Y:yEnd}, End:{X:yEnd, Y:yEnd}});\\r\\n            this.LinePoint.push({Start:{X:xLow, Y:yStart}, End:{X:xLow, Y:yEnd}});\\r\\n            this.LinePoint.push({Start:{X:xHigh, Y:yStart}, End:{X:xHigh, Y:yEnd}});\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var xValue=Math.round(this.Frame.GetXData(ptStart.X,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var xStart=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            xValue=Math.round(this.Frame.GetXData(ptEnd.X,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var xEnd=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            var yHigh=this.Frame.GetYFromData(kInfo.High,false);\\r\\n            var yLow=this.Frame.GetYFromData(kInfo.Low,false);\\r\\n            var result= { Left:xStart, Top:yHigh, Right:xEnd, Bottom:yLow };\\r\\n\\r\\n            this.LinePoint.push({Start:{X:xStart, Y:yHigh}, End:{X:xEnd, Y:yHigh}});\\r\\n            this.LinePoint.push({Start:{X:xStart, Y:yLow}, End:{X:xEnd, Y:yLow}});\\r\\n            this.LinePoint.push({Start:{X:xStart, Y:yHigh}, End:{X:xStart, Y:yLow}});\\r\\n            this.LinePoint.push({Start:{X:xEnd, Y:yHigh}, End:{X:xEnd, Y:yLow}});\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawText=function(text, x, y, xOffset, yOffset)\\r\\n    {\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            this.Canvas.save();\\r\\n            this.Canvas.translate(x,y);\\r\\n            this.Canvas.rotate(90 * Math.PI / 180);\\r\\n            this.Canvas.fillText(text,xOffset,yOffset);\\r\\n            this.Canvas.restore();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Canvas.fillText(text,x+xOffset,y+yOffset);\\r\\n        }\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\nfunction ChartDrawTwoPointDemo()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawTwoPointDemo';\\r\\n    this.PointCount=2;\\r\\n    this.Font=16*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.IsHScreen=false;\\r\\n    this.PointInfo=[];  //保存点及点对应K线的信息\\r\\n\\r\\n    this.PointToValue_Backup=this.PointToValue;\\r\\n    this.PointToValue=function()\\r\\n    {\\r\\n        this.OnFinish();\\r\\n        this.PointToValue_Backup();\\r\\n    }\\r\\n\\r\\n    //移动或创建完成\\r\\n    this.OnFinish=function()\\r\\n    {\\r\\n        for(var i in this.PointInfo)\\r\\n        {\\r\\n            var item=this.PointInfo[i];\\r\\n            if (!item || !item.Point || !IFrameSplitOperator.IsNumber(item.Point.Y2)) continue;\\r\\n            this.Point[i].Y=this.PointInfo[i].Point.Y2; //点Y轴坐标调整\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.LinePoint=[];\\r\\n        this.PointInfo=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint({IsCheckX:true, IsCheckY:true});\\r\\n        if (!drawPoint) return;\\r\\n\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        //this.CalculateLines(drawPoint);\\r\\n\\r\\n        this.ClipFrame();\\r\\n        this.SetLineWidth();\\r\\n\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1]\\r\\n        this.CalculatePointInfo(drawPoint);\\r\\n        if (this.Status==10)    //绘制完成\\r\\n        {\\r\\n            this.DrawEx();\\r\\n        }\\r\\n        else    //绘制中只画连线\\r\\n        {\\r\\n            for(var i=1;i<drawPoint.length;++i)\\r\\n            {\\r\\n                this.DrawLine(drawPoint[i-1],drawPoint[i]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.RestoreLineWidth();\\r\\n        this.DrawPoint(drawPoint); //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    //计算点信息及K线信息\\r\\n    this.CalculatePointInfo=function(drawPoint)\\r\\n    {\\r\\n        if (!this.Frame || !this.Frame.Data) return;\\r\\n        var kPoint=this.PointToKLine(drawPoint);\\r\\n\\r\\n        //3个点\\r\\n        if (this.PointCount==3 && this.PointStatus==2 && this.LastPoint)\\r\\n        {\\r\\n            var pt=new Point();\\r\\n            pt.X=this.LastPoint.X;\\r\\n            pt.Y=this.LastPoint.Y;\\r\\n            drawPoint[2]=pt;\\r\\n        }\\r\\n\\r\\n        var data=this.Frame.Data;\\r\\n        for(var i in kPoint)\\r\\n        {\\r\\n            var item=kPoint[i];\\r\\n            var pt=drawPoint[i];\\r\\n            var kItem=data.Data[item.XValue];\\r\\n            var obj={ KItem: kItem, Data:item, Point:{ X:pt.X, Y:pt.Y } };\\r\\n            this.PointInfo.push(obj);\\r\\n        }\\r\\n\\r\\n        this.CalculateYPoint();\\r\\n\\r\\n        JSConsole.Chart.Log('[ChartDrawTwoPointDemo::CalculateLines] kPoint', this.PointInfo);\\r\\n    }\\r\\n\\r\\n    //计算需要调整的Y轴坐标\\r\\n    this.CalculateYPoint=function()\\r\\n    {\\r\\n        var ptStart=this.PointInfo[0];\\r\\n        var yStart=this.Frame.GetYFromData(ptStart.KItem.Low,false);\\r\\n        ptStart.Point.Y2=yStart;\\r\\n\\r\\n        var ptEnd=this.PointInfo[1];\\r\\n        var yEnd=this.Frame.GetYFromData(ptEnd.KItem.High,false);\\r\\n        ptEnd.Point.Y2=yEnd;\\r\\n    }\\r\\n\\r\\n    this.DrawEx=function()\\r\\n    {\\r\\n        //起始点 结束点信息\\r\\n        var startInfo=this.PointInfo[0];\\r\\n        var endInfo=this.PointInfo[1];\\r\\n\\r\\n        //K线边框信息\\r\\n        var chartBorder=this.Frame.ChartBorder;\\r\\n        var frameRight=chartBorder.GetRight();  //最右边\\r\\n\\r\\n        var ptStart={X:startInfo.Point.X, Y:startInfo.Point.Y2 };\\r\\n        var ptEnd={X:endInfo.Point.X, Y:endInfo.Point.Y2 };\\r\\n\\r\\n        this.DrawLine(ptStart,ptEnd);\\r\\n        this.LinePoint.push({Start:ptStart, End:ptEnd});\\r\\n\\r\\n        this.Canvas.setLineDash([5,5]);\\r\\n        //this.Canvas.lineWidth=2;\\r\\n        var topPrice=endInfo.KItem.YClose*0.09+endInfo.KItem.High;    //结束点最高价+涨幅6% 画竖线\\r\\n        var y=this.Frame.GetYFromData(topPrice,false);\\r\\n        this.DrawLine({X:this.ToFixedPoint(ptEnd.X), Y:ptEnd.Y}, {X:this.ToFixedPoint(ptEnd.X), Y:y});\\r\\n\\r\\n        this.Canvas.textAlign=\\\"right\\\";\\r\\n        this.Canvas.textBaseline = 'center';\\r\\n        this.Canvas.fillStyle='rgb(33,45,100)';\\r\\n\\r\\n        for(var i=3;i>0;--i)\\r\\n        {\\r\\n            var price=endInfo.KItem.YClose*(0.03*i)+endInfo.KItem.High;     //%2涨幅一档画线\\r\\n            var y=this.Frame.GetYFromData(price,false);\\r\\n            y=this.ToFixedPoint(y);\\r\\n\\r\\n            //线段\\r\\n            this.DrawLine({X:ptEnd.X, Y:y}, {X:ptEnd.X+100, Y:y});\\r\\n\\r\\n            //文字\\r\\n            this.Canvas.fillText(price.toFixed(2), ptEnd.X-5, y);\\r\\n        }\\r\\n        this.Canvas.setLineDash([]);\\r\\n    }\\r\\n\\r\\n    //防止竖线或横线模糊调整坐标\\r\\n    this.ToFixedPoint=function(value,width)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNumber(width)) width=this.LineWidth;\\r\\n        return ToFixedPoint2(width, value)\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction ChartDrawThreePointDemo()\\r\\n{\\r\\n    this.newMethod=ChartDrawTwoPointDemo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawThreePointDemo';\\r\\n    this.PointCount=3;\\r\\n\\r\\n    this.SetLastPoint=function(obj)\\r\\n    {\\r\\n        this.LastPoint={X:obj.X,Y:obj.Y};\\r\\n    }\\r\\n\\r\\n    //计算需要调整的Y轴坐标\\r\\n    this.CalculateYPoint=function()\\r\\n    {\\r\\n        var y;\\r\\n        for(var i in this.PointInfo)\\r\\n        {\\r\\n            var item=this.PointInfo[i];\\r\\n            if (i==0 || i==2) y=this.Frame.GetYFromData(item.KItem.Low,false);\\r\\n            else y=this.Frame.GetYFromData(item.KItem.High,false);\\r\\n            item.Point.Y2=y;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DrawEx=function()\\r\\n    {\\r\\n        //起始点 结束点信息\\r\\n        var startInfo=this.PointInfo[0];\\r\\n        var secondInfo=this.PointInfo[1];\\r\\n        var endInfo=this.PointInfo[2];\\r\\n\\r\\n        //K线边框信息\\r\\n        var chartBorder=this.Frame.ChartBorder;\\r\\n        var frameRight=chartBorder.GetRight();  //右边\\r\\n        var frameLeft=chartBorder.GetLeft();    //左边\\r\\n\\r\\n        var ptStart={ X:startInfo.Point.X, Y:startInfo.Point.Y2 };\\r\\n        var ptSecond={ X:secondInfo.Point.X, Y:secondInfo.Point.Y2};\\r\\n        var ptEnd={ X:endInfo.Point.X, Y:endInfo.Point.Y2 };\\r\\n\\r\\n        this.DrawLine(ptStart,ptSecond);\\r\\n        this.DrawLine(ptSecond,ptEnd);\\r\\n        this.LinePoint.push({Start:ptStart, End:ptSecond});\\r\\n        this.LinePoint.push({Start:ptSecond, End:ptEnd});\\r\\n\\r\\n        this.Canvas.setLineDash([5,5]);\\r\\n        //this.Canvas.lineWidth=2;\\r\\n        var topPrice=endInfo.KItem.YClose*0.09+endInfo.KItem.High;    //结束点最高价+涨幅6% 画竖线\\r\\n        var y=this.Frame.GetYFromData(topPrice,false);\\r\\n        this.DrawLine({X:this.ToFixedPoint(ptEnd.X), Y:ptEnd.Y}, {X:this.ToFixedPoint(ptEnd.X), Y:y});\\r\\n\\r\\n        this.Canvas.textAlign=\\\"right\\\";\\r\\n        this.Canvas.textBaseline = 'center';\\r\\n        this.Canvas.fillStyle='rgb(33,45,100)';\\r\\n\\r\\n        for(var i=3;i>0;--i)\\r\\n        {\\r\\n            var price=endInfo.KItem.YClose*(0.03*i)+endInfo.KItem.High;     //%2涨幅一档画线\\r\\n            var y=this.Frame.GetYFromData(price,false);\\r\\n            y=this.ToFixedPoint(y);\\r\\n\\r\\n            //线段\\r\\n            this.DrawLine({X:ptEnd.X, Y:y}, {X:ptEnd.X+100, Y:y});\\r\\n\\r\\n            //文字\\r\\n            this.Canvas.fillText(price.toFixed(2), ptEnd.X-5, y);\\r\\n        }\\r\\n        this.Canvas.setLineDash([]);\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具-水平线段\\r\\nfunction ChartDrawHLineSegment()\\r\\n{\\r\\n    this.newMethod=IChartDrawPicture;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ChartDrawHLineSegment';\\r\\n    this.PointCount=2;\\r\\n    this.IsPointIn=this.IsPointIn_XYValue_Line;\\r\\n    this.ChartBorder;\\r\\n\\r\\n    this.PointToValue_Backup=this.PointToValue;\\r\\n    this.PointToValue=function()\\r\\n    {\\r\\n        //拖拽完成 把点移动到线段头尾\\r\\n        if (this.Frame.IsHScreen)\\r\\n        {\\r\\n            this.Point[1].X=this.Point[0].X;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Point[1].Y=this.Point[0].Y;\\r\\n        }\\r\\n\\r\\n        this.PointToValue_Backup();\\r\\n    }\\r\\n\\r\\n    this.Draw=function()\\r\\n    {\\r\\n        this.IsHScreen=this.Frame.IsHScreen;\\r\\n        this.LinePoint=[];\\r\\n        if (this.IsFrameMinSize()) return;\\r\\n\\r\\n        var drawPoint=this.CalculateDrawPoint( { IsCheckX:false, IsCheckY:true} );\\r\\n        if (!drawPoint || drawPoint.length!=2) return;\\r\\n\\r\\n        this.ClipFrame();\\r\\n        this.ChartBorder=this.Frame.ChartBorder;\\r\\n\\r\\n        this.SetLineWidth();\\r\\n        this.Canvas.strokeStyle=this.LineColor;\\r\\n        var ptStart=drawPoint[0];\\r\\n        var ptEnd=drawPoint[1];\\r\\n\\r\\n        if (this.Status==10)    //0=开始画 1=完成第1个点  2=完成第2个点 3=完成第3个点  10=完成 20=移动)\\r\\n        {\\r\\n            this.DrawLine(ptStart,ptEnd,false);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //var kPoint=this.PointToKLine([ptStart,ptEnd]);\\r\\n            this.DrawVerticalLine(ptStart,ptEnd);\\r\\n        }\\r\\n\\r\\n        this.RestoreLineWidth();\\r\\n\\r\\n        var line={ Start:ptStart, End:ptEnd };\\r\\n        this.LinePoint.push(line);\\r\\n\\r\\n        this.DrawPoint(drawPoint);  //画点\\r\\n        this.Canvas.restore();\\r\\n    }\\r\\n\\r\\n    this.DrawVerticalLine=function(ptStart, ptEnd)\\r\\n    {\\r\\n        var data=this.Frame.Data;\\r\\n        if (this.IsHScreen)\\r\\n        {\\r\\n            var left=this.ChartBorder.GetLeft();\\r\\n            var right=this.ChartBorder.GetRight();\\r\\n            var xValue=Math.round(this.Frame.GetXData(ptStart.Y,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var yStart=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            xValue=Math.round(this.Frame.GetXData(ptEnd.Y,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var yEnd=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(left,yStart);\\r\\n            this.Canvas.lineTo(right,yStart);\\r\\n\\r\\n            this.Canvas.moveTo(left,yEnd);\\r\\n            this.Canvas.lineTo(right,yEnd);\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(ptStart.X,yStart);\\r\\n            this.Canvas.lineTo(ptStart.X,yEnd);\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var top=this.ChartBorder.GetTopEx();\\r\\n            var bottom=this.ChartBorder.GetBottomEx();\\r\\n\\r\\n            var xValue=Math.round(this.Frame.GetXData(ptStart.X,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var xStart=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            xValue=Math.round(this.Frame.GetXData(ptEnd.X,false))+data.DataOffset;\\r\\n            if (xValue<0) xValue=0;\\r\\n            else if (xValue>=data.Data.length) xValue=data.Data.length-1;\\r\\n            var xEnd=this.Frame.GetXFromIndex(xValue-data.DataOffset,false);\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(xStart,top);\\r\\n            this.Canvas.lineTo(xStart,bottom);\\r\\n\\r\\n            this.Canvas.moveTo(xEnd,top);\\r\\n            this.Canvas.lineTo(xEnd,bottom);\\r\\n            this.Canvas.stroke();\\r\\n\\r\\n            this.Canvas.beginPath();\\r\\n            this.Canvas.moveTo(xStart,ptStart.Y);\\r\\n            this.Canvas.lineTo(xEnd,ptStart.Y);\\r\\n            this.Canvas.stroke();\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction ChartDrawStorage()\\r\\n{\\r\\n    this.DrawData=new Map();    //画图工具数据 key=symbol-Period, value=Map() Key:Guid, Value:{Guid, Symbol, Period, ClassName, Value}\\r\\n    this.StorageKey;\\r\\n\\r\\n    this.Load=function(key)     //从本地读取画图工具\\r\\n    {\\r\\n        if (!key) return;\\r\\n        this.StorageKey=key;\\r\\n        var cacheValue = localStorage[this.StorageKey];\\r\\n        JSConsole.Chart.Log(`[ChartDrawStorage::Save] Load to localStorage, key=${this.StorageKey}, cache=${cacheValue}`);\\r\\n\\r\\n        if (!cacheValue) return;\\r\\n        if (typeof(cacheValue) != \\\"string\\\") return;\\r\\n\\r\\n        var saveData=JSON.parse(cacheValue);\\r\\n        for(var i in saveData)\\r\\n        {\\r\\n            var item=saveData[i];\\r\\n            var drawMap=new Map();\\r\\n\\r\\n            for(var j in item.Value)\\r\\n            {\\r\\n                var drawItem=item.Value[j];\\r\\n                drawMap.set(drawItem.Key, drawItem.Value);\\r\\n            }\\r\\n\\r\\n            this.DrawData.set(item.Key,drawMap);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Save=function()        //把数据保存到本地\\r\\n    {\\r\\n        if (!this.StorageKey) return;\\r\\n\\r\\n        var saveData=[];\\r\\n        for(var stock of this.DrawData)\\r\\n        {\\r\\n            var key=stock[0];\\r\\n            var value=stock[1];\\r\\n            var itemData={ Key:key, Value:[]};\\r\\n\\r\\n            for(var drawItem of value)\\r\\n            {\\r\\n                itemData.Value.push({Key:drawItem[0], Value:drawItem[1]});\\r\\n            }\\r\\n\\r\\n            saveData.push(itemData)\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log(`[ChartDrawStorage::Save] save to localStorage, key=${this.StorageKey}`);\\r\\n        var strData=JSON.stringify(saveData);\\r\\n        localStorage[this.StorageKey]=strData;\\r\\n    }\\r\\n\\r\\n    this.SaveDrawData=function(drawPicture)   //保存一个画图工具\\r\\n    {\\r\\n        var strKey=drawPicture.Symbol+'-'+drawPicture.Period;\\r\\n        var data=drawPicture.ExportStorageData();\\r\\n        if (!data) return;\\r\\n\\r\\n        if (this.DrawData.has(strKey))  //更新\\r\\n        {\\r\\n            JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] Upate: key, drawPicture, data', strKey, drawPicture,data);\\r\\n            this.DrawData.get(strKey).set(data.Guid, data);\\r\\n        }\\r\\n        else    //新增\\r\\n        {\\r\\n            JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] Insert: key, drawPicture, data', strKey, drawPicture,data);\\r\\n            var newData=new Map();\\r\\n            newData.set(data.Guid, data);\\r\\n            this.DrawData.set(strKey,newData);\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] All draw data： ', this.DrawData);\\r\\n\\r\\n        this.Save();\\r\\n    }\\r\\n\\r\\n    this.DeleteDrawData=function(drawPicture)   //删除一个画图工具\\r\\n    {\\r\\n        var strKey=drawPicture.Symbol+'-'+drawPicture.Period;\\r\\n        if (!this.DrawData.has(strKey))  return;\\r\\n\\r\\n        var mapDraw=this.DrawData.get(strKey);\\r\\n        if (!mapDraw.has(drawPicture.Guid)) return;\\r\\n\\r\\n        mapDraw.delete(drawPicture.Guid);\\r\\n        this.Save();\\r\\n    }\\r\\n\\r\\n    this.Clear=function()\\r\\n    {\\r\\n        this.DrawData=new Map();\\r\\n        this.Save();\\r\\n    }\\r\\n\\r\\n    this.GetDrawData=function(obj) //获取已有的画图工具数据{Symbol: , Period:, }\\r\\n    {\\r\\n        var data=[];\\r\\n        var strKey=obj.Symbol+'-'+obj.Period;\\r\\n        if (!this.DrawData.has(strKey)) return data;\\r\\n\\r\\n        var stockData=this.DrawData.get(strKey);\\r\\n        for(var item of stockData)\\r\\n        {\\r\\n            data.push(item[1]);\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//  数据分割\\r\\n//  [0]=Start起始 [1]=End结束 [2]=FixInterval修正的间隔 [3]=Increase\\r\\n//\\r\\nfunction SplitData()\\r\\n{\\r\\n    this.Data=[\\r\\n        [0.000001,\\t0.000002,\\t0.000001,\\t0.0000001],\\r\\n        [0.000002,\\t0.000004,\\t0.000002,\\t0.0000002],\\r\\n        [0.000004,\\t0.000005,\\t0.000004,\\t0.0000001],\\r\\n        [0.000005,\\t0.00001,\\t0.000005,\\t0.0000005],\\r\\n\\r\\n        [0.00001,\\t0.00002,\\t0.00001,\\t0.000001],\\r\\n        [0.00002,\\t0.00004,\\t0.00002,\\t0.000002],\\r\\n        [0.00004,\\t0.00005,\\t0.00004,\\t0.000001],\\r\\n        [0.00005,\\t0.0001,\\t\\t0.00005,\\t0.000005],\\r\\n\\r\\n        [0.0001,\\t\\t0.0002,\\t\\t0.0001,\\t0.00001],\\r\\n        [0.0002,\\t\\t0.0004,\\t\\t0.0002,\\t0.00002],\\r\\n        [0.0004,\\t\\t0.0005,\\t\\t0.0004,\\t0.00001],\\r\\n        [0.0005,\\t\\t0.001,\\t\\t0.0005,\\t0.00005],\\r\\n\\r\\n        [0.001,\\t\\t0.002,\\t\\t0.001,\\t0.0001],\\r\\n        [0.002,\\t\\t0.004,\\t\\t0.002,\\t0.0002],\\r\\n        [0.004,\\t\\t0.005,\\t\\t0.004,\\t0.0001],\\r\\n        [0.005,\\t\\t0.01,\\t\\t0.005,\\t0.0005],\\r\\n\\r\\n        [0.01,\\t\\t0.02,\\t\\t0.01,\\t0.001],\\r\\n        [0.02,\\t\\t0.04,\\t\\t0.02,\\t0.002],\\r\\n        [0.04,\\t\\t0.05,\\t\\t0.04,\\t0.001],\\r\\n        [0.05,\\t\\t0.1,\\t\\t0.05,\\t0.005],\\r\\n\\r\\n        [0.1,\\t\\t0.2,\\t\\t0.1,\\t0.01],\\r\\n        [0.2,\\t\\t0.4,\\t\\t0.2,\\t0.02],\\r\\n        [0.4,\\t\\t0.5,\\t\\t0.4,\\t0.01],\\r\\n        [0.5,\\t\\t1,\\t\\t\\t0.5,\\t0.05],\\r\\n\\r\\n        [1,\\t\\t2,\\t\\t0.5,\\t0.05],\\r\\n        [2,\\t\\t4,\\t\\t0.5,\\t0.05],\\r\\n        [4,\\t\\t5,\\t\\t0.5,\\t0.05],\\r\\n        [5,\\t\\t10,\\t\\t0.5,\\t0.05],\\r\\n\\r\\n        [10,\\t\\t20,\\t\\t10,\\t2],\\r\\n        [20,\\t\\t40,\\t\\t20,\\t5],\\r\\n        [40,\\t\\t50,\\t\\t40,\\t2],\\r\\n        [50,\\t\\t100,\\t50,\\t10],\\r\\n\\r\\n        [100,\\t\\t200,\\t\\t100,\\t10],\\r\\n        [200,\\t\\t400,\\t\\t200,\\t20],\\r\\n        [400,\\t\\t500,\\t\\t400,\\t10],\\r\\n        [500,\\t\\t1000,\\t\\t500,\\t50],\\r\\n\\r\\n        [1000,\\t\\t2000,\\t\\t1000,\\t50],\\r\\n        [2000,\\t\\t4000,\\t\\t2000,\\t50],\\r\\n        [4000,\\t\\t5000,\\t\\t4000,\\t50],\\r\\n        [5000,\\t\\t10000,\\t\\t5000,\\t100],\\r\\n\\r\\n        [10000,\\t\\t20000,\\t\\t10000,\\t1000],\\r\\n        [20000,\\t\\t40000,\\t\\t10000,\\t1000],\\r\\n        [40000,\\t\\t50000,\\t\\t10000,\\t1000],\\r\\n        [50000,\\t\\t100000,\\t\\t10000,\\t1000],\\r\\n\\r\\n        [100000,\\t\\t200000,\\t\\t100000,\\t10000],\\r\\n        [200000,\\t\\t400000,\\t\\t100000,\\t10000],\\r\\n        [400000,\\t\\t500000,\\t\\t100000,\\t10000],\\r\\n        [500000,\\t\\t1000000,\\t100000,\\t10000],\\r\\n\\r\\n        [1000000,\\t\\t2000000,\\t\\t1000000,\\t100000],\\r\\n        [2000000,\\t\\t4000000,\\t\\t1000000,\\t100000],\\r\\n        [4000000,\\t\\t5000000,\\t\\t1000000,\\t100000],\\r\\n        [5000000,\\t\\t10000000,\\t\\t1000000,\\t100000],\\r\\n\\r\\n        [10000000,\\t\\t20000000,\\t\\t10000000,\\t1000000],\\r\\n        [20000000,\\t\\t40000000,\\t\\t10000000,\\t1000000],\\r\\n        [40000000,\\t\\t50000000,\\t\\t10000000,\\t1000000],\\r\\n        [50000000,\\t\\t100000000,\\t\\t10000000,\\t1000000],\\r\\n\\r\\n        [100000000,\\t\\t200000000,\\t\\t100000000,\\t10000000],\\r\\n        [200000000,\\t\\t400000000,\\t\\t100000000,\\t10000000],\\r\\n        [400000000,\\t\\t500000000,\\t\\t100000000,\\t10000000],\\r\\n        [500000000,\\t\\t1000000000,\\t\\t100000000,\\t10000000],\\r\\n\\r\\n        [1000000000,\\t\\t2000000000,\\t\\t1000000000,\\t100000000],\\r\\n        [2000000000,\\t\\t4000000000,\\t\\t1000000000,\\t100000000],\\r\\n        [4000000000,\\t\\t5000000000,\\t\\t1000000000,\\t100000000],\\r\\n        [5000000000,\\t\\t10000000000,\\t1000000000,\\t100000000]\\r\\n    ];\\r\\n\\r\\n    this.Find=function(interval)\\r\\n    {\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item =this.Data[i];\\r\\n            if (interval>item[0] && interval<=item[1])\\r\\n            {\\r\\n                var result={};\\r\\n                result.FixInterval=item[2];\\r\\n                result.Increase=item[3];\\r\\n                return result;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction PriceSplitData()\\r\\n{\\r\\n    this.newMethod=SplitData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Data=[\\r\\n        [0.000001,\\t0.000002,\\t0.000001,\\t0.0000001],\\r\\n        [0.000002,\\t0.000004,\\t0.000002,\\t0.0000002],\\r\\n        [0.000004,\\t0.000005,\\t0.000004,\\t0.0000001],\\r\\n        [0.000005,\\t0.00001,\\t0.000005,\\t0.0000005],\\r\\n\\r\\n        [0.00001,\\t0.00002,\\t0.00001,\\t0.000001],\\r\\n        [0.00002,\\t0.00004,\\t0.00002,\\t0.000002],\\r\\n        [0.00004,\\t0.00005,\\t0.00004,\\t0.000001],\\r\\n        [0.00005,\\t0.0001,\\t\\t0.00005,\\t0.000005],\\r\\n\\r\\n        [0.0001,\\t\\t0.0002,\\t\\t0.0001,\\t0.00001],\\r\\n        [0.0002,\\t\\t0.0004,\\t\\t0.0002,\\t0.00002],\\r\\n        [0.0004,\\t\\t0.0005,\\t\\t0.0004,\\t0.00001],\\r\\n        [0.0005,\\t\\t0.001,\\t\\t0.0005,\\t0.00005],\\r\\n\\r\\n        [0.001,\\t\\t0.002,\\t\\t0.001,\\t0.0001],\\r\\n        [0.002,\\t\\t0.004,\\t\\t0.002,\\t0.0001],\\r\\n        [0.004,\\t\\t0.005,\\t\\t0.004,\\t0.0001],\\r\\n        [0.005,\\t\\t0.01,\\t\\t0.005,\\t0.0005],\\r\\n\\r\\n        [0.01,\\t\\t0.02,\\t\\t0.01,\\t0.001],\\r\\n        [0.02,\\t\\t0.04,\\t\\t0.02,\\t0.001],\\r\\n        [0.04,\\t\\t0.05,\\t\\t0.04,\\t0.001],\\r\\n        [0.05,\\t\\t0.1,\\t\\t0.05,\\t0.001],\\r\\n\\r\\n        [0.1,\\t\\t0.2,\\t\\t0.1,\\t0.01],\\r\\n        [0.2,\\t\\t0.4,\\t\\t0.2,\\t0.01],\\r\\n        [0.4,\\t\\t0.5,\\t\\t0.2,\\t0.01],\\r\\n        [0.5,\\t\\t0.8,\\t\\t0.2,\\t0.01],\\r\\n        [0.8,\\t\\t1,\\t\\t\\t0.5,\\t0.01],\\r\\n\\r\\n        [1,\\t\\t2,\\t\\t0.5,\\t0.05],\\r\\n        [2,\\t\\t4,\\t\\t0.5,\\t0.05],\\r\\n        [4,\\t\\t5,\\t\\t0.5,\\t0.05],\\r\\n        [5,\\t\\t10,\\t\\t0.5,\\t0.05],\\r\\n\\r\\n        [10,\\t\\t12,\\t\\t10,\\t2],\\r\\n        [20,\\t\\t40,\\t\\t20,\\t5],\\r\\n        [40,\\t\\t50,\\t\\t40,\\t2],\\r\\n        [50,\\t\\t100,\\t50,\\t10],\\r\\n\\r\\n        [100,\\t\\t200,\\t\\t100,\\t10],\\r\\n        [200,\\t\\t400,\\t\\t200,\\t20],\\r\\n        [400,\\t\\t500,\\t\\t400,\\t10],\\r\\n        [500,\\t\\t1000,\\t\\t500,\\t50],\\r\\n\\r\\n        [1000,\\t\\t2000,\\t\\t1000,\\t50],\\r\\n        [2000,\\t\\t4000,\\t\\t2000,\\t50],\\r\\n        [4000,\\t\\t5000,\\t\\t4000,\\t50],\\r\\n        [5000,\\t\\t10000,\\t\\t5000,\\t100],\\r\\n\\r\\n        [10000,\\t\\t20000,\\t\\t10000,\\t1000],\\r\\n        [20000,\\t\\t40000,\\t\\t20000,\\t2000],\\r\\n        [40000,\\t\\t50000,\\t\\t40000,\\t1000],\\r\\n        [50000,\\t\\t100000,\\t\\t50000,\\t5000],\\r\\n\\r\\n        [100000,\\t\\t200000,\\t\\t100000,\\t10000],\\r\\n        [200000,\\t\\t400000,\\t\\t200000,\\t20000],\\r\\n        [400000,\\t\\t500000,\\t\\t400000,\\t10000],\\r\\n        [500000,\\t\\t1000000,\\t500000,\\t50000],\\r\\n\\r\\n        [1000000,\\t\\t2000000,\\t\\t1000000,\\t100000],\\r\\n        [2000000,\\t\\t4000000,\\t\\t2000000,\\t200000],\\r\\n        [4000000,\\t\\t5000000,\\t\\t4000000,\\t100000],\\r\\n        [5000000,\\t\\t10000000,\\t\\t5000000,\\t500000],\\r\\n\\r\\n        [10000000,\\t\\t20000000,\\t\\t10000000,\\t1000000],\\r\\n        [20000000,\\t\\t40000000,\\t\\t20000000,\\t2000000],\\r\\n        [40000000,\\t\\t50000000,\\t\\t40000000,\\t1000000],\\r\\n        [50000000,\\t\\t100000000,\\t\\t50000000,\\t5000000],\\r\\n\\r\\n        [100000000,\\t\\t200000000,\\t\\t100000000,\\t10000000],\\r\\n        [200000000,\\t\\t400000000,\\t\\t200000000,\\t20000000],\\r\\n        [400000000,\\t\\t500000000,\\t\\t400000000,\\t10000000],\\r\\n        [500000000,\\t\\t1000000000,\\t\\t500000000,\\t50000000],\\r\\n\\r\\n        [1000000000,\\t\\t2000000000,\\t\\t1000000000,\\t100000000],\\r\\n        [2000000000,\\t\\t4000000000,\\t\\t2000000000,\\t200000000],\\r\\n        [4000000000,\\t\\t5000000000,\\t\\t4000000000,\\t100000000],\\r\\n        [5000000000,\\t\\t10000000000,\\t5000000000,\\t500000000]\\r\\n    ];\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////\\r\\n//   全局配置颜色\\r\\n//\\r\\n//\\r\\nfunction JSChartResource()\\r\\n{\\r\\n    this.TooltipBGColor=\\\"rgb(255, 255, 255)\\\"; //背景色\\r\\n    this.TooltipAlpha=0.92;                  //透明度\\r\\n\\r\\n    this.SelectRectBGColor=\\\"rgba(1,130,212,0.06)\\\"; //背景色\\r\\n    //   this.SelectRectAlpha=0.06;                  //透明度\\r\\n\\r\\n    this.UpBarColor=\\\"rgb(238,21,21)\\\";   //上涨柱子颜色\\r\\n    this.DownBarColor=\\\"rgb(25,158,0)\\\";  //下跌柱子颜色\\r\\n    this.UnchagneBarColor=\\\"rgb(0,0,0)\\\"; //平盘柱子颜色\\r\\n    this.EmptyBarBGColor=\\\"rgb(255,255,255)\\\";  //空心柱子背景色\\r\\n\\r\\n    this.Minute={};\\r\\n    this.Minute.VolBarColor=null;                       //分时图成交量柱子颜色 默认不用, 设置了柱子就不是红绿了\\r\\n    this.Minute.VolTitleColor=\\\"rgb(105,105,105)\\\";\\r\\n    this.Minute.PriceColor=\\\"rgb(50,171,205)\\\";           //分时图价格线颜色\\r\\n    this.Minute.AreaPriceColor='rgba(50,171,205,0.1)';  //价格的面积图\\r\\n    this.Minute.AvPriceColor=\\\"rgb(238,127,9)\\\";          //分时图均价线颜色\\r\\n    this.Minute.PositionColor='rgb(218,165,32)';        //持仓量线段颜色\\r\\n    this.Minute.FrameSplitTextColor=null;   //刻度文字颜色 (缺省使用 this.FrameSplitTextColor)\\r\\n\\r\\n    this.Minute.Before=\\r\\n        {\\r\\n            BGColor:'rgba(240,240,240,0.7)',    //分钟 集合竞价背景\\r\\n            LineColor:\\\"rgb(50,171,205)\\\",        //集合竞价线段颜色\\r\\n            VolColor:[\\\"rgb(192,192,0)\\\"],        //成交量其他的颜色 colorID=3 开始\\r\\n            AvPriceColor:'rgb(190,190,190)',    //均线\\r\\n            Point:{ Color:\\\"rgb(65,105,225)\\\", Radius:2*GetDevicePixelRatio() },\\r\\n            CloseIcon:\\r\\n                {\\r\\n                    Family:'iconfont',\\r\\n                    Text:\\\"\\\\ue60c\\\",\\r\\n                    Color:\\\"rgb(112,128,144)\\\",\\r\\n                    Size:12\\r\\n                }                        //关闭按钮\\r\\n        };\\r\\n\\r\\n    this.DefaultTextColor=\\\"rgb(43,54,69)\\\";                          //图形中默认的字体颜色\\r\\n    this.DefaultTextFont=14*GetDevicePixelRatio() +'px 微软雅黑';    //图形中默认的字体\\r\\n    this.TitleFont=13*GetDevicePixelRatio() +'px 微软雅黑';          //指标显示,tooltip显示字体\\r\\n    this.IndexTitleBGColor='rgb(217,219,220)';                      //指标名字背景色\\r\\n    this.OverlayIndexTitleBGColor='rgba(255,255,255,0.7)';\\r\\n\\r\\n    this.Title={\\r\\n        TradeIndexColor:'rgb(105,105,105)', //交易指标颜色\\r\\n        ColorIndexColor:'rgb(112,128,144)',  //五彩K线颜色\\r\\n\\r\\n        VolColor:\\\"rgb(43,54,69)\\\",       //标题成交量\\r\\n        AmountColor:\\\"rgb(43,54,69)\\\",    //成交金额\\r\\n        DateTimeColor:\\\"rgb(43,54,69)\\\",  //时间,日期\\r\\n        SettingColor:\\\"rgb(43,54,69)\\\",   //周期,复权\\r\\n        NameColor:\\\"rgb(43,54,69)\\\" ,     //股票名称\\r\\n        TurnoverRateColor:'rgb(43,54,69)',       //换手率\\r\\n        PositionColor:\\\"rgb(43,54,69)\\\"       //持仓\\r\\n    };\\r\\n\\r\\n    this.UpTextColor=\\\"rgb(238,21,21)\\\";      //上涨文字颜色\\r\\n    this.DownTextColor=\\\"rgb(25,158,0)\\\";     //下跌文字颜色\\r\\n    this.UnchagneTextColor=\\\"rgb(0,0,0)\\\";    //平盘文字颜色\\r\\n    this.CloseLineColor='rgb(0,191,255)';   //收盘价线颜色\\r\\n    this.CloseLineAreaColor=['rgba(0,191,255,0.8)','rgba(0,191,255,0.2)'];  //收盘价面积图颜色\\r\\n    this.CloseLineWidth=2;  //收盘价面积图颜色线段宽度\\r\\n\\r\\n    this.FrameBorderPen=\\\"rgb(225,236,242)\\\";         //边框颜色\\r\\n    this.FrameSplitPen=\\\"rgb(225,236,242)\\\";          //刻度分割线\\r\\n    this.FrameDotSplitPen='rgb(105,105,105)';       //分割虚线\\r\\n    this.FrameYLineDash= null; //[5*GetDevicePixelRatio(), 5*GetDevicePixelRatio()];                     //Y轴线段虚线点间距,填null 就是实线\\r\\n    this.FrameXLineDash= null; //[5*GetDevicePixelRatio(), 5*GetDevicePixelRatio()];                   //X轴线段虚线点间距,填null 就是实线\\r\\n    this.FrameSplitTextColor=\\\"rgb(117,125,129)\\\";    //刻度文字颜色\\r\\n    this.FrameSplitTextFont=14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";            //坐标刻度文字字体\\r\\n    this.FrameTitleBGColor=\\\"rgb(246,251,253)\\\";  //标题栏背景色\\r\\n    this.Frame={\\r\\n        XBottomOffset:1*GetDevicePixelRatio(),  //X轴文字向下偏移\\r\\n        YTopOffset:2*GetDevicePixelRatio()      //Y轴顶部文字向下偏移\\r\\n    };\\r\\n\\r\\n    //百分比坐标文字颜色\\r\\n    this.Frame.PercentageText= {\\r\\n        PriceColor:'rgb(117,125,129)',\\r\\n        PercentageColor:\\\"rgb(117,125,129)\\\",\\r\\n        SplitColor:\\\"rgb(117,125,129)\\\",\\r\\n        Font:14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\"\\r\\n    };\\r\\n\\r\\n    //对数坐标\\r\\n    this.FrameLogarithmic= {\\r\\n        OpenPriceFont: \\\"bold \\\"+14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",     //开盘价刻度文字字体\\r\\n        MinInterval: 45*GetDevicePixelRatio()       //刻度最小间距\\r\\n    };\\r\\n\\r\\n    //等比坐标\\r\\n    this.FrameSplitIncrease= {\\r\\n        Increase:0.1    //涨幅\\r\\n    };\\r\\n\\r\\n    //等分坐标\\r\\n    this.FrameSplitAverage= {\\r\\n        Count:4     //分割个数\\r\\n    };\\r\\n\\r\\n    //黄金分割坐标\\r\\n    this.FrameGoldenSection=\\r\\n        {\\r\\n            Golden:[0, 0.191, 0.382, 0.5, 0.618, 0.809, 1]\\r\\n        };\\r\\n\\r\\n    //Y轴最新价格刻度颜色\\r\\n    this.FrameLatestPrice = {\\r\\n        TextColor:'rgb(255,255,255)',   //最新价格文字颜色\\r\\n        UpBarColor:\\\"rgb(238,21,21)\\\",    //上涨\\r\\n        DownBarColor:\\\"rgb(25,158,0)\\\",   //下跌\\r\\n        UnchagneBarColor:\\\"rgb(0,0,0)\\\",   //平盘\\r\\n        BGAlpha:0.6\\r\\n    };\\r\\n\\r\\n    this.FrameMargin=4;     //左右一共的边距\\r\\n    this.FrameLeftMargin=2;\\r\\n    this.FrameRightMargin=2;\\r\\n\\r\\n    this.DragSubFrameBorder= {\\r\\n        TopBorderHeight:6*GetDevicePixelRatio(), //拖拽边框高度\\r\\n        MinFrameHeight:50*GetDevicePixelRatio() //指标窗口最小高度\\r\\n    },\\r\\n\\r\\n        //叠加指标框架\\r\\n        this.OverlayFrame={\\r\\n            BolderPen:'rgb(190,190,190)',                    //指标边框线\\r\\n            TitleColor:'rgb(105,105,105)',                   //指标名字颜色\\r\\n            TitleFont:11*GetDevicePixelRatio() +'px arial',  //指标名字字体\\r\\n        };\\r\\n\\r\\n    this.CorssCursorBGColor=\\\"rgb(43,54,69)\\\";            //十字光标背景\\r\\n    this.CorssCursorTextColor=\\\"rgb(255,255,255)\\\";       //十字光文字颜色\\r\\n    this.CorssCursorTextFont=14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\";\\r\\n    this.CorssCursorHPenColor=\\\"rgb(130,130,130)\\\";          //十字光标线段颜色(水平)\\r\\n    this.CorssCursorVPenColor=\\\"rgb(130,130,130)\\\";          //十字光标线段颜色(垂直)\\r\\n    this.CorssCursorXRangeBGColor=\\\"rgba(100,149,237,0.3)\\\";  //十字光标X轴访问背景色\\r\\n\\r\\n    this.CorssCursor=\\r\\n        {\\r\\n            RightButton :\\r\\n                {\\r\\n                    BGColor:'rgb(43,54,69)',\\r\\n                    PenColor:'rgb(255,255,255)',\\r\\n                    Icon: { Text:'\\\\ue6a3', Color:'rgb(255,255,255)', Family:\\\"iconfont\\\", Size:18 }\\r\\n                }\\r\\n        };\\r\\n\\r\\n    this.LockBGColor = \\\"rgb(220, 220, 220)\\\";        //指标锁区域颜色\\r\\n    this.LockTextColor = \\\"rgb(210, 34, 34)\\\";        //指标锁提示信息文字颜色\\r\\n\\r\\n    this.Domain=\\\"https://opensource.zealink.com\\\";               //API域名\\r\\n    this.CacheDomain=\\\"https://opensourcecache.zealink.com\\\";     //缓存域名\\r\\n    this.PyIndexDomain='https://py.zealink.com';                //py指标计算域名\\r\\n\\r\\n    this.KLine={\\r\\n        MaxMin: {Font:12*GetDevicePixelRatio() +'px 微软雅黑',Color:'rgb(43,54,69)', RightArrow:\\\"→\\\", LeftArrow:\\\"←\\\", HighYOffset:0, LowYOffset:0},   //K线最大最小值显示\\r\\n        Info:  //信息地雷\\r\\n            {\\r\\n                Investor:\\r\\n                    {\\r\\n                        ApiUrl:'/API/NewsInteract', //互动易\\r\\n                        IconFont: { Family:'iconfont', Text:'\\\\ue631' , HScreenText:'\\\\ue684', Color:'#1c65db'} //SVG 文本\\r\\n                    },\\r\\n                Announcement:                                           //公告\\r\\n                    {\\r\\n                        ApiUrl:'/API/ReportList',\\r\\n                        IconFont: { Family:'iconfont', Text:'\\\\ue633', HScreenText:'\\\\ue685', Color:'#f5a521' },  //SVG 文本\\r\\n                        IconFont2: { Family:'iconfont', Text:'\\\\ue634', HScreenText:'\\\\ue686', Color:'#ed7520' }, //SVG 文本 //季报\\r\\n                    },\\r\\n                Pforecast:  //业绩预告\\r\\n                    {\\r\\n                        ApiUrl:'/API/StockHistoryDay',\\r\\n                        IconFont: { Family:'iconfont', Text:'\\\\ue62e', HScreenText:'\\\\ue687', Color:'#986cad' } //SVG 文本\\r\\n                    },\\r\\n                Research:   //调研\\r\\n                    {\\r\\n                        ApiUrl:'/API/InvestorRelationsList',\\r\\n                        IconFont: { Family:'iconfont', Text:'\\\\ue632', HScreenText:'\\\\ue688', Color:'#19b1b7' } //SVG 文本\\r\\n                    },\\r\\n                BlockTrading:   //大宗交易\\r\\n                    {\\r\\n                        ApiUrl:'/API/StockHistoryDay',\\r\\n                        IconFont: { Family:'iconfont', Text:'\\\\ue630', HScreenText:'\\\\ue689', Color:'#f39f7c' } //SVG 文本\\r\\n                    },\\r\\n                TradeDetail:    //龙虎榜\\r\\n                    {\\r\\n                        ApiUrl:'/API/StockHistoryDay',\\r\\n                        IconFont: { Family:'iconfont', Text:'\\\\ue62f', HScreenText:'\\\\ue68a' ,Color:'#b22626' } //SVG 文本\\r\\n                    },\\r\\n\\r\\n                //扩展图标库\\r\\n                IconLibrary:\\r\\n                    {\\r\\n                        Family:'iconfont',\\r\\n                        Icon:\\r\\n                            [\\r\\n                                { Text:'\\\\ue630', HScreenText:'\\\\ue689', Color:'#f39f7c' },\\r\\n                                { Text:'\\\\ue632', HScreenText:'\\\\ue688', Color:'#19b1b7' },\\r\\n                                { Text:'\\\\ue62f', HScreenText:'\\\\ue68a' ,Color:'#b22626' },\\r\\n                                { Text:'\\\\ue634', HScreenText:'\\\\ue686', Color:'#ed7520' }\\r\\n                            ]\\r\\n                    },\\r\\n\\r\\n            },\\r\\n        NumIcon:\\r\\n            {\\r\\n                Color:'rgb(251,80,80)',Family:'iconfont',\\r\\n                Text:[  '\\\\ue649',\\r\\n                    '\\\\ue63b','\\\\ue640','\\\\ue63d','\\\\ue63f','\\\\ue645','\\\\ue641','\\\\ue647','\\\\ue648','\\\\ue646','\\\\ue636',\\r\\n                    '\\\\ue635','\\\\ue637','\\\\ue638','\\\\ue639','\\\\ue63a','\\\\ue63c','\\\\ue63e','\\\\ue642','\\\\ue644','\\\\ue643'\\r\\n                ]\\r\\n            },\\r\\n        TradeIcon:  //交易指标 图标\\r\\n            {\\r\\n                Family:'iconfont',\\r\\n                Buy: { Color:'rgb(255,15,4)', Text:'\\\\ue683', HScreenText:'\\\\ue682'},\\r\\n                Sell: { Color:'rgb(64,122,22)', Text:'\\\\ue681',HScreenText:'\\\\ue680'},\\r\\n            }\\r\\n    };\\r\\n\\r\\n    this.Index={};\\r\\n    //指标线段颜色\\r\\n    this.Index.LineColor=\\r\\n        [\\r\\n            \\\"rgb(255,174,0)\\\",\\r\\n            \\\"rgb(25,199,255)\\\",\\r\\n            \\\"rgb(175,95,162)\\\",\\r\\n            \\\"rgb(236,105,65)\\\",\\r\\n            \\\"rgb(68,114,196)\\\",\\r\\n            \\\"rgb(229,0,79)\\\",\\r\\n            \\\"rgb(0,128,255)\\\",\\r\\n            \\\"rgb(252,96,154)\\\",\\r\\n            \\\"rgb(42,230,215)\\\",\\r\\n            \\\"rgb(24,71,178)\\\",\\r\\n\\r\\n        ];\\r\\n\\r\\n    this.OverlaySymbol={ Random:0 };    //Random 颜色的随机数\\r\\n    this.OverlaySymbol.Color=   //叠加股票颜色\\r\\n        [\\r\\n            \\\"rgb(38,198,218)\\\",\\r\\n            \\\"rgb(103,58,183)\\\",\\r\\n            \\\"rgb(0,191,165)\\\",\\r\\n            \\\"rgb(130,177,255)\\\",\\r\\n        ];\\r\\n\\r\\n    //历史数据api\\r\\n    this.Index.StockHistoryDayApiUrl=\\\"https://opensource.zealink.com/API/StockHistoryDay\\\";\\r\\n    //市场多空\\r\\n    this.Index.MarketLongShortApiUrl=\\\"https://opensource.zealink.com/API/FactorTiming\\\";\\r\\n    //市场关注度\\r\\n    this.Index.MarketAttentionApiUrl=\\\"https://opensource.zealink.com/API/MarketAttention\\\";\\r\\n    //行业,指数热度\\r\\n    this.Index.MarketHeatApiUrl=\\\"https://opensource.zealink.com/API/MarketHeat\\\";\\r\\n    //自定义指数热度\\r\\n    this.Index.CustomIndexHeatApiUrl=\\\"https://opensource.zealink.com/API/QuadrantCalculate\\\";\\r\\n\\r\\n    //指标不支持信息\\r\\n    this.Index.NotSupport={Font:\\\"14px 微软雅黑\\\", TextColor:\\\"rgb(52,52,52)\\\"};\\r\\n\\r\\n    //画图工具\\r\\n    this.DrawPicture={};\\r\\n    this.DrawPicture.LineColor=\\r\\n        [\\r\\n            \\\"rgb(30,144,255)\\\",\\r\\n        ];\\r\\n\\r\\n    this.DrawPicture.PointColor=\\r\\n        [\\r\\n            \\\"rgb(105,105,105)\\\",\\r\\n        ];\\r\\n\\r\\n    this.KLineTrain = {\\r\\n        Font:'bold 14px arial',\\r\\n        LastDataIcon: {Color:'rgb(0,0,205)',Text:'⬇'},\\r\\n        BuyIcon: {Color:'rgb(0,205,102 )',Text:'B'},\\r\\n        SellIcon: {Color:'rgb(255,127,36 )',Text:'S'},\\r\\n\\r\\n        IconFont:\\r\\n            {\\r\\n                Family:'iconfont',\\r\\n                Buy:{ Text:'\\\\ue64a', HScreenText:'\\\\ue68a' ,Color:'rgb(255,140,0)' },\\r\\n                Sell:{ Text:'\\\\ue64b', HScreenText:'\\\\ue68a' ,Color:'rgb(6,79,18)' },\\r\\n                Last:{ Text:'\\\\ue681', HScreenText:'\\\\ue68a' ,Color:'rgb(55,0,255)' },\\r\\n            }\\r\\n    };\\r\\n\\r\\n    //手机端tooltip\\r\\n    this.TooltipPaint = {\\r\\n        BGColor:'rgba(250,250,250,0.8)',    //背景色\\r\\n        BorderColor:'rgb(120,120,120)',     //边框颜色\\r\\n        TitleColor:'rgb(120,120,120)',       //标题颜色\\r\\n        TitleFont:13*GetDevicePixelRatio() +'px 微软雅黑',   //字体\\r\\n        DateTimeColor:'rgb(210,210,210)',\\r\\n        VolColor:\\\"rgb(210,210,210)\\\",       //标题成交量\\r\\n        AmountColor:\\\"rgb(210,210,210)\\\",    //成交金额\\r\\n    };\\r\\n\\r\\n    this.PCTooltip= {\\r\\n        LineHeight:25   //单行高度\\r\\n    };\\r\\n\\r\\n    //弹幕\\r\\n    this.Barrage= {\\r\\n        Font:16*GetDevicePixelRatio() +'px 微软雅黑',   //字体\\r\\n        Height:20,\\r\\n        Color:'RGB(109,109,109)'\\r\\n    }\\r\\n\\r\\n    //走势图 信息地雷\\r\\n    this.MinuteInfo={\\r\\n        TextColor: 'rgb(84,143,255)',\\r\\n        Font: 14*GetDevicePixelRatio() +'px 微软雅黑',\\r\\n        PointColor:'rgb(38,113,254)',\\r\\n        LineColor:'rgb(120,167,255)',\\r\\n        TextBGColor:'rgba(255,255,255,0.8)'\\r\\n    }\\r\\n\\r\\n    //画图工具-尺子\\r\\n    this.ChartDrawRuler=\\r\\n        {\\r\\n            TitleColor:null,    //K线信息标题颜色, (可选,不填使用涨跌颜色)\\r\\n        }\\r\\n\\r\\n    //画图工具-波浪尺\\r\\n    this.ChartDrawWaveRuler=\\r\\n        {\\r\\n            RulerWidth:10,          //刻度尺长度\\r\\n            RulerLineWidth:1,       //刻度线粗细\\r\\n            MaxScaleRuler:2,       //尺子最大的高度比\\r\\n            Font:14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",\\r\\n            ScaleRuler:\\r\\n                [\\r\\n                    {Value:0, Text:\\\"0.0%\\\"}, { Value:0.382, Text:\\\"38.2%\\\" }, { Value:0.618, Text:\\\"61.8%\\\" } ,{ Value:1, Text:\\\"100%\\\"},\\r\\n                    { Value:1.618, Text:\\\"161.8%\\\" }, { Value:2.0, Text:\\\"200%\\\" }\\r\\n                ]\\r\\n        }\\r\\n\\r\\n    this.ChartDrawWaveRuler2Point=\\r\\n        {\\r\\n            RulerWidth:20,          //刻度尺长度\\r\\n            RulerLineWidth:1,       //刻度线粗细\\r\\n            MaxScaleRuler:2,        //尺子最大的高度比\\r\\n            Font:14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",\\r\\n            ScaleRuler:\\r\\n                [\\r\\n                    {Value:0, Text:\\\"base\\\"},  { Value:0.618, Text:\\\"61.8%\\\" } ,{ Value:1, Text:\\\"100%\\\"},\\r\\n                    { Value:1.618, Text:\\\"161.8%\\\" }\\r\\n                ]\\r\\n        }\\r\\n\\r\\n    //多图标指标ChartMultiSVGIcon -> MULTI_SVGICON\\r\\n    //单图标指标ChartSingleText -> DRAWICON\\r\\n    this.DRAWICON=\\r\\n        {\\r\\n            Icon:\\r\\n                {\\r\\n                    MaxSize:24,  //图标最大\\r\\n                    MinSize:12,  //图标最小\\r\\n                    YOffset:0,\\r\\n\\r\\n                    Zoom:\\r\\n                        {\\r\\n                            Type:1,    //0=放大(K线宽度*Value) 1=放大(K线+间距)*Value 2=(K线+间距)+2*Value;\\r\\n                            Value:1\\r\\n                        }\\r\\n                },\\r\\n\\r\\n            Text:\\r\\n                {\\r\\n                    MaxSize:50,  //字体最大\\r\\n                    MinSize:12,  //字体最小\\r\\n                    YOffset:0,\\r\\n\\r\\n                    Zoom:\\r\\n                        {\\r\\n                            Type:1,    //0=放大(K线宽度*Value) 1=放大(K线+间距)*Value 2=(K线+间距)+2*Value;\\r\\n                            Value:1\\r\\n                        },\\r\\n\\r\\n                    FontName:'Arial'    //字体\\r\\n                }\\r\\n        }\\r\\n\\r\\n    this.DRAWTEXT=\\r\\n        {\\r\\n            MaxSize:30,  //字体最大\\r\\n            MinSize:20,  //字体最小\\r\\n            YOffset:0,\\r\\n\\r\\n            Zoom:\\r\\n                {\\r\\n                    Type:1,    //0=放大(K线宽度*Value) 1=放大(K线+间距)*Value 2=(K线+间距)+2*Value;\\r\\n                    Value:1\\r\\n                },\\r\\n\\r\\n            FontName:'微软雅黑'    //字体\\r\\n        }\\r\\n\\r\\n    this.DRAWNUMBER=\\r\\n        {\\r\\n            MaxSize:30,  //字体最大\\r\\n            MinSize:20,  //字体最小\\r\\n            YOffset:0,\\r\\n\\r\\n            Zoom:\\r\\n                {\\r\\n                    Type:1,    //0=放大(K线宽度*Value) 1=放大(K线+间距)*Value 2=(K线+间距)+2*Value;\\r\\n                    Value:1\\r\\n                },\\r\\n\\r\\n            FontName:'微软雅黑'    //字体\\r\\n        }\\r\\n\\r\\n    this.DRAWABOVE=\\r\\n        {\\r\\n            YOffset:0   //y坐标向上偏移\\r\\n        }\\r\\n\\r\\n    this.DRAWTEXT_FIX={ Font:14*GetDevicePixelRatio() +'px 微软雅黑' }\\r\\n    this.DRAWNUMBER_FIX={ Font:14*GetDevicePixelRatio() +'px 微软雅黑' }\\r\\n\\r\\n    //虚线配置\\r\\n    this.DOTLINE=\\r\\n        {\\r\\n            LineDash:[3,5]  //虚线配置\\r\\n        }\\r\\n\\r\\n    this.DRAWSL=\\r\\n        {\\r\\n            PixelWidth:15   //1个像素点宽度\\r\\n        }\\r\\n\\r\\n    this.CIRCLEDOT=\\r\\n        {\\r\\n            Radius:1.3*GetDevicePixelRatio()\\r\\n        }\\r\\n\\r\\n    this.POINTDOT=\\r\\n        {\\r\\n            Radius:2*GetDevicePixelRatio()\\r\\n        }\\r\\n\\r\\n    //筹码分布图\\r\\n    this.StockChip=\\r\\n        {\\r\\n            InfoColor:'rgb(0,0,0)', //文字颜色\\r\\n            DayInfoColor:'rgb(255,255,255)' //周期颜色内文字颜色\\r\\n        }\\r\\n\\r\\n    //深度图\\r\\n    this.DepthChart=\\r\\n        {\\r\\n            BidColor: { Line:\\\"rgb(82,176,123)\\\", Area:\\\"rgba(82,176,123,0.8)\\\"},  //卖\\r\\n            AskColor: { Line:\\\"rgb(207,76,89)\\\", Area:\\\"rgba(207,76,89, 0.8)\\\"},   //买\\r\\n            LineWidth:4\\r\\n        }\\r\\n\\r\\n    this.DepthCorss=\\r\\n        {\\r\\n            BidColor: { Line:\\\"rgb(82,176,123)\\\" },  //卖\\r\\n            AskColor: { Line:\\\"rgb(207,76,89)\\\" },   //买\\r\\n            LineWidth:2,    //线段宽度\\r\\n            LineDash:[3,3],\\r\\n            Tooltip:\\r\\n                {\\r\\n                    BGColor:'rgba(236,240,245, 0.8)', TextColor:\\\"rgb(130,140,151)\\\",\\r\\n                    Border:{ Top:5, Left:20, Bottom:5, Center: 5},\\r\\n                    Font:14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",\\r\\n                    LineHeight:16   //单行高度\\r\\n                }\\r\\n        }\\r\\n\\r\\n    //区间选择\\r\\n    this.RectSelect=\\r\\n        {\\r\\n            LineColor:\\\"rgb(64,64,64)\\\",          //竖线\\r\\n            LineWidth:1*GetDevicePixelRatio(),\\r\\n            LineDotted:[3,3],\\r\\n            AreaColor:\\\"rgba(234,234,234,0.5)\\\",     //面积\\r\\n        }\\r\\n\\r\\n    //自定义风格\\r\\n    this.SetStyle=function(style)\\r\\n    {\\r\\n        if (style.TooltipBGColor) this.TooltipBGColor = style.TooltipBGColor;\\r\\n        if (style.TooltipAlpha) this.TooltipAlpha = style.TooltipAlpha;\\r\\n        if (style.SelectRectBGColor) this.SelectRectBGColor = style.SelectRectBGColor;\\r\\n        if (style.UpBarColor) this.UpBarColor = style.UpBarColor;\\r\\n        if (style.DownBarColor) this.DownBarColor = style.DownBarColor;\\r\\n        if (style.UnchagneBarColor) this.UnchagneBarColor = style.UnchagneBarColor;\\r\\n        if (style.EmptyBarBGColor) this.EmptyBarBGColor=style.EmptyBarBGColor;\\r\\n        if (style.Minute)\\r\\n        {\\r\\n            if (style.Minute.VolBarColor) this.Minute.VolBarColor = style.Minute.VolBarColor;\\r\\n            if (style.Minute.VolTitleColor) this.Minute.VolTitleColor = style.Minute.VolTitleColor;\\r\\n            if (style.Minute.PriceColor) this.Minute.PriceColor = style.Minute.PriceColor;\\r\\n            if (style.Minute.AvPriceColor) this.Minute.AvPriceColor = style.Minute.AvPriceColor;\\r\\n            if (style.Minute.AreaPriceColor) this.Minute.AreaPriceColor = style.Minute.AreaPriceColor;\\r\\n            if (style.Minute.PositionColor) this.Minute.PositionColor = style.Minute.PositionColor;\\r\\n            if (style.Minute.FrameSplitTextColor) this.Minute.FrameSplitTextColor = style.Minute.FrameSplitTextColor;\\r\\n            if (style.Minute.Before)\\r\\n            {\\r\\n                var item=style.Minute.Before;\\r\\n                if (item.BGColor) this.Minute.Before.BGColor=item.BGColor;\\r\\n                if (item.LineColor) this.Minute.Before.LineColor=item.LineColor;\\r\\n                if (item.VolColor) this.Minute.Before.VolColor=item.VolColor;\\r\\n                if (item.AvPriceColor) this.Minute.Before.AvPriceColor=item.AvPriceColor;\\r\\n                if (item.CloseIcon) this.Minute.Before.CloseIcon=item.CloseIcon;\\r\\n                if (item.Point)\\r\\n                {\\r\\n                    if (item.Point.Color)  this.Minute.Before.Point.Color=item.Point.Color;\\r\\n                    if (item.Point.Radius)  this.Minute.Before.Point.Radius=item.Point.Radius;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (style.DefaultTextColor) this.DefaultTextColor = style.DefaultTextColor;\\r\\n        if (style.DefaultTextFont) this.DefaultTextFont = style.DefaultTextFont;\\r\\n        if (style.TitleFont) this.TitleFont = style.TitleFont;\\r\\n        if (style.IndexTitleBGColor) this.IndexTitleBGColor=style.IndexTitleBGColor;\\r\\n        if (style.OverlayIndexTitleBGColor) this.OverlayIndexTitleBGColor=style.OverlayIndexTitleBGColor;\\r\\n        if (style.UpTextColor) this.UpTextColor = style.UpTextColor;\\r\\n        if (style.DownTextColor) this.DownTextColor = style.DownTextColor;\\r\\n        if (style.UnchagneTextColor) this.UnchagneTextColor = style.UnchagneTextColor;\\r\\n        if (style.CloseLineColor) this.CloseLineColor = style.CloseLineColor;\\r\\n        if (style.CloseLineAreaColor) this.CloseLineAreaColor = style.CloseLineAreaColor;\\r\\n        if (style.CloseLineWidth) this.CloseLineWidth=style.CloseLineWidth;\\r\\n        if (style.FrameBorderPen) this.FrameBorderPen = style.FrameBorderPen;\\r\\n        if (style.FrameSplitPen) this.FrameSplitPen = style.FrameSplitPen;\\r\\n        if (style.FrameDotSplitPen) this.FrameDotSplitPen = style.FrameDotSplitPen;\\r\\n        if (style.FrameSplitTextColor) this.FrameSplitTextColor = style.FrameSplitTextColor;\\r\\n        if (style.FrameSplitTextFont) this.FrameSplitTextFont = style.FrameSplitTextFont;\\r\\n        if (style.FrameTitleBGColor) this.FrameTitleBGColor = style.FrameTitleBGColor;\\r\\n\\r\\n        if (style.Frame)\\r\\n        {\\r\\n            if (style.Frame.XBottomOffset) this.Frame.XBottomOffset=style.Frame.XBottomOffset;\\r\\n            if (style.Frame.YTopOffset) this.Frame.YTopOffset=style.Frame.YTopOffset;\\r\\n            if (style.Frame.PercentageText)\\r\\n            {\\r\\n                var item=style.Frame.PercentageText;\\r\\n                if (item.PriceColor) this.Frame.PercentageText.PriceColor=item.PriceColor;\\r\\n                if (item.PercentageColor) this.Frame.PercentageText.PercentageColor=item.PercentageColor;\\r\\n                if (item.SplitColor) this.Frame.PercentageText.SplitColor=item.SplitColor;\\r\\n                if (item.Font) this.Frame.PercentageText.Font=item.Font;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (style.FrameLatestPrice)\\r\\n        {\\r\\n            if (style.FrameLatestPrice.TextColor) this.FrameLatestPrice.TextColor = style.FrameLatestPrice.TextColor;\\r\\n            if (style.FrameLatestPrice.UpBarColor) this.FrameLatestPrice.UpBarColor = style.FrameLatestPrice.UpBarColor;\\r\\n            if (style.FrameLatestPrice.DownBarColor) this.FrameLatestPrice.DownBarColor = style.FrameLatestPrice.DownBarColor;\\r\\n            if (style.FrameLatestPrice.UnchagneBarColor) this.FrameLatestPrice.UnchagneBarColor = style.FrameLatestPrice.UnchagneBarColor;\\r\\n            if (style.FrameLatestPrice.BGAlpha) this.FrameLatestPrice.BGAlpha = style.FrameLatestPrice.BGAlpha;\\r\\n        }\\r\\n\\r\\n        if (style.CorssCursorBGColor) this.CorssCursorBGColor = style.CorssCursorBGColor;\\r\\n        if (style.CorssCursorTextColor) this.CorssCursorTextColor = style.CorssCursorTextColor;\\r\\n        if (style.CorssCursorTextFont) this.CorssCursorTextFont = style.CorssCursorTextFont;\\r\\n        if (style.CorssCursorVPenColor) this.CorssCursorVPenColor = style.CorssCursorVPenColor;\\r\\n        if (style.CorssCursorHPenColor) this.CorssCursorHPenColor = style.CorssCursorHPenColor;\\r\\n        if (style.CorssCursorBorderColor) this.CorssCursorBorderColor=style.CorssCursorBorderColor;\\r\\n        if (style.CorssCursorXRangeBGColor) this.CorssCursorXRangeBGColor=style.CorssCursorXRangeBGColor;\\r\\n        if (style.CorssCursor && style.CorssCursor.RightButton)\\r\\n        {\\r\\n            var item=style.CorssCursor.RightButton;\\r\\n            if (item.BGColor) this.CorssCursor.RightButton.BGColor=item.BGColor;\\r\\n            if (item.PenColor) this.CorssCursor.RightButton.PenColor=item.PenColor;\\r\\n            if (item.Icon) this.CorssCursor.RightButton.Icon=item.Icon;\\r\\n        }\\r\\n\\r\\n        if (style.KLine) this.KLine = style.KLine;\\r\\n\\r\\n        if (style.Index)\\r\\n        {\\r\\n            if (style.Index.LineColor) this.Index.LineColor = style.Index.LineColor;\\r\\n            if (style.Index.NotSupport) this.Index.NotSupport = style.Index.NotSupport;\\r\\n        }\\r\\n\\r\\n        if (style.ColorArray) this.ColorArray = style.ColorArray;\\r\\n\\r\\n        if (style.DrawPicture)\\r\\n        {\\r\\n            this.DrawPicture.LineColor = style.DrawPicture.LineColor;\\r\\n            this.DrawPicture.PointColor = style.DrawPicture.PointColor;\\r\\n        }\\r\\n\\r\\n        if (style.TooltipPaint)\\r\\n        {\\r\\n            if (style.TooltipPaint.BGColor) this.TooltipPaint.BGColor=style.TooltipPaint.BGColor;\\r\\n            if (style.TooltipPaint.BorderColor) this.TooltipPaint.BorderColor=style.TooltipPaint.BorderColor;\\r\\n            if (style.TooltipPaint.TitleColor) this.TooltipPaint.TitleColor=style.TooltipPaint.TitleColor;\\r\\n            if (style.TooltipPaint.TitleFont) this.TooltipPaint.TitleFont=style.TooltipPaint.TitleFont;\\r\\n\\r\\n            if (style.TooltipPaint.DateTimeColor) this.TooltipPaint.DateTimeColor=style.TooltipPaint.DateTimeColor;\\r\\n            if (style.TooltipPaint.VolColor) this.TooltipPaint.VolColor=style.TooltipPaint.VolColor;\\r\\n            if (style.TooltipPaint.AmountColor) this.TooltipPaint.AmountColor=style.TooltipPaint.AmountColor;\\r\\n        }\\r\\n\\r\\n        if (style.MinuteInfo)\\r\\n        {\\r\\n            if (style.MinuteInfo.TextColor) this.MinuteInfo.TextColor=style.MinuteInfo.TextColor;\\r\\n            if (style.MinuteInfo.Font) this.MinuteInfo.Font=style.MinuteInfo.Font;\\r\\n            if (style.MinuteInfo.PointColor) this.MinuteInfo.PointColor=style.MinuteInfo.PointColor;\\r\\n            if (style.MinuteInfo.LineColor) this.MinuteInfo.LineColor=style.MinuteInfo.LineColor;\\r\\n            if (style.MinuteInfo.TextBGColor) this.MinuteInfo.TextBGColor=style.MinuteInfo.TextBGColor;\\r\\n        }\\r\\n\\r\\n        if (style.Title)\\r\\n        {\\r\\n            if (style.Title.TradeIndexColor) this.Title.TradeIndexColor=style.Title.TradeIndexColor;\\r\\n            if (style.Title.ColorIndexColor) this.Title.ColorIndexColor=style.Title.ColorIndexColor;\\r\\n\\r\\n            if (style.Title.VolColor) this.Title.VolColor=style.Title.VolColor;\\r\\n            if (style.Title.AmountColor) this.Title.AmountColor=style.Title.AmountColor;\\r\\n            if (style.Title.DateTimeColor) this.Title.DateTimeColor=style.Title.DateTimeColor;\\r\\n            if (style.Title.NameColor) this.Title.NameColor=style.Title.NameColor;\\r\\n            if (style.Title.SettingColor) this.Title.SettingColor=style.Title.SettingColor;\\r\\n            if (style.Title.TurnoverRateColor) this.Title.TurnoverRateColor=style.Title.TurnoverRateColor;\\r\\n            if (style.Title.PositionColor) this.Title.PositionColor=style.Title.PositionColor;\\r\\n        }\\r\\n\\r\\n        if (style.DRAWICON)\\r\\n        {\\r\\n            if (style.DRAWICON.Icon)\\r\\n            {\\r\\n                var item=style.DRAWICON.Icon;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.MaxSize)) this.DRAWICON.Icon.MaxSize=item.MaxSize;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.MinSize)) this.DRAWICON.Icon.MinSize=item.MinSize;\\r\\n                if (item.Zoom) this.DRAWICON.Icon.Zoom=item.Zoom;\\r\\n                if (IFrameSplitOperator.IsNumber(item.YOffset)) this.DRAWICON.Icon.YOffset=item.YOffset;\\r\\n            }\\r\\n\\r\\n            if (style.DRAWICON.Text)\\r\\n            {\\r\\n                var item=style.DRAWICON.Text;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.MaxSize)) this.DRAWICON.Text.MaxSize=item.MaxSize;\\r\\n                if (IFrameSplitOperator.IsPlusNumber(item.MinSize)) this.DRAWICON.Text.MinSize=item.MinSize;\\r\\n                if (item.Zoom) this.DRAWICON.Text.Zoom=item.Zoom;\\r\\n                if (item.FontName) this.DRAWICON.Text.FontName=item.FontName;\\r\\n                if (IFrameSplitOperator.IsNumber(item.YOffset)) this.DRAWICON.Text.YOffset=item.YOffset;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (style.DRAWTEXT)\\r\\n        {\\r\\n            var item=style.DRAWTEXT;\\r\\n            if (IFrameSplitOperator.IsPlusNumber(item.MaxSize)) this.DRAWICON.MaxSize=item.MaxSize;\\r\\n            if (IFrameSplitOperator.IsPlusNumber(item.MinSize)) this.DRAWICON.MinSize=item.MinSize;\\r\\n            if (item.Zoom) this.DRAWTEXT.Zoom=item.Zoom;\\r\\n            if (item.FontName) this.DRAWTEXT.FontName=item.FontName;\\r\\n            if (IFrameSplitOperator.IsNumber(item.YOffset)) this.DRAWTEXT.YOffset=item.YOffset;\\r\\n        }\\r\\n\\r\\n        if (style.DRAWTEXT_FIX)\\r\\n        {\\r\\n            var item=style.DRAWTEXT_FIX;\\r\\n            if (item.Font) this.DRAWTEXT_FIX.Font=item.Font;\\r\\n        }\\r\\n\\r\\n        if (style.DRAWNUMBER_FIX)\\r\\n        {\\r\\n            var item=style.DRAWNUMBER_FIX;\\r\\n            if (item.Font) this.DRAWNUMBER_FIX.Font=item.Font;\\r\\n        }\\r\\n\\r\\n        if (style.DRAWNUMBER)\\r\\n        {\\r\\n            var item=style.DRAWNUMBER;\\r\\n            if (IFrameSplitOperator.IsPlusNumber(item.MaxSize)) this.DRAWNUMBER.MaxSize=item.MaxSize;\\r\\n            if (IFrameSplitOperator.IsPlusNumber(item.MinSize)) this.DRAWNUMBER.MinSize=item.MinSize;\\r\\n            if (item.Zoom) this.DRAWNUMBER.Zoom=item.Zoom;\\r\\n            if (item.FontName) this.DRAWNUMBER.FontName=item.FontName;\\r\\n            if (IFrameSplitOperator.IsNumber(item.YOffset)) this.DRAWNUMBER.YOffset=item.YOffset;\\r\\n        }\\r\\n\\r\\n        if (style.DRAWABOVE)\\r\\n        {\\r\\n            var item=style.DRAWABOVE;\\r\\n            if (IFrameSplitOperator.IsNumber(item.YOffset)) this.DRAWABOVE.YOffset=item.YOffset;\\r\\n        }\\r\\n\\r\\n        if (style.DOTLINE) this.DOTLINE=style.DOTLINE;\\r\\n        if (style.DRAWSL) this.DOTLINE=style.DRAWSL;\\r\\n\\r\\n        if (style.DragSubFrameBorder) this.DragSubFrameBorder=style.DragSubFrameBorder;\\r\\n\\r\\n        if (style.StockChip)\\r\\n        {\\r\\n            var item=style.StockChip;\\r\\n            if (item.InfoColor) this.StockChip.InfoColor=item.InfoColor;\\r\\n            if (item.DayInfoColor) this.StockChip.DayInfoColor=item.DayInfoColor;\\r\\n        }\\r\\n\\r\\n        if (style.DepthChart)\\r\\n        {\\r\\n            var item=style.DepthChart;\\r\\n            if (item.BidColor)\\r\\n            {\\r\\n                if (item.BidColor.Line) this.DepthChart.BidColor.Line=item.BidColor.Line;\\r\\n                if (item.BidColor.Area) this.DepthChart.BidColor.Area=item.BidColor.Area;\\r\\n            }\\r\\n            if (item.AskColor)\\r\\n            {\\r\\n                if (item.AskColor.Line) this.DepthChart.AskColor.Line=item.AskColor.Line;\\r\\n                if (item.AskColor.Area) this.DepthChart.AskColor.Area=item.AskColor.Area;\\r\\n            }\\r\\n\\r\\n            if (item.LineWidth) this.DepthChart.LineWidth=item.LineWidth;\\r\\n        }\\r\\n\\r\\n        if (style.DepthCorss)\\r\\n        {\\r\\n            var item=style.DepthCorss;\\r\\n            if (item.BidColor)\\r\\n            {\\r\\n                if (item.BidColor.Line) this.DepthCorss.BidColor.Line=item.BidColor.Line;\\r\\n            }\\r\\n\\r\\n            if (item.AskColor)\\r\\n            {\\r\\n                if (item.AskColor.Line) this.DepthCorss.AskColor.Line=item.AskColor.Line;\\r\\n            }\\r\\n\\r\\n            if (item.LineWidth) this.DepthCorss.LineWidth=item.LineWidth;\\r\\n            if (item.LineDash) this.DepthCorss.LineDash=item.LineDash;\\r\\n\\r\\n            if (item.Tooltip)\\r\\n            {\\r\\n                var tooltip=item.Tooltip;\\r\\n                if (tooltip.BGColor) this.DepthCorss.Tooltip.BGColor=tooltip.BGColor;\\r\\n                if (tooltip.TextColor) this.DepthCorss.Tooltip.TextColor=tooltip.TextColor;\\r\\n                if (tooltip.Font) this.DepthCorss.Tooltip.Font=tooltip.Font;\\r\\n                if (tooltip.LineHeight) this.DepthCorss.Tooltip.LineHeight=tooltip.LineHeight;\\r\\n\\r\\n                var border=tooltip.Border;\\r\\n                if (IFrameSplitOperator.IsNumber(border.Top)) this.DepthCorss.Tooltip.Border.Top=border.Top;\\r\\n                if (IFrameSplitOperator.IsNumber(border.Left)) this.DepthCorss.Tooltip.Border.Left=border.Left;\\r\\n                if (IFrameSplitOperator.IsNumber(border.Bottom)) this.DepthCorss.Tooltip.Border.Bottom=border.Bottom;\\r\\n                if (IFrameSplitOperator.IsNumber(border.Center)) this.DepthCorss.Tooltip.Border.Center=border.Center;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (style.CIRCLEDOT)\\r\\n        {\\r\\n            var item=style.CIRCLEDOT;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Radius)) this.CIRCLEDOT.Radius=item.Radius;\\r\\n        }\\r\\n\\r\\n        if (style.POINTDOT)\\r\\n        {\\r\\n            var item=style.POINTDOT;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Radius)) this.POINTDOT.Radius=item.Radius;\\r\\n        }\\r\\n\\r\\n        if (style.RectSelect)\\r\\n        {\\r\\n            var item=style.RectSelect;\\r\\n            if (item.LineColor) this.RectSelect.LineColor=item.LineColor;\\r\\n            if (item.LineWidth>0) this.RectSelect.LineWidth=item.LineWidth;\\r\\n            if (item.LineDotted) this.RectSelect.LineDotted=item.LineDotted;\\r\\n            if (item.AreaColor) this.RectSelect.AreaColor=item.AreaColor;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nvar g_JSChartResource=new JSChartResource();\\r\\n\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////////\\r\\n//\\r\\n//\\r\\n//\\r\\nvar JSCHART_LANGUAGE_ID=\\r\\n    {\\r\\n        LANGUAGE_CHINESE_ID:0,  //简体中文 CN\\r\\n        LANGUAGE_ENGLISH_ID:1,  //英文 EN\\r\\n        LANGUAGE_TRADITIONAL_CHINESE_ID:2,  //繁体中文 TC\\r\\n    };\\r\\n\\r\\nfunction JSChartLocalization()\\r\\n{\\r\\n    this.TextResource=new Map([\\r\\n        //内部tooltip\\r\\n        ['Tooltip-Open', {CN:'开:', EN:'O:', TC:'開'}],\\r\\n        ['Tooltip-High', {CN:'高:', EN:'H:', TC:'高'}],\\r\\n        ['Tooltip-Low', {CN:'低:', EN:'L:', TC:'低'}],\\r\\n        ['Tooltip-Close', {CN:'收:', EN:'C:', TC:'收'}],\\r\\n        ['Tooltip-Increase', {CN:'幅:', EN:'I:', TC:'幅'}],\\r\\n        ['Tooltip-Vol', {CN:'量:', EN:'V:', TC:'量'}],\\r\\n        ['Tooltip-Amount', {CN:'额:', EN:'A:', TC:'額'}],\\r\\n        ['Tooltip-AvPrice', {CN:'均:', EN:'AP:', TC:'均'}],\\r\\n        ['Tooltip-Price', {CN:'价:', EN:'P:', TC:'價'}],\\r\\n        ['Tooltip-Exchange', {CN:'换:', EN:'E:', TC:'換'}],\\r\\n        ['Tooltip-Position',{CN:'持:', EN:'P:', TC:'持'}],\\r\\n\\r\\n        ['DivTooltip-Open', {CN:'开盘:', EN:'Open:', TC:'開盤'}],\\r\\n        ['DivTooltip-High', {CN:'最高:', EN:'High:', TC:'最高'}],\\r\\n        ['DivTooltip-Low', {CN:'最低:', EN:'Low:', TC:'最低'}],\\r\\n        ['DivTooltip-Close', {CN:'收盘:', EN:'Close:', TC:'收盤'}],\\r\\n        ['DivTooltip-Increase', {CN:'涨幅:', EN:'Increase:', TC:'漲幅'}],\\r\\n        ['DivTooltip-Vol', {CN:'数量:', EN:'Volume:', TC:'數量'}],\\r\\n        ['DivTooltip-Amount', {CN:'金额:', EN:'Amount:', TC:'金額'}],\\r\\n        ['DivTooltip-Exchange', {CN:'换手:', EN:'Exchange:', TC:'換手'}],\\r\\n        ['DivTooltip-Position', {CN:'持仓:', EN:'Position:', TC:'持倉'}],\\r\\n        ['DivTooltip-Price', {CN:'价格:', EN:'Open:', TC:'價格'}],\\r\\n\\r\\n        //K线动态标题\\r\\n        ['KTitle-Open', {CN:'开:', EN:'O:', TC:'開'}],\\r\\n        ['KTitle-High', {CN:'高:', EN:'H:', TC:'高'}],\\r\\n        ['KTitle-Low', {CN:'低:', EN:'L:', TC:'低'}],\\r\\n        ['KTitle-Close', {CN:'收:', EN:'C:', TC:'收'}],\\r\\n        ['KTitle-Increase', {CN:'幅:', EN:'I:', TC:'幅'}],\\r\\n        ['KTitle-Vol', {CN:'量:', EN:'V:', TC:'量'}],\\r\\n        ['KTitle-Amount', {CN:'额:', EN:'A:', TC:'額'}],\\r\\n        ['KTitle-Exchange', {CN:'换:', EN:'E:', TC:'換'}],\\r\\n        ['KTitle-Position', {CN:'持:', EN:'P:', TC:'持'}],\\r\\n        ['KTitle-Price', {CN:'价:', EN:'Price:', TC:'價'}],\\r\\n\\r\\n        //走势图动态标题\\r\\n        ['MTitle-AC-Price', {CN:'匹配价:', EN:'C:', TC:'匹配價'}],\\r\\n        ['MTitle-AC-AvPrice', {CN:'匹配均价:', EN:'C:', TC:'匹配均價'}],\\r\\n        ['MTitle-AC-Increase', {CN:'竞价涨幅:', EN:'I:', TC:'競價漲幅'}],\\r\\n        ['MTitle-AC-Vol', {CN:'匹配量:', EN:'V:', TC:'匹配量'}],\\r\\n        ['MTitle-AC-NotMatchVol', {CN:'未匹配量:', EN:'NV:', TC:'未匹配量'}],\\r\\n\\r\\n        //走势图标题\\r\\n        ['MTitle-Close', {CN:'价:', EN:'C:', TC:'價'}],\\r\\n        ['MTitle-AvPrice', {CN:'均:', EN:'AC:', TC:'均'}],\\r\\n        ['MTitle-Increase', {CN:'幅:', EN:'I:', TC:'幅'}],\\r\\n        ['MTitle-Vol', {CN:'量:', EN:'V:', TC:'量'}],\\r\\n        ['MTitle-Amount', {CN:'额:', EN:'A:', TC:'額'}],\\r\\n        ['MTitle-Position', {CN:'持:', EN:'P:', TC:'持'}],\\r\\n\\r\\n        //周期\\r\\n        ['日线', {CN:'日线', EN:'1D', TC:'日綫'}],\\r\\n        ['周线', {CN:'周线', EN:'1W', TC:'周綫'}],\\r\\n        ['双周', {CN:'双周', EN:\\\"2W\\\", TC:'雙周'}],\\r\\n        ['月线', {CN:'月线', EN:'1M', TC:'月綫'}],\\r\\n        [\\\"半年\\\", {CN:'半年', EN:'HY', TC:'半年'}],\\r\\n        ['年线', {CN:'年线', EN:'1Y', TC:'年綫'}],\\r\\n        ['1分', {CN:'1分', EN:'1Min', TC:'1分'}],\\r\\n        ['5分', {CN:'5分', EN:'5Min', TC:'5分'}],\\r\\n        ['15分', {CN:'15分', EN:'15Min', TC:'15分'}],\\r\\n        ['30分', {CN:'30分', EN:'30Min', TC:'30分'}],\\r\\n        ['60分', {CN:'60分', EN:'60Min', TC:'60分'}],\\r\\n        ['季线', {CN:'季线', EN:'1Q', TC:'季綫'}],\\r\\n        ['分笔', {CN:'分笔', EN:'Tick', TC:'分筆'}],\\r\\n        ['2小时', {CN:'2小时', EN:'2H', TC:'2小時'}],\\r\\n        ['4小时', {CN:'4小时', EN:'4H', TC:'4小時'}],\\r\\n\\r\\n        //复权\\r\\n        ['不复权', {CN:'不复权', EN:'No Right', TC:'不復權'}],\\r\\n        ['前复权', {CN:'前复权', EN:'Pro Right', TC:'前復權'}],\\r\\n        ['后复权', {CN:'后复权', EN:'Post Right', TC:'后復權'}],\\r\\n\\r\\n        //week\\r\\n        ['日', {CN:'日', EN:'Sun.', TC:'日'}],\\r\\n        ['一', {CN:'一', EN:'Mon.', TC:'壹'}],\\r\\n        ['二', {CN:'二', EN:'Tues.', TC:'貳'}],\\r\\n        ['三', {CN:'三', EN:'Wed.', TC:'叁'}],\\r\\n        ['四', {CN:'四', EN:'Thur.', TC:'肆'}],\\r\\n        ['五', {CN:'五', EN:'Fri.', TC:'伍'}],\\r\\n        ['六', {CN:'六', EN:'Sat.', TC:'陸'}],\\r\\n\\r\\n        ['1月', {CN:'1月', EN:'Jan', TC:'1月'}],\\r\\n        ['2月', {CN:'2月', EN:'Feb', TC:'2月'}],\\r\\n        ['3月', {CN:'3月', EN:'Mar', TC:'3月'}],\\r\\n        ['4月', {CN:'4月', EN:'Apr', TC:'4月'}],\\r\\n        ['5月', {CN:'5月', EN:'May', TC:'5月'}],\\r\\n        ['6月', {CN:'6月', EN:'Jun', TC:'6月'}],\\r\\n        ['7月', {CN:'7月', EN:'Jul', TC:'7月'}],\\r\\n        ['8月', {CN:'8月', EN:'Aug', TC:'8月'}],\\r\\n        ['9月', {CN:'9月', EN:'Sept', TC:'9月'}],\\r\\n        ['10月', {CN:'10月', EN:'Oct', TC:'10月'}],\\r\\n        ['11月', {CN:'11月', EN:'Nov', TC:'11月'}],\\r\\n        ['12月', {CN:'12月', EN:'Dec', TC:'12月'}],\\r\\n\\r\\n        ['自定义分钟', {CN:'分', EN:'Min', TC:'分'}],\\r\\n        ['自定义日线', {CN:'日', EN:'D', TC:'日'}],\\r\\n        ['自定义秒', {CN:'秒', EN:'S', TC:'秒'}],\\r\\n\\r\\n        [\\\"MVol-Vol\\\", {CN:\\\"成交量\\\", EN:\\\"Volume\\\", TC:'成交量'} ],\\r\\n        [\\\"MVol-Position\\\", {CN:\\\"持仓量\\\", EN:\\\"Position\\\", TC:'持倉量'} ]\\r\\n\\r\\n    ]);\\r\\n\\r\\n    this.GetText=function(key,language)\\r\\n    {\\r\\n        var item=this.TextResource.get(key);\\r\\n        if (!item) return '';\\r\\n\\r\\n        switch(language)\\r\\n        {\\r\\n            case JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID:\\r\\n                return item.CN;\\r\\n            case JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID:\\r\\n                return item.EN;\\r\\n            case JSCHART_LANGUAGE_ID.LANGUAGE_TRADITIONAL_CHINESE_ID:\\r\\n                return item.TC;\\r\\n            default:\\r\\n                return item.CN;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetTextResource=function(key,value)\\r\\n    {\\r\\n        this.TextResource.set(key,value)\\r\\n    }\\r\\n};\\r\\n\\r\\nvar g_JSChartLocalization=new JSChartLocalization();\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n    指标列表 指标信息都在这里,不够后面再加字段\\r\\n*/\\r\\nfunction JSIndexMap()\\r\\n{\\r\\n\\r\\n}\\r\\n\\r\\nJSIndexMap.Get=function(id)\\r\\n{\\r\\n    var indexMap=new Map(\\r\\n        [\\r\\n            //公司自己的指标\\r\\n            [\\\"市场多空\\\",    {IsMainIndex:false,  Create:function(){ return new MarketLongShortIndex()}  }],\\r\\n            [\\\"市场择时\\\",    {IsMainIndex:false,  Create:function(){ return new MarketTimingIndex()}  }],\\r\\n            [\\\"市场关注度\\\",  {IsMainIndex:false,  Create:function(){ return new MarketAttentionIndex()}  }],\\r\\n            [\\\"指数热度\\\",    {IsMainIndex:false,  Create:function(){ return new MarketHeatIndex()}  }],\\r\\n            [\\\"财务粉饰\\\",    {IsMainIndex:false,  Create:function(){ return new BenfordIndex()}  }],\\r\\n\\r\\n            [\\\"自定义指数热度\\\", {IsMainIndex:false,  Create:function(){ return new CustonIndexHeatIndex()} , Name:'自定义指数热度'} ],   //废弃\\r\\n\\r\\n            //能图指标\\r\\n            [\\\"能图-趋势\\\",       {IsMainIndex:false,  Create:function(){ return new LighterIndex1()},   Name:'大盘/个股趋势'  }],    //废弃\\r\\n            [\\\"能图-位置研判\\\",   {IsMainIndex:false,  Create:function(){ return new LighterIndex2()},   Name:'位置研判'  }], //废弃\\r\\n            [\\\"能图-点位研判\\\",   {IsMainIndex:false,  Create:function(){ return new LighterIndex3()},   Name:'点位研判'  }],  //废弃\\r\\n\\r\\n            ['CJL',  { IsMainIndex:false,  Create:function(){ return new JSIndex_CJL(); }  } ],    //期货指标\\r\\n        ]\\r\\n    );\\r\\n\\r\\n    return indexMap.get(id);\\r\\n}\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//      指标计算方法\\r\\n//\\r\\n//\\r\\n//\\r\\n\\r\\nfunction HQIndexFormula()\\r\\n{\\r\\n\\r\\n}\\r\\n\\r\\n//指数平均数指标 EMA(close,10)\\r\\nHQIndexFormula.EMA=function(data,dayCount)\\r\\n{\\r\\n    var result = [];\\r\\n\\r\\n    var offset=0;\\r\\n    if (offset>=data.length) return result;\\r\\n\\r\\n    //取首个有效数据\\r\\n    for(;offset<data.length;++offset)\\r\\n    {\\r\\n        if (data[offset]!=null && !isNaN(data[offset]))\\r\\n            break;\\r\\n    }\\r\\n\\r\\n    var p1Index=offset;\\r\\n    var p2Index=offset+1;\\r\\n\\r\\n    result[p1Index]=data[p1Index];\\r\\n    for(var i=offset+1;i<data.length;++i,++p1Index,++p2Index)\\r\\n    {\\r\\n        result[p2Index]=((2*data[p2Index]+(dayCount-1)*result[p1Index]))/(dayCount+1);\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.SMA=function(data,n,m)\\r\\n{\\r\\n    var result = [];\\r\\n\\r\\n    var i=0;\\r\\n    var lastData=null;\\r\\n    for(;i<data.length; ++i)\\r\\n    {\\r\\n        if (data[i]==null || isNaN(data[i])) continue;\\r\\n        lastData=data[i];\\r\\n        result[i]=lastData; //第一天的数据\\r\\n        break;\\r\\n    }\\r\\n\\r\\n    for(++i;i<data.length;++i)\\r\\n    {\\r\\n        result[i]=(m*data[i]+(n-m)*lastData)/n;\\r\\n        lastData=result[i];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    求动态移动平均.\\r\\n    用法: DMA(X,A),求X的动态移动平均.\\r\\n    算法: 若Y=DMA(X,A)则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1.\\r\\n    例如:DMA(CLOSE,VOL/CAPITAL)表示求以换手率作平滑因子的平均价\\r\\n*/\\r\\nHQIndexFormula.DMA=function(data,data2)\\r\\n{\\r\\n    var result = [];\\r\\n    if (data.length<0 || data.length!=data2.length) return result;\\r\\n\\r\\n    var index=0;\\r\\n    for(;index<data.length;++index)\\r\\n    {\\r\\n        if (data[index]!=null && !isNaN(data[index]) && data2[index]!=null && !isNaN(data2[index]))\\r\\n        {\\r\\n            result[index]=data[index];\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    for(index=index+1;index<data.length;++index)\\r\\n    {\\r\\n        if (data[index]==null || data2[index]==null)\\r\\n            result[index]=null;\\r\\n        else\\r\\n        {\\r\\n            if (data[index]<1)\\r\\n                result[index]=(data2[index]*data[index])+(1-data2[index])*result[index-1];\\r\\n            else\\r\\n                result[index]= data[index];\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\nHQIndexFormula.HHV=function(data,n)\\r\\n{\\r\\n    var result = [];\\r\\n    if (n>data.length) return result;\\r\\n\\r\\n    var max=-10000;\\r\\n    for(var i=n,j=0;i<data.length;++i,++j)\\r\\n    {\\r\\n        if(i<n+max)\\r\\n        {\\r\\n            max=data[i]<data[max]?max:i;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(j=(max=i-n+1)+1;j<=i;++j)\\r\\n            {\\r\\n                if(data[j]>data[max])\\r\\n                    max = j;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        result[i] = data[max];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.LLV=function(data,n)\\r\\n{\\r\\n    var result = [];\\r\\n    if (n>data.length) return result;\\r\\n\\r\\n    var min=-10000;\\r\\n\\r\\n    for(var i=n;i<data.length;++i,++j)\\r\\n    {\\r\\n        if(i<n+min)\\r\\n        {\\r\\n            min=data[i]>data[min]?min:i;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var j=(min=i-n+1)+1;j<=i;++j)\\r\\n            {\\r\\n                if(data[j]<data[min])\\r\\n                    min = j;\\r\\n            }\\r\\n        }\\r\\n        result[i] = data[min];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.REF=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n    if (data.length<=0) return result;\\r\\n    if (n>=data.length) return result;\\r\\n\\r\\n    result=data.slice(0,data.length-n);\\r\\n\\r\\n    for(var i=0;i<n;++i)\\r\\n        result.unshift(null);\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.REFDATE=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n    if (data.length<=0) return result;\\r\\n\\r\\n    //暂时写死取最后一个\\r\\n    n=data.length-1;\\r\\n    for(var i in data)\\r\\n    {\\r\\n        result[i]=data[n];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\nHQIndexFormula.SUM=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n    if (n==0)\\r\\n    {\\r\\n        result[0]=data[0];\\r\\n\\r\\n        for (var i=1; i<data.length; ++i)\\r\\n        {\\r\\n            result[i] = result[i-1]+data[i];\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n\\r\\n        for(var i=n-1,j=0;i<data.length;++i,++j)\\r\\n        {\\r\\n            for(var k=0;k<n;++k)\\r\\n            {\\r\\n                if (k==0) result[i]=data[k+j];\\r\\n                else result[i]+=data[k+j];\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//两个数组相减\\r\\nHQIndexFormula.ARRAY_SUBTRACT=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            if (data[i]==null || isNaN(data[i]))\\r\\n                result[i]=null;\\r\\n            else\\r\\n                result[i]=data[i]-data2;\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n            {\\r\\n                if (data[i]==null || data2[i]==null) result[i]=null;\\r\\n                else result[i]=data[i]-data2[i];\\r\\n            }\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组 data>data2比较 返回 0/1 数组\\r\\nHQIndexFormula.ARRAY_GT=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i]>data2 ? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n                result[i]=data[i]>data2[i] ? 1:0;\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组 data>=data2比较 返回 0/1 数组\\r\\nHQIndexFormula.ARRAY_GTE=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i]>=data2 ? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n                result[i]=data[i]>=data2[i] ? 1:0;\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组 data<data2比较 返回 0/1 数组\\r\\nHQIndexFormula.ARRAY_LT=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i]<data2 ? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n                result[i]=data[i]<data2[i] ? 1:0;\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组 data<=data2比较 返回 0/1 数组\\r\\nHQIndexFormula.ARRAY_LTE=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i]<=data2 ? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n                result[i]=data[i]<=data2[i] ? 1:0;\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组 data==data2比较 返回 0/1 数组\\r\\nHQIndexFormula.ARRAY_EQ=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i]==data2 ? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n                result[i]=(data[i]==data2[i] ? 1:0);\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.ARRAY_IF=function(data,trueData,falseData)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=[typeof(trueData)==\\\"number\\\",typeof(falseData)==\\\"number\\\"];\\r\\n    for(var i in data)\\r\\n    {\\r\\n        if (data[i])\\r\\n        {\\r\\n            if (IsNumber[0]) result[i]=trueData;\\r\\n            else result[i]=trueData[i];\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (IsNumber[1]) result[i]=falseData;\\r\\n            else result[i]=falseData[i];\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.ARRAY_AND=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i] && data2? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n                result[i]=(data[i] && data2[i] ? 1:0);\\r\\n            else\\r\\n                result[i]=0;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\nHQIndexFormula.ARRAY_OR=function(data, data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=(data[i] || data2? 1:0);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length)\\r\\n\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i < data.length && data[i])\\r\\n            {\\r\\n                result[i] = 1;\\r\\n                continue;\\r\\n            }\\r\\n            if (i < data2.length && data2[i])\\r\\n            {\\r\\n                result[i] = 1;\\r\\n                continue;\\r\\n            }\\r\\n            result[i] = 0;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n//数组相乘\\r\\n//支持多个参数累乘 如:HQIndexFormula.ARRAY_MULTIPLY(data,data2,data3,data3) =data*data2*data3*data4\\r\\nHQIndexFormula.ARRAY_MULTIPLY=function(data,data2)\\r\\n{\\r\\n    if (arguments.length==2)\\r\\n    {\\r\\n        var result=[];\\r\\n        var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n        if (IsNumber)\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                if (data[i]==null || isNaN(data[i]))\\r\\n                    result[i]=null;\\r\\n                else\\r\\n                    result[i]=data[i]*data2;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var count=Math.max(data.length,data2.length);\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                if (i<data.length && i<data2.length)\\r\\n                    result[i]=data[i]*data2[i];\\r\\n                else\\r\\n                    result[i]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    var result=HQIndexFormula.ARRAY_MULTIPLY(arguments[0],arguments[1]);\\r\\n\\r\\n    for(var i=2;i<arguments.length;++i)\\r\\n    {\\r\\n        result=HQIndexFormula.ARRAY_MULTIPLY(result,arguments[i]);\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组相除\\r\\nHQIndexFormula.ARRAY_DIVIDE=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            result[i]=data[i]/data2;\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n            {\\r\\n                if(data[i]==null || data2[i]==null || isNaN(data[i]) || isNaN(data2[i]))\\r\\n                    result[i]=null;\\r\\n                else if (data2[i]==0)\\r\\n                    result[i]=null;\\r\\n                else\\r\\n                    result[i]=data[i]/data2[i];\\r\\n            }\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//数组相加\\r\\n//支持多个参数累加 如:HQIndexFormula.ARRAY_ADD(data,data2,data3,data3) =data+data2+data3+data4\\r\\nHQIndexFormula.ARRAY_ADD=function(data,data2)\\r\\n{\\r\\n    if (arguments.length==2)\\r\\n    {\\r\\n        var result=[];\\r\\n        var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n        if (IsNumber)\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                result[i]=data[i]+data2;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var count=Math.max(data.length,data2.length);\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if (data[i]==null || data2[i]==null || isNaN(data[i]) || isNaN(data2[i])) result[i]=null\\r\\n                    else result[i]=data[i]+data2[i];\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    result[i]=null;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    var result=HQIndexFormula.ARRAY_ADD(arguments[0],arguments[1]);\\r\\n\\r\\n    for(var i=2;i<arguments.length;++i)\\r\\n    {\\r\\n        result=HQIndexFormula.ARRAY_ADD(result,arguments[i]);\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.MAX=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            if (data[i]==null) result[i]=null;\\r\\n            else result[i]=Math.max(data[i],data2);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n            {\\r\\n                if (data[i]==null || data2[i]==null) result[i]=null;\\r\\n                else result[i]=Math.max(data[i],data2[i]);\\r\\n            }\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.MIN=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    var IsNumber=typeof(data2)==\\\"number\\\";\\r\\n    if (IsNumber)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            if (data[i]==null) result[i]=null;\\r\\n            else result[i]=Math.min(data[i],data2);\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            if (i<data.length && i<data2.length)\\r\\n            {\\r\\n                if (data[i]==null || data2[i]==null) result[i]=null;\\r\\n                else result[i]=Math.min(data[i],data2[i]);\\r\\n            }\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\nHQIndexFormula.ABS=function(data)\\r\\n{\\r\\n    var result=[];\\r\\n    for(var i in data)\\r\\n    {\\r\\n        if (data[i]==null) result[i]=null;\\r\\n        else result[i]=Math.abs(data[i]);\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\nHQIndexFormula.MA=function(data,dayCount)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n    for (var i = 0, len = data.length; i < len; i++)\\r\\n    {\\r\\n        if (i < dayCount)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            continue;\\r\\n        }\\r\\n\\r\\n        var sum = 0;\\r\\n        for (var j = 0; j < dayCount; j++)\\r\\n        {\\r\\n            sum += data[i - j];\\r\\n        }\\r\\n        result[i]=sum / dayCount;\\r\\n    }\\r\\n    return result;\\r\\n}\\r\\n\\r\\n/*\\r\\n    加权移动平均\\r\\n    返回加权移动平均\\r\\n    用法:EXPMA(X,M):X的M日加权移动平均\\r\\n    EXPMA[i]=buffer[i]*para+(1-para)*EXPMA[i-1] para=2/(1+__para)\\r\\n*/\\r\\nHQIndexFormula.EXPMA=function(data,dayCount)\\r\\n{\\r\\n    var result=[];\\r\\n    if (dayCount>=data.length) return result;\\r\\n\\r\\n    var i=dayCount;\\r\\n    for(;i<data.length;++i) //获取第1个有效数据\\r\\n    {\\r\\n        if (data[i]!=null)\\r\\n        {\\r\\n            result[i]=data[i];\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    for (i=i+1; i < data.length; ++i)\\r\\n    {\\r\\n        if (result[i-1]!=null && data[i]!=null)\\r\\n            result[i]=(2*data[i]+(dayCount-1)*result[i-1])/(dayCount+1);\\r\\n        else if (result[i-1]!=null)\\r\\n            result[i]=result[i-1];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//加权平滑平均,MEMA[i]=SMA[i]*para+(1-para)*SMA[i-1] para=2/(1+__para)\\r\\nHQIndexFormula.EXPMEMA=function(data,dayCount)\\r\\n{\\r\\n    var result=[];\\r\\n    if (dayCount>=data.length) return result;\\r\\n\\r\\n    var index=0;\\r\\n    for(;index<data.length;++index)\\r\\n    {\\r\\n        if (data[index] && !isNaN(data[index])) break;\\r\\n    }\\r\\n\\r\\n    var sum=0;\\r\\n    for(var i=0; index<data.length && i<dayCount;++i, ++index)\\r\\n    {\\r\\n        if (data[index] && !isNaN(data[index]))\\r\\n            sum+=data[index];\\r\\n        else\\r\\n            sum+=data[index-1];\\r\\n    }\\r\\n\\r\\n    result[index-1]=sum/dayCount;\\r\\n    for(;index<data.length;++index)\\r\\n    {\\r\\n        if(result[index-1]!=null && data[index]!=null)\\r\\n            result[index]=(2*data[index]+(dayCount-1)*result[index-1])/(dayCount+1);\\r\\n        else if(result[index-1]!=null)\\r\\n            result[index] = result[index-1];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\nHQIndexFormula.STD=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n    var total=0;\\r\\n    var averageData=[]; //平均值\\r\\n    for(var i=n-1;i<data.length;++i)\\r\\n    {\\r\\n        total=0;\\r\\n        for(var j=0;j<n;++j)\\r\\n        {\\r\\n            total+=data[i-j];\\r\\n        }\\r\\n\\r\\n        averageData[i]=total/n;\\r\\n    }\\r\\n\\r\\n    for(var i=n-1;i<data.length;++i)\\r\\n    {\\r\\n        total=0;\\r\\n        for(var j=0;j<n;++j)\\r\\n        {\\r\\n            total+=Math.pow((data[i-j]-averageData[i]),2);\\r\\n        }\\r\\n\\r\\n        result[i]=Math.sqrt(total/n);\\r\\n    }\\r\\n\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//平均绝对方差\\r\\nHQIndexFormula.AVEDEV=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n    var total=0;\\r\\n    var averageData=[]; //平均值\\r\\n    for(var i=n-1;i<data.length;++i)\\r\\n    {\\r\\n        total=0;\\r\\n        for(var j=0;j<n;++j)\\r\\n        {\\r\\n            total+=data[i-j];\\r\\n        }\\r\\n\\r\\n        averageData[i]=total/n;\\r\\n    }\\r\\n\\r\\n    for(var i=n-1;i<data.length;++i)\\r\\n    {\\r\\n        total=0;\\r\\n        for(var j=0;j<n;++j)\\r\\n        {\\r\\n            total+=Math.abs(data[i-j]-averageData[i]);\\r\\n        }\\r\\n\\r\\n        result[i]=total/n;\\r\\n    }\\r\\n\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nHQIndexFormula.COUNT=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n\\r\\n\\r\\n    for(var i=n-1;i<data.length;++i)\\r\\n    {\\r\\n        var count=0;\\r\\n        for(var j=0;j<n;++j)\\r\\n        {\\r\\n            if (data[i-j]) ++count;\\r\\n        }\\r\\n\\r\\n        result[i]=count;\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//上穿\\r\\nHQIndexFormula.CROSS=function(data,data2)\\r\\n{\\r\\n    var result=[];\\r\\n    if (data.length!=data2.length) return result=[];\\r\\n\\r\\n    var index=0;\\r\\n    for(;index<data.length;++index)\\r\\n    {\\r\\n        if (data[index]!=null && !isNaN(data[index])  && data2[index]!=null && isNaN(data2[index]))\\r\\n            break;\\r\\n    }\\r\\n\\r\\n    for(++index;index<data.length;++index)\\r\\n    {\\r\\n        result[index]= (data[index]>data2[index]&&data[index-1]<data2[index-1])?1:0;\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//累乘\\r\\nHQIndexFormula.MULAR=function(data,n)\\r\\n{\\r\\n    var result=[];\\r\\n    if(data.length<n) return result;\\r\\n\\r\\n    var index=n;\\r\\n    for(;index<data.length;++index)\\r\\n    {\\r\\n        if (data[index]!=null && !isNaN(data[index]))\\r\\n        {\\r\\n            result[index]=data[index];\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    for(++index;index<data.length;++index)\\r\\n    {\\r\\n        result[index]=result[index-1]*data[index];\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n\\r\\nHQIndexFormula.STICKLINE=function(data,price1,price2)\\r\\n{\\r\\n    var result=[];\\r\\n    if(data.length<=0) return result;\\r\\n\\r\\n    var IsNumber=typeof(price1)==\\\"number\\\";\\r\\n    var IsNumber2=typeof(price2)==\\\"number\\\";\\r\\n\\r\\n\\r\\n    for(var i in data)\\r\\n    {\\r\\n        result[i]=null;\\r\\n        if (isNaN(data[i])) continue;\\r\\n        if (!data[i]) continue;\\r\\n\\r\\n        if (IsNumber && IsNumber2)\\r\\n        {\\r\\n            result[i]={Value:price1,Value2:price2};\\r\\n        }\\r\\n        else if (IsNumber && !IsNumber2)\\r\\n        {\\r\\n            if (isNaN(price2[i])) continue;\\r\\n            result[i]={Value:price1,Value2:price2[i]};\\r\\n        }\\r\\n        else if (!IsNumber && IsNumber2)\\r\\n        {\\r\\n            if (isNaN(price1[i])) continue;\\r\\n            result[i]={Value:price1[i],Value2:price2};\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (isNaN(price1[i]) || isNaN(price2[i])) continue;\\r\\n            result[i]={Value:price1[i],Value2:price2[i]};\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//  K线图 控件\\r\\n//  this.ChartPaint[0] K线画法 这个不要修改\\r\\n//\\r\\n//\\r\\nfunction KLineChartContainer(uielement,OffscreenElement)\\r\\n{\\r\\n    var _self =this;\\r\\n    this.newMethod=JSChartContainer;   //派生\\r\\n    this.newMethod(uielement,OffscreenElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='KLineChartContainer';\\r\\n    this.WindowIndex=new Array();\\r\\n    this.ColorIndex;                    //五彩K线\\r\\n    this.TradeIndex;                    //交易指标/专家系统\\r\\n    this.Symbol;\\r\\n    this.Name;\\r\\n    this.Period=0;                      //周期 0=日线 1=周线 2=月线 3=年线 4=1分钟 5=5分钟 6=15分钟 7=30分钟 8=60分钟 9=季线 10=分笔线 11=120分钟 12=240分钟\\r\\n    this.IsApiPeriod=false;             //使用API计算周期\\r\\n    this.Right=0;                       //复权 0 不复权 1 前复权 2 后复权\\r\\n    this.RightFormula=0                 //复权公式 0=简单复权, 1=复权因子复权\\r\\n    this.SourceData;                    //原始的历史数据\\r\\n    this.MaxReqeustDataCount=3000;      //数据个数\\r\\n    this.MaxRequestMinuteDayCount=5;    //分钟数据请求的天数\\r\\n    this.PageSize=200;                  //每页数据个数\\r\\n    this.KLineDrawType=0;\\r\\n    this.ScriptErrorCallback;           //脚本执行错误回调\\r\\n    this.FlowCapitalReady=false;        //流通股本是否下载完成\\r\\n    this.EnableFlowCapital={};          //强制现在流通股 { BIT:数据货币true/false, }\\r\\n    this.EnableZoomUpDown=null;         //是否手势/键盘/鼠标允许缩放{ Touch:true/false, Mouse:true/false, Keyboard:true/false, Wheel:true/false }\\r\\n    this.ChartDrawStorage=new ChartDrawStorage();\\r\\n    this.ChartDrawStorageCache=null;    //首次需要创建的画图工具数据\\r\\n    this.RightSpaceCount=0;             //右侧空白个数\\r\\n    this.SourceDataLimit=new Map();     //每个周期缓存数据最大个数 key=周期 value=最大个数\\r\\n\\r\\n    this.CustomShow=null;               //首先显示的K线的起始日期 { Date:日期 PageSize:}\\r\\n    this.OverlayIndexFrameWidth=60;     //叠加指标框架宽度\\r\\n    this.ZoomType=0;                    //缩放模式 0=最右边固定缩放, 1=十字光标两边缩放\\r\\n    this.KLineSize=null;                //{ DataWidth:, }\\r\\n    //this.EnableYDrag={ Left:false, Right:true };\\r\\n\\r\\n    this.Page= {\\r\\n        Day:{ Enable:false, Index:0, Finish:false },    //日线\\r\\n        Minute:{ Enable:false, Index:0, Finish:false }  //分钟\\r\\n    };  //分页下载 Enable:是否分页下载 Index:已下载到第几页 Finish：是否所有分页完成\\r\\n\\r\\n    this.DragDownload= {\\r\\n        Day:{ Enable:false, IsEnd:false, Status:0 },      //日线数据拖拽下载 Status: 0空闲 1 下载中\\r\\n        Minute: { Enable:false, IsEnd:false, status:0 }   //分钟数据拖拽下载\\r\\n    };\\r\\n\\r\\n    //自动更新设置\\r\\n    this.IsAutoUpdate=false;                    //是否自动更新行情数据\\r\\n    this.AutoUpdateFrequency=30000;             //30秒更新一次数据\\r\\n    this.AutoUpdateTimer;                       //自动更新定时器\\r\\n\\r\\n    //this.KLineApiUrl=\\\"http://opensource.zealink.com/API/KLine2\\\";                  //历史K线api地址\\r\\n    this.KLineApiUrl=g_JSChartResource.Domain+\\\"/API/KLine2\\\";                        //历史K线api地址\\r\\n    this.MinuteKLineApiUrl=g_JSChartResource.Domain+'/API/KLine3';                  //历史分钟数据\\r\\n    this.DragMinuteKLineApiUrl=g_JSChartResource.Domain+'/API/KLine4';              //拖动1分钟K数据下载\\r\\n    this.DragKLineApiUrl=g_JSChartResource.Domain+'/API/KLine5';                    //拖动日K数据下载\\r\\n    this.RealtimeApiUrl=g_JSChartResource.Domain+\\\"/API/Stock\\\";                      //实时行情api地址\\r\\n    this.KLineMatchUrl=g_JSChartResource.Domain+\\\"/API/KLineMatch\\\";                  //形态匹配\\r\\n    this.StockHistoryDayApiUrl= g_JSChartResource.Domain+'/API/StockHistoryDay';    //股票历史数据\\r\\n    this.TickApiUrl=g_JSChartResource.Domain+'/API/StockDetail';                    //当天分笔数据\\r\\n\\r\\n    this.MinuteDialog;      //双击历史K线 弹出分钟走势图\\r\\n    this.RightMenu;         //右键菜单\\r\\n\\r\\n    this.BeforeBindMainData=null;   //function(funcName)   在BindMainData() 调用前回调用\\r\\n    this.AfterBindMainData=null;    //function(funcName)   在BindMainData() 调用前后调用\\r\\n\\r\\n    this.ResetDragDownload=function()\\r\\n    {\\r\\n        this.DragDownload.Day.Status=0;\\r\\n        this.DragDownload.Day.IsEnd=false;\\r\\n\\r\\n        this.DragDownload.Minute.Status=0;\\r\\n        this.DragDownload.Minute.IsEnd=false;\\r\\n    }\\r\\n\\r\\n    this.ResetPage=function()   //重置分页下载\\r\\n    {\\r\\n        this.Page.Day.Finish=false;\\r\\n        this.Page.Day.Index=0;\\r\\n\\r\\n        this.Page.Minute.Finish=false;\\r\\n        this.Page.Minute.Index=0;\\r\\n    }\\r\\n\\r\\n    this.AddCustomKLine=function(kline, option)\\r\\n    {\\r\\n        var klineChart=this.ChartPaint[0];\\r\\n        if (!klineChart) return;\\r\\n\\r\\n        if (!kline) return;\\r\\n\\r\\n        if (!klineChart.CustomKLine) klineChart.CustomKLine=new Map();\\r\\n\\r\\n        if (Array.isArray(kline))\\r\\n        {\\r\\n            for(var i=0;i<kline.length;++i)\\r\\n            {\\r\\n                var item=kline[i];\\r\\n                klineChart.CustomKLine.set(item.Key, item.Data);\\r\\n            }\\r\\n        }\\r\\n        else if (kline)\\r\\n        {\\r\\n            klineChart.CustomKLine.set(kline.Key, kline.Data);\\r\\n        }\\r\\n\\r\\n        if (option && option.Draw==true) this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ClearCustomKLine=function(option)\\r\\n    {\\r\\n        var klineChart=this.ChartPaint[0];\\r\\n        if (!klineChart) return;\\r\\n\\r\\n        klineChart.ClearCustomKLine();\\r\\n\\r\\n        if (option && option.Draw==true) this.Draw();\\r\\n    }\\r\\n\\r\\n    this.StopAutoUpdate=function()\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        this.AutoUpdateEvent(false,'KLineChartContainer::StopAutoUpdate');\\r\\n        if (!this.IsAutoUpdate) return;\\r\\n        this.IsAutoUpdate=false;\\r\\n    }\\r\\n\\r\\n    //沙盘操作 { ID: 1=开始, Data:绑定K线数据(可选)\\r\\n    //          ID: 2=更新数据, Data:绑定K线数据\\r\\n    //          ID: 3=结束, IsAutoUpdate:是否启动自动更新(可选) }\\r\\n    this.SandTableOperator=function(obj)\\r\\n    {\\r\\n        switch(obj.ID)\\r\\n        {\\r\\n            case 1:\\r\\n                this.StopAutoUpdate();\\r\\n                if (obj.Data) this.ManualUpdateKData(obj);\\r\\n                break;\\r\\n            case 2:\\r\\n                this.ManualUpdateKData(obj);\\r\\n                break;\\r\\n            case 3:\\r\\n                if (obj.IsAutoUpdate) this.IsAutoUpdate=obj.IsAutoUpdate;\\r\\n                this.ChangeSymbol(this.Symbol);\\r\\n                break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //外部手动更新K线数据, 内部不计算周期和复权\\r\\n    this.ManualUpdateKData=function(obj)\\r\\n    {\\r\\n        var kData=obj.Data;\\r\\n        var lastDataCount=kData.length;\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=kData;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        this.UpdateMainData(bindData,lastDataCount);//更新主图数据\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //更新当前屏K线索引\\r\\n        if (IFrameSplitOperator.IsNumber(obj.DataOffset) && obj.DataOffset>=0)\\r\\n        {\\r\\n            var data=null;\\r\\n            if (this.Frame.Data)\\r\\n                data=this.Frame.Data;\\r\\n            else\\r\\n                data=this.Frame.SubFrame[0].Frame.Data;\\r\\n            if (data) data.DataOffset=obj.DataOffset;\\r\\n        }\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex(1);  //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();                        //刷新画图\\r\\n\\r\\n        this.SendManualKLineUpdateEvent(bindData);\\r\\n    }\\r\\n\\r\\n    //获取k线数据\\r\\n    this.GetKDataInfo=function()\\r\\n    {\\r\\n        if (!this.ChartPaint[0]) return null;\\r\\n\\r\\n        var chartKLine=this.ChartPaint[0];\\r\\n        var obj={};\\r\\n        if (chartKLine.Data && chartKLine.Data.Data)\\r\\n            obj.Data=chartKLine.Data.CloneData(\\\"HistoryData\\\");\\r\\n        obj.ShowRange=chartKLine.ShowRange;\\r\\n        obj.Period=this.Period;\\r\\n        obj.RightSpaceCount=this.RightSpaceCount;\\r\\n\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    this.ChartOperator=function(obj) //图形控制函数 {ID:JSCHART_OPERATOR_ID, ...参数 }\\r\\n    {\\r\\n        var id=obj.ID;\\r\\n        if (id===JSCHART_OPERATOR_ID.OP_SCROLL_LEFT || id===JSCHART_OPERATOR_ID.OP_SCROLL_RIGHT )    //左右移动 { Step:移动数据个数 }\\r\\n        {\\r\\n            var isLeft=(id===JSCHART_OPERATOR_ID.OP_SCROLL_LEFT ? true:false);\\r\\n            var step=1;\\r\\n            if (obj.Step>0) step=obj.Step;\\r\\n            var oneStepWidth=this.GetMoveOneStepWidth();\\r\\n            if(this.DataMove(step*oneStepWidth,isLeft))    //每次移动一个数据\\r\\n            {\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.ResetFrameXYSplit();\\r\\n                this.Draw();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (id===JSCHART_OPERATOR_ID.OP_SCROLL_RIGHT && this.DragDownloadData)\\r\\n                    this.DragDownloadData();\\r\\n            }\\r\\n        }\\r\\n        else if (id===JSCHART_OPERATOR_ID.OP_ZOOM_IN || id===JSCHART_OPERATOR_ID.OP_ZOOM_OUT)       //缩放\\r\\n        {\\r\\n            var cursorIndex={};\\r\\n            cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n            if (id===JSCHART_OPERATOR_ID.OP_ZOOM_IN)\\r\\n            {\\r\\n                if (!this.Frame.ZoomUp(cursorIndex)) return;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (!this.Frame.ZoomDown(cursorIndex)) return;\\r\\n            }\\r\\n            this.CursorIndex=cursorIndex.Index;\\r\\n            this.UpdataDataoffset();\\r\\n            this.UpdatePointByCursorIndex();\\r\\n            this.UpdateFrameMaxMin();\\r\\n            this.Draw();\\r\\n        }\\r\\n        else if (id===JSCHART_OPERATOR_ID.OP_GOTO_HOME)\\r\\n        {\\r\\n            var hisData=this.ChartOperator_Temp_GetHistroyData();;\\r\\n            if (!hisData) return;  //数据还没有到达\\r\\n\\r\\n            var showCount=this.Frame.SubFrame[0].Frame.XPointCount; //获取一屏显示的数据个数\\r\\n            showCount-=this.RightSpaceCount;\\r\\n            var index=hisData.Data.length-showCount;\\r\\n            hisData.DataOffset=index;\\r\\n            this.CursorIndex=0;\\r\\n\\r\\n            this.LastPoint.X=null;\\r\\n            this.LastPoint.Y=null;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::ChartOperator] OP_GOTO_HOME, dataOffset=${hisData.DataOffset} CursorIndex=${this.CursorIndex} PageSize=${showCount}`);\\r\\n\\r\\n            this.ChartOperator_Temp_Update();\\r\\n        }\\r\\n        else if (id===JSCHART_OPERATOR_ID.OP_GOTO_END)\\r\\n        {\\r\\n            var hisData=this.ChartOperator_Temp_GetHistroyData();\\r\\n            if (!hisData) return;  //数据还没有到达\\r\\n\\r\\n            hisData.DataOffset=0;\\r\\n            this.CursorIndex=0;\\r\\n\\r\\n            this.LastPoint.X=null;\\r\\n            this.LastPoint.Y=null;\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::ChartOperator] OP_GOTO_END `);\\r\\n\\r\\n            this.ChartOperator_Temp_Update();\\r\\n        }\\r\\n        else if (id==JSCHART_OPERATOR_ID.OP_LEFT_ZOOM_IN || id==JSCHART_OPERATOR_ID.OP_LEFT_ZOOM_OUT)　//{ Step：增加/减少数量 } 左边增加/减少显示个数\\r\\n        {\\r\\n            var hisData=this.ChartOperator_Temp_GetHistroyData();\\r\\n            if (!hisData) return;  //数据还没有到达\\r\\n\\r\\n            var dataCount=hisData.Data.length;\\r\\n            var showCount=this.Frame.SubFrame[0].Frame.XPointCount; //获取一屏显示的数据个数\\r\\n            var dataOffset=hisData.DataOffset;\\r\\n\\r\\n            if (id==JSCHART_OPERATOR_ID.OP_LEFT_ZOOM_IN)    //增加\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(obj.Step))\\r\\n                {\\r\\n                    if (showCount>=dataCount) return;\\r\\n                    var step=obj.Step;\\r\\n                    if (step>dataOffset) step=dataOffset;\\r\\n                    if (showCount+step>dataCount) step=dataCount-showCount;\\r\\n                    if (step<=0) return;\\r\\n\\r\\n                    showCount+=step;\\r\\n                    hisData.DataOffset-=step;\\r\\n                }\\r\\n            }\\r\\n            else if (id==JSCHART_OPERATOR_ID.OP_LEFT_ZOOM_OUT)  //减少\\r\\n            {\\r\\n                var pageSize = this.GetMaxMinPageSize();\\r\\n                var minShowCount=pageSize.Min;\\r\\n                if (IFrameSplitOperator.IsNumber(obj.Step))\\r\\n                {\\r\\n                    if (showCount<minShowCount) return;\\r\\n                    var step=obj.Step;\\r\\n                    if (showCount-step<minShowCount) step=showCount-minShowCount;\\r\\n                    if (step<=0) return;\\r\\n\\r\\n                    showCount-=step;\\r\\n                    hisData.DataOffset+=step;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for(var i in this.Frame.SubFrame)   //设置一屏显示的数据个数\\r\\n            {\\r\\n                var item =this.Frame.SubFrame[i].Frame;\\r\\n                item.XPointCount=showCount;\\r\\n            }\\r\\n\\r\\n            if (hisData.DataOffset<0) hisData.DataOffset=0;\\r\\n            this.ChartOperator_Temp_Update();\\r\\n        }\\r\\n        else if (id==JSCHART_OPERATOR_ID.OP_RIGHT_ZOOM_IN || id==JSCHART_OPERATOR_ID.OP_RIGHT_ZOOM_OUT)　//{ Step：增加/减少数量 , ShowCount:显示个数 } 右边增加/减少显示个数\\r\\n        {\\r\\n            var hisData=this.ChartOperator_Temp_GetHistroyData();\\r\\n            if (!hisData) return;  //数据还没有到达\\r\\n\\r\\n            var dataCount=hisData.Data.length;\\r\\n            var showCount=this.Frame.SubFrame[0].Frame.XPointCount; //获取一屏显示的数据个数\\r\\n            var dataOffset=hisData.DataOffset;\\r\\n\\r\\n            if (id==JSCHART_OPERATOR_ID.OP_RIGHT_ZOOM_IN)   //增加\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(obj.Step))\\r\\n                {\\r\\n                    if (showCount>=dataCount) return;\\r\\n                    var endPos=dataOffset+showCount;\\r\\n                    var rightCount=dataCount-endPos;\\r\\n                    if (rightCount<=0) return;\\r\\n\\r\\n                    var step=obj.Step;\\r\\n                    if (step>rightCount) step=rightCount;\\r\\n                    if (step<=0) return;\\r\\n\\r\\n                    showCount+=step;\\r\\n                }\\r\\n            }\\r\\n            else if (id==JSCHART_OPERATOR_ID.OP_RIGHT_ZOOM_OUT) //减少\\r\\n            {\\r\\n                var pageSize = this.GetMaxMinPageSize();\\r\\n                var minShowCount=pageSize.Min;\\r\\n                if (IFrameSplitOperator.IsNumber(obj.Step))\\r\\n                {\\r\\n                    if (showCount<minShowCount) return;\\r\\n                    var step=obj.Step;\\r\\n                    if (step>showCount) step=showCount;\\r\\n                    if (showCount-step<minShowCount) step=showCount-minShowCount;\\r\\n                    if (step<=0) return;\\r\\n\\r\\n                    showCount-=step;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for(var i in this.Frame.SubFrame)   //设置一屏显示的数据个数\\r\\n            {\\r\\n                var item =this.Frame.SubFrame[i].Frame;\\r\\n                item.XPointCount=showCount;\\r\\n            }\\r\\n\\r\\n            if (hisData.DataOffset<0) hisData.DataOffset=0;\\r\\n            this.ChartOperator_Temp_Update();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //内部函数\\r\\n    this.ChartOperator_Temp_GetHistroyData=function()\\r\\n    {\\r\\n        var hisData=null;\\r\\n        if (!this.Frame.Data) hisData=this.Frame.Data;\\r\\n        else hisData=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!hisData) return null;  //数据还没有到达\\r\\n\\r\\n        return hisData;\\r\\n    }\\r\\n\\r\\n    this.ChartOperator_Temp_Update=function()\\r\\n    {\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n    }\\r\\n\\r\\n    this.OnWheel=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::OnWheel]',e);\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var x = e.clientX-this.UIElement.getBoundingClientRect().left;\\r\\n        var y = e.clientY-this.UIElement.getBoundingClientRect().top;\\r\\n\\r\\n        var isInClient=false;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());\\r\\n        isInClient=this.Canvas.isPointInPath(x,y);\\r\\n\\r\\n        var wheelValue=e.wheelDelta;\\r\\n        if (!IFrameSplitOperator.IsObjectExist(e.wheelDelta))\\r\\n            wheelValue=e.deltaY* -0.01;\\r\\n\\r\\n        var enableZoomUpDown=true;  //是否允许缩放\\r\\n        if (this.EnableZoomUpDown && this.EnableZoomUpDown.Wheel===false) enableZoomUpDown=false;\\r\\n\\r\\n        if (this.SourceData && this.SourceData.Data)\\r\\n        {\\r\\n            if (isInClient && wheelValue<0 && enableZoomUpDown)       //缩小\\r\\n            {\\r\\n                var cursorIndex={ ZoomType:this.ZoomType };\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (this.Frame.ZoomDown(cursorIndex))\\r\\n                {\\r\\n                    this.CursorIndex=cursorIndex.Index;\\r\\n                    this.UpdataDataoffset();\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.UpdateFrameMaxMin();\\r\\n                    this.Draw();\\r\\n                }\\r\\n            }\\r\\n            else if (isInClient && wheelValue>0 && enableZoomUpDown)  //放大\\r\\n            {\\r\\n                var cursorIndex={ ZoomType:this.ZoomType };\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (this.Frame.ZoomUp(cursorIndex))\\r\\n                {\\r\\n                    JSConsole.Chart.Log(\\\"[KLineChartContainer::OnWheel] cursorIndex \\\",cursorIndex)\\r\\n\\r\\n                    this.CursorIndex=cursorIndex.Index;\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.UpdataDataoffset();\\r\\n                    this.UpdateFrameMaxMin();\\r\\n                    this.Draw();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!isInClient) return;\\r\\n\\r\\n        if(e.preventDefault) e.preventDefault();\\r\\n        else e.returnValue = false;\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    //windowCount 窗口个数\\r\\n    this.Create=function(windowCount, option)\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建十字光标\\r\\n        this.ChartCorssCursor=new ChartCorssCursor();\\r\\n        this.ChartCorssCursor.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.StringFormatX=g_DivTooltipDataForamt.Create(\\\"CorssCursor_XStringFormat\\\");\\r\\n        this.ChartCorssCursor.StringFormatX.LanguageID=this.LanguageID;\\r\\n        this.ChartCorssCursor.StringFormatY=g_DivTooltipDataForamt.Create(\\\"CorssCursor_YStringFormat\\\");\\r\\n        this.ChartCorssCursor.StringFormatY.LanguageID=this.LanguageID;\\r\\n        this.ChartCorssCursor.StringFormatY.ExtendChartPaint=this.ExtendChartPaint;\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n        this.ChartSplashPaint.HQChart=this;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new HQTradeFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=30;\\r\\n        this.Frame.ChartBorder.Left=5;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n        this.Frame.GetExtendChartRightWidth=()=> { return this.GetExtendChartRightWidth() }\\r\\n        this.ChartCorssCursor.Frame=this.Frame; //十字光标绑定框架\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n\\r\\n        this.CreateChildWindow(windowCount);\\r\\n        this.CreateMainKLine();\\r\\n        this.CreateExtendChart(\\\"RectSelectPaint\\\");  //区间统计\\r\\n\\r\\n        //子窗口动态标题\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var titlePaint=new DynamicChartTitlePainting();\\r\\n            titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n            titlePaint.Canvas=this.Canvas;\\r\\n            titlePaint.LanguageID=this.LanguageID;\\r\\n            titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n\\r\\n            this.TitlePaint.push(titlePaint);\\r\\n        }\\r\\n\\r\\n        var bRegisterKeydown=true;\\r\\n        var bRegisterWheel=true;\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.KeyDown===false)\\r\\n            {\\r\\n                bRegisterKeydown=false;\\r\\n                JSConsole.Chart.Log('[KLineChartContainer::Create] not register keydown event.');\\r\\n            }\\r\\n\\r\\n            if (option.Wheel===false)\\r\\n            {\\r\\n                bRegisterWheel=false;\\r\\n                JSConsole.Chart.Log('[KLineChartContainer::Create] not register wheel event.');\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bRegisterKeydown) this.UIElement.addEventListener(\\\"keydown\\\", (e)=>{ this.OnKeyDown(e); }, true);            //键盘消息\\r\\n        if (bRegisterWheel) this.UIElement.addEventListener(\\\"wheel\\\", (e)=>{ this.OnWheel(e); }, true);                  //上下滚动消息\\r\\n    }\\r\\n\\r\\n    //创建子窗口\\r\\n    this.CreateChildWindow=function(windowCount)\\r\\n    {\\r\\n        for(var i=0;i<windowCount;++i)\\r\\n        {\\r\\n            var border=new ChartBorder();\\r\\n            border.UIElement=this.UIElement;\\r\\n\\r\\n            var frame=new KLineFrame();\\r\\n            frame.Canvas=this.Canvas;\\r\\n            frame.ChartBorder=border;\\r\\n            frame.Identify=i;                           //窗口序号\\r\\n            frame.RightSpaceCount=this.RightSpaceCount; //右边\\r\\n\\r\\n            if (this.ModifyIndexDialog) frame.ModifyIndexEvent=this.ModifyIndexDialog.DoModal;        //绑定菜单事件\\r\\n            if (this.ChangeIndexDialog) frame.ChangeIndexEvent=this.ChangeIndexDialog.DoModal;\\r\\n\\r\\n            frame.HorizontalMax=20;\\r\\n            frame.HorizontalMin=10;\\r\\n\\r\\n            if (i==0)\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitKLinePriceY();\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('price');\\r\\n                frame.YSplitOperator.FrameSplitData2=this.FrameSplitData.get('double');\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n                var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n                border.BottomSpace=15*pixelTatio;  //主图上下留空间\\r\\n                border.TopSpace=15*pixelTatio;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitY();\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n                frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); };\\r\\n                //frame.IsLocked = true;\\r\\n            }\\r\\n\\r\\n            frame.YSplitOperator.Frame=frame;\\r\\n            frame.YSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator=new FrameSplitKLineX();\\r\\n            frame.XSplitOperator.Frame=frame;\\r\\n            frame.XSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator.LanguageID=this.LanguageID;\\r\\n            frame.XSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n\\r\\n            if (i!=windowCount-1) frame.XSplitOperator.ShowText=false;\\r\\n\\r\\n            for(var j=frame.HorizontalMin;j<=frame.HorizontalMax;j+=1)\\r\\n            {\\r\\n                frame.HorizontalInfo[j]= new CoordinateInfo();\\r\\n                frame.HorizontalInfo[j].Value=j;\\r\\n                if (i==0 && j==frame.HorizontalMin) continue;\\r\\n\\r\\n                frame.HorizontalInfo[j].Message[1]=j.toString();\\r\\n                frame.HorizontalInfo[j].Font=\\\"14px 微软雅黑\\\";\\r\\n            }\\r\\n\\r\\n            var subFrame=new SubFrameItem();\\r\\n            subFrame.Frame=frame;\\r\\n            if (i==0)\\r\\n                subFrame.Height=20;\\r\\n            else\\r\\n                subFrame.Height=10;\\r\\n\\r\\n            this.Frame.SubFrame[i]=subFrame;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateSubFrameItem=function(id)\\r\\n    {\\r\\n        var border=new ChartBorder();\\r\\n        border.UIElement=this.UIElement;\\r\\n\\r\\n        var frame=new KLineFrame();\\r\\n        frame.Canvas=this.Canvas;\\r\\n        frame.ChartBorder=border;\\r\\n        frame.Identify=id;                   //窗口序号\\r\\n\\r\\n        if (this.ModifyIndexDialog) frame.ModifyIndexEvent=this.ModifyIndexDialog.DoModal;        //绑定菜单事件\\r\\n        if (this.ChangeIndexDialog) frame.ChangeIndexEvent=this.ChangeIndexDialog.DoModal;\\r\\n\\r\\n        frame.HorizontalMax=20;\\r\\n        frame.HorizontalMin=10;\\r\\n        frame.YSplitOperator=new FrameSplitY();\\r\\n        frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n        frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        frame.YSplitOperator.Frame=frame;\\r\\n        frame.YSplitOperator.ChartBorder=border;\\r\\n        frame.XSplitOperator=new FrameSplitKLineX();\\r\\n        frame.XSplitOperator.Frame=frame;\\r\\n        frame.XSplitOperator.ChartBorder=border;\\r\\n        frame.XSplitOperator.ShowText=false;\\r\\n        frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); };\\r\\n\\r\\n        //K线数据绑定\\r\\n        var xPointCouont=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n        frame.XPointCount=xPointCouont;\\r\\n        frame.Data=this.ChartPaint[0].Data;\\r\\n\\r\\n        for(var j=frame.HorizontalMin;j<=frame.HorizontalMax;j+=1)\\r\\n        {\\r\\n            frame.HorizontalInfo[j]= new CoordinateInfo();\\r\\n            frame.HorizontalInfo[j].Value=j;\\r\\n            frame.HorizontalInfo[j].Message[1]=j.toString();\\r\\n            frame.HorizontalInfo[j].Font=\\\"14px 微软雅黑\\\";\\r\\n        }\\r\\n\\r\\n        var subFrame=new SubFrameItem();\\r\\n        subFrame.Frame=frame;\\r\\n        subFrame.Height=10;\\r\\n\\r\\n        return subFrame;\\r\\n    }\\r\\n\\r\\n    //创建主图K线画法\\r\\n    this.CreateMainKLine=function()\\r\\n    {\\r\\n        var kline=new ChartKLine();\\r\\n        kline.Canvas=this.Canvas;\\r\\n        kline.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        kline.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        kline.Name=\\\"Main-KLine\\\";\\r\\n        kline.DrawType=this.KLineDrawType;\\r\\n        kline.GetEventCallback=(id)=>{ return this.GetEventCallback(id); };\\r\\n\\r\\n        this.ChartPaint[0]=kline;\\r\\n\\r\\n        this.TitlePaint[0]=new DynamicKLineTitlePainting();\\r\\n        this.TitlePaint[0].Frame=this.Frame.SubFrame[0].Frame;\\r\\n        this.TitlePaint[0].Canvas=this.Canvas;\\r\\n        this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint;    //绑定叠加\\r\\n        this.TitlePaint[0].LanguageID=this.LanguageID;\\r\\n    }\\r\\n\\r\\n    //绑定主图K线数据\\r\\n    this.BindMainData=function(hisData,showCount)\\r\\n    {\\r\\n        this.ChartPaint[0].Data=hisData;\\r\\n        this.ChartPaint[0].Symbol=this.Symbol;\\r\\n\\r\\n        if (this.KLineSize)\\r\\n        {\\r\\n            if (this.KLineSize.DataWidth==null)\\r\\n            {\\r\\n                showCount=this.Frame.SubFrame[0].Frame.XPointCount-this.RightSpaceCount;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var obj=this.Frame.SetDataWidth(this.KLineSize.DataWidth);\\r\\n                showCount=obj.XPointCount-this.RightSpaceCount;\\r\\n                this.KLineSize.DataWidth=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item =this.Frame.SubFrame[i].Frame;\\r\\n            item.XPointCount=showCount+this.RightSpaceCount;\\r\\n            item.Data=this.ChartPaint[0].Data;\\r\\n\\r\\n            item.XSplitOperator.Symbol=this.Symbol;\\r\\n            item.XSplitOperator.Period=this.Period;\\r\\n        }\\r\\n\\r\\n        this.TitlePaint[0].Data=this.ChartPaint[0].Data;                    //动态标题\\r\\n        this.TitlePaint[0].Symbol=this.Symbol;\\r\\n        this.TitlePaint[0].Name=this.Name;\\r\\n        this.TitlePaint[0].Period=this.Period;\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatX.Data=this.ChartPaint[0].Data;   //十字光标\\r\\n        this.Frame.Data=this.ChartPaint[0].Data;\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)   //K线叠加 主图股票数据绑定到叠加上\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.MainData=this.ChartPaint[0].Data;\\r\\n        }\\r\\n\\r\\n        var dataOffset=hisData.Data.length-showCount;\\r\\n        if (dataOffset<0) dataOffset=0;\\r\\n        this.ChartPaint[0].Data.DataOffset=dataOffset;\\r\\n        this.ChartPaint[0].Period=this.Period;\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatY.Symbol=this.Symbol;\\r\\n\\r\\n        this.CursorIndex=showCount;\\r\\n        if (this.CursorIndex+dataOffset>=hisData.Data.length) this.CursorIndex=hisData.Data.length-1-dataOffset;\\r\\n        if (this.CursorIndex<0) this.CursorIndex=0; //不一定对啊\\r\\n\\r\\n        if (this.CustomShow) //定制显示 1次有效\\r\\n        {\\r\\n            this.SetCustomShow(this.CustomShow,hisData);\\r\\n            this.CustomShow=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.UpdateMainData=function(hisData, lastDataCount)\\r\\n    {\\r\\n        var frameHisdata=null;\\r\\n        if (!this.Frame.Data) frameHisdata=this.Frame.Data;\\r\\n        else if (this.Frame.SubFrame && this.Frame.SubFrame[0]) frameHisdata=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!frameHisdata) return;\\r\\n        var xPointCount=this.Frame.SubFrame[0].Frame.XPointCount;   //当前一屏能显示的数据个数\\r\\n\\r\\n        var newDataCount=0;\\r\\n        if (lastDataCount>0 && hisData.Data.length>lastDataCount)\\r\\n        {\\r\\n            newDataCount=hisData.Data.length-lastDataCount;\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::UpdateMainData]  [count=${lastDataCount}->${hisData.Data.length}], [newDataCount=${newDataCount}]`);\\r\\n        }\\r\\n\\r\\n        this.ChartPaint[0].Data=hisData;\\r\\n        this.ChartPaint[0].Symbol=this.Symbol;\\r\\n        if (hisData.Data.length>xPointCount) //不满一屏的, 不需要调整索引\\r\\n            this.ChartPaint[0].Data.DataOffset=frameHisdata.DataOffset+newDataCount;    //加上数据增加的个数\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item =this.Frame.SubFrame[i].Frame;\\r\\n            item.Data=this.ChartPaint[0].Data;\\r\\n\\r\\n            if (i==0)   //更新Y轴K线数据\\r\\n            {\\r\\n                item.YSplitOperator.Symbol=this.Symbol;\\r\\n                item.YSplitOperator.Data=this.ChartPaint[0].Data;          //K线数据\\r\\n                item.YSplitOperator.Period=this.Period;                    //周期\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.TitlePaint[0].Data=this.ChartPaint[0].Data;                    //动态标题\\r\\n        this.TitlePaint[0].Symbol=this.Symbol;\\r\\n        this.TitlePaint[0].Name=this.Name;\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatX.Data=this.ChartPaint[0].Data;   //十字光标\\r\\n        this.Frame.Data=this.ChartPaint[0].Data;\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)    //主图股票数据绑定到叠加股票上\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.MainData=this.ChartPaint[0].Data;\\r\\n        }\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatY.Symbol=this.Symbol;\\r\\n    }\\r\\n\\r\\n    this.SetCustomShow=function(customShow,hisData)\\r\\n    {\\r\\n        if (!customShow || !customShow.Date || customShow.Date<19910101) return;\\r\\n\\r\\n        var firstDate=customShow.Date;\\r\\n        var index=null;\\r\\n        for(var i =0;i<hisData.Data.length;++i)\\r\\n        {\\r\\n            var item=hisData.Data[i];\\r\\n            if (item.Date>=firstDate)\\r\\n            {\\r\\n                index=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n        if (index===null)\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::SetCustomShow] Can't find first date=${firstDate}`);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var count=hisData.Data.length-index;\\r\\n        if (customShow.PageSize>0) count=customShow.PageSize;\\r\\n\\r\\n        var customShowCount=count;\\r\\n        var pageSize=this.GetMaxMinPageSize();\\r\\n        if (count>pageSize.Max) customShowCount=pageSize.Max;\\r\\n        else if (count<pageSize.Min) customShowCount=pageSize.Min;\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item =this.Frame.SubFrame[i].Frame;\\r\\n            item.XPointCount=customShowCount;\\r\\n        }\\r\\n\\r\\n        this.ChartPaint[0].Data.DataOffset=index;\\r\\n        this.CursorIndex=0;\\r\\n    }\\r\\n\\r\\n    this.OnDragSelectRectMouseUp=function(e)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return;\\r\\n\\r\\n        var selectData=paint.GetSelectRectData();\\r\\n        if (!selectData) return;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var corssCursor=this.ChartCorssCursor;  //十字光标\\r\\n        e.data=\\r\\n            {\\r\\n                Chart:this,\\r\\n                X:corssCursor.LastPoint.X/pixelTatio,\\r\\n                Y:corssCursor.LastPoint.Y/pixelTatio,\\r\\n                SelectData:selectData,          //区间选择的数据\\r\\n                RectSelectPaint:paint           //区间选择背景\\r\\n            };\\r\\n\\r\\n        if (this.SelectRectRightMenu)\\r\\n            this.SelectRectRightMenu.DoModal(e);\\r\\n    }\\r\\n\\r\\n    this.ShowSelectData=function(selectData)\\r\\n    {\\r\\n        this.HideSelectRect();\\r\\n        if (this.SelectRectRightMenu) this.SelectRectRightMenu.Hide();\\r\\n\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::ShowSelectData] selectData', selectData);\\r\\n        var dataOffset=selectData.Start;\\r\\n        var showCount=(selectData.End-selectData.Start)+1;\\r\\n\\r\\n        JSConsole.Chart.Log(`[KLineChartContainer::ShowSelectData] DataOffset=${dataOffset}, ShowCount=${showCount}`);\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item =this.Frame.SubFrame[i].Frame;\\r\\n            item.XPointCount=showCount;\\r\\n        }\\r\\n        this.ChartPaint[0].Data.DataOffset=dataOffset;\\r\\n        this.CursorIndex=0;\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n    }\\r\\n\\r\\n    this.OnMarkRectSelect=function(e)\\r\\n    {\\r\\n        var corssCursor=this.ChartCorssCursor;  //十字光标\\r\\n        if (!corssCursor || corssCursor.Status==0) return;\\r\\n        if (!IFrameSplitOperator.IsNumber(corssCursor.CursorIndex)) return;\\r\\n        if (!this.ChartPaint[0] || !this.ChartPaint[0].Data) return;\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return;\\r\\n\\r\\n        var cursorIndex=corssCursor.CursorIndex;\\r\\n        JSConsole.Chart.Log(\\\"[KLineChartContainer::OnMarkRectSelect] dataIndex\\\", cursorIndex);\\r\\n\\r\\n        var kData=this.ChartPaint[0].Data;\\r\\n        cursorIndex=parseInt(cursorIndex.toFixed(0));\\r\\n        var index=cursorIndex+kData.DataOffset;\\r\\n        if (index>=kData.Data.length) index=kData.Data.length-1;\\r\\n\\r\\n        var item = kData.Data[index];\\r\\n\\r\\n        JSConsole.Chart.Log(\\\"[KLineChartContainer::OnMarkRectSelect] item\\\", item);\\r\\n\\r\\n        if (!this.SetRectSelectData(item)) return;\\r\\n\\r\\n        if (paint.GetPointCount()==2)\\r\\n        {\\r\\n            var selectData=paint.GetSelectRectData();\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_KEYDOWN_SELECT_RECT);\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data=\\r\\n                    {\\r\\n                        X:corssCursor.LastPoint.X/pixelTatio,\\r\\n                        Y:corssCursor.LastPoint.Y/pixelTatio,\\r\\n                        SelectData:selectData,   //区间选择的数据\\r\\n                        RectSelectPaint:paint    //区间选择背景\\r\\n                    };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n\\r\\n            if (this.SelectRectRightMenu)\\r\\n            {\\r\\n                e.data=\\r\\n                    {\\r\\n                        Chart:this,\\r\\n                        X:corssCursor.LastPoint.X/pixelTatio,\\r\\n                        Y:corssCursor.LastPoint.Y/pixelTatio,\\r\\n                        SelectData:selectData,          //区间选择的数据\\r\\n                        RectSelectPaint:paint           //区间选择背景\\r\\n                    };\\r\\n                this.SelectRectRightMenu.DoModal(e);\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //创建指定窗口指标\\r\\n    this.CreateWindowIndex=function(windowIndex)\\r\\n    {\\r\\n        this.WindowIndex[windowIndex].Create(this,windowIndex);\\r\\n    }\\r\\n\\r\\n    this.BindIndexData=function(windowIndex,hisData)\\r\\n    {\\r\\n        if (!this.WindowIndex[windowIndex]) return;\\r\\n\\r\\n        if (typeof(this.WindowIndex[windowIndex].RequestData)==\\\"function\\\")  //数据需要另外下载的.\\r\\n        {\\r\\n            this.WindowIndex[windowIndex].RequestData(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n        if (typeof(this.WindowIndex[windowIndex].ExecuteScript)=='function')\\r\\n        {\\r\\n            this.WindowIndex[windowIndex].ExecuteScript(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.WindowIndex[windowIndex].BindData(this,windowIndex,hisData);\\r\\n    }\\r\\n\\r\\n    //叠加指标\\r\\n    this.BindOverlayIndexData=function(overlayItem, windowIndex, hisData)\\r\\n    {\\r\\n        if (!overlayItem.Script) return;\\r\\n\\r\\n        if (typeof(overlayItem.Script.RequestData)=='function')\\r\\n        {\\r\\n            overlayItem.Script.RequestData(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (typeof(overlayItem.Script.ExecuteScript)=='function')\\r\\n        {\\r\\n            overlayItem.Script.ExecuteScript(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        overlayItem.Script.BindData(this,windowIndex,hisData);\\r\\n    }\\r\\n\\r\\n    //执行指示(专家指示 五彩K线)\\r\\n    this.BindInstructionIndexData=function(hisData)\\r\\n    {\\r\\n        if (this.ColorIndex && typeof(this.ColorIndex.ExecuteScript)=='function')   //五彩K线\\r\\n        {\\r\\n            this.ColorIndex.ExecuteScript(this,0,hisData);\\r\\n        }\\r\\n\\r\\n        if (this.TradeIndex && typeof(this.TradeIndex.ExecuteScript)=='function')   //交易指标\\r\\n        {\\r\\n            this.TradeIndex.ExecuteScript(this,0,hisData);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //获取子窗口的所有画法\\r\\n    this.GetChartPaint=function(windowIndex)\\r\\n    {\\r\\n        var paint=new Array();\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            if (i==0) continue; //第1个K线数据除外\\r\\n\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item.ChartFrame==this.Frame.SubFrame[windowIndex].Frame)\\r\\n                paint.push(item);\\r\\n        }\\r\\n\\r\\n        return paint;\\r\\n    }\\r\\n\\r\\n    this.AutoUpdateEvent=function(bStart, explain)   //自定更新事件, 是给websocket使用\\r\\n    {\\r\\n        var eventID=bStart ? JSCHART_EVENT_ID.RECV_START_AUTOUPDATE:JSCHART_EVENT_ID.RECV_STOP_AUTOUPDATE;\\r\\n        if (!this.mapEvent.has(eventID)) return;\\r\\n\\r\\n        var self=this;\\r\\n        var event=this.mapEvent.get(eventID);\\r\\n        var data={ Stock:{ Symbol:this.Symbol, Name:this.Name, Right:this.Right, Period:this.Period  }, Explain: explain };\\r\\n        if (bStart)\\r\\n        {\\r\\n            data.Callback=function(data) //数据到达更新回调\\r\\n            {\\r\\n                if (ChartData.IsDayPeriod(self.Period,true)) self.RecvRealtimeData(data);\\r\\n                else if (ChartData.IsMinutePeriod(self.Period,true)) self.RecvMinuteRealtimeData(data);\\r\\n                else if (ChartData.IsSecondPeriod(self.Period)) self.RecvMinuteRealtimeData(data);\\r\\n            }\\r\\n        }\\r\\n        event.Callback(event,data,this);\\r\\n    }\\r\\n\\r\\n    this.SendKLineUpdateEvent=function(bindData)\\r\\n    {\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.RECV_KLINE_UPDATE_DATA);\\r\\n        if (event && event.Callback)\\r\\n        {\\r\\n            var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n            event.Callback(event,data,this);\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.SendManualKLineUpdateEvent=function(bindData)\\r\\n    {\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.RECV_KLINE_MANUAL_UPDATE_DATA);\\r\\n        if (event && event.Callback)\\r\\n        {\\r\\n            var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n            event.Callback(event,data,this);\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n\\r\\n    this.RequestHistoryData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n        this.ChartSplashPaint.EnableSplash(true);\\r\\n        this.FlowCapitalReady=false;\\r\\n        this.ResetPage(); //重置分页\\r\\n        this.ResetDragDownload();\\r\\n        this.Draw();\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestHistoryData', //类名::\\r\\n                    Explain:'日K数据',\\r\\n                    Request:{ Url:self.KLineApiUrl,  Type:'POST' ,\\r\\n                        Data: { symbol:self.Symbol, count:self.MaxReqeustDataCount, field: [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"] } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryData(data);\\r\\n                var page=self.Page.Day;\\r\\n                if (page.Enable==true && page.Finish==false)\\r\\n                {\\r\\n                    self.RequestHistoryPageData();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    self.AutoUpdateEvent(true,'KLineChartContainer::RequestHistoryData');\\r\\n                    self.AutoUpdate();\\r\\n                }\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.KLineApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                    \\\"symbol\\\": self.Symbol,\\r\\n                    \\\"start\\\": -1,\\r\\n                    \\\"count\\\": self.MaxReqeustDataCount\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryData(data);\\r\\n                var page=self.Page.Day;\\r\\n                if (page.Enable==true && page.Finish==false)\\r\\n                {\\r\\n                    self.RequestHistoryPageData();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    self.AutoUpdateEvent(true,'KLineChartContainer::RequestHistoryData');\\r\\n                    self.AutoUpdate();\\r\\n                }\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.BindAllOverlayIndexData=function(hisData)\\r\\n    {\\r\\n        if (!this.Frame || !this.Frame.SubFrame) return;\\r\\n\\r\\n        //叠加指标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            for(var j in item.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                this.BindOverlayIndexData(overlayItem,i,hisData)\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToHistoryData(data);\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryDayData;\\r\\n        sourceData.DataType=0;      //0=日线数据 1=分钟数据\\r\\n        sourceData.Symbol=data.symbol;\\r\\n        this.SourceData=sourceData;\\r\\n\\r\\n        if (this.BeforeBindMainData) this.BeforeBindMainData(\\\"RecvHistoryData\\\");\\r\\n\\r\\n        //显示的数据\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryDayData;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.DataType=0;\\r\\n        bindData.Symbol=data.symbol;\\r\\n\\r\\n        if (bindData.Right>0 && !this.IsApiPeriod)    //复权\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula } );\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.Symbol=data.symbol;\\r\\n        this.Name=data.name;\\r\\n\\r\\n        this.BindMainData(bindData,this.PageSize);\\r\\n        if (this.AfterBindMainData) this.AfterBindMainData(\\\"RecvHistoryData\\\");\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        var firstSubFrame;\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i) //执行指标\\r\\n        {\\r\\n            if (i==0) firstSubFrame=this.Frame.SubFrame[i].Frame;\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        if (firstSubFrame && firstSubFrame.YSplitOperator)\\r\\n        {\\r\\n            firstSubFrame.YSplitOperator.Symbol=this.Symbol;\\r\\n            firstSubFrame.YSplitOperator.Data=this.ChartPaint[0].Data;          //K线数据\\r\\n            firstSubFrame.YSplitOperator.Period=this.Period;                    //周期\\r\\n        }\\r\\n\\r\\n        var page=this.Page.Day;\\r\\n        if (page.Enable==false || (page.Enable==true && page.Finish==true))  //分页下载 这些数据迁移到分页下载完以后下载\\r\\n        {\\r\\n            this.ReqeustKLineInfoData({ FunctionName:\\\"RecvHistoryData\\\" });            //请求信息地雷\\r\\n            this.RequestFlowCapitalData();          //请求流通股本数据 (主数据下载完再下载)\\r\\n            this.RequestOverlayHistoryData();       //请求叠加数据 (主数据下载完再下载)\\r\\n            this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n        }\\r\\n\\r\\n        if (page.Enable) page.Index=1;    //第一页下载完成\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.UpdatePointByCursorIndex(2);   //取消十字光标\\r\\n        this.Draw();\\r\\n\\r\\n        //叠加指标\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n\\r\\n        if (this.mapEvent.has(JSCHART_EVENT_ID.RECV_HISTROY_DATA))\\r\\n        {\\r\\n            var event=this.mapEvent.get(JSCHART_EVENT_ID.RECV_HISTROY_DATA);\\r\\n            var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RequestHistoryPageData=function()  //请求分页\\r\\n    {\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var firstItem=this.SourceData.Data[0];   //最新的一条数据\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestHistoryPageData', //类名::\\r\\n                    Explain:'日K数据分页',\\r\\n                    Request:{ Url:'none',  Type:'POST' ,\\r\\n                        Data: { symbol:self.Symbol, index:self.Page.Day.Index, field: [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"], firstDate:firstItem.Date, first:{ date: firstItem.Date } } },\\r\\n                    Page:self.Page.Day,\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvHistoryPageData(data);\\r\\n                var page=self.Page.Day;\\r\\n                if (page.Enable==true && page.Finish==false)\\r\\n                    self.RequestHistoryPageData();  //继续下载\\r\\n                else\\r\\n                    self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        //模拟异步请求\\r\\n        setTimeout(function()\\r\\n        {\\r\\n            var page=self.Page.Day;\\r\\n            page.Finish=true;\\r\\n            var data= //测试数据\\r\\n                {\\r\\n                    data:\\r\\n                        [\\r\\n                            [ 20150218, 12.54, 12.5, 12.74, 11.95, 12.27, 117632441, 1459671045 ],\\r\\n                            [ 20150219, 12.27, 12.1, 12.23, 11.9, 12.23, 95889423, 1157078548 ],\\r\\n                            [ 20150220, 12.23, 12.17, 12.17, 11.9, 12.05, 67763439, 815652761]\\r\\n                        ],\\r\\n                    symbol:self.Symbol,\\r\\n                    name:self.Name\\r\\n                };\\r\\n\\r\\n            self.RecvHistoryPageData(data);\\r\\n            if (page.Enable==true && page.Finish==false)\\r\\n                self.RequestHistoryPageData();\\r\\n            else\\r\\n                self.AutoUpdate();\\r\\n\\r\\n        },500)\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryPageData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToHistoryData(data);\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n\\r\\n        for(var i in aryDayData)    //数据往前插\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            this.SourceData.Data.splice(i,0,item);\\r\\n        }\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n\\r\\n        if (bindData.Right>0 && bindData.Period<=3)    //复权(日线数据才复权)\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        var page=this.Page.Day;\\r\\n        ++page.Index;\\r\\n\\r\\n        if (page.Enable==true && page.Finish==true)  //分页下载 这些数据迁移到分页下载完以后下载\\r\\n        {\\r\\n            this.RequestFlowCapitalData();          //请求流通股本数据 (主数据下载完再下载)\\r\\n            this.RequestOverlayHistoryData();       //请求叠加数据 (主数据下载完再下载)\\r\\n            this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ReqeustHistoryMinuteData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n        this.ChartSplashPaint.EnableSplash(true);\\r\\n        this.FlowCapitalReady=false;\\r\\n        this.ResetPage(); //重置分页\\r\\n        this.ResetDragDownload();\\r\\n        this.Draw();\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::ReqeustHistoryMinuteData', //类名::\\r\\n                    Explain:'1分钟K线数据',\\r\\n                    Request:{ Url:self.MinuteKLineApiUrl,  Type:'POST',\\r\\n                        Data: { symbol:self.Symbol, count:self.MaxRequestMinuteDayCount, field: [\\\"name\\\",\\\"symbol\\\", \\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"] }  },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvMinuteHistoryData(data);\\r\\n                var page=self.Page.Minute;\\r\\n                if (page.Enable==true && page.Finish==false)\\r\\n                {\\r\\n                    self.ReqeustHistoryMinutePageData();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    self.AutoUpdateEvent(true,'KLineChartContainer::ReqeustHistoryMinuteData');\\r\\n                    self.AutoUpdate();\\r\\n                }\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.MinuteKLineApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\", \\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                    \\\"symbol\\\": self.Symbol,\\r\\n                    \\\"start\\\": -1,\\r\\n                    \\\"count\\\": self.MaxRequestMinuteDayCount\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvMinuteHistoryData(data);\\r\\n                var page=self.Page.Minute;\\r\\n                if (page.Enable==true && page.Finish==false)\\r\\n                {\\r\\n                    self.ReqeustHistoryMinutePageData();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    self.AutoUpdateEvent(true,'KLineChartContainer::ReqeustHistoryMinuteData');\\r\\n                    self.AutoUpdate();\\r\\n                }\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n\\r\\n    this.RecvMinuteHistoryData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToMinuteHistoryData(data);\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryDayData;\\r\\n        sourceData.DataType=1;      //0=日线数据 1=分钟数据\\r\\n        sourceData.Symbol=data.symbol;\\r\\n        this.SourceData=sourceData;\\r\\n        if (this.BeforeBindMainData) this.BeforeBindMainData(\\\"RecvMinuteHistoryData\\\");\\r\\n\\r\\n        //显示的数据\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryDayData;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.DataType=1;\\r\\n        bindData.Symbol=data.symbol;\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n        {\\r\\n            var periodData=sourceData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.Symbol=data.symbol;\\r\\n        this.Name=data.name;\\r\\n\\r\\n        this.BindMainData(bindData,this.PageSize);\\r\\n        if (this.AfterBindMainData) this.AfterBindMainData(\\\"RecvMinuteHistoryData\\\");\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        var firstSubFrame;\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i) //执行指标\\r\\n        {\\r\\n            if (i==0) firstSubFrame=this.Frame.SubFrame[i].Frame;\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        if (firstSubFrame && firstSubFrame.YSplitOperator)\\r\\n        {\\r\\n            firstSubFrame.YSplitOperator.Symbol=this.Symbol;\\r\\n            firstSubFrame.YSplitOperator.Data=this.ChartPaint[0].Data;         //K线数据\\r\\n            firstSubFrame.YSplitOperator.Period=this.Period;                    //周期\\r\\n        }\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)    //分钟数据不支持叠加 清空\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.Data=null;\\r\\n            //item.Status=OVERLAY_STATUS_ID.STATUS_NONE_ID;\\r\\n        }\\r\\n\\r\\n        var page=this.Page.Minute;\\r\\n        if (page.Enable==false || (page.Enable==true && page.Finish==true) )\\r\\n        {\\r\\n            this.RequestFlowCapitalData();              //请求流通股本数据 (主数据下载完再下载)\\r\\n            this.RequestOverlayHistoryMinuteData();     //请求叠加数据 (主数据下载完再下载)\\r\\n            this.CreateChartDrawPictureByStorage();     //创建画图工具\\r\\n        }\\r\\n\\r\\n        if (page.Enable) ++page.Index;\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex(2);  //切换周期了取消十字光标\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        //叠加指标\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n\\r\\n        if (this.mapEvent.has(JSCHART_EVENT_ID.RECV_HISTROY_DATA))\\r\\n        {\\r\\n            var event=this.mapEvent.get(JSCHART_EVENT_ID.RECV_HISTROY_DATA);\\r\\n            var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReqeustHistoryMinutePageData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var firstItem=this.SourceData.Data[0];   //最新的一条数据\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RecvHistoryMinutePageData', //类名::\\r\\n                    Explain:'1分钟K线数据分页',\\r\\n                    Request:{ Url:'none',  Type:'POST' ,\\r\\n                        Data: { symbol:self.Symbol, index:self.Page.Minute.Index, field: [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"], firstDate:firstItem.Date, first:{ date: firstItem.Date, time:firstItem.Time } } },\\r\\n                    Page:self.Page.Minute,\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvHistoryMinutePageData(data);\\r\\n                var page=self.Page.Minute;\\r\\n                if (page.Enable==true && page.Finish==false)\\r\\n                    self.ReqeustHistoryMinutePageData();  //继续下载\\r\\n                else\\r\\n                    self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        //模拟异步请求\\r\\n        setTimeout(function()\\r\\n        {\\r\\n            var page=self.Page.Minute;\\r\\n            page.Finish=true;\\r\\n            var data= //测试数据\\r\\n                {\\r\\n                    data:\\r\\n                        [\\r\\n                            [ 20190906,14.58,14.71,14.71,14.71,14.71,1096425,16128411,925],\\r\\n                            [ 20190906,14.71,14.73,14.74,14.71,14.71,2154859,31731820,930],\\r\\n                            [ 20190906,14.71,14.71,14.71,14.68,14.69,1427516,20989208,931],\\r\\n                            [ 20190906,14.69,14.69,14.71,14.68,14.7, 1680503,24694143,932],\\r\\n                            [ 20190906,14.7,14.69,14.7,14.65,14.65,1315900,19310964,933],\\r\\n                            [ 20190906,14.65,14.66,14.69,14.65,14.68,702955,10313842,934],\\r\\n                            [ 20190906,14.68,14.7,14.71,14.67, 14.67,1735266,25495875,935],\\r\\n                            [ 20190906,14.67,14.68,14.7,14.67,14.67,739000,10845398,936],\\r\\n                            [ 20190906,14.67,14.67,14.68,14.67,14.68,389800,5721266,937],\\r\\n                            [ 20190906,14.68,14.68,14.7,14.68,14.69,648477,9527859,938],\\r\\n                            [ 20190906,14.69,14.7,14.71,14.69,14.7,1128400,16589794,939],\\r\\n                            [ 20190906,14.7,14.7,14.71,14.69,14.71,714858,10509708,940],\\r\\n                            [ 20190906,14.71,14.71,14.71,14.69,14.69,401500,5900477,941],\\r\\n                            [ 20190906,14.69,14.69,14.71,14.69,14.69,1165684,17131034,942],\\r\\n                            [ 20190906,14.69, 14.69,14.7,14.67,14.67,498516, 7321024,943],\\r\\n                            [ 20190906,14.67,14.68,14.68,14.67,14.67,350126,5139012,944],\\r\\n                            [ 20190906,14.67,14.67,14.69,14.67,14.69,561600,8246789,945]\\r\\n                        ]\\r\\n                    //symbol:'600000.sh',\\r\\n                    //name:'浦发行情'\\r\\n                };\\r\\n\\r\\n            self.RecvHistoryMinutePageData(data);\\r\\n            if (page.Enable==true && page.Finish==false)\\r\\n                self.ReqeustHistoryMinutePageData();\\r\\n            else\\r\\n                self.AutoUpdate();\\r\\n\\r\\n        },500)\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryMinutePageData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToMinuteHistoryData(data);\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n\\r\\n        for(var i in aryDayData)    //数据往前插\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            this.SourceData.Data.splice(i,0,item);\\r\\n        }\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n\\r\\n        if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,false))    //复权(日线数据才复权)\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        var page=this.Page.Minute;\\r\\n        if (page.Enable==false || (page.Enable==true && page.Finish==true) )\\r\\n        {\\r\\n            this.RequestFlowCapitalData();          //请求流通股本数据 (主数据下载完再下载)\\r\\n            this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n        }\\r\\n\\r\\n        if (page.Enable) ++page.Index;\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //请求实时行情数据\\r\\n    this.RequestRealtimeData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var arySymbol=[self.Symbol];\\r\\n        for(var i in this.OverlayChartPaint)    //叠加的股票更新\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.Symbol) continue;\\r\\n            if (!item.MainData) continue;   //等待主图股票数据未下载完\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;\\r\\n            arySymbol.push(item.Symbol);\\r\\n        }\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestRealtimeData', //类名::函数名\\r\\n                    Explain:'当天最新日线数据',\\r\\n                    Request:{ Url:self.RealtimeApiUrl, Data:{ symbol: arySymbol,\\r\\n                            field:[\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"time\\\"] }, Type:'POST' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvRealtimeData(data);\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.RealtimeApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"time\\\"],\\r\\n                    \\\"symbol\\\": arySymbol,\\r\\n                    \\\"start\\\": -1\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.RecvRealtimeData(data);\\r\\n                self.AutoUpdate();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvRealtimeData=function(data)\\r\\n    {\\r\\n        if (this.IsOnTouch==true) return;   //正在操作中不更新数据\\r\\n        var realtimeData=KLineChartContainer.JsonDataToRealtimeData(data,this.Symbol);\\r\\n        if (!realtimeData) return;\\r\\n\\r\\n        var item=this.SourceData.Data[this.SourceData.Data.length-1];   //最新的一条数据\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n\\r\\n        if (this.SourceData.Data.length==0) //第1条数据\\r\\n        {\\r\\n            var newItem =new HistoryData();\\r\\n            HistoryData.CopyTo(newItem,realtimeData);\\r\\n            this.SourceData.Data.push(newItem);\\r\\n        }\\r\\n        else if (item.Date==realtimeData.Date)   //实时行情数据更新\\r\\n        {\\r\\n            JSConsole.Chart.Log('[KLineChartContainer::RecvRealtimeData] update kline by realtime data',realtimeData);\\r\\n            HistoryData.CopyTo(item,realtimeData);\\r\\n        }\\r\\n        else if (item.Date<realtimeData.Date)   //新增加数据\\r\\n        {\\r\\n            JSConsole.Chart.Log('[KLineChartContainer::RecvRealtimeData] insert kline by realtime data',realtimeData);\\r\\n\\r\\n            var newItem =new HistoryData();\\r\\n            HistoryData.CopyTo(newItem,realtimeData);\\r\\n\\r\\n            if (!IFrameSplitOperator.IsNumber(newItem.YClose) && this.SourceData.Data.length>0)\\r\\n                newItem.YClose=this.SourceData.Data[this.SourceData.Data.length-1].YClose;\\r\\n\\r\\n            this.SourceData.Data.push(newItem);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,true) && MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol) && !this.IsApiPeriod)    //复权(A股日线数据才复权)\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (!this.IsApiPeriod)\\r\\n        {\\r\\n            if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.UpdateMainData(bindData,lastDataCount);//更新主图数据\\r\\n        this.UpdateOverlayRealtimeData(data);       //更新叠加股票数据\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex(1);  //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        this.SendKLineUpdateEvent(bindData);\\r\\n\\r\\n        //叠加指标计算\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n    }\\r\\n\\r\\n    this.UpdateOverlayRealtimeData=function(data)\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.Symbol) continue;\\r\\n            if (!item.MainData) continue;   //等待主图股票数据未下载完\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;\\r\\n            var realtimeData=KLineChartContainer.JsonDataToRealtimeData(data,item.Symbol);  //获取叠加股票的最新数据\\r\\n            if (!realtimeData) continue;\\r\\n            var sourceData=item.SourceData; //叠加股票的所有数据\\r\\n            var latestData=sourceData.Data[sourceData.Data.length-1];   //最新的一条数据\\r\\n\\r\\n            if (latestData.Date==realtimeData.Date)   //实时行情数据更新\\r\\n            {\\r\\n                JSConsole.Chart.Log('[KLineChartContainer::UpdateOverlayRealtimeData] update kline by minute data',realtimeData);\\r\\n\\r\\n                latestData.Close=realtimeData.Close;\\r\\n                latestData.High=realtimeData.High;\\r\\n                latestData.Low=realtimeData.Low;\\r\\n                latestData.Vol=realtimeData.Vol;\\r\\n                latestData.Amount=realtimeData.Amount;\\r\\n            }\\r\\n            else if (item.Date<realtimeData.Date)   //新增加数据\\r\\n            {\\r\\n                JSConsole.Chart.Log('[KLineChartContainer::UpdateOverlayRealtimeData] insert kline by minute data',realtimeData);\\r\\n\\r\\n                var newItem =new HistoryData();\\r\\n                newItem.YClose=realtimeData.YClose;\\r\\n                newItem.Open=realtimeData.Open;\\r\\n                newItem.Close=realtimeData.Close;\\r\\n                newItem.High=realtimeData.High;\\r\\n                newItem.Low=realtimeData.Low;\\r\\n                newItem.Vol=realtimeData.Vol;\\r\\n                newItem.Amount=realtimeData.Amount;\\r\\n                newItem.Date=realtimeData.Date;\\r\\n                sourceData.Data.push(newItem);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=sourceData.Data;\\r\\n            bindData.Period=this.Period;\\r\\n            bindData.Right=this.Right;\\r\\n            bindData.DataType=0;\\r\\n\\r\\n            if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsSHSZStockA(data.symbol) && !this.IsApiPeriod)    //复权数据 ,A股才有有复权\\r\\n            {\\r\\n                var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n                bindData.Data=rightData;\\r\\n            }\\r\\n\\r\\n            var aryOverlayData=this.SourceData.GetOverlayData(bindData.Data, this.IsApiPeriod);      //和主图数据拟合以后的数据\\r\\n            bindData.Data=aryOverlayData;\\r\\n\\r\\n            if (ChartData.IsDayPeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n\\r\\n            item.Data=bindData;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RequestMinuteRealtimeData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var arySymbol=[self.Symbol];\\r\\n        for(var i in this.OverlayChartPaint)    //叠加的股票更新\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.Symbol) continue;\\r\\n            if (!item.MainData) continue;   //等待主图股票数据未下载完\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;\\r\\n            arySymbol.push(item.Symbol);\\r\\n        }\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestMinuteRealtimeData', //类名::\\r\\n                    Explain:'当天1分钟K线数据',\\r\\n                    Request:{ Url:self.RealtimeApiUrl, Data:{ symbol: arySymbol,\\r\\n                            field:[\\\"name\\\",\\\"symbol\\\",\\\"price\\\",\\\"yclose\\\",\\\"minutecount\\\",\\\"minute\\\",\\\"date\\\",\\\"time\\\"] }, Type:'POST' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvMinuteRealtimeData(data);\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.RealtimeApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"price\\\",\\\"yclose\\\",\\\"minutecount\\\",\\\"minute\\\",\\\"date\\\",\\\"time\\\"],\\r\\n                    \\\"symbol\\\": arySymbol,\\r\\n                    \\\"start\\\": -1\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.RecvMinuteRealtimeData(data);\\r\\n                self.AutoUpdate();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.SetSourceDatatLimit=function(aryLimit)\\r\\n    {\\r\\n        this.SourceDataLimit=new Map();\\r\\n        for(var i in aryLimit)\\r\\n        {\\r\\n            var item=aryLimit[i];\\r\\n            this.SourceDataLimit.set(item.Period, item.MaxCount); //每个周期缓存数据最大个数 key=周期 value=最大个数\\r\\n\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::SetSourceDatatLimit] Period=${item.Period}, MaxCount=${item.MaxCount}`);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReduceSourceData=function()\\r\\n    {\\r\\n        if (!this.SourceDataLimit) return;\\r\\n        if (!this.SourceDataLimit.has(this.Period)) return;\\r\\n\\r\\n        var limitCount=this.SourceDataLimit.get(this.Period);\\r\\n\\r\\n        var frameHisdata=null;\\r\\n        if (!this.Frame.Data) frameHisdata=this.Frame.Data;\\r\\n        else if (this.Frame.SubFrame && this.Frame.SubFrame[0]) frameHisdata=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!frameHisdata) return;\\r\\n\\r\\n        if (limitCount<50) return;\\r\\n        var dataOffset=frameHisdata.DataOffset;\\r\\n        var removeCount=0;\\r\\n        while(this.SourceData.Data.length>limitCount)\\r\\n        {\\r\\n            this.SourceData.Data.shift();\\r\\n            --dataOffset;\\r\\n            ++removeCount;\\r\\n        }\\r\\n\\r\\n        if (removeCount>0)\\r\\n        {\\r\\n            if (dataOffset<0) dataOffset=0;\\r\\n            frameHisdata.DataOffset=dataOffset;\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::ReduceSourceData] remove data ${removeCount}, dataOffset=${dataOffset}`);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteRealtimeDataV2=function(data)    //新版本的\\r\\n    {\\r\\n        if (this.IsOnTouch==true) return;   //正在操作中不更新数据\\r\\n        var aryMinuteData=KLineChartContainer.JsonDataToMinuteHistoryData(data);\\r\\n        if (!aryMinuteData || aryMinuteData.length<=0) return;\\r\\n        if (this.IsApiPeriod) this.ReduceSourceData();  //减少数据\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n        if (!this.SourceData) return;\\r\\n        if (!this.SourceData.MergeMinuteData(aryMinuteData)) return;\\r\\n\\r\\n        JSConsole.Chart.Log(`[KLineChartContainer::RecvMinuteRealtimeDataV2] update kline by 1 minute data [${lastDataCount}->${this.SourceData.Data.length}]`);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,true) && !this.IsApiPeriod)    //复权(日线数据才复权)\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if ((ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) && !this.IsApiPeriod)   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex(1);  //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        this.SendKLineUpdateEvent(bindData);\\r\\n\\r\\n        //更新叠加指标\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteRealtimeData=function(data)\\r\\n    {\\r\\n        if (this.IsOnTouch==true) return;   //正在操作中不更新数据\\r\\n        if (data.ver==2.0)\\r\\n        {\\r\\n            this.RecvMinuteRealtimeDataV2(data);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var realtimeData=KLineChartContainer.JsonDataToMinuteRealtimeData(data, this.Symbol);\\r\\n        if (!realtimeData) return;\\r\\n        if (this.IsApiPeriod) this.ReduceSourceData();  //减少数据\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n        var lastSourceDataCount=this.SourceData.Data.length;\\r\\n        if (!this.SourceData.MergeMinuteData(realtimeData)) return;\\r\\n\\r\\n        JSConsole.Chart.Log(`[KLineChartContainer::RecvMinuteRealtimeData] update kline by 1 minute data [${lastSourceDataCount}->${this.SourceData.Data.length}]`);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,true) && !this.IsApiPeriod)    //复权(日线数据才复权)\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if ( (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) && !this.IsApiPeriod)   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.UpdateOverlayMinuteRealtimeData(data);       //更新叠加股票数据\\r\\n        this.BindInstructionIndexData(bindData);          //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex(1);  //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        this.SendKLineUpdateEvent(bindData);\\r\\n\\r\\n        //更新叠加指标\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n    }\\r\\n\\r\\n    //更新当天的全量分钟数据\\r\\n    this.UpdateOverlayMinuteRealtimeData=function(data)\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.Symbol) continue;\\r\\n            if (!item.MainData) continue;   //等待主图股票数据未下载完\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;\\r\\n            var realtimeData=KLineChartContainer.JsonDataToMinuteRealtimeData(data,item.Symbol);  //获取叠加股票的最新数据\\r\\n            if (!realtimeData) continue;\\r\\n            var sourceData=item.SourceData; //叠加股票的所有数据\\r\\n            if (!sourceData.MergeMinuteData(realtimeData)) return;\\r\\n\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=sourceData.Data;\\r\\n            bindData.Period=this.Period;\\r\\n            bindData.Right=this.Right;\\r\\n            bindData.DataType=0;\\r\\n\\r\\n            var aryOverlayData=this.SourceData.GetOverlayMinuteData(bindData.Data,this.IsApiPeriod);      //和主图数据拟合以后的数据\\r\\n            bindData.Data=aryOverlayData;\\r\\n\\r\\n            if (ChartData.IsMinutePeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n\\r\\n            item.Data=bindData;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetHistoryDataCount=function()\\r\\n    {\\r\\n        var frameHisdata=null;\\r\\n        if (!this.Frame.Data) frameHisdata=this.Frame.Data;\\r\\n        else if (this.Frame.SubFrame && this.Frame.SubFrame[0]) frameHisdata=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!frameHisdata) return -1;\\r\\n        var lastDataCount=frameHisdata.Data.length;  //上一个的数据长度\\r\\n        return lastDataCount;\\r\\n    }\\r\\n\\r\\n    this.GetRequestDataCount=function() //K线请求数据个数　(由于可以拖拽下载历史数据,所有原来固定个数的就不能用了)\\r\\n    {\\r\\n        var result={MaxRequestDataCount:this.MaxReqeustDataCount, MaxRequestMinuteDayCount:this.MaxRequestMinuteDayCount };\\r\\n\\r\\n        if (!this.SourceData || !this.SourceData.Data || this.SourceData.Data.length<=0) return result;\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))\\r\\n        {\\r\\n            var lCount=this.SourceData.Data.length;\\r\\n            if (lCount>result.MaxRequestDataCount) result.MaxRequestDataCount=lCount;\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n        {\\r\\n            var date;\\r\\n            var lCount=0;\\r\\n            for(var i in this.SourceData.Data)\\r\\n            {\\r\\n                var item=this.SourceData.Data[i];\\r\\n                if (item.Date!=date) ++lCount;\\r\\n                date=item.Date;\\r\\n            }\\r\\n            if (lCount>result.MaxRequestMinuteDayCount) result.MaxRequestMinuteDayCount=lCount;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //分笔数据\\r\\n    this.RequestTickData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n        self.ChartSplashPaint.EnableSplash(true);\\r\\n        self.Draw();\\r\\n\\r\\n        //下载缓存文件\\r\\n        var cacheUrl=g_JSChartResource.CacheDomain+'/cache/dealday/today/'+self.Symbol+'.json'\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestTickData', //类名::\\r\\n                    Explain:'当天分笔数据',\\r\\n                    Request:{ Url:cacheUrl, Data:{ symbol: self.Symbol }, Type:'GET' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvTickData(data);\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: cacheUrl,\\r\\n            data:{\\\"symbol\\\":self.Symbol},\\r\\n            type:\\\"get\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvTickData(data);\\r\\n                self.AutoUpdate(1);\\r\\n            },\\r\\n            error: function(http,e)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.AutoUpdate();\\r\\n                //self.RecvError(http,e,param);;\\r\\n            }\\r\\n        });\\r\\n\\r\\n    }\\r\\n\\r\\n    this.RecvTickData=function(data)\\r\\n    {\\r\\n        if (data.ver==2.0)\\r\\n            var aryDayData=KLineChartContainer.JsonDataToTickDataV2(data);\\r\\n        else\\r\\n            var aryDayData=KLineChartContainer.JsonDataToTickData(data);\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryDayData;\\r\\n        sourceData.DataType=2;      //0=日线数据 1=分钟数据 2=分笔数据\\r\\n        this.SourceData=sourceData;\\r\\n        if (this.BeforeBindMainData) this.BeforeBindMainData(\\\"RecvTickData\\\");\\r\\n\\r\\n        //显示的数据\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryDayData;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.DataType=2;\\r\\n\\r\\n        //绑定数据\\r\\n\\r\\n        this.Symbol=data.symbol;\\r\\n        this.Name=data.name;\\r\\n        this.BindMainData(bindData,this.PageSize);\\r\\n        if (this.AfterBindMainData) this.AfterBindMainData(\\\"RecvTickData\\\");\\r\\n\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        var firstSubFrame;\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i) //执行指标\\r\\n        {\\r\\n            if (i==0) firstSubFrame=this.Frame.SubFrame[i].Frame;\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        if (firstSubFrame && firstSubFrame.YSplitOperator)\\r\\n        {\\r\\n            firstSubFrame.YSplitOperator.Symbol=this.Symbol;\\r\\n            firstSubFrame.YSplitOperator.Data=this.ChartPaint[0].Data;         //K线数据\\r\\n            firstSubFrame.YSplitOperator.Period=this.Period;                   //周期\\r\\n            firstSubFrame.YSplitOperator.KLineChart=this.ChartPaint[0];        //绑定K线图形\\r\\n        }\\r\\n\\r\\n        //this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n\\r\\n        //叠加指标\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n\\r\\n        if (this.mapEvent.has(JSCHART_EVENT_ID.RECV_HISTROY_DATA))\\r\\n        {\\r\\n            var event=this.mapEvent.get(JSCHART_EVENT_ID.RECV_HISTROY_DATA);\\r\\n            var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //请求最新的分笔数据\\r\\n    this.RequestTickRealtimeData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var start=0;\\r\\n        if (this.SourceData && this.SourceData.Data) start=this.SourceData.Data.length;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestTickRealtimeData', //类名::\\r\\n                    Explain:'当天最新分笔数据',\\r\\n                    Request:{ Url:self.TickApiUrl, Data:{ symbol: self.Symbol, start:start, end:start+1000 }, Type:'POST' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvTickRealtimeData(data);\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.TickApiUrl,\\r\\n            data:{\\\"symbol\\\":self.Symbol, start:start-10, end:start+1000 },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvTickRealtimeData(data);\\r\\n                self.AutoUpdate();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvTickRealtimeData=function(data)\\r\\n    {\\r\\n        if (data.ver==2.0)\\r\\n            var aryDayData=KLineChartContainer.JsonDataToTickDataV2(data);    //增量数据\\r\\n        else\\r\\n            var aryDayData=KLineChartContainer.JsonDataToTickData(data);    //增量数据\\r\\n        if (!aryDayData || aryDayData.length<=0) return;\\r\\n\\r\\n        var redraw=false;   //强制重绘\\r\\n        if (data.redraw==true) redraw=true;\\r\\n        //更新原始数据\\r\\n        var source=this.SourceData.Data;\\r\\n        var lastDataCount=this.SourceData.Data.length;  //上一个的数据长度\\r\\n        var lastTime=0;\\r\\n        if (source.length>0) lastTime=source[source.length-1].Time;\\r\\n        var newCount=0;\\r\\n        for(var i in aryDayData)\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            if (item.Time<=lastTime) continue;\\r\\n            source.push(item);\\r\\n            ++newCount;\\r\\n        }\\r\\n        if (newCount<=0 && redraw==false) return;\\r\\n\\r\\n        //显示的数据\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=source;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.DataType=2;\\r\\n\\r\\n        //绑定数据\\r\\n        this.Symbol=data.symbol;\\r\\n        this.Name=data.name;\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n\\r\\n        //更新叠加指标\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n    }\\r\\n\\r\\n    //周期切换\\r\\n    this.ChangePeriod=function(period,option)\\r\\n    {\\r\\n        var isChangeKLineDrawType=false;\\r\\n        var isReload=false; //是否重新请求数据\\r\\n        var right=null; //复权\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.KLine)\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(option.KLine.DrawType)) isChangeKLineDrawType=true;\\r\\n                if (IFrameSplitOperator.IsNumber(option.KLine.Right)) right=option.KLine.Right;\\r\\n            }\\r\\n\\r\\n            if (option.Reload==true) isReload=true;\\r\\n        };\\r\\n\\r\\n        if (this.Period==period && isReload==false)\\r\\n        {\\r\\n            if (isChangeKLineDrawType) this.ChangeKLineDrawType(option.KLine.DrawType);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (isChangeKLineDrawType) this.ChangeKLineDrawType(option.KLine.DrawType,false);   //切换K线类型, 不重绘\\r\\n\\r\\n        var isDataTypeChange=true;\\r\\n        if (this.SourceData)\\r\\n        {\\r\\n            var isDataTypeChange=false;\\r\\n            if (period>CUSTOM_DAY_PERIOD_START && period<=CUSTOM_DAY_PERIOD_END)\\r\\n            {\\r\\n                if (this.SourceData.DataType!=0) isDataTypeChange=true;\\r\\n            }\\r\\n            else if ((period>CUSTOM_MINUTE_PERIOD_START && period<=CUSTOM_MINUTE_PERIOD_END) ||\\r\\n                (period>CUSTOM_SECOND_PERIOD_START && period<=CUSTOM_SECOND_PERIOD_END))\\r\\n            {\\r\\n                if (this.SourceData.DataType!=1) isDataTypeChange=true;\\r\\n                else if (ChartData.IsSecondPeriod(period)) isDataTypeChange=true;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                switch(period)\\r\\n                {\\r\\n                    case 0:     //日线\\r\\n                    case 1:     //周\\r\\n                    case 2:     //月\\r\\n                    case 3:     //年\\r\\n                    case 9:     //季线\\r\\n                    case 21:    //双周\\r\\n                        if (this.SourceData.DataType!=0) isDataTypeChange=true;\\r\\n                        break;\\r\\n                    case 4:     //1分钟\\r\\n                    case 5:     //5分钟\\r\\n                    case 6:     //15分钟\\r\\n                    case 7:     //30分钟\\r\\n                    case 8:     //60分钟\\r\\n                    case 11:    //2小时\\r\\n                    case 12:    //4小时\\r\\n                        if (this.SourceData.DataType!=1) isDataTypeChange=true;\\r\\n                        break;\\r\\n                    case 10:    //分笔线\\r\\n                        if (this.SourceData.DataType!=2) isDataTypeChange=true;\\r\\n                        break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Period=period;\\r\\n        if (right!=null) this.Right=right;\\r\\n        this.ReloadChartDrawPicture();   //切换周期了 清空画图工具\\r\\n        this.ClearRectSelect(true);\\r\\n        this.Frame.ClearUpDonwFrameYData();\\r\\n        this.ClearCustomKLine();\\r\\n\\r\\n        if (isDataTypeChange==false && !this.IsApiPeriod)\\r\\n        {\\r\\n            this.Update( {UpdateCursorIndexType:2} ); //更新的时候 取消显示十字光标\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))\\r\\n        {\\r\\n            this.CancelAutoUpdate();                    //先停止定时器\\r\\n            this.AutoUpdateEvent(false,'KLineChartContainer::ChangePeriod');                //切换周期先停止更新\\r\\n            this.ResetOverlaySymbolStatus();\\r\\n            this.RequestHistoryData();                  //请求日线数据\\r\\n            //this.ReqeustKLineInfoData();\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true) || ChartData.IsSecondPeriod(this.Period))\\r\\n        {\\r\\n            this.CancelAutoUpdate();                    //先停止定时器\\r\\n            this.AutoUpdateEvent(false,'KLineChartContainer::ChangePeriod');                //切换周期先停止更新\\r\\n            this.ResetOverlaySymbolStatus();\\r\\n            this.ReqeustHistoryMinuteData();            //请求分钟数据\\r\\n        }\\r\\n        else if (ChartData.IsTickPeriod(this.Period))\\r\\n        {\\r\\n            this.CancelAutoUpdate();                    //先停止定时器\\r\\n            this.AutoUpdateEvent(false,'KLineChartContainer::ChangePeriod');\\r\\n            this.RequestTickData();                     //请求分笔数据\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //复权切换\\r\\n    this.ChangeRight=function(right)\\r\\n    {\\r\\n        if (!MARKET_SUFFIX_NAME.IsEnableRight(this.Period,this.Symbol)) return;\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        if (MARKET_SUFFIX_NAME.IsBIT(upperSymbol)) return;\\r\\n\\r\\n        if (right<0 || right>2) return;\\r\\n\\r\\n        if (this.Right==right) return;\\r\\n\\r\\n        this.Right=right;\\r\\n\\r\\n        if (!this.IsApiPeriod)\\r\\n        {\\r\\n            this.Update();\\r\\n            return;\\r\\n        }\\r\\n        else    //API周期数据 重新请求数据\\r\\n        {\\r\\n            if (ChartData.IsDayPeriod(this.Period,true))\\r\\n            {\\r\\n                this.CancelAutoUpdate();                    //先停止定时器\\r\\n                this.AutoUpdateEvent(false,'KLineChartContainer::ChangeRight');                //切换复权先停止更新\\r\\n                this.ResetOverlaySymbolStatus();\\r\\n                this.RequestHistoryData();                  //请求日线数据\\r\\n            }\\r\\n            else if (ChartData.IsMinutePeriod(this.Period,true) || ChartData.IsSecondPeriod(this.Period))\\r\\n            {\\r\\n                this.CancelAutoUpdate();                    //先停止定时器\\r\\n                this.AutoUpdateEvent(false,'KLineChartContainer::ChangeRight');                //切换复权先停止更新\\r\\n                this.ResetOverlaySymbolStatus();\\r\\n                this.ReqeustHistoryMinuteData();            //请求分钟数据\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //设置第1屏的起始日期\\r\\n    this.SetFirstShowDate=function(obj)\\r\\n    {\\r\\n        if (!obj || !obj.Date) return;\\r\\n\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::SetFirstShowDate] obj=', obj);\\r\\n\\r\\n        var hisData=null;\\r\\n        if (!this.Frame.Data) hisData=this.Frame.Data;\\r\\n        else hisData=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!hisData) return;  //数据还没有到达\\r\\n\\r\\n        var index=null;\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))\\r\\n        {\\r\\n            for(var i=0;i<hisData.Data.length;++i)\\r\\n            {\\r\\n                var item=hisData.Data[i];\\r\\n                if (item.Date>=obj.Date)\\r\\n                {\\r\\n                    index=i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n        {\\r\\n            let findTime=obj.Time;\\r\\n            if (IFrameSplitOperator.IsPlusNumber(findTime))\\r\\n            {\\r\\n                for(var i=0;i<hisData.Data.length;++i)\\r\\n                {\\r\\n                    var item=hisData.Data[i];\\r\\n                    if (item.Date>obj.Date || (item.Date==obj.Date && item.Time>=findTime))\\r\\n                    {\\r\\n                        index=i;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else    //只有日期\\r\\n            {\\r\\n                for(var i=0;i<hisData.Data.length;++i)\\r\\n                {\\r\\n                    var item=hisData.Data[i];\\r\\n                    if (item.Date>=obj.Date)\\r\\n                    {\\r\\n                        index=i;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        if (index===null)\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::SetFirstShowDate] an't find first date=${obj.Date} time=${obj.Time}`, obj);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var count=hisData.Data.length-index;\\r\\n        var customShowCount=count;\\r\\n        if (obj.PageSize>0) customShowCount=obj.PageSize;\\r\\n\\r\\n        var pageSize = this.GetMaxMinPageSize();\\r\\n        if (pageSize.Max < customShowCount) customShowCount = pageSize.Max;\\r\\n        else if (pageSize.Min>customShowCount) customShowCount=pageSize.Min;\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)   //设置一屏显示的数据个数\\r\\n        {\\r\\n            var item =this.Frame.SubFrame[i].Frame;\\r\\n            item.XPointCount=customShowCount;\\r\\n        }\\r\\n\\r\\n        hisData.DataOffset=index;\\r\\n        this.CursorIndex=0;\\r\\n        this.LastPoint.X=null;\\r\\n        this.LastPoint.Y=null;\\r\\n\\r\\n        JSConsole.Chart.Log(`[KLineChartContainer::SetFirstShowDate] dataOffset=${hisData.DataOffset} CursorIndex=${this.CursorIndex} PageSize=${customShowCount}`);\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.UpdatePointByCursorIndex(2);   //更新十字光标位子\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //删除某一个窗口的指标\\r\\n    this.DeleteIndexPaint=function(windowIndex)\\r\\n    {\\r\\n        let paint=new Array();  //踢出当前窗口的指标画法\\r\\n        for(let i in this.ChartPaint)\\r\\n        {\\r\\n            let item=this.ChartPaint[i];\\r\\n\\r\\n            if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)\\r\\n                paint.push(item);\\r\\n        }\\r\\n\\r\\n        this.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin=null;    //清空指定最大最小值\\r\\n        this.Frame.SubFrame[windowIndex].Frame.IsLocked=false;          //解除上锁\\r\\n        this.Frame.SubFrame[windowIndex].Frame.YSplitScale = null;      //清空固定刻度\\r\\n\\r\\n        this.ChartPaint=paint;\\r\\n\\r\\n        //清空东条标题\\r\\n        var titleIndex=windowIndex+1;\\r\\n        this.TitlePaint[titleIndex].Data=[];\\r\\n        this.TitlePaint[titleIndex].Title=null;\\r\\n    }\\r\\n\\r\\n    //显示隐藏主图K线\\r\\n    this.ShowKLine=function(isShow)\\r\\n    {\\r\\n        if (this.ChartPaint.length<=0 || !this.ChartPaint[0]) return;\\r\\n        this.ChartPaint[0].IsShow=isShow;\\r\\n    }\\r\\n\\r\\n    this.SetInstructionData=function(type,instructionData)\\r\\n    {\\r\\n        if (this.ChartPaint.length<=0 || !this.ChartPaint[0]) return;\\r\\n\\r\\n        var title=this.TitlePaint[1];\\r\\n        if (type==2) //五彩K线\\r\\n        {\\r\\n            this.ChartPaint[0].ColorData=instructionData.Data;\\r\\n            if (title) title.ColorIndex={Name:instructionData.Name, Param:instructionData.Param };\\r\\n        }\\r\\n        else if (type==1)   //专家指示\\r\\n        {\\r\\n            this.ChartPaint[0].TradeData={Sell:instructionData.Sell, Buy:instructionData.Buy, Name:instructionData.Name, Param:instructionData.Param };\\r\\n            if (title) title.TradeIndex={ Name:instructionData.Name, Param:instructionData.Param };\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ChangeInstructionIndex=function(indexName)\\r\\n    {\\r\\n        let scriptData = new JSIndexScript();\\r\\n        let indexInfo = scriptData.Get(indexName);\\r\\n        if (!indexInfo) return;\\r\\n        if(indexInfo.InstructionType!=1 && indexInfo.InstructionType!=2) return;\\r\\n\\r\\n        indexInfo.ID=indexName;\\r\\n        this.ChangeInstructionScriptIndex(indexInfo);\\r\\n\\r\\n    }\\r\\n\\r\\n    this.ChangeInstructionScriptIndex=function(indexData)\\r\\n    {\\r\\n        if (indexData.InstructionType==1)       //交易系统\\r\\n        {\\r\\n            this.TradeIndex=new ScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n        }\\r\\n        else if (indexData.InstructionType==2)  //五彩K线\\r\\n        {\\r\\n            this.ColorIndex=new ScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        this.BindInstructionIndexData(bindData);\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.CancelInstructionIndex=function()  //取消指示数据\\r\\n    {\\r\\n        if (this.ChartPaint.length<=0 || !this.ChartPaint[0]) return;\\r\\n\\r\\n        this.ColorIndex=null;\\r\\n        this.TradeIndex=null;\\r\\n        this.ChartPaint[0].ColorData=null;  //五彩K线数据取消掉\\r\\n        this.ChartPaint[0].TradeData=null;  //交易系统数据取消\\r\\n\\r\\n        var title=this.TitlePaint[1];\\r\\n        if (title)\\r\\n        {\\r\\n            title.TradeIndex=null;\\r\\n            title.ColorIndex=null;\\r\\n        }\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.SetFrameToolbar=function(windowIndex,window)\\r\\n    {\\r\\n        if (!window || !this.Frame.SubFrame[windowIndex] || !this.Frame.SubFrame[windowIndex].Frame) return;\\r\\n\\r\\n        var frame=this.Frame.SubFrame[windowIndex].Frame;\\r\\n        var bChanged=false;\\r\\n        if (IFrameSplitOperator.IsBool(window.Modify))\\r\\n        {\\r\\n            frame.ModifyIndex=window.Modify;\\r\\n            bChanged=true;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(window.Change))\\r\\n        {\\r\\n            frame.ChangeIndex=window.Change;\\r\\n            bChanged=true;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(window.Close))\\r\\n        {\\r\\n            frame.CloseIndex=window.Close;\\r\\n            bChanged=true;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(window.Overlay))\\r\\n        {\\r\\n            frame.OverlayIndex=window.Overlay;\\r\\n            bChanged=true;\\r\\n        }\\r\\n\\r\\n        //工具栏变 先刷新工具栏\\r\\n        if (bChanged)\\r\\n        {\\r\\n            frame.SizeChange=true;\\r\\n            frame.ToolbarRect=null; //清空工具栏缓存\\r\\n            frame.DrawToolbar();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //切换成 脚本指标\\r\\n    this.ChangeScriptIndex=function(windowIndex,indexData,option)\\r\\n    {\\r\\n        this.DeleteIndexPaint(windowIndex);\\r\\n        this.WindowIndex[windowIndex]=new ScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.Window) this.SetFrameToolbar(windowIndex,option.Window);\\r\\n        }\\r\\n\\r\\n        this.Frame.ClearUpDonwFrameYData({ Index:windowIndex });\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        this.BindIndexData(windowIndex,bindData);   //执行脚本\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //切换api指标\\r\\n    this.ChangeAPIIndex=function(windowIndex,indexData)\\r\\n    {\\r\\n        this.DeleteIndexPaint(windowIndex);\\r\\n        //使用API挂接指标数据 API:{ Name:指标名字, Script:指标脚本可以为空, Args:参数可以为空, Url:指标执行地址 }\\r\\n        var apiItem=indexData.API;\\r\\n        this.WindowIndex[windowIndex]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,indexData);\\r\\n\\r\\n        if (indexData)\\r\\n        {\\r\\n            if (indexData.Window) this.SetFrameToolbar(windowIndex,indexData.Window);\\r\\n        }\\r\\n\\r\\n        this.Frame.ClearUpDonwFrameYData({ Index:windowIndex });\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        this.BindIndexData(windowIndex,bindData);   //执行脚本\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //切换指标 指定切换窗口指标\\r\\n    this.ChangeIndex=function(windowIndex,indexName,option)\\r\\n    {\\r\\n        if (option && option.API)   //切换api指标\\r\\n            return this.ChangeAPIIndex(windowIndex,option);\\r\\n\\r\\n        var indexItem=JSIndexMap.Get(indexName);\\r\\n        if (!indexItem)\\r\\n        {\\r\\n            //查找系统指标\\r\\n            let scriptData = new JSIndexScript();\\r\\n            let indexInfo = scriptData.Get(indexName);\\r\\n            if (!indexInfo) return;\\r\\n            if (indexInfo.IsMainIndex)\\r\\n            {\\r\\n                windowIndex = 0;  //主图指标只能在主图显示\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (windowIndex == 0) windowIndex = 1;  //幅图指标,不能再主图显示\\r\\n            }\\r\\n            let indexData = indexInfo;\\r\\n            if (option)\\r\\n            {\\r\\n                if (option.FloatPrecision>=0) indexData.FloatPrecision=option.FloatPrecision;\\r\\n                if (option.StringFormat>0) indexData.StringFormat=option.StringFormat;\\r\\n                if (option.Args) indexData.Args=option.Args;\\r\\n                if (option.TitleFont) indexData.TitleFont=option.TitleFont;\\r\\n                if (option.IsShortTitle) indexData.IsShortTitle=option.IsShortTitle;\\r\\n            }\\r\\n\\r\\n            return this.ChangeScriptIndex(windowIndex, indexData,option);\\r\\n        }\\r\\n\\r\\n        //主图指标\\r\\n        if (indexItem.IsMainIndex)\\r\\n        {\\r\\n            if (windowIndex>0)  windowIndex=0;  //主图指标只能在主图显示\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (windowIndex==0) windowIndex=1;  //幅图指标,不能再主图显示\\r\\n        }\\r\\n\\r\\n        var paint=new Array();  //踢出当前窗口的指标画法\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n\\r\\n            if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)\\r\\n                paint.push(item);\\r\\n        }\\r\\n\\r\\n\\r\\n        this.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin=null;    //清空指定最大最小值\\r\\n        this.Frame.SubFrame[windowIndex].Frame.IsLocked=false;          //解除上锁\\r\\n        this.Frame.SubFrame[windowIndex].Frame.YSplitScale = null;      //清空固定刻度\\r\\n\\r\\n        this.ChartPaint=paint;\\r\\n\\r\\n        //清空东条标题\\r\\n        var titleIndex=windowIndex+1;\\r\\n        this.TitlePaint[titleIndex].Data=[];\\r\\n        this.TitlePaint[titleIndex].Title=null;\\r\\n\\r\\n        this.WindowIndex[windowIndex]=indexItem.Create();\\r\\n        this.CreateWindowIndex(windowIndex);\\r\\n\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        this.BindIndexData(windowIndex,bindData);\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ChangePyScriptIndex=function(windowIndex,indexData)\\r\\n    {\\r\\n        this.DeleteIndexPaint(windowIndex);\\r\\n        this.WindowIndex[windowIndex]=new PyScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        this.BindIndexData(windowIndex,bindData);   //执行脚本\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.AddOverlayIndex=function(obj)\\r\\n    {\\r\\n        var overlay=this.CreateOverlayWindowsIndex(obj);\\r\\n        if (!overlay) return;\\r\\n\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        this.BindOverlayIndexData(overlay,obj.WindowIndex,bindData);\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //创建一个叠加指标\\r\\n    this.CreateOverlayWindowsIndex=function(obj) // {WindowIndex:, IndexName:, Identify:, ShowRightText:, API:}\\r\\n    {\\r\\n        let indexName=obj.IndexName;\\r\\n        let windowIndex=obj.WindowIndex;\\r\\n        var apiItem=null, indexInfo=null, indexCustom=null;\\r\\n        if (obj.API)\\r\\n        {\\r\\n            apiItem=obj.API;\\r\\n        }\\r\\n        else if (obj.Script)    //动态执行脚本\\r\\n        {\\r\\n            indexInfo={ Script:obj.Script, ID:obj.indexName, Name:obj.indexName};\\r\\n            if (obj.Name) indexInfo.Name=obj.Name;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            let scriptData = new JSIndexScript();\\r\\n            indexInfo = scriptData.Get(indexName);  //系统指标\\r\\n            if (!indexInfo)\\r\\n            {\\r\\n                indexCustom=JSIndexMap.Get(indexName);  //定制指标\\r\\n                if (!indexCustom)\\r\\n                {\\r\\n                    console.warn(`[KLineChartContainer::CreateOverlayIndex] can not find index[${indexName}]`);\\r\\n                    return null;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var subFrame=this.Frame.SubFrame[windowIndex];\\r\\n        subFrame.Interval=this.OverlayIndexFrameWidth;\\r\\n        var overlayFrame=new OverlayIndexItem();\\r\\n        if (obj.Identify) overlayFrame.Identify=obj.Identify;   //由外部指定id\\r\\n        var frame= this.ClassName==='KLineChartHScreenContainer' ? new OverlayKLineHScreenFrame() : new OverlayKLineFrame();\\r\\n        frame.Canvas=this.Canvas;\\r\\n        frame.MainFrame=subFrame.Frame;\\r\\n        frame.ChartBorder=subFrame.Frame.ChartBorder;\\r\\n        if (obj.ShowRightText===true) frame.IsShow=true;\\r\\n        else if (obj.ShowRightText===false) frame.IsShow=false;\\r\\n        if (obj.IsShareY===true) frame.IsShareY=true;\\r\\n\\r\\n        frame.YSplitOperator=new FrameSplitY();\\r\\n        frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n        frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        frame.YSplitOperator.Frame=frame;\\r\\n        frame.YSplitOperator.ChartBorder=frame.ChartBorder;\\r\\n        frame.YSplitOperator.SplitCount=subFrame.Frame.YSplitOperator.SplitCount;\\r\\n\\r\\n        overlayFrame.Frame=frame;\\r\\n\\r\\n        if (apiItem)\\r\\n        {\\r\\n            var apiIndex=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,obj, true);\\r\\n            apiIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n            overlayFrame.Script=apiIndex;\\r\\n        }\\r\\n        else if (indexInfo)\\r\\n        {\\r\\n            let indexData = indexInfo;\\r\\n            if (obj.Args) indexData.Args=obj.Args;  //外部可以设置参数\\r\\n\\r\\n            var scriptIndex=new OverlayScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n            scriptIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n            overlayFrame.Script=scriptIndex;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var scriptIndex=indexCustom.Create();\\r\\n            scriptIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n            scriptIndex.Create(this,windowIndex);\\r\\n            overlayFrame.Script=scriptIndex;\\r\\n        }\\r\\n\\r\\n        subFrame.OverlayIndex.push(overlayFrame);\\r\\n        return overlayFrame;\\r\\n    }\\r\\n\\r\\n    this.DeleteOverlayWindowsIndex=function(identify) //删除叠加指标\\r\\n    {\\r\\n        if (!this.DeleteOverlayIndex(identify, null)) return;\\r\\n\\r\\n        this.Frame.ResetXYSplit(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ChangeKLineDrawType=function(drawType, isDraw)\\r\\n    {\\r\\n        if (this.KLineDrawType==drawType) return;\\r\\n\\r\\n        this.KLineDrawType=drawType;\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (i==0) item.DrawType=this.KLineDrawType;\\r\\n            else if (item.ClassName=='ChartVolStick') item.KLineDrawType=this.KLineDrawType\\r\\n        }\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)    //叠加K线样式修改\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.DrawType=this.KLineDrawType;\\r\\n        }\\r\\n\\r\\n        if (isDraw==false) return;\\r\\n\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //修改坐标类型\\r\\n    //{ Type:  0=普通坐标  1=百分比坐标 (右边坐标刻度) 2=对数对标 3=等比坐标, IsReverse:是否反转坐标 }\\r\\n    this.ChangeCoordinateType=function(obj)\\r\\n    {\\r\\n        if (!this.Frame && !this.Frame.SubFrame) return;\\r\\n        if (!this.Frame.SubFrame.length) return;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(obj))  //老版本\\r\\n        {\\r\\n            var type=obj;\\r\\n            if (type==2) //反转坐标\\r\\n            {\\r\\n                this.Frame.SubFrame[0].Frame.CoordinateType=1;\\r\\n            }\\r\\n            else if(type==1)\\r\\n            {\\r\\n                this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=type;\\r\\n            }\\r\\n            else if (type==0)\\r\\n            {\\r\\n                this.Frame.SubFrame[0].Frame.CoordinateType=0;\\r\\n                this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=0;\\r\\n            }\\r\\n            else if (type==3)   //对数坐标\\r\\n            {\\r\\n                this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=2;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (obj.Type>=0 && obj.Type<=5) this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=obj.Type;\\r\\n            if (obj.IsReverse===true) this.Frame.SubFrame[0].Frame.CoordinateType=1;\\r\\n            else if (obj.IsReverse==false) this.Frame.SubFrame[0].Frame.CoordinateType=0;\\r\\n        }\\r\\n\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //设置指标窗口个数\\r\\n    this.ChangeIndexWindowCount=function(count,option)\\r\\n    {\\r\\n        if (count<=0) return;\\r\\n        if (this.Frame.SubFrame.length==count) return;\\r\\n\\r\\n        this.Frame.RestoreIndexWindows();\\r\\n\\r\\n        var currentLength=this.Frame.SubFrame.length;\\r\\n        if (currentLength>count)\\r\\n        {\\r\\n            for(var i=currentLength-1;i>=count;--i)\\r\\n            {\\r\\n                this.DeleteIndexPaint(i);\\r\\n                this.Frame.SubFrame[i].Frame.ClearToolbar();\\r\\n            }\\r\\n\\r\\n            this.Frame.SubFrame.splice(count,currentLength-count);\\r\\n            this.WindowIndex.splice(count,currentLength-count);\\r\\n\\r\\n            //最后一个显示X轴坐标\\r\\n            for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n            {\\r\\n                var item=this.Frame.SubFrame[i].Frame;\\r\\n                if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n                else item.XSplitOperator.ShowText=false;\\r\\n            }\\r\\n\\r\\n            this.Frame.SetSizeChage(true);\\r\\n            this.ResetFrameXYSplit();\\r\\n            this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n            this.Draw();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //创建新的指标窗口\\r\\n            var pixelRatio=GetDevicePixelRatio();\\r\\n            for(var i=currentLength;i<count;++i)\\r\\n            {\\r\\n                var subFrame=this.CreateSubFrameItem(i);\\r\\n                subFrame.Frame.ChartBorder.TitleHeight*=pixelRatio;\\r\\n                this.Frame.SubFrame[i]=subFrame;\\r\\n                var titlePaint=new DynamicChartTitlePainting();\\r\\n                titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n                titlePaint.Canvas=this.Canvas;\\r\\n                titlePaint.LanguageID=this.LanguageID;\\r\\n                titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n                this.TitlePaint[i+1]=titlePaint;\\r\\n            }\\r\\n\\r\\n            //最后一个显示X轴坐标\\r\\n            for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n            {\\r\\n                var item=this.Frame.SubFrame[i].Frame;\\r\\n                if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n                else item.XSplitOperator.ShowText=false;\\r\\n            }\\r\\n\\r\\n            this.Frame.SetSizeChage(true);\\r\\n            this.ResetFrameXYSplit();\\r\\n            this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n            this.Draw();\\r\\n\\r\\n            //创建指标\\r\\n            var indexName= [ {Index:\\\"RSI\\\"}, {Index:\\\"MACD\\\"}, {Index:\\\"VOL\\\"}, {Index:\\\"UOS\\\"}, {Index:\\\"CHO\\\"}, {Index:\\\"BRAR\\\"} ];  //增加的指标名字\\r\\n            if (option && option.Windows.length>0)\\r\\n                indexName=option.Windows;   //外部设置增加窗口的默认指标\\r\\n\\r\\n            let scriptData = new JSIndexScript();\\r\\n            for(var i=currentLength;i<count;++i)\\r\\n            {\\r\\n                var item=indexName[i%indexName.length];\\r\\n                var name=item.Index;\\r\\n                let indexInfo = scriptData.Get(name);\\r\\n                var args=indexInfo.Args;\\r\\n                if (item.Args) args=item.Args;\\r\\n                let indexData =\\r\\n                    {\\r\\n                        Name:indexInfo.Name, Script:indexInfo.Script, Args: args, ID:item.Index,\\r\\n                        //扩展属性 可以是空\\r\\n                        KLineType:indexInfo.KLineType,  YSpecificMaxMin:indexInfo.YSpecificMaxMin,  YSplitScale:indexInfo.YSplitScale,\\r\\n                        FloatPrecision:indexInfo.FloatPrecision, Condition:indexInfo.Condition,\\r\\n                        OutName:indexInfo.OutName\\r\\n                    };\\r\\n\\r\\n                this.WindowIndex[i]=new ScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n\\r\\n                var subFrame=this.Frame.SubFrame[i];\\r\\n                if (item.Modify!=null) this.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;\\r\\n                if (item.Change!=null) this.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;\\r\\n                if (item.Close!=null) this.Frame.SubFrame[i].Frame.CloseIndex=item.Close;\\r\\n                if (item.Overlay!=null) chart.Frame.SubFrame[i].Frame.OverlayIndex=item.Overlay;\\r\\n                if (item.IsDrawTitleBG==true)  this.Frame.SubFrame[i].Frame.IsDrawTitleBG=item.IsDrawTitleBG;\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(item.TitleHeight)) this.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n                else item.TitleHeight=this.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight;\\r\\n                if (item.IsShowTitleArraw==false) this.Frame.SubFrame[i].Frame.IsShowTitleArraw=false;\\r\\n                if (item.IsShowIndexName==false) this.Frame.SubFrame[i].Frame.IsShowIndexName=false;\\r\\n                if (item.IsShowOverlayIndexName==false) this.Frame.SubFrame[i].Frame.IsShowOverlayIndexName=false;\\r\\n                if (item.IndexParamSpace>=0) this.Frame.SubFrame[i].Frame.IndexParamSpace=item.IndexParamSpace;\\r\\n                if (item.IsShowXLine==false) this.Frame.SubFrame[i].Frame.IsShowXLine=false;\\r\\n                if (item.IsShowYLine==false) this.Frame.SubFrame[i].Frame.IsShowYLine=false;\\r\\n                if (IFrameSplitOperator.IsBool(item.IsShowIndexTitle)) this.Frame.SubFrame[i].Frame.IsShowIndexTitle=item.IsShowIndexTitle;\\r\\n\\r\\n                if (IFrameSplitOperator.IsBool(item.IsShowLeftText))\\r\\n                {\\r\\n                    subFrame.Frame.IsShowYText[0]=item.IsShowLeftText;\\r\\n                    subFrame.Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;            //显示左边刻度\\r\\n                }\\r\\n                if (IFrameSplitOperator.IsBool(item.IsShowRightText))\\r\\n                {\\r\\n                    subFrame.Frame.IsShowYText[1]=item.IsShowRightText;\\r\\n                    subFrame.Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;         //显示右边刻度\\r\\n                }\\r\\n\\r\\n                if (item.OverlayIndexType)\\r\\n                {\\r\\n                    if (IFrameSplitOperator.IsNumber(item.OverlayIndexType.Position)) subFrame.Frame.OverlayIndexType.Position=item.OverlayIndexType.Position;\\r\\n                    if (IFrameSplitOperator.IsNumber(item.OverlayIndexType.LineSpace)) subFrame.Frame.OverlayIndexType.LineSpace=item.OverlayIndexType.LineSpace;\\r\\n                }\\r\\n\\r\\n                var bindData=this.ChartPaint[0].Data;\\r\\n                this.BindIndexData(i,bindData);   //执行脚本\\r\\n            }\\r\\n\\r\\n            //this.UpdataDataoffset();           //更新数据偏移\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ChangeIndexTemplate=function(option)   //切换指标模板 可以设置指标窗口个数 每个窗口的指标\\r\\n    {\\r\\n        if (!option.Windows) return;\\r\\n        var count=option.Windows.length;\\r\\n        if (count<=0) return;\\r\\n        var currentLength=this.Frame.SubFrame.length;\\r\\n\\r\\n        var period=null, right=null;\\r\\n        if (option.KLine)\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(option.KLine.Period) && option.KLine.Period!=this.Period) period=option.KLine.Period;  //周期\\r\\n            if (IFrameSplitOperator.IsNumber(option.KLine.Right) && option.KLine.Right!=this.Right) right=option.KLine.Right;       //复权\\r\\n        }\\r\\n\\r\\n        var bRefreshData= (period!=null || right!=null);\\r\\n\\r\\n        //清空所有的指标图型\\r\\n        for(var i=0;i<currentLength;++i)\\r\\n        {\\r\\n            this.DeleteIndexPaint(i);\\r\\n            var frame=this.Frame.SubFrame[i];\\r\\n            frame.YSpecificMaxMin=null;\\r\\n            frame.IsLocked=false;\\r\\n            frame.YSplitScale = null;\\r\\n        }\\r\\n\\r\\n        if (currentLength>count)\\r\\n        {\\r\\n            for(var i=currentLength-1;i>=count;--i)\\r\\n            {\\r\\n                this.Frame.SubFrame[i].Frame.ClearToolbar();\\r\\n            }\\r\\n\\r\\n            this.Frame.SubFrame.splice(count,currentLength-count);\\r\\n            this.WindowIndex.splice(count,currentLength-count);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=currentLength;i<count;++i)  //创建新的指标窗口\\r\\n            {\\r\\n                var subFrame=this.CreateSubFrameItem(i);\\r\\n                this.Frame.SubFrame[i]=subFrame;\\r\\n                var titlePaint=new DynamicChartTitlePainting();\\r\\n                titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n                titlePaint.Canvas=this.Canvas;\\r\\n                titlePaint.LanguageID=this.LanguageID;\\r\\n                titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n                this.TitlePaint[i+1]=titlePaint;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var systemScript = new JSIndexScript();\\r\\n        var bindData=this.ChartPaint[0].Data;\\r\\n        for(var i=0;i<count;++i)\\r\\n        {\\r\\n            var windowIndex=i;\\r\\n            var item=option.Windows[i];\\r\\n            var frameItem=null;\\r\\n            if(option.Frame && option.Frame.length>i) frameItem=option.Frame[i];\\r\\n            var titleIndex=windowIndex+1;\\r\\n            this.TitlePaint[titleIndex].Data=[];\\r\\n            this.TitlePaint[titleIndex].Title=null;\\r\\n\\r\\n            if (item.Script)    //自定义X轴绘制事件\\r\\n            {\\r\\n                this.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n                if (!bRefreshData) this.BindIndexData(windowIndex,bindData);   //执行脚本\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var indexID=item.Index;\\r\\n                var indexItem=JSIndexMap.Get(indexID);\\r\\n                if (indexItem)\\r\\n                {\\r\\n                    this.WindowIndex[i]=indexItem.Create();\\r\\n                    this.CreateWindowIndex(windowIndex);\\r\\n                    if (!bRefreshData) this.BindIndexData(windowIndex,bindData);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var indexInfo = systemScript.Get(indexID);\\r\\n                    if (indexInfo)\\r\\n                    {\\r\\n                        var args=indexInfo.Args;\\r\\n                        if (option.Windows[i].Args) args=option.Windows[i].Args;\\r\\n                        let indexData =\\r\\n                            {\\r\\n                                Name:indexInfo.Name, Script:indexInfo.Script, Args: args, ID:indexID ,\\r\\n                                //扩展属性 可以是空\\r\\n                                KLineType:indexInfo.KLineType,  YSpecificMaxMin:indexInfo.YSpecificMaxMin,  YSplitScale:indexInfo.YSplitScale,\\r\\n                                FloatPrecision:indexInfo.FloatPrecision, Condition:indexInfo.Condition,\\r\\n                                OutName:indexInfo.OutName\\r\\n                            };\\r\\n                        if (item.TitleFont) indexData.TitleFont=item.TitleFont;\\r\\n\\r\\n                        this.WindowIndex[i]=new ScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n                        if (!bRefreshData) this.BindIndexData(windowIndex,bindData);   //执行脚本\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (item.Modify!=null) this.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;\\r\\n            if (item.Change!=null) this.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;\\r\\n            if (item.Close!=null) this.Frame.SubFrame[i].Frame.CloseIndex=item.Close;\\r\\n            if (item.Overlay!=null) chart.Frame.SubFrame[i].Frame.OverlayIndex=item.Overlay;\\r\\n            if (item.IsDrawTitleBG==true)  this.Frame.SubFrame[i].Frame.IsDrawTitleBG=item.IsDrawTitleBG;\\r\\n\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(item.TitleHeight)) this.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;\\r\\n            else item.TitleHeight=this.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight;\\r\\n            if (item.IsShowTitleArraw==false) this.Frame.SubFrame[i].Frame.IsShowTitleArraw=false;\\r\\n            if (item.IsShowIndexName==false) this.Frame.SubFrame[i].Frame.IsShowIndexName=false;\\r\\n            if (item.IndexParamSpace>=0) this.Frame.SubFrame[i].Frame.IndexParamSpace=item.IndexParamSpace;\\r\\n\\r\\n\\r\\n            if (frameItem)\\r\\n            {\\r\\n                if (frameItem.SplitCount) this.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=frameItem.SplitCount;\\r\\n                if (frameItem.IsShowXLine===false || frameItem.IsShowXLine===true) this.Frame.SubFrame[i].Frame.IsShowXLine=frameItem.IsShowXLine;\\r\\n                if (frameItem.IsShowYLine===false || frameItem.IsShowYLine===true) this.Frame.SubFrame[i].Frame.IsShowYLine=frameItem.IsShowYLine;\\r\\n\\r\\n                if (frameItem.IsShowLeftText===false || frameItem.IsShowLeftText===true)\\r\\n                {\\r\\n                    this.Frame.SubFrame[i].Frame.IsShowYText[0]=frameItem.IsShowLeftText;\\r\\n                    this.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=frameItem.IsShowLeftText;            //显示左边刻度\\r\\n                }\\r\\n                if (frameItem.IsShowRightText===false || frameItem.IsShowRightText===true)\\r\\n                {\\r\\n                    this.Frame.SubFrame[i].Frame.IsShowYText[1]=frameItem.IsShowRightText;\\r\\n                    this.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=frameItem.IsShowRightText;         //显示右边刻度\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        //最后一个显示X轴坐标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n            else item.XSplitOperator.ShowText=false;\\r\\n        }\\r\\n\\r\\n        if (!bRefreshData)\\r\\n        {\\r\\n            this.UpdataDataoffset();           //更新数据偏移\\r\\n            this.Frame.SetSizeChage(true);\\r\\n            this.ResetFrameXYSplit();\\r\\n            this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n            this.Draw();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Frame.SetSizeChage(true);\\r\\n            if (period!=null) this.ChangePeriod(period, option);\\r\\n            else if (right!=null) this.ChangeRight(right);\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.RemoveIndexWindow=function(id)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::RemoveIndexWindow] remove id', id);\\r\\n        if (id==0) return;\\r\\n        if (!this.Frame.SubFrame) return;\\r\\n        if (id>=this.Frame.SubFrame.length) return;\\r\\n\\r\\n        this.Frame.RestoreIndexWindows();\\r\\n\\r\\n        var delFrame=this.Frame.SubFrame[id].Frame;\\r\\n        this.DeleteIndexPaint(id);\\r\\n        this.Frame.SubFrame[id].Frame.ClearToolbar();\\r\\n        this.Frame.SubFrame.splice(id,1);\\r\\n        this.WindowIndex.splice(id,1);\\r\\n        this.TitlePaint.splice(id+1,1); //删除对应的动态标题\\r\\n\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n            else item.XSplitOperator.ShowText=false;\\r\\n\\r\\n            item.Identify=i;\\r\\n        }\\r\\n\\r\\n        if (this.ChartDrawPicture.length>0)\\r\\n        {\\r\\n            var aryDrawPicture=[];\\r\\n            for(var i in this.ChartDrawPicture)\\r\\n            {\\r\\n                var item=this.ChartDrawPicture[i];\\r\\n                if (item.Frame==delFrame) continue;\\r\\n                aryDrawPicture.push(item);\\r\\n            }\\r\\n            this.ChartDrawPicture=aryDrawPicture;\\r\\n        }\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.UpdateFrameMaxMin();\\r\\n        this.ResetFrameXYSplit();\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //获取当前的显示的指标\\r\\n    this.GetIndexInfo=function()\\r\\n    {\\r\\n        var aryIndex=[];\\r\\n        for(var i in this.WindowIndex)\\r\\n        {\\r\\n            var item=this.WindowIndex[i];\\r\\n            var info={Name:item.Name};\\r\\n            if (item.ID) info.ID=item.ID;\\r\\n            if (item.Arguments) //参数\\r\\n            {\\r\\n                info.Args=[];\\r\\n                for(var i in item.Arguments)\\r\\n                {\\r\\n                    var argItem=item.Arguments[i];\\r\\n                    info.Args.push( {Name:argItem.Name, Value:argItem.Value} );\\r\\n                }\\r\\n            }\\r\\n\\r\\n            aryIndex.push(info);\\r\\n        }\\r\\n\\r\\n        return aryIndex;\\r\\n    }\\r\\n\\r\\n    this.CreateExtendChart=function(name, option)   //创建扩展图形\\r\\n    {\\r\\n        var chart;\\r\\n        switch(name)\\r\\n        {\\r\\n            case '筹码分布':\\r\\n                chart=new StockChip();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.Left=this.Frame.ChartBorder.Right;    //左边间距使用当前框架间距\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                this.Frame.ChartBorder.Right+=chart.Width;  //创建筹码需要增加右边的间距\\r\\n                return chart;\\r\\n            case '画图工具':\\r\\n                chart=new DrawToolsButton();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.Left=this.Frame.ChartBorder.Right;    //左边间距使用当前框架间距\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                this.Frame.ChartBorder.Right+=chart.Width;  //创建筹码需要增加右边的间距\\r\\n                return chart;\\r\\n            case 'KLineTooltip':\\r\\n                if (option.Create && typeof(option.Create)=='function') chart=option.Create();\\r\\n                else chart=new KLineTooltipPaint();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                option.LanguageID=this.LanguageID;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n            case \\\"深度图\\\":\\r\\n                chart=new DepthMapPaint();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n            case '背景图':\\r\\n                chart=new BackgroundPaint();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n            case \\\"FrameSplitPaint\\\": //框架分割\\r\\n                chart=new FrameSplitPaint();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n\\r\\n            default:\\r\\n                chart=g_ExtendChartPaintFactory.Create(name);\\r\\n                if (!chart) return null;\\r\\n\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchFinished=function()\\r\\n    {\\r\\n        if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n        {\\r\\n            if (this.TouchStatus.CorssCursorShow==true && this.TouchDrawCount>0) return;\\r\\n\\r\\n            this.TouchStatus.CorssCursorShow=false;\\r\\n            this.DrawDynamicInfo();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.CorssCursorTouchEnd===true)    //手势离开十字光标消失\\r\\n        {\\r\\n            if (this.TouchDrawCount>0) this.DrawDynamicInfo();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName==='KLineTooltipPaint')\\r\\n            {\\r\\n                this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //锁|解锁指标 { Index:指标名字,IsLocked:是否要锁上,Callback:回调 }\\r\\n    this.LockIndex=function(lockData)\\r\\n    {\\r\\n        if (!lockData) return;\\r\\n        if (!lockData.IndexName) return;\\r\\n\\r\\n        for(let i in this.WindowIndex)\\r\\n        {\\r\\n            let item=this.WindowIndex[i];\\r\\n            if (!item) conintue;\\r\\n            if (item.Name==lockData.IndexName)\\r\\n            {\\r\\n                item.SetLock(lockData);\\r\\n                this.Update();\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.TryClickLock=function(x,y)\\r\\n    {\\r\\n        for(let i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            if (!item.Frame.IsLocked) continue;\\r\\n            if (!item.Frame.LockPaint) continue;\\r\\n\\r\\n            var tooltip=new TooltipData();\\r\\n            if (!item.Frame.LockPaint.GetTooltipData(x,y,tooltip)) continue;\\r\\n\\r\\n            tooltip.HQChart=this;\\r\\n            if (tooltip.Data.Callback) tooltip.Data.Callback(tooltip);\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.TryClickIndexTitle=function(x,y)\\r\\n    {\\r\\n        for(var i in this.TitlePaint)\\r\\n        {\\r\\n            var item=this.TitlePaint[i];\\r\\n            if (!item.IsClickTitle) continue;\\r\\n            if (!item.IsClickTitle(x,y)) continue;\\r\\n\\r\\n            var data={ Point:{X:x, Y:y}, Title:item.Title, FrameID:item.Frame.Identify };\\r\\n            JSConsole.Chart.Log('[KLineChartContainer::TryClickIndexTitle] click title ', data);\\r\\n\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_INDEXTITLE);\\r\\n            if (event && event.Callback) event.Callback(event,data,this);\\r\\n\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.SetSizeChange=function(bChanged)\\r\\n    {\\r\\n        this.Frame.SetSizeChage(bChanged);\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            item.SizeChange=bChanged;\\r\\n        }\\r\\n    }\\r\\n    this.SetSizeChage=this.SetSizeChange;   //单词拼错了， 还没替换完\\r\\n\\r\\n    this.Update=function(option) //option: { UpdateCursorIndexType:更新十字光标方式 }\\r\\n    {\\r\\n        if (!this.SourceData) return;\\r\\n        if (this.BeforeBindMainData) this.BeforeBindMainData('Update');\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,true))    //复权(日线数据才复权)\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.BindMainData(bindData,this.PageSize);\\r\\n        if (this.AfterBindMainData) this.AfterBindMainData(\\\"Update\\\");\\r\\n\\r\\n        var firstSubFrame;\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            if (i==0) firstSubFrame=this.Frame.SubFrame[i].Frame;\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        if (firstSubFrame && firstSubFrame.YSplitOperator)\\r\\n        {\\r\\n            firstSubFrame.YSplitOperator.Symbol=this.Symbol;\\r\\n            firstSubFrame.YSplitOperator.Data=this.ChartPaint[0].Data;          //K线数据\\r\\n            firstSubFrame.YSplitOperator.Period=this.Period;                    //周期\\r\\n        }\\r\\n\\r\\n        //叠加数据周期调整\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (!item.SourceData) continue;\\r\\n\\r\\n            if(ChartData.IsMinutePeriod(this.Period,true))  //分钟不支持 清空掉\\r\\n            {\\r\\n                var bindData=new ChartData();\\r\\n                bindData.Data=item.SourceData.Data;\\r\\n                bindData.Period=this.Period;\\r\\n                bindData.Right=this.Right;\\r\\n\\r\\n                var aryOverlayData=this.SourceData.GetOverlayMinuteData(bindData.Data, this.IsApiPeriod);      //和主图数据拟合以后的数据\\r\\n                bindData.Data=aryOverlayData;\\r\\n\\r\\n                if (ChartData.IsMinutePeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n                {\\r\\n                    var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                    bindData.Data=periodData;\\r\\n                }\\r\\n\\r\\n                item.Data=bindData;\\r\\n            }\\r\\n            else    //日线叠加\\r\\n            {\\r\\n                var bindData=new ChartData();\\r\\n                bindData.Data=item.SourceData.Data;\\r\\n                bindData.Period=this.Period;\\r\\n                bindData.Right=this.Right;\\r\\n\\r\\n                if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsSHSZStockA(item.Symbol))       //复权数据\\r\\n                {\\r\\n                    var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });\\r\\n                    bindData.Data=rightData;\\r\\n                }\\r\\n\\r\\n                var aryOverlayData=this.SourceData.GetOverlayData(bindData.Data, this.IsApiPeriod);      //和主图数据拟合以后的数据\\r\\n                bindData.Data=aryOverlayData;\\r\\n\\r\\n                if (ChartData.IsDayPeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n                {\\r\\n                    var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                    bindData.Data=periodData;\\r\\n                }\\r\\n\\r\\n                item.Data=bindData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ReqeustKLineInfoData( {FunctionName:\\\"Update\\\"} );\\r\\n\\r\\n        this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        if (option && option.UpdateCursorIndexType>0) this.UpdatePointByCursorIndex(option.UpdateCursorIndexType);\\r\\n        else this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        //叠加指标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            for(var j in item.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                this.BindOverlayIndexData(overlayItem,i,bindData)\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //切换股票代码\\r\\n    this.ChangeSymbol=function(symbol, option)\\r\\n    {\\r\\n        this.CancelAutoUpdate();    //先停止定时器\\r\\n        this.AutoUpdateEvent(false,'KLineChartContainer::ChangeSymbol');\\r\\n        this.ClearRectSelect(true);\\r\\n        this.ClearCustomKLine();\\r\\n        this.Symbol=symbol;\\r\\n        if (!symbol)\\r\\n        {\\r\\n            this.DrawEmpty();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.KLine)\\r\\n            {\\r\\n                var item=option.KLine;\\r\\n                if (IFrameSplitOperator.IsNumber(item.Right)) this.Right=item.Right;\\r\\n                if (IFrameSplitOperator.IsNumber(item.Period)) this.Period=item.Period;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZIndex(symbol)) this.Right=0;    //指数没有复权\\r\\n\\r\\n        //清空指标\\r\\n        if (this.Frame && this.Frame.SubFrame)\\r\\n        {\\r\\n            for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n            {\\r\\n                this.DeleteIndexPaint(i);\\r\\n                var item=this.Frame.SubFrame[i];\\r\\n                for(var j in item.OverlayIndex) //清空叠加指标\\r\\n                {\\r\\n                    var overlayItem=item.OverlayIndex[j];\\r\\n                    overlayItem.ChartPaint=[];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.Windows && Array.isArray(option.Windows) && option.Windows.length>0)\\r\\n            {\\r\\n                var windows=option.Windows;\\r\\n                var systemScript = new JSIndexScript();\\r\\n                for(var i in windows)\\r\\n                {\\r\\n                    if (i>=this.WindowIndex.length) break; //暂时不支持 动态增加/减少\\r\\n                    var item=windows[i];\\r\\n                    if (!item) continue;\\r\\n\\r\\n                    if (item.Script)\\r\\n                    {\\r\\n                        this.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);    //脚本执行\\r\\n                    }\\r\\n                    else if (item.API)\\r\\n                    {\\r\\n                        var apiItem=item.API;\\r\\n                        this.WindowIndex[i]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        var indexID=item.Index;\\r\\n                        var indexInfo = systemScript.Get(indexID);\\r\\n                        if (indexInfo)\\r\\n                        {\\r\\n                            var args=indexInfo.Args;\\r\\n                            if (item.Args) indexInfo.Args=item.Args;\\r\\n                            indexInfo.ID=indexID;\\r\\n                            this.WindowIndex[i]=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args,indexInfo);    //脚本执行\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ReloadChartDrawPicture();\\r\\n        this.Frame.ClearUpDonwFrameYData();\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))\\r\\n        {\\r\\n            this.RequestHistoryData();                  //请求日线数据\\r\\n            //this.ReqeustKLineInfoData();\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true) || ChartData.IsSecondPeriod(this.Period))\\r\\n        {\\r\\n            this.ReqeustHistoryMinuteData();            //请求分钟数据\\r\\n        }\\r\\n        else if (ChartData.IsTickPeriod(this.Period))\\r\\n        {\\r\\n            this.RequestTickData();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReqeustKLineInfoData=function(obj)\\r\\n    {\\r\\n        if (obj && obj.FunctionName==\\\"RecvDragDayData\\\") //增量更新\\r\\n        {\\r\\n            obj.Update=true;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.ChartPaint.length>0)\\r\\n            {\\r\\n                var klinePaint=this.ChartPaint[0];\\r\\n                klinePaint.InfoData=new Map();\\r\\n            }\\r\\n            obj.Update=false;\\r\\n        }\\r\\n\\r\\n        //信息地雷信息\\r\\n        for(var i in this.ChartInfo)\\r\\n        {\\r\\n            this.ChartInfo[i].RequestData(this,obj);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //设置K线信息地雷\\r\\n    this.SetKLineInfo=function(aryInfo,bUpdate)\\r\\n    {\\r\\n        this.ChartInfo=[];  //先清空\\r\\n        for(var i in aryInfo)\\r\\n        {\\r\\n            var infoItem=JSKLineInfoMap.Get(aryInfo[i]);\\r\\n            if (!infoItem) continue;\\r\\n            var item=infoItem.Create();\\r\\n            item.MaxReqeustDataCount=this.MaxReqeustDataCount;\\r\\n            this.ChartInfo.push(item);\\r\\n        }\\r\\n\\r\\n        if (bUpdate==true) this.ReqeustKLineInfoData({ FunctionName:\\\"SetKLineInfo\\\" });\\r\\n    }\\r\\n\\r\\n    //添加信息地雷\\r\\n    this.AddKLineInfo=function(infoName,bUpdate)\\r\\n    {\\r\\n        var classInfo=JSKLineInfoMap.GetClassInfo(infoName);\\r\\n        if (!classInfo)\\r\\n        {\\r\\n            console.warn(\\\"[KLineChartContainer::AddKLineInfo] can't find infoname=\\\", infoName);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        for(var i in this.ChartInfo)\\r\\n        {\\r\\n            var item=this.ChartInfo[i];\\r\\n            if (item.ClassName==classInfo.ClassName)    //已经存在\\r\\n                return;\\r\\n        }\\r\\n\\r\\n        var infoItem=JSKLineInfoMap.Get(infoName);\\r\\n        if (!infoItem) return;\\r\\n\\r\\n        var item=infoItem.Create();\\r\\n        item.MaxReqeustDataCount=this.MaxReqeustDataCount;\\r\\n        this.ChartInfo.push(item);\\r\\n\\r\\n        if (bUpdate==true)\\r\\n        {\\r\\n            item.RequestData(this);  //信息地雷信息\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //删除信息地理\\r\\n    this.DeleteKLineInfo=function(infoName)\\r\\n    {\\r\\n        var classInfo=JSKLineInfoMap.GetClassInfo(infoName);\\r\\n        if (!classInfo)\\r\\n        {\\r\\n            console.warn(\\\"[KLineChartContainer::DeleteKLineInfo] can't find infoname=\\\", infoName);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        for(var i in this.ChartInfo)\\r\\n        {\\r\\n            var item=this.ChartInfo[i];\\r\\n            if (item.ClassName==classInfo.ClassName)\\r\\n            {\\r\\n                this.ChartInfo.splice(i,1);\\r\\n                this.UpdataChartInfo();\\r\\n                this.Draw();\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //清空所有的信息地理\\r\\n    this.ClearKLineInfo=function()\\r\\n    {\\r\\n        if (!this.ChartInfo || this.ChartInfo.length<=0) return;\\r\\n\\r\\n        this.ChartInfo=[];\\r\\n\\r\\n        var klinePaint=this.ChartPaint[0];\\r\\n        klinePaint.InfoData=null;\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //增加叠加股票 只支持日线数据\\r\\n    this.OverlaySymbol=function(symbol,option)\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (item.Symbol===symbol)\\r\\n            {\\r\\n                console.warn(`[KLineChartContainer::OverlaySymbol] overlay symbol=${symbol} exist.`)\\r\\n                return false;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var paint=new ChartOverlayKLine();\\r\\n        paint.Canvas=this.Canvas;\\r\\n        paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        paint.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        paint.Name=\\\"Overlay-KLine\\\";\\r\\n        paint.DrawType=this.KLineDrawType;\\r\\n        paint.Symbol=symbol;\\r\\n        if (option && option.Color) paint.Color=option.Color;\\r\\n        else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];\\r\\n        paint.SetOption(option);\\r\\n        ++g_JSChartResource.OverlaySymbol.Random;\\r\\n        if (this.ChartPaint[0] && this.ChartPaint[0].Data && this.SourceData) paint.MainData=this.ChartPaint[0].Data;         //绑定主图数据\\r\\n\\r\\n        this.OverlayChartPaint.push(paint);\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period, true)) this.RequestOverlayHistoryData();                   //请求日线数据\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true)) this.RequestOverlayHistoryMinuteData();      //请求分钟历史数据\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RequestOverlayHistoryData=function()\\r\\n    {\\r\\n        if (!this.OverlayChartPaint.length) return;\\r\\n        if (!this.SourceData || !this.SourceData.Data) return;  //主图数据还没有到完\\r\\n\\r\\n        var self = this;\\r\\n        var dataCount=this.GetRequestDataCount();\\r\\n        var firstDate=this.SourceData.Data[0].Date;\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            let item=this.OverlayChartPaint[i];\\r\\n            if (!item.MainData) continue;   //等待主图股票数据未下载完\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_NONE_ID) continue;\\r\\n            let symbol=item.Symbol;\\r\\n            if (!symbol) continue;\\r\\n\\r\\n            item.Status=OVERLAY_STATUS_ID.STATUS_REQUESTDATA_ID;\\r\\n\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'KLineChartContainer::RequestOverlayHistoryData', //类名::\\r\\n                        Explain:'叠加股票日K线数据',\\r\\n                        Request:{ Url:self.KLineApiUrl, Data: { symbol: symbol, count: dataCount.MaxRequestDataCount,\\\"first\\\":{ date: firstDate },\\r\\n                                field:[\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",'vol','amount'] }, Type:'POST' },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOverlayHistoryData(data,item);\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            //请求数据\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: this.KLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\"],\\r\\n                        \\\"symbol\\\": symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": dataCount.MaxRequestDataCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOverlayHistoryData(data,item);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvOverlayHistoryData=function(data,paint)\\r\\n    {\\r\\n        if (paint.IsDelete) return;\\r\\n\\r\\n        var aryDayData=KLineChartContainer.JsonDataToHistoryData(data);\\r\\n\\r\\n        //原始叠加数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryDayData;\\r\\n        sourceData.DataType=0;\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryDayData;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=0;\\r\\n\\r\\n        if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsSHSZStockA(data.symbol) && !this.IsApiPeriod)    //复权数据 ,A股才有有复权\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        var aryOverlayData=this.SourceData.GetOverlayData(bindData.Data, this.IsApiPeriod);      //和主图数据拟合以后的数据\\r\\n        bindData.Data=aryOverlayData;\\r\\n\\r\\n        if (ChartData.IsDayPeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        paint.Data=bindData;\\r\\n        paint.SourceData=sourceData;\\r\\n        paint.Title=data.name;\\r\\n        paint.Symbol=data.symbol;\\r\\n        paint.Status=OVERLAY_STATUS_ID.STATUS_FINISHED_ID;\\r\\n\\r\\n        this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=1; //调整为百份比坐标\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n    }\\r\\n\\r\\n    this.RequestOverlayHistoryMinuteData=function()\\r\\n    {\\r\\n        if (!this.OverlayChartPaint.length) return;\\r\\n        if (!this.SourceData || !this.SourceData.Data) return;  //主图数据还没有到完\\r\\n\\r\\n        var self = this;\\r\\n        var dataCount=this.GetRequestDataCount();\\r\\n        var firstDate=this.SourceData.Data[0].Date;\\r\\n        var firstTime=this.SourceData.Data[0].Time;\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            let item=this.OverlayChartPaint[i];\\r\\n            if (!item.MainData) continue;   //等待主图股票数据未下载完\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_NONE_ID) continue;\\r\\n            let symbol=item.Symbol;\\r\\n            if (!symbol) continue;\\r\\n\\r\\n            item.Status=OVERLAY_STATUS_ID.STATUS_REQUESTDATA_ID;\\r\\n\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'KLineChartContainer::RequestOverlayHistoryMinuteData', //类名::\\r\\n                        Explain:'叠加股票分钟K线数据',\\r\\n                        Request:{ Url:self.MinuteKLineApiUrl, Data: { symbol: symbol, count: dataCount.MaxRequestMinuteDayCount,\\\"first\\\":{ date: firstDate, time:firstTime },\\r\\n                                field:[\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",'vol','amount'] }, Type:'POST' },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOveralyHistoryMinuteData(data,item);\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            //请求数据\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: this.MinuteKLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",'vol','amount'],\\r\\n                        \\\"symbol\\\": symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": dataCount.MaxRequestMinuteDayCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOveralyHistoryMinuteData(data,item);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvOveralyHistoryMinuteData=function(data,paint)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToMinuteHistoryData(data);\\r\\n        if (!aryDayData) return;\\r\\n\\r\\n        //原始叠加数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryDayData;\\r\\n        sourceData.DataType=1;  //0=日线数据 1=分钟数据\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryDayData;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=1;\\r\\n\\r\\n        var aryOverlayData=this.SourceData.GetOverlayMinuteData(bindData.Data, this.IsApiPeriod);      //和主图数据拟合以后的数据\\r\\n        bindData.Data=aryOverlayData;\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(bindData.Period,false) && !this.IsApiPeriod)   //周期数据, API周期数据不用计算\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        paint.Data=bindData;\\r\\n        paint.SourceData=sourceData;\\r\\n        paint.Title=data.name;\\r\\n        paint.Symbol=data.symbol;\\r\\n        paint.Status=OVERLAY_STATUS_ID.STATUS_FINISHED_ID;  //数据下载完成\\r\\n\\r\\n        this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=1; //调整为百份比坐标\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ResetOverlaySymbolStatus=function()\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.Status=OVERLAY_STATUS_ID.STATUS_NONE_ID;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //取消叠加股票\\r\\n    this.ClearOverlaySymbol=function()\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.IsDelete=true;\\r\\n        }\\r\\n\\r\\n        this.OverlayChartPaint=[];\\r\\n        this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint;    //绑定叠加\\r\\n        this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=0; //调整一般坐标\\r\\n        this.UpdateFrameMaxMin();\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //删除一个叠加股票\\r\\n    this.DeleteOverlaySymbol=function(symbol)\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (item.Symbol===symbol)\\r\\n            {\\r\\n                item.IsDelete=true;\\r\\n                this.OverlayChartPaint.splice(i,1);\\r\\n                if (this.OverlayChartPaint.length<=0) this.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType=0; //调整一般坐标\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        console.warn(`[KLineChartContainer::DeleteOverlaySymbol] overlay symbol=${symbol} not exist.`)\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.RequestFlowCapitalData=function()\\r\\n    {\\r\\n        if (!this.Symbol) return;\\r\\n        if (this.FlowCapitalReady==true) return;\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n\\r\\n        var bNeedDonloadData=true;\\r\\n        if (MARKET_SUFFIX_NAME.IsBIT(upperSymbol) || MARKET_SUFFIX_NAME.IsFutures(upperSymbol)) //数字货币, 期货 不需要下载流通股本\\r\\n            bNeedDonloadData=false;\\r\\n\\r\\n        if (this.EnableFlowCapital) //强制下载流通股\\r\\n        {\\r\\n            if (MARKET_SUFFIX_NAME.IsBIT(upperSymbol))\\r\\n            {\\r\\n                if (this.EnableFlowCapital.BIT==true) bNeedDonloadData=true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!bNeedDonloadData)\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer::RequestFlowCapitalData] symbol=${this.Symbol} not need download data.`);\\r\\n            this.FlowCapitalReady=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var self = this;\\r\\n        let fieldList=[\\\"name\\\",\\\"date\\\",\\\"symbol\\\",\\\"capital.a\\\"];\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestFlowCapitalData', //类名::\\r\\n                    Explain:'流通股本数据',\\r\\n                    Request:{ Url:self.StockHistoryDayApiUrl, Data: { symbol: [this.Symbol], orderfield:'date',field:fieldList }, Type:'POST' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvFlowCapitalData(data);\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.StockHistoryDayApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"orderfield\\\":\\\"date\\\"\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvFlowCapitalData(recvData);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvFlowCapitalData=function(data)\\r\\n    {\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n\\r\\n        let stock=data.stock[0];\\r\\n        var aryData=new Array();\\r\\n        for(let i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n            let indexData=new SingleData();\\r\\n            indexData.Date=item.date;\\r\\n            var financeData=item.capital;\\r\\n            if (!financeData) continue;\\r\\n            if (financeData.a>0)\\r\\n            {\\r\\n                indexData.Value=financeData.a;    //流通股本（股）\\r\\n                aryData.push(indexData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.IsApiPeriod)\\r\\n        {\\r\\n            var klineData=this.ChartPaint[0].Data;\\r\\n            var aryFixedData=null;\\r\\n            if (ChartData.IsMinutePeriod(this.Period,true)) //分钟数据\\r\\n            {\\r\\n                aryFixedData=klineData.GetMinuteFittingFinanceData(aryData);\\r\\n            }\\r\\n            else if (ChartData.IsDayPeriod(this.Period,true)) //日线数据\\r\\n            {\\r\\n                aryFixedData=klineData.GetFittingFinanceData(aryData);\\r\\n            }\\r\\n\\r\\n            if (aryFixedData && klineData.Data && aryFixedData.length==klineData.Data.length)\\r\\n            {\\r\\n                for(var i in klineData.Data)\\r\\n                {\\r\\n                    var item=klineData.Data[i];\\r\\n                    if (aryFixedData[i] && IFrameSplitOperator.IsNumber(aryFixedData[i].Value))\\r\\n                        item.FlowCapital=aryFixedData[i].Value;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (ChartData.IsMinutePeriod(this.Period,true)) //分钟数据\\r\\n            {\\r\\n                var aryFixedData=this.SourceData.GetMinuteFittingFinanceData(aryData);\\r\\n                for(let i in this.SourceData.Data)\\r\\n                {\\r\\n                    var item=this.SourceData.Data[i];\\r\\n                    if (aryFixedData[i] && IFrameSplitOperator.IsNumber(aryFixedData[i].Value))\\r\\n                        item.FlowCapital=aryFixedData[i].Value;\\r\\n                }\\r\\n\\r\\n                var bindData=this.ChartPaint[0].Data;\\r\\n                var newBindData=new ChartData();\\r\\n                newBindData.Data=this.SourceData.Data;\\r\\n\\r\\n                if (ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据\\r\\n                {\\r\\n                    var periodData=newBindData.GetPeriodData(bindData.Period);\\r\\n                    newBindData.Data=periodData;\\r\\n                }\\r\\n                bindData.Data=newBindData.Data;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var aryFixedData=this.SourceData.GetFittingFinanceData(aryData);\\r\\n                for(let i in this.SourceData.Data)\\r\\n                {\\r\\n                    var item=this.SourceData.Data[i];\\r\\n                    if (aryFixedData[i] && IFrameSplitOperator.IsNumber(aryFixedData[i].Value))\\r\\n                        item.FlowCapital=aryFixedData[i].Value;\\r\\n                }\\r\\n\\r\\n                var bindData=this.ChartPaint[0].Data;\\r\\n                var newBindData=new ChartData();\\r\\n                newBindData.Data=this.SourceData.Data;\\r\\n\\r\\n                if (bindData.Right>0)    //复权\\r\\n                {\\r\\n                    var rightData=newBindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n                    newBindData.Data=rightData;\\r\\n                }\\r\\n\\r\\n                if (ChartData.IsDayPeriod(bindData.Period,false)) //周期数据\\r\\n                {\\r\\n                    var periodData=newBindData.GetPeriodData(bindData.Period);\\r\\n                    newBindData.Data=periodData;\\r\\n                }\\r\\n\\r\\n                bindData.Data=newBindData.Data;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.FlowCapitalReady=true;\\r\\n        var bDraw=false;\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName=='StockChip')\\r\\n            {\\r\\n                bDraw=true;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bDraw) this.Draw();\\r\\n    }\\r\\n\\r\\n    //创建画图工具\\r\\n    this.CreateChartDrawPicture=function(name, option, callback)\\r\\n    {\\r\\n        var drawPicture=null;\\r\\n        var item=IChartDrawPicture.GetDrawPictureByName(name);\\r\\n        if (item)\\r\\n        {\\r\\n            drawPicture=item.Create();\\r\\n            if (drawPicture.ClassName=='ChartDrawPictureText') drawPicture.HQChart=this;\\r\\n        }\\r\\n\\r\\n        if (!drawPicture)    //iconfont图标\\r\\n        {\\r\\n            if (IChartDrawPicture.MapIonFont.has(name))\\r\\n            {\\r\\n                var iconItem=IChartDrawPicture.MapIonFont.get(name);\\r\\n                drawPicture=new ChartDrawPictureIconFont();\\r\\n                drawPicture.FontOption.Family=iconItem.Family\\r\\n                drawPicture.Text=iconItem.Text;\\r\\n                if (iconItem.Color) drawPicture.LineColor=iconItem.Color;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!drawPicture) return false;\\r\\n\\r\\n        drawPicture.Canvas=this.Canvas;\\r\\n        drawPicture.Status=0;\\r\\n        drawPicture.Symbol=this.Symbol;\\r\\n        drawPicture.Period=this.Period;\\r\\n        drawPicture.Right=this.Right;\\r\\n        drawPicture.Option=this.ChartDrawOption;\\r\\n        if (callback) drawPicture.FinishedCallback=callback;    //完成通知上层回调\\r\\n        if (option) drawPicture.SetOption(option);\\r\\n        var self=this;\\r\\n        drawPicture.Update=function()   //更新回调函数\\r\\n        {\\r\\n            self.DrawDynamicInfo();\\r\\n        };\\r\\n        this.CurrentChartDrawPicture=drawPicture;\\r\\n        //JSConsole.Chart.Log(\\\"[KLineChartContainer::CreateChartDrawPicture] \\\", name,this.CurrentChartDrawPicture);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.AddChartDrawPicture=function(obj)\\r\\n    {\\r\\n        if (!obj) return null;\\r\\n        if (obj.FrameID<0 || obj.FrameID>=this.Frame.SubFrame.length) return null;\\r\\n\\r\\n        var item=IChartDrawPicture.GetDrawPictureByClassName(obj.ClassName);\\r\\n        if (!item) return null;\\r\\n        var drawPicture=item.Create();\\r\\n\\r\\n        drawPicture.Canvas=this.Canvas;\\r\\n        drawPicture.Status=10;\\r\\n        drawPicture.Frame=this.Frame.SubFrame[obj.FrameID].Frame;  //绑定框架坐标\\r\\n        drawPicture.Symbol=this.Symbol;\\r\\n        drawPicture.Period=this.Period;\\r\\n        drawPicture.Right=this.Right;\\r\\n        if (obj.Value) drawPicture.Value=obj.Value;\\r\\n\\r\\n        if (drawPicture.ImportStorageData) drawPicture.ImportStorageData(obj);\\r\\n        drawPicture.SetOption(obj);\\r\\n\\r\\n        if (obj.EnableUpdateXValue) drawPicture.UpdateXValue();\\r\\n        drawPicture.ValueToPoint();\\r\\n\\r\\n        if (drawPicture.ClassName==='ChartDrawPictureText') drawPicture.IsInitialized=true;\\r\\n        this.ChartDrawPicture.push(drawPicture);\\r\\n\\r\\n        this.DrawDynamicInfo();\\r\\n\\r\\n        return drawPicture;\\r\\n    }\\r\\n\\r\\n    //xStep,yStep 移动的偏移量\\r\\n    this.MoveChartDrawPicture=function(x,y,isPhone)\\r\\n    {\\r\\n        var drawPicture=this.CurrentChartDrawPicture;\\r\\n        if (!drawPicture) return false;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速\\r\\n        if (isPhone) pixelTatio=1;\\r\\n        var xStep=x*pixelTatio;\\r\\n        var yStep=y*pixelTatio;\\r\\n        //JSConsole.Chart.Log(\\\"xStep=\\\"+xStep+\\\" yStep=\\\"+yStep);\\r\\n        drawPicture.Move(xStep,yStep);\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n\\r\\n    //数据长度变化 需要更新画图工具X轴索引\\r\\n    this.UpdateChartDrawXValue=function()\\r\\n    {\\r\\n        for(var i in this.ChartDrawPicture)\\r\\n        {\\r\\n            var item=this.ChartDrawPicture[i];\\r\\n            item.UpdateXValue();\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    //注册鼠标右键事件\\r\\n    this.OnRightMenu=function(x,y,e)\\r\\n    {\\r\\n        var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速\\r\\n        if (this.RightMenu)\\r\\n        {\\r\\n            var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);\\r\\n            e.data={ Chart:this, FrameID:frameId };\\r\\n            this.RightMenu.DoModal(e);\\r\\n        }\\r\\n\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);\\r\\n        if (event)\\r\\n        {\\r\\n            var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);\\r\\n            var data={ X:x, Y:y, Event:e, FrameID:frameId };\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //重新加载画图工具(切换股票|周期)\\r\\n    this.ReloadChartDrawPicture=function()\\r\\n    {\\r\\n        this.ChartDrawPicture=[];\\r\\n        this.ChartDrawStorageCache;\\r\\n        if (this.ChartDrawStorage)\\r\\n        {\\r\\n            this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( {Symbol:this.Symbol, Period:this.Period} );\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateChartDrawPictureByStorage=function() //把缓存(this.ChartDrawStorageCache) 画图工具创建出来\\r\\n    {\\r\\n        if (!this.ChartDrawStorageCache || this.ChartDrawStorageCache.length<=0) return;\\r\\n\\r\\n        for(var i in this.ChartDrawStorageCache)\\r\\n        {\\r\\n            var item=this.ChartDrawStorageCache[i];\\r\\n            if (item.FrameID<0 || !this.Frame.SubFrame || this.Frame.SubFrame.length<item.FrameID) continue;\\r\\n\\r\\n            var drawPicture=IChartDrawPicture.CreateChartDrawPicture(item);\\r\\n            if (!drawPicture) continue;\\r\\n\\r\\n            drawPicture.Canvas=this.Canvas;\\r\\n            drawPicture.Status=10;\\r\\n            drawPicture.Frame=this.Frame.SubFrame[item.FrameID].Frame;  //绑定框架坐标\\r\\n            if (drawPicture.ImportStorageData) drawPicture.ImportStorageData(item);\\r\\n            drawPicture.UpdateXValue();\\r\\n            drawPicture.ValueToPoint();\\r\\n\\r\\n            if (drawPicture.ClassName==='ChartDrawPictureText') drawPicture.IsInitialized=true;\\r\\n\\r\\n            this.ChartDrawPicture.push(drawPicture);\\r\\n        }\\r\\n\\r\\n        this.ChartDrawStorageCache=null;    //清空缓存\\r\\n    }\\r\\n\\r\\n    //形态匹配\\r\\n    // scope.Plate 板块范围 scope.Symbol 股票范围\\r\\n    // sample 样本数据\\r\\n    this.RequestKLineMatch=function(sample,param)\\r\\n    {\\r\\n        var self =this;\\r\\n        var scope=param.Scope;\\r\\n        var waitDailog=param.WaitDialog;\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::RequestKLineMatch',sample,scope)\\r\\n\\r\\n        var aryDate=new Array();\\r\\n        var aryValue=new Array();\\r\\n\\r\\n        for(var i=sample.Start;i<sample.End && i<sample.Data.Data.length;++i)\\r\\n        {\\r\\n            var item=sample.Data.Data[i];\\r\\n            aryDate.push(item.Date);\\r\\n            aryValue.push(item.Close);\\r\\n        }\\r\\n\\r\\n        var sampleData=\\r\\n            {\\r\\n                Stock:sample.Stock,\\r\\n                Index:{Start:sample.Start, End:sample.End}, //数据索引\\r\\n                Date:{Start:aryDate[0], End:aryDate[aryDate.length-1]}, //起始 结束日期\\r\\n                Minsimilar:scope.Minsimilar,    //相似度\\r\\n                Plate:scope.Plate,\\r\\n                DayRegion:300\\r\\n            };\\r\\n\\r\\n        //请求数据\\r\\n        $.ajax({\\r\\n            url: this.KLineMatchUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"userid\\\": \\\"guest\\\",\\r\\n                    \\\"plate\\\": scope.Plate,\\r\\n                    \\\"period\\\": this.Period,\\r\\n                    \\\"right\\\": this.Right,\\r\\n                    \\\"dayregion\\\": sampleData.DayRegion,\\r\\n                    \\\"minsimilar\\\": scope.Minsimilar,\\r\\n                    \\\"sampledate\\\":aryDate,\\r\\n                    \\\"samplevalue\\\":aryValue\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                if (waitDailog) waitDailog.Close();\\r\\n                self.RecvKLineMatchData(data,sampleData);\\r\\n            },\\r\\n            error:function(jqXHR, textStatus, errorThrown)\\r\\n            {\\r\\n                console.warn('[KLineChartContainer::RequestKLineMatch] failed',jqXHR,textStatus, errorThrown);\\r\\n                if (waitDailog) waitDailog.Close();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    //接收形态选股结果\\r\\n    this.RecvKLineMatchData=function(data,sample)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::RecvKLineMatchData] recv',data,sample);\\r\\n        var filterData=[]; //结果数据\\r\\n        for(var i in data.match)\\r\\n        {\\r\\n            var item=data.match[i];\\r\\n            if (item.symbol==sample.Stock.Symbol) continue;\\r\\n\\r\\n            for(var j in item.data)\\r\\n            {\\r\\n                var dataItem=item.data[j];\\r\\n                var newItem={Symbol:item.symbol, Name:item.name,Similar:dataItem.similar, Start:dataItem.start, End:dataItem.end};\\r\\n                filterData.push(newItem);\\r\\n            }\\r\\n        }\\r\\n        filterData.sort(function(a,b){return b.Similar-a.Similar;});    //排序\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::RecvKLineMatchData] filterData',filterData);\\r\\n\\r\\n        if (this.mapEvent.has(JSCHART_EVENT_ID.RECV_KLINE_MATCH))\\r\\n        {\\r\\n            var item=this.mapEvent.get(JSCHART_EVENT_ID.RECV_KLINE_MATCH);\\r\\n            var data={Sample:sample, Match:filterData, Source:data}\\r\\n            item.Callback(item,data,this);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var dlg=new KLineMatchDialog(this.Frame.ChartBorder.UIElement.parentNode);\\r\\n\\r\\n            var event={ data:{ Chart:this, MatchData:filterData, Sample:sample, Source:data} };\\r\\n            dlg.DoModal(event);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //更新信息地雷\\r\\n    this.UpdataChartInfo=function()\\r\\n    {\\r\\n        //TODO: 根据K线数据日期来做map, 不在K线上的合并到下一个k线日期里面\\r\\n        var mapInfoData=null;\\r\\n        if (this.Period==0) //日线数据 根据日期\\r\\n        {\\r\\n            mapInfoData=new Map();\\r\\n            for(var i in this.ChartInfo)\\r\\n            {\\r\\n                var infoData=this.ChartInfo[i].Data;\\r\\n                for(var j in infoData)\\r\\n                {\\r\\n                    var item=infoData[j];\\r\\n                    if (mapInfoData.has(item.Date.toString()))\\r\\n                    {\\r\\n                        mapInfoData.get(item.Date.toString()).Data.push(item);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        mapInfoData.set(item.Date.toString(),{Data:new Array(item)});\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (ChartData.IsDayPeriod(this.Period,false))\\r\\n        {\\r\\n            mapInfoData=new Map();\\r\\n            var hisData=this.ChartPaint[0].Data;\\r\\n            if (hisData && hisData.Data && hisData.Data.length>0)\\r\\n            {\\r\\n                var fristKItem=hisData.Data[0];\\r\\n                var aryInfo=[];\\r\\n                for(var i in this.ChartInfo)\\r\\n                {\\r\\n                    var infoItem=this.ChartInfo[i];\\r\\n                    for(var j in infoItem.Data)\\r\\n                    {\\r\\n                        var item=infoItem.Data[j];\\r\\n                        if (item.Date>=fristKItem.Date) //在K线范围内的才显示\\r\\n                            aryInfo.push(item);\\r\\n                    }\\r\\n                }\\r\\n                aryInfo.sort(function(a,b) { return a.Date-b.Date });   //排序\\r\\n\\r\\n                for(var i=0;i<hisData.Data.length;)\\r\\n                {\\r\\n                    var kItem=hisData.Data[i];  //K线数据\\r\\n\\r\\n                    if (aryInfo.length<=0)\\r\\n                        break;\\r\\n\\r\\n                    var infoItem=aryInfo[0];\\r\\n                    if (kItem.Date<infoItem.Date)\\r\\n                    {\\r\\n                        ++i;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    if (mapInfoData.has(kItem.Date.toString())) //信息地雷日期<K线上的日期 就是属于这个K线上的\\r\\n                    {\\r\\n                        mapInfoData.get(kItem.Date.toString()).Data.push(infoItem);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        mapInfoData.set(kItem.Date.toString(),{Data:new Array(infoItem)});\\r\\n                    }\\r\\n\\r\\n                    aryInfo.shift();\\r\\n                    //JSConsole.Chart.Log('[KLineChartContainer::UpdataChartInfo]',item);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var klinePaint=this.ChartPaint[0];\\r\\n        klinePaint.InfoData=mapInfoData;\\r\\n    }\\r\\n\\r\\n    //更新窗口指标\\r\\n    this.UpdateWindowIndex=function(index)\\r\\n    {\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n\\r\\n        if (this.IsApiPeriod)\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (bindData.Right>0)    //复权\\r\\n            {\\r\\n                var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n                bindData.Data=rightData;\\r\\n            }\\r\\n\\r\\n            if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (typeof(this.WindowIndex[index].ExecuteScript)=='function')\\r\\n        {\\r\\n            var hisData=this.ChartPaint[0].Data;\\r\\n            this.WindowIndex[index].ExecuteScript(this,index,hisData);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.WindowIndex[index].BindData(this,index,bindData);\\r\\n        }\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.GetOverlayIndexByIdentify=function(identify)\\r\\n    {\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            if (!IFrameSplitOperator.IsNonEmptyArray(item.OverlayIndex)) continue;\\r\\n\\r\\n            for(var j=0; j<item.OverlayIndex.length; ++j)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                if (overlayItem.Identify===identify)\\r\\n                    return { OverlayItem:overlayItem, WindowIndex:i };\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    //更新叠加指标\\r\\n    this.UpdateOverlayIndex=function(identify)\\r\\n    {\\r\\n        var overlayIndex=this.GetOverlayIndexByIdentify(identify)\\r\\n\\r\\n        if (overlayIndex==null)\\r\\n        {\\r\\n            console.warn(`[KLineChartContainer::UpdateOverlayIndex] can't find overlay index. [identify=${identify}]`);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!this.ChartPaint[0]) return;\\r\\n        var kData=this.ChartPaint[0].Data;\\r\\n        if (!kData) return;\\r\\n\\r\\n        this.BindOverlayIndexData(overlayIndex.OverlayItem, overlayIndex.WindowIndex, kData);\\r\\n    }\\r\\n\\r\\n    //修改参数指标\\r\\n    this.ChangeWindowIndexParam=function(index)\\r\\n    {\\r\\n        this.WindowIndex[index].Index[0].Param+=1;\\r\\n        this.WindowIndex[index].Index[1].Param+=1;\\r\\n\\r\\n        this.UpdateWindowIndex(index);\\r\\n    }\\r\\n\\r\\n\\r\\n    this.OnDoubleClick=function(x,y,e)\\r\\n    {\\r\\n        if (this.EnableYDrag && (this.EnableYDrag.Left || this.EnableYDrag.Right) && this.Frame && this.Frame.PtInFrameY)\\r\\n        {\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;\\r\\n            var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;\\r\\n            var dragY=this.Frame.PtInFrameY(x,y);\\r\\n            if (dragY && dragY.Index>=0)\\r\\n            {\\r\\n                this.CancelZoomUpDownFrameY(dragY);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.EnableZoomIndexWindow)\\r\\n        {\\r\\n            var frameId=this.Frame.PtInFrame(x,y);\\r\\n            JSConsole.Chart.Log(\\\"[KLineChartContainer::OnDoubleClick] frameId\\\",frameId);\\r\\n            if (frameId>=this.Frame.ZoomStartWindowIndex)\\r\\n            {\\r\\n                if (this.ZoomIndexWindow(frameId, {X:x, Y:y}))\\r\\n                {\\r\\n                    this.Frame.SetSizeChage(true);\\r\\n                    this.Draw();\\r\\n                    return true;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var event=null;\\r\\n        if (this.mapEvent.has(JSCHART_EVENT_ID.DBCLICK_KLINE)) event=this.mapEvent.get(JSCHART_EVENT_ID.DBCLICK_KLINE);\\r\\n\\r\\n        if (!this.MinuteDialog && !event) return;\\r\\n\\r\\n        var tooltip=new TooltipData();\\r\\n        if (!this.PtInChartPaintTooltip(x,y,tooltip)) return;\\r\\n        if (!tooltip.Data) return;\\r\\n\\r\\n        if (event)\\r\\n        {\\r\\n            if (this.ClickChartTimer!=null) //清空单击定时器\\r\\n            {\\r\\n                clearTimeout(this.ClickChartTimer);\\r\\n                this.ClickChartTimer=null;\\r\\n            }\\r\\n\\r\\n            var data={ Tooltip:tooltip, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n\\r\\n        if (this.MinuteDialog)\\r\\n        {\\r\\n            e.data={Chart:this,Tooltip:tooltip};\\r\\n            this.MinuteDialog.DoModal(e);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CancelAutoUpdate=function()    //关闭停止更新\\r\\n    {\\r\\n        if (typeof (this.AutoUpdateTimer) == 'number')\\r\\n        {\\r\\n            clearTimeout(this.AutoUpdateTimer);\\r\\n            this.AutoUpdateTimer = undefined;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //数据自动更新\\r\\n    this.AutoUpdate=function(waitTime)  //waitTime 更新时间\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        if (!this.IsAutoUpdate) return;\\r\\n        if (!this.Symbol) return;\\r\\n\\r\\n        var self = this;\\r\\n        var marketStatus=MARKET_SUFFIX_NAME.GetMarketStatus(this.Symbol);\\r\\n        if (marketStatus==0 || marketStatus==3) return; //闭市,盘后\\r\\n\\r\\n        var frequency=this.AutoUpdateFrequency;\\r\\n        if (marketStatus==1) //盘前\\r\\n        {\\r\\n            this.AutoUpdateTimer=setTimeout(function()\\r\\n            {\\r\\n                self.AutoUpdate();\\r\\n            },frequency);\\r\\n        }\\r\\n        else if (marketStatus==2) //盘中\\r\\n        {\\r\\n            this.AutoUpdateTimer=setTimeout(function()\\r\\n            {\\r\\n                if (ChartData.IsDayPeriod(self.Period,true))\\r\\n                {\\r\\n                    self.RequestRealtimeData();               //更新最新行情\\r\\n                    //self.ReqeustKLineInfoData();\\r\\n                }\\r\\n                else if (ChartData.IsMinutePeriod(self.Period,true) || ChartData.IsSecondPeriod(self.Period))\\r\\n                {\\r\\n                    self.RequestMinuteRealtimeData();         //请求分钟数据\\r\\n                }\\r\\n                else if (ChartData.IsTickPeriod(self.Period))\\r\\n                {\\r\\n                    self.RequestTickRealtimeData();           //请求最新分笔\\r\\n                }\\r\\n            },frequency);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetMaxMinPageSize = function ()\\r\\n    {\\r\\n        let pageSize={};\\r\\n        let width = this.Frame.ChartBorder.GetWidth();\\r\\n        let barWidth = (ZOOM_SEED[ZOOM_SEED.length - 1][0] + ZOOM_SEED[ZOOM_SEED.length - 1][1]);\\r\\n        pageSize.Max=parseInt(width / barWidth) - 2;\\r\\n\\r\\n        barWidth= (ZOOM_SEED[0][0] + ZOOM_SEED[0][1]);\\r\\n        pageSize.Min=parseInt(width / barWidth) - 2;\\r\\n\\r\\n        JSConsole.Chart.Log(`[KLineChartContainer::GetMaxMinPageSize] Max=${pageSize.Max} Min=${pageSize.Min}`);\\r\\n\\r\\n        return pageSize;\\r\\n    }\\r\\n\\r\\n    //获取图形控件的状态\\r\\n    this.GetChartStatus=function()\\r\\n    {\\r\\n        var subFrame=this.Frame.SubFrame[0].Frame;\\r\\n        if (!subFrame) return null;\\r\\n        var hisData=subFrame.Data;\\r\\n        if (!hisData) return null;\\r\\n\\r\\n        var status={ KLine:{ }, Zoom:{} };\\r\\n        status.KLine.Count=hisData.Data.length;\\r\\n        status.KLine.Offset=hisData.DataOffset;\\r\\n        status.KLine.PageSize=subFrame.XPointCount;\\r\\n        status.Zoom.Index=subFrame.ZoomIndex;\\r\\n        status.Zoom.Max=ZOOM_SEED.length;\\r\\n        return status;\\r\\n    }\\r\\n\\r\\n    //数据拖拽下载\\r\\n    this.DragDownloadData=function()\\r\\n    {\\r\\n        var data=null;\\r\\n        if (!this.Frame.Data) data=this.Frame.Data;\\r\\n        else data=this.Frame.SubFrame[0].Frame.Data;\\r\\n        if (!data) return false;\\r\\n        if (data.DataOffset>0) return;\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(this.Period,true)) //下载分钟数据\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer.DragDownloadData] Minute:[Enable=${this.DragDownload.Minute.Enable}, IsEnd=${this.DragDownload.Minute.IsEnd}, Status=${this.DragDownload.Minute.Status}]`);\\r\\n            if (!this.DragDownload.Minute.Enable) return;\\r\\n            if (this.DragDownload.Minute.IsEnd) return; //全部下载完了\\r\\n            if (this.DragDownload.Minute.Status!=0) return;\\r\\n            this.RequestDragMinuteData();\\r\\n        }\\r\\n        else if (ChartData.IsDayPeriod(this.Period,true))\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[KLineChartContainer.DragDownloadData] Day:[Enable=${this.DragDownload.Minute.Enable}, IsEnd=${this.DragDownload.Minute.IsEnd}, Status=${this.DragDownload.Minute.Status}]`);\\r\\n            if (!this.DragDownload.Day.Enable) return;\\r\\n            if (this.DragDownload.Day.IsEnd) return; //全部下载完了\\r\\n            if (this.DragDownload.Day.Status!=0) return;\\r\\n            this.RequestDragDayData();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RequestDragMinuteData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.AutoUpdateEvent(false,'KLineChartContainer::RequestDragMinuteData');   //停止自动更新\\r\\n        this.CancelAutoUpdate();\\r\\n        var download=this.DragDownload.Minute;\\r\\n        download.Status=1;\\r\\n        var firstItem=this.SourceData.Data[0];   //最新的一条数据\\r\\n        var postData=\\r\\n            {\\r\\n                \\\"field\\\": [\\\"name\\\",\\\"symbol\\\", \\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                \\\"symbol\\\": self.Symbol,\\r\\n                \\\"enddate\\\": firstItem.Date,\\r\\n                \\\"endtime\\\" :firstItem.Time,\\r\\n                \\\"count\\\": self.MaxRequestMinuteDayCount,\\r\\n                \\\"first\\\":{ date: firstItem.Date, time:firstItem.Time }\\r\\n            };\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestDragMinuteData', //类名::函数\\r\\n                    Explain:'拖拽1分钟K线数据下载',\\r\\n                    Request:{ Url:this.DragMinuteKLineApiUrl,  Type:'POST' , Data: postData, Period:this.Period  },\\r\\n                    DragDownload:download,\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvDragMinuteData(data);\\r\\n                download.Status=0;\\r\\n                self.AutoUpdateEvent(true,'KLineChartContainer::RequestDragMinuteData');   //自动更新\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.DragMinuteKLineApiUrl,\\r\\n            data:postData,\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function(data)\\r\\n            {\\r\\n                self.RecvDragMinuteData(data);\\r\\n                download.Status=0;\\r\\n                self.AutoUpdateEvent(true,'KLineChartContainer::RequestDragMinuteData');   //自动更新\\r\\n                self.AutoUpdate();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvDragMinuteData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToMinuteHistoryData(data);\\r\\n        if (!aryDayData || aryDayData.length<=0)\\r\\n        {\\r\\n            this.DragDownload.Minute.IsEnd=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n\\r\\n        var firstData=this.SourceData.Data[0];\\r\\n        var endIndex=null;\\r\\n        for(var i=aryDayData.length-1;i>=0;--i)\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))\\r\\n            {\\r\\n                endIndex=i;\\r\\n                break;\\r\\n            }\\r\\n            else if (firstData.Date==item.Date && firstData.Time==item.Time)\\r\\n            {\\r\\n                firstData.YClose=item.YClose;\\r\\n                endIndex=i-1;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (endIndex==null && endIndex<0) return;\\r\\n\\r\\n        for(var i=0;i<aryDayData.length && i<=endIndex;++i)    //数据往前插\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            this.SourceData.Data.splice(i,0,item);\\r\\n        }\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        if (!this.IsApiPeriod)\\r\\n        {\\r\\n            if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.UpdateChartDrawXValue();      //更新画图工具X轴索引\\r\\n        this.Draw();\\r\\n\\r\\n        //叠加指标计算\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n    }\\r\\n\\r\\n    this.RequestDragDayData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.AutoUpdateEvent(false,'KLineChartContainer::RequestDragDayData');   //停止自动更新\\r\\n        this.CancelAutoUpdate();\\r\\n        var download=this.DragDownload.Day;\\r\\n        download.Status=1;\\r\\n        var firstItem=this.SourceData.Data[0];   //最新的一条数据\\r\\n        var postData=\\r\\n            {\\r\\n                \\\"field\\\": [\\\"name\\\",\\\"symbol\\\", \\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                \\\"symbol\\\": self.Symbol,\\r\\n                \\\"enddate\\\": firstItem.Date,\\r\\n                \\\"count\\\": self.MaxReqeustDataCount,\\r\\n                \\\"first\\\":{ date: firstItem.Date }\\r\\n            };\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'KLineChartContainer::RequestDragDayData', //类名::函数\\r\\n                    Explain:'拖拽日K数据下载',\\r\\n                    Request:{ Url:this.DragKLineApiUrl,  Type:'POST' , Data: postData, Period:this.Period, Right:this.Right },\\r\\n                    DragDownload:download,\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvDragDayData(data);\\r\\n                download.Status=0;\\r\\n                self.AutoUpdateEvent(true,'KLineChartContainer::RequestDragDayData');   //自动更新\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.DragKLineApiUrl,\\r\\n            data:postData,\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function(data)\\r\\n            {\\r\\n                self.RecvDragDayData(data);\\r\\n                download.Status=0;\\r\\n                self.AutoUpdateEvent(true,'KLineChartContainer::RequestDragDayData');   //自动更新\\r\\n                self.AutoUpdate();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvDragDayData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToHistoryData(data);\\r\\n        if (!aryDayData || aryDayData.length<=0)\\r\\n        {\\r\\n            this.DragDownload.Day.IsEnd=true;   //下完了\\r\\n            return;\\r\\n        }\\r\\n        var lastDataCount=this.GetHistoryDataCount();   //保存下上一次的数据个数\\r\\n\\r\\n        var firstData=this.SourceData.Data[0];\\r\\n        var endIndex=null;\\r\\n        for(var i=aryDayData.length-1;i>=0;--i)\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            if (firstData.Date>item.Date)\\r\\n            {\\r\\n                endIndex=i;\\r\\n                break;\\r\\n            }\\r\\n            else if (firstData.Date==item.Date)\\r\\n            {\\r\\n                firstData.YClose=item.YClose;\\r\\n                endIndex=i-1;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n        if (endIndex==null && endIndex<0) return;\\r\\n\\r\\n        for(var i=0; i<aryDayData.length && i<=endIndex;++i)    //数据往前插\\r\\n        {\\r\\n            var item=aryDayData[i];\\r\\n            this.SourceData.Data.splice(i,0,item);\\r\\n        }\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=this.SourceData.Data;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.DataType=this.SourceData.DataType;\\r\\n        bindData.Symbol=this.Symbol;\\r\\n\\r\\n        if (!this.IsApiPeriod)\\r\\n        {\\r\\n            if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false))   //周期数据 (0= 日线,4=1分钟线 不需要处理)\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.UpdateMainData(bindData,lastDataCount);\\r\\n        this.BindInstructionIndexData(bindData);    //执行指示脚本\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.UpdateChartDrawXValue();       //更新画图工具X轴索引\\r\\n        this.Draw();\\r\\n\\r\\n        //更新信息地雷\\r\\n        this.ReqeustKLineInfoData( { FunctionName:\\\"RecvDragDayData\\\", StartDate:firstData.Date } );\\r\\n\\r\\n        //叠加指标计算\\r\\n        this.BindAllOverlayIndexData(bindData);\\r\\n    }\\r\\n\\r\\n    this.SetCustomVerical=function(windowId, data)\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n        if (windowId>=this.Frame.SubFrame.length) return;\\r\\n\\r\\n        var item=this.Frame.SubFrame[windowId];\\r\\n        if (item.Frame) item.Frame.CustomVerticalInfo=data;\\r\\n    }\\r\\n\\r\\n    this.OnSize=function()\\r\\n    {\\r\\n        if (!this.Frame) return;\\r\\n        if (!this.Frame.OnSize) return;\\r\\n\\r\\n        //this.Frame.CalculateChartBorder();\\r\\n        var obj=this.Frame.OnSize();\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        if (obj.Changed)\\r\\n        {\\r\\n            this.UpdataDataoffset();\\r\\n            this.UpdatePointByCursorIndex(2);\\r\\n            this.UpdateFrameMaxMin();\\r\\n        }\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//API 返回数据 转化为array[]\\r\\nKLineChartContainer.JsonDataToHistoryData=function(data)\\r\\n{\\r\\n    var aryDayData=[];\\r\\n    if (!data.data) return aryDayData;\\r\\n\\r\\n    var upperSymbol=null;\\r\\n    if (data.symbol) upperSymbol=data.symbol.toUpperCase();\\r\\n    var isFutures=false;    //是否是期货\\r\\n    if (upperSymbol) isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);\\r\\n\\r\\n    var list = data.data;\\r\\n    var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, position=8;\\r\\n    var fclose=9, yfclose=10;   //结算价, 前结算价\\r\\n    var bfactor=11, afactor=12; //前, 后复权因子\\r\\n    for (var i = 0; i < list.length; ++i)\\r\\n    {\\r\\n        var item = new HistoryData();\\r\\n        var jsData=list[i];\\r\\n\\r\\n        item.Date = jsData[date];\\r\\n        item.Open = jsData[open];\\r\\n        item.YClose = jsData[yclose];\\r\\n        item.Close = jsData[close];\\r\\n        item.High = jsData[high];\\r\\n        item.Low = jsData[low];\\r\\n        item.Vol = jsData[vol];    //原始单位股\\r\\n        item.Amount = jsData[amount];\\r\\n        if (IFrameSplitOperator.IsNumber(jsData[position])) item.Position=jsData[position];//期货持仓\\r\\n        if (IFrameSplitOperator.IsNumber(jsData[fclose])) item.FClose=jsData[fclose];       //期货结算价\\r\\n        if (IFrameSplitOperator.IsNumber(jsData[yfclose])) item.YFClose=jsData[yfclose];    //期货前结算价\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(jsData[bfactor])) item.BFactor=jsData[bfactor];    //前复权因子\\r\\n        if (IFrameSplitOperator.IsNumber(jsData[afactor])) item.AFactor=jsData[afactor];    //后复权因子\\r\\n\\r\\n        if (!IFrameSplitOperator.IsNumber(item.Open)) continue;\\r\\n\\r\\n        aryDayData.push(item);\\r\\n    }\\r\\n\\r\\n    return aryDayData;\\r\\n}\\r\\n\\r\\nKLineChartContainer.JsonDataToRealtimeData=function(data, symbol)\\r\\n{\\r\\n    if (!data.stock) return null;\\r\\n\\r\\n    var stock;\\r\\n    for(var i in data.stock)    //查找对应的股票数据\\r\\n    {\\r\\n        var stockItem=data.stock[i];\\r\\n        if (stockItem && stockItem.symbol==symbol)\\r\\n        {\\r\\n            stock=stockItem;\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n    if (!stock) return null;\\r\\n\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n    var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);\\r\\n\\r\\n    var item=new HistoryData();\\r\\n    item.Date=stock.date;\\r\\n    item.Open=stock.open;\\r\\n    item.YClose=stock.yclose;\\r\\n    item.High=stock.high;\\r\\n    item.Low=stock.low;\\r\\n    item.Vol=stock.vol; //股\\r\\n    item.Amount=stock.amount;\\r\\n    item.Close=stock.price;\\r\\n    if (IFrameSplitOperator.IsNumber(stock.position)) item.Position=stock.position; //持仓量\\r\\n\\r\\n    if (IFrameSplitOperator.IsNumber(stock.bfactor)) item.BFactor=stock.bfactor;    //前复权因子\\r\\n    if (IFrameSplitOperator.IsNumber(stock.afactor)) item.AFactor=stock.afactor;    //后复权因子\\r\\n    return item;\\r\\n}\\r\\n\\r\\nKLineChartContainer.JsonDataToMinuteRealtimeData=function(data,symbol)\\r\\n{\\r\\n    if (!data.stock) return null;\\r\\n    var stock;\\r\\n    for(var i in data.stock)    //查找对应的股票数据\\r\\n    {\\r\\n        var stockItem=data.stock[i];\\r\\n        if (stockItem && stockItem.symbol==symbol)\\r\\n        {\\r\\n            stock=stockItem;\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n    if (!stock) return null;\\r\\n\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n    var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);\\r\\n    var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);\\r\\n    var aryMinuteData=new Array();\\r\\n    var preClose=stock.yclose;      //前一个数据价格\\r\\n    var date=stock.date;\\r\\n    if (isFutures && stock.yclearing)preClose=stock.yclearing;  //期货使用昨结算价\\r\\n\\r\\n    for(var i in stock.minute)\\r\\n    {\\r\\n        var jsData=stock.minute[i];\\r\\n        var item = new HistoryData();\\r\\n\\r\\n        item.Close=jsData.price;\\r\\n        item.Open=jsData.open;\\r\\n        item.High=jsData.high;\\r\\n        item.Low=jsData.low;\\r\\n        item.Vol=jsData.vol;   //股\\r\\n        item.Amount=jsData.amount;\\r\\n        if (jsData.date>0) item.Date=jsData.date;\\r\\n        else item.Date=date;\\r\\n        item.Time=jsData.time;\\r\\n        item.YClose=preClose;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(jsData.position)) item.Position=jsData.position; //持仓量\\r\\n\\r\\n        if (!IFrameSplitOperator.IsNumber(item.Close)) //当前没有价格 使用上一个价格填充\\r\\n        {\\r\\n            item.Close=preClose;\\r\\n            item.Open=item.High=item.Low=item.Close;\\r\\n        }\\r\\n\\r\\n        //价格是0的 都用空\\r\\n        if (!IFrameSplitOperator.IsNumber(item.Open)) item.Open=null;\\r\\n        if (!IFrameSplitOperator.IsNumber(item.Close)) item.Close=null;\\r\\n        if (!IFrameSplitOperator.IsNumber(item.High)) item.High=null;\\r\\n        if (!IFrameSplitOperator.IsNumber(item.Low)) item.Low=null;\\r\\n\\r\\n        //上次价格\\r\\n        if (IFrameSplitOperator.IsNumber(jsData.price)) preClose=jsData.price;\\r\\n\\r\\n        aryMinuteData[i]=item;\\r\\n    }\\r\\n\\r\\n    return aryMinuteData;\\r\\n}\\r\\n\\r\\n//API 返回数据 转化为array[]\\r\\nKLineChartContainer.JsonDataToMinuteHistoryData=function(data)\\r\\n{\\r\\n    var upperSymbol=null;\\r\\n    if (data.symbol) upperSymbol=data.symbol.toUpperCase();\\r\\n    var isSHSZ=false;\\r\\n    if (upperSymbol) isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);\\r\\n    var isFutures=false;    //是否是期货\\r\\n    if (upperSymbol) isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);\\r\\n    var list = data.data;\\r\\n    var aryDayData=new Array();\\r\\n    var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9;\\r\\n    var yClose=null;\\r\\n    for (var i = 0; i < list.length; ++i)\\r\\n    {\\r\\n        var item = new HistoryData();\\r\\n        var jsData=list[i];\\r\\n        item.Date = jsData[date];\\r\\n        item.Open = jsData[open];\\r\\n        item.YClose = jsData[yclose];\\r\\n        item.Close = jsData[close];\\r\\n        item.High = jsData[high];\\r\\n        item.Low = jsData[low];\\r\\n        item.Vol = jsData[vol];    //股\\r\\n        item.Amount = jsData[amount];\\r\\n        item.Time=jsData[time];\\r\\n        if (IFrameSplitOperator.IsNumber(jsData[position])) item.Position=jsData[position]; //期货持仓\\r\\n\\r\\n        if (!IFrameSplitOperator.IsNumber(item.YClose))\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(yClose)) item.YClose=yClose;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(item.Close)) yClose=item.Close;\\r\\n\\r\\n        aryDayData.push(item);\\r\\n    }\\r\\n\\r\\n    /* 内部不处理无效数据, 确保外部传过来的数据是对的.\\r\\n    // 无效数据处理\\r\\n    for(var i = 0; i < aryDayData.length; ++i)\\r\\n    {\\r\\n        var minData = aryDayData[i];\\r\\n        if (minData == null) coninue;\\r\\n        if (isNaN(minData.Open) || minData.Open <= 0 || isNaN(minData.High) || minData.High <= 0 || isNaN(minData.Low) || minData.Low <= 0\\r\\n            || isNaN(minData.Close) || minData.Close <= 0 )\\r\\n        {\\r\\n            if (i == 0)\\r\\n            {\\r\\n                if (minData.YClose > 0)\\r\\n                {\\r\\n                    minData.Open = minData.YClose;\\r\\n                    minData.High = minData.YClose;\\r\\n                    minData.Low = minData.YClose;\\r\\n                    minData.Close = minData.YClose;\\r\\n                }\\r\\n            }\\r\\n            else // 用前一个有效数据填充\\r\\n            {\\r\\n                for(var j = i-1; j >= 0; --j)\\r\\n                {\\r\\n                    var minData2 = aryDayData[j];\\r\\n                    if (minData2 == null) coninue;\\r\\n                    if (minData2.Open > 0 && minData2.High > 0 && minData2.Low > 0 && minData2.Close > 0)\\r\\n                    {\\r\\n                        if (minData.YClose <= 0) minData.YClose = minData2.Close;\\r\\n                        minData.Open = minData2.Open;\\r\\n                        minData.High = minData2.High;\\r\\n                        minData.Low = minData2.Low;\\r\\n                        minData.Close = minData2.Close;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    */\\r\\n    return aryDayData;\\r\\n}\\r\\n\\r\\nKLineChartContainer.JsonDataToTickData=function(data)\\r\\n{\\r\\n    var aryDayData=[];\\r\\n    if (!data.detail) return aryDayData;\\r\\n\\r\\n    var date=data.date;\\r\\n    var yClose=data.yclose;\\r\\n    for(var i in data.detail)\\r\\n    {\\r\\n        var item = new HistoryData();\\r\\n        var tick=data.detail[i];\\r\\n        if (!tick) continue;\\r\\n\\r\\n        item.Date = date;\\r\\n        item.Time=tick[0];\\r\\n        item.Low=item.High=item.Close=item.Open = tick[1];\\r\\n        item.YClose = yClose;    //当前数据的前收盘\\r\\n        item.Vol = tick[2];      //原始单位股\\r\\n        item.Amount = tick[3];\\r\\n        item.Flag=tick[4];\\r\\n\\r\\n        if (!IFrameSplitOperator.IsNumber(item.Open)) continue; //停牌的数据剔除\\r\\n\\r\\n        //yClose=item.Close;\\r\\n        aryDayData.push(item);\\r\\n    }\\r\\n\\r\\n    return aryDayData;\\r\\n}\\r\\n\\r\\nKLineChartContainer.JsonDataToTickDataV2=function(data)\\r\\n{\\r\\n    var aryDayData=[];\\r\\n    if (!IFrameSplitOperator.IsNonEmptyArray(data.data)) return aryDayData;\\r\\n\\r\\n    for(var i=0;i<data.data.length;++i)\\r\\n    {\\r\\n        var item = new HistoryData();\\r\\n        var tick=data.data[i];   //[ date, time, yClose, price, extendData]\\r\\n        if (!tick) continue;\\r\\n\\r\\n        item.Date = tick[0];\\r\\n        item.Time=tick[1];\\r\\n        item.YClose = tick[2];\\r\\n        item.Low=item.High=item.Close=item.Open = tick[3];\\r\\n        aryDayData.push(item);\\r\\n\\r\\n        if (tick[4]) item.ExtendData=tick[4];\\r\\n    }\\r\\n\\r\\n    return aryDayData;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n///////////////////////////////////////////////////////////////////////////////////////////\\r\\n//  走势图\\r\\n//\\r\\nfunction MinuteChartContainer(uielement)\\r\\n{\\r\\n    this.newMethod=JSChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='MinuteChartContainer';\\r\\n    this.WindowIndex=new Array();\\r\\n    this.Symbol;\\r\\n    this.Name;\\r\\n    this.SourceData;                          //原始的历史数据\\r\\n    this.IndexBindData;                       //计算指标需要绑定的分钟数据\\r\\n    this.IsAutoUpdate=true;                   //是否自动更新行情数据\\r\\n    this.AutoUpdateFrequency=30000;           //30秒更新一次数据\\r\\n    this.AutoUpdateTimer;                     //自动更新定时器\\r\\n    this.TradeDate=0;                         //行情交易日期\\r\\n    this.DayCount=1;                          //显示几天的数据\\r\\n    this.DayData;                             //多日分钟数据\\r\\n    this.LimitPrice;                          //涨停价格 { Max:null, Min:null };\\r\\n\\r\\n    this.IsShowBeforeData=false;              //是否显示盘前集合竞价数据 (当日)\\r\\n    this.BeforeOpenData=null;                 //盘前集合竞价数据\\r\\n    this.IsBeforeData=false;                  //是否支持显示盘前集合竞价数据\\r\\n\\r\\n    this.IsShowAfterData=false;               //收盘集合竞价\\r\\n    this.AfterCloseData=null;                 //收盘集合竞价数据\\r\\n    this.IsAfterData=false;                   //是否支持显示收盘集合竞价数据\\r\\n    this.ExtendWidth={ Left: 120, Right:120 } ;      //单日分时图 左右扩展图形宽度\\r\\n\\r\\n    this.IsShowLead=true;                     //指数是否显示领先指标\\r\\n\\r\\n    this.IsShowMultiDayBeforeData=false;             //多日分时图 是否显示盘前集合竞价\\r\\n    this.MultiDayBeforeOpenData=null;                //多日分时图 盘前集合竞价数据\\r\\n    this.IsShowMultiDayAfterData=false;             //多日分时图 是否显示收盘集合竞价\\r\\n    this.MultiDayAfterCloseData=null;                //多日分时图 收盘集合竞价数据\\r\\n\\r\\n    this.MultiDayExtendWidth={ Left:20, Right:20 };   //多日分时图 左右扩展图形宽度\\r\\n\\r\\n    this.ChartDrawStorage=new ChartDrawStorage();\\r\\n    this.ChartDrawStorageCache=null;         //首次需要创建的画图工具数据\\r\\n\\r\\n    this.MinuteApiUrl=g_JSChartResource.Domain+\\\"/API/Stock\\\";\\r\\n    this.HistoryMinuteApiUrl=g_JSChartResource.Domain+'/API/StockMinuteData';  //历史分钟数据\\r\\n\\r\\n    this.ColorLineData;    //主图价格线颜色自定义配置\\r\\n    this.EnableSelectRect=false;    //是否可以区间选择\\r\\n    this.SelectRectDialog=null;     //区间选择对话框\\r\\n\\r\\n    //集合竞价设置 obj={ Left:true/false, Right:true/false, MultiDay:{Left:, Right:} }\\r\\n    this.SetCallCationDataBorder=function(obj)\\r\\n    {\\r\\n        if (!obj) return;\\r\\n\\r\\n        var extendWidth=\\r\\n            {\\r\\n                Left: obj.Left?this.ExtendWidth.Left:0,\\r\\n                Right: obj.Right?this.ExtendWidth.Right:0\\r\\n            };\\r\\n\\r\\n        this.Frame.SetExtendWidth(extendWidth);\\r\\n\\r\\n        if (obj.MultiDay)\\r\\n        {\\r\\n            var item=obj.MultiDay;\\r\\n            var DayMinuteWidth=\\r\\n                {\\r\\n                    Left:item.Left? this.MultiDayExtendWidth.Left:0,\\r\\n                    Right:item.Right? this.MultiDayExtendWidth.Right:0\\r\\n                };\\r\\n\\r\\n            this.Frame.SetMultiDayMinuteWidth(DayMinuteWidth);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReloadChartPaint=function(resource)\\r\\n    {\\r\\n        for(var i=0; i<this.ChartPaint.length; ++i)\\r\\n        {\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (!item) continue;\\r\\n            if (item.ReloadResource) item.ReloadResource(resource);\\r\\n\\r\\n            if (i==0)\\r\\n            {\\r\\n                if (item.Name==\\\"Minute-Line\\\")\\r\\n                {\\r\\n                    item.Color=g_JSChartResource.Minute.PriceColor;\\r\\n                    item.AreaColor=g_JSChartResource.Minute.AreaPriceColor;\\r\\n                }\\r\\n            }\\r\\n            else if (i==1)\\r\\n            {\\r\\n                if (item.Name==\\\"Minute-Average-Line\\\")\\r\\n                {\\r\\n                    item.Color=g_JSChartResource.Minute.AvPriceColor;\\r\\n                }\\r\\n            }\\r\\n            else if (i==2)\\r\\n            {\\r\\n                if (item.Name==\\\"Minute-Vol-Bar\\\")\\r\\n                {\\r\\n                    item.Color=g_JSChartResource.Minute.VolBarColor;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.StopAutoUpdate=function()\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        if (!this.IsAutoUpdate) return;\\r\\n        this.IsAutoUpdate=false;\\r\\n    }\\r\\n\\r\\n    this.ClickFrameButton=function(button)\\r\\n    {\\r\\n        if (button.ID==JSCHART_BUTTON_ID.CLOSE_BEFOREOPEN_ID)\\r\\n            this.ShowCallAuctionData({ Left:false, Right:false, MultiDay:{ Left:false, Right:false } });\\r\\n    }\\r\\n\\r\\n    //左右拖拽\\r\\n    this.OnDragMode_One=function(moveData, e)\\r\\n    {\\r\\n        var drag=this.MouseDrag;\\r\\n        var moveSetp=moveData.X;\\r\\n        var yMoveSetp=moveData.Y;\\r\\n\\r\\n        if (this.RectSelectDrag && this.RectSelectDrag.Index>=0)    //区间选择\\r\\n        {\\r\\n            if (moveSetp<5) return;\\r\\n            var obj={ X:e.clientX, Y:e.clientY, PointIndex:this.RectSelectDrag.Index, Name:\\\"MoveRectSelectLine\\\" };\\r\\n            if (this.MoveRectSelectPoint(obj))\\r\\n            {\\r\\n                drag.LastMove.X=e.clientX;\\r\\n                this.Draw();\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (moveSetp<5 && yMoveSetp<5) return;\\r\\n            if (!this.EnableSelectRect) return;\\r\\n\\r\\n            this.UIElement.style.cursor=\\\"default\\\";\\r\\n            var x=drag.Click.X-uielement.getBoundingClientRect().left;\\r\\n            var y=drag.Click.Y-uielement.getBoundingClientRect().top;\\r\\n            var x2=e.clientX-uielement.getBoundingClientRect().left;\\r\\n            var y2=e.clientY-uielement.getBoundingClientRect().top;\\r\\n            this.ShowSelectRect(x,y,x2,y2);\\r\\n\\r\\n            drag.LastMove.X=e.clientX;\\r\\n            drag.LastMove.Y=e.clientY;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnMinuteSelectRectMouseUp=function(e)\\r\\n    {\\r\\n        var drag=this.MouseDrag;\\r\\n        drag.LastMove.X=e.clientX;\\r\\n        drag.LastMove.Y=e.clientY;\\r\\n\\r\\n        var selectData=new SelectRectData();\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        //区间起始位置 结束位子\\r\\n        selectData.XStart=(drag.Click.X-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n        selectData.YStart=(drag.Click.Y-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n        selectData.XEnd=(drag.LastMove.X-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n        selectData.YEnd=(drag.LastMove.Y-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n        selectData.JSChartContainer=this;\\r\\n        selectData.Stock={Symbol:this.Symbol, Name:this.Name};\\r\\n\\r\\n        if (this.EnableSelectRect && !this.BorderDrag && this.GetSelectRectData(selectData))\\r\\n        {\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SELECT_RECT);\\r\\n            var paint=this.GetRectSelectPaint();\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data=\\r\\n                    {\\r\\n                        X:drag.LastMove.X-uielement.getBoundingClientRect().left,\\r\\n                        Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,\\r\\n                        SelectData:selectData,   //区间选择的数据\\r\\n                        RectSelectPaint:paint    //区间选择背景\\r\\n                    };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n\\r\\n            if (this.SelectRectDialog)\\r\\n            {\\r\\n                e.data=\\r\\n                    {\\r\\n                        Chart:this,\\r\\n                        X:drag.LastMove.X-uielement.getBoundingClientRect().left,\\r\\n                        Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,\\r\\n                        SelectData:selectData,          //区间选择的数据\\r\\n                        RectSelectPaint:paint           //区间选择背景\\r\\n                    };\\r\\n\\r\\n                this.SelectRectDialog.DoModal(e);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.HideSelectRect();\\r\\n                this.UpdateSelectRect(selectData.Start,selectData.End);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.TryClickPaintEvent(JSCHART_EVENT_ID.ON_CLICKUP_CHART_PAINT,this.ClickDownPoint,e);\\r\\n            this.ClickEvent(e);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnDragSelectRectMouseUp=function(e)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return;\\r\\n\\r\\n        var selectData=paint.GetSelectRectData();\\r\\n        if (!selectData) return;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var corssCursor=this.ChartCorssCursor;  //十字光标\\r\\n        var x=corssCursor.LastPoint.X/pixelTatio;\\r\\n        var y=corssCursor.LastPoint.Y/pixelTatio;\\r\\n\\r\\n\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAG_SELECT_RECT_MOUSEUP);\\r\\n        if (event)\\r\\n        {\\r\\n            var data=\\r\\n                {\\r\\n                    X:x,\\r\\n                    Y:y,\\r\\n                    SelectData:selectData,   //区间选择的数据\\r\\n                    RectSelectPaint:paint    //区间选择背景\\r\\n                };\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n\\r\\n        if (this.SelectRectDialog)\\r\\n        {\\r\\n            e.data=\\r\\n                {\\r\\n                    Chart:this,\\r\\n                    X:x,\\r\\n                    Y:y,\\r\\n                    SelectData:selectData,          //区间选择的数据\\r\\n                    RectSelectPaint:paint           //区间选择背景\\r\\n                };\\r\\n\\r\\n            this.SelectRectDialog.DoModal(e);\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.UpdateSelectRect=function(start,end)\\r\\n    {\\r\\n        if (!this.SourceData || !this.SourceData.Data) return;\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return;\\r\\n\\r\\n        var data=this.SourceData;\\r\\n        if (!data || !IFrameSplitOperator.IsNonEmptyArray(data.Data)) return;\\r\\n        var count=data.Data.length;\\r\\n        var startItem=data.Data[start];\\r\\n        if (end>=count) end=count-1;\\r\\n        var endItem=data.Data[end];\\r\\n\\r\\n        JSConsole.Chart.Log('[MinuteChartContainer::UpdateSelectRect]',startItem,endItem);\\r\\n        paint.SetPoint(startItem, { Index:0 });\\r\\n        paint.SetPoint(endItem, { Index:1 });\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.MoveRectSelectPoint=function(obj)\\r\\n    {\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return false;\\r\\n\\r\\n        if (!this.SourceData || !this.SourceData.Data) return false;\\r\\n        var kData=this.SourceData;\\r\\n\\r\\n        if (!this.Frame.SubFrame[0]) return false;\\r\\n        var subFrame=this.Frame.SubFrame[0].Frame;\\r\\n        if (!subFrame) false;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x=(obj.X-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var index=subFrame.GetXData(x);\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var dataIndex=index+kData.DataOffset;\\r\\n        if (dataIndex>=kData.Data.length) dataIndex=kData.Data.length-1;\\r\\n\\r\\n        var item = kData.Data[dataIndex];\\r\\n        JSConsole.Chart.Log(\\\"[MinuteChartContainer::MoveRectSelectPoint] point, item\\\", obj.PointIndex, item);\\r\\n\\r\\n        if (!paint.SetPoint(item,{ Index: obj.PointIndex })) return false;\\r\\n\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAG_SELECT_RECT);\\r\\n        if (event)\\r\\n        {\\r\\n            var selectData=paint.GetSelectRectData();\\r\\n            var data={ X:obj.X, Y:obj.Y, SelectData:selectData, RectSelectPaint:paint };\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n\\r\\n    //手势\\r\\n    this.OnTouchStart=function(e)\\r\\n    {\\r\\n        if(this.DragMode==0) return;\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        this.IsOnTouch=true;\\r\\n        this.TouchDrawCount=0;\\r\\n        this.PhonePinch=null;\\r\\n        this.StopDragTimer();\\r\\n\\r\\n        if (this.EnableScrollUpDown==false) e.preventDefault();  //上下拖动图形不能阻止事件\\r\\n\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            var drag= { Click:{}, LastMove:{} };//LastMove=最后移动的位置\\r\\n            var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n\\r\\n            drag.Click.X=touches[0].clientX;\\r\\n            drag.Click.Y=touches[0].clientY;\\r\\n            drag.LastMove.X=touches[0].clientX;\\r\\n            drag.LastMove.Y=touches[0].clientY;\\r\\n            var self=this;\\r\\n\\r\\n            var T_ShowCorssCursor=function() //临时函数(Temp_) T_开头\\r\\n            {\\r\\n                if (self.ChartCorssCursor.IsShow === true)    //移动十字光标\\r\\n                {\\r\\n                    var pixelTatio = GetDevicePixelRatio();\\r\\n                    var x = drag.Click.X-uielement.getBoundingClientRect().left*pixelTatio;\\r\\n                    var y = drag.Click.Y-uielement.getBoundingClientRect().top*pixelTatio;\\r\\n                    self.OnMouseMove(x, y, e);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (this.ChartDrawOption.IsLockScreen)\\r\\n            {\\r\\n                this.MouseDrag=drag;\\r\\n                if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;\\r\\n                this.SelectChartDrawPicture=null;\\r\\n\\r\\n                if (this.CurrentChartDrawPicture)  //画图工具模式\\r\\n                {\\r\\n                    var drawPicture=this.CurrentChartDrawPicture;\\r\\n                    if (drawPicture.Status==2)\\r\\n                        this.SetChartDrawPictureThirdPoint(drag.Click.X,drag.Click.Y,true);\\r\\n                    else\\r\\n                    {\\r\\n                        this.SetChartDrawPictureFirstPoint(drag.Click.X,drag.Click.Y,true);\\r\\n                        //只有1个点 直接完成\\r\\n                        if (this.FinishChartDrawPicturePoint()) this.DrawDynamicInfo({Corss:false, Tooltip:false});\\r\\n                    }\\r\\n\\r\\n                    if (e.cancelable) e.preventDefault();\\r\\n                    return;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var drawPictrueData={};\\r\\n                    var pixelTatio = GetDevicePixelRatio(); //鼠标移动坐标是原始坐标 需要乘以放大倍速\\r\\n                    drawPictrueData.X=(touches[0].clientX-uielement.getBoundingClientRect().left);\\r\\n                    drawPictrueData.Y=(touches[0].clientY-uielement.getBoundingClientRect().top);\\r\\n                    if (this.GetChartDrawPictureByPoint(drawPictrueData))\\r\\n                    {\\r\\n                        drawPictrueData.ChartDrawPicture.Status=20;\\r\\n                        drawPictrueData.ChartDrawPicture.ValueToPoint();\\r\\n                        drawPictrueData.ChartDrawPicture.MovePointIndex=drawPictrueData.PointIndex;\\r\\n                        drawPictrueData.ChartDrawPicture.IsSelected=true;\\r\\n                        this.CurrentChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                        this.SelectChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                        let event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_DRAWPICTURE); //选中画图工具事件\\r\\n                        if (event && event.Callback)\\r\\n                        {\\r\\n                            let sendData={ DrawPicture: drawPictrueData.ChartDrawPicture };\\r\\n                            event.Callback(event,sendData,this);\\r\\n                        }\\r\\n\\r\\n                        if (e.cancelable) e.preventDefault();\\r\\n                        return;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.EnableScrollUpDown==true)\\r\\n                {\\r\\n                    this.DragTimer=setTimeout(function()\\r\\n                    {\\r\\n                        if (drag.Click.X==drag.LastMove.X && drag.Click.Y==drag.LastMove.Y)\\r\\n                        {\\r\\n                            var mouseDrag=self.MouseDrag;\\r\\n                            self.MouseDrag=null;\\r\\n                            T_ShowCorssCursor();\\r\\n                            self.PreventTouchEvent(e)\\r\\n                        }\\r\\n                    }, 800);\\r\\n                }\\r\\n\\r\\n                this.MouseDrag=drag;\\r\\n                this.SelectChartDrawPicture=null;\\r\\n\\r\\n                if (this.EnableScrollUpDown==false)\\r\\n                    T_ShowCorssCursor();    //移动十字光标\\r\\n            }\\r\\n\\r\\n            if (this.EnableZoomIndexWindow)\\r\\n            {\\r\\n                this.PhoneDBClick.AddTouchStart(touches[0].clientX, touches[0].clientY, Date.now());\\r\\n                JSConsole.Chart.Log(\\\"[MinuteChartContainer::OnTouchStart] PhoneDBClick \\\", this.PhoneDBClick);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchMove=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            var drag=this.MouseDrag;\\r\\n            if (drag==null)\\r\\n            {\\r\\n                var pixelTatio = GetDevicePixelRatio();\\r\\n                var x = touches[0].clientX-uielement.getBoundingClientRect().left*pixelTatio;\\r\\n                var y = touches[0].clientY-uielement.getBoundingClientRect().top*pixelTatio;\\r\\n                this.OnMouseMove(x,y,e);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var moveAngle=this.GetMoveAngle(drag.LastMove,{X:touches[0].clientX, Y:touches[0].clientY});\\r\\n                var moveSetp=Math.abs(drag.LastMove.X-touches[0].clientX);\\r\\n                var moveUpDown=Math.abs(drag.LastMove.Y-touches[0].clientY);\\r\\n                moveSetp=parseInt(moveSetp);\\r\\n\\r\\n                if (this.CurrentChartDrawPicture)\\r\\n                {\\r\\n                    var drawPicture=this.CurrentChartDrawPicture;\\r\\n                    if (drawPicture.Status==1 || drawPicture.Status==2)\\r\\n                    {\\r\\n                        if(moveSetp<5 && moveUpDown<5) return;\\r\\n                        if(this.SetChartDrawPictureSecondPoint(touches[0].clientX,touches[0].clientY,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n                    else if (drawPicture.Status==3)\\r\\n                    {\\r\\n                        if(this.SetChartDrawPictureThirdPoint(touches[0].clientX,touches[0].clientY,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n                    else if (drawPicture.Status==20)    //画图工具移动\\r\\n                    {\\r\\n                        if(moveSetp<5 && moveUpDown<5) return;\\r\\n\\r\\n                        if(this.MoveChartDrawPicture(touches[0].clientX-drag.LastMove.X,touches[0].clientY-drag.LastMove.Y,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    drag.LastMove.X=touches[0].clientX;\\r\\n                    drag.LastMove.Y=touches[0].clientY;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    //上下滚动\\r\\n                    if ( ((moveUpDown>0 && moveSetp<=3) || moveAngle<=this.TouchMoveMinAngle) && this.EnableScrollUpDown==true )\\r\\n                    {\\r\\n                        this.StopDragTimer();\\r\\n                        return;\\r\\n                    }\\r\\n\\r\\n                    this.PreventTouchEvent(e);\\r\\n                    this.MouseDrag=null;\\r\\n                    var pixelTatio = GetDevicePixelRatio();\\r\\n                    var x = touches[0].clientX-uielement.getBoundingClientRect().left*pixelTatio;\\r\\n                    var y = touches[0].clientY-uielement.getBoundingClientRect().top*pixelTatio;\\r\\n                    this.OnMouseMove(x,y,e);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.EnableScrollUpDown==false)\\r\\n        {\\r\\n            e.preventDefault();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (drag==null)\\r\\n            {\\r\\n                this.PreventTouchEvent(e); //十字光标出来了,阻止消息\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.StopDragTimer();   //上下推动图片,停止定时器,消息传递下去\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchEnd=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[MinuteChartContainer::OnTouchEnd]',e);\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var bClearDrawPicture=true;\\r\\n        if (this.CurrentChartDrawPicture)\\r\\n        {\\r\\n            var drawPicture=this.CurrentChartDrawPicture;\\r\\n            if (drawPicture.Status==2 || drawPicture.Status==1 || drawPicture.Status==3)\\r\\n            {\\r\\n                drawPicture.PointStatus=drawPicture.Status;\\r\\n                if (this.FinishChartDrawPicturePoint())\\r\\n                    this.DrawDynamicInfo();\\r\\n                else\\r\\n                    bClearDrawPicture=false;\\r\\n            }\\r\\n            else if (drawPicture.Status==20)\\r\\n            {\\r\\n                if (this.FinishMoveChartDrawPicture())\\r\\n                    this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.EnableZoomIndexWindow)\\r\\n        {\\r\\n            var time=Date.now();\\r\\n            this.PhoneDBClick.AddTouchEnd(time);\\r\\n            if (this.PhoneDBClick.IsVaildDBClick())\\r\\n            {\\r\\n                this.OnTouchDBClick(this.PhoneDBClick.Start);\\r\\n                this.PhoneDBClick.Clear();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.IsOnTouch = false;\\r\\n        this.StopDragTimer();\\r\\n        this.OnTouchFinished();\\r\\n        this.TouchDrawCount=0;\\r\\n    }\\r\\n\\r\\n\\r\\n    //键盘左右移动十字光标\\r\\n    this.OnKeyDown=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var keyID = e.keyCode ? e.keyCode :e.which;\\r\\n        switch(keyID)\\r\\n        {\\r\\n            case 37: //left\\r\\n                this.CursorIndex=parseInt(this.CursorIndex);\\r\\n                if (this.CursorIndex<=0.99999)\\r\\n                {\\r\\n                    if (!this.DataMoveLeft()) break;\\r\\n                    this.UpdataDataoffset();\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.UpdateFrameMaxMin();\\r\\n                    this.Draw();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    --this.CursorIndex;\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.DrawDynamicInfo();\\r\\n                }\\r\\n                break;\\r\\n            case 39: //right\\r\\n                var xPointcount=0;\\r\\n                if (this.Frame.XPointCount) xPointcount=this.Frame.XPointCount;\\r\\n                else xPointcount=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n                this.CursorIndex=parseInt(this.CursorIndex);\\r\\n                if (this.CursorIndex+1>=xPointcount)\\r\\n                {\\r\\n                    if (!this.DataMoveRight()) break;\\r\\n                    this.UpdataDataoffset();\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.UpdateFrameMaxMin();\\r\\n                    this.Draw();\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    //判断是否在最后一个数据上\\r\\n                    var data=null;\\r\\n                    if (this.Frame.Data) data=this.Frame.Data;\\r\\n                    else data=this.Frame.SubFrame[0].Frame.Data;\\r\\n                    if (!data) break;\\r\\n                    if (this.CursorIndex+data.DataOffset+1>=data.Data.length) break;\\r\\n\\r\\n                    ++this.CursorIndex;\\r\\n                    this.UpdatePointByCursorIndex();\\r\\n                    this.DrawDynamicInfo();\\r\\n                }\\r\\n                break;\\r\\n            case 46:    //del\\r\\n                if (!this.SelectChartDrawPicture) break;\\r\\n                var drawPicture=this.SelectChartDrawPicture;\\r\\n                JSConsole.Chart.Log(drawPicture,\\\"drawPicturedrawPicturedrawPicture\\\")\\r\\n                this.SelectChartDrawPicture=null;\\r\\n                this.ClearChartDrawPicture(drawPicture);    //删除选中的画图工具\\r\\n                break;\\r\\n            case 32:    //space\\r\\n                this.OnMarkRectSelect(e);\\r\\n                break;\\r\\n            default:\\r\\n                return;\\r\\n        }\\r\\n\\r\\n        //不让滚动条滚动\\r\\n        if(e.preventDefault) e.preventDefault();\\r\\n        else e.returnValue = false;\\r\\n    }\\r\\n\\r\\n    this.OnMarkRectSelect=function(e)\\r\\n    {\\r\\n        var corssCursor=this.ChartCorssCursor;  //十字光标\\r\\n        if (!corssCursor || corssCursor.Status==0) return;\\r\\n        if (!IFrameSplitOperator.IsNumber(corssCursor.CursorIndex)) return;\\r\\n        if (!this.SourceData || !this.SourceData.Data) return;\\r\\n        var paint=this.GetRectSelectPaint();\\r\\n        if (!paint) return;\\r\\n\\r\\n        var cursorIndex=corssCursor.CursorIndex;\\r\\n        JSConsole.Chart.Log(\\\"[MinuteChartContainer::OnMarkRectSelect] dataIndex\\\", cursorIndex);\\r\\n\\r\\n        var kData=this.SourceData;\\r\\n        cursorIndex=parseInt(cursorIndex.toFixed(0));\\r\\n        var index=cursorIndex+kData.DataOffset;\\r\\n        if (index>=kData.Data.length) index=kData.Data.length-1;\\r\\n\\r\\n        var item = kData.Data[index];\\r\\n\\r\\n        JSConsole.Chart.Log(\\\"[MinuteChartContainer::OnMarkRectSelect] item\\\", item);\\r\\n\\r\\n        if (!this.SetRectSelectData(item)) return;\\r\\n\\r\\n        if (paint.GetPointCount()==2)\\r\\n        {\\r\\n            var selectData=paint.GetSelectRectData();\\r\\n            var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_KEYDOWN_SELECT_RECT);\\r\\n            var pixelTatio = GetDevicePixelRatio();\\r\\n            if (event && event.Callback)\\r\\n            {\\r\\n                var data=\\r\\n                    {\\r\\n                        X:corssCursor.LastPoint.X/pixelTatio,\\r\\n                        Y:corssCursor.LastPoint.Y/pixelTatio,\\r\\n                        SelectData:selectData,   //区间选择的数据\\r\\n                        RectSelectPaint:paint    //区间选择背景\\r\\n                    };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n\\r\\n            if (this.SelectRectDialog)\\r\\n            {\\r\\n                e.data=\\r\\n                    {\\r\\n                        Chart:this,\\r\\n                        X:corssCursor.LastPoint.X/pixelTatio,\\r\\n                        Y:corssCursor.LastPoint.Y/pixelTatio,\\r\\n                        SelectData:selectData,          //区间选择的数据\\r\\n                        RectSelectPaint:paint           //区间选择背景\\r\\n                    };\\r\\n                this.SelectRectDialog.DoModal(e);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //注册鼠标右键事件\\r\\n    this.OnRightMenu=function(x,y,e)\\r\\n    {\\r\\n        if (this.RightMenu)\\r\\n        {\\r\\n            var frameId=this.Frame.PtInFrame(x,y);\\r\\n            e.data={ Chart:this, FrameID:frameId };\\r\\n            this.RightMenu.DoModal(e);\\r\\n        }\\r\\n\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);\\r\\n        if (event)\\r\\n        {\\r\\n            var frameId=this.Frame.PtInFrame(x,y);\\r\\n            var data={ X:x, Y:y, Event:e, FrameID:frameId };\\r\\n            event.Callback(event,data,this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnWheel=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[MinuteChartContainer::OnWheel]',e);\\r\\n    }\\r\\n\\r\\n    this.OnDoubleClick=function(x,y,e)\\r\\n    {\\r\\n        JSConsole.Chart.Log(\\\"[MinuteChartContainer::OnDoubleClick]\\\", e);\\r\\n\\r\\n        if (this.ClickChartTimer!=null)\\r\\n        {\\r\\n            clearTimeout(this.ClickChartTimer);\\r\\n            this.ClickChartTimer=null;\\r\\n        }\\r\\n\\r\\n        this.DBClickEvent(e);\\r\\n\\r\\n        if (this.EnableZoomIndexWindow)\\r\\n        {\\r\\n            var frameId=this.Frame.PtInFrame(x,y);\\r\\n            JSConsole.Chart.Log(\\\"[MinuteChartContainer::OnDoubleClick] frameId\\\",frameId);\\r\\n            if (frameId>=this.Frame.ZoomStartWindowIndex)\\r\\n            {\\r\\n                if (this.ZoomIndexWindow(frameId, {X:x, Y:y}))\\r\\n                {\\r\\n                    this.Frame.SetSizeChage(true);\\r\\n                    this.Draw();\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DBClickEvent=function(e)\\r\\n    {\\r\\n        var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DBCLICK);\\r\\n        if (!event || !event.Callback) return false;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var x=(e.clientX-uielement.getBoundingClientRect().left)*pixelTatio;\\r\\n        var y=(e.clientY-uielement.getBoundingClientRect().top)*pixelTatio;\\r\\n        var data= { X:e.clientX, Y:e.clientY, FrameID:-1 , ClientPos:-1 };\\r\\n\\r\\n        var clientPos=this.PtInClient(x,y);\\r\\n        data.ClientPos=clientPos;\\r\\n\\r\\n        if (clientPos>0)\\r\\n        {\\r\\n            var yValueExtend={};\\r\\n            var yValue=this.Frame.GetYData(y,yValueExtend);\\r\\n\\r\\n            if (IFrameSplitOperator.IsNumber(yValueExtend.FrameID) && yValueExtend.FrameID>=0)\\r\\n            {\\r\\n                var xValue=this.Frame.GetXData(x);\\r\\n                data.FrameID=yValueExtend.FrameID;\\r\\n                data.Data={ X:xValue, Y:yValue } ;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        event.Callback(event, data, this);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.UpdatePointByCursorIndex=function()\\r\\n    {\\r\\n        this.LastPoint.X=this.Frame.GetXFromIndex(this.CursorIndex);\\r\\n\\r\\n        var index=this.CursorIndex;\\r\\n        index=parseInt(index.toFixed(0));\\r\\n        var data=this.Frame.SourceData;\\r\\n        if (data.DataOffset+index>=data.Data.length)\\r\\n        {\\r\\n            return;\\r\\n        }\\r\\n        var item=data.Data[data.DataOffset+index];\\r\\n        var close=null;\\r\\n        if (item.Before) close=item.Before.Close;\\r\\n        else close=item.Close\\r\\n\\r\\n        this.LastPoint.Y=this.Frame.GetYFromData(close);\\r\\n    }\\r\\n\\r\\n\\r\\n\\r\\n    //创建\\r\\n    //windowCount 窗口个数\\r\\n    this.Create=function(windowCount,option)\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建十字光标\\r\\n        this.ChartCorssCursor=new ChartCorssCursor();\\r\\n        this.ChartCorssCursor.PtInClient=(x,y)=>{ return this.PtInClient(x,y); }\\r\\n        this.ChartCorssCursor.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.StringFormatX=new HQMinuteTimeStringFormat();\\r\\n        this.ChartCorssCursor.StringFormatY=new HQPriceStringFormat();\\r\\n        this.ChartCorssCursor.StringFormatY.LanguageID=this.LanguageID;\\r\\n        this.ChartCorssCursor.CallAcutionXOperator=new CallAcutionXOperator();\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n        this.ChartSplashPaint.HQChart=this;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new HQTradeFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=25;\\r\\n        this.Frame.ChartBorder.TitleHeight=0;\\r\\n        this.Frame.ChartBorder.Left=50;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n        this.Frame.GetExtendChartRightWidth=()=> { return this.GetExtendChartRightWidth() }\\r\\n        this.Frame.ZoomStartWindowIndex=2;\\r\\n        this.ChartCorssCursor.Frame=this.Frame; //十字光标绑定框架\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n\\r\\n        this.CreateChildWindow(windowCount);\\r\\n        this.CreateMainKLine();\\r\\n        this.CreateExtendChart(\\\"RectSelectPaint\\\");  //区间统计\\r\\n\\r\\n        //子窗口动态标题\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var titlePaint=new DynamicChartTitlePainting();\\r\\n            titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n            titlePaint.Canvas=this.Canvas;\\r\\n            titlePaint.LanguageID=this.LanguageID;\\r\\n            titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            this.TitlePaint.push(titlePaint);\\r\\n        }\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatX.Frame=this.Frame.SubFrame[0].Frame;\\r\\n        this.ChartCorssCursor.StringFormatY.Frame=this.Frame;\\r\\n        if (this.ChartCorssCursor.CallAcutionXOperator)\\r\\n            this.ChartCorssCursor.CallAcutionXOperator.Frame=this.Frame.SubFrame[0].Frame;\\r\\n\\r\\n        var bRegisterKeydown=true;\\r\\n        var bRegisterWheel=true;\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.KeyDown===false)\\r\\n            {\\r\\n                bRegisterKeydown=false;\\r\\n                JSConsole.Chart.Log('[MinuteChartContainer::Create] not register keydown event.');\\r\\n            }\\r\\n\\r\\n            if (option.Wheel===false)\\r\\n            {\\r\\n                bRegisterWheel=false;\\r\\n                JSConsole.Chart.Log('[MinuteChartContainer::Create] not register wheel event.');\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bRegisterKeydown) this.UIElement.addEventListener(\\\"keydown\\\", (e)=>{ this.OnKeyDown(e);} , true);              //键盘消息\\r\\n        if (bRegisterWheel) this.UIElement.addEventListener(\\\"wheel\\\", (e)=>{ this.OnWheel(e); }, true);                  //上下滚动消息\\r\\n    }\\r\\n\\r\\n    //创建子窗口\\r\\n    this.CreateChildWindow=function(windowCount)\\r\\n    {\\r\\n        for(var i=0;i<windowCount;++i)\\r\\n        {\\r\\n            var border=new ChartBorder();\\r\\n            border.UIElement=this.UIElement;\\r\\n\\r\\n            var frame=new MinuteFrame();\\r\\n            frame.Canvas=this.Canvas;\\r\\n            frame.ChartBorder=border;\\r\\n            frame.Identify=i;\\r\\n            if (i<2) frame.ChartBorder.TitleHeight=0;\\r\\n            frame.XPointCount=243;\\r\\n\\r\\n            if (i>=2)\\r\\n            {\\r\\n                if (this.ModifyIndexDialog) frame.ModifyIndexEvent=this.ModifyIndexDialog.DoModal;        //绑定菜单事件\\r\\n                if (this.ChangeIndexDialog) frame.ChangeIndexEvent=this.ChangeIndexDialog.DoModal;\\r\\n            }\\r\\n\\r\\n            var DEFAULT_HORIZONTAL=[9,8,7,6,5,4,3,2,1];\\r\\n            frame.HorizontalMax=DEFAULT_HORIZONTAL[0];\\r\\n            frame.HorizontalMin=DEFAULT_HORIZONTAL[DEFAULT_HORIZONTAL.length-1];\\r\\n\\r\\n            if (i==0)\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitMinutePriceY();\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('price');\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitY();\\r\\n                frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            }\\r\\n\\r\\n            frame.YSplitOperator.Frame=frame;\\r\\n            frame.YSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator=new FrameSplitMinuteX();\\r\\n            frame.XSplitOperator.Frame=frame;\\r\\n            frame.XSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            if (i!=windowCount-1) frame.XSplitOperator.ShowText=false;\\r\\n            frame.XSplitOperator.Operator();\\r\\n\\r\\n            for(var j in DEFAULT_HORIZONTAL)\\r\\n            {\\r\\n                frame.HorizontalInfo[j]= new CoordinateInfo();\\r\\n                frame.HorizontalInfo[j].Value=DEFAULT_HORIZONTAL[j];\\r\\n                if (i==0 && j==frame.HorizontalMin) continue;\\r\\n\\r\\n                frame.HorizontalInfo[j].Message[1]=DEFAULT_HORIZONTAL[j].toString();\\r\\n                frame.HorizontalInfo[j].Font=\\\"14px 微软雅黑\\\";\\r\\n            }\\r\\n\\r\\n            var subFrame=new SubFrameItem();\\r\\n            subFrame.Frame=frame;\\r\\n            if (i==0)\\r\\n                subFrame.Height=20;\\r\\n            else\\r\\n                subFrame.Height=10;\\r\\n\\r\\n            this.Frame.SubFrame[i]=subFrame;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateSubFrameItem=function(id)\\r\\n    {\\r\\n        var border=new ChartBorder();\\r\\n        border.UIElement=this.UIElement;\\r\\n\\r\\n        var frame=new MinuteFrame();\\r\\n        frame.Canvas=this.Canvas;\\r\\n        frame.ChartBorder=border;\\r\\n        frame.Identify=id;                   //窗口序号\\r\\n        frame.XPointCount=243;\\r\\n\\r\\n        if (id>=2)\\r\\n        {\\r\\n            if (this.ModifyIndexDialog) frame.ModifyIndexEvent=this.ModifyIndexDialog.DoModal;        //绑定菜单事件\\r\\n            if (this.ChangeIndexDialog) frame.ChangeIndexEvent=this.ChangeIndexDialog.DoModal;\\r\\n        }\\r\\n\\r\\n        var DEFAULT_HORIZONTAL=[9,8,7,6,5,4,3,2,1];\\r\\n        frame.HorizontalMax=DEFAULT_HORIZONTAL[0];\\r\\n        frame.HorizontalMin=DEFAULT_HORIZONTAL[DEFAULT_HORIZONTAL.length-1];\\r\\n\\r\\n        frame.YSplitOperator=new FrameSplitY();\\r\\n        frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n        frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        frame.YSplitOperator.Frame=frame;\\r\\n        frame.YSplitOperator.ChartBorder=border;\\r\\n        frame.XSplitOperator=new FrameSplitMinuteX();\\r\\n        frame.XSplitOperator.Frame=frame;\\r\\n        frame.XSplitOperator.ChartBorder=border;\\r\\n        frame.XSplitOperator.ShowText=false;\\r\\n        frame.XSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n        frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n\\r\\n        //K线数据绑定\\r\\n        var xPointCouont=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n        frame.XPointCount=xPointCouont;\\r\\n        frame.Data=this.ChartPaint[0].Data;\\r\\n\\r\\n        for(var j in DEFAULT_HORIZONTAL)\\r\\n        {\\r\\n            frame.HorizontalInfo[j]= new CoordinateInfo();\\r\\n            frame.HorizontalInfo[j].Value=DEFAULT_HORIZONTAL[j];\\r\\n            frame.HorizontalInfo[j].Message[1]=DEFAULT_HORIZONTAL[j].toString();\\r\\n            frame.HorizontalInfo[j].Font=\\\"14px 微软雅黑\\\";\\r\\n        }\\r\\n\\r\\n        var subFrame=new SubFrameItem();\\r\\n        subFrame.Frame=frame;\\r\\n        subFrame.Height=10;\\r\\n\\r\\n        return subFrame;\\r\\n    }\\r\\n\\r\\n    this.UpdateXShowText=function()\\r\\n    {\\r\\n        var bLastFrame=true;\\r\\n        for(var i=this.Frame.SubFrame.length-1;i>=0;--i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            var subFrame=this.Frame.SubFrame[i];\\r\\n\\r\\n            if (bLastFrame)\\r\\n            {\\r\\n                item.XSplitOperator.ShowText=true;\\r\\n                if (subFrame.Height>0) bLastFrame=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                item.XSplitOperator.ShowText=false;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //删除某一个窗口的指标\\r\\n    this.DeleteIndexPaint=function(windowIndex)\\r\\n    {\\r\\n        let paint=new Array();          //踢出当前窗口的指标画法\\r\\n        for(let i in this.ChartPaint)\\r\\n        {\\r\\n            let item=this.ChartPaint[i];\\r\\n\\r\\n            if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)\\r\\n                paint.push(item);\\r\\n        }\\r\\n\\r\\n        //清空指定最大最小值\\r\\n        this.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin=null;\\r\\n        this.Frame.SubFrame[windowIndex].Frame.IsLocked=false;          //解除上锁\\r\\n\\r\\n        this.ChartPaint=paint;\\r\\n\\r\\n        //清空东条标题\\r\\n        var titleIndex=windowIndex+1;\\r\\n        this.TitlePaint[titleIndex].Data=[];\\r\\n        this.TitlePaint[titleIndex].Title=null;\\r\\n    }\\r\\n\\r\\n    this.CreateStockInfo=function()\\r\\n    {\\r\\n        this.ExtendChartPaint[0]=new StockInfoExtendChartPaint();\\r\\n        this.ExtendChartPaint[0].Canvas=this.Canvas;\\r\\n        this.ExtendChartPaint[0].ChartBorder=this.Frame.ChartBorder;\\r\\n        this.ExtendChartPaint[0].ChartFrame=this.Frame;\\r\\n\\r\\n        this.Frame.ChartBorder.Right=300;\\r\\n    }\\r\\n\\r\\n    //创建主图K线画法\\r\\n    this.CreateMainKLine=function()\\r\\n    {\\r\\n        //分钟线\\r\\n        var minuteLine=new ChartMinutePriceLine();\\r\\n        minuteLine.Canvas=this.Canvas;\\r\\n        minuteLine.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        minuteLine.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        minuteLine.Name=\\\"Minute-Line\\\";\\r\\n        minuteLine.Color=g_JSChartResource.Minute.PriceColor;\\r\\n        minuteLine.AreaColor=g_JSChartResource.Minute.AreaPriceColor;\\r\\n        minuteLine.GetEventCallback=(id)=>{ return this.GetEventCallback(id); };\\r\\n\\r\\n        this.ChartPaint[0]=minuteLine;\\r\\n\\r\\n        //分钟线均线\\r\\n        var averageLine=new ChartMinutePriceLine();\\r\\n        averageLine.Canvas=this.Canvas;\\r\\n        averageLine.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        averageLine.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        averageLine.Name=\\\"Minute-Average-Line\\\";\\r\\n        averageLine.Color=g_JSChartResource.Minute.AvPriceColor;\\r\\n        averageLine.IsDrawArea=false;\\r\\n        this.ChartPaint[1]=averageLine;\\r\\n\\r\\n        //成交量\\r\\n        var volLine=new ChartMinuteVolumBar();\\r\\n        volLine.Color=g_JSChartResource.Minute.VolBarColor;\\r\\n        volLine.Canvas=this.Canvas;\\r\\n        volLine.ChartBorder=this.Frame.SubFrame[1].Frame.ChartBorder;\\r\\n        volLine.ChartFrame=this.Frame.SubFrame[1].Frame;\\r\\n        volLine.Name=\\\"Minute-Vol-Bar\\\";\\r\\n        this.ChartPaint[2]=volLine;\\r\\n\\r\\n        this.TitlePaint[0]=new DynamicMinuteTitlePainting();\\r\\n        this.TitlePaint[0].Frame=this.Frame.SubFrame[0].Frame;\\r\\n        this.TitlePaint[0].Canvas=this.Canvas;\\r\\n        this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint;    //绑定叠加\\r\\n        this.TitlePaint[0].LanguageID=this.LanguageID;\\r\\n        this.TitlePaint[0].CallAcutionXOperator=new CallAcutionXOperator();\\r\\n        this.TitlePaint[0].CallAcutionXOperator.Frame=this.Frame.SubFrame[0].Frame;\\r\\n    }\\r\\n\\r\\n    //切换成 脚本指标\\r\\n    this.ChangeScriptIndex=function(windowIndex,indexData,option)\\r\\n    {\\r\\n        this.DeleteIndexPaint(windowIndex);\\r\\n        this.WindowIndex[windowIndex]=new ScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n\\r\\n        var bindData=this.SourceData;\\r\\n        this.BindIndexData(windowIndex,bindData);   //执行脚本\\r\\n\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ChangeIndex=function(windowIndex,indexName,option)\\r\\n    {\\r\\n        if (this.Frame.SubFrame.length<3) return;\\r\\n\\r\\n        //查找系统指标\\r\\n        let scriptData = new JSIndexScript();\\r\\n        let indexInfo = scriptData.Get(indexName);\\r\\n        if (!indexInfo) return;\\r\\n        if (windowIndex<2) windowIndex=2;\\r\\n        if (windowIndex>=this.Frame.SubFrame.length) windowIndex=2;\\r\\n\\r\\n        let indexData =\\r\\n            {\\r\\n                Name:indexInfo.Name, Script:indexInfo.Script, Args: indexInfo.Args, ID:indexName ,\\r\\n                //扩展属性 可以是空\\r\\n                KLineType:indexInfo.KLineType,  YSpecificMaxMin:indexInfo.YSpecificMaxMin,  YSplitScale:indexInfo.YSplitScale,\\r\\n                FloatPrecision:indexInfo.FloatPrecision, Condition:indexInfo.Condition,StringFormat:indexInfo.StringFormat,\\r\\n                OutName:indexInfo.OutName\\r\\n            };\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.FloatPrecision>=0) indexData.FloatPrecision=option.FloatPrecision;\\r\\n            if (option.StringFormat>0) indexData.StringFormat=option.StringFormat;\\r\\n            if (option.Args) indexData.Args=option.Args;\\r\\n        }\\r\\n\\r\\n        return this.ChangeScriptIndex(windowIndex, indexData,option);\\r\\n    }\\r\\n\\r\\n    //设置指标窗口个数\\r\\n    this.ChangeIndexWindowCount=function(count)\\r\\n    {\\r\\n        if (count<2) return;   //1,2个窗口固定的不能动\\r\\n        if (this.Frame.SubFrame.length==count) return;\\r\\n\\r\\n        var currentLength=this.Frame.SubFrame.length;\\r\\n        if (currentLength>count)\\r\\n        {\\r\\n            for(var i=currentLength-1;i>=count;--i)\\r\\n            {\\r\\n                this.DeleteIndexPaint(i);\\r\\n                var item=this.Frame.SubFrame[i].Frame;\\r\\n                if (item.ClearToolbar) item.ClearToolbar();\\r\\n            }\\r\\n\\r\\n            this.Frame.SubFrame.splice(count,currentLength-count);\\r\\n            this.WindowIndex.splice(count,currentLength-count);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //创建新的指标窗口\\r\\n            for(var i=currentLength;i<count;++i)\\r\\n            {\\r\\n                var subFrame=this.CreateSubFrameItem(i);\\r\\n                this.Frame.SubFrame[i]=subFrame;\\r\\n                var titlePaint=new DynamicChartTitlePainting();\\r\\n                titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n                titlePaint.Canvas=this.Canvas;\\r\\n                titlePaint.LanguageID=this.LanguageID;\\r\\n                titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n                this.TitlePaint[i+1]=titlePaint;\\r\\n            }\\r\\n\\r\\n            //创建指标\\r\\n            const indexName=[\\\"RSI\\\",\\\"MACD\\\",\\\"DMA\\\",\\\"DMI\\\",\\\"KDJ\\\",\\\"WR\\\"];\\r\\n            let scriptData = new JSIndexScript();\\r\\n            for(var i=currentLength;i<count;++i)\\r\\n            {\\r\\n                var name=indexName[i%indexName.length];\\r\\n                let indexInfo = scriptData.Get(name);\\r\\n                this.WindowIndex[i] = new ScriptIndex(indexInfo.Name, indexInfo.Script, indexInfo.Args,indexInfo);    //脚本执行\\r\\n                var bindData=this.SourceData;\\r\\n                this.BindIndexData(i,bindData);   //执行脚本\\r\\n            }\\r\\n\\r\\n            //最后一个显示X轴坐标\\r\\n            for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n            {\\r\\n                var item=this.Frame.SubFrame[i].Frame;\\r\\n                if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n                else item.XSplitOperator.ShowText=false;\\r\\n            }\\r\\n\\r\\n            this.UpdataDataoffset();           //更新数据偏移\\r\\n        }\\r\\n\\r\\n        this.UpdateXShowText();\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.ResetFrameXYSplit();\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.RemoveIndexWindow=function(id)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[MinuteChartContainer::RemoveIndexWindow] remove id', id);\\r\\n        if (id<2) return;\\r\\n        if (!this.Frame.SubFrame) return;\\r\\n        if (id>=this.Frame.SubFrame.length) return;\\r\\n\\r\\n        var delFrame=this.Frame.SubFrame[id].Frame;\\r\\n        this.DeleteIndexPaint(id);\\r\\n        this.Frame.SubFrame[id].Frame.ClearToolbar();\\r\\n        this.Frame.SubFrame.splice(id,1);\\r\\n        this.WindowIndex.splice(id,1);\\r\\n        this.TitlePaint.splice(id+1,1); //删除对应的动态标题\\r\\n\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            if (i==this.Frame.SubFrame.length-1) item.XSplitOperator.ShowText=true;\\r\\n            else item.XSplitOperator.ShowText=false;\\r\\n\\r\\n            item.Identify=i;\\r\\n        }\\r\\n\\r\\n        /*\\r\\n        if (this.ChartDrawPicture.length>0)\\r\\n        {\\r\\n            var aryDrawPicture=[];\\r\\n            for(var i in this.ChartDrawPicture)\\r\\n            {\\r\\n                var item=this.ChartDrawPicture[i];\\r\\n                if (item.Frame==delFrame) continue;\\r\\n                aryDrawPicture.push(item);\\r\\n            }\\r\\n\\r\\n            this.ChartDrawPicture=aryDrawPicture;\\r\\n        }\\r\\n        */\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.UpdateFrameMaxMin();\\r\\n        this.ResetFrameXYSplit();\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //切换股票代码\\r\\n    this.ChangeSymbol=function(symbol)\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        this.Symbol=symbol;\\r\\n        this.ResetOverlaySymbolStatus();\\r\\n        this.ReloadChartDrawPicture();\\r\\n\\r\\n        if (symbol)\\r\\n        {\\r\\n            this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n            this.ChartSplashPaint.EnableSplash(true);    //增加下载动画\\r\\n            this.Draw();\\r\\n            this.RequestData();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.DrawEmpty();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ChangeDayCount=function(count)\\r\\n    {\\r\\n        if (count<0 || count>10) return;\\r\\n        this.DayCount=count;\\r\\n\\r\\n        if (this.DayCount>1)\\r\\n        {\\r\\n            this.ChartDrawPicture=[];\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.ReloadChartDrawPicture();\\r\\n        }\\r\\n\\r\\n        this.ResetOverlaySymbolStatus();\\r\\n        this.RequestData();\\r\\n    }\\r\\n\\r\\n    //叠加股票\\r\\n    this.OverlaySymbol=function(symbol,option)\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (item.Symbol==symbol)\\r\\n            {\\r\\n                console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${symbol} exist.`);\\r\\n                return false;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var paint=new ChartOverlayMinutePriceLine();\\r\\n        paint.Canvas=this.Canvas;\\r\\n        paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        paint.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        paint.Name=\\\"Overlay-Minute\\\";\\r\\n        paint.Symbol=symbol;\\r\\n        if (option && option.Color) paint.Color=option.Color; //外部设置颜色\\r\\n        else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];\\r\\n        ++g_JSChartResource.OverlaySymbol.Random;\\r\\n        if (this.ChartPaint[0].YClose>0 && this.ChartPaint[0].Data) //绑定主图数据\\r\\n        {\\r\\n            paint.MainData=this.ChartPaint[0].Data;\\r\\n            paint.MainYClose=this.ChartPaint[0].YClose;\\r\\n        }\\r\\n\\r\\n        this.OverlayChartPaint.push(paint);\\r\\n\\r\\n        if (this.DayCount<=1) this.RequestOverlayMinuteData();               //请求数据\\r\\n        else this.RequestOverlayHistoryMinuteData();\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ResetOverlaySymbolStatus=function()\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.Status=OVERLAY_STATUS_ID.STATUS_NONE_ID;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //删除一个叠加股票\\r\\n    this.DeleteOverlaySymbol=function(symbol)\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            if (item.Symbol===symbol)\\r\\n            {\\r\\n                item.IsDelete=true;\\r\\n                this.OverlayChartPaint.splice(i,1);\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                return true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        console.warn(`[MinuteChartContainer::DeleteOverlaySymbol] overlay symbol=${symbol} not exist.`)\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    //取消叠加股票\\r\\n    this.ClearOverlaySymbol=function()\\r\\n    {\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.IsDelete=true;\\r\\n        }\\r\\n        this.OverlayChartPaint=[];\\r\\n        this.Frame.SubFrame[0].Frame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;\\r\\n        this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint;    //绑定叠加\\r\\n        this.UpdateFrameMaxMin();\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.ShowBeforeData=function(isShow, option)\\r\\n    {\\r\\n        this.ShowCallAuctionData({Left:isShow}, option);\\r\\n    }\\r\\n\\r\\n    //集合竞价设置 obj={ Left:, Right: }\\r\\n    this.ShowCallAuctionData=function(obj, option)\\r\\n    {\\r\\n        if (!obj) return;\\r\\n\\r\\n        var optionChanged=false;    //配置修改\\r\\n        if (IFrameSplitOperator.IsBool(obj.Left) && this.IsShowBeforeData!=obj.Left)\\r\\n        {\\r\\n            this.IsShowBeforeData=obj.Left;\\r\\n            optionChanged=true;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsBool(obj.Right) && this.IsShowAfterData!=obj.Right)\\r\\n        {\\r\\n            this.IsShowAfterData=obj.Right;\\r\\n            optionChanged=true;\\r\\n        }\\r\\n\\r\\n        if (obj.MultiDay)\\r\\n        {\\r\\n            var item=obj.MultiDay;\\r\\n            if (IFrameSplitOperator.IsBool(item.Left) && this.IsShowMultiDayBeforeData!=item.Left)\\r\\n            {\\r\\n                this.IsShowMultiDayBeforeData=item.Left;\\r\\n                optionChanged=true;\\r\\n            }\\r\\n\\r\\n            if (IFrameSplitOperator.IsBool(item.Right) && this.IsShowMultiDayAfterData!=item.Right)\\r\\n            {\\r\\n                this.IsShowMultiDayAfterData=item.Right;\\r\\n                optionChanged=true;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.BeforeOpen)\\r\\n            {\\r\\n                var item=option.BeforeOpen;\\r\\n                if (IFrameSplitOperator.IsNumber(item.Left) && this.ExtendWidth.Left!=item.Left)\\r\\n                {\\r\\n                    this.ExtendWidth.Left=item.Left;\\r\\n                    optionChanged=true;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (option.AfterClose)\\r\\n            {\\r\\n                var item=option.AfterClose;\\r\\n                if (IFrameSplitOperator.IsNumber(item.Right) && this.ExtendWidth.Right!=item.Right)\\r\\n                {\\r\\n                    this.ExtendWidth.Right=item.Right;\\r\\n                    optionChanged=true;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (option.MultiDay)\\r\\n            {\\r\\n                var item=option.MultiDay;\\r\\n                if (IFrameSplitOperator.IsNumber(item.Left) && this.MultiDayExtendWidth.Left!=item.Left)\\r\\n                {\\r\\n                    this.MultiDayExtendWidth.Left=item.Left;\\r\\n                    optionChanged=true;\\r\\n                }\\r\\n\\r\\n                if (IFrameSplitOperator.IsNumber(item.Right)&& this.MultiDayExtendWidth.Right!=item.Right)\\r\\n                {\\r\\n                    this.MultiDayExtendWidth.Right=item.Right;\\r\\n                    optionChanged=true;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (optionChanged) this.RequestData();\\r\\n    }\\r\\n\\r\\n    this.RequestData=function()\\r\\n    {\\r\\n        if (this.DayCount<=1) this.RequestMinuteData();\\r\\n        else this.RequestHistoryMinuteData();\\r\\n    }\\r\\n\\r\\n    this.ChangeDrawType=function(type)\\r\\n    {\\r\\n        if (this.ChartPaint.length<=0) return;\\r\\n\\r\\n        if (type==0) this.ChartPaint[0].IsDrawArea=true;\\r\\n        else if (type==1) this.ChartPaint[0].IsDrawArea=false;\\r\\n        else return;\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //请求历史分钟数据\\r\\n    this.RequestHistoryMinuteData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.IsBeforeData=false;\\r\\n        this.IsAfterData=false;\\r\\n        this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n        this.ChartSplashPaint.EnableSplash(true);\\r\\n        this.Draw();\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'MinuteChartContainer::RequestHistoryMinuteData', //类名::函数\\r\\n                    Explain:'多日分时数据',\\r\\n                    Request:{ Url:self.HistoryMinuteApiUrl, Data:{daycount:self.DayCount, symbol:self.Symbol}, Type:'POST' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryMinuteData(data);\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.HistoryMinuteApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"symbol\\\": self.Symbol,\\r\\n                    \\\"daycount\\\": self.DayCount\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryMinuteData(data);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryMinuteData=function(data)\\r\\n    {\\r\\n        this.DayData=MinuteChartContainer.JsonDataToMinuteDataArray(data);\\r\\n        this.ColorLineData=MinuteChartContainer.JsonDataToHistoryMinuteLineColorData(data);\\r\\n        this.MultiDayBeforeOpenData=MinuteChartContainer.JosnDataToBeforeOpenDataArray(data);\\r\\n        this.MultiDayAfterCloseData=MinuteChartContainer.JosnDataToAfterCloseDataArray(data);\\r\\n        this.CaclutateCallCationYRange();\\r\\n        this.Symbol=data.symbol;\\r\\n        this.Name=data.name;\\r\\n        this.SetCallCationDataBorder(\\r\\n            {\\r\\n                Left:false, Right:false,\\r\\n                MultiDay:{ Left:this.IsShowMultiDayBeforeData, Right:this.IsShowMultiDayAfterData }\\r\\n            } );\\r\\n        this.CaclutateLimitPrice(this.DayData[0].YClose, data.data[0].limitprice); //计算涨停价格\\r\\n        this.UpdateHistoryMinuteUI();\\r\\n        this.RecvMinuteDataEvent();\\r\\n        this.RequestOverlayHistoryMinuteData();\\r\\n\\r\\n        this.BindAllOverlayIndexData(this.SourceData);\\r\\n\\r\\n        this.AutoUpdate();\\r\\n    }\\r\\n\\r\\n    this.CaclutateCallCationYRange=function()\\r\\n    {\\r\\n        //多日集合竞价Y轴统一成交量\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData))\\r\\n        {\\r\\n            var range={ Max:null, Min:null };\\r\\n            for(var i in this.MultiDayAfterCloseData)\\r\\n            {\\r\\n                var item=this.MultiDayAfterCloseData[i];\\r\\n                if (range.Max==null) range.Max=item.VolMax;\\r\\n                else if (range.Max<item.VolMax) range.Max=item.VolMax;\\r\\n\\r\\n                if (range.Min==null) range.Min=item.VolMin;\\r\\n                else if (range.Min>item.VolMin) range.Min=item.VolMin;\\r\\n            }\\r\\n\\r\\n            for(var i in this.MultiDayAfterCloseData)\\r\\n            {\\r\\n                var item=this.MultiDayAfterCloseData[i];\\r\\n                item.VolMax=range.Max;\\r\\n                item.VolMin=range.Min;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData))\\r\\n        {\\r\\n            var range={ Max:null, Min:null };\\r\\n            for(var i in this.MultiDayBeforeOpenData)\\r\\n            {\\r\\n                var item=this.MultiDayBeforeOpenData[i];\\r\\n                if (range.Max==null) range.Max=item.VolMax;\\r\\n                else if (range.Max<item.VolMax) range.Max=item.VolMax;\\r\\n\\r\\n                if (range.Min==null) range.Min=item.VolMin;\\r\\n                else if (range.Min>item.VolMin) range.Min=item.VolMin;\\r\\n            }\\r\\n\\r\\n            for(var i in this.MultiDayBeforeOpenData)\\r\\n            {\\r\\n                var item=this.MultiDayBeforeOpenData[i];\\r\\n                item.VolMax=range.Max;\\r\\n                item.VolMin=range.Min;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.UpdateHistoryMinuteUI=function()\\r\\n    {\\r\\n        var allMinuteData=this.HistoryMinuteDataToArray(this.DayData);\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=allMinuteData;\\r\\n\\r\\n        this.SourceData=sourceData;\\r\\n        this.TradeDate=this.DayData[0].Date;\\r\\n        this.Frame.SetDayCount(this.DayData.length);\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n\\r\\n        var yClose=this.DayData[0].YClose;\\r\\n        var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);\\r\\n        if (IFrameSplitOperator.IsNumber(this.DayData[0].YClearing) && isFutures) yClose=this.DayData[0].YClearing; //期货使用前结算价\\r\\n        this.BindMainData(sourceData,yClose);\\r\\n\\r\\n        //外汇 均线暂时不用\\r\\n        if (MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol)) this.ChartPaint[1].Data=null;\\r\\n\\r\\n        if (this.Frame.SubFrame.length>2)\\r\\n        {\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=allMinuteData;\\r\\n            for(var i=2; i<this.Frame.SubFrame.length; ++i)\\r\\n            {\\r\\n                this.BindIndexData(i,bindData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(let i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            item.Frame.XSplitOperator.Symbol=this.Symbol;\\r\\n            item.Frame.XSplitOperator.DayCount=this.DayData.length;\\r\\n            item.Frame.XSplitOperator.DayData=this.DayData;\\r\\n            item.Frame.XSplitOperator.Operator();   //调整X轴个数\\r\\n            item.Frame.XSplitOperator.IsBeforeData=this.IsBeforeData;\\r\\n            item.Frame.XSplitOperator.IsAfterData=this.IsAfterData;\\r\\n            item.Frame.YSplitOperator.Symbol=this.Symbol;\\r\\n            item.Frame.YSplitOperator.IsBeforeData=this.IsBeforeData;\\r\\n            item.Frame.YSplitOperator.IsAfterData=this.IsAfterData;\\r\\n\\r\\n            for(var j in item.OverlayIndex) //子坐标X轴个数同步\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                overlayItem.Frame.XPointCount=item.Frame.XPointCount;\\r\\n                overlayItem.Frame.MinuteCount=item.Frame.MinuteCount;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatY.Symbol=this.Symbol;\\r\\n        this.ChartCorssCursor.StringFormatX.Symbol=this.Symbol;\\r\\n        this.ChartCorssCursor.StringFormatX.IsBeforeData=this.IsBeforeData;\\r\\n        this.ChartCorssCursor.StringFormatX.IsAfterData=this.IsAfterData;\\r\\n        this.TitlePaint[0].IsShowDate=true;\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.HistoryMinuteDataToArray=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        for(var i=data.length-1; i>=0;--i)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            for(var j in item.Data)\\r\\n            {\\r\\n                result.push(item.Data[j]);\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.UpdateLatestMinuteData=function(data,date)\\r\\n    {\\r\\n        for(var i in this.DayData)\\r\\n        {\\r\\n            var item=this.DayData[i];\\r\\n            if (item.Date===date)\\r\\n            {\\r\\n                item.Data=data;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //请求分钟数据\\r\\n    this.RequestMinuteData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n\\r\\n        var fields=\\r\\n            [\\r\\n                \\\"name\\\",\\\"symbol\\\",\\r\\n                \\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\r\\n                \\\"vol\\\",\\\"amount\\\",\\r\\n                \\\"date\\\",\\\"time\\\",\\r\\n                \\\"minute\\\",\\\"minutecount\\\"\\r\\n            ];\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol))\\r\\n        {   //期货的需要加上结算价\\r\\n            fields.push(\\\"clearing\\\");\\r\\n            fields.push(\\\"yclearing\\\");\\r\\n        }\\r\\n\\r\\n        //  盘前数据(A股)\\r\\n        this.IsBeforeData=false;\\r\\n        if (this.IsShowBeforeData && this.DayCount===1 && MARKET_SUFFIX_NAME.IsSHSZStockA(self.Symbol))\\r\\n        {\\r\\n            this.IsBeforeData=true;\\r\\n            fields.push('before');\\r\\n        }\\r\\n\\r\\n        this.IsAfterData=false;\\r\\n        if (this.IsShowAfterData && this.DayCount===1 && MARKET_SUFFIX_NAME.IsSHSZStockA(self.Symbol))\\r\\n        {\\r\\n            this.IsAfterData=true;\\r\\n        }\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var callCation=\\r\\n                {\\r\\n                    Before:(this.IsShowBeforeData && this.DayCount===1),\\r\\n                    After:(this.IsShowAfterData && this.DayCount===1)\\r\\n                }   //集合竞价\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'MinuteChartContainer::RequestMinuteData', //类名::函数名\\r\\n                    Explain:'最新分时数据',\\r\\n                    Request:{ Url:self.MinuteApiUrl, Data:{field:fields, symbol:[self.Symbol], callcation:callCation }, Type:'POST' },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvMinuteData(data);\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.MinuteApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fields,\\r\\n                    \\\"symbol\\\": [self.Symbol],\\r\\n                    \\\"start\\\": -1\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvMinuteData(data);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteDataEvent=function()\\r\\n    {\\r\\n        if (!this.mapEvent.has(JSCHART_EVENT_ID.RECV_MINUTE_DATA)) return;\\r\\n\\r\\n        var event=this.mapEvent.get(JSCHART_EVENT_ID.RECV_MINUTE_DATA);\\r\\n        var data={ MinuteData:this.SourceData, Stock:{Symbol:this.Symbol, Name:this.Name } }\\r\\n        event.Callback(event,data,this);\\r\\n    }\\r\\n\\r\\n    this.UpdateLineColorData=function(data, date)\\r\\n    {\\r\\n        if (!this.ColorLineData)\\r\\n        {\\r\\n            this.ColorLineData=data;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n\\r\\n        //移除当前的\\r\\n        var aryColorLineData=this.ColorLineData.filter(function(item, index, arr)\\r\\n        {\\r\\n            return item.Date!=date;\\r\\n        });\\r\\n\\r\\n        if (IFrameSplitOperator.IsNonEmptyArray(data))\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                aryColorLineData.push(data[i]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        this.ColorLineData=aryColorLineData;\\r\\n    }\\r\\n\\r\\n    this.UpdateCallCationData=function(beforeOpenData,afterCloseData)\\r\\n    {\\r\\n        if (beforeOpenData && IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData))\\r\\n        {\\r\\n            var lastItem=this.MultiDayBeforeOpenData[this.MultiDayBeforeOpenData.length-1];\\r\\n            if (lastItem.Date==beforeOpenData.Date)\\r\\n                this.MultiDayBeforeOpenData[this.MultiDayBeforeOpenData.length-1]=beforeOpenData;\\r\\n        }\\r\\n\\r\\n        if (afterCloseData && IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData))\\r\\n        {\\r\\n            var lastItem=this.MultiDayAfterCloseData[this.MultiDayBeforeOpenData.length-1];\\r\\n            if (lastItem.Date==afterCloseData.Date)\\r\\n                this.MultiDayAfterCloseData[this.MultiDayAfterCloseData.length-1]=afterCloseData;\\r\\n        }\\r\\n\\r\\n        this.CaclutateCallCationYRange();\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteData=function(data)\\r\\n    {\\r\\n        if (!data)\\r\\n        {\\r\\n            JSConsole.Chart.Warn(\\\"[MinuteChartContainer::RecvMinuteData] recv data is null\\\");\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var aryMinuteData=MinuteChartContainer.JsonDataToMinuteData(data);\\r\\n        var aryColorData=MinuteChartContainer.JsonDataToMinuteLineColorData(data);\\r\\n        this.BeforeOpenData=null;\\r\\n        this.AfterCloseData=null;\\r\\n        var beforeOpenData=MinuteChartContainer.JsonDataToBeforeOpenData(data);\\r\\n        var afterCloseData=MinuteChartContainer.JsonDataToAfterCloseData(data);\\r\\n\\r\\n        if (this.IsBeforeData) this.BeforeOpenData=beforeOpenData;\\r\\n        if (this.IsAfterData) this.AfterCloseData=afterCloseData;\\r\\n\\r\\n        if (this.DayCount>1)    //多日走势图\\r\\n        {\\r\\n            this.UpdateCallCationData(beforeOpenData,afterCloseData);\\r\\n            this.UpdateLineColorData(aryColorData,data.stock[0].date);\\r\\n            this.UpdateLatestMinuteData(aryMinuteData,data.stock[0].date);\\r\\n            this.UpdateHistoryMinuteUI();\\r\\n            this.RecvMinuteDataEvent();\\r\\n            this.RequestOverlayMinuteData();    //请求叠加数据 (主数据下载完再下载)\\r\\n            this.BindAllOverlayIndexData(this.SourceData);\\r\\n            this.AutoUpdate();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryMinuteData;\\r\\n\\r\\n        this.ColorLineData=aryColorData;\\r\\n\\r\\n        this.TradeDate=data.stock[0].date;\\r\\n        this.Frame.SetDayCount(1);  //单日数据\\r\\n\\r\\n        this.SourceData=sourceData;\\r\\n        this.Symbol=data.stock[0].symbol;\\r\\n        this.Name=data.stock[0].name;\\r\\n\\r\\n        this.SetCallCationDataBorder( { Left:this.IsBeforeData, Right:this.IsAfterData , MultiDay:{ Left:false, Right:false }} );\\r\\n\\r\\n        var yClose=data.stock[0].yclose;\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);\\r\\n        if (data.stock[0].yclearing>0 && isFutures) yClose=data.stock[0].yclearing; //期货使用前结算价\\r\\n        this.CaclutateLimitPrice(yClose, data.stock[0].limitprice); //计算涨停价格\\r\\n        var extendData=null;\\r\\n        if (data.stock[0].high>0 && data.stock[0].low>0) extendData={ High:data.stock[0].high, Low:data.stock[0].low };\\r\\n        this.BindMainData(sourceData,yClose, extendData);\\r\\n\\r\\n        if (this.Frame.SubFrame.length>2)\\r\\n        {\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryMinuteData;\\r\\n            for(var i=2; i<this.Frame.SubFrame.length; ++i)\\r\\n            {\\r\\n                this.BindIndexData(i,bindData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(let i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            item.Frame.XSplitOperator.Symbol=this.Symbol;\\r\\n            item.Frame.XSplitOperator.DayCount=1;\\r\\n            item.Frame.XSplitOperator.Operator();   //调整X轴个数\\r\\n            item.Frame.YSplitOperator.Symbol=this.Symbol;\\r\\n\\r\\n            for(var j in item.OverlayIndex) //子坐标X轴个数同步\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                overlayItem.Frame.XPointCount=item.Frame.XPointCount;\\r\\n                overlayItem.Frame.MinuteCount=item.Frame.MinuteCount;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatY.Symbol=this.Symbol;\\r\\n        this.ChartCorssCursor.StringFormatX.Symbol=this.Symbol;\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol)) this.TitlePaint[0].IsShowDate=false;\\r\\n\\r\\n        if (data.stock[0].IsHistoryMinute==true) this.TitlePaint[0].IsShowDate=true;\\r\\n\\r\\n        var chartInfo=this.GetChartMinuteInfo();\\r\\n        if (chartInfo) chartInfo.SourceData=this.SourceData;    //数据绑定到信息地雷上\\r\\n\\r\\n        this.RecvMinuteDataEvent();\\r\\n        this.RequestMinuteInfoData();\\r\\n        this.RequestOverlayMinuteData();//请求叠加数据 (主数据下载完再下载)\\r\\n        this.CreateChartDrawPictureByStorage(); //创建画图工具\\r\\n\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        this.BindAllOverlayIndexData(this.SourceData);\\r\\n\\r\\n        this.AutoUpdate();\\r\\n    }\\r\\n\\r\\n    this.CaclutateLimitPrice=function(yClose, limitData)\\r\\n    {\\r\\n        this.LimitPrice=null;\\r\\n        //var limitData=data.stock[0].limitprice;\\r\\n        if (limitData && limitData.max>0 && limitData.min>0)    //API里带涨停价格 直接使用\\r\\n        {\\r\\n            this.LimitPrice={ Max:limitData.max, Min:limitData.min };\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var range=MARKET_SUFFIX_NAME.GetLimitPriceRange(this.Symbol, this.Name);   //通过规则获取涨停价格\\r\\n        if (!range)\\r\\n        {\\r\\n            JSConsole.Chart.Log(`[MinuteChartContainer::CaclutateLimitPrice] ${this.Symbol} no limit price.`)\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //var yClose=data.stock[0].yclose;\\r\\n        if (yClose<=0) return;\\r\\n        this.LimitPrice={ Max:yClose*(1+range.Max), Min:yClose*(1+range.Min) };\\r\\n\\r\\n        JSConsole.Chart.Log(`[MinuteChartContainer::CaclutateLimitPrice] ${this.Symbol} yClose:${yClose} max:${this.LimitPrice.Max} min:${this.LimitPrice.Min}`);\\r\\n\\r\\n        this.LimitPrice.Max=parseFloat(this.LimitPrice.Max.toFixed(2));\\r\\n        this.LimitPrice.Min=parseFloat(this.LimitPrice.Min.toFixed(2));\\r\\n        JSConsole.Chart.Log(`[MinuteChartContainer::CaclutateLimitPrice] ${this.Symbol} tofixed(2) max:${this.LimitPrice.Max} min:${this.LimitPrice.Min}`);\\r\\n    }\\r\\n\\r\\n    //请求叠加数据 (主数据下载完再下载))\\r\\n    this.RequestOverlayMinuteData=function()\\r\\n    {\\r\\n        var self = this;\\r\\n        var date=this.TradeDate;    //最后一个交易日期\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            let item=this.OverlayChartPaint[i];\\r\\n            if (!item.MainData || !(item.MainYClose>0) ) continue;\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_NONE_ID) continue;\\r\\n            var symbol=item.Symbol;\\r\\n            if (!symbol) return;\\r\\n\\r\\n            item.Status=OVERLAY_STATUS_ID.STATUS_REQUESTDATA_ID;\\r\\n\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'MinuteChartContainer::RequestOverlayMinuteData', //类名::函数名\\r\\n                        Explain:'叠加股票最新分时数据',\\r\\n                        Request:{ Url:self.HistoryMinuteApiUrl, Data:{days:[date], symbol:symbol}, Type:'POST' },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOverlayMinuteData(data,item);\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) continue;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            //请求数据\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.HistoryMinuteApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"symbol\\\":symbol,\\r\\n                        \\\"days\\\": [date],\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOverlayMinuteData(data,item);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvOverlayMinuteData=function(data,paint)\\r\\n    {\\r\\n        if (paint.IsDelete) return;\\r\\n\\r\\n        var aryMinuteData=MinuteChartContainer.JsonDataToMinuteDataArray(data);\\r\\n\\r\\n        var sourceData=null;\\r\\n        var yClose;\\r\\n        if (this.DayCount>1)    //多日数据\\r\\n        {\\r\\n            if (aryMinuteData.length<=0) return;\\r\\n\\r\\n            var minuteData=aryMinuteData[0];\\r\\n            for(var i in paint.SourceData)\\r\\n            {\\r\\n                var item=paint.SourceData[i];\\r\\n                if (item.Date==minuteData.Date)\\r\\n                {\\r\\n                    paint.SourceData[i]=minuteData;\\r\\n                    var allMinuteData=this.HistoryMinuteDataToArray(paint.SourceData);\\r\\n                    var sourceData=new ChartData();\\r\\n                    sourceData.Data=allMinuteData;\\r\\n                    yClose=minuteData.YClose;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n            if (sourceData==null) return;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (aryMinuteData.length>0) sourceData=aryMinuteData[0];\\r\\n            else sourceData=new ChartData();\\r\\n            yClose=sourceData.YClose;\\r\\n        }\\r\\n\\r\\n        paint.Data=sourceData;\\r\\n        paint.Title=data.name;\\r\\n        paint.Symbol=data.symbol;\\r\\n        paint.YClose=yClose;\\r\\n        paint.Status=OVERLAY_STATUS_ID.STATUS_FINISHED_ID;\\r\\n\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.RequestOverlayHistoryMinuteData=function()\\r\\n    {\\r\\n        var self = this;\\r\\n        var days=[];\\r\\n        for(var i in this.DayData)\\r\\n        {\\r\\n            var item=this.DayData[i];\\r\\n            days.push(item.Date);\\r\\n        }\\r\\n        if (days.length<=0) return;\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            let item=this.OverlayChartPaint[i]\\r\\n            var symbol=item.Symbol;\\r\\n            if (!symbol) return;\\r\\n            if (item.Status!=OVERLAY_STATUS_ID.STATUS_NONE_ID) continue;\\r\\n\\r\\n            item.Status=OVERLAY_STATUS_ID.STATUS_REQUESTDATA_ID;\\r\\n\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'MinuteChartContainer::RequestOverlayHistoryMinuteData', //类名::函数名\\r\\n                        Explain:'叠加股票多日分时数据',\\r\\n                        Request:{ Url:self.HistoryMinuteApiUrl, Data:{days:days, symbol:symbol}, Type:'POST' },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOverlayHistoryMinuteData(data,item);\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.HistoryMinuteApiUrl,\\r\\n                data:{ \\\"symbol\\\": symbol, \\\"days\\\": days },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    item.Status=OVERLAY_STATUS_ID.STATUS_RECVDATA_ID;\\r\\n                    self.RecvOverlayHistoryMinuteData(data,item);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvOverlayHistoryMinuteData=function(data,paint)    //叠加历史的分钟数据\\r\\n    {\\r\\n        var dayData=MinuteChartContainer.JsonDataToMinuteDataArray(data);\\r\\n        var overlayDayData=[];\\r\\n        for(var i in this.DayData)\\r\\n        {\\r\\n            var item=this.DayData[i];\\r\\n            var bFind=false;\\r\\n            for(var j in dayData)\\r\\n            {\\r\\n                if (item.Date==dayData[j].Date)\\r\\n                {\\r\\n                    overlayDayData.push(dayData[i]);\\r\\n                    bFind=true;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n            if (!bFind) //当天不存在叠加数据, 存空\\r\\n            {\\r\\n                var empytData=new ChartData();\\r\\n                empytData.Date=item.Date;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        paint.SourceData=overlayDayData;\\r\\n        var allMinuteData=this.HistoryMinuteDataToArray(overlayDayData);\\r\\n        var yClose=overlayDayData[0].YClose;    //取最近一个交易日前收盘最为中轴线\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=allMinuteData;\\r\\n\\r\\n        paint.Data=sourceData;\\r\\n        paint.Title=data.name;\\r\\n        paint.Symbol=data.symbol;\\r\\n        paint.YClose=yClose;\\r\\n        paint.Status=OVERLAY_STATUS_ID.STATUS_FINISHED_ID;\\r\\n\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.CancelAutoUpdate=function()    //关闭停止更新\\r\\n    {\\r\\n        if (typeof (this.AutoUpdateTimer) == 'number')\\r\\n        {\\r\\n            clearTimeout(this.AutoUpdateTimer);\\r\\n            this.AutoUpdateTimer = undefined;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //数据自动更新\\r\\n    this.AutoUpdate=function()\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        if (!this.IsAutoUpdate) return;\\r\\n        if (!this.Symbol) return;\\r\\n\\r\\n        var self = this;\\r\\n        var marketStatus=MARKET_SUFFIX_NAME.GetMarketStatus(this.Symbol);\\r\\n        if (marketStatus==0 || marketStatus==3) return; //闭市,盘后\\r\\n\\r\\n        var frequency=this.AutoUpdateFrequency;\\r\\n        if (marketStatus==1) //盘前\\r\\n        {\\r\\n            this.AutoUpdateTimer=setTimeout(function()\\r\\n            {\\r\\n                self.AutoUpdate();\\r\\n            },frequency);\\r\\n        }\\r\\n        else if (marketStatus==2)   //盘中\\r\\n        {\\r\\n            this.AutoUpdateTimer=setTimeout(function()\\r\\n            {\\r\\n                self.ResetOverlaySymbolStatus();\\r\\n                self.RequestMinuteData();\\r\\n            },frequency);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.BindIndexData=function(windowIndex,hisData)\\r\\n    {\\r\\n        if (!this.WindowIndex[windowIndex]) return;\\r\\n\\r\\n        if (typeof(this.WindowIndex[windowIndex].RequestData)==\\\"function\\\")          //数据需要另外下载的.\\r\\n        {\\r\\n            this.WindowIndex[windowIndex].RequestData(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n        if (typeof(this.WindowIndex[windowIndex].ExecuteScript)=='function')\\r\\n        {\\r\\n            this.WindowIndex[windowIndex].ExecuteScript(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.WindowIndex[windowIndex].BindData(this,windowIndex,hisData);\\r\\n    }\\r\\n\\r\\n    //绑定分钟数据\\r\\n    this.BindMainData=function(minuteData,yClose, extendData)\\r\\n    {\\r\\n        var multiBeforeOpenData=this.IsShowMultiDayBeforeData?this.MultiDayBeforeOpenData:null;\\r\\n        var multiAfterCloseData=this.IsShowMultiDayAfterData?this.MultiDayAfterCloseData:null;\\r\\n\\r\\n        //分钟数据\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=minuteData.GetClose();\\r\\n        this.ChartPaint[0].Data=bindData;\\r\\n        this.ChartPaint[0].YClose=yClose;\\r\\n        this.ChartPaint[0].NotSupportMessage=null;\\r\\n        this.ChartPaint[0].IsShowLead=false;\\r\\n        this.ChartPaint[0].LeadData=null;\\r\\n        this.ChartPaint[0].BeforeOpenData=this.BeforeOpenData;\\r\\n        this.ChartPaint[0].AfterCloseData=this.AfterCloseData;\\r\\n        this.ChartPaint[0].MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n        this.ChartPaint[0].MultiDayAfterCloseData=multiAfterCloseData;\\r\\n        this.ChartPaint[0].ColorLineData=this.ColorLineData;    //自定义分段颜色\\r\\n        this.ChartPaint[0].Source=minuteData;\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol) && this.DayCount==1 && this.IsShowLead)  //指数显示领先指标\\r\\n        {\\r\\n            var bindLeadData=new ChartData();\\r\\n            bindLeadData.Data=minuteData.GetLead();\\r\\n            this.ChartPaint[0].LeadData=bindLeadData;\\r\\n            this.ChartPaint[0].IsShowLead=true;\\r\\n        }\\r\\n\\r\\n        var firstFrame=this.Frame.SubFrame[0].Frame;\\r\\n\\r\\n        firstFrame.YSplitOperator.YClose=yClose;\\r\\n        firstFrame.YSplitOperator.Data=bindData;\\r\\n        this.Frame.Data=this.ChartPaint[0].Data;\\r\\n        this.Frame.SourceData=minuteData;\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i].Frame;\\r\\n            item.Data=minuteData;  //每个子窗口都绑定下数据\\r\\n        }\\r\\n\\r\\n        //均线\\r\\n        bindData=new ChartData();\\r\\n        bindData.Data=minuteData.GetMinuteAvPrice();\\r\\n        this.ChartPaint[1].Data=bindData;\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        if (MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol))    //外汇没有均线\\r\\n            this.ChartPaint[1].Data=null;\\r\\n        else if (MARKET_SUFFIX_NAME.IsShowAvPrice && !MARKET_SUFFIX_NAME.IsShowAvPrice(upperSymbol))    //外部控制是否显示均线\\r\\n            this.ChartPaint[1].Data=null;\\r\\n\\r\\n        firstFrame.YSplitOperator.AverageData=bindData;\\r\\n        firstFrame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;\\r\\n        firstFrame.YSplitOperator.LimitPrice=this.LimitPrice;\\r\\n        firstFrame.YSplitOperator.MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n        firstFrame.YSplitOperator.MultiDayAfterCloseData=multiAfterCloseData;\\r\\n        if (extendData)\\r\\n        {\\r\\n            firstFrame.YSplitOperator.High=extendData.High;\\r\\n            firstFrame.YSplitOperator.Low=extendData.Low;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            firstFrame.YSplitOperator.High=null;\\r\\n            firstFrame.YSplitOperator.Low=null;\\r\\n        }\\r\\n\\r\\n        //成交量\\r\\n        this.ChartPaint[2].Data=minuteData;\\r\\n        this.ChartPaint[2].YClose=yClose;\\r\\n        this.ChartPaint[2].Symbol=this.Symbol;\\r\\n        this.ChartPaint[2].BeforeOpenData=this.BeforeOpenData;\\r\\n        this.ChartPaint[2].AfterCloseData=this.AfterCloseData;\\r\\n        this.ChartPaint[2].MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n        this.ChartPaint[2].MultiDayAfterCloseData=multiAfterCloseData;\\r\\n\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n\\r\\n            item.Frame.YSplitOperator.BeforeOpenData=this.BeforeOpenData;\\r\\n            item.Frame.YSplitOperator.IsBeforeData=this.IsBeforeData;\\r\\n            item.Frame.YSplitOperator.AfterCloseData=this.AfterCloseData;\\r\\n            item.Frame.YSplitOperator.IsAfterData=this.IsAfterData;\\r\\n            item.Frame.YSplitOperator.MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n            item.Frame.YSplitOperator.MultiDayAfterCloseData=multiAfterCloseData;\\r\\n        }\\r\\n\\r\\n        if(MARKET_SUFFIX_NAME.IsShowMinutePostionLine(upperSymbol))\\r\\n            this.BindOverlayPositionData(minuteData,yClose);    //期货,期权 持仓量\\r\\n        else\\r\\n            this.ClearBindOverlayPositionData();\\r\\n\\r\\n        this.TitlePaint[0].Data=this.SourceData;                    //动态标题\\r\\n        this.TitlePaint[0].Symbol=this.Symbol;\\r\\n        this.TitlePaint[0].Name=this.Name;\\r\\n        this.TitlePaint[0].YClose=yClose;\\r\\n        this.TitlePaint[0].BeforeOpenData=this.BeforeOpenData;\\r\\n        this.TitlePaint[0].AfterCloseData=this.AfterCloseData;\\r\\n        this.TitlePaint[0].MultiDayBeforeOpenData=this.IsShowMultiDayBeforeData?this.MultiDayBeforeOpenData:null;\\r\\n        this.TitlePaint[0].MultiDayAfterCloseData=this.IsShowMultiDayAfterData?this.MultiDayAfterCloseData:null;\\r\\n        if (this.TitlePaint[0].CallAcutionXOperator)\\r\\n        {\\r\\n            this.TitlePaint[0].CallAcutionXOperator.BeforeOpenData=this.BeforeOpenData;\\r\\n            this.TitlePaint[0].CallAcutionXOperator.AfterCloseData=this.AfterCloseData;\\r\\n            this.TitlePaint[0].CallAcutionXOperator.MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n            this.TitlePaint[0].CallAcutionXOperator.MultiDayAfterCloseData=multiAfterCloseData;\\r\\n        }\\r\\n\\r\\n        if (this.ChartCorssCursor && this.ChartCorssCursor.StringFormatY)\\r\\n        {\\r\\n            this.ChartCorssCursor.StringFormatY.YClose=yClose;\\r\\n            this.ChartCorssCursor.StringFormatY.BeforeOpenData=this.BeforeOpenData;\\r\\n            this.ChartCorssCursor.StringFormatY.AfterCloseData=this.AfterCloseData;\\r\\n            this.ChartCorssCursor.StringFormatY.MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n            this.ChartCorssCursor.StringFormatY.MultiDayAfterCloseData=multiAfterCloseData;\\r\\n\\r\\n            this.ChartCorssCursor.StringFormatX.Data=this.ChartPaint[0].Data;       //十字光标\\r\\n            this.ChartCorssCursor.StringFormatX.BeforeOpenData=this.BeforeOpenData;\\r\\n            this.ChartCorssCursor.StringFormatX.AfterCloseData=this.AfterCloseData;\\r\\n\\r\\n            this.ChartCorssCursor.StringFormatX.MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n            this.ChartCorssCursor.StringFormatX.MultiDayAfterCloseData=multiAfterCloseData;\\r\\n\\r\\n            if (this.ChartCorssCursor.CallAcutionXOperator)\\r\\n            {\\r\\n                this.ChartCorssCursor.CallAcutionXOperator.BeforeOpenData=this.BeforeOpenData;\\r\\n                this.ChartCorssCursor.CallAcutionXOperator.AfterCloseData=this.AfterCloseData;\\r\\n                this.ChartCorssCursor.CallAcutionXOperator.MultiDayBeforeOpenData=multiBeforeOpenData;\\r\\n                this.ChartCorssCursor.CallAcutionXOperator.MultiDayAfterCloseData=multiAfterCloseData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.ExtendChartPaint[0])\\r\\n        {\\r\\n            this.ExtendChartPaint[0].Symbol=this.Symbol;\\r\\n            this.ExtendChartPaint[0].Name=this.Name;\\r\\n        }\\r\\n\\r\\n        for(var i in this.OverlayChartPaint)\\r\\n        {\\r\\n            var item=this.OverlayChartPaint[i];\\r\\n            item.MainData=this.ChartPaint[0].Data;         //叠加股票\\r\\n            item.MainYClose=yClose;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //绑定分钟叠加指标数据(持仓量)\\r\\n    this.BindOverlayPositionData=function(minuteData,yClose)\\r\\n    {\\r\\n        if (this.Frame.SubFrame.length<2) return;\\r\\n\\r\\n        var chart=null;\\r\\n        var frame=null;\\r\\n        var subFrame=this.Frame.SubFrame[1];    //第2个窗口\\r\\n        var overlayFrame=null;\\r\\n        for(var i in subFrame.OverlayIndex)\\r\\n        {\\r\\n            var item=subFrame.OverlayIndex[i];\\r\\n            if (item.Identify=='Position_Line_Frame')\\r\\n            {\\r\\n                overlayFrame=item;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!overlayFrame)\\r\\n        {\\r\\n            overlayFrame=new OverlayIndexItem();\\r\\n            overlayFrame.Identify='Position_Line_Frame';\\r\\n\\r\\n            if (this.ClassName==\\\"MinuteChartContainer\\\") frame=new OverlayMinuteFrame();\\r\\n            else frame=new OverlayMinuteHScreenFrame();\\r\\n\\r\\n            frame.Canvas=this.Canvas;\\r\\n            frame.MainFrame=subFrame.Frame;\\r\\n            frame.ChartBorder=subFrame.Frame.ChartBorder;\\r\\n            overlayFrame.Frame=frame;\\r\\n\\r\\n            frame.YSplitOperator=new FrameSplitY();\\r\\n            frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n            frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n            frame.YSplitOperator.Frame=frame;\\r\\n            frame.YSplitOperator.ChartBorder=frame.ChartBorder;\\r\\n            frame.YSplitOperator.SplitCount=subFrame.Frame.YSplitOperator.SplitCount;\\r\\n\\r\\n            var chart=new ChartLine();\\r\\n            chart.Canvas=this.Canvas\\r\\n            chart.Name='Position-Line';\\r\\n            chart.ChartBorder=frame.ChartBorder;\\r\\n            chart.ChartFrame=frame\\r\\n            chart.Identify=overlayFrame.Identify;\\r\\n            chart.Color=g_JSChartResource.Minute.PositionColor;\\r\\n            overlayFrame.ChartPaint.push(chart);\\r\\n\\r\\n            subFrame.OverlayIndex.push(overlayFrame);\\r\\n            subFrame.Frame.RightFrame=frame;  //右边坐标绑定到主坐标上\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            chart=overlayFrame.ChartPaint[0];\\r\\n            frame=overlayFrame.Frame;\\r\\n        }\\r\\n\\r\\n        var xPointCouont=this.Frame.SubFrame[0].Frame.XPointCount;\\r\\n        frame.XPointCount=xPointCouont;\\r\\n        subFrame.Frame.IsShowPositionTitle=true;\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=minuteData.GetPosition();\\r\\n        chart.Data=bindData;\\r\\n    }\\r\\n\\r\\n    this.ClearBindOverlayPositionData=function()\\r\\n    {\\r\\n        if (this.Frame.SubFrame.length<2) return;\\r\\n        var subFrame=this.Frame.SubFrame[1];        //第2个窗口\\r\\n        subFrame.Frame.RightFrame=null;\\r\\n        subFrame.Frame.IsShowPositionTitle=false;\\r\\n        for(var i in subFrame.OverlayIndex)\\r\\n        {\\r\\n            var item=subFrame.OverlayIndex[i];\\r\\n            if (item.Identify=='Position_Line_Frame')\\r\\n            {\\r\\n                subFrame.OverlayIndex.splice(i,1);\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //添加叠加指标\\r\\n    this.AddOverlayIndex=function(obj)\\r\\n    {\\r\\n        var overlay=this.CreateOverlayWindowsIndex(obj);\\r\\n        if (!overlay) return;\\r\\n\\r\\n        var bindData=this.SourceData;\\r\\n        this.BindOverlayIndexData(overlay,obj.WindowIndex,bindData);\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //创建一个叠加指标\\r\\n    this.CreateOverlayWindowsIndex=function(obj) //{WindowIndex:, IndexName:, Identify:, ShowRightText:, API:}\\r\\n    {\\r\\n        let indexName=obj.IndexName;\\r\\n        let windowIndex=obj.WindowIndex;\\r\\n        var apiItem=null, indexInfo=null, indexCustom=null;\\r\\n        if (obj.API)\\r\\n        {\\r\\n            apiItem=obj.API;\\r\\n        }\\r\\n        else if (obj.Script)    //动态执行脚本\\r\\n        {\\r\\n            indexInfo={ Script:obj.Script, ID:obj.indexName, Name:obj.indexName};\\r\\n            if (obj.Name) indexInfo.Name=obj.Name;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            let scriptData = new JSIndexScript();\\r\\n            indexInfo = scriptData.Get(indexName);  //系统指标\\r\\n            if (!indexInfo)\\r\\n            {\\r\\n                indexCustom=JSIndexMap.Get(indexName);  //定制指标\\r\\n                if (!indexCustom)\\r\\n                {\\r\\n                    console.warn(`[MinuteChartContainer::CreateOverlayIndex] can not find index[${indexName}]`);\\r\\n                    return null;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var subFrame=this.Frame.SubFrame[windowIndex];\\r\\n        subFrame.Interval=this.OverlayIndexFrameWidth;\\r\\n        var overlayFrame=new OverlayIndexItem();\\r\\n        if (obj.Identify) overlayFrame.Identify=obj.Identify;   //由外部指定id\\r\\n        var frame=null;\\r\\n        if (this.ClassName==\\\"MinuteChartContainer\\\") frame=new OverlayMinuteFrame();\\r\\n        else frame=new OverlayMinuteHScreenFrame();\\r\\n        frame.Canvas=this.Canvas;\\r\\n        frame.MainFrame=subFrame.Frame;\\r\\n        frame.ChartBorder=subFrame.Frame.ChartBorder;\\r\\n        if (obj.ShowRightText===true) frame.IsShow=true;\\r\\n        else if (obj.ShowRightText===false) frame.IsShow=false;\\r\\n        if (obj.IsShareY===true) frame.IsShareY=true;\\r\\n\\r\\n        frame.YSplitOperator=new FrameSplitY();\\r\\n        frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n        frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        frame.YSplitOperator.Frame=frame;\\r\\n        frame.YSplitOperator.ChartBorder=frame.ChartBorder;\\r\\n        frame.YSplitOperator.SplitCount=subFrame.Frame.YSplitOperator.SplitCount;\\r\\n\\r\\n        overlayFrame.Frame=frame;\\r\\n\\r\\n        if (apiItem)\\r\\n        {\\r\\n            var apiIndex=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,obj, true);\\r\\n            apiIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n            overlayFrame.Script=apiIndex;\\r\\n        }\\r\\n        else if (indexInfo)\\r\\n        {\\r\\n            let indexData = indexInfo;\\r\\n            if (obj.Args) indexData.Args=obj.Args;  //外部可以设置参数\\r\\n\\r\\n            var scriptIndex=new OverlayScriptIndex(indexData.Name,indexData.Script,indexData.Args,indexData);    //脚本执行\\r\\n            scriptIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n            overlayFrame.Script=scriptIndex;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var scriptIndex=indexCustom.Create();\\r\\n            scriptIndex.OverlayIndex={ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame };    //叠加指标信息\\r\\n            scriptIndex.Create(this,windowIndex);\\r\\n            overlayFrame.Script=scriptIndex;\\r\\n        }\\r\\n\\r\\n        subFrame.OverlayIndex.push(overlayFrame);\\r\\n        return overlayFrame;\\r\\n    }\\r\\n\\r\\n    this.DeleteOverlayWindowsIndex=function(identify) //删除叠加指标\\r\\n    {\\r\\n        if (!this.DeleteOverlayIndex(identify, null)) return;\\r\\n\\r\\n        this.Frame.ResetXYSplit(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    //计算叠加指标\\r\\n    this.BindAllOverlayIndexData=function(hisData)\\r\\n    {\\r\\n        if (!this.Frame || !this.Frame.SubFrame) return;\\r\\n\\r\\n        //叠加指标\\r\\n        for(var i=0;i<this.Frame.SubFrame.length;++i)\\r\\n        {\\r\\n            var item=this.Frame.SubFrame[i];\\r\\n            for(var j in item.OverlayIndex)\\r\\n            {\\r\\n                var overlayItem=item.OverlayIndex[j];\\r\\n                this.BindOverlayIndexData(overlayItem,i,hisData)\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //叠加指标\\r\\n    this.BindOverlayIndexData=function(overlayItem, windowIndex, hisData)\\r\\n    {\\r\\n        if (!overlayItem.Script) return;\\r\\n\\r\\n        if (typeof(overlayItem.Script.RequestData)=='function')\\r\\n        {\\r\\n            overlayItem.Script.RequestData(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (typeof(overlayItem.Script.ExecuteScript)=='function')\\r\\n        {\\r\\n            overlayItem.Script.ExecuteScript(this,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        overlayItem.Script.BindData(this,windowIndex,hisData);\\r\\n    }\\r\\n\\r\\n    //获取子窗口的所有画法\\r\\n    this.GetChartPaint=function(windowIndex)\\r\\n    {\\r\\n        var paint=new Array();\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            if (i<3) continue; //分钟 均线 成交量 3个线不能改\\r\\n\\r\\n            var item=this.ChartPaint[i];\\r\\n            if (item.ChartFrame==this.Frame.SubFrame[windowIndex].Frame)\\r\\n                paint.push(item);\\r\\n        }\\r\\n\\r\\n        return paint;\\r\\n    }\\r\\n\\r\\n    //创建指定窗口指标\\r\\n    this.CreateWindowIndex=function(windowIndex)\\r\\n    {\\r\\n        this.WindowIndex[windowIndex].Create(this,windowIndex);\\r\\n    }\\r\\n\\r\\n    //获取当前的显示的指标\\r\\n    this.GetIndexInfo=function()\\r\\n    {\\r\\n        var aryIndex=[];\\r\\n        for(var i in this.WindowIndex)\\r\\n        {\\r\\n            var item=this.WindowIndex[i];\\r\\n            var info={Name:item.Name};\\r\\n            if (item.ID) info.ID=item.ID;\\r\\n            aryIndex.push(info);\\r\\n        }\\r\\n\\r\\n        return aryIndex;\\r\\n    }\\r\\n\\r\\n    this.OnTouchFinished=function()\\r\\n    {\\r\\n        if (this.CorssCursorTouchEnd===true)    //手势离开十字光标消失\\r\\n        {\\r\\n            this.DrawDynamicInfo();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        /* 以后放日线的tooltip\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName==='KLineTooltipPaint')\\r\\n            {\\r\\n                this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n        */\\r\\n    }\\r\\n\\r\\n    this.CreateExtendChart=function(name, option)   //创建扩展图形\\r\\n    {\\r\\n        var chart;\\r\\n        switch(name)\\r\\n        {\\r\\n            case 'MinuteTooltip':\\r\\n                if (option.Create && typeof(option.Create)=='function') chart=option.Create();\\r\\n                else chart=new MinuteTooltipPaint();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                option.LanguageID=this.LanguageID;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n            case '画图工具':\\r\\n                chart=new DrawToolsButton();\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.Left=this.Frame.ChartBorder.Right;    //左边间距使用当前框架间距\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                this.Frame.ChartBorder.Right+=chart.Width;  //创建筹码需要增加右边的间距\\r\\n                return chart;\\r\\n            default:\\r\\n                chart=g_ExtendChartPaintFactory.Create(name);\\r\\n                if (!chart) return null;\\r\\n\\r\\n                chart.Canvas=this.Canvas;\\r\\n                chart.ChartBorder=this.Frame.ChartBorder;\\r\\n                chart.ChartFrame=this.Frame;\\r\\n                chart.HQChart=this;\\r\\n                chart.SetOption(option);\\r\\n                this.ExtendChartPaint.push(chart);\\r\\n                return chart;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetMinuteInfo=function(aryInfo,bUpdate)\\r\\n    {\\r\\n        this.ChartInfo=[];  //先清空\\r\\n        for(var i in aryInfo)\\r\\n        {\\r\\n            var infoItem=JSMinuteInfoMap.Get(aryInfo[i]);\\r\\n            if (!infoItem) continue;\\r\\n            var item=infoItem.Create();\\r\\n            this.ChartInfo.push(item);\\r\\n        }\\r\\n\\r\\n        if (bUpdate==true) this.RequestMinuteInfoData();\\r\\n    }\\r\\n\\r\\n    this.GetChartMinuteInfo=function()\\r\\n    {\\r\\n        return this.ChartInfoPaint;\\r\\n    }\\r\\n\\r\\n    this.CreateMinuteInfo=function(option)  //在Create()以后 在调用\\r\\n    {\\r\\n        var chart=new ChartMinuteInfo();\\r\\n        chart.Canvas=this.Canvas;\\r\\n        chart.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        chart.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        chart.HQChartBorder=this.Frame.ChartBorder;\\r\\n        chart.ChartMinutePrice=this.ChartPaint[0];\\r\\n        if (option && chart.SetOption) chart.SetOption(option);\\r\\n        this.ChartInfoPaint=chart;\\r\\n        return chart;\\r\\n    }\\r\\n\\r\\n    //信息地雷数据请求\\r\\n    this.RequestMinuteInfoData=function()\\r\\n    {\\r\\n        if (this.ChartInfo.length<=0) return;\\r\\n\\r\\n        var chart=this.GetChartMinuteInfo();\\r\\n        if (!chart) chart=this.CreateMinuteInfo(null);  //不存在就创建\\r\\n\\r\\n        chart.SourceData=this.SourceData;\\r\\n\\r\\n        //信息地雷信息\\r\\n        for(var i in this.ChartInfo)\\r\\n        {\\r\\n            this.ChartInfo[i].RequestData(this);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //更新信息地雷\\r\\n    this.UpdataChartInfo=function()\\r\\n    {\\r\\n        var chart=this.GetChartMinuteInfo();\\r\\n        if (!chart) return;\\r\\n\\r\\n        var infoMap=new Map();\\r\\n        for(var i in this.ChartInfo)\\r\\n        {\\r\\n            var infoData=this.ChartInfo[i].Data;\\r\\n            for(var j in infoData)\\r\\n            {\\r\\n                var item=infoData[j];\\r\\n                var dateTime=`${item.Date} ${item.Time}`;\\r\\n                if (infoMap.has(dateTime))\\r\\n                {\\r\\n                    infoMap.get(dateTime).Data.push(item);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n\\r\\n                    infoMap.set(dateTime,{Data:new Array(item)});\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        chart.Data=infoMap;\\r\\n    }\\r\\n\\r\\n    this.UpdateWindowIndex=function(index)\\r\\n    {\\r\\n        if (index<2) return;\\r\\n\\r\\n        var bindData=this.SourceData;\\r\\n        this.BindIndexData(index,bindData)\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.CreateChartDrawPicture=function(name, option, callback)\\r\\n    {\\r\\n        var drawPicture=null;\\r\\n        var item=IChartDrawPicture.GetDrawPictureByName(name);\\r\\n        if (item)\\r\\n        {\\r\\n            drawPicture=item.Create();\\r\\n            if (drawPicture.ClassName=='ChartDrawPictureText') drawPicture.HQChart=this;\\r\\n        }\\r\\n\\r\\n        if (!drawPicture)    //iconfont图标\\r\\n        {\\r\\n            if (IChartDrawPicture.MapIonFont.has(name))\\r\\n            {\\r\\n                var iconItem=IChartDrawPicture.MapIonFont.get(name);\\r\\n                drawPicture=new ChartDrawPictureIconFont();\\r\\n                drawPicture.FontOption.Family=iconItem.Family\\r\\n                drawPicture.Text=iconItem.Text;\\r\\n                if (iconItem.Color) drawPicture.LineColor=iconItem.Color;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (!drawPicture) return false;\\r\\n\\r\\n        drawPicture.Canvas=this.Canvas;\\r\\n        drawPicture.Status=0;\\r\\n        drawPicture.Symbol=this.Symbol;\\r\\n        drawPicture.Period=888888888;\\r\\n        drawPicture.Option=this.ChartDrawOption;\\r\\n        if (callback) drawPicture.FinishedCallback=callback;    //完成通知上层回调\\r\\n        if (option) drawPicture.SetOption(option);\\r\\n        var self=this;\\r\\n        drawPicture.Update=function()   //更新回调函数\\r\\n        {\\r\\n            self.DrawDynamicInfo();\\r\\n        };\\r\\n        this.CurrentChartDrawPicture=drawPicture;\\r\\n        JSConsole.Chart.Log(\\\"[MinuteChartContainer::CreateChartDrawPicture] \\\", name,this.CurrentChartDrawPicture);\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ReloadChartDrawPicture=function()\\r\\n    {\\r\\n        this.ChartDrawPicture=[];\\r\\n        this.ChartDrawStorageCache;\\r\\n        if (this.ChartDrawStorage)\\r\\n        {\\r\\n            this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( { Symbol:this.Symbol, Period:888888888 } );\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateChartDrawPictureByStorage=function() //把缓存(this.ChartDrawStorageCache) 画图工具创建出来\\r\\n    {\\r\\n        if (!this.ChartDrawStorageCache || this.ChartDrawStorageCache.length<=0) return;\\r\\n\\r\\n        for(var i in this.ChartDrawStorageCache)\\r\\n        {\\r\\n            var item=this.ChartDrawStorageCache[i];\\r\\n            if (item.FrameID<0 || !this.Frame.SubFrame || this.Frame.SubFrame.length<item.FrameID) continue;\\r\\n\\r\\n            var drawPicture=IChartDrawPicture.CreateChartDrawPicture(item);\\r\\n            if (!drawPicture) continue;\\r\\n\\r\\n            drawPicture.Canvas=this.Canvas;\\r\\n            drawPicture.Status=10;\\r\\n            drawPicture.Frame=this.Frame.SubFrame[item.FrameID].Frame;  //绑定框架坐标\\r\\n            drawPicture.UpdateXValue();\\r\\n            drawPicture.ValueToPoint();\\r\\n\\r\\n            if (drawPicture.ClassName==='ChartDrawPictureText') drawPicture.IsInitialized=true;\\r\\n\\r\\n            this.ChartDrawPicture.push(drawPicture);\\r\\n        }\\r\\n\\r\\n        this.ChartDrawStorageCache=null;    //清空缓存\\r\\n    }\\r\\n\\r\\n    this.SetSizeChange=function(bChanged)\\r\\n    {\\r\\n        this.Frame.SetSizeChage(bChanged);\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            item.SizeChange=bChanged;\\r\\n        }\\r\\n    }\\r\\n    this.SetSizeChage=this.SetSizeChange;\\r\\n\\r\\n    //根据X坐标获取数据索引\\r\\n    this.GetDataIndexByPoint=function(x)\\r\\n    {\\r\\n        var frame=this.Frame;\\r\\n        if (this.Frame.SubFrame && this.Frame.SubFrame.length>0) frame=this.Frame.SubFrame[0].Frame;\\r\\n        if (!frame) return;\\r\\n\\r\\n        var value=frame.GetXData(x);\\r\\n        var index=parseInt(value.toFixed(0));\\r\\n\\r\\n        return index;\\r\\n    }\\r\\n\\r\\n    //获取主数据\\r\\n    this.GetSelectRectData=function(selectData)\\r\\n    {\\r\\n        if (Math.abs(selectData.XStart-selectData.XEnd)<5) return false;\\r\\n\\r\\n        var startClientPos=this.PtInClient(selectData.XStart, selectData.YStart);\\r\\n        var endClientPos=this.PtInClient(selectData.XEnd, selectData.YEnd);\\r\\n\\r\\n        selectData.StartClientPos=startClientPos;\\r\\n        selectData.EndClientPos=endClientPos;\\r\\n\\r\\n        var data=this.SourceData;\\r\\n        if (!data) return false;\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(data.Data)) return false;\\r\\n\\r\\n        var start=this.GetDataIndexByPoint(selectData.XStart);\\r\\n        var end=this.GetDataIndexByPoint(selectData.XEnd);\\r\\n\\r\\n        if (Math.abs(start-end)<2) return false;\\r\\n\\r\\n        selectData.Data=data;\\r\\n        if (start>end)\\r\\n        {\\r\\n            selectData.Start=end;\\r\\n            selectData.End=start;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            selectData.Start=start;\\r\\n            selectData.End=end;\\r\\n        }\\r\\n\\r\\n        var count=data.Data.length;\\r\\n        if (selectData.End>=count) selectData.End=count-1;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.Super_UpdateFrameMaxMin=this.UpdateFrameMaxMin;\\r\\n    this.UpdateFrameMaxMin=function()\\r\\n    {\\r\\n        this.Super_UpdateFrameMaxMin();\\r\\n\\r\\n        if (this.DayCount==1)   //集合竞价多坐标,Y轴强制都计算\\r\\n        {\\r\\n            var subFrame=this.Frame.SubFrame[1];\\r\\n            if (subFrame.Frame) subFrame.Frame.XYSplit=true;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//盘前数据\\r\\nMinuteChartContainer.JsonDataToBeforeOpenData=function(data)\\r\\n{\\r\\n    var preClose=data.stock[0].yclose;      //前一个数据价格\\r\\n    var stockData=data.stock[0];\\r\\n    var date=stockData.date;                //日期\\r\\n    var beforeOpenData={ Data:[], TotalCount:15, Ver:1.0, Date:date };\\r\\n    if (stockData.beforeinfo)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsNumber(stockData.beforeinfo.totalcount)) beforeOpenData.TotalCount=stockData.beforeinfo.totalcount;\\r\\n        if (IFrameSplitOperator.IsNumber(stockData.beforeinfo.ver)) beforeOpenData.Ver=stockData.beforeinfo.ver;\\r\\n    }\\r\\n    if (beforeOpenData.Ver==1.0)\\r\\n    {\\r\\n        for(var i in stockData.before)\\r\\n        {\\r\\n            var item=new BeforeOpenData();\\r\\n            var jsData=stockData.before[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            if (!item.Price) item.Price=preClose;\\r\\n            else preClose=item.Price;\\r\\n            item.Vol[0]=jsData[2]/100;  //沪深股票原始单位股\\r\\n            item.Amount=jsData[3];\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            beforeOpenData.Data.push(item);\\r\\n        }\\r\\n    }\\r\\n    else if (beforeOpenData.Ver==2.0)\\r\\n    {\\r\\n        var max=0;\\r\\n        for(var i in stockData.before)\\r\\n        {\\r\\n            var item=new BeforeOpenData();\\r\\n            var jsData=stockData.before[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            item.Vol[0]=jsData[2];  //匹配量\\r\\n            item.Vol[1]=jsData[3];  //未匹配量\\r\\n            item.ColorID=jsData[4]; //柱子颜色ID\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            var totalVol=item.Vol[0]+item.Vol[1];\\r\\n            if (IFrameSplitOperator.IsNumber(jsData[5])) totalVol=jsData[5];\\r\\n            if (totalVol>max) max=totalVol;\\r\\n\\r\\n            beforeOpenData.Data.push(item);\\r\\n        }\\r\\n\\r\\n        beforeOpenData.VolMax=max;\\r\\n        beforeOpenData.VolMin=0;\\r\\n    }\\r\\n    else if (beforeOpenData.Ver==3.0)\\r\\n    {\\r\\n        var max=0;\\r\\n        for(var i in stockData.before)\\r\\n        {\\r\\n            var item=new BeforeOpenData();\\r\\n            var jsData=stockData.before[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            item.AvPrice=jsData[2]; //均价\\r\\n            item.Vol[0]=jsData[3];  //匹配量\\r\\n            item.ColorID=jsData[4]; //柱子颜色ID\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            var totalVol=item.Vol[0];\\r\\n            if (IFrameSplitOperator.IsNumber(jsData[5])) totalVol=jsData[5];\\r\\n            if (totalVol>max) max=totalVol;\\r\\n\\r\\n            beforeOpenData.Data.push(item);\\r\\n        }\\r\\n\\r\\n        beforeOpenData.VolMax=max;\\r\\n        beforeOpenData.VolMin=0;\\r\\n    }\\r\\n\\r\\n    return beforeOpenData;\\r\\n}\\r\\n\\r\\n//收盘集合竞价\\r\\nMinuteChartContainer.JsonDataToAfterCloseData=function(data)\\r\\n{\\r\\n    var preClose=data.stock[0].yclose;      //前一个数据价格\\r\\n    var stockData=data.stock[0];\\r\\n    var date=stockData.date;                //日期\\r\\n    if (!stockData.afterinfo) return null;\\r\\n\\r\\n    var afterCloseData={ Data:[], TotalCount:3*60, Ver:2.0, Date:date };\\r\\n    var item=stockData.afterinfo;\\r\\n    if (IFrameSplitOperator.IsNumber(item.totalcount)) afterCloseData.TotalCount=item.totalcount;\\r\\n    if (IFrameSplitOperator.IsNumber(item.ver)) afterCloseData.Ver=item.ver;\\r\\n\\r\\n    if (afterCloseData.Ver==2.0)\\r\\n    {\\r\\n        var max=0;\\r\\n        for(var i in stockData.after)\\r\\n        {\\r\\n            var item=new AfterCloseData();\\r\\n            var jsData=stockData.after[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            item.Vol[0]=jsData[2];  //匹配量\\r\\n            item.Vol[1]=jsData[3];  //未匹配量\\r\\n            item.ColorID=jsData[4]; //柱子颜色ID\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            var totalVol=item.Vol[0]+item.Vol[1];\\r\\n            if (IFrameSplitOperator.IsNumber(jsData[5])) totalVol=jsData[5];\\r\\n            if (totalVol>max) max=totalVol;\\r\\n\\r\\n            afterCloseData.Data.push(item);\\r\\n        }\\r\\n\\r\\n        afterCloseData.VolMax=max;\\r\\n        afterCloseData.VolMin=0;\\r\\n    }\\r\\n    else if (afterCloseData.Ver==3.0)\\r\\n    {\\r\\n        var max=0;\\r\\n        for(var i in stockData.after)\\r\\n        {\\r\\n            var item=new AfterCloseData();\\r\\n            var jsData=stockData.after[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            item.AvPrice=jsData[2]; //均价\\r\\n            item.Vol[0]=jsData[3];  //匹配量\\r\\n            item.ColorID=jsData[4]; //柱子颜色ID\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            var totalVol=item.Vol[0];\\r\\n            if (IFrameSplitOperator.IsNumber(jsData[5])) totalVol=jsData[5];\\r\\n            if (totalVol>max) max=totalVol;\\r\\n\\r\\n            afterCloseData.Data.push(item);\\r\\n        }\\r\\n\\r\\n        afterCloseData.VolMax=max;\\r\\n        afterCloseData.VolMin=0;\\r\\n    }\\r\\n\\r\\n    return afterCloseData;\\r\\n}\\r\\n\\r\\n//API 返回数据 转化为array[]\\r\\nMinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)\\r\\n{\\r\\n    var symbol=data.stock[0].symbol;\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n    var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);\\r\\n    var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);    //国内期货, 纽约期货交易所\\r\\n    var isSHO=MARKET_SUFFIX_NAME.IsSHO(upperSymbol);    //上海股票期权\\r\\n    var aryMinuteData=new Array();\\r\\n    var preClose=data.stock[0].yclose;      //前一个数据价格\\r\\n    var preAvPrice=data.stock[0].yclose;    //前一个均价\\r\\n    var yClose=data.stock[0].yclose;\\r\\n    if (isFutures && data.stock[0].yclearing) yClose=preClose=preAvPrice=data.stock[0].yclearing;  //期货使用昨结算价\\r\\n\\r\\n    var date=data.stock[0].date;    //默认使用外部日期, 但跨天的 走势图使用内部的日期\\r\\n    for(var i in data.stock[0].minute)\\r\\n    {\\r\\n        var jsData=data.stock[0].minute[i];\\r\\n        var item=new MinuteData();\\r\\n\\r\\n        item.Close=jsData.price;\\r\\n        item.Open=jsData.open;\\r\\n        item.High=jsData.high;\\r\\n        item.Low=jsData.low;\\r\\n        if (isSHSZ) item.Vol=jsData.vol/100; //沪深股票原始单位股\\r\\n        else item.Vol=jsData.vol;\\r\\n        item.Amount=jsData.amount;\\r\\n        if (jsData.date>0) date=jsData.date;    //分钟数据中有日期 优先使用\\r\\n        item.DateTime=date.toString()+\\\" \\\"+jsData.time.toString();\\r\\n        item.Date=date;\\r\\n        item.Time=jsData.time;\\r\\n        if (isFutures || isSHO) item.Position=jsData.position;  //期货 期权有持仓\\r\\n        if (8<jsData.length && jsData[8]>0)\\r\\n        {\\r\\n            item.Date=jsData[8];    //日期\\r\\n            item.DateTime=item.Date.toString()+\\\" \\\"+jsData[0].toString();\\r\\n        }\\r\\n\\r\\n        item.Increase=jsData.increase;\\r\\n        item.Risefall=jsData.risefall;\\r\\n        item.AvPrice=jsData.avprice;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(jsData.lead))\\r\\n            item.Lead=jsData.lead;  //领先指标 指数才有\\r\\n\\r\\n        if (!item.Close) //当前没有价格 使用上一个价格填充\\r\\n        {\\r\\n            item.Close=preClose;\\r\\n            item.Open=item.High=item.Low=item.Close;\\r\\n        }\\r\\n\\r\\n        if (!item.AvPrice) item.AvPrice=preAvPrice;\\r\\n\\r\\n        //价格是0的 都用空\\r\\n        if (item.Open<=0) item.Open=null;\\r\\n        if (item.Close<=0) item.Close=null;\\r\\n        if (item.AvPrice<=0) item.AvPrice=null;\\r\\n        if (item.High<=0) item.High=null;\\r\\n        if (item.Low<=0) item.Low=null;\\r\\n\\r\\n        //if (isFutures) item.AvPrice=null;    //期货均价暂时没有\\r\\n\\r\\n        if (yClose && item.Close)\\r\\n            item.Increase=(item.Close-yClose)/yClose*100; //涨幅 (最新价格-昨收)/昨收*100;\\r\\n\\r\\n\\r\\n        //均价太大 可能是后台算错了\\r\\n        var checkValue=Math.abs(item.AvPrice-item.Close);\\r\\n        //JSConsole.Chart.Log(`[MinuteChartContainer::JsonDataToMinuteData] checkValue=${checkValue}, ${item.Close*0.13} `)\\r\\n        if (isSHSZ && checkValue>item.Close*0.13 )\\r\\n            item.AvPrice=preAvPrice;\\r\\n\\r\\n        //上次价格\\r\\n        if (jsData.price>0) preClose=jsData.price;\\r\\n        if (jsData.avprice>0 && item.AvPrice===jsData.avprice) preAvPrice=jsData.avprice;\\r\\n\\r\\n        aryMinuteData[i]=item;\\r\\n    }\\r\\n\\r\\n    return aryMinuteData;\\r\\n}\\r\\n\\r\\nMinuteChartContainer.JsonDataToMinuteLineColorData=function(data)\\r\\n{\\r\\n    if (!data || !data.stock[0]) return null;\\r\\n    var stockItem=data.stock[0];\\r\\n    if (!stockItem.linecolor || !IFrameSplitOperator.IsNonEmptyArray(stockItem.linecolor.data)) return null;\\r\\n\\r\\n    var aryLineColor=[];\\r\\n    for(var i in stockItem.linecolor.data)\\r\\n    {\\r\\n        var item=stockItem.linecolor.data[i];\\r\\n        if (!IFrameSplitOperator.IsNumber(item.type) || !IFrameSplitOperator.IsNumber(item.date) || !IFrameSplitOperator.IsNumber(item.start) ||\\r\\n            !IFrameSplitOperator.IsNumber(item.end) || !item.color) continue;\\r\\n\\r\\n        if (item.start>=item.end) continue;\\r\\n\\r\\n        var newItem={ Type:item.type, Date:item.date, Start:item.start, End:item.end, Color:item.color };\\r\\n        if (IFrameSplitOperator.IsPlusNumber(item.linewidth)) newItem.LineWidth=item.linewidth;\\r\\n\\r\\n        aryLineColor.push(newItem);\\r\\n    }\\r\\n\\r\\n    return aryLineColor;\\r\\n}\\r\\n\\r\\n//多日日线数据API 转化成array[];\\r\\nMinuteChartContainer.JsonDataToMinuteDataArray=function(data)\\r\\n{\\r\\n    var symbol=data.symbol;\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n    var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);\\r\\n    var isSHO=MARKET_SUFFIX_NAME.IsSHO(upperSymbol);    //上海股票期权\\r\\n    var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);    //国内期货, 纽约期货交易所\\r\\n    var result=[];\\r\\n    for(var i in data.data)\\r\\n    {\\r\\n        var minuteData=[];\\r\\n        var dayData=data.data[i];\\r\\n        var date=dayData.date;\\r\\n        var yClose=dayData.yclose;          //前收盘 计算涨幅\\r\\n        var preClose=yClose;                //前一个数据价格\\r\\n        var preAvPrice=null;                //上一个均价\\r\\n        var yClearing=dayData.yclearing;    //昨结算价\\r\\n\\r\\n        //var preAvPrice=data.stock[0].yclose;    //前一个均价\\r\\n        for(var j in dayData.minute)\\r\\n        {\\r\\n            var jsData=dayData.minute[j];\\r\\n            if (jsData[2]) preClose=jsData[2];  //保存上一个收盘数据\\r\\n            var item=new MinuteData();\\r\\n            item.Close=jsData[2];\\r\\n            item.Open=jsData[1];\\r\\n            item.High=jsData[3];\\r\\n            item.Low=jsData[4];\\r\\n            if (isSHSZ) item.Vol=jsData[5]/100; //原始单位股\\r\\n            else item.Vol=jsData[5];\\r\\n            item.Amount=jsData[6];\\r\\n            if (7<jsData.length && jsData[7]>0) item.AvPrice=jsData[7];    //均价\\r\\n            item.DateTime=date.toString()+\\\" \\\"+jsData[0].toString();\\r\\n            item.Date=date;\\r\\n            item.Time=jsData[0];\\r\\n            if (8<jsData.length && jsData[8]>0)\\r\\n            {\\r\\n                item.Date=jsData[8];    //日期\\r\\n                item.DateTime=item.Date.toString()+\\\" \\\"+jsData[0].toString();\\r\\n            }\\r\\n            if ((isFutures || isSHO) && 9<jsData.length) item.Position=jsData[9];  //持仓\\r\\n\\r\\n            if (!item.Close)    //当前没有价格 使用上一个价格填充\\r\\n            {\\r\\n                item.Close=preClose;\\r\\n                item.Open=item.High=item.Low=item.Close;\\r\\n            }\\r\\n\\r\\n            if (!item.AvPrice && preAvPrice) item.AvPrice=preAvPrice;\\r\\n\\r\\n            if (item.Close && yClose) item.Increase = (item.Close - yClose)/yClose*100;\\r\\n            else item.Increase=null;\\r\\n\\r\\n            //价格是0的 都用空\\r\\n            if (item.Open<=0) item.Open=null;\\r\\n            if (item.Close<=0) item.Close=null;\\r\\n            if (item.AvPrice<=0) item.AvPrice=null;\\r\\n            if (item.High<=0) item.High=null;\\r\\n            if (item.Low<=0) item.Low=null;\\r\\n            if (item.AvPrice<=0) item.AvPrice=null;\\r\\n\\r\\n            //均价太大 可能是后台算错了\\r\\n            if (item.AvPrice && isSHSZ)\\r\\n            {\\r\\n                var checkValue=Math.abs(item.AvPrice-item.Close);\\r\\n                if (checkValue>item.Close*0.13 ) item.AvPrice=preAvPrice;\\r\\n            }\\r\\n\\r\\n            if (jsData.length>7 && jsData[7]>0 && item.AvPrice===jsData[7]) preAvPrice=jsData[7];\\r\\n\\r\\n            minuteData[j]=item;\\r\\n        }\\r\\n\\r\\n        var newData=new ChartData();\\r\\n        newData.Data=minuteData;\\r\\n        newData.YClose=yClose;\\r\\n        newData.Close=dayData.close;\\r\\n        newData.Date=date;\\r\\n        if (IFrameSplitOperator.IsNumber(yClearing)) newData.YClearing=yClearing;\\r\\n\\r\\n        result.push(newData);\\r\\n    }\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\nMinuteChartContainer.JsonDataToHistoryMinuteLineColorData=function(data)\\r\\n{\\r\\n    if (!data) return null;\\r\\n\\r\\n    var aryLineColor=[];\\r\\n    for(var i in data.data)\\r\\n    {\\r\\n        var dayData=data.data[i];\\r\\n        if (!dayData.linecolor) continue;\\r\\n\\r\\n        for(var j in dayData.linecolor.data)\\r\\n        {\\r\\n            var item=dayData.linecolor.data[j];\\r\\n\\r\\n            if (!IFrameSplitOperator.IsNumber(item.type) || !IFrameSplitOperator.IsNumber(item.date) || !IFrameSplitOperator.IsNumber(item.start) ||\\r\\n                !IFrameSplitOperator.IsNumber(item.end) || !item.color) continue;\\r\\n\\r\\n            if (item.start>=item.end) continue;\\r\\n\\r\\n            var newItem={ Type:item.type, Date:item.date, Start:item.start, End:item.end, Color:item.color };\\r\\n            if (IFrameSplitOperator.IsPlusNumber(item.linewidth)) newItem.LineWidth=item.linewidth;\\r\\n\\r\\n            aryLineColor.push(newItem);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return aryLineColor.length>0? aryLineColor : null;\\r\\n}\\r\\n\\r\\n\\r\\nMinuteChartContainer.JsonDataToCallAuctionItem=function(data, callAuctionData, isBeforeOpen)\\r\\n{\\r\\n    var date=callAuctionData.Date;\\r\\n\\r\\n    if (callAuctionData.Ver==1.0)\\r\\n    {\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=isBeforeOpen? new BeforeOpenData() : new AfterCloseData();\\r\\n            var jsData=data[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            if (!item.Price) item.Price=preClose;\\r\\n            else preClose=item.Price;\\r\\n            item.Vol[0]=jsData[2]/100;  //沪深股票原始单位股\\r\\n            item.Amount=jsData[3];\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            callAuctionData.Data.push(item);\\r\\n        }\\r\\n    }\\r\\n    else if (callAuctionData.Ver==2.0)\\r\\n    {\\r\\n        var max=0;\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=isBeforeOpen? new BeforeOpenData() : new AfterCloseData();\\r\\n            var jsData=data[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            item.Vol[0]=jsData[2];  //匹配量\\r\\n            item.Vol[1]=jsData[3];  //未匹配量\\r\\n            item.ColorID=jsData[4]; //柱子颜色ID\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            var totalVol=item.Vol[0]+item.Vol[1];\\r\\n            if (IFrameSplitOperator.IsNumber(jsData[5])) totalVol=jsData[5];\\r\\n            if (totalVol>max) max=totalVol;\\r\\n\\r\\n            callAuctionData.Data.push(item);\\r\\n        }\\r\\n\\r\\n        callAuctionData.VolMax=max;\\r\\n        callAuctionData.VolMin=0;\\r\\n    }\\r\\n    else if (beforeOpenData.Ver==3.0)\\r\\n    {\\r\\n        var max=0;\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=isBeforeOpen? new BeforeOpenData() : new AfterCloseData();\\r\\n            var jsData=data[i];\\r\\n            item.Time=jsData[0];\\r\\n            item.Date=date;\\r\\n            item.Price=jsData[1];\\r\\n            item.AvPrice=jsData[2]; //均价\\r\\n            item.Vol[0]=jsData[3];  //匹配量\\r\\n            item.ColorID=jsData[4]; //柱子颜色ID\\r\\n            item.DateTime=date.toString()+\\\" \\\"+item.Time.toString();\\r\\n\\r\\n            var totalVol=item.Vol[0];\\r\\n            if (IFrameSplitOperator.IsNumber(jsData[5])) totalVol=jsData[5];\\r\\n            if (totalVol>max) max=totalVol;\\r\\n\\r\\n            callAuctionData.Data.push(item);\\r\\n        }\\r\\n\\r\\n        callAuctionData.VolMax=max;\\r\\n        callAuctionData.VolMin=0;\\r\\n    }\\r\\n}\\r\\n\\r\\nMinuteChartContainer.JosnDataToBeforeOpenDataArray=function(data)\\r\\n{\\r\\n    if (!data || !data.data) return null;\\r\\n\\r\\n    var aryDay=[];\\r\\n    for(var i in data.data)\\r\\n    {\\r\\n        var dayItem=data.data[i];\\r\\n        var beforeOpenData={ Data:[], TotalCount:15, Ver:1.0, Date:dayItem.date };\\r\\n        if (dayItem.beforeinfo)\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(dayItem.beforeinfo.totalcount)) beforeOpenData.TotalCount=dayItem.beforeinfo.totalcount;\\r\\n            if (IFrameSplitOperator.IsNumber(dayItem.beforeinfo.ver)) beforeOpenData.Ver=dayItem.beforeinfo.ver;\\r\\n        }\\r\\n\\r\\n        MinuteChartContainer.JsonDataToCallAuctionItem(dayItem.before, beforeOpenData, true);\\r\\n\\r\\n        aryDay.push(beforeOpenData);\\r\\n    }\\r\\n\\r\\n    aryDay.sort((left, right)=>{return left.Date - right.Date});\\r\\n\\r\\n    return aryDay;\\r\\n}\\r\\n\\r\\nMinuteChartContainer.JosnDataToAfterCloseDataArray=function(data)\\r\\n{\\r\\n    if (!data || !data.data) return null;\\r\\n\\r\\n    var aryDay=[];\\r\\n    for(var i in data.data)\\r\\n    {\\r\\n        var dayItem=data.data[i];\\r\\n        var afterCloseData={ Data:[], TotalCount:15, Ver:1.0, Date:dayItem.date };\\r\\n\\r\\n        if (dayItem.afterinfo)\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsNumber(dayItem.afterinfo.totalcount)) afterCloseData.TotalCount=dayItem.afterinfo.totalcount;\\r\\n            if (IFrameSplitOperator.IsNumber(dayItem.afterinfo.ver)) afterCloseData.Ver=dayItem.afterinfo.ver;\\r\\n        }\\r\\n\\r\\n        MinuteChartContainer.JsonDataToCallAuctionItem(dayItem.after, afterCloseData, false);\\r\\n\\r\\n        aryDay.push(afterCloseData);\\r\\n    }\\r\\n\\r\\n    aryDay.sort((left, right)=>{return left.Date - right.Date});\\r\\n\\r\\n    return aryDay;\\r\\n}\\r\\n\\r\\n/*\\r\\n    历史分钟走势图\\r\\n*/\\r\\nfunction HistoryMinuteChartContainer(uielement)\\r\\n{\\r\\n    this.newMethod=MinuteChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.HistoryMinuteApiUrl=\\\"https://opensourcecache.zealink.com/cache/minuteday/day/\\\";\\r\\n    this.ClassName='HistoryMinuteChartContainer';\\r\\n\\r\\n    //创建主图K线画法\\r\\n    this.CreateMainKLine=function()\\r\\n    {\\r\\n        //分钟线\\r\\n        var minuteLine=new ChartMinutePriceLine();\\r\\n        minuteLine.Canvas=this.Canvas;\\r\\n        minuteLine.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        minuteLine.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        minuteLine.Name=\\\"Minute-Line\\\";\\r\\n        minuteLine.Color=g_JSChartResource.Minute.PriceColor;\\r\\n\\r\\n        this.ChartPaint[0]=minuteLine;\\r\\n\\r\\n        //分钟线均线\\r\\n        var averageLine=new ChartLine();\\r\\n        averageLine.Canvas=this.Canvas;\\r\\n        averageLine.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        averageLine.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        averageLine.Name=\\\"Minute-Average-Line\\\";\\r\\n        averageLine.Color=g_JSChartResource.Minute.AvPriceColor;\\r\\n        this.ChartPaint[1]=averageLine;\\r\\n\\r\\n        var averageLine=new ChartMinuteVolumBar();\\r\\n        averageLine.Color=g_JSChartResource.Minute.VolBarColor;\\r\\n        averageLine.Canvas=this.Canvas;\\r\\n        averageLine.ChartBorder=this.Frame.SubFrame[1].Frame.ChartBorder;\\r\\n        averageLine.ChartFrame=this.Frame.SubFrame[1].Frame;\\r\\n        averageLine.Name=\\\"Minute-Vol-Bar\\\";\\r\\n        this.ChartPaint[2]=averageLine;\\r\\n\\r\\n\\r\\n        this.TitlePaint[0]=new DynamicMinuteTitlePainting();\\r\\n        this.TitlePaint[0].Frame=this.Frame.SubFrame[0].Frame;\\r\\n        this.TitlePaint[0].Canvas=this.Canvas;\\r\\n        this.TitlePaint[0].IsShowDate=true;\\r\\n\\r\\n        /*\\r\\n        //主图叠加画法\\r\\n        var paint=new ChartOverlayKLine();\\r\\n        paint.Canvas=this.Canvas;\\r\\n        paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        paint.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        paint.Name=\\\"Overlay-KLine\\\";\\r\\n        this.OverlayChartPaint[0]=paint;\\r\\n        */\\r\\n\\r\\n    }\\r\\n\\r\\n    //设置交易日期\\r\\n    this.ChangeTradeDate=function(trdateDate)\\r\\n    {\\r\\n        if (!trdateDate) return;\\r\\n\\r\\n        this.TradeDate=trdateDate;\\r\\n        this.RequestData(); //更新数据\\r\\n    }\\r\\n\\r\\n    this.RequestData=function()\\r\\n    {\\r\\n        var date=new Date();\\r\\n        var nowDate=date.getFullYear()*10000+(date.getMonth()+1)*100+date.getDate();\\r\\n        if (nowDate==this.TradeDate) this.RequestMinuteData();\\r\\n        else this.RequestHistoryMinuteData();\\r\\n    }\\r\\n\\r\\n    //请求分钟数据\\r\\n    this.RequestHistoryMinuteData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var url=this.HistoryMinuteApiUrl+this.TradeDate.toString()+\\\"/\\\"+this.Symbol+\\\".json\\\";\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            type:\\\"get\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryMinuteData(data);\\r\\n            },\\r\\n            error:function(reqeust)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryMinuteError(reqeust);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryMinuteError=function(reqeust)\\r\\n    {\\r\\n        if (reqeust.status!=404) return;\\r\\n\\r\\n        var sourceData=new ChartData();\\r\\n        this.SourceData=sourceData;\\r\\n\\r\\n        for(var i in this.ChartPaint)\\r\\n        {\\r\\n            this.ChartPaint[i].Data=sourceData;\\r\\n            if (i==0) this.ChartPaint[i].NotSupportMessage='没有权限访问!';\\r\\n        }\\r\\n\\r\\n        this.TitlePaint[0].Data=this.SourceData;                    //动态标题\\r\\n        this.TitlePaint[0].Symbol=this.Symbol;\\r\\n        this.TitlePaint[0].Name=null;\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryMinuteData=function(data)\\r\\n    {\\r\\n        var aryMinuteData=HistoryMinuteChartContainer.JsonDataToMinuteData(data);\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryMinuteData;\\r\\n\\r\\n        this.TradeDate=data.date;\\r\\n\\r\\n        this.SourceData=sourceData;\\r\\n        this.Symbol=data.symbol;\\r\\n        this.Name=data.name;\\r\\n\\r\\n        this.BindMainData(sourceData,data.day.yclose);\\r\\n\\r\\n        if (this.Frame.SubFrame.length>2)\\r\\n        {\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryMinuteData;\\r\\n            for(var i=2; i<this.Frame.SubFrame.length; ++i)\\r\\n            {\\r\\n                this.BindIndexData(i,bindData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n        //this.AutoUpdata();\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//API 返回数据 转化为array[]\\r\\nHistoryMinuteChartContainer.JsonDataToMinuteData=function(data)\\r\\n{\\r\\n    var aryMinuteData=[];\\r\\n    for(var i in data.minute.time)\\r\\n    {\\r\\n        var item=new MinuteData();\\r\\n\\r\\n        if (data.minute.price[i]<=0 && i>0) //当前这一分钟价格为空,使用上一分钟的数据\\r\\n        {\\r\\n            item.Close=aryMinuteData[i-1].Close;\\r\\n            item.Open=aryMinuteData[i-1].Close;\\r\\n            item.High=item.Close;\\r\\n            item.Low=item.Close;\\r\\n            item.Vol=data.minute.vol[i]; //原始单位股\\r\\n            item.Amount=data.minute.amount[i];\\r\\n            item.DateTime=data.date.toString()+\\\" \\\"+data.minute.time[i].toString();\\r\\n            //item.Increate=jsData.increate;\\r\\n            //item.Risefall=jsData.risefall;\\r\\n            item.AvPrice=aryMinuteData[i-1].AvPrice;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            item.Close=data.minute.price[i];\\r\\n            item.Open=data.minute.open[i];\\r\\n            item.High=data.minute.high[i];\\r\\n            item.Low=data.minute.low[i];\\r\\n            item.Vol=data.minute.vol[i]; //原始单位股\\r\\n            item.Amount=data.minute.amount[i];\\r\\n            item.DateTime=data.date.toString()+\\\" \\\"+data.minute.time[i].toString();\\r\\n            //item.Increate=jsData.increate;\\r\\n            //item.Risefall=jsData.risefall;\\r\\n            item.AvPrice=data.minute.avprice[i];\\r\\n        }\\r\\n\\r\\n        //价格是0的 都用空\\r\\n        if (item.Open<=0) item.Open=null;\\r\\n        if (item.Close<=0) item.Close=null;\\r\\n        if (item.AvPrice<=0) item.AvPrice=null;\\r\\n        if (item.High<=0) item.High=null;\\r\\n        if (item.Low<=0) item.Low=null;\\r\\n\\r\\n        aryMinuteData[i]=item;\\r\\n    }\\r\\n\\r\\n    return aryMinuteData;\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////\\r\\n//  自定义指数\\r\\n//\\r\\nfunction CustomKLineChartContainer(uielement)\\r\\n{\\r\\n    this.newMethod=KLineChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='CustomKLineChartContainer';\\r\\n    this.CustomKLineApiUrl=g_JSChartResource.Domain+\\\"/API/IndexCalculate\\\";                        //自定义指数计算地址\\r\\n    this.CustomStock;   //成分\\r\\n    this.QueryDate={Start:20180101,End:20180627} ;     //计算时间区间\\r\\n\\r\\n    this.RequestHistoryData=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n        this.ChartSplashPaint.EnableSplash(true);\\r\\n        this.Draw();\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.CustomKLineApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"stock\\\": self.CustomStock,\\r\\n                    \\\"Name\\\": self.Symbol,\\r\\n                    \\\"date\\\": { \\\"startdate\\\":self.QueryDate.Start,\\\"enddate\\\":self.QueryDate.End }\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvHistoryData(data);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryData=function(data)\\r\\n    {\\r\\n        var aryDayData=KLineChartContainer.JsonDataToHistoryData(data);\\r\\n\\r\\n        //原始数据\\r\\n        var sourceData=new ChartData();\\r\\n        sourceData.Data=aryDayData;\\r\\n        sourceData.DataType=0;      //0=日线数据 1=分钟数据\\r\\n\\r\\n        //显示的数据\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryDayData;\\r\\n        bindData.Right=this.Right;\\r\\n        bindData.Period=this.Period;\\r\\n        bindData.DataType=0;\\r\\n\\r\\n        if (bindData.Right>0)    //复权\\r\\n        {\\r\\n            var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n            bindData.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period,false))   //周期数据\\r\\n        {\\r\\n            var periodData=sourceData.GetPeriodData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        //绑定数据\\r\\n        this.SourceData=sourceData;\\r\\n        this.Name=data.name;\\r\\n        this.BindMainData(bindData,this.PageSize);\\r\\n\\r\\n        for(var i=0; i<this.Frame.SubFrame.length; ++i)\\r\\n        {\\r\\n            this.BindIndexData(i,bindData);\\r\\n        }\\r\\n\\r\\n        //刷新画图\\r\\n        this.UpdataDataoffset();           //更新数据偏移\\r\\n        this.UpdatePointByCursorIndex();   //更新十字光标位子\\r\\n        this.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n//  K线训练 新版本\\r\\n//\\r\\nfunction KLineTrainChartContainer(uielement, bHScreen)\\r\\n{\\r\\n    if (bHScreen===true)\\r\\n    {\\r\\n        this.newMethod=KLineChartHScreenContainer;   //派生\\r\\n        this.newMethod(uielement);\\r\\n        delete this.newMethod;\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        this.newMethod=KLineChartContainer;   //派生\\r\\n        this.newMethod(uielement);\\r\\n        delete this.newMethod;\\r\\n    }\\r\\n\\r\\n    this.BuySellPaint;          //买卖点画法\\r\\n    this.TrainDataCount=300;    //训练数据个数\\r\\n    this.TrainStartDate;        //训练开始日期时间 { Date:, Time: }\\r\\n    this.AutoRunTimer=null;     //K线自动前进定时器\\r\\n    this.BuySellData=[];        //模拟买卖数据 {Buy:{Price:价格,Date:日期, Time:时间} , Sell:{Price:价格,Date:日期, Time:时间}\\r\\n    this.TrainCallback;         //训练回调 (K线每前进一次就调用一次)\\r\\n    this.DragMode=1;\\r\\n    this.IsAutoUpdate=false;\\r\\n\\r\\n    this.KLineSourceData;       //原始K线数据 对应 SourceData\\r\\n    this.TrainInfo={ Start:{ }, End:{ } }; // Index:数据索引, Date:日期  Time:时间\\r\\n\\r\\n    this.CreateBuySellPaint=function()  //在主窗口建立以后 创建买卖点\\r\\n    {\\r\\n        var chart=new ChartBuySell();\\r\\n        chart.Canvas=this.Canvas;\\r\\n        chart.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;\\r\\n        chart.ChartFrame=this.Frame.SubFrame[0].Frame;\\r\\n        chart.Name=\\\"KLine-Train-BuySell\\\";\\r\\n        this.ChartPaintEx[0]=chart;\\r\\n    }\\r\\n\\r\\n    this.GetKDataIndexByDateTime=function(kData, dateTime)\\r\\n    {\\r\\n        if (!dateTime || !kData) return -1;\\r\\n\\r\\n        for(var i in kData)\\r\\n        {\\r\\n            var item=kData[i];\\r\\n            if (ChartData.IsMinutePeriod(this.Period, true))\\r\\n            {\\r\\n                if (IFrameSplitOperator.IsNumber(this.TrainStartDate.Time))\\r\\n                {\\r\\n                    if (item.Date>=this.TrainStartDate.Date && item.Time>=this.TrainStartDate.Time)\\r\\n                        return parseInt(i);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (item.Date>=this.TrainStartDate.Date)\\r\\n                        return parseInt(i);\\r\\n                }\\r\\n            }\\r\\n            else if (ChartData.IsDayPeriod(this.Period, true) || ChartData.IsTickPeriod(this.Period))\\r\\n            {\\r\\n                if (item.Date>=this.TrainStartDate.Date)\\r\\n                    return parseInt(i);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return -1;\\r\\n    }\\r\\n\\r\\n    this.AfterBindMainData=function(funcName)\\r\\n    {\\r\\n        if (!this.ChartPaintEx[0]) this.CreateBuySellPaint();\\r\\n\\r\\n        var hisData=this.ChartPaint[0].Data;\\r\\n        this.ChartPaintEx[0].Data=hisData;\\r\\n\\r\\n        var showItem=hisData.Data[hisData.Data.length-1];\\r\\n\\r\\n        //最后一个显示数据\\r\\n        this.TrainInfo.LastShowData=showItem;\\r\\n        this.TrainInfo.LastData = this.SourceData.Data[this.SourceData.Data.length - 1];\\r\\n\\r\\n        if (funcName!='Update')\\r\\n            this.UpdateTrainUICallback(\\\"开始\\\");\\r\\n    }\\r\\n\\r\\n    this.BeforeBindMainData=function(funcName)\\r\\n    {\\r\\n        if (funcName==\\\"Update\\\") return;\\r\\n\\r\\n        //全量数据 需要过滤\\r\\n        this.KLineSourceData=new ChartData();\\r\\n        this.KLineSourceData.Data=this.SourceData.Data.slice(0);\\r\\n        var count=this.SourceData.Data.length;\\r\\n        var lEnd=count-this.TrainDataCount-20;\\r\\n        var findIndex=this.GetKDataIndexByDateTime(this.SourceData.Data, this.TrainStartDate);\\r\\n        if (findIndex>=0)\\r\\n        {\\r\\n            lEnd=findIndex+1;\\r\\n            if (count-lEnd<this.TrainDataCount) this.TrainDataCount=count-lEnd;\\r\\n        }\\r\\n\\r\\n        //训练起始日期\\r\\n        var index=lEnd-1;\\r\\n        var kItem=this.SourceData.Data[index];\\r\\n        this.TrainInfo.Start.Index=index;\\r\\n        this.TrainInfo.Start.Date=kItem.Date;\\r\\n        this.TrainInfo.Start.Time=kItem.Time;\\r\\n\\r\\n        //训练结束日期\\r\\n        this.TrainInfo.End.Index=index;\\r\\n        this.TrainInfo.End.Date=kItem.Date;\\r\\n        this.TrainInfo.End.Time=kItem.Time;\\r\\n\\r\\n        //最后一个数据\\r\\n        this.TrainInfo.LastData=kItem;\\r\\n\\r\\n        //修改数据个数\\r\\n        this.SourceData.Data.length=lEnd;\\r\\n    }\\r\\n\\r\\n    this.Run=function(option)\\r\\n    {\\r\\n        if (this.AutoRunTimer) return;\\r\\n        if (this.TrainDataCount<=0) return;\\r\\n\\r\\n        var self=this;\\r\\n        this.AutoRunTimer=setInterval(function()\\r\\n        {\\r\\n            if (!self.MoveNextKLineData(option)) clearInterval(self.AutoRunTimer);\\r\\n        }, 1000);\\r\\n    }\\r\\n\\r\\n    this.MoveNextKLineData=function(option) //{PageSize:, Step:}\\r\\n    {\\r\\n        if (this.TrainDataCount<=0) return false;\\r\\n\\r\\n        var step=1;\\r\\n        if (option && option.Step>1) step=option.Step;\\r\\n\\r\\n        var moveStep=0;\\r\\n        for(var i=0; i<step; ++i)\\r\\n        {\\r\\n            var index=this.TrainInfo.End.Index+1;\\r\\n            if (index>=this.KLineSourceData.Data.length) break;\\r\\n\\r\\n            var kItem=this.KLineSourceData.Data[index];\\r\\n            this.SourceData.Data.push(kItem);\\r\\n\\r\\n            this.TrainInfo.End.Index=index;\\r\\n            this.TrainInfo.End.Date=kItem.Date;\\r\\n            this.TrainInfo.End.Time=kItem.Time;\\r\\n            --this.TrainDataCount;\\r\\n            ++moveStep;\\r\\n\\r\\n            if (this.TrainDataCount<=0) break;\\r\\n        }\\r\\n\\r\\n        if (moveStep==0) return false;\\r\\n\\r\\n        //使用当前页数据个数移动K线\\r\\n        var pageSize=this.Frame.GetCurrentPageSize();\\r\\n        if (IFrameSplitOperator.IsNumber(pageSize))\\r\\n            this.PageSize=pageSize-this.RightSpaceCount;\\r\\n\\r\\n        if (option && option.PageSize>0) this.PageSize=option.PageSize;\\r\\n\\r\\n        this.Update();\\r\\n\\r\\n        if (this.TrainDataCount<=0)\\r\\n        {\\r\\n            this.FinishTrainData();\\r\\n            this.UpdateTrainUICallback(\\\"结束\\\");\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        this.UpdateTrainUICallback(\\\"训练中\\\");\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.UpdateTrainUICallback=function(description)\\r\\n    {\\r\\n        //新的监听事件\\r\\n        if (!this.mapEvent.has(JSCHART_EVENT_ID.RECV_TRAIN_MOVE_STEP)) return;\\r\\n        var item=this.mapEvent.get(JSCHART_EVENT_ID.RECV_TRAIN_MOVE_STEP);\\r\\n        if (!item.Callback) return;\\r\\n\\r\\n        var data=\\r\\n            {\\r\\n                TrainDataCount:this.TrainDataCount,\\r\\n                BuySellData:this.BuySellData,\\r\\n                KLine:\\r\\n                    {\\r\\n                        Start: { Index: this.TrainInfo.Start.Index, Date:this.TrainInfo.Start.Date },\\r\\n                        End:{ Index: this.TrainInfo.End.Index, Date:this.TrainInfo.End.Date }\\r\\n                    },\\r\\n                LastData:this.TrainInfo.LastData,\\r\\n                LastShowData:this.TrainInfo.LastShowData\\r\\n            };\\r\\n        if (IFrameSplitOperator.IsNumber(this.TrainInfo.Start.Time)) data.KLine.Start.Time=this.TrainInfo.Start.Time;\\r\\n        if (IFrameSplitOperator.IsNumber(this.TrainInfo.End.Time)) data.KLine.End.Time=this.TrainInfo.End.Time;\\r\\n        if (description) data.Description=description\\r\\n\\r\\n        if (this.TrainDataCount<=0)\\r\\n        {\\r\\n            data.Symbol=this.Symbol;\\r\\n            data.Name=this.Name;\\r\\n        }\\r\\n\\r\\n        item.Callback(item,data,this);\\r\\n    }\\r\\n\\r\\n    this.FinishTrainData=function()\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineTrainChartContainer::FinishTrainData] trian end ');\\r\\n    }\\r\\n\\r\\n    this.Stop=function()\\r\\n    {\\r\\n        if (this.AutoRunTimer!=null) clearInterval(this.AutoRunTimer);\\r\\n        this.AutoRunTimer=null;\\r\\n    }\\r\\n\\r\\n    this.BuyOrSell=function(obj, bDraw)  //{ Price:价格, Vol:数量, Op: 买/卖 0=buy 1=sell, ID:单号 } bDraw是否立即绘制图标\\r\\n    {\\r\\n        var kItem=this.TrainInfo.LastShowData;\\r\\n        if (!kItem) return false;\\r\\n\\r\\n        var buySellPaint=this.ChartPaintEx[0];\\r\\n        if (!buySellPaint) return false;\\r\\n\\r\\n        var hisData=this.ChartPaint[0].Data;\\r\\n        if (!hisData || hisData.Data.length<=0) return false;\\r\\n\\r\\n        var index=hisData.Data.length-1;  //数据索引\\r\\n        var buyItem={ Date:this.TrainInfo.End.Date, Time:this.TrainInfo.End.Time, Price:obj.Price, Vol:obj.Vol, Op:0, ID:obj.ID };\\r\\n        if (obj.Op==1) buyItem.Op=1;\\r\\n        var key=index;\\r\\n        buyItem.Key=key;\\r\\n\\r\\n        this.BuySellData.push(buyItem);\\r\\n        buySellPaint.AddTradeItem(buyItem);\\r\\n\\r\\n        if (bDraw==true) this.Draw();\\r\\n    }\\r\\n\\r\\n    this.RestartTrain=function(option)  // { Symbol:, Period:周期, Right:复权, Train:{ DataCount:, DateTime: } }\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineTrainChartContainer::RestartTrain] option ', option);\\r\\n\\r\\n        this.TrainInfo={ Start:{ }, End:{ } };\\r\\n        this.BuySellData=[];\\r\\n        this.KLineSourceData=null;\\r\\n\\r\\n        var buySellPaint=this.ChartPaintEx[0];\\r\\n        if (buySellPaint)\\r\\n        {\\r\\n            buySellPaint.Data=null;\\r\\n            buySellPaint.ClearTradeData();\\r\\n        }\\r\\n\\r\\n        if (option.Symbol) this.Symbol=option.Symbol;\\r\\n        if (IFrameSplitOperator.IsNumber(option.Period)) this.Period=option.Period;\\r\\n        if (IFrameSplitOperator.IsNumber(option.Right)) this.Right=option.Right;\\r\\n        if (option.Train)\\r\\n        {\\r\\n            if (option.Train.DataCount>1) this.TrainDataCount=option.Train.DataCount;\\r\\n            if (option.Train.DateTime) this.TrainStartDate=option.Train.DateTime;\\r\\n        }\\r\\n\\r\\n        var symbol=this.Symbol;\\r\\n        this.ChangeSymbol(symbol);\\r\\n    }\\r\\n\\r\\n    this.RecvFlowCapitalData=function(data)\\r\\n    {\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n\\r\\n        let stock=data.stock[0];\\r\\n        var aryData=new Array();\\r\\n        for(let i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n            let indexData=new SingleData();\\r\\n            indexData.Date=item.date;\\r\\n            var financeData=item.capital;\\r\\n            if (!financeData) continue;\\r\\n            if (financeData.a>0)\\r\\n            {\\r\\n                indexData.Value=financeData.a;    //流通股本（股）\\r\\n                aryData.push(indexData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(this.Period,true)) //分钟数据\\r\\n        {\\r\\n            var aryFixedData=this.SourceData.GetMinuteFittingFinanceData(aryData);\\r\\n            for(let i in this.SourceData.Data)\\r\\n            {\\r\\n                var item=this.SourceData.Data[i];\\r\\n                item.FlowCapital=aryFixedData[i].Value;\\r\\n            }\\r\\n\\r\\n            var bindData=this.ChartPaint[0].Data;\\r\\n            var newBindData=new ChartData();\\r\\n            newBindData.Data=this.SourceData.Data;\\r\\n\\r\\n            if (ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据\\r\\n            {\\r\\n                var periodData=newBindData.GetPeriodData(bindData.Period);\\r\\n                newBindData.Data=periodData;\\r\\n            }\\r\\n            bindData.Data=newBindData.Data;\\r\\n\\r\\n            var aryFixedData=this.KLineSourceData.GetMinuteFittingFinanceData(aryData); //数据添加到备份数据中\\r\\n            for(let i in this.KLineSourceData.Data)\\r\\n            {\\r\\n                var item=this.KLineSourceData.Data[i];\\r\\n                item.FlowCapital=aryFixedData[i].Value;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var aryFixedData=this.SourceData.GetFittingFinanceData(aryData);\\r\\n            for(let i in this.SourceData.Data)\\r\\n            {\\r\\n                var item=this.SourceData.Data[i];\\r\\n                item.FlowCapital=aryFixedData[i].Value;\\r\\n            }\\r\\n\\r\\n            var bindData=this.ChartPaint[0].Data;\\r\\n            var newBindData=new ChartData();\\r\\n            newBindData.Data=this.SourceData.Data;\\r\\n\\r\\n            if (bindData.Right>0)    //复权\\r\\n            {\\r\\n                var rightData=newBindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });\\r\\n                newBindData.Data=rightData;\\r\\n            }\\r\\n\\r\\n            if (ChartData.IsDayPeriod(bindData.Period,false)) //周期数据\\r\\n            {\\r\\n                var periodData=newBindData.GetPeriodData(bindData.Period);\\r\\n                newBindData.Data=periodData;\\r\\n            }\\r\\n\\r\\n            bindData.Data=newBindData.Data;\\r\\n\\r\\n            var aryFixedData=this.KLineSourceData.GetFittingFinanceData(aryData);   //数据添加到备份数据中\\r\\n            for(let i in this.KLineSourceData.Data)\\r\\n            {\\r\\n                var item=this.KLineSourceData.Data[i];\\r\\n                item.FlowCapital=aryFixedData[i].Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.FlowCapitalReady=true;\\r\\n        var bDraw=false;\\r\\n        for(var i in this.ExtendChartPaint)\\r\\n        {\\r\\n            var item=this.ExtendChartPaint[i];\\r\\n            if (item.ClassName=='StockChip')\\r\\n            {\\r\\n                bDraw=true;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bDraw) this.Draw();\\r\\n    }\\r\\n\\r\\n    this.AutoUpdate()\\r\\n    {\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n//  K线横屏显示\\r\\n//\\r\\nfunction KLineChartHScreenContainer(uielement)\\r\\n{\\r\\n    this.newMethod=KLineChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='KLineChartHScreenContainer';\\r\\n\\r\\n    this.OnMouseMove=function(x,y,e,isPhone)\\r\\n    {\\r\\n        this.LastPoint.X=x;\\r\\n        this.LastPoint.Y=y;\\r\\n        this.CursorIndex=this.Frame.GetXData(y);\\r\\n\\r\\n        var option={ ParentFunction:'OnMouseMove', Point:{X:x, Y:y}, IsPhone:isPhone===true };\\r\\n\\r\\n        this.DrawDynamicInfo(option);\\r\\n    }\\r\\n\\r\\n    uielement.onmousedown=function(e)   //鼠标拖拽\\r\\n    {\\r\\n        if(!this.JSChartContainer) return;\\r\\n        if(this.JSChartContainer.DragMode==0) return;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        if (this.JSChartContainer.TryClickLock)\\r\\n        {\\r\\n            var x = (e.clientX-this.getBoundingClientRect().left)*pixelTatio;\\r\\n            var y = (e.clientY-this.getBoundingClientRect().top)*pixelTatio;\\r\\n            if (this.JSChartContainer.TryClickLock(x,y)) return;\\r\\n        }\\r\\n\\r\\n\\r\\n        var drag=\\r\\n            {\\r\\n                \\\"Click\\\":{},\\r\\n                \\\"LastMove\\\":{}  //最后移动的位置\\r\\n            };\\r\\n\\r\\n        drag.Click.X=e.clientX;\\r\\n        drag.Click.Y=e.clientY;\\r\\n        drag.LastMove.X=e.clientX;\\r\\n        drag.LastMove.Y=e.clientY;\\r\\n\\r\\n        this.JSChartContainer.MouseDrag=drag;\\r\\n        document.JSChartContainer=this.JSChartContainer;\\r\\n        this.JSChartContainer.SelectChartDrawPicture=null;\\r\\n\\r\\n        uielement.ondblclick=function(e)\\r\\n        {\\r\\n            var x = e.clientX-this.getBoundingClientRect().left;\\r\\n            var y = e.clientY-this.getBoundingClientRect().top;\\r\\n\\r\\n            if(this.JSChartContainer)\\r\\n                this.JSChartContainer.OnDoubleClick(x,y,e);\\r\\n        }\\r\\n\\r\\n        document.onmousemove=function(e)\\r\\n        {\\r\\n            if(!this.JSChartContainer) return;\\r\\n            //加载数据中,禁用鼠标事件\\r\\n            if (this.JSChartContainer.ChartSplashPaint && this.JSChartContainer.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n            var drag=this.JSChartContainer.MouseDrag;\\r\\n            if (!drag) return;\\r\\n\\r\\n            var moveSetp=Math.abs(drag.LastMove.Y-e.clientY);\\r\\n\\r\\n            if (this.JSChartContainer.DragMode==1)  //数据左右拖拽\\r\\n            {\\r\\n                if (moveSetp<5) return;\\r\\n\\r\\n                var oneStepWidth=this.JSChartContainer.GetMoveOneStepWidth();\\r\\n                if (moveSetp<oneStepWidth) return;\\r\\n\\r\\n                var isLeft=true;\\r\\n                if (drag.LastMove.Y<e.clientY) isLeft=false;//右移数据\\r\\n\\r\\n                if(this.JSChartContainer.DataMove(moveSetp,isLeft))\\r\\n                {\\r\\n                    this.JSChartContainer.UpdataDataoffset();\\r\\n                    this.JSChartContainer.UpdatePointByCursorIndex();\\r\\n                    this.JSChartContainer.UpdateFrameMaxMin();\\r\\n                    this.JSChartContainer.ResetFrameXYSplit();\\r\\n                    this.JSChartContainer.Draw();\\r\\n                }\\r\\n\\r\\n                drag.LastMove.X=e.clientX;\\r\\n                drag.LastMove.Y=e.clientY;\\r\\n            }\\r\\n        };\\r\\n\\r\\n        document.onmouseup=function(e)\\r\\n        {\\r\\n            //清空事件\\r\\n            document.onmousemove=null;\\r\\n            document.onmouseup=null;\\r\\n\\r\\n            //清空数据\\r\\n            this.JSChartContainer.MouseDrag=null;\\r\\n            this.JSChartContainer.CurrentChartDrawPicture=null;\\r\\n            this.JSChartContainer=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //手机拖拽\\r\\n    this.OnTouchStart=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        this.PhonePinch=null;\\r\\n        this.IsOnTouch=true;\\r\\n        this.TouchDrawCount=0;\\r\\n        this.StopDragTimer();\\r\\n        var isSingleTouch=this.IsSingleTouch(e);\\r\\n        if (e.cancelable) e.preventDefault();\\r\\n\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            if (this.TryClickLock || this.TryClickIndexTitle) //指标枷锁区域, 指标标题点击\\r\\n            {\\r\\n                var touches = this.GetToucheData(e, this.IsForceLandscape);\\r\\n                var x = touches[0].clientX;\\r\\n                var y = touches[0].clientY;\\r\\n                var pixelTatio = GetDevicePixelRatio();\\r\\n                x -= uielement.getBoundingClientRect().left*pixelTatio;    //减去控件的偏移偏移量\\r\\n                y -= uielement.getBoundingClientRect().top*pixelTatio;\\r\\n                if (this.TryClickLock && this.TryClickLock(x, y)) return;\\r\\n                if (this.TryClickIndexTitle && this.TryClickIndexTitle(x,y)) return;\\r\\n            }\\r\\n\\r\\n            var bStartTimer=true;\\r\\n            if (this.ChartDrawOption.IsLockScreen)\\r\\n            {\\r\\n                bStartTimer=false;\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n            {\\r\\n                if (this.TouchStatus.CorssCursorShow==true) bStartTimer=false;\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.DISABLE_DRAG_ID)\\r\\n            {\\r\\n                bStartTimer=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (!isSingleTouch) bStartTimer=false;\\r\\n            }\\r\\n\\r\\n            var drag= {  Click:{}, LastMove:{}  }; //LastMove=最后移动的位置\\r\\n\\r\\n\\r\\n            var touches=this.GetToucheData(e,false);\\r\\n\\r\\n            drag.Click.X=touches[0].clientX;\\r\\n            drag.Click.Y=touches[0].clientY;\\r\\n            drag.LastMove.X=touches[0].clientX;\\r\\n            drag.LastMove.Y=touches[0].clientY;\\r\\n\\r\\n            this.MouseDrag=drag;\\r\\n            if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;\\r\\n            this.SelectChartDrawPicture=null;\\r\\n\\r\\n            if (this.CurrentChartDrawPicture)  //画图工具模式\\r\\n            {\\r\\n                var drawPicture=this.CurrentChartDrawPicture;\\r\\n                if (drawPicture.Status==2)\\r\\n                    this.SetChartDrawPictureThirdPoint(drag.Click.X,drag.Click.Y,true);\\r\\n                else\\r\\n                {\\r\\n                    this.SetChartDrawPictureFirstPoint(drag.Click.X,drag.Click.Y,true);\\r\\n                    //只有1个点 直接完成\\r\\n                    if (this.FinishChartDrawPicturePoint()) this.DrawDynamicInfo({Corss:false, Tooltip:false});\\r\\n                }\\r\\n\\r\\n                if (e.cancelable) e.preventDefault();\\r\\n                return;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var drawPictrueData={};\\r\\n                var pixelTatio = GetDevicePixelRatio(); //鼠标移动坐标是原始坐标 需要乘以放大倍速\\r\\n                drawPictrueData.X=(touches[0].clientX-uielement.getBoundingClientRect().left);\\r\\n                drawPictrueData.Y=(touches[0].clientY-uielement.getBoundingClientRect().top);\\r\\n                if (this.GetChartDrawPictureByPoint(drawPictrueData))\\r\\n                {\\r\\n                    drawPictrueData.ChartDrawPicture.Status=20;\\r\\n                    drawPictrueData.ChartDrawPicture.ValueToPoint();\\r\\n                    drawPictrueData.ChartDrawPicture.MovePointIndex=drawPictrueData.PointIndex;\\r\\n                    drawPictrueData.ChartDrawPicture.IsSelected=true;\\r\\n                    this.CurrentChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                    this.SelectChartDrawPicture=drawPictrueData.ChartDrawPicture;\\r\\n                    let event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_DRAWPICTURE); //选中画图工具事件\\r\\n                    if (event && event.Callback)\\r\\n                    {\\r\\n                        let sendData={ DrawPicture: drawPictrueData.ChartDrawPicture };\\r\\n                        event.Callback(event,sendData,this);\\r\\n                    }\\r\\n\\r\\n                    if (e.cancelable) e.preventDefault();\\r\\n                    return;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (bStartTimer)    //长按2秒,十字光标\\r\\n            {\\r\\n                var self=this;\\r\\n                this.DragTimer=setTimeout(function()\\r\\n                {\\r\\n                    if (drag.Click.X==drag.LastMove.X && drag.Click.Y==drag.LastMove.Y) //手指没有移动，出现十字光标\\r\\n                    {\\r\\n                        var mouseDrag=self.MouseDrag;\\r\\n                        self.MouseDrag=null;\\r\\n                        self.MoveCorssCursor(drag.Click,e);//移动十字光标\\r\\n                    }\\r\\n                }, self.PressTime);\\r\\n            }\\r\\n\\r\\n            if (this.ChartDrawOption.IsLockScreen)\\r\\n            {\\r\\n                this.MouseDrag=null;\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID)\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else if (this.DragMode==JSCHART_DRAG_ID.DISABLE_DRAG_ID)\\r\\n            {\\r\\n                this.MouseDrag=null;\\r\\n                this.MoveCorssCursor(drag.Click,e);\\r\\n            }\\r\\n            else if (this.IsClickShowCorssCursor)\\r\\n            {\\r\\n                this.MoveCorssCursor(drag.Click,e);\\r\\n            }\\r\\n\\r\\n        }\\r\\n        else if (this.IsPhonePinching(e))\\r\\n        {\\r\\n            var phonePinch=\\r\\n                {\\r\\n                    \\\"Start\\\":{},\\r\\n                    \\\"Last\\\":{}\\r\\n                };\\r\\n\\r\\n            var touches=this.GetToucheData(e,false);\\r\\n\\r\\n            phonePinch.Start={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n            phonePinch.Last={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n\\r\\n            this.PhonePinch=phonePinch;\\r\\n            this.SelectChartDrawPicture=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchMove=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        if (e.cancelable) e.preventDefault();\\r\\n\\r\\n        var touches=this.GetToucheData(e,false);\\r\\n\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            var drag=this.MouseDrag;\\r\\n            if (drag==null)\\r\\n            {\\r\\n                if (!this.ChartDrawOption.IsLockScreen) this.MoveCorssCursor({X:touches[0].clientX, Y:touches[0].clientY},e);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var moveSetp=Math.abs(drag.LastMove.Y-touches[0].clientY);\\r\\n                var moveUpDown=Math.abs(drag.LastMove.X-touches[0].clientX);\\r\\n                var isMoveCorssCursor=(this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID && this.TouchStatus.CorssCursorShow==true); //是否移动十字光标\\r\\n\\r\\n                if (this.CurrentChartDrawPicture)\\r\\n                {\\r\\n                    var drawPicture=this.CurrentChartDrawPicture;\\r\\n                    if (drawPicture.Status==1 || drawPicture.Status==2)\\r\\n                    {\\r\\n                        if(moveSetp<5 && moveUpDown<5) return;\\r\\n                        if(this.SetChartDrawPictureSecondPoint(touches[0].clientX,touches[0].clientY,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n                    else if (drawPicture.Status==3)\\r\\n                    {\\r\\n                        if(this.SetChartDrawPictureThirdPoint(touches[0].clientX,touches[0].clientY,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n                    else if (drawPicture.Status==20)    //画图工具移动\\r\\n                    {\\r\\n                        if(moveSetp<5 && moveUpDown<5) return;\\r\\n\\r\\n                        if(this.MoveChartDrawPicture(touches[0].clientX-drag.LastMove.X,touches[0].clientY-drag.LastMove.Y,true))\\r\\n                        {\\r\\n                            this.DrawDynamicInfo();\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    drag.LastMove.X=touches[0].clientX;\\r\\n                    drag.LastMove.Y=touches[0].clientY;\\r\\n                }\\r\\n                if (isMoveCorssCursor)  //点击模式下 十字光标显示 左右移动十字光标\\r\\n                {\\r\\n                    var mouseDrag=this.MouseDrag;\\r\\n                    this.MouseDrag=null;\\r\\n                    this.MoveCorssCursor(drag.Click,e); //移动十字光标\\r\\n                }\\r\\n                else if (this.DragMode==1 || isMoveCorssCursor==false)  //数据左右拖拽\\r\\n                {\\r\\n                    if (moveSetp<5) return;\\r\\n\\r\\n                    var oneStepWidth=this.GetMoveOneStepWidth();\\r\\n                    if (moveSetp<oneStepWidth) return;\\r\\n\\r\\n                    var isLeft=true;\\r\\n                    if (drag.LastMove.Y<touches[0].clientY) isLeft=false;//右移数据\\r\\n\\r\\n                    if(this.DataMove(moveSetp,isLeft))\\r\\n                    {\\r\\n                        this.UpdataDataoffset();\\r\\n                        this.UpdatePointByCursorIndex();\\r\\n                        this.UpdateFrameMaxMin();\\r\\n                        this.ResetFrameXYSplit();\\r\\n                        this.Draw();\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (this.DragDownloadData) this.DragDownloadData();\\r\\n                    }\\r\\n\\r\\n                    drag.LastMove.X=touches[0].clientX;\\r\\n                    drag.LastMove.Y=touches[0].clientY;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsPhonePinching(e))\\r\\n        {\\r\\n            if (this.DragMode==JSCHART_DRAG_ID.DISABLE_DRAG_ID) return;\\r\\n\\r\\n            var phonePinch=this.PhonePinch;\\r\\n            if (!phonePinch) return;\\r\\n\\r\\n            var yHeight=Math.abs(touches[0].pageX-touches[1].pageX);\\r\\n            var yLastHeight=Math.abs(phonePinch.Last.X-phonePinch.Last.X2);\\r\\n            var yStep=yHeight-yLastHeight;\\r\\n            if (Math.abs(yStep)<5) return;\\r\\n\\r\\n            if (yStep>0)    //放大\\r\\n            {\\r\\n                var cursorIndex={};\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (!this.Frame.ZoomUp(cursorIndex)) return;\\r\\n                this.CursorIndex=cursorIndex.Index;\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                this.ShowTooltipByKeyDown();\\r\\n            }\\r\\n            else        //缩小\\r\\n            {\\r\\n                var cursorIndex={};\\r\\n                cursorIndex.Index=parseInt(Math.abs(this.CursorIndex-0.5).toFixed(0));\\r\\n                if (!this.Frame.ZoomDown(cursorIndex)) return;\\r\\n                this.CursorIndex=cursorIndex.Index;\\r\\n                this.UpdataDataoffset();\\r\\n                this.UpdatePointByCursorIndex();\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n                this.ShowTooltipByKeyDown();\\r\\n            }\\r\\n\\r\\n            phonePinch.Last={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchEnd=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartHScreenContainer:OnTouchEnd]',e);\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        var bClearDrawPicture=true;\\r\\n        if (this.CurrentChartDrawPicture)\\r\\n        {\\r\\n            var drawPicture=this.CurrentChartDrawPicture;\\r\\n            if (drawPicture.Status==2 || drawPicture.Status==1 || drawPicture.Status==3)\\r\\n            {\\r\\n                drawPicture.PointStatus=drawPicture.Status;\\r\\n                if (this.FinishChartDrawPicturePoint())\\r\\n                    this.DrawDynamicInfo();\\r\\n                else\\r\\n                    bClearDrawPicture=false;\\r\\n            }\\r\\n            else if (drawPicture.Status==20)\\r\\n            {\\r\\n                if (this.FinishMoveChartDrawPicture())\\r\\n                    this.DrawDynamicInfo();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.IsOnTouch = false;\\r\\n        this.StopDragTimer();\\r\\n        this.OnTouchFinished();\\r\\n        this.TouchDrawCount=0;\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    //windowCount 窗口个数\\r\\n    this.Create=function(windowCount)\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建十字光标\\r\\n        this.ChartCorssCursor=new ChartCorssCursor();\\r\\n        this.ChartCorssCursor.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.StringFormatX=g_DivTooltipDataForamt.Create(\\\"CorssCursor_XStringFormat\\\");\\r\\n        this.ChartCorssCursor.StringFormatX.LanguageID=this.LanguageID;\\r\\n        this.ChartCorssCursor.StringFormatY=g_DivTooltipDataForamt.Create(\\\"CorssCursor_YStringFormat\\\");\\r\\n        this.ChartCorssCursor.StringFormatY.LanguageID=this.LanguageID;\\r\\n        this.ChartCorssCursor.StringFormatY.ExtendChartPaint=this.ExtendChartPaint;\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n        this.ChartSplashPaint.HQChart=this;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new HQTradeHScreenFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=30;\\r\\n        this.Frame.ChartBorder.Left=5;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.Frame=this.Frame; //十字光标绑定框架\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n\\r\\n        this.CreateChildWindow(windowCount);\\r\\n        this.CreateMainKLine();\\r\\n\\r\\n        //子窗口动态标题\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var titlePaint=new DynamicChartTitlePainting();\\r\\n            titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n            titlePaint.Canvas=this.Canvas;\\r\\n            titlePaint.LanguageID=this.LanguageID;\\r\\n            titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            this.TitlePaint.push(titlePaint);\\r\\n        }\\r\\n\\r\\n        this.UIElement.addEventListener(\\\"keydown\\\", OnKeyDown, true);    //键盘消息\\r\\n    }\\r\\n\\r\\n    //创建子窗口\\r\\n    this.CreateChildWindow=function(windowCount)\\r\\n    {\\r\\n        for(var i=0;i<windowCount;++i)\\r\\n        {\\r\\n            var border=new ChartBorder();\\r\\n            border.UIElement=this.UIElement;\\r\\n\\r\\n            var frame=new KLineHScreenFrame();\\r\\n            frame.Canvas=this.Canvas;\\r\\n            frame.ChartBorder=border;\\r\\n            frame.Identify=i;                   //窗口序号\\r\\n            frame.RightSpaceCount=this.RightSpaceCount; //右边\\r\\n\\r\\n            if (this.ModifyIndexDialog) frame.ModifyIndexEvent=this.ModifyIndexDialog.DoModal;        //绑定菜单事件\\r\\n            if (this.ChangeIndexDialog) frame.ChangeIndexEvent=this.ChangeIndexDialog.DoModal;\\r\\n\\r\\n            frame.HorizontalMax=20;\\r\\n            frame.HorizontalMin=10;\\r\\n\\r\\n            if (i==0)\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitKLinePriceY();\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('price');\\r\\n                frame.YSplitOperator.FrameSplitData2=this.FrameSplitData.get('double');\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n                //主图上下间距\\r\\n                var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率\\r\\n                border.TopSpace=12*pixelTatio;\\r\\n                border.BottomSpace=12*pixelTatio;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitY();\\r\\n                frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n                //frame.IsLocked = true;\\r\\n            }\\r\\n\\r\\n            frame.YSplitOperator.Frame=frame;\\r\\n            frame.YSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator=new FrameSplitKLineX();\\r\\n            frame.XSplitOperator.Frame=frame;\\r\\n            frame.XSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n\\r\\n            if (i!=windowCount-1) frame.XSplitOperator.ShowText=false;\\r\\n\\r\\n            for(var j=frame.HorizontalMin;j<=frame.HorizontalMax;j+=1)\\r\\n            {\\r\\n                frame.HorizontalInfo[j]= new CoordinateInfo();\\r\\n                frame.HorizontalInfo[j].Value=j;\\r\\n                if (i==0 && j==frame.HorizontalMin) continue;\\r\\n\\r\\n                frame.HorizontalInfo[j].Message[1]=j.toString();\\r\\n                frame.HorizontalInfo[j].Font=\\\"14px 微软雅黑\\\";\\r\\n            }\\r\\n\\r\\n            var subFrame=new SubFrameItem();\\r\\n            subFrame.Frame=frame;\\r\\n            if (i==0)\\r\\n                subFrame.Height=20;\\r\\n            else\\r\\n                subFrame.Height=10;\\r\\n\\r\\n            this.Frame.SubFrame[i]=subFrame;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n//  走势图横屏显示\\r\\n//\\r\\nfunction MinuteChartHScreenContainer(uielement)\\r\\n{\\r\\n    this.newMethod=MinuteChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='MinuteChartHScreenContainer';\\r\\n\\r\\n    this.OnMouseMove=function(x,y,e,isPhone)\\r\\n    {\\r\\n        this.LastPoint.X=x;\\r\\n        this.LastPoint.Y=y;\\r\\n        this.CursorIndex=this.Frame.GetXData(y);\\r\\n\\r\\n        var clientPos=this.PtInClient(x,y);\\r\\n        var option={ ParentFunction:'OnMouseMove', Point:{X:x, Y:y}, IsPhone:isPhone===true,ClientPos:clientPos };\\r\\n        this.DrawDynamicInfo(option);\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    //windowCount 窗口个数\\r\\n    this.Create=function(windowCount)\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建十字光标\\r\\n        this.ChartCorssCursor=new ChartCorssCursor();\\r\\n        this.ChartCorssCursor.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.StringFormatX=new HQMinuteTimeStringFormat();\\r\\n        this.ChartCorssCursor.StringFormatY=new HQPriceStringFormat();\\r\\n        this.ChartCorssCursor.CallAcutionXOperator=new CallAcutionXOperator();\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n        this.ChartSplashPaint.HQChart=this;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new HQTradeHScreenFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=25;\\r\\n        this.Frame.ChartBorder.Left=50;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.Frame=this.Frame; //十字光标绑定框架\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n\\r\\n        this.CreateChildWindow(windowCount);\\r\\n        this.CreateMainKLine();\\r\\n\\r\\n        //子窗口动态标题\\r\\n        for(var i in this.Frame.SubFrame)\\r\\n        {\\r\\n            var titlePaint=new DynamicChartTitlePainting();\\r\\n            titlePaint.Frame=this.Frame.SubFrame[i].Frame;\\r\\n            titlePaint.Canvas=this.Canvas;\\r\\n            titlePaint.LanguageID=this.LanguageID;\\r\\n            titlePaint.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            this.TitlePaint.push(titlePaint);\\r\\n        }\\r\\n\\r\\n        this.ChartCorssCursor.StringFormatX.Frame=this.Frame.SubFrame[0].Frame;\\r\\n        this.ChartCorssCursor.StringFormatY.Frame=this.Frame;\\r\\n        this.ChartCorssCursor.CallAcutionXOperator.Frame=this.Frame.SubFrame[0].Frame;\\r\\n\\r\\n        this.UIElement.addEventListener(\\\"keydown\\\", OnKeyDown, true);    //键盘消息\\r\\n    }\\r\\n\\r\\n    //创建子窗口\\r\\n    this.CreateChildWindow=function(windowCount)\\r\\n    {\\r\\n        for(var i=0;i<windowCount;++i)\\r\\n        {\\r\\n            var border=new ChartBorder();\\r\\n            border.UIElement=this.UIElement;\\r\\n\\r\\n            var frame=new MinuteHScreenFrame();\\r\\n            frame.Canvas=this.Canvas;\\r\\n            frame.ChartBorder=border;\\r\\n            frame.Identify=i;\\r\\n            if (i<2) frame.ChartBorder.TitleHeight=0;\\r\\n            frame.XPointCount=243;\\r\\n\\r\\n            var DEFAULT_HORIZONTAL=[9,8,7,6,5,4,3,2,1];\\r\\n            frame.HorizontalMax=DEFAULT_HORIZONTAL[0];\\r\\n            frame.HorizontalMin=DEFAULT_HORIZONTAL[DEFAULT_HORIZONTAL.length-1];\\r\\n\\r\\n            if (i==0)\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitMinutePriceY();\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('price');\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                frame.YSplitOperator=new FrameSplitY();\\r\\n                frame.YSplitOperator.LanguageID=this.LanguageID;\\r\\n                frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n                frame.YSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            }\\r\\n\\r\\n            frame.YSplitOperator.Frame=frame;\\r\\n            frame.YSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator=new FrameSplitMinuteX();\\r\\n            frame.XSplitOperator.Frame=frame;\\r\\n            frame.XSplitOperator.ChartBorder=border;\\r\\n            frame.XSplitOperator.GetEventCallback=(id)=> { return this.GetEventCallback(id); }\\r\\n            if (i!=windowCount-1) frame.XSplitOperator.ShowText=false;\\r\\n            frame.XSplitOperator.Operator();\\r\\n\\r\\n            for(var j in DEFAULT_HORIZONTAL)\\r\\n            {\\r\\n                frame.HorizontalInfo[j]= new CoordinateInfo();\\r\\n                frame.HorizontalInfo[j].Value=DEFAULT_HORIZONTAL[j];\\r\\n                if (i==0 && j==frame.HorizontalMin) continue;\\r\\n\\r\\n                frame.HorizontalInfo[j].Message[1]=DEFAULT_HORIZONTAL[j].toString();\\r\\n                frame.HorizontalInfo[j].Font=\\\"14px 微软雅黑\\\";\\r\\n            }\\r\\n\\r\\n            var subFrame=new SubFrameItem();\\r\\n            subFrame.Frame=frame;\\r\\n            if (i==0)\\r\\n                subFrame.Height=20;\\r\\n            else\\r\\n                subFrame.Height=10;\\r\\n\\r\\n            this.Frame.SubFrame[i]=subFrame;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n/////////////////////////////////////////////////////////////////////////////////\\r\\n//  深度图\\r\\n//\\r\\nfunction DepthChartContainer(uielement)\\r\\n{\\r\\n    this.newMethod=JSChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"DepthChartContainer\\\";\\r\\n    this.Symbol;\\r\\n\\r\\n    //数据\\r\\n    this.MapAsk=new Map();\\r\\n    this.MapBid=new Map();\\r\\n\\r\\n    this.IsAutoUpdate=false;                    //是否自动更新行情数据\\r\\n    this.AutoUpdateFrequency=30000;             //30秒更新一次数据\\r\\n    this.AutoUpdateTimer;\\r\\n\\r\\n    this.DefaultZoom=0.8;       //默认显示80%的盘口 (0 - 1)\\r\\n    this.MaxVolRate=1.1;\\r\\n\\r\\n    this.Create=function(option)\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建十字光标\\r\\n        this.ChartCorssCursor=new DepthChartCorssCursor();\\r\\n        this.ChartCorssCursor.Canvas=this.Canvas;\\r\\n        this.ChartCorssCursor.HQChart=this;\\r\\n        //this.ChartCorssCursor.StringFormatX=g_DivTooltipDataForamt.Create(\\\"CorssCursor_XStringFormat\\\");\\r\\n        //this.ChartCorssCursor.StringFormatX.LanguageID=this.LanguageID;\\r\\n        //this.ChartCorssCursor.StringFormatY=g_DivTooltipDataForamt.Create(\\\"CorssCursor_YStringFormat\\\");\\r\\n        //this.ChartCorssCursor.StringFormatY.LanguageID=this.LanguageID;\\r\\n\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n\\r\\n        //创建框架\\r\\n        this.Frame=new DepthChartFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=30;\\r\\n        this.Frame.ChartBorder.Left=5;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.ChartBorder.TitleHeight=0;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n\\r\\n        var ySplitOper=new FrameSplitY();\\r\\n        ySplitOper.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        ySplitOper.LanguageID=this.LanguageID;\\r\\n        ySplitOper.Frame=this.Frame;\\r\\n        ySplitOper.SplitCount=5;\\r\\n        ySplitOper.LineType=3;\\r\\n        ySplitOper.IgnoreYValue=[0];\\r\\n        //ySplitOper.SplitType=2;\\r\\n        ySplitOper.ChartBorder=this.Frame.ChartBorder;\\r\\n        this.Frame.YSplitOperator=ySplitOper;\\r\\n\\r\\n        var xSplitOper=new FrameSplitXDepth();\\r\\n        xSplitOper.Frame=this.Frame;;\\r\\n        xSplitOper.ChartBorder=this.Frame.ChartBorder;;\\r\\n        xSplitOper.LanguageID=this.LanguageID;\\r\\n        xSplitOper.LineType=3;\\r\\n        this.Frame.XSplitOperator=xSplitOper\\r\\n\\r\\n        if (this.ChartCorssCursor) this.ChartCorssCursor.Frame=this.Frame; //十字光标绑定框架\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n\\r\\n        var chartItem=new ChartOrderbookDepth();\\r\\n        chartItem.Canvas=this.Canvas;\\r\\n        chartItem.ChartBorder=this.Frame.ChartBorder;\\r\\n        chartItem.ChartFrame=this.Frame;\\r\\n        chartItem.Name=\\\"深度图\\\"\\r\\n        this.ChartPaint.push(chartItem);\\r\\n\\r\\n        var bRegisterKeydown=true;\\r\\n        var bRegisterWheel=true;\\r\\n        if (option)\\r\\n        {\\r\\n            if (option.Wheel===false)\\r\\n            {\\r\\n                bRegisterWheel=false;\\r\\n                JSConsole.Chart.Log('[DepthChartContainer::Create] not register wheel event.');\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (bRegisterKeydown) this.UIElement.addEventListener(\\\"keydown\\\", (e)=>{ this.OnKeyDown(e); }, true);            //键盘消息\\r\\n        if (bRegisterWheel) this.UIElement.addEventListener(\\\"wheel\\\", (e)=>{ this.OnWheel(e); }, true);                //上下滚动消息\\r\\n    }\\r\\n\\r\\n    this.OnWheel=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[KLineChartContainer::OnWheel]',e);\\r\\n        var x = e.clientX-this.UIElement.getBoundingClientRect().left;\\r\\n        var y = e.clientY-this.UIElement.getBoundingClientRect().top;\\r\\n\\r\\n        var isInClient=false;\\r\\n        this.Canvas.beginPath();\\r\\n        this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());\\r\\n        isInClient=this.Canvas.isPointInPath(x,y);\\r\\n\\r\\n        var wheelValue=e.wheelDelta;\\r\\n        if (!IFrameSplitOperator.IsObjectExist(e.wheelDelta))\\r\\n            wheelValue=e.deltaY* -0.01;\\r\\n\\r\\n        var enableZoomUpDown=true;  //是否允许缩放\\r\\n        if (this.EnableZoomUpDown && this.EnableZoomUpDown.Wheel===false) enableZoomUpDown=false;\\r\\n\\r\\n        if (isInClient && wheelValue<0 && enableZoomUpDown)       //缩小\\r\\n        {\\r\\n            if (this.Frame.ZoomDown())\\r\\n            {\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n            }\\r\\n        }\\r\\n        else if (isInClient && wheelValue>0 && enableZoomUpDown)  //放大\\r\\n        {\\r\\n            if (this.Frame.ZoomUp())\\r\\n            {\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if(e.preventDefault) e.preventDefault();\\r\\n        else e.returnValue = false;\\r\\n    }\\r\\n\\r\\n    this.UIOnMouseDown=function(e)\\r\\n    {\\r\\n    }\\r\\n\\r\\n    this.OnTouchStart=function(e)\\r\\n    {\\r\\n        if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;\\r\\n\\r\\n        this.IsOnTouch=true;\\r\\n        this.TouchDrawCount=0;\\r\\n        this.PhonePinch=null;\\r\\n\\r\\n        var isSingleTouch=this.IsSingleTouch(e);\\r\\n        if (this.EnableScrollUpDown==false || !isSingleTouch) //多点触屏\\r\\n        {\\r\\n            if (e.cancelable) e.preventDefault();\\r\\n        }\\r\\n\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            var drag=\\r\\n                {\\r\\n                    \\\"Click\\\":{},\\r\\n                    \\\"LastMove\\\":{}  //最后移动的位置\\r\\n                };\\r\\n\\r\\n            var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n\\r\\n            drag.Click.X=touches[0].clientX;\\r\\n            drag.Click.Y=touches[0].clientY;\\r\\n            drag.LastMove.X=touches[0].clientX;\\r\\n            drag.LastMove.Y=touches[0].clientY;\\r\\n\\r\\n            this.MouseDrag=drag;\\r\\n\\r\\n            this.MoveCorssCursor(drag.Click,e);\\r\\n        }\\r\\n        else if (this.IsPhonePinching(e))\\r\\n        {\\r\\n            var phonePinch=\\r\\n                {\\r\\n                    \\\"Start\\\":{},\\r\\n                    \\\"Last\\\":{}\\r\\n                };\\r\\n\\r\\n            var touches=this.GetToucheData(e,this.IsForceLandscape);\\r\\n\\r\\n            phonePinch.Start={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n            phonePinch.Last={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n\\r\\n            this.PhonePinch=phonePinch;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.OnTouchMove=function(e)\\r\\n    {\\r\\n        var touches=this.GetToucheData(e,false);\\r\\n        if (this.IsPhoneDragging(e))\\r\\n        {\\r\\n            var drag=this.MouseDrag;\\r\\n            if (drag==null)\\r\\n            {\\r\\n                var pixelTatio = GetDevicePixelRatio();\\r\\n                var x = touches[0].clientX-uielement.getBoundingClientRect().left*pixelTatio;\\r\\n                var y = touches[0].clientY-uielement.getBoundingClientRect().top*pixelTatio;\\r\\n                this.OnMouseMove(x,y,e);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var moveAngle=this.GetMoveAngle(drag.LastMove,{X:touches[0].clientX, Y:touches[0].clientY});\\r\\n                var moveSetp=Math.abs(drag.LastMove.X-touches[0].clientX);\\r\\n                var moveUpDown=Math.abs(drag.LastMove.Y-touches[0].clientY);\\r\\n                moveSetp=parseInt(moveSetp);\\r\\n\\r\\n                //上下滚动\\r\\n                if ( ((moveUpDown>0 && moveSetp<=3) || moveAngle<=this.TouchMoveMinAngle) && this.EnableScrollUpDown==true )\\r\\n                {\\r\\n                    return;\\r\\n                }\\r\\n\\r\\n                this.PreventTouchEvent(e);\\r\\n                this.MouseDrag=null;\\r\\n                var pixelTatio = GetDevicePixelRatio();\\r\\n                var x = touches[0].clientX-uielement.getBoundingClientRect().left*pixelTatio;\\r\\n                var y = touches[0].clientY-uielement.getBoundingClientRect().top*pixelTatio;\\r\\n                this.OnMouseMove(x,y,e);\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsPhonePinching(e))\\r\\n        {\\r\\n            this.PreventTouchEvent(e);\\r\\n            var phonePinch=this.PhonePinch;\\r\\n            if (!phonePinch) return;\\r\\n\\r\\n            if (this.EnableZoomUpDown && this.EnableZoomUpDown.Touch===false) return;\\r\\n\\r\\n            var yHeight=Math.abs(touches[0].pageY-touches[1].pageY);\\r\\n            var yLastHeight=Math.abs(phonePinch.Last.Y-phonePinch.Last.Y2);\\r\\n            var yStep=yHeight-yLastHeight;\\r\\n\\r\\n            var xHeight=Math.abs(touches[0].pageX-touches[1].pageX);\\r\\n            var xLastHeight=Math.abs(phonePinch.Last.X-phonePinch.Last.X2);\\r\\n            var xStep=xHeight-xLastHeight;\\r\\n            var minStep=this.ZoomStepPixel;\\r\\n            if (Math.abs(yStep)<minStep && Math.abs(xStep)<minStep) return;\\r\\n            var step=yStep;\\r\\n            if (Math.abs(yStep)<minStep) step=xStep;\\r\\n\\r\\n            if (step>0)    //放大\\r\\n            {\\r\\n                if (!this.Frame.ZoomUp()) return;\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n            }\\r\\n            else        //缩小\\r\\n            {\\r\\n                if (!this.Frame.ZoomDown()) return;\\r\\n                this.UpdateFrameMaxMin();\\r\\n                this.Draw();\\r\\n            }\\r\\n\\r\\n            phonePinch.Last={\\\"X\\\":touches[0].pageX,\\\"Y\\\":touches[0].pageY,\\\"X2\\\":touches[1].pageX,\\\"Y2\\\":touches[1].pageY};\\r\\n        }\\r\\n\\r\\n        this.PreventTouchEvent(e);\\r\\n    }\\r\\n\\r\\n    this.OnTouchEnd=function(e)\\r\\n    {\\r\\n        JSConsole.Chart.Log('[DepthChartContainer::OnTouchEnd]',e);\\r\\n        this.IsOnTouch = false;\\r\\n        this.OnTouchFinished();\\r\\n        this.TouchDrawCount=0;\\r\\n    }\\r\\n\\r\\n    this.OnTouchFinished=function()\\r\\n    {\\r\\n        if (this.CorssCursorTouchEnd===true)    //手势离开十字光标消失\\r\\n        {\\r\\n            this.DrawDynamicInfo();\\r\\n            return;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ChangeSymbol=function(symbol)\\r\\n    {\\r\\n        this.CancelAutoUpdate();    //先停止定时器\\r\\n        this.Symbol=symbol;\\r\\n        this.MapBid=new Map();\\r\\n        this.MapAsk=new Map();\\r\\n        this.Frame.VerticalRange.Differ=null;\\r\\n\\r\\n        this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);\\r\\n        this.ChartSplashPaint.EnableSplash(true);\\r\\n        this.Draw();\\r\\n\\r\\n        this.RequestDepthData();\\r\\n    }\\r\\n\\r\\n    this.RequestDepthData=function()  //全量历史数据\\r\\n    {\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'DepthChartContainer::RequestDepthData', //类名::\\r\\n                    Explain:'深度图数据',\\r\\n                    Request:{ Data: { symbol:self.Symbol } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.ChartSplashPaint.EnableSplash(false);\\r\\n                self.RecvDepthData(data);\\r\\n                self.AutoUpdate();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvDepthData=function(data)\\r\\n    {\\r\\n        this.UpdateAskAndBid(data);\\r\\n\\r\\n        var aryAsk=Array.from(this.MapAsk.values());    //卖    右边\\r\\n        aryAsk.sort((a,b)=> { return a.Price-b.Price; });\\r\\n        var sumVol=0;\\r\\n        for(var i in aryAsk)\\r\\n        {\\r\\n            var item=aryAsk[i];\\r\\n            sumVol+=item.Vol;\\r\\n\\r\\n            aryAsk[i]={Price:item.Price, Vol:sumVol };\\r\\n        }\\r\\n\\r\\n        var aryBid=Array.from(this.MapBid.values());    //买    左边\\r\\n        aryBid.sort((a,b)=> { return b.Price-a.Price; });\\r\\n        var sumVol=0;\\r\\n        for(var i in aryBid)\\r\\n        {\\r\\n            var item=aryBid[i];\\r\\n            sumVol+=item.Vol;\\r\\n\\r\\n            aryBid[i]={Price:item.Price, Vol:sumVol };\\r\\n        }\\r\\n\\r\\n        var drawData={ Asks:aryAsk, Bids:aryBid };\\r\\n        var chart=this.ChartPaint[0];\\r\\n        chart.Data=drawData;\\r\\n\\r\\n        this.Frame.XSplitOperator.Symbol=this.Symbol;\\r\\n        this.ChartCorssCursor.Data=drawData;\\r\\n        this.ChartCorssCursor.Symbol=this.Symbol;\\r\\n\\r\\n        this.UpdateFramePriceList();\\r\\n        this.UpdateFrameMaxMin();\\r\\n\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n    this.UpdateAskAndBid=function(data) //更新数据\\r\\n    {\\r\\n        if(data.datatype==\\\"snapshot\\\") //全量数据\\r\\n        {\\r\\n            this.MapBid=new Map();\\r\\n            this.MapAsk=new Map();\\r\\n        }\\r\\n\\r\\n        for(var i in data.asks)\\r\\n        {\\r\\n            var item=data.asks[i];\\r\\n            var price=parseFloat(item[0]);\\r\\n            var vol=parseFloat(item[1]);\\r\\n\\r\\n            if (this.MapAsk.has(price))\\r\\n            {\\r\\n                var value=this.MapAsk.get(price);\\r\\n                if (vol<=0) this.MapAsk.delete(price);\\r\\n                else value.Vol=vol;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (vol>0) this.MapAsk.set(price, { Price:price, Vol:vol});\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(var i in data.bids)\\r\\n        {\\r\\n            var item=data.bids[i];\\r\\n            var price=parseFloat(item[0]);\\r\\n            var vol=parseFloat(item[1]);\\r\\n\\r\\n            if (this.MapBid.has(price))\\r\\n            {\\r\\n                var value=this.MapBid.get(price);\\r\\n                if (vol<=0) this.MapBid.delete(price);\\r\\n                else value.Vol=vol;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (vol>0) this.MapBid.set(price, { Price:price, Vol:vol});\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.UpdateFramePriceList=function()\\r\\n    {\\r\\n        var aryAskPrice=Array.from(this.MapAsk.keys());\\r\\n        var aryBidPrice=Array.from(this.MapBid.keys());\\r\\n\\r\\n        aryAskPrice.sort((a,b)=> { return a-b; });\\r\\n        aryBidPrice.sort((a,b)=> { return a-b; });\\r\\n\\r\\n        var range={ Max:88, Min:8 };\\r\\n        if (aryAskPrice.length>1 && aryBidPrice.length>1)\\r\\n        {\\r\\n            var askMin=aryAskPrice[0], askMax=aryAskPrice[aryAskPrice.length-1];\\r\\n            var bidMin=aryBidPrice[0], bidMax=aryBidPrice[aryBidPrice.length-1];\\r\\n            var askDifference=askMax-askMin;    //卖差值\\r\\n            var bidDifference=bidMax-bidMin;    //买差值\\r\\n            var difference=Math.max(askDifference, bidDifference);   //取最大的差值,2边调整\\r\\n\\r\\n            var ask={Min:askMin, Max:askMin+difference};\\r\\n            var bid={Max:bidMax, Min:bidMax-difference};\\r\\n            range={ Max:ask.Max, Min:bid.Min };\\r\\n        }\\r\\n\\r\\n        this.Frame.SetPriceList(aryAskPrice,aryBidPrice);\\r\\n        var xRange=this.Frame.VerticalRange;\\r\\n        xRange.Max=range.Max;\\r\\n        xRange.Center=range.Min+(range.Max-range.Min)/2;\\r\\n        xRange.Min=range.Min;\\r\\n        xRange.MaxDiffer=difference;        //差值\\r\\n        xRange.Ask=ask;\\r\\n        xRange.Bid=bid;\\r\\n        if (!IFrameSplitOperator.IsNumber(xRange.Differ))\\r\\n            xRange.Differ=difference*this.DefaultZoom;\\r\\n\\r\\n        xRange.Min=xRange.Center-xRange.Differ;\\r\\n        xRange.Max=xRange.Center+xRange.Differ;\\r\\n    }\\r\\n\\r\\n    this.UpdateFrameMaxMin=function()\\r\\n    {\\r\\n        var range=this.ChartPaint[0].GetMaxMin();\\r\\n\\r\\n        this.Frame.HorizontalMax=range.Max*this.MaxVolRate;\\r\\n        this.Frame.HorizontalMin=0;\\r\\n        this.Frame.XYSplit=true;\\r\\n    }\\r\\n\\r\\n    this.CancelAutoUpdate=function()    //关闭停止更新\\r\\n    {\\r\\n        if (typeof (this.AutoUpdateTimer) == 'number')\\r\\n        {\\r\\n            clearTimeout(this.AutoUpdateTimer);\\r\\n            this.AutoUpdateTimer = undefined;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.StopAutoUpdate=function()\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        if (!this.IsAutoUpdate) return;\\r\\n        this.IsAutoUpdate=false;\\r\\n    }\\r\\n\\r\\n    this.AutoUpdate=function()  //数据自动更新\\r\\n    {\\r\\n        this.CancelAutoUpdate();\\r\\n        if (!this.IsAutoUpdate) return;\\r\\n        if (!this.Symbol) return;\\r\\n\\r\\n        var self = this;\\r\\n        var marketStatus=MARKET_SUFFIX_NAME.GetMarketStatus(this.Symbol);\\r\\n        if (marketStatus==0 || marketStatus==3) return; //闭市,盘后\\r\\n\\r\\n        var frequency=this.AutoUpdateFrequency;\\r\\n        if (marketStatus==1) //盘前\\r\\n        {\\r\\n            this.AutoUpdateTimer=setTimeout(function()\\r\\n            {\\r\\n                self.AutoUpdate();\\r\\n            },frequency);\\r\\n        }\\r\\n        else if (marketStatus==2)   //盘中\\r\\n        {\\r\\n            this.AutoUpdateTimer=setTimeout(function()\\r\\n            {\\r\\n                self.RequestDepthData();\\r\\n            },frequency);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n//  简单的图形框架\\r\\n//\\r\\nfunction SimlpleChartContainer(uielement)\\r\\n{\\r\\n    this.newMethod=JSChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.MainDataControl;    //主数据类(对外的接口类)\\r\\n    //this.SubDataControl=new Array();\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建十字光标\\r\\n        //this.ChartCorssCursor=new ChartCorssCursor();\\r\\n        //this.ChartCorssCursor.Canvas=this.Canvas;\\r\\n        //this.ChartCorssCursor.StringFormatX=new HQDateStringFormat();\\r\\n        //this.ChartCorssCursor.StringFormatY=new HQPriceStringFormat();\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new SimpleChartFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=30;\\r\\n        this.Frame.ChartBorder.Left=5;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n        if (this.ChartCorssCursor) this.ChartCorssCursor.Frame=this.Frame; //十字光标绑定框架\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n\\r\\n        this.CreateMainChart();\\r\\n\\r\\n        this.UIElement.addEventListener(\\\"keydown\\\", OnKeyDown, true);    //键盘消息\\r\\n    }\\r\\n\\r\\n    this.SetMainDataConotrl=function(dataControl)\\r\\n    {\\r\\n        if (!dataControl) return;\\r\\n\\r\\n        this.MainDataControl=dataControl;\\r\\n        this.ChartPaint=[]; //图形\\r\\n\\r\\n        this.CreateMainChart();\\r\\n        this.Draw();\\r\\n        this.RequestData();\\r\\n    }\\r\\n\\r\\n    //创建主数据画法\\r\\n    this.CreateMainChart=function()\\r\\n    {\\r\\n        if (!this.MainDataControl) return;\\r\\n\\r\\n        for(let i in this.MainDataControl.DataType)\\r\\n        {\\r\\n            let item=this.MainDataControl.DataType[i];\\r\\n            if (item.Type==\\\"BAR\\\")\\r\\n            {\\r\\n                var chartItem=new ChartBar();\\r\\n                chartItem.Canvas=this.Canvas;\\r\\n                chartItem.ChartBorder=this.Frame.ChartBorder;\\r\\n                chartItem.ChartFrame=this.Frame;\\r\\n                chartItem.Name=item.Name;\\r\\n                if (item.Color) chartItem.UpBarColor=item.Color;\\r\\n                if (item.Color2) chartItem.DownBarColor=item.Color2;\\r\\n\\r\\n                this.ChartPaint.push(chartItem);\\r\\n            }\\r\\n            else if (item.Type==\\\"LINE\\\")\\r\\n            {\\r\\n                var chartItem=new ChartLine();\\r\\n                chartItem.Canvas=this.Canvas;\\r\\n                chartItem.ChartBorder=this.Frame.ChartBorder;\\r\\n                chartItem.ChartFrame=this.Frame;\\r\\n                chartItem.Name=item.Name;\\r\\n                if (item.Color) chartItem.Color=item.Color;\\r\\n\\r\\n                this.ChartPaint.push(chartItem);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Frame.YSplitOperator=new FrameSplitY();\\r\\n        this.Frame.YSplitOperator.FrameSplitData=this.FrameSplitData.get('double');\\r\\n        this.Frame.YSplitOperator.Frame=this.Frame;\\r\\n        this.Frame.YSplitOperator.ChartBorder=this.Frame.ChartBorder;\\r\\n\\r\\n        this.Frame.XSplitOperator=new FrameSplitXData();\\r\\n        this.Frame.XSplitOperator.Frame=this.Frame;\\r\\n        this.Frame.XSplitOperator.ChartBorder=this.Frame.ChartBorder;\\r\\n\\r\\n\\r\\n        // this.TitlePaint[0]=new DynamicKLineTitlePainting();\\r\\n        // this.TitlePaint[0].Frame=this.Frame.SubFrame[0].Frame;\\r\\n        // this.TitlePaint[0].Canvas=this.Canvas;\\r\\n    }\\r\\n\\r\\n    this.RequestData=function()\\r\\n    {\\r\\n        if(!this.MainDataControl) return;\\r\\n\\r\\n        this.MainDataControl.JSChartContainer=this;\\r\\n        this.MainDataControl.RequestData();\\r\\n    }\\r\\n\\r\\n    this.UpdateMainData=function(dataControl)\\r\\n    {\\r\\n\\r\\n        let lCount=0;\\r\\n        for(let i in dataControl.Data)\\r\\n        {\\r\\n            let itemData=new ChartData();\\r\\n            itemData.Data=dataControl.Data[i];\\r\\n            this.ChartPaint[i].Data=itemData;\\r\\n            if (lCount<itemData.Data.length) lCount=itemData.Data.length;\\r\\n        }\\r\\n\\r\\n        this.Frame.XPointCount=lCount;\\r\\n        this.Frame.Data=this.ChartPaint[0].Data;\\r\\n        this.Frame.XData=dataControl.XData;\\r\\n\\r\\n        this.UpdateFrameMaxMin();               //调整坐标最大 最小值\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////////////\\r\\n//  饼图图形框架\\r\\n//\\r\\nfunction PieChartContainer(uielement)\\r\\n{\\r\\n    this.Radius;    //半径\\r\\n    this.newMethod=JSChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.MainDataControl;    //主数据类(对外的接口类)\\r\\n\\r\\n    //鼠标移动\\r\\n    this.OnMouseMove=function(x,y,e)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new NoneFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=30;\\r\\n        this.Frame.ChartBorder.Left=5;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n        this.CreateMainChart();\\r\\n    }\\r\\n\\r\\n    this.SetMainDataConotrl=function(dataControl)\\r\\n    {\\r\\n        if (!dataControl) return;\\r\\n\\r\\n        this.MainDataControl=dataControl;\\r\\n        this.ChartPaint=[]; //图形\\r\\n\\r\\n        this.CreateMainChart();\\r\\n        this.Draw();\\r\\n        this.RequestData();\\r\\n    }\\r\\n\\r\\n    //创建主数据画法\\r\\n    this.CreateMainChart=function()\\r\\n    {\\r\\n        if (!this.MainDataControl) return;\\r\\n\\r\\n        for(let i in this.MainDataControl.DataType)\\r\\n        {\\r\\n            let item=this.MainDataControl.DataType[i];\\r\\n            if (item.Type==\\\"PIE\\\")    //饼图\\r\\n            {\\r\\n\\r\\n                var chartItem=new ChartPie();\\r\\n                chartItem.Canvas=this.Canvas;\\r\\n                chartItem.ChartBorder=this.Frame.ChartBorder;\\r\\n                chartItem.ChartFrame=this.Frame;\\r\\n                chartItem.Name=item.Name;\\r\\n\\r\\n                if(this.Radius) chartItem.Radius = this.Radius;\\r\\n\\r\\n                this.ChartPaint.push(chartItem);\\r\\n            }\\r\\n            else if (item.Type=='RADAR') //雷达图\\r\\n            {\\r\\n                var chartItem=new ChartRadar();\\r\\n                chartItem.Canvas=this.Canvas;\\r\\n                chartItem.ChartBorder=this.Frame.ChartBorder;\\r\\n                chartItem.ChartFrame=this.Frame;\\r\\n                chartItem.Name=item.Name;\\r\\n                if (item.StartAngle) chartItem.StartAngle=item.StartAngle;\\r\\n                this.ChartPaint.push(chartItem);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        // this.TitlePaint[0]=new DynamicKLineTitlePainting();\\r\\n        // this.TitlePaint[0].Frame=this.Frame.SubFrame[0].Frame;\\r\\n        // this.TitlePaint[0].Canvas=this.Canvas;\\r\\n    }\\r\\n\\r\\n    this.RequestData=function()\\r\\n    {\\r\\n        if(!this.MainDataControl) return;\\r\\n\\r\\n        this.MainDataControl.JSChartContainer=this;\\r\\n        this.MainDataControl.RequestData();\\r\\n    }\\r\\n\\r\\n    this.UpdateMainData=function(dataControl)\\r\\n    {\\r\\n        for(let i in dataControl.Data)\\r\\n        {\\r\\n            let itemData=new ChartData();\\r\\n            itemData.Data=dataControl.Data[i];\\r\\n            this.ChartPaint[i].Data=itemData;\\r\\n        }\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//地图\\r\\nfunction MapChartContainer(uielement)\\r\\n{\\r\\n    this.newMethod=JSChartContainer;   //派生\\r\\n    this.newMethod(uielement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.MainDataControl;    //主数据类(对外的接口类)\\r\\n\\r\\n    //鼠标移动\\r\\n    this.OnMouseMove=function(x,y,e)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.UIElement.JSChartContainer=this;\\r\\n\\r\\n        //创建等待提示\\r\\n        this.ChartSplashPaint = new ChartSplashPaint();\\r\\n        this.ChartSplashPaint.Canvas = this.Canvas;\\r\\n\\r\\n        //创建框架容器\\r\\n        this.Frame=new NoneFrame();\\r\\n        this.Frame.ChartBorder=new ChartBorder();\\r\\n        this.Frame.ChartBorder.UIElement=this.UIElement;\\r\\n        this.Frame.ChartBorder.Top=30;\\r\\n        this.Frame.ChartBorder.Left=5;\\r\\n        this.Frame.ChartBorder.Bottom=20;\\r\\n        this.Frame.Canvas=this.Canvas;\\r\\n\\r\\n        this.ChartSplashPaint.Frame = this.Frame;\\r\\n        this.CreateMainChart();\\r\\n    }\\r\\n\\r\\n    this.SetMainDataConotrl=function(dataControl)\\r\\n    {\\r\\n        if (!dataControl) return;\\r\\n\\r\\n        this.MainDataControl=dataControl;\\r\\n        this.ChartPaint=[]; //图形\\r\\n\\r\\n        this.CreateMainChart();\\r\\n        this.Draw();\\r\\n        this.RequestData();\\r\\n    }\\r\\n\\r\\n    //创建主数据画法\\r\\n    this.CreateMainChart=function()\\r\\n    {\\r\\n        if (!this.MainDataControl) return;\\r\\n\\r\\n        let chartItem=new ChartChinaMap();\\r\\n        chartItem.Canvas=this.Canvas;\\r\\n        chartItem.ChartBorder=this.Frame.ChartBorder;\\r\\n        chartItem.ChartFrame=this.Frame;\\r\\n        chartItem.Name=this.MainDataControl.DataType[0].Name;\\r\\n\\r\\n        if(this.Radius) chartItem.Radius = this.Radius;\\r\\n\\r\\n        this.ChartPaint.push(chartItem);\\r\\n\\r\\n        // this.TitlePaint[0]=new DynamicKLineTitlePainting();\\r\\n        // this.TitlePaint[0].Frame=this.Frame.SubFrame[0].Frame;\\r\\n        // this.TitlePaint[0].Canvas=this.Canvas;\\r\\n    }\\r\\n\\r\\n    this.RequestData=function()\\r\\n    {\\r\\n        if(!this.MainDataControl) return;\\r\\n\\r\\n        this.MainDataControl.JSChartContainer=this;\\r\\n        this.MainDataControl.RequestData();\\r\\n    }\\r\\n\\r\\n    this.UpdateMainData=function(dataControl)\\r\\n    {\\r\\n        this.ChartPaint[0].Data=dataControl.Data[0];\\r\\n\\r\\n        this.Frame.SetSizeChage(true);\\r\\n        this.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//////////////////////////////////////////////////////////\\r\\n//\\r\\n//  指标信息\\r\\n//\\r\\nfunction IndexInfo(name,param)\\r\\n{\\r\\n    this.Name=name;                 //名字\\r\\n    this.Param=param;               //参数\\r\\n    this.LineColor;                 //线段颜色\\r\\n    this.ReqeustData=null;          //数据请求\\r\\n}\\r\\n\\r\\nfunction BaseIndex(name)\\r\\n{\\r\\n    this.Index;         //指标阐述\\r\\n    this.Name=name;     //指标名字\\r\\n    this.Script=null;   //通达信脚本\\r\\n    this.ClassName=\\\"BaseIndex\\\";\\r\\n\\r\\n    this.OverlayIndex=null; //叠加指标{ IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame }\\r\\n    this.GetEventCallback;  //事件回调函数\\r\\n\\r\\n    //默认创建都是线段\\r\\n    this.Create=function(hqChart,windowIndex)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    //指标不支持 周期/复权/股票等\\r\\n    this.NotSupport=function(hqChart,windowIndex,message)\\r\\n    {\\r\\n        var isOverlay=this.IsOverlay();\\r\\n        if (isOverlay) return;\\r\\n\\r\\n        hqChart.DeleteIndexPaint(windowIndex);  //清空\\r\\n        var frame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        var paint=new ChartErrorMessage();\\r\\n        paint.Canvas=hqChart.Canvas;\\r\\n        paint.ChartBorder=frame.ChartBorder;\\r\\n        paint.ChartFrame=frame;\\r\\n        paint.NotSupportMessage=message;\\r\\n\\r\\n        hqChart.ChartPaint.push(paint);\\r\\n    }\\r\\n\\r\\n    //格式化指标名字+参数\\r\\n    //格式:指标名(参数1,参数2,参数3,...)\\r\\n    this.FormatIndexTitle=function()\\r\\n    {\\r\\n        var title=this.Name;\\r\\n        var param=null;\\r\\n\\r\\n        for(var i in this.Index)\\r\\n        {\\r\\n            var item = this.Index[i];\\r\\n            if (item.Param==null) continue;\\r\\n\\r\\n            if (param)\\r\\n                param+=','+item.Param.toString();\\r\\n            else\\r\\n                param=item.Param.toString();\\r\\n        }\\r\\n\\r\\n        if (param)\\r\\n        {\\r\\n            title+='('+param+')';\\r\\n        }\\r\\n\\r\\n        return title;\\r\\n    }\\r\\n\\r\\n    this.IsOverlay=function()   //是否是叠加指标\\r\\n    {\\r\\n        if (!this.OverlayIndex || this.OverlayIndex.IsOverlay!=true) return false;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.CreateChart=function(id)   //创建图形\\r\\n    {\\r\\n        return new ChartLine();\\r\\n    }\\r\\n\\r\\n    this.CreatePaints=function(hqChart,windowIndex)\\r\\n    {\\r\\n        var frame=null;\\r\\n        var isOverlay=this.IsOverlay();\\r\\n        if (isOverlay)\\r\\n        {\\r\\n            frame=this.OverlayIndex.Frame.Frame;\\r\\n            this.OverlayIndex.Frame.ChartPaint=[];    //清空\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            frame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n            hqChart.DeleteIndexPaint(windowIndex);  //清空\\r\\n        }\\r\\n\\r\\n        var aryPaint=[];\\r\\n        for(var i in this.Index)\\r\\n        {\\r\\n            var paint=this.CreateChart(i);\\r\\n            paint.Color=this.Index[i].LineColor;\\r\\n            paint.Canvas=hqChart.Canvas;\\r\\n            paint.Name=this.Name+\\\"-\\\"+i.toString();\\r\\n            paint.ChartBorder=frame.ChartBorder;\\r\\n            paint.ChartFrame=frame\\r\\n\\r\\n            if (isOverlay) this.OverlayIndex.Frame.ChartPaint.push(paint);\\r\\n            else hqChart.ChartPaint.push(paint);\\r\\n\\r\\n            aryPaint.push(paint);\\r\\n        }\\r\\n\\r\\n        return aryPaint;\\r\\n    }\\r\\n\\r\\n    this.SendEvent=function(hqChart,windowIndex,hisData, error)\\r\\n    {\\r\\n        if (!hqChart.GetIndexEvent) return;\\r\\n        var event=hqChart.GetIndexEvent();  //指标计算完成回调\\r\\n        if (!event) return;\\r\\n\\r\\n        var data={ Data:this.GetOutData(), WindowIndex: windowIndex, Name: this.Name, HistoryData: hisData,\\r\\n            Stock: {Symbol:hqChart.Symbol,Name:hqChart.Name} };\\r\\n        if (error) data.Error=error;\\r\\n        event.Callback(event,data,self);\\r\\n    }\\r\\n\\r\\n    this.GetOutData=function()\\r\\n    {\\r\\n        return null;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\nfunction JSIndex_CJL()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('CJL');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"VOL\\\",null),\\r\\n        new IndexInfo(\\\"OPID\\\",null),\\r\\n    );\\r\\n\\r\\n    this.Index[0].LineColor=g_JSChartResource.Index.LineColor[0];\\r\\n    this.Index[1].LineColor=g_JSChartResource.Index.LineColor[1];\\r\\n\\r\\n    this.CreateChart=function(id)\\r\\n    {\\r\\n        if (id==0)\\r\\n        {\\r\\n            var chart=new ChartVolStick();\\r\\n            return chart;\\r\\n        }\\r\\n        else if (id==1)\\r\\n        {\\r\\n            var chart = new ChartSubLine();\\r\\n            chart.LineWidth = 1*GetDevicePixelRatio();\\r\\n            return chart;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        this.BindData(hqChart,windowIndex,hisData);\\r\\n\\r\\n        hqChart.UpdataDataoffset();           //更新数据偏移\\r\\n        hqChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        hqChart.Draw();\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=this.CreatePaints(hqChart,windowIndex);\\r\\n        var isOverlay=this.IsOverlay();\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        var vol=hisData.GetVol();\\r\\n        var position=hisData.GetPosition();\\r\\n\\r\\n        paint[0].HistoryData=hisData;\\r\\n        paint[0].Data.Data=vol;\\r\\n        paint[1].Data.Data=position;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n\\r\\n        if (isOverlay)\\r\\n        {\\r\\n            var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n            var titleInfo={ Data:[], Title:'' };\\r\\n            titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);\\r\\n                titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            hqChart.TitlePaint[titleIndex].Data[0]=new DynamicTitleData(paint[0].Data,this.Index[0].Name,this.Index[0].LineColor);\\r\\n            hqChart.TitlePaint[titleIndex].Data[1]=new DynamicTitleData(paint[1].Data,this.Index[1].Name,this.Index[1].LineColor);\\r\\n            hqChart.TitlePaint[titleIndex].Title = this.Name;\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n//市场多空\\r\\nfunction MarketLongShortIndex()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('Long-Short');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"多头区域\\\",null),\\r\\n        new IndexInfo(\\\"空头区域\\\",null),\\r\\n        new IndexInfo(\\\"市场多空指标\\\",null),\\r\\n    );\\r\\n\\r\\n    this.Index[0].LineColor=g_JSChartResource.UpBarColor;\\r\\n    this.Index[1].LineColor=g_JSChartResource.DownBarColor;\\r\\n    this.Index[2].LineColor=g_JSChartResource.Index.LineColor[0];\\r\\n\\r\\n    this.LongShortData; //多空数据\\r\\n\\r\\n    this.CreateChart=function(id)\\r\\n    {\\r\\n        if (id==2){\\r\\n            var newChartLine = new ChartLine();\\r\\n            newChartLine.LineWidth = 2;\\r\\n            return newChartLine;\\r\\n        }\\r\\n\\r\\n        return new ChartStraightLine();\\r\\n    }\\r\\n\\r\\n    this.GetOutData=function()\\r\\n    {\\r\\n        return { LongShortData:this.LongShortData };\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        this.LongShortData=[];\\r\\n\\r\\n        if (param.HQChart.Period>0)   //周期数据\\r\\n        {\\r\\n            this.NotSupport(param.HQChart,param.WindowIndex,\\\"不支持周期切换\\\");\\r\\n            param.HQChart.Draw();\\r\\n            this.SendEvent(hqChart,windowIndex,hisData,\\\"不支持周期切换\\\");\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: g_JSChartResource.Index.MarketLongShortApiUrl,\\r\\n            data:\\r\\n                {\\r\\n\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n                self.SendEvent(hqChart,windowIndex,hisData);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.data.length<=0) return;\\r\\n\\r\\n        var aryData=new Array();\\r\\n        for(var i in recvData.data)\\r\\n        {\\r\\n            var item=recvData.data[i];\\r\\n            var indexData=new SingleData();\\r\\n            indexData.Date=item[0];\\r\\n            indexData.Value=item[1];\\r\\n            aryData.push(indexData);\\r\\n        }\\r\\n\\r\\n        var aryFittingData=param.HistoryData.GetFittingData(aryData);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        bindData.Period=param.HQChart.Period;   //周期\\r\\n        bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n        this.LongShortData=bindData.GetValue();\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=this.CreatePaints(hqChart,windowIndex);\\r\\n        var isOverlay=this.IsOverlay();\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        //paint[0].Data.Data=SWLData;\\r\\n        paint[2].Data.Data=this.LongShortData;\\r\\n        paint[0].Data.Data[0]=8;\\r\\n        paint[1].Data.Data[0]=1;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n\\r\\n        //指定[0,9]\\r\\n        if (isOverlay)\\r\\n        {\\r\\n            this.OverlayIndex.Frame.Frame.YSpecificMaxMin={Max:9,Min:0,Count:3};\\r\\n            var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n            var titleInfo={ Data:[], Title:'' };\\r\\n            titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);\\r\\n                if (i!=2) titleData.DataType=\\\"StraightLine\\\";\\r\\n                titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin={Max:9,Min:0,Count:3};\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);\\r\\n                if (i!=2) hqChart.TitlePaint[titleIndex].Data[i].DataType=\\\"StraightLine\\\";\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//市场择时\\r\\nfunction MarketTimingIndex()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('Market-Timing');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"因子择时\\\",null)\\r\\n    );\\r\\n\\r\\n    this.TimingData; //择时数据\\r\\n    this.TitleColor=g_JSChartResource.FrameSplitTextColor\\r\\n\\r\\n    this.CreateChart=function(id)\\r\\n    {\\r\\n        return new ChartMACD();\\r\\n    }\\r\\n\\r\\n    this.GetOutData=function()\\r\\n    {\\r\\n        return { TimingData:this.TimingData };\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        this.LongShortData=[];\\r\\n\\r\\n        if (param.HQChart.Period>0)   //周期数据\\r\\n        {\\r\\n            this.NotSupport(param.HQChart,param.WindowIndex,\\\"不支持周期切换\\\");\\r\\n            param.HQChart.Draw();\\r\\n            this.SendEvent(hqChart,windowIndex,hisData,\\\"不支持周期切换\\\");\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: g_JSChartResource.Index.MarketLongShortApiUrl,\\r\\n            data:\\r\\n                {\\r\\n\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n                self.SendEvent(hqChart,windowIndex,hisData);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.data.length<=0) return;\\r\\n\\r\\n        var aryData=new Array();\\r\\n        for(var i in recvData.data)\\r\\n        {\\r\\n            var item=recvData.data[i];\\r\\n            var indexData=new SingleData();\\r\\n            indexData.Date=item[0];\\r\\n            indexData.Value=item[2];\\r\\n            aryData.push(indexData);\\r\\n        }\\r\\n\\r\\n        var aryFittingData=param.HistoryData.GetFittingData(aryData);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        bindData.Period=param.HQChart.Period;   //周期\\r\\n        bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n        this.TimingData=bindData.GetValue();\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=this.CreatePaints(hqChart,windowIndex);\\r\\n        var isOverlay=this.IsOverlay();\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        //paint[0].Data.Data=SWLData;\\r\\n        paint[0].Data.Data=this.TimingData;\\r\\n        paint[0].NotSupportMessage=null;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n\\r\\n        if (isOverlay)\\r\\n        {\\r\\n            var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n            var titleInfo={ Data:[], Title:'' };\\r\\n            titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);\\r\\n                titleData.StringFormat=STRING_FORMAT_TYPE.THOUSANDS;\\r\\n                titleData.FloatPrecision=0;\\r\\n                titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.TitleColor);\\r\\n                hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.THOUSANDS;\\r\\n                hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n//市场关注度\\r\\nfunction MarketAttentionIndex()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('Market-Attention');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"市场关注度\\\",null)\\r\\n    );\\r\\n\\r\\n    this.Data; //关注度数据\\r\\n    this.TitleColor=g_JSChartResource.FrameSplitTextColor;\\r\\n    this.ApiUrl=g_JSChartResource.Index.MarketAttentionApiUrl;\\r\\n\\r\\n    this.CreateChart=function(id)\\r\\n    {\\r\\n        return new ChartMACD();\\r\\n    }\\r\\n\\r\\n    this.GetOutData=function()\\r\\n    {\\r\\n        return { Data:this.Data };\\r\\n    }\\r\\n\\r\\n    //调整框架\\r\\n    this.SetFrame=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var isOverlay=this.IsOverlay();\\r\\n        if (isOverlay)\\r\\n            this.OverlayIndex.Frame.Frame.YSpecificMaxMin={Max:6,Min:0,Count:3};\\r\\n        else\\r\\n            hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin={Max:6,Min:0,Count:3};\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n\\r\\n        if (param.HQChart.Period>0)   //周期数据\\r\\n        {\\r\\n            this.NotSupport(param.HQChart,param.WindowIndex,\\\"不支持周期切换\\\");\\r\\n            param.HQChart.Draw();\\r\\n            this.SendEvent(hqChart,windowIndex,hisData,\\\"不支持周期切换\\\");\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.ApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"symbol\\\":param.HQChart.Symbol,\\r\\n                    \\\"startdate\\\":20100101,\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n                self.SendEvent(hqChart,windowIndex,hisData);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.date.length<0) return;\\r\\n\\r\\n        var aryData=new Array();\\r\\n        for(var i in recvData.date)\\r\\n        {\\r\\n            var indexData=new SingleData();\\r\\n            indexData.Date=recvData.date[i];\\r\\n            indexData.Value=recvData.value[i];\\r\\n            aryData.push(indexData);\\r\\n        }\\r\\n\\r\\n        var aryFittingData=param.HistoryData.GetFittingData(aryData);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        bindData.Period=param.HQChart.Period;   //周期\\r\\n        bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n        this.Data=bindData.GetValue();\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n        this.SetFrame(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=this.CreatePaints(hqChart,windowIndex);\\r\\n        var isOverlay=this.IsOverlay();\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        //paint[0].Data.Data=SWLData;\\r\\n        paint[0].Data.Data=this.Data;\\r\\n        paint[0].NotSupportMessage=null;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        if (isOverlay)\\r\\n        {\\r\\n            var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n            var titleInfo={ Data:[], Title:'' };\\r\\n            titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);\\r\\n                titleData.StringFormat=STRING_FORMAT_TYPE.THOUSANDS;\\r\\n                titleData.FloatPrecision=0;\\r\\n                titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.TitleColor);\\r\\n                hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.THOUSANDS;\\r\\n                hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    行业,指数热度\\r\\n*/\\r\\nfunction MarketHeatIndex()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('Market-Heat');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"热度\\\",5),\\r\\n        new IndexInfo('MA',10),\\r\\n        new IndexInfo('MA',null)\\r\\n    );\\r\\n\\r\\n    this.Data; //关注度数据\\r\\n\\r\\n    this.ApiUrl=g_JSChartResource.Index.MarketHeatApiUrl;\\r\\n\\r\\n    this.Index[0].LineColor=g_JSChartResource.FrameSplitTextColor;\\r\\n    this.Index[1].LineColor=g_JSChartResource.Index.LineColor[0];\\r\\n    this.Index[2].LineColor=g_JSChartResource.Index.LineColor[1];\\r\\n\\r\\n    this.CreateChart=function(id)\\r\\n    {\\r\\n        if (id==0) return new ChartMACD();\\r\\n\\r\\n        return new ChartLine();\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n\\r\\n        if (param.HQChart.Period>0)   //周期数据\\r\\n        {\\r\\n            this.NotSupport(param.HQChart,param.WindowIndex,\\\"不支持周期切换\\\");\\r\\n            param.HQChart.Draw();\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.ApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"symbol\\\":param.HQChart.Symbol,\\r\\n                    \\\"startdate\\\":20100101,\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.date.length<0) return;\\r\\n\\r\\n        var aryData=new Array();\\r\\n        for(var i in recvData.date)\\r\\n        {\\r\\n            var indexData=new SingleData();\\r\\n            indexData.Date=recvData.date[i];\\r\\n            indexData.Value=recvData.value[i];\\r\\n            aryData.push(indexData);\\r\\n        }\\r\\n\\r\\n        var aryFittingData=param.HistoryData.GetFittingData(aryData);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        bindData.Period=param.HQChart.Period;   //周期\\r\\n        bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n        this.Data=bindData.GetValue();\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=this.CreatePaints(hqChart,windowIndex);\\r\\n        var isOverlay=this.IsOverlay();\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        paint[0].Data.Data=this.Data;\\r\\n        paint[0].NotSupportMessage=null;\\r\\n\\r\\n        var MA=HQIndexFormula.MA(this.Data,this.Index[0].Param);\\r\\n        paint[1].Data.Data=MA;\\r\\n\\r\\n        var MA2=HQIndexFormula.MA(this.Data,this.Index[1].Param);\\r\\n        paint[2].Data.Data=MA2;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n\\r\\n        if (isOverlay)\\r\\n        {\\r\\n            var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n            var titleInfo={ Data:[], Title:'' };\\r\\n            titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                var name=''\\r\\n                if(i==0) name=hqChart.Name+this.Index[i].Name;\\r\\n                else name=\\\"MA\\\"+this.Index[i-1].Param;\\r\\n                var titleData=new DynamicTitleData(paint[i].Data,name,this.Index[i].LineColor);\\r\\n                titleData.StringFormat=STRING_FORMAT_TYPE.DEFAULT;\\r\\n                titleData.FloatPrecision=2;\\r\\n                titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i in paint)\\r\\n            {\\r\\n                var name=\\\"\\\";    //显示的名字特殊处理\\r\\n                if(i==0) name=hqChart.Name+this.Index[i].Name;\\r\\n                else name=\\\"MA\\\"+this.Index[i-1].Param;\\r\\n\\r\\n                hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,name,this.Index[i].LineColor);\\r\\n                hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.DEFAULT;\\r\\n                hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=2;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Explain=\\\"热度说明\\\";\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//自定义指数热度\\r\\nfunction CustonIndexHeatIndex()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('Market-Heat');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo('区域',3),\\r\\n        new IndexInfo(\\\"热度指数\\\",10),\\r\\n        new IndexInfo('MA',5),\\r\\n        new IndexInfo('MA',10)\\r\\n    );\\r\\n\\r\\n    this.Data; //关注度数据\\r\\n\\r\\n    this.ApiUrl=g_JSChartResource.Index.CustomIndexHeatApiUrl;\\r\\n\\r\\n    this.Index[1].LineColor=g_JSChartResource.Index.LineColor[1];\\r\\n    this.Index[2].LineColor=g_JSChartResource.Index.LineColor[2];\\r\\n    this.Index[3].LineColor=g_JSChartResource.Index.LineColor[3];\\r\\n\\r\\n    this.Create=function(hqChart,windowIndex)\\r\\n    {\\r\\n        for(var i in this.Index)\\r\\n        {\\r\\n            var paint=null;\\r\\n            if (i==0)\\r\\n            {\\r\\n                paint = new ChartStraightArea();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                paint=new ChartLine();\\r\\n                paint.Color=this.Index[i].LineColor;\\r\\n            }\\r\\n\\r\\n            paint.Canvas=hqChart.Canvas;\\r\\n            paint.Name=this.Name+\\\"-\\\"+i.toString();\\r\\n            paint.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n            paint.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n            hqChart.ChartPaint.push(paint);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n\\r\\n        if (param.HQChart.Period>0)   //周期数据\\r\\n        {\\r\\n            this.NotSupport(param.HQChart,param.WindowIndex,\\\"不支持周期切换\\\");\\r\\n            param.HQChart.Draw();\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.ApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"stock\\\":param.HQChart.CustomStock,\\r\\n                    \\\"date\\\":{\\\"startdate\\\":param.HQChart.QueryDate.Start,\\\"enddate\\\":param.HQChart.QueryDate.End},\\r\\n                    \\\"day\\\":[this.Index[0].Param,this.Index[1].Param],\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.data==null || recvData.data.length<0) return;\\r\\n\\r\\n        //JSConsole.Chart.Log(recvData.data);\\r\\n        var aryData=new Array();\\r\\n        for(let i in recvData.data)\\r\\n        {\\r\\n            let item=recvData.data[i];\\r\\n            let indexData=new SingleData();\\r\\n            indexData.Date=item[0];\\r\\n            indexData.Value=item[1];\\r\\n            aryData.push(indexData);\\r\\n        }\\r\\n\\r\\n        var aryFittingData=param.HistoryData.GetFittingData(aryData);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        bindData.Period=param.HQChart.Period;   //周期\\r\\n        bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n        this.Data=bindData.GetValue();\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        let paint=hqChart.GetChartPaint(windowIndex);\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        paint[0].NotSupportMessage=null;\\r\\n        paint[0].Data.Data=\\r\\n            [\\r\\n                { Value: 0, Value2: 0.2, Color: 'rgb(50,205,50)', Title: '热度1', TitleColor:'rgb(245,255 ,250)'},\\r\\n                { Value: 0.2, Value2: 0.4, Color: 'rgb(255,140,0)', Title: '热度2', TitleColor:'rgb(245,255 ,250)'},\\r\\n                { Value: 0.4, Value2: 0.8, Color: 'rgb(255,106,106)', Title: '热度3', TitleColor:'rgb(245,255 ,250)'},\\r\\n                { Value: 0.8, Value2: 1, Color: 'rgb(208, 32 ,144)', Title: '热度4', TitleColor:'rgb(245,255 ,250)'}\\r\\n            ];\\r\\n\\r\\n        paint[1].Data.Data = this.Data;\\r\\n\\r\\n        let MA=HQIndexFormula.MA(this.Data,this.Index[2].Param);\\r\\n        paint[2].Data.Data=MA;\\r\\n\\r\\n        let MA2=HQIndexFormula.MA(this.Data,this.Index[3].Param);\\r\\n        paint[3].Data.Data=MA2;\\r\\n\\r\\n        //指定框架最大最小[0,1]\\r\\n        hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 1, Min: 0, Count: 3 };\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n\\r\\n        for(let i=1;i<paint.length;++i)\\r\\n        {\\r\\n            let name=this.Index[i].Name;    //显示的名字特殊处理\\r\\n            if (name=='MA') name=\\\"MA\\\"+this.Index[i].Param;\\r\\n\\r\\n            hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,name,this.Index[i].LineColor);\\r\\n            hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.DEFAULT;\\r\\n            hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=2;\\r\\n        }\\r\\n\\r\\n        hqChart.TitlePaint[titleIndex].Title='热度'+'('+this.Index[0].Param+','+this.Index[1].Param+','+this.Index[2].Param+','+this.Index[3].Param+')';\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    本福特系数(财务粉饰)\\r\\n*/\\r\\nfunction BenfordIndex()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('财务粉饰');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index = new Array(\\r\\n        new IndexInfo('区域', null),\\r\\n        new IndexInfo(\\\"系数\\\", null)\\r\\n    );\\r\\n\\r\\n    this.Data; //财务数据\\r\\n\\r\\n    this.ApiUrl=g_JSChartResource.Index.StockHistoryDayApiUrl;\\r\\n\\r\\n    this.Index[0].LineColor=g_JSChartResource.Index.LineColor[0];\\r\\n    this.Index[1].LineColor='rgb(105,105,105)';\\r\\n\\r\\n    this.CreateChart=function(id)\\r\\n    {\\r\\n        if (id==0) return new ChartStraightArea();\\r\\n\\r\\n        return new ChartLineMultiData();\\r\\n    }\\r\\n\\r\\n    this.GetOutData=function()\\r\\n    {\\r\\n        return { Data:this.Data };\\r\\n    }\\r\\n\\r\\n    //请求数据\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n\\r\\n        if (param.HQChart.Period!=2)   //周期数据\\r\\n        {\\r\\n            this.NotSupport(param.HQChart,param.WindowIndex,\\\"只支持月线\\\");\\r\\n            param.HQChart.Draw();\\r\\n            this.SendEvent(hqChart,windowIndex,hisData,\\\"只支持月线\\\");\\r\\n            return false;\\r\\n        }\\r\\n\\r\\n        var aryField=[\\\"finance.benford\\\",\\\"announcement2.quarter\\\",\\\"announcement1.quarter\\\",\\\"announcement3.quarter\\\",\\\"announcement4.quarter\\\"];\\r\\n        var aryCondition=\\r\\n            [\\r\\n                {item:[\\\"date\\\",\\\"int32\\\",\\\"gte\\\",\\\"20130101\\\"]},\\r\\n                {item:[ \\\"announcement1.year\\\",\\\"int32\\\",\\\"gte\\\",0,\\r\\n                        \\\"announcement2.year\\\",\\\"int32\\\",\\\"gte\\\",0,\\r\\n                        \\\"announcement3.year\\\",\\\"int32\\\",\\\"gte\\\",0,\\r\\n                        \\\"announcement4.year\\\",\\\"int32\\\",\\\"gte\\\",0,\\r\\n                        \\\"or\\\"]}\\r\\n            ];\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.ApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"symbol\\\":[param.HQChart.Symbol],\\r\\n                    \\\"field\\\":aryField,\\r\\n                    \\\"condition\\\":aryCondition\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n                self.SendEvent(hqChart,windowIndex,hisData);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.JsonDataToMapSingleData=function(recvData)\\r\\n    {\\r\\n        var stockData=recvData.stock[0].stockday;\\r\\n        var mapData=new Map();\\r\\n        for(var i in stockData)\\r\\n        {\\r\\n            var item=stockData[i];\\r\\n            var indexData=new SingleData();\\r\\n            indexData.Date=item.date;\\r\\n            indexData.Value=new Array();\\r\\n            if (item.finance1!=null && item.announcement1!=null)\\r\\n            {\\r\\n                let year=item.announcement1.year;\\r\\n                let quarter=item.announcement1.quarter;\\r\\n                let value=item.finance1.benford;\\r\\n                indexData.Value.push({Year:year,Quarter:quarter,Value:value});\\r\\n            }\\r\\n            if (item.finance2!=null && item.announcement2!=null)\\r\\n            {\\r\\n                let year=item.announcement2.year;\\r\\n                let quarter=item.announcement2.quarter;\\r\\n                let value=item.finance2.benford;\\r\\n                indexData.Value.push({Year:year,Quarter:quarter,Value:value});\\r\\n            }\\r\\n            if (item.finance3!=null && item.announcement3!=null)\\r\\n            {\\r\\n                let year=item.announcement3.year;\\r\\n                let quarter=item.announcement3.quarter;\\r\\n                let value=item.finance3.benford;\\r\\n                indexData.Value.push({Year:year,Quarter:quarter,Value:value});\\r\\n            }\\r\\n            if (item.finance4!=null && item.announcement4!=null)\\r\\n            {\\r\\n                let year=item.announcement4.year;\\r\\n                let quarter=item.announcement4.quarter;\\r\\n                let value=item.finance4.benford;\\r\\n                indexData.Value.push({Year:year,Quarter:quarter,Value:value});\\r\\n            }\\r\\n\\r\\n            mapData.set(indexData.Date,indexData);\\r\\n        }\\r\\n\\r\\n        var aryData=new Array();\\r\\n        for( var item of mapData)\\r\\n        {\\r\\n            aryData.push(item[1]);\\r\\n        }\\r\\n\\r\\n        return aryData;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        JSConsole.Chart.Log(recvData);\\r\\n        if (recvData.stock==null || recvData.stock.length<=0) return;\\r\\n\\r\\n        var aryData=this.JsonDataToMapSingleData(recvData);\\r\\n\\r\\n        var aryFittingData=param.HistoryData.GetFittingMonthData(aryData);\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        bindData.Period=param.HQChart.Period;   //周期\\r\\n        bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n        this.Data=bindData.GetValue();\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=this.CreatePaints(hqChart,windowIndex);\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        paint[0].NotSupportMessage = null;\\r\\n\\r\\n        paint[0].Data.Data=\\r\\n            [\\r\\n                { Value: 0, Value2: 0.2, Color: 'rgb(50,205,50)', Title: '安全区', TitleColor:'rgb(245,255 ,250)'},\\r\\n                { Value: 0.2, Value2: 0.4, Color: 'rgb(255,140,0)', Title: '预警区', TitleColor:'rgb(245,255 ,250)'},\\r\\n                { Value: 0.4, Value2: 1, Color: 'rgb(255,106,106)', Title: '警示区', TitleColor:'rgb(245,255 ,250)'}\\r\\n            ];\\r\\n\\r\\n        paint[1].Data.Data = this.Data;\\r\\n\\r\\n        //指定框架最大最小[0,1]\\r\\n        hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 1, Min: 0, Count: 3 };\\r\\n\\r\\n        var titleIndex = windowIndex + 1;\\r\\n\\r\\n        hqChart.TitlePaint[titleIndex].Data[1] = new DynamicTitleData(paint[1].Data, this.Index[1].Name, this.Index[1].LineColor);\\r\\n        hqChart.TitlePaint[titleIndex].Data[1].DataType = \\\"MultiReport\\\";\\r\\n\\r\\n        hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n///////////////////////////////////////////////////////////////////////\\r\\n//  能图指标\\r\\n//\\r\\n\\r\\n/*\\r\\n    大盘趋势函数\\r\\n    个股趋势函数\\r\\n\\r\\n    上线:=SMA(C,6.5,1);\\r\\n    下线:=SMA(C,13.5,1);\\r\\n    STICKLINE(上线>下线 , 上线,下线 ,2, 0),COLORRED,LINETHICK2;\\r\\n    STICKLINE(下线>上线,上线,下线,2,0),COLORBLUE,LINETHICK2;\\r\\n*/\\r\\n\\r\\nfunction LighterIndex1()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('Lighter-Trend');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"STICKLINE\\\",null),\\r\\n        new IndexInfo('STICKLINE',null)\\r\\n    );\\r\\n\\r\\n    this.Index[0].LineColor='rgb(255,0,0)';\\r\\n    this.Index[1].LineColor='rgb(0,0,255)';\\r\\n\\r\\n    this.Create=function(hqChart,windowIndex)\\r\\n    {\\r\\n        for(var i in this.Index)\\r\\n        {\\r\\n            var paint=new ChartStickLine();\\r\\n            paint.Canvas=hqChart.Canvas;\\r\\n            paint.Name=this.Name;\\r\\n            paint.Name=this.Name+'-'+i.toString();\\r\\n            paint.Color=this.Index[i].LineColor;\\r\\n            paint.LineWidth=2;\\r\\n            paint.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n            paint.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n            hqChart.ChartPaint.push(paint);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=hqChart.GetChartPaint(windowIndex);\\r\\n\\r\\n        if (paint.length!=2) return false;\\r\\n\\r\\n        var closeData=hisData.GetClose();\\r\\n        var upData=HQIndexFormula.SMA(closeData,6.5,1);\\r\\n        var downData=HQIndexFormula.SMA(closeData,13.5,1);\\r\\n\\r\\n        var stickLine=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(upData,downData),upData,downData);;\\r\\n        var stickLine2=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(downData,upData),upData,downData);;\\r\\n\\r\\n        paint[0].Data.Data=stickLine;\\r\\n        paint[1].Data.Data=stickLine2;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        hqChart.TitlePaint[titleIndex].Title=\\\"大盘/个股 趋势函数\\\";\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n    位置研判函数\\r\\n    N:=34;M:=3;\\r\\n    28,COLORFFFFFF;\\r\\n    STICKLINE(C>0,0,2,5,0),COLOR00008A;\\r\\n    STICKLINE(C>0,2,5,5,0),COLOR85008A;\\r\\n    STICKLINE(C>0,5,10,5,0),COLOR657600;\\r\\n    STICKLINE(C>0,10,21.5,5,0),COLOR690079;\\r\\n    STICKLINE(C>0,21.5,23,5,0),COLOR79B715;\\r\\n    STICKLINE(C>0,23,28,5,0),COLOR00008A;\\r\\n    VAR1:=EMA(100*(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N)),M)/4,COLORFFFF00,LINETHICK2;\\r\\n\\r\\n    财貌双拳:VAR1,COLORFFFF00,LINETHICK2;\\r\\n    DRAWTEXT(CURRBARSCOUNT=128,1,'底部区域'),COLOR00FFFF;\\r\\n    DRAWTEXT(CURRBARSCOUNT=128,3.5,'介入区域'),COLOR00FFFF;\\r\\n    DRAWTEXT(CURRBARSCOUNT=128,7.5,'稳健区域'),COLOR00FFFF;\\r\\n    DRAWTEXT(CURRBARSCOUNT=128,16,'高位区域'),COLOR00FFFF;\\r\\n    DRAWTEXT(CURRBARSCOUNT=128,22,'风险区域'),COLOR0000FF;\\r\\n    DRAWTEXT(CURRBARSCOUNT=128,25.5,'顶部区域'),COLORFF00FF;\\r\\n*/\\r\\n\\r\\nfunction LighterIndex2()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('位置研判函数');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"STICKLINE\\\",34),\\r\\n        new IndexInfo('STICKLINE',3),\\r\\n        new IndexInfo('STICKLINE',null),\\r\\n        new IndexInfo('STICKLINE',null),\\r\\n        new IndexInfo('STICKLINE',null),\\r\\n        new IndexInfo('STICKLINE',null),\\r\\n        new IndexInfo('LINE',null),\\r\\n        new IndexInfo('TEXT',null)\\r\\n    );\\r\\n\\r\\n    this.Index[0].LineColor='rgb(0,0,138)';\\r\\n    this.Index[1].LineColor='rgb(133,0,138)';\\r\\n    this.Index[2].LineColor='rgb(101,118,0)';\\r\\n    this.Index[3].LineColor='rgb(105,0,121)';\\r\\n    this.Index[4].LineColor='rgb(121,183,21)';\\r\\n    this.Index[5].LineColor='rgb(0,0,138)';\\r\\n    this.Index[6].LineColor='rgb(255,0,0)';\\r\\n\\r\\n    this.Create=function(hqChart,windowIndex)\\r\\n    {\\r\\n        for(var i in this.Index)\\r\\n        {\\r\\n            var paint=null;\\r\\n            if (this.Index[i].Name=='LINE')\\r\\n            {\\r\\n                paint=new ChartLine();\\r\\n                paint.Color=this.Index[i].LineColor;\\r\\n            }\\r\\n            else if (this.Index[i].Name=='TEXT')\\r\\n            {\\r\\n                paint=new ChartText();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                paint=new ChartStickLine();\\r\\n                paint.Color=this.Index[i].LineColor;\\r\\n                paint.LineWidth=5;\\r\\n            }\\r\\n\\r\\n            paint.Canvas=hqChart.Canvas;\\r\\n            paint.Name=this.Name;\\r\\n            paint.Name=this.Name+'-'+i.toString();\\r\\n            paint.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n            paint.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n            hqChart.ChartPaint.push(paint);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=hqChart.GetChartPaint(windowIndex);\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        var closeData=hisData.GetClose();\\r\\n        var highData=hisData.GetHigh();\\r\\n        var lowData=hisData.GetLow();\\r\\n\\r\\n        paint[0].Data.Data=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(closeData,0),0,2);\\r\\n        paint[1].Data.Data=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(closeData,0),2,5);\\r\\n        paint[2].Data.Data=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(closeData,0),5,10);\\r\\n        paint[3].Data.Data=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(closeData,0),10,21.5);\\r\\n        paint[4].Data.Data=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(closeData,0),21.5,23,5);\\r\\n        paint[5].Data.Data=HQIndexFormula.STICKLINE(HQIndexFormula.ARRAY_GT(closeData,0),23,28,5);\\r\\n\\r\\n        //VAR1:=EMA(100*(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N)),M)/4\\r\\n        var lineData=HQIndexFormula.ARRAY_DIVIDE(\\r\\n            HQIndexFormula.EMA(\\r\\n                HQIndexFormula.ARRAY_MULTIPLY(\\r\\n                    HQIndexFormula.ARRAY_DIVIDE(\\r\\n                        HQIndexFormula.ARRAY_SUBTRACT(closeData,HQIndexFormula.LLV(lowData,this.Index[0].Param)),\\r\\n                        HQIndexFormula.ARRAY_SUBTRACT(HQIndexFormula.HHV(highData,this.Index[0].Param),HQIndexFormula.LLV(lowData,this.Index[0].Param))\\r\\n                    ),\\r\\n                    100),\\r\\n                this.Index[1].Param),\\r\\n            4\\r\\n        );\\r\\n\\r\\n        paint[6].Data.Data=lineData;\\r\\n\\r\\n        //DRAWTEXT(CURRBARSCOUNT=128,1,'底部区域'),COLOR00FFFF;\\r\\n        //DRAWTEXT(CURRBARSCOUNT=128,3.5,'介入区域'),COLOR00FFFF;\\r\\n        //DRAWTEXT(CURRBARSCOUNT=128,7.5,'稳健区域'),COLOR00FFFF;\\r\\n        //DRAWTEXT(CURRBARSCOUNT=128,16,'高位区域'),COLOR00FFFF;\\r\\n        //DRAWTEXT(CURRBARSCOUNT=128,22,'风险区域'),COLOR0000FF;\\r\\n        //DRAWTEXT(CURRBARSCOUNT=128,25.5,'顶部区域'),COLORFF00FF;\\r\\n\\r\\n        var TextData=new Array();\\r\\n        TextData[0]={Value:1,   Message:'底部区域',Color:'rgb(0,255,255)',Position:'Left'};\\r\\n        TextData[1]={Value:3.5, Message:'介入区域',Color:'rgb(0,255,255)',Position:'Left'};\\r\\n        TextData[2]={Value:7.5, Message:'稳健区域',Color:'rgb(0,255,255)',Position:'Left'};\\r\\n        TextData[3]={Value:16,  Message:'高位区域',Color:'rgb(0,255,255)',Position:'Left'};\\r\\n        TextData[4]={Value:22,  Message:'风险区域',Color:'rgb(0,0,255)',Position:'Left'};\\r\\n        TextData[5]={Value:25.5,Message:'顶部区域',Color:'rgb(255,0,255)',Position:'Left'};\\r\\n\\r\\n        paint[7].Data.Data=TextData;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        hqChart.TitlePaint[titleIndex].Data[0]=new DynamicTitleData(paint[6].Data,\\\"财貌双拳\\\",paint[6].Color);\\r\\n\\r\\n        hqChart.TitlePaint[titleIndex].Title=this.FormatIndexTitle();\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    py指标 服务器端执行\\r\\n*/\\r\\nfunction PyScriptIndex(name,script,args,option)\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod(name);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Script=script; //脚本\\r\\n    this.Arguments=[];  //参数\\r\\n    this.OutVar=[];     //输出数据\\r\\n    this.ApiUrl=g_JSChartResource.PyIndexDomain+'/hq/code';\\r\\n    if (args) this.Arguments=args;\\r\\n\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        this.OutVar=[];\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData\\r\\n            };\\r\\n\\r\\n        //参数\\r\\n        var strParam='';\\r\\n        for(let i in this.Arguments)\\r\\n        {\\r\\n            if (strParam.length>0) strParam+=',';\\r\\n            var item=this.Arguments[i];\\r\\n            strParam+='\\\"'+item.Name+'\\\"'+':'+item.Value;\\r\\n        }\\r\\n        strParam='{'+strParam+'}';\\r\\n        var indexParam=JSON.parse(strParam);\\r\\n\\r\\n        var data=JSON.stringify(\\r\\n            {\\r\\n                code:this.Script,   //脚本\\r\\n                symbol:param.HQChart.Symbol,    //股票代码\\r\\n                period:param.HQChart.Period,    //周期 0=日线 1=周线 2=月线 3=年线 4=1分钟 5=5分钟 6=15分钟 7=30分钟 8=60分钟\\r\\n                right:param.HQChart.Right,      //复权 0 不复权 1 前复权 2 后复权\\r\\n                params:indexParam,               //指标参数\\r\\n                numcount:hqChart.MaxReqeustDataCount,\\r\\n            });\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.ApiUrl,\\r\\n            data:data,\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            contentType:' application/json; charset=utf-8',\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            },\\r\\n            complete:function(h)\\r\\n            {\\r\\n                //JSConsole.Chart.Log(h);\\r\\n            },\\r\\n            error: function(http,e)\\r\\n            {\\r\\n                self.RecvError(http,e,param);;\\r\\n\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvError=function(http,e,param)\\r\\n    {\\r\\n        JSConsole.Chart.Log(\\\"[PyScriptIndex::RecvError] error\\\",e);\\r\\n        if (param.HQChart.ScriptErrorCallback) param.HQChart.ScriptErrorCallback(e);\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.code!=0)\\r\\n        {\\r\\n            JSConsole.Chart.Log(\\\"[PyScriptIndex::RecvData] failed.\\\", recvData);\\r\\n            if (param.HQChart.ScriptErrorCallback) param.HQChart.ScriptErrorCallback(recvData.msg);\\r\\n            return;   //失败了\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log('[PyScriptIndex::RecvData] recv data.',recvData);\\r\\n        var aryDate=recvData.date;\\r\\n        for(var i in recvData.data)\\r\\n        {\\r\\n            var item=recvData.data[i];\\r\\n            var indexData=[];\\r\\n            for(var j=0;j<aryDate.length && j<aryDate.length;++j)\\r\\n            {\\r\\n                if (j>=item.data.length) continue;\\r\\n                var indexItem=new SingleData(); //单列指标数据\\r\\n                indexItem.Date=aryDate[j];\\r\\n                indexItem.Value=item.data[j];\\r\\n                indexData.push(indexItem);\\r\\n            }\\r\\n\\r\\n            var aryFittingData=param.HistoryData.GetFittingData(indexData); //数据和主图K线拟合\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFittingData;\\r\\n            bindData.Period=param.HQChart.Period;   //周期\\r\\n            bindData.Right=param.HQChart.Right;     //复权\\r\\n\\r\\n            var indexInfo={Name:item.name,Type:item.graph,LineWidth:item.width,Data:bindData.GetValue(),Color:item.color};\\r\\n            this.OutVar.push(indexInfo);\\r\\n        }\\r\\n\\r\\n        this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);   //把数据绑定到图形上\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        hqChart.DeleteIndexPaint(windowIndex); //清空指标图形\\r\\n\\r\\n        for(let i in this.OutVar)\\r\\n        {\\r\\n            let item=this.OutVar[i];\\r\\n            switch(item.Type)\\r\\n            {\\r\\n                case 'line':\\r\\n                    this.CreateLine(hqChart,windowIndex,item,i);\\r\\n                    break;\\r\\n                case 'colorstick':  //上下柱子\\r\\n                    this.CreateColorStock(hqChart,windowIndex,item,i);\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        hqChart.TitlePaint[titleIndex].Title=this.Name; //这是指标名称\\r\\n\\r\\n        let indexParam='';  //指标参数\\r\\n        for(let i in this.Arguments)\\r\\n        {\\r\\n            let item=this.Arguments[i];\\r\\n            if (indexParam.length>0) indexParam+=',';\\r\\n            indexParam+=item.Value.toString();\\r\\n        }\\r\\n        if (indexParam.length>0) hqChart.TitlePaint[titleIndex].Title=this.Name+'('+indexParam+')';\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.CreateLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let line=new ChartLine();\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.DrawType=1;\\r\\n        line.Name=varItem.Name;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) line.Color=varItem.Color;\\r\\n        else line.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth>0) line.LineWidth=varItem.LineWidth;\\r\\n        if (varItem.IsShow==false) line.IsShow=false;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        line.Data.Data=varItem.Data;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(line);\\r\\n    }\\r\\n\\r\\n    this.CreateColorStock=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartMACD();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(chart.Data,varItem.Name,this.GetDefaultColor(id));\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //给一个默认的颜色\\r\\n    this.GetDefaultColor=function(id)\\r\\n    {\\r\\n        let COLOR_ARRAY=\\r\\n            [\\r\\n                \\\"rgb(255,174,0)\\\",\\r\\n                \\\"rgb(25,199,255)\\\",\\r\\n                \\\"rgb(175,95,162)\\\",\\r\\n                \\\"rgb(236,105,65)\\\",\\r\\n                \\\"rgb(68,114,196)\\\",\\r\\n                \\\"rgb(229,0,79)\\\",\\r\\n                \\\"rgb(0,128,255)\\\",\\r\\n                \\\"rgb(252,96,154)\\\",\\r\\n                \\\"rgb(42,230,215)\\\",\\r\\n                \\\"rgb(24,71,178)\\\",\\r\\n            ];\\r\\n\\r\\n        let number=parseInt(id);\\r\\n        return COLOR_ARRAY[number%(COLOR_ARRAY.length-1)];\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n    json格式数据指标 用来显示本地数据\\r\\n*/\\r\\nfunction JsonDataIndex(name,script,args,option)\\r\\n{\\r\\n    this.newMethod=PyScriptIndex;   //派生\\r\\n    this.newMethod(name);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.JsonData;  //json格式数据\\r\\n    if (option.JsonData) this.JsonData=option.JsonData;\\r\\n\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        if (!this.JsonData)\\r\\n        {\\r\\n            console.warn(\\\"[PyScriptIndex::RequestData] JsonData is null\\\");\\r\\n            if (param.HQChart.ScriptErrorCallback) param.HQChart.ScriptErrorCallback('json 数据不能为空');\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var param=\\r\\n                {\\r\\n                    HQChart:hqChart,\\r\\n                    WindowIndex:windowIndex,\\r\\n                    HistoryData:hisData\\r\\n                };\\r\\n\\r\\n            this.JsonData.code=0;\\r\\n            var recvData=this.JsonData;\\r\\n            this.RecvData(recvData,param);\\r\\n        }\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//给一个默认的颜色\\r\\nPyScriptIndex.prototype.GetDefaultColor=function(id)\\r\\n{\\r\\n    let COLOR_ARRAY=\\r\\n        [\\r\\n            \\\"rgb(255,174,0)\\\",\\r\\n            \\\"rgb(25,199,255)\\\",\\r\\n            \\\"rgb(175,95,162)\\\",\\r\\n            \\\"rgb(236,105,65)\\\",\\r\\n            \\\"rgb(68,114,196)\\\",\\r\\n            \\\"rgb(229,0,79)\\\",\\r\\n            \\\"rgb(0,128,255)\\\",\\r\\n            \\\"rgb(252,96,154)\\\",\\r\\n            \\\"rgb(42,230,215)\\\",\\r\\n            \\\"rgb(24,71,178)\\\",\\r\\n        ];\\r\\n\\r\\n    let number=parseInt(id);\\r\\n    return COLOR_ARRAY[number%(COLOR_ARRAY.length-1)];\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    点位研判函数\\r\\n\\r\\n    HJ_1:=REF(LOW,1);\\r\\n    HJ_2:=SMA(ABS(LOW-HJ_1),13,1)/SMA(MAX(LOW-HJ_1,0),13,1)*100;\\r\\n    HJ_3:=EMA(IF(CLOSE*1.2,HJ_2*13,HJ_2/13),13);\\r\\n    HJ_4:=LLV(LOW,34);\\r\\n    HJ_5:=HHV(HJ_3,34);\\r\\n    HJ_6:=IF(LLV(LOW,56),1,0);\\r\\n    HJ_7:=EMA(IF(LOW<=HJ_4,(HJ_3+HJ_5*2)/2,0),3)/618*HJ_6;\\r\\n    HJ_8:=HJ_7>REF(HJ_7,1);\\r\\n    HJ_9:=REF(LLV(LOW,100),3);\\r\\n    HJ_10:=REFDATE(HJ_9,DATE);\\r\\n    HJ_11:=LOW=HJ_10;\\r\\n    HJ_12:=HJ_8 AND HJ_11;\\r\\n    HJ_13:=HJ_12>REF(HJ_12,1);\\r\\n    启动买点:HJ_13>REF(HJ_13,1),COLORRED,LINETHICK1;\\r\\n*/\\r\\nfunction LighterIndex3()\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod('点位研判函数');\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Index=new Array(\\r\\n        new IndexInfo(\\\"启动买点\\\",null)\\r\\n    );\\r\\n\\r\\n    this.Index[0].LineColor='rgb(255,0,0)';\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var paint=hqChart.GetChartPaint(windowIndex);\\r\\n\\r\\n        if (paint.length!=this.Index.length) return false;\\r\\n\\r\\n        var closeData=hisData.GetClose();\\r\\n        var highData=hisData.GetHigh();\\r\\n        var lowData=hisData.GetLow();\\r\\n\\r\\n        //HJ_1:=REF(LOW,1);\\r\\n        var hj_1=HQIndexFormula.REF(lowData,1);\\r\\n\\r\\n        //HJ_2:=SMA(ABS(LOW-HJ_1),13,1)/SMA(MAX(LOW-HJ_1,0),13,1)*100;\\r\\n        var hj_2=HQIndexFormula.ARRAY_MULTIPLY(\\r\\n            HQIndexFormula.ARRAY_DIVIDE(\\r\\n                HQIndexFormula.SMA(HQIndexFormula.ABS(HQIndexFormula.ARRAY_SUBTRACT(lowData,hj_1)),13,1),\\r\\n                HQIndexFormula.SMA(HQIndexFormula.MAX(HQIndexFormula.ARRAY_SUBTRACT(lowData,hj_1),0),13,1)\\r\\n            ),\\r\\n            100\\r\\n        );\\r\\n\\r\\n        //HJ_3:=EMA(IF(CLOSE*1.2,HJ_2*13,HJ_2/13),13);\\r\\n        var hj_3=HQIndexFormula.EMA(\\r\\n            HQIndexFormula.ARRAY_IF(HQIndexFormula.ARRAY_MULTIPLY(closeData,1.2),HQIndexFormula.ARRAY_MULTIPLY(hj_2,13),HQIndexFormula.ARRAY_DIVIDE(hj_2,13)),\\r\\n            13\\r\\n        );\\r\\n\\r\\n        //HJ_4:=LLV(LOW,34);\\r\\n        var hj_4=HQIndexFormula.LLV(lowData,34);\\r\\n\\r\\n        //HJ_5:=HHV(HJ_3,34);\\r\\n        var hj_5=HQIndexFormula.HHV(hj_3,34);\\r\\n\\r\\n        //HJ_6:=IF(LLV(LOW,56),1,0);\\r\\n        var hj_6=HQIndexFormula.ARRAY_IF(HQIndexFormula.LLV(lowData,56),1,0);\\r\\n\\r\\n        //HJ_7:=EMA(IF(LOW<=HJ_4,(HJ_3+HJ_5*2)/2,0),3)/618*HJ_6;\\r\\n        //hj_7_temp=(HJ_3+HJ_5*2)/2,0)  太长了 这部分单独算下\\r\\n        var hj_7_temp=HQIndexFormula.ARRAY_DIVIDE(HQIndexFormula.ARRAY_ADD(hj_3,HQIndexFormula.ARRAY_MULTIPLY(hj_5,2)),2);\\r\\n\\r\\n        var hj_7=HQIndexFormula.ARRAY_MULTIPLY(\\r\\n            HQIndexFormula.ARRAY_DIVIDE(\\r\\n                HQIndexFormula.EMA(\\r\\n                    HQIndexFormula.ARRAY_IF(HQIndexFormula.ARRAY_LTE(lowData,hj_4),hj_7_temp,0),\\r\\n                    3\\r\\n                ),\\r\\n                618\\r\\n            ),\\r\\n            hj_6\\r\\n        );\\r\\n\\r\\n        //HJ_8:=HJ_7>REF(HJ_7,1);\\r\\n        var hj_8=HQIndexFormula.ARRAY_GT(hj_7,HQIndexFormula.REF(hj_7,1));\\r\\n\\r\\n        //HJ_9:=REF(LLV(LOW,100),3);\\r\\n        var hj_9=HQIndexFormula.REF(HQIndexFormula.LLV(lowData,100),3);\\r\\n\\r\\n        //HJ_10:=REFDATE(HJ_9,DATE); 用当日的数据 产生数组\\r\\n        var hj_10=HQIndexFormula.REFDATE(hj_9,-1);\\r\\n\\r\\n        //HJ_11:=LOW=HJ_10;\\r\\n        var hj_11=HQIndexFormula.ARRAY_EQ(lowData,hj_10);\\r\\n\\r\\n        //HJ_12:=HJ_8 AND HJ_11;\\r\\n        var hj_12=HQIndexFormula.ARRAY_AND(hj_8,hj_11);\\r\\n\\r\\n        var buyData=null;\\r\\n        paint[0].Data.Data=hj_12;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n\\r\\n        for(var i in paint)\\r\\n        {\\r\\n            hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);\\r\\n        }\\r\\n\\r\\n        hqChart.TitlePaint[titleIndex].Title=this.FormatIndexTitle();\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    信息地雷\\r\\n*/\\r\\n\\r\\n/*\\r\\n    信息地雷列表\\r\\n*/\\r\\nfunction JSKLineInfoMap()\\r\\n{\\r\\n}\\r\\n\\r\\nJSKLineInfoMap.Get=function(id)\\r\\n{\\r\\n    var infoMap=new Map(\\r\\n        [\\r\\n            [\\\"互动易\\\",      {Create:function(){ return new InvestorInfo()}  }],\\r\\n            [\\\"公告\\\",        {Create:function(){ return new AnnouncementInfo()}  }],\\r\\n            [\\\"业绩预告\\\",    {Create:function(){ return new PforecastInfo()}  }],\\r\\n            [\\\"调研\\\",        {Create:function(){ return new ResearchInfo()}  }],\\r\\n            [\\\"大宗交易\\\",    {Create:function(){ return new BlockTrading()}  }],\\r\\n            [\\\"龙虎榜\\\",      {Create:function(){ return new TradeDetail()}  }]\\r\\n        ]\\r\\n    );\\r\\n\\r\\n    return infoMap.get(id);\\r\\n}\\r\\n\\r\\nJSKLineInfoMap.GetClassInfo=function(id)\\r\\n{\\r\\n    var infoMap=new Map(\\r\\n        [\\r\\n            [\\\"互动易\\\",      { ClassName:\\\"InvestorInfo\\\" }],\\r\\n            [\\\"公告\\\",        { ClassName:\\\"AnnouncementInfo\\\" }],\\r\\n            [\\\"业绩预告\\\",    { ClassName:\\\"PforecastInfo\\\" } ],\\r\\n            [\\\"调研\\\",        { ClassName:\\\"ResearchInfo\\\"  }],\\r\\n            [\\\"大宗交易\\\",    { ClassName:\\\"BlockTrading\\\"  }],\\r\\n            [\\\"龙虎榜\\\",      { ClassName:\\\"TradeDetail\\\"}  ]\\r\\n        ]\\r\\n    );\\r\\n\\r\\n    return infoMap.get(id);\\r\\n}\\r\\n\\r\\nJSKLineInfoMap.GetIconUrl=function(type)\\r\\n{\\r\\n    switch(type)\\r\\n    {\\r\\n        case KLINE_INFO_TYPE.INVESTOR:\\r\\n            return g_JSChartResource.KLine.Info.Investor.Icon;\\r\\n            break;\\r\\n        case KLINE_INFO_TYPE.PFORECAST:\\r\\n            return g_JSChartResource.KLine.Info.Pforecast.Icon;\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT:\\r\\n            return g_JSChartResource.KLine.Info.Announcement.Icon;\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_1:\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_2:\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_3:\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_4:\\r\\n            return g_JSChartResource.KLine.Info.Announcement.IconQuarter;\\r\\n        case KLINE_INFO_TYPE.RESEARCH:\\r\\n            return g_JSChartResource.KLine.Info.Research.Icon;\\r\\n        case KLINE_INFO_TYPE.BLOCKTRADING:\\r\\n            return g_JSChartResource.KLine.Info.BlockTrading.Icon;\\r\\n        case KLINE_INFO_TYPE.TRADEDETAIL:\\r\\n            return g_JSChartResource.KLine.Info.TradeDetail.Icon;\\r\\n        default:\\r\\n            return g_JSChartResource.KLine.Info.Announcement.Icon;\\r\\n    }\\r\\n}\\r\\n\\r\\nJSKLineInfoMap.GetIconLibrary=function(index)\\r\\n{\\r\\n    var iconLib=g_JSChartResource.KLine.Info.IconLibrary;\\r\\n    if (!iconLib || !iconLib.Icon) return g_JSChartResource.KLine.Info.Announcement.IconFont;\\r\\n\\r\\n    if (index>=0 && index<iconLib.Icon.length)\\r\\n    {\\r\\n        var item=iconLib.Icon[index];\\r\\n        var obj={ Text:item.Text, HScreenText:item.HScreenText, Color:item.Color, Family:iconLib.Family };\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    return g_JSChartResource.KLine.Info.Announcement.IconFont;\\r\\n}\\r\\n\\r\\nJSKLineInfoMap.GetIconFont=function(type)\\r\\n{\\r\\n    //公告扩展数据\\r\\n    if (type>=KLINE_INFO_TYPE.ANNOUNCEMENT_EX_START && type<=KLINE_INFO_TYPE.ANNOUNCEMENT_EX_END)\\r\\n    {\\r\\n        var index=type-KLINE_INFO_TYPE.ANNOUNCEMENT_EX_START;\\r\\n        return JSKLineInfoMap.GetIconLibrary(index);\\r\\n    }\\r\\n\\r\\n    switch(type)\\r\\n    {\\r\\n        case KLINE_INFO_TYPE.INVESTOR:\\r\\n            return g_JSChartResource.KLine.Info.Investor.IconFont;\\r\\n            break;\\r\\n        case KLINE_INFO_TYPE.PFORECAST:\\r\\n            return g_JSChartResource.KLine.Info.Pforecast.IconFont;\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT:\\r\\n            return g_JSChartResource.KLine.Info.Announcement.IconFont;\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_1:\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_2:\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_3:\\r\\n        case KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_4:\\r\\n            return g_JSChartResource.KLine.Info.Announcement.IconFont2;\\r\\n        case KLINE_INFO_TYPE.RESEARCH:\\r\\n            return g_JSChartResource.KLine.Info.Research.IconFont;\\r\\n        case KLINE_INFO_TYPE.BLOCKTRADING:\\r\\n            return g_JSChartResource.KLine.Info.BlockTrading.IconFont;\\r\\n        case KLINE_INFO_TYPE.TRADEDETAIL:\\r\\n            return g_JSChartResource.KLine.Info.TradeDetail.IconFont;\\r\\n        default:\\r\\n            return g_JSChartResource.KLine.Info.Announcement.IconFont;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\nfunction IKLineInfo()\\r\\n{\\r\\n    this.MaxReqeustDataCount=1000;\\r\\n    this.StartDate=20160101;\\r\\n    this.Data;\\r\\n    this.ClassName='IKLineInfo';\\r\\n    this.Explain=\\\"IKLineInfo\\\";\\r\\n\\r\\n    this.GetToday=function()\\r\\n    {\\r\\n        var date=new Date();\\r\\n        var today=date.getFullYear()*10000+(date.getMonth()+1)*100+date.getDate();\\r\\n        return today;\\r\\n    }\\r\\n\\r\\n    this.GetRequestData=function(hqChart)\\r\\n    {\\r\\n        var obj=\\r\\n            {\\r\\n                Symbol:hqChart.Symbol ,\\r\\n                MaxReqeustDataCount: hqChart.MaxReqeustDataCount,            //日线数据个数\\r\\n                MaxRequestMinuteDayCount:hqChart.MaxRequestMinuteDayCount,    //分钟数据请求的天数\\r\\n                Period:hqChart.Period       //周期\\r\\n            };\\r\\n\\r\\n        return obj;\\r\\n    }\\r\\n\\r\\n    this.NetworkFilter=function(hqChart,callInfo)\\r\\n    {\\r\\n        if (!hqChart.NetworkFilter) return false;\\r\\n\\r\\n        var self=this;\\r\\n\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n            };\\r\\n\\r\\n        var obj=\\r\\n            {\\r\\n                Name:`${this.ClassName}::RequestData`, //类名::函数\\r\\n                Explain:this.Explain,\\r\\n                Request:this.GetRequestData(hqChart),\\r\\n                Self:this,\\r\\n                HQChart:hqChart,\\r\\n                PreventDefault:false\\r\\n            };\\r\\n\\r\\n        if (callInfo)\\r\\n        {\\r\\n            if (callInfo.Update==true)\\r\\n            {\\r\\n                obj.Update={ Start:{ Date: callInfo.StartDate } };\\r\\n                param.Update={ Start:{ Date: callInfo.StartDate } };\\r\\n            }\\r\\n\\r\\n            obj.CallFunctionName=callInfo.FunctionName; //内部调用函数名\\r\\n        }\\r\\n\\r\\n        hqChart.NetworkFilter(obj, function(data)\\r\\n        {\\r\\n            self.RecvData(data,param);\\r\\n        });\\r\\n\\r\\n        if (obj.PreventDefault==true) return true;   //已被上层替换,不调用默认的网络请求\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n//互动易\\r\\nfunction InvestorInfo()\\r\\n{\\r\\n    this.newMethod=IKLineInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='InvestorInfo';\\r\\n    this.Explain='互动易'\\r\\n    this.RequestData=function(hqChart, obj)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n        if (this.NetworkFilter(hqChart,obj)) return; //已被上层替换,不调用默认的网络请求\\r\\n\\r\\n        var postData=\\r\\n            {\\r\\n                filed: [\\\"question\\\",\\\"answerdate\\\",\\\"symbol\\\",\\\"id\\\"],\\r\\n                symbol: [param.HQChart.Symbol],\\r\\n                querydate:{\\\"StartDate\\\":this.StartDate,\\\"EndDate\\\":this.GetToday()},\\r\\n                start:0,\\r\\n                end:this.MaxReqeustDataCount,\\r\\n            };\\r\\n\\r\\n        //请求数据\\r\\n        var url=g_JSChartResource.Domain+g_JSChartResource.KLine.Info.Investor.ApiUrl;\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            data:postData,\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.list.length<=0) return;\\r\\n\\r\\n        for(var i in recvData.list)\\r\\n        {\\r\\n            var item=recvData.list[i];\\r\\n            var infoData=new KLineInfoData();\\r\\n            infoData.Date=item.answerdate;\\r\\n            infoData.Title=item.question;\\r\\n            infoData.InfoType=KLINE_INFO_TYPE.INVESTOR;\\r\\n            this.Data.push(infoData);\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//公告 支持增量更新\\r\\nfunction AnnouncementInfo()\\r\\n{\\r\\n    this.newMethod=IKLineInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='AnnouncementInfo';\\r\\n    this.Explain='公告';\\r\\n    this.ApiType=1; //0=读API 1=读OSS缓存文件\\r\\n\\r\\n    this.RequestData=function(hqChart,obj)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n            };\\r\\n\\r\\n        if (obj && obj.Update===true)   //更新模式 不清内存数据\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Data=[];\\r\\n        }\\r\\n\\r\\n        if (this.NetworkFilter(hqChart, obj)) return; //已被上层替换,不调用默认的网络请求\\r\\n\\r\\n        if (this.ApiType==1)    //取缓存文件\\r\\n        {\\r\\n            var url=`${g_JSChartResource.CacheDomain}/cache/analyze/shszreportlist/${param.HQChart.Symbol}.json`;\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: url,\\r\\n                type:\\\"get\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvData(recvData,param);\\r\\n                },\\r\\n                error: function(http,e)\\r\\n                {\\r\\n                    self.RecvError(http,e,param);;\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else    //取api\\r\\n        {\\r\\n            //请求数据\\r\\n            var url=g_JSChartResource.Domain+g_JSChartResource.KLine.Info.Announcement.ApiUrl;\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: url,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"filed\\\": [\\\"title\\\",\\\"releasedate\\\",\\\"symbol\\\",\\\"id\\\"],\\r\\n                        \\\"symbol\\\": [param.HQChart.Symbol],\\r\\n                        \\\"querydate\\\":{\\\"StartDate\\\":this.StartDate,\\\"EndDate\\\":this.GetToday()},\\r\\n                        \\\"start\\\":0,\\r\\n                        \\\"end\\\":this.MaxReqeustDataCount,\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvData(recvData,param);\\r\\n                },\\r\\n                error: function(http,e)\\r\\n                {\\r\\n                    self.RecvError(http,e,param);;\\r\\n                }\\r\\n            });\\r\\n\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.report.length<=0) return;\\r\\n\\r\\n        var aryReport=[];\\r\\n        for(var i in recvData.report)\\r\\n        {\\r\\n            var item=recvData.report[i];\\r\\n            var infoData=new KLineInfoData();\\r\\n            infoData.Date=item.releasedate;\\r\\n            infoData.Title=item.title;\\r\\n            infoData.InfoType=KLINE_INFO_TYPE.ANNOUNCEMENT;\\r\\n            for(var j in item.type)\\r\\n            {\\r\\n                var typeItem=item.type[j];\\r\\n                switch(typeItem)\\r\\n                {\\r\\n                    case \\\"一季度报告\\\":\\r\\n                        infoData.InfoType=KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_1;\\r\\n                        break;\\r\\n                    case \\\"半年度报告\\\":\\r\\n                        infoData.InfoType=KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_2;\\r\\n                        break;\\r\\n                    case \\\"三季度报告\\\":\\r\\n                        infoData.InfoType=KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_3;\\r\\n                        break;\\r\\n                    case \\\"年度报告\\\":\\r\\n                        infoData.InfoType=KLINE_INFO_TYPE.ANNOUNCEMENT_QUARTER_4;\\r\\n                        break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            //目前只支持1个类型\\r\\n            for(var j in item.typeex)\\r\\n            {\\r\\n                var id=item.typeex[j];\\r\\n                infoData.InfoType=KLINE_INFO_TYPE.ANNOUNCEMENT_EX_START+id;\\r\\n                break;\\r\\n            }\\r\\n\\r\\n            aryReport.push(infoData);\\r\\n        }\\r\\n\\r\\n        if (recvData.Update===true && this.Data.length>0)\\r\\n        {\\r\\n            this.UpdateData(aryReport);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Data=aryReport;\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n\\r\\n\\r\\n    this.UpdateData=function(aryData)\\r\\n    {\\r\\n        if (!aryData || aryData.length<=0) return;\\r\\n\\r\\n        var setKeys=new Set();  //通过 日期+类型+标题去重\\r\\n        for(var i in this.Data)\\r\\n        {\\r\\n            var item=this.Data[i];\\r\\n            var strKey=`${item.Date}-${item.InfoType}-${item.Title}`;\\r\\n            setKeys.add(strKey);\\r\\n        }\\r\\n\\r\\n        var count=0;\\r\\n        for(var i in aryData)\\r\\n        {\\r\\n            var item=aryData[i];\\r\\n            var strKey=`${item.Date}-${item.InfoType}-${item.Title}`;\\r\\n            if (setKeys.has(strKey)) continue;\\r\\n\\r\\n            this.Data.push(item);\\r\\n            ++count;\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log(`[AnnouncementInfo::UpdateData] add new count=${count}`);\\r\\n    }\\r\\n\\r\\n    this.RecvError=function(http,e,param)\\r\\n    {\\r\\n        console.warn(\\\"[AnnouncementInfo::RecvError] error, http \\\",e, http);\\r\\n        //if (param.HQChart.ScriptErrorCallback) param.HQChart.ScriptErrorCallback(e);\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n//业绩预告\\r\\nfunction PforecastInfo()\\r\\n{\\r\\n    this.newMethod=IKLineInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='PforecastInfo';\\r\\n\\r\\n    this.RequestData=function(hqChart,obj)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n\\r\\n        var url=g_JSChartResource.Domain+g_JSChartResource.KLine.Info.Pforecast.ApiUrl;\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"pforecast.type\\\",\\\"pforecast.reportdate\\\",\\\"fweek\\\"],\\r\\n                    \\\"condition\\\":\\r\\n                        [\\r\\n                            {\\\"item\\\":[\\\"pforecast.reportdate\\\",\\\"int32\\\",\\\"gte\\\",this.StartDate]}\\r\\n                        ],\\r\\n                    \\\"symbol\\\": [param.HQChart.Symbol],\\r\\n                    \\\"start\\\":0,\\r\\n                    \\\"end\\\":this.MaxReqeustDataCount,\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.stock.length!=1) return;\\r\\n        if (recvData.stock[0].stockday.length<=0) return;\\r\\n\\r\\n        for(var i in recvData.stock[0].stockday)\\r\\n        {\\r\\n            var item=recvData.stock[0].stockday[i];\\r\\n            if (item.pforecast.length>0)\\r\\n            {\\r\\n                var dataItem=item.pforecast[0];\\r\\n                var infoData=new KLineInfoData();\\r\\n                infoData.Date= item.date;\\r\\n                infoData.Title=dataItem.type;\\r\\n                infoData.InfoType=KLINE_INFO_TYPE.PFORECAST;\\r\\n                infoData.ExtendData={ Type:dataItem.type, ReportDate:dataItem.reportdate}\\r\\n                if(item.fweek)  //未来周涨幅\\r\\n                {\\r\\n                    infoData.ExtendData.FWeek={};\\r\\n                    if (item.fweek.week1!=null) infoData.ExtendData.FWeek.Week1=item.fweek.week1;\\r\\n                    if (item.fweek.week4!=null) infoData.ExtendData.FWeek.Week4=item.fweek.week4;\\r\\n                }\\r\\n                this.Data.push(infoData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//投资者关系 (调研)\\r\\nfunction ResearchInfo()\\r\\n{\\r\\n    this.newMethod=IKLineInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='ResearchInfo';\\r\\n\\r\\n    this.RequestData=function(hqChart,obj)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n        var url=g_JSChartResource.Domain+g_JSChartResource.KLine.Info.Research.ApiUrl;\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"filed\\\": [\\\"releasedate\\\",\\\"researchdate\\\",\\\"level\\\",\\\"symbol\\\",\\\"id\\\",'type'],\\r\\n                    \\\"querydate\\\":{\\\"StartDate\\\":this.StartDate,\\\"EndDate\\\":this.GetToday()},\\r\\n                    \\\"symbol\\\": [param.HQChart.Symbol],\\r\\n                    \\\"start\\\":0,\\r\\n                    \\\"end\\\":this.MaxReqeustDataCount,\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.list.length<=0) return;\\r\\n\\r\\n        for(var i in recvData.list)\\r\\n        {\\r\\n            var item=recvData.list[i];\\r\\n            var infoData=new KLineInfoData();\\r\\n            infoData.ID=item.id;\\r\\n            infoData.Date= item.researchdate;\\r\\n            infoData.InfoType=KLINE_INFO_TYPE.RESEARCH;\\r\\n            infoData.ExtendData={ Level:item.level , Type:item.type};\\r\\n            this.Data.push(infoData);\\r\\n\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//大宗交易\\r\\nfunction BlockTrading()\\r\\n{\\r\\n    this.newMethod=IKLineInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='BlockTrading';\\r\\n\\r\\n    this.RequestData=function(hqChart,obj)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n        var url=g_JSChartResource.Domain+g_JSChartResource.KLine.Info.BlockTrading.ApiUrl;\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"blocktrading.price\\\",\\\"blocktrading.vol\\\",\\\"blocktrading.premium\\\",\\\"fweek\\\",\\\"price\\\"],\\r\\n                    \\\"condition\\\":\\r\\n                        [\\r\\n                            {\\\"item\\\":[\\\"date\\\",\\\"int32\\\",\\\"gte\\\",this.StartDate]},\\r\\n                            {\\\"item\\\":[\\\"blocktrading.vol\\\",\\\"int32\\\",\\\"gte\\\",\\\"0\\\"]}\\r\\n                        ],\\r\\n                    \\\"symbol\\\": [param.HQChart.Symbol],\\r\\n                    \\\"start\\\":0,\\r\\n                    \\\"end\\\":this.MaxReqeustDataCount,\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.stock.length!=1) return;\\r\\n        if (recvData.stock[0].stockday.length<=0) return;\\r\\n\\r\\n        for(var i in recvData.stock[0].stockday)\\r\\n        {\\r\\n            var item=recvData.stock[0].stockday[i];\\r\\n            var infoData=new KLineInfoData();\\r\\n            infoData.Date= item.date;\\r\\n            infoData.InfoType=KLINE_INFO_TYPE.BLOCKTRADING;\\r\\n            infoData.ExtendData=\\r\\n                {\\r\\n                    Price:item.blocktrading.price,          //交易价格\\r\\n                    Premium:item.blocktrading.premium,      //溢价 （百分比%)\\r\\n                    Vol:item.blocktrading.vol,              //交易金额单位（万元)\\r\\n                    ClosePrice:item.price,                  //收盘价\\r\\n                };\\r\\n\\r\\n            if(item.fweek)  //未来周涨幅\\r\\n            {\\r\\n                infoData.ExtendData.FWeek={};\\r\\n                if (item.fweek.week1!=null) infoData.ExtendData.FWeek.Week1=item.fweek.week1;\\r\\n                if (item.fweek.week4!=null) infoData.ExtendData.FWeek.Week4=item.fweek.week4;\\r\\n            }\\r\\n\\r\\n            this.Data.push(infoData);\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n//龙虎榜\\r\\nfunction TradeDetail()\\r\\n{\\r\\n    this.newMethod=IKLineInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='TradeDetail';\\r\\n\\r\\n    this.RequestData=function(hqChart, obj)\\r\\n    {\\r\\n        var self = this;\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart\\r\\n            };\\r\\n\\r\\n        this.Data=[];\\r\\n        var url=g_JSChartResource.Domain+g_JSChartResource.KLine.Info.TradeDetail.ApiUrl;\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"tradedetail.typeexplain\\\",\\\"tradedetail.type\\\",\\\"fweek\\\"],\\r\\n                    \\\"condition\\\":\\r\\n                        [\\r\\n                            {\\\"item\\\":[\\\"date\\\",\\\"int32\\\",\\\"gte\\\",this.StartDate]},\\r\\n                            {\\\"item\\\":[\\\"tradedetail.type\\\",\\\"int32\\\",\\\"gte\\\",\\\"0\\\"]}\\r\\n                        ],\\r\\n                    \\\"symbol\\\": [param.HQChart.Symbol],\\r\\n                    \\\"start\\\":0,\\r\\n                    \\\"end\\\":this.MaxReqeustDataCount,\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        if (recvData.stock.length!=1) return;\\r\\n        if (recvData.stock[0].stockday.length<=0) return;\\r\\n\\r\\n        for(var i in recvData.stock[0].stockday)\\r\\n        {\\r\\n            var item=recvData.stock[0].stockday[i];\\r\\n\\r\\n            var infoData=new KLineInfoData();\\r\\n            infoData.Date= item.date;\\r\\n            infoData.InfoType=KLINE_INFO_TYPE.TRADEDETAIL;\\r\\n            infoData.ExtendData={Detail:new Array()};\\r\\n\\r\\n            for(var j in item.tradedetail)\\r\\n            {\\r\\n                var tradeItem=item.tradedetail[j];\\r\\n                infoData.ExtendData.Detail.push({\\\"Type\\\":tradeItem.type,\\\"TypeExplain\\\":tradeItem.typeexplain});\\r\\n            }\\r\\n\\r\\n            if(item.fweek)  //未来周涨幅\\r\\n            {\\r\\n                infoData.ExtendData.FWeek={};\\r\\n                if (item.fweek.week1!=null) infoData.ExtendData.FWeek.Week1=item.fweek.week1;\\r\\n                if (item.fweek.week4!=null) infoData.ExtendData.FWeek.Week4=item.fweek.week4;\\r\\n            }\\r\\n\\r\\n            this.Data.push(infoData);\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction JSMinuteInfoMap()\\r\\n{\\r\\n\\r\\n}\\r\\n\\r\\nJSMinuteInfoMap.InfoMap=new Map(\\r\\n    [\\r\\n        [\\\"大盘异动\\\",      {Create:function(){ return new MarketEventInfo()}  }],\\r\\n    ]);\\r\\n\\r\\nJSMinuteInfoMap.Get=function(id)\\r\\n{\\r\\n    return JSMinuteInfoMap.InfoMap.get(id);\\r\\n}\\r\\n\\r\\nfunction IMinuteInfo()\\r\\n{\\r\\n    this.Data;\\r\\n    this.ClassName='IMinuteInfo';\\r\\n}\\r\\n\\r\\n//////////////////////////////////////////////////////////////////////\\r\\n//  大盘异动\\r\\n// 结构 {Date:日期 Time:时间, Title:标题, Type:0 }\\r\\n////////////////////////////////////////////////////////////////////\\r\\nfunction MarketEventInfo()\\r\\n{\\r\\n    this.newMethod=IMinuteInfo;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName='MarketEventInfo';\\r\\n\\r\\n    this.RequestData=function(hqChart)\\r\\n    {\\r\\n        var self = this;\\r\\n        this.Data=[];\\r\\n        var param=\\r\\n            {\\r\\n                HQChart:hqChart\\r\\n            };\\r\\n\\r\\n        var url=g_JSChartResource.CacheDomain+'/cache/analyze/shszevent/marketevent/concept/'+hqChart.TradeDate+'.json';\\r\\n\\r\\n        if (hqChart.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'MarketEventInfo::RequestData', //类名::\\r\\n                    Explain:'大盘异动',\\r\\n                    Request:{ Url:url, Type:'Get', Data: { Date:hqChart.TradeDate, Symbol:hqChart.Symbol } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            hqChart.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvData(data,param);\\r\\n                param.HQChart.UpdataChartInfo();\\r\\n                param.HQChart.Draw();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            type:\\\"get\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvData(recvData,param);\\r\\n            },\\r\\n            error: function(http,e)\\r\\n            {\\r\\n                console.warn(\\\"[MarketEventInfo::RequestData] error, http \\\",e, http);\\r\\n            }\\r\\n        });\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.RecvData=function(recvData,param)\\r\\n    {\\r\\n        for(var i in recvData.event)\\r\\n        {\\r\\n            var event=recvData.event[i];\\r\\n            for(var j in event.data)\\r\\n            {\\r\\n                var item=event.data[j];\\r\\n                if (Array.isArray(item))\\r\\n                {\\r\\n                    if (item.length<2) continue;\\r\\n                    var info={Date:event.date, Time:item[0], Title:item[1], Type:0};\\r\\n                    if (item.length>=3 && item[2] && typeof(item[2])=='string') info.Color=item[2];  //[3]=字体颜色\\r\\n                    if (item.length>=4 && item[3] && typeof(item[3])=='string') info.BGColor=item[3];  //[3]=背景颜色\\r\\n                    this.Data.push(info);\\r\\n                }\\r\\n                else    //新格式\\r\\n                {\\r\\n                    if (!IFrameSplitOperator.IsNumber(item.Date) || !IFrameSplitOperator.IsNumber(item.Time) || !item.Title) continue;\\r\\n                    var info={ Date:item.Date, Time:item.Time, Title:item.Title, Type:0 };\\r\\n                    if (item.Color) info.Color=item.Color;\\r\\n                    if (item.BGColor) info.BGColor=item.BGColor;\\r\\n                    if (IFrameSplitOperator.IsNumber(item.Price)) info.Price=item.Price;\\r\\n                    if (item.Content) info.Content=item.Content;\\r\\n                    if (item.Link) info.Link=item.Link;\\r\\n                    this.Data.push(info);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataChartInfo();\\r\\n        param.HQChart.Draw();\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//注意！！！ 这个函数已经不用了\\r\\n//是否是指数代码\\r\\nfunction IsIndexSymbol(symbol)\\r\\n{\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n    if (upperSymbol.indexOf('.SH')>0)\\r\\n    {\\r\\n        upperSymbol=upperSymbol.replace('.SH','');\\r\\n        if (upperSymbol.charAt(0)=='0' && parseInt(upperSymbol)<=3000) return true;\\r\\n\\r\\n    }\\r\\n    else if (upperSymbol.indexOf('.SZ')>0)\\r\\n    {\\r\\n        upperSymbol=upperSymbol.replace('.SZ','');\\r\\n        if (upperSymbol.charAt(0)=='3' && upperSymbol.charAt(1)=='9') return true;\\r\\n    }\\r\\n    else if (upperSymbol.indexOf('.CI')>0)  //自定义指数\\r\\n    {\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    return false;\\r\\n}\\r\\n\\r\\n//注意！！！ 这个函数已经不用了\\r\\n//是否是基金代码\\r\\nfunction IsFundSymbol(symbol)\\r\\n{\\r\\n    if (!symbol) return false;\\r\\n\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n    if (upperSymbol.indexOf('.SH')>0)\\r\\n    {\\r\\n        upperSymbol=upperSymbol.replace('.SH','');  //51XXXX.sh\\r\\n        if (upperSymbol.charAt(0)=='5' && upperSymbol.charAt(1)=='1') return true;\\r\\n    }\\r\\n    else if (upperSymbol.indexOf('.SZ')>0)\\r\\n    {\\r\\n        upperSymbol=upperSymbol.replace('.SZ','');  //15XXXX.sz, 16XXXX.sz, 17XXXX.sz, 18XXXX.sz\\r\\n        if (upperSymbol.charAt(0)=='1' &&\\r\\n            (upperSymbol.charAt(1)=='5' || upperSymbol.charAt(1)=='6' || upperSymbol.charAt(1)=='7' || upperSymbol.charAt(1)=='8') ) return true;\\r\\n    }\\r\\n\\r\\n    return false;\\r\\n}\\r\\n\\r\\n//设置窗口基类\\r\\nfunction IDivDialog(divElement)\\r\\n{\\r\\n    this.DivElement=divElement;     //父节点\\r\\n    this.ID=null;                   //div id\\r\\n    this.TimeOut=null;              //定时器\\r\\n\\r\\n    //隐藏窗口\\r\\n    this.Hide=function()\\r\\n    {\\r\\n        $(\\\"#\\\"+this.ID).hide();\\r\\n    }\\r\\n\\r\\n    //显示窗口\\r\\n    this.Show=function(left,top,width,height)\\r\\n    {\\r\\n        var cssData={display:'block'};\\r\\n        if (IFrameSplitOperator.IsNumber(left)) cssData.left=left+'px';\\r\\n        if (IFrameSplitOperator.IsNumber(top)) cssData.top=top+'px';\\r\\n        if (IFrameSplitOperator.IsNumber(width)) cssData.width=width+'px';\\r\\n        if (IFrameSplitOperator.IsNumber(height)) cssData.height=height+'px';\\r\\n\\r\\n        $(\\\"#\\\"+this.ID).css(cssData);\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//修改指标\\r\\nfunction ModifyIndexDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Title={ ID:Guid() };      //标题\\r\\n    this.ParamList={ID:Guid() };   //参数列表  class='parameter-content'\\r\\n    this.ParamData=[];              //{ ID:参数ID, Value:参数值}\\r\\n    this.Identify;\\r\\n    this.HQChart;\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-modifyindex-box';\\r\\n        div.id=this.ID;\\r\\n        div.innerHTML=\\r\\n            \\\"<div class='parameter'>\\\\\\r\\n            <div class='parameter-header'>\\\\\\r\\n                <span></span>\\\\\\r\\n                <strong id='close' class='icon iconfont icon-close'></strong>\\\\\\r\\n            </div>\\\\\\r\\n            <div class='parameter-content'><input/>MA</div>\\\\\\r\\n            <div class='parameter-footer'>\\\\\\r\\n                <button class='submit' >确定</button>\\\\\\r\\n                <button class='cancel' >取消</button>\\\\\\r\\n            </div>\\\\\\r\\n        </div>\\\";\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n\\r\\n        //确定按钮\\r\\n        $(\\\"#\\\"+this.ID+\\\" .submit\\\").click(\\r\\n            {\\r\\n                divBox:this,\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                event.data.divBox.Hide();\\r\\n            });\\r\\n\\r\\n        //给一个id 后面查找方便\\r\\n        var titleElement=div.getElementsByTagName('span')[0];\\r\\n        titleElement.id=this.Title.ID;\\r\\n\\r\\n        var paramListElement=div.getElementsByClassName('parameter-content')[0];\\r\\n        paramListElement.id=this.ParamList.ID;\\r\\n    }\\r\\n\\r\\n    //设置标题\\r\\n    this.SetTitle=function(title)\\r\\n    {\\r\\n        $(\\\"#\\\"+this.Title.ID).html(title);\\r\\n    }\\r\\n\\r\\n    //清空参数\\r\\n    this.ClearParamList=function()\\r\\n    {\\r\\n        $(\\\"#\\\"+this.ParamList.ID).empty();\\r\\n        this.ParamData=[];\\r\\n    }\\r\\n\\r\\n    this.BindParam=function(chart,identify)\\r\\n    {\\r\\n        var windowIndex=chart.WindowIndex[identify];\\r\\n        for(var i in windowIndex.Arguments)\\r\\n        {\\r\\n            var item=windowIndex.Arguments[i];\\r\\n            if (item.Name==null || isNaN(item.Value)) break;\\r\\n\\r\\n            var guid=Guid();\\r\\n            var param = '<input class=\\\"row-line\\\" id=\\\"'+guid+'\\\" value=\\\"'+item.Value+'\\\" type=\\\"number\\\" step=\\\"1\\\"/>'+ item.Name +'<br>';\\r\\n            $(\\\"#\\\"+this.ParamList.ID).append(param);\\r\\n\\r\\n            this.ParamData.push({ID:guid,Value:item.Value});\\r\\n        }\\r\\n\\r\\n        //绑定参数修改事件\\r\\n        var self=this;\\r\\n        for(var i in this.ParamData)\\r\\n        {\\r\\n            var item=this.ParamData[i];\\r\\n            $(\\\"#\\\"+item.ID).mouseup(\\r\\n                {\\r\\n                    Chart:chart,\\r\\n                    Identify:identify,\\r\\n                    ParamIndex:i   //参数序号\\r\\n                },\\r\\n                function(event)\\r\\n                {\\r\\n                    var value = parseInt($(this).val());                            //获取当前操作的input属性值，转化为整型\\r\\n                    if (!IFrameSplitOperator.IsNumber(value))\\r\\n                    {\\r\\n                        alert(\\\"参数不能为空\\\");\\r\\n                        return;\\r\\n                    }\\r\\n                    var chart=self.HQChart;\\r\\n                    var identify=self.Identify;\\r\\n                    var paramIndex=event.data.ParamIndex;\\r\\n\\r\\n                    chart.WindowIndex[identify].Arguments[paramIndex].Value = value;    //为参数属性重新赋值\\r\\n                    chart.UpdateWindowIndex(identify);                              //调用更新窗口指标函数，参数用来定位窗口\\r\\n                }\\r\\n            )\\r\\n\\r\\n            $(\\\"#\\\"+item.ID).keyup(\\r\\n                {\\r\\n                    Chart:chart,\\r\\n                    Identify:identify,\\r\\n                    ParamIndex:i   //参数序号\\r\\n                },\\r\\n                function(event)\\r\\n                {\\r\\n                    var value = parseInt($(this).val());                            //获取当前操作的input属性值，转化为整型\\r\\n                    if (!IFrameSplitOperator.IsNumber(value))\\r\\n                    {\\r\\n                        alert(\\\"参数不能为空\\\");\\r\\n                        return;\\r\\n                    }\\r\\n                    var chart=self.HQChart;\\r\\n                    var identify=self.Identify;\\r\\n                    var paramIndex=event.data.ParamIndex;\\r\\n\\r\\n                    chart.WindowIndex[identify].Arguments[paramIndex].Value = value;    //为参数属性重新赋值\\r\\n                    chart.UpdateWindowIndex(identify);                              //调用更新窗口指标函数，参数用来定位窗口\\r\\n                }\\r\\n            )\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //绑定取消事件\\r\\n    this.BindCancel=function()\\r\\n    {\\r\\n        //取消按钮事件\\r\\n        var self=this;\\r\\n        $(\\\"#\\\"+this.ID+\\\" .cancel\\\").click(\\r\\n            function()\\r\\n            {\\r\\n                var chart=self.HQChart;\\r\\n                var identify=self.Identify;\\r\\n                self.RestoreParam(chart.WindowIndex[identify]);\\r\\n                chart.UpdateWindowIndex(identify);\\r\\n                self.Hide();\\r\\n            }\\r\\n        );\\r\\n\\r\\n        //关闭和取消是一样的\\r\\n        $(\\\"#\\\"+this.ID+\\\" #close\\\").click(\\r\\n            function()\\r\\n            {\\r\\n                var chart=self.HQChart;\\r\\n                var identify=self.Identify;\\r\\n\\r\\n                self.RestoreParam(chart.WindowIndex[identify]);\\r\\n                chart.UpdateWindowIndex(identify);\\r\\n                self.Hide();\\r\\n            }\\r\\n        );\\r\\n    }\\r\\n\\r\\n    //还原参数\\r\\n    this.RestoreParam=function(windowIndex)\\r\\n    {\\r\\n        for(var i in this.ParamData)\\r\\n        {\\r\\n            var item=this.ParamData[i];\\r\\n            windowIndex.Arguments[i].Value=item.Value;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //显示\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var identify=event.data.Identify;\\r\\n        var dialog=chart.ModifyIndexDialog;\\r\\n\\r\\n        if(!dialog) return;\\r\\n\\r\\n        if (dialog.ID==null) dialog.Create();   //第1次 需要创建div\\r\\n        dialog.Identify=identify;\\r\\n        dialog.HQChart=chart;\\r\\n        dialog.SetTitle(chart.WindowIndex[identify].Name+\\\" 指标参数设置\\\");      //设置标题\\r\\n        dialog.ClearParamList();            //清空参数\\r\\n        dialog.BindParam(chart,identify);   //绑定参数\\r\\n        dialog.BindCancel();  //绑定取消和关闭事件\\r\\n\\r\\n        dialog.Show();//显示, 在css里调整居中\\r\\n    }\\r\\n}\\r\\n\\r\\n//换指标\\r\\nfunction ChangeIndexDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.DivElement=divElement;   //父节点\\r\\n    this.IndexTreeApiUrl=\\\"https://opensourcecache.zealink.com/cache/hqh5/index/commonindextree.json\\\";               //数据下载地址\\r\\n    this.OverlayIndexTreeApiUrl=\\\"https://opensourcecache.zealink.com/cache/hqh5/index/commonindextree.json\\\";        //叠加指标列表数据下载地址\\r\\n    this.IsOverlayIndex=false;\\r\\n\\r\\n    this.Create=function()\\r\\n    {\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-changeindex-box';\\r\\n        div.id=this.ID=Guid();\\r\\n        div.innerHTML=\\r\\n            '<div class=\\\"target-panel\\\">\\\\n' +\\r\\n            '            <div class=\\\"target-header\\\">\\\\n' +\\r\\n            '                <span>换指标</span>\\\\n' +\\r\\n            '                <strong class=\\\"close-tar icon iconfont icon-close\\\"></strong>\\\\n' +\\r\\n            '            </div>\\\\n' +\\r\\n            '            <div class=\\\"target-content\\\">\\\\n' +\\r\\n            '                <div class=\\\"target-left\\\">\\\\n' +\\r\\n            '                    <input type=\\\"text\\\">\\\\n' +\\r\\n            '                    <ul></ul>\\\\n' +\\r\\n            '                </div>\\\\n' +\\r\\n            '                <div class=\\\"target-right\\\">\\\\n' +\\r\\n            '                    <ul></ul>\\\\n' +\\r\\n            '                </div>\\\\n' +\\r\\n            '            </div>\\\\n' +\\r\\n            '        </div>';\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n    }\\r\\n\\r\\n    //下载数据 如果上次下载过可以 可以不用下载\\r\\n    this.ReqeustData=function()\\r\\n    {\\r\\n        if($(\\\"#\\\" + this.ID + \\\" .target-left ul li\\\").length>0){\\r\\n            return false;\\r\\n        }\\r\\n        var url = this.IndexTreeApiUrl;\\r\\n        if (this.IsOverlayIndex==true) url=this.OverlayIndexTreeApiUrl;\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            type: 'get',\\r\\n            success: function (res) {\\r\\n                var item = res.list;\\r\\n                changeIndexLeftList(item);   //处理左侧list列表\\r\\n                changeIndexRightList(item);  //处理右侧内容列表\\r\\n            }\\r\\n        });\\r\\n\\r\\n        //处理左侧list列表\\r\\n        function changeIndexLeftList(item) {\\r\\n            $(\\\".target-left ul\\\").html('');\\r\\n            $.each(item,function(i,result){\\r\\n                var htmlList;\\r\\n                htmlList = '<li>' + result.node + '</li>';\\r\\n                $(\\\".target-left ul\\\").append(htmlList);\\r\\n            });\\r\\n            //默认选中第一项\\r\\n            $(\\\".target-left ul li:first-child\\\").addClass(\\\"active-list\\\");\\r\\n        }\\r\\n        //处理右侧内容列表\\r\\n        function changeIndexRightList(listNum) {\\r\\n            var contentHtml;\\r\\n            var conData = [];\\r\\n            $.each(listNum,function(index,result){\\r\\n                conData.push(result.list);\\r\\n            })\\r\\n            //页面初始化时显示第一个列表分类下的内容\\r\\n            $.each(conData[0],function (i, res) {\\r\\n                contentHtml = '<li id='+res.id+'>'+ res.name +'</li>';\\r\\n                $(\\\".target-right ul\\\").append(contentHtml);\\r\\n            })\\r\\n            //切换list\\r\\n            $(\\\".target-left ul\\\").delegate(\\\"li\\\",\\\"click\\\",function () {\\r\\n                $(this).addClass(\\\"active-list\\\").siblings().removeClass(\\\"active-list\\\");\\r\\n                var item = $(this).index();\\r\\n                $(\\\".target-right ul\\\").html(\\\"\\\");\\r\\n                $.each(conData[item],function (i, res) {\\r\\n                    contentHtml = '<li id='+res.id+'>'+ res.name +'</li>';\\r\\n                    $(\\\".target-right ul\\\").append(contentHtml);\\r\\n                })\\r\\n            })\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.BindClose=function(chart)\\r\\n    {\\r\\n        //关闭按钮\\r\\n        $(\\\"#\\\"+this.ID+\\\" .close-tar\\\").click(\\r\\n            {\\r\\n                Chart:chart,\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                var chart=event.data.Chart;\\r\\n                chart.ChangeIndexDialog.Hide();\\r\\n            }\\r\\n        );\\r\\n    }\\r\\n\\r\\n    //搜索事件\\r\\n    this.BindSearch=function(chart)\\r\\n    {\\r\\n        $(\\\".target-left input\\\").on('input',\\r\\n            {\\r\\n                Chart:chart\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                let scriptData = new JSIndexScript();\\r\\n                let result=scriptData.Search(event.target.value);\\r\\n\\r\\n                $(\\\".target-right ul\\\").html(\\\"\\\");\\r\\n                for(var i in result)\\r\\n                {\\r\\n                    var name=result[i];\\r\\n                    var contentHtml = '<li id='+name+'>'+ name +'</li>';\\r\\n                    $(\\\".target-right ul\\\").append(contentHtml);\\r\\n                }\\r\\n\\r\\n            }\\r\\n        );\\r\\n    }\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var identify=event.data.Identify;\\r\\n        var dialog=chart.ChangeIndexDialog;\\r\\n        var isOverlay=event.data.IsOverlay; //是否叠加\\r\\n\\r\\n        if(!dialog) return;\\r\\n\\r\\n        if (dialog.ID==null) dialog.Create();   //第1次 需要创建div\\r\\n        dialog.IsOverlayIndex=isOverlay;\\r\\n        dialog.ReqeustData();   //下载数据\\r\\n\\r\\n        //切换窗口指标类型  每次委托事件执行之前，先用undelegate()解除之前的所有绑定\\r\\n        changeIndeWindow();\\r\\n        function changeIndeWindow()\\r\\n        {\\r\\n            $(\\\".target-right ul\\\").undelegate().delegate(\\\"li\\\",\\\"click\\\",function () {\\r\\n                var idv = $(this).attr(\\\"id\\\");\\r\\n                if (isOverlay)\\r\\n                    chart.AddOverlayIndex({WindowIndex:identify,IndexName:idv});\\r\\n                else\\r\\n                    chart.ChangeIndex(identify,idv);\\r\\n                $(this).addClass(\\\"active-list\\\").siblings().removeClass(\\\"active-list\\\");\\r\\n            });\\r\\n        }\\r\\n\\r\\n        dialog.BindSearch(chart);\\r\\n        //关闭弹窗\\r\\n        dialog.BindClose(chart);\\r\\n        dialog.Show();\\r\\n    }\\r\\n}\\r\\n\\r\\n//信息地理tooltip\\r\\nfunction KLineInfoTooltip(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.UpColor=g_JSChartResource.UpTextColor;\\r\\n    this.DownColor=g_JSChartResource.DownTextColor;\\r\\n    this.UnchagneColor=g_JSChartResource.UnchagneTextColor;\\r\\n\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-klineinfo-tooltip';\\r\\n        div.id=this.ID;\\r\\n        div.innerHTML=\\\"<div class='title-length'></div>\\\";\\r\\n        this.DivElement.appendChild(div);\\r\\n    }\\r\\n\\r\\n\\r\\n    this.BindInfoList=function(infoType,infoList)\\r\\n    {\\r\\n        var strBox=\\\"<div class='total-list'>共\\\"+infoList.length+\\\"条</div>\\\";\\r\\n        var strText=[];\\r\\n        for(var i in infoList)\\r\\n        {\\r\\n            var item=infoList[i];\\r\\n            var strOld=item.Date;\\r\\n            if(infoType==KLINE_INFO_TYPE.PFORECAST)\\r\\n            {\\r\\n                var reportDate=item.ExtendData.ReportDate;\\r\\n                var year=parseInt(reportDate/10000);  //年份\\r\\n                var day=reportDate%10000;   //比较 这个去掉年份的日期\\r\\n                var reportType;\\r\\n                if(day == 1231){\\r\\n                    reportType = \\\"年报\\\"\\r\\n                }else if(day == 331){\\r\\n                    reportType = \\\"一季度报\\\"\\r\\n                }else if(day == 630){\\r\\n                    reportType = \\\"半年度报\\\"\\r\\n                }else if(day == 930){\\r\\n                    reportType = \\\"三季度报\\\"\\r\\n                }\\r\\n\\r\\n                var weekData=\\\"\\\";\\r\\n                if (item.ExtendData.FWeek)\\r\\n                {\\r\\n                    if (item.ExtendData.FWeek.Week1!=null) weekData+=\\\"一周后涨幅:<i class='increase' style='color:\\\"+this.GetColor(item.ExtendData.FWeek.Week1.toFixed(2))+\\\"'>\\\"+ item.ExtendData.FWeek.Week1.toFixed(2)+\\\"%</i>\\\";\\r\\n                    if (item.ExtendData.FWeek.Week4!=null) weekData+=\\\"&nbsp;四周后涨幅:<i class='increase' style='color:\\\"+this.GetColor(item.ExtendData.FWeek.Week4.toFixed(2))+\\\"'>\\\"+ item.ExtendData.FWeek.Week4.toFixed(2)+\\\"%</i>\\\";\\r\\n                    if (weekData.length>0) weekData=\\\"<br/>&nbsp;&nbsp;<i class='prorecast-week'>\\\"+weekData+\\\"</i>\\\";\\r\\n                }\\r\\n                var strDate=item.Date.toString();\\r\\n                var strNew=strDate.substring(0,4)+\\\"-\\\"+strDate.substring(4,6)+\\\"-\\\"+strDate.substring(6,8);  //转换时间格式\\r\\n                strText+=\\\"<span>\\\"+strNew+\\\"&nbsp;&nbsp;\\\"+year+reportType+item.Title+\\\"&nbsp;\\\"+weekData+\\\"</span>\\\";\\r\\n\\r\\n            }\\r\\n            else if (infoType==KLINE_INFO_TYPE.RESEARCH)    //调研单独处理\\r\\n            {\\r\\n                var levels=item.ExtendData.Level;\\r\\n                var recPerson=[];\\r\\n                if(levels.length==0){\\r\\n                    recPerson = \\\"<i>无</i>\\\"\\r\\n                }else{\\r\\n                    for(var j in levels)\\r\\n                    {\\r\\n                        if(levels[j]==0){\\r\\n                            recPerson+=\\\"<i style='color:#00a0e9'>证券代表&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                        }else if(levels[j]==1){\\r\\n                            recPerson+=\\\"<i>董秘&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                        }else if(levels[j]==2){\\r\\n                            recPerson+=\\\"<i style='color:#00a0e9'>总经理&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                        }else if(levels[j]==3){\\r\\n                            recPerson+=\\\"<i style='color:#00a0e9'>董事长&nbsp;&nbsp;&nbsp;</i>\\\";\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                var strDate=item.Date.toString();\\r\\n                var strNew=strDate.substring(0,4)+\\\"-\\\"+strDate.substring(4,6)+\\\"-\\\"+strDate.substring(6,8);  //转换时间格式\\r\\n                strText+=\\\"<span>\\\"+strNew+\\\"&nbsp;&nbsp;&nbsp;接待:&nbsp;&nbsp;&nbsp;\\\"+recPerson+\\\"</span>\\\";\\r\\n            }else if(infoType==KLINE_INFO_TYPE.BLOCKTRADING)\\r\\n            {\\r\\n                var showPriceInfo = item.ExtendData;\\r\\n                var strDate=item.Date.toString();\\r\\n                var strNew=strDate.substring(0,4)+\\\"-\\\"+strDate.substring(4,6)+\\\"-\\\"+strDate.substring(6,8);  //转换时间格式\\r\\n                strText+=\\\"<span><i class='date-tipbox'>\\\"+strNew+\\\"</i>&nbsp;&nbsp;<i class='tipBoxTitle'>成交价:&nbsp;\\\"+showPriceInfo.Price.toFixed(2)+\\\"</i><i class='tipBoxTitle'>收盘价:&nbsp;\\\"+showPriceInfo.ClosePrice.toFixed(2)+\\r\\n                    \\\"</i><br/><i class='rate-discount tipBoxTitle'>溢折价率:&nbsp;<strong style='color:\\\"+ this.GetColor(showPriceInfo.Premium.toFixed(2))+\\\"'>\\\"+\\r\\n                    showPriceInfo.Premium.toFixed(2)+\\\"%</strong></i><i class='tipBoxTitle'>成交量(万股):&nbsp;\\\"+showPriceInfo.Vol.toFixed(2)+\\\"</i></span>\\\";\\r\\n            }\\r\\n            else if (infoType==KLINE_INFO_TYPE.TRADEDETAIL) //龙虎榜\\r\\n            {\\r\\n                /*var detail=[\\r\\n                    \\\"日价格涨幅偏离值达到9.89%\\\",\\r\\n                    \\\"日价格涨幅偏离值达格涨幅偏离值达格涨幅偏离值达到9.89%\\\"\\r\\n                ]*/\\r\\n                var detail=item.ExtendData.Detail;\\r\\n                //格式：日期 上榜原因: detail[0].TypeExplain\\r\\n                //                    detail[1].TypeExplain\\r\\n                //      一周后涨幅: xx 四周后涨幅: xx\\r\\n                var str=strOld.toString();\\r\\n                var strNew=str.substring(0,4)+\\\"-\\\"+str.substring(4,6)+\\\"-\\\"+str.substring(6,8);  //转换时间格式\\r\\n                var reasons = [];\\r\\n                for(var i in detail){\\r\\n                    reasons += \\\"<i>\\\"+detail[i].TypeExplain+\\\"</i><br/>\\\"\\r\\n                    // reasons += detail[i] + \\\"<br/>\\\"\\r\\n                }\\r\\n\\r\\n                strText = \\\"<span><i class='trade-time'>\\\"+strNew+\\\"&nbsp;&nbsp;&nbsp;上榜原因:&nbsp;&nbsp;</i><i class='reason-list'>\\\"+reasons+\\\"</i><br/><i class='trade-detall'>一周后涨幅:&nbsp;<strong style='color:\\\"+\\r\\n                    this.GetColor(item.ExtendData.FWeek.Week1.toFixed(2))+\\\"'>\\\"+ item.ExtendData.FWeek.Week1.toFixed(2)+\\r\\n                    \\\"%</strong>&nbsp;&nbsp;&nbsp;四周后涨幅:&nbsp;<strong style='color:\\\"+this.GetColor(item.ExtendData.FWeek.Week4.toFixed(2))+\\\";'>\\\"+\\r\\n                    item.ExtendData.FWeek.Week4.toFixed(2)+\\\"%</strong></i></span>\\\";\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var str=strOld.toString();\\r\\n                var strNew=str.substring(0,4)+\\\"-\\\"+str.substring(4,6)+\\\"-\\\"+str.substring(6,8);  //转换时间格式\\r\\n                strText+=\\\"<span>\\\"+strNew+\\\"&nbsp;&nbsp;&nbsp;\\\"+item.Title+\\\"</span>\\\";\\r\\n            }\\r\\n        }\\r\\n        var titleInnerBox = $(\\\".title-length\\\").html(strText);\\r\\n\\r\\n        $(\\\"#\\\"+this.ID).html(titleInnerBox);\\r\\n\\r\\n        //当信息超过8条时，添加“共XX条”统计总数\\r\\n        if(infoList.length > 8){\\r\\n            $(\\\"#\\\"+this.ID).append(strBox);\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetColor=function(price)\\r\\n    {\\r\\n        if(price>0) return this.UpColor;\\r\\n        else if (price<0) return this.DownColor;\\r\\n        else return this.UnchagneColor;\\r\\n    }\\r\\n\\r\\n    //显示窗口，改函数仅为KLineInfoTooltip使用\\r\\n    this.Show=function(left,top,width,height,tooltip,times)\\r\\n    {\\r\\n        //显示位置\\r\\n        $(\\\"#\\\"+this.ID).css({'display':'block','top':top+'px', \\\"left\\\":left+'px', \\\"width\\\":width+'px', \\\"height\\\":height+'px' });\\r\\n\\r\\n        function toolHide() {\\r\\n            tooltip.Hide();\\r\\n        }\\r\\n\\r\\n        if (this.TimeOut!=null)\\r\\n            clearTimeout(this.TimeOut); //清空上一次的定时器,防止定时器不停的被调用\\r\\n\\r\\n        //设置窗口定时隐藏\\r\\n        this.TimeOut=setTimeout(toolHide,times);\\r\\n\\r\\n    }\\r\\n\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var infoType=event.data.InfoType;   //信息地雷类型\\r\\n        var infoList=event.data.InfoList;    //信息数据列表\\r\\n        var tooltip=chart.KLineInfoTooltip;\\r\\n\\r\\n        if(!tooltip) return;\\r\\n        if (tooltip.ID==null) tooltip.Create();   //第1次 需要创建div\\r\\n\\r\\n        tooltip.BindInfoList(infoType,infoList);\\r\\n\\r\\n        var left=event.pageX;\\r\\n        var top=event.pageY+10;\\r\\n        var widthTool=380;\\r\\n        var heightTool=$(\\\"#\\\"+tooltip.ID).height();\\r\\n\\r\\n        if((left + widthTool) > chart.UIElement.getBoundingClientRect().width){\\r\\n            left = left - widthTool;\\r\\n        }\\r\\n        /*if(top+heightTool>chart.UIElement.getBoundingClientRect().height){\\r\\n            top=top-heightTool-45;\\r\\n        }*/\\r\\n\\r\\n        tooltip.Show(left,top,widthTool,\\\"auto\\\",tooltip,8000);\\r\\n    }\\r\\n\\r\\n    //鼠标离开\\r\\n    this.Leave=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var tooltip=chart.KLineInfoTooltip;\\r\\n\\r\\n        if(!tooltip || tooltip.ID==null) return;\\r\\n\\r\\n        tooltip.Hide();\\r\\n    }\\r\\n}\\r\\n\\r\\n//历史K线上双击 弹出分钟走势图框\\r\\nfunction MinuteDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n\\r\\n    this.JSChart=null;\\r\\n    this.Height=500;\\r\\n    this.Width=600;\\r\\n    this.Symbol;\\r\\n    this.TradeDate;\\r\\n    this.HistoryData;\\r\\n\\r\\n    //显示窗口\\r\\n    this.Show=function(left,top,width,height)\\r\\n    {\\r\\n        var div=document.getElementById(this.ID);\\r\\n        if (!div) return false;\\r\\n\\r\\n        var findDiv=div.getElementsByClassName(\\\"minute-hqchart\\\");\\r\\n        if (!findDiv || findDiv.length!=1) return false;\\r\\n        var klineDiv=findDiv[0];\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(width)) div.style.width=width+\\\"px\\\";\\r\\n        if (IFrameSplitOperator.IsNumber(height)) div.style.height=height+\\\"px\\\";\\r\\n        if (IFrameSplitOperator.IsNumber(left)) div.style.left=left+\\\"px\\\";\\r\\n        if (IFrameSplitOperator.IsNumber(top)) div.style.top=top+\\\"px\\\";\\r\\n\\r\\n        div.style.display='block';\\r\\n\\r\\n        var klineWdith=klineDiv.offsetWidth;\\r\\n        var klineTop=klineDiv.offsetTop;\\r\\n        klineDiv.style.width=klineWdith+\\\"px\\\";\\r\\n        klineDiv.style.height=(height-klineTop-5)+\\\"px\\\";\\r\\n    }\\r\\n\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-kline-minute-box';\\r\\n        div.id=this.ID;\\r\\n        var hqchartID=Guid();\\r\\n        div.innerHTML=`<div><div class='minute-dialog-title'><span></span><strong class='close-munite icon iconfont icon-close'></strong></div><div class='minute-hqchart' id='${hqchartID}' ></div></div>`;\\r\\n        div.style.width=this.Height+'px';\\r\\n        div.style.height=this.Width+'px';\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n        this.JSChart=JSChart.Init(document.getElementById(hqchartID));\\r\\n\\r\\n        var option=\\r\\n            {\\r\\n                Type:'历史分钟走势图',\\r\\n                Symbol:this.Symbol,     //股票代码\\r\\n                IsAutoUpdate:false,       //是自动更新数据\\r\\n\\r\\n                IsShowRightMenu:false,   //右键菜单\\r\\n                HistoryMinute: { TradeDate:this.TradeDate, IsShowName:false, IsShowDate:false }   //显示的交易日期\\r\\n            };\\r\\n\\r\\n        this.JSChart.SetOption(option);\\r\\n    }\\r\\n\\r\\n    this.BindClose=function(chart)\\r\\n    {\\r\\n        //关闭按钮\\r\\n        $(\\\"#\\\"+this.ID+\\\" .close-munite\\\").click(\\r\\n            {\\r\\n                Chart:chart\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                var chart=event.data.Chart;\\r\\n                chart.MinuteDialog.Hide();\\r\\n            }\\r\\n        );\\r\\n    }\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        this.UpColor=g_JSChartResource.UpTextColor;\\r\\n        this.DownColor=g_JSChartResource.DownTextColor;\\r\\n        this.UnchagneColor=g_JSChartResource.UnchagneTextColor;\\r\\n\\r\\n        var chart=event.data.Chart;\\r\\n        var tooltip=event.data.Tooltip;\\r\\n        var dialog=chart.MinuteDialog;\\r\\n\\r\\n        dialog.Symbol=chart.Symbol;\\r\\n        dialog.TradeDate=tooltip.Data.Date;\\r\\n\\r\\n        if(!dialog) return;\\r\\n        if (dialog.ID==null)\\r\\n        {\\r\\n            dialog.Create();   //第1次 需要创建div\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            dialog.JSChart.JSChartContainer.TradeDate=dialog.TradeDate;\\r\\n            dialog.JSChart.ChangeSymbol(this.Symbol);\\r\\n        }\\r\\n\\r\\n        var left=event.clientX;\\r\\n        var top=event.clientY+10;\\r\\n\\r\\n        var pixelTatio=GetDevicePixelRatio();\\r\\n        dialog.Show(500/pixelTatio,100/pixelTatio,600,500);\\r\\n        dialog.JSChart.OnSize();\\r\\n\\r\\n        this.BindClose(chart);\\r\\n\\r\\n        this.GetColor=function(price,yclse)\\r\\n        {\\r\\n            if(price>yclse) return this.UpColor;\\r\\n            else if (price<yclse) return this.DownColor;\\r\\n            else return this.UnchagneColor;\\r\\n        }\\r\\n\\r\\n        var strName = event.data.Chart.Name;\\r\\n        var strData=event.data.Tooltip.Data;\\r\\n        var date=new Date(parseInt(strData.Date/10000),(strData.Date/100%100-1),strData.Date%100);\\r\\n        var strDate = strData.Date.toString();\\r\\n        var strNewDate=strDate.substring(0,4)+\\\"-\\\"+strDate.substring(4,6)+\\\"-\\\"+strDate.substring(6,8);  //转换时间格式\\r\\n        var str = \\\"<span>\\\"+strName+\\\"</span>\\\"+\\\"<span>\\\"+strNewDate+\\\"</span>&nbsp;\\\"+\\r\\n            \\\"<span style='color:\\\"+this.GetColor(strData.Open,strData.YClose)+\\\";'>开:\\\"+strData.Open.toFixed(2)+\\\"</span>\\\"+\\r\\n            \\\"<span style='color:\\\"+this.GetColor(strData.High,strData.YClose)+\\\";'>高:\\\"+strData.High.toFixed(2)+\\\"</span>\\\"+\\r\\n            \\\"<span style='color:\\\"+this.GetColor(strData.Low,strData.YClose)+\\\";'>低:\\\"+strData.Low.toFixed(2)+\\\"</span>\\\"+\\r\\n            \\\"<span style='color:\\\"+this.GetColor(strData.Close,strData.YClose)+\\\";'>收:\\\"+strData.Close.toFixed(2)+\\\"</span>\\\"+\\r\\n            \\\"<span style='color:\\\"+this.VolColor+\\\";'>量:\\\"+IFrameSplitOperator.FormatValueString(strData.Vol,2)+\\\"</span>\\\"+\\r\\n            \\\"<span style='color:\\\"+this.AmountColor+\\\";'>额:\\\"+IFrameSplitOperator.FormatValueString(strData.Amount,2)+\\\"</span>\\\";\\r\\n        $(\\\".minute-dialog-title span\\\").html(str);\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction MinuteSelectRectDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.SelectData;\\r\\n    this.Dialog;\\r\\n    this.HQChart;\\r\\n    this.RectSelectPaint;\\r\\n\\r\\n    //隐藏窗口\\r\\n    this.Close=function()\\r\\n    {\\r\\n        if (this.Dialog)\\r\\n        {\\r\\n            this.DivElement.removeChild(this.Dialog);\\r\\n            this.Dialog=null;\\r\\n            this.ID=null;\\r\\n        }\\r\\n\\r\\n        if (this.RectSelectPaint) this.RectSelectPaint.PreventClose=false;\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-select-statistics-box';\\r\\n        div.id=this.ID;\\r\\n        div.innerHTML=\\r\\n            \\\"<div class='parameter jchart-select-section'>\\\\\\r\\n            <div class='parameter-header'>\\\\\\r\\n                <span>分时图区间统计</span>\\\\\\r\\n                <strong id='close' class='icon iconfont icon-close'></strong>\\\\\\r\\n            </div>\\\\\\r\\n            <div class='parameter-content'>统计数据</div>\\\\\\r\\n        <div class='parameter-footer'>\\\\\\r\\n            <button id='close' class='submit' >确定</button>\\\\\\r\\n        </div>\\\\\\r\\n        </div>\\\";\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n        this.Dialog=div;\\r\\n\\r\\n        //关闭按钮\\r\\n        $(\\\"#\\\"+this.ID+\\\" #close\\\").click(\\r\\n            {\\r\\n                divBox:this,\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                event.data.divBox.Close();\\r\\n            });\\r\\n    }\\r\\n\\r\\n    this.BindData=function()\\r\\n    {\\r\\n        var hqData=this.SelectData.Data;\\r\\n        var start=this.SelectData.Start;\\r\\n        var end=this.SelectData.End;\\r\\n        this.HQChart.UpdateSelectRect(start,end);\\r\\n        if (this.RectSelectPaint) this.RectSelectPaint.PreventClose=true;\\r\\n\\r\\n        var showData=\\r\\n            {\\r\\n                Open:0,Close:0,High:0,Low:0,  //起始价格, 结束价格, 最高, 最低\\r\\n                Vol:0, Amount:0,\\r\\n                Date:\\r\\n                    {\\r\\n                        Start:{Time:null, Date:null },\\r\\n                        End:{ Time:null, Date:null }\\r\\n                    },\\r\\n                Count:0,\\r\\n            }\\r\\n\\r\\n        for(var i=start; i<=end && i<hqData.Data.length; ++i)\\r\\n        {\\r\\n            var item=hqData.Data[i];\\r\\n            if (i==start)\\r\\n            {\\r\\n                showData.Date.Start.Date=item.Date;\\r\\n                showData.Date.Start.Time=item.Time;\\r\\n                showData.Open=item.Close;\\r\\n                showData.High=item.High;\\r\\n                showData.Low=item.Low;\\r\\n            }\\r\\n\\r\\n            showData.Date.End.Date=item.Date;\\r\\n            showData.Date.End.Time=item.Time;\\r\\n            showData.Close=item.Close;\\r\\n            showData.Vol+=item.Vol;\\r\\n            showData.Amount+=item.Amount;\\r\\n            ++showData.Count;\\r\\n            if (showData.High<item.High) showData.High=item.High;\\r\\n            if(showData.Low>item.Low) showData.Low=item.Low;\\r\\n        }\\r\\n\\r\\n        if (showData.Vol>0) showData.AvPrice=showData.Amount/showData.Vol;  //均价\\r\\n        if (item.Open>0)\\r\\n        {\\r\\n            showData.Increase = (showData.Close - showData.Open) / showData.Open *100;   //区间涨幅\\r\\n            showData.Amplitude = (showData.High - showData.Low) / showData.Open * 100;   //区间振幅\\r\\n        }\\r\\n\\r\\n        // JSConsole.Chart.Log('[KLineSelectRectDialog::BindData]', showData);\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.SelectData.Symbol);\\r\\n        var startDate=IFrameSplitOperator.FormatDateString(showData.Date.Start.Date);\\r\\n        var endDate=IFrameSplitOperator.FormatDateString(showData.Date.End.Date);\\r\\n        startDate+=' '+IFrameSplitOperator.FormatTimeString(showData.Date.Start.Time,\\\"HH:MM\\\");\\r\\n        endDate+=\\\" \\\"+IFrameSplitOperator.FormatTimeString(showData.Date.End.Time,\\\"HH:MM\\\");\\r\\n\\r\\n        var startLeftClass=\\\"\\\",startRightClass=\\\"\\\",endLeftClass=\\\"\\\",endRightClass=\\\"\\\";\\r\\n        if(start<=0) startLeftClass = \\\"BtnBackground\\\";\\r\\n        if(start >= end) {\\r\\n            startRightClass = \\\"BtnBackground\\\";\\r\\n            endLeftClass = \\\"BtnBackground\\\";\\r\\n        }\\r\\n        if(end >= hqData.Data.length - 1) endRightClass = \\\"BtnBackground\\\";\\r\\n\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-select-table-right';\\r\\n        div.innerHTML=\\r\\n            '<div class=\\\"jchart-select-date\\\">\\\\n' +\\r\\n            '            <span>开始: '+ startDate +'<i class=\\\"start-date-left '+ startLeftClass +'\\\"><</i><i class=\\\"start-date-right '+ startRightClass +'\\\">></i></span>\\\\n' +\\r\\n            '            <span>结束: '+ endDate +'<i class=\\\"end-date-left '+ endLeftClass +'\\\"><</i><i class=\\\"end-date-right '+ endRightClass +'\\\">></i></span>\\\\n' +\\r\\n            '            <span>总个数: '+ showData.Count +'</span>\\\\n' +\\r\\n            '        </div>\\\\n' +\\r\\n            '        <table>\\\\n' +\\r\\n            '            <tr><td><strong>起始价: </strong><span>'+ showData.Open.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>终止价: </strong><span>'+ showData.Close.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>均价: </strong><span>'+ (IFrameSplitOperator.IsNumber(showData.AvPrice) ? showData.AvPrice.toFixed(defaultfloatPrecision):\\\"--.--\\\") +'</span></td></tr>\\\\n' +\\r\\n            '            <tr><td><strong>最低价: </strong><span>'+ showData.Low.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>最高价: </strong><span>'+ showData.High.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>涨跌幅: </strong><span class=\\\"'+ IFrameSplitOperator.FormatValueColor(showData.Increase) +'\\\">'+ showData.Increase.toFixed(2) +'%</span></td></tr>\\\\n' +\\r\\n            '            <tr><td><strong>振幅: </strong><span>'+ showData.Amplitude.toFixed(2) +'%</span></td>' +\\r\\n            '               <td><strong>成交量: </strong><span>'+ IFrameSplitOperator.FormatValueString(showData.Vol,2) +'股</span></td>' +\\r\\n            '               <td><strong>金额: </strong><span>'+ IFrameSplitOperator.FormatValueString(showData.Amount,2) +'元</span></td></tr>\\\\n' +\\r\\n            '        </table>';\\r\\n\\r\\n        $(\\\".parameter-content\\\").html(div);\\r\\n        this.BindEvent();\\r\\n    }\\r\\n\\r\\n    this.BindEvent = function ()\\r\\n    {\\r\\n        var _self = this;\\r\\n        if(_self.SelectData.Start > 0){\\r\\n            $(\\\".jchart-select-date .start-date-left\\\").click(function () {\\r\\n                _self.SelectData.Start--;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n        }\\r\\n        if(_self.SelectData.Start < _self.SelectData.End){\\r\\n            $(\\\".jchart-select-date .start-date-right\\\").click(function () {\\r\\n                _self.SelectData.Start++;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n            $(\\\".jchart-select-date .end-date-left\\\").click(function () {\\r\\n                _self.SelectData.End--;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n        }\\r\\n        if(_self.SelectData.End < _self.SelectData.Data.Data.length - 1){\\r\\n            $(\\\".jchart-select-date .end-date-right\\\").click(function () {\\r\\n                _self.SelectData.End++;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    //显示\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        if (this.ID==null) this.Create();   //第1次 需要创建div\\r\\n        this.SelectData=event.data.SelectData;\\r\\n        this.RectSelectPaint=event.data.RectSelectPaint;\\r\\n        this.HQChart=chart;\\r\\n        this.HQChart.HideSelectRect();\\r\\n        this.BindData();\\r\\n\\r\\n        this.Show();      //通过CSS居中显示\\r\\n    }\\r\\n\\r\\n\\r\\n}\\r\\n\\r\\n//区间统计\\r\\nfunction KLineSelectRectDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.SelectData;\\r\\n    this.Dialog;\\r\\n    this.HQChart;\\r\\n    this.RectSelectPaint;\\r\\n\\r\\n    //隐藏窗口\\r\\n    this.Close=function()\\r\\n    {\\r\\n        if (this.Dialog)\\r\\n        {\\r\\n            this.DivElement.removeChild(this.Dialog);\\r\\n            this.Dialog=null;\\r\\n        }\\r\\n\\r\\n        if (this.RectSelectPaint) this.RectSelectPaint.PreventClose=false;\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-select-statistics-box';\\r\\n        div.id=this.ID;\\r\\n        div.innerHTML=\\r\\n            \\\"<div class='parameter jchart-select-section'>\\\\\\r\\n            <div class='parameter-header'>\\\\\\r\\n                <span>区间统计</span>\\\\\\r\\n                <strong id='close' class='icon iconfont icon-close'></strong>\\\\\\r\\n            </div>\\\\\\r\\n            <div class='parameter-content'>统计数据</div>\\\\\\r\\n        <div class='parameter-footer'>\\\\\\r\\n            <button id='close' class='submit' >确定</button>\\\\\\r\\n            <button id='match' class='submit' >形态匹配</button>\\\\\\r\\n        </div>\\\\\\r\\n        </div>\\\";\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n        this.Dialog=div;\\r\\n\\r\\n        //关闭按钮\\r\\n        $(\\\"#\\\"+this.ID+\\\" #close\\\").click(\\r\\n            {\\r\\n                divBox:this,\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                event.data.divBox.Close();\\r\\n            });\\r\\n\\r\\n        //形态匹配\\r\\n        $(\\\"#\\\"+this.ID+\\\" #match\\\").click(\\r\\n            {\\r\\n                divBox:this,\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                event.data.divBox.KLineMatch();\\r\\n            });\\r\\n    }\\r\\n\\r\\n    this.BindData=function()\\r\\n    {\\r\\n        var hqData=this.SelectData.Data;\\r\\n        var start=this.SelectData.Start;\\r\\n        var end=this.SelectData.End;\\r\\n        this.HQChart.UpdateSelectRect(start,end);\\r\\n        if (this.RectSelectPaint) this.RectSelectPaint.PreventClose=true;\\r\\n\\r\\n        var showData=\\r\\n            {\\r\\n                Open:0,Close:0,High:0,Low:0, YClose:0,\\r\\n                Vol:0, Amount:0,\\r\\n                Date:\\r\\n                    {\\r\\n                        Start:{Time:null, Date:null },\\r\\n                        End:{ Time:null, Date:null }\\r\\n                    },\\r\\n                Count:0,\\r\\n                KLine:{ Up:0,Down:0,Unchanged:0 }    //阳线|阴线|平线\\r\\n            }\\r\\n\\r\\n        for(var i=start; i<=end && i<hqData.Data.length; ++i)\\r\\n        {\\r\\n            var item=hqData.Data[i];\\r\\n            if (i==start)\\r\\n            {\\r\\n                showData.Date.Start.Date=item.Date;\\r\\n                showData.Date.Start.Time=item.Time;\\r\\n                showData.Open=item.Open;\\r\\n                showData.High=item.High;\\r\\n                showData.Low=item.Low;\\r\\n                showData.YClose=item.YClose;\\r\\n            }\\r\\n\\r\\n            showData.Date.End.Date=item.Date;\\r\\n            showData.Date.End.Time=item.Time;\\r\\n            showData.Close=item.Close;\\r\\n            showData.Vol+=item.Vol;\\r\\n            showData.Amount+=item.Amount;\\r\\n            ++showData.Count;\\r\\n            if (showData.High<item.High) showData.High=item.High;\\r\\n            if(showData.Low>item.Low) showData.Low=item.Low;\\r\\n            if (item.Close>item.Open) ++showData.KLine.Up;\\r\\n            else if (item.Close<item.Open) ++showData.KLine.Down;\\r\\n            else ++showData.KLine.Unchanged;\\r\\n        }\\r\\n\\r\\n        if (showData.Vol>0) showData.AvPrice=showData.Amount/showData.Vol;  //均价\\r\\n        if (item.YClose>0)\\r\\n        {\\r\\n            showData.Increase = (showData.Close - showData.YClose) / showData.YClose *100;   //涨幅\\r\\n            showData.Amplitude = (showData.High - showData.Low) / showData.YClose * 100;     //振幅\\r\\n        }\\r\\n\\r\\n        // JSConsole.Chart.Log('[KLineSelectRectDialog::BindData]', showData);\\r\\n        var defaultfloatPrecision=GetfloatPrecision(this.SelectData.Symbol);\\r\\n        var startDate=IFrameSplitOperator.FormatDateString(showData.Date.Start.Date);\\r\\n        var endDate=IFrameSplitOperator.FormatDateString(showData.Date.End.Date);\\r\\n        if (ChartData.IsMinutePeriod(this.HQChart.Period))\\r\\n        {\\r\\n            startDate+=' '+IFrameSplitOperator.FormatTimeString(showData.Date.Start.Time,\\\"HH:MM\\\");\\r\\n            endDate+=\\\" \\\"+IFrameSplitOperator.FormatTimeString(showData.Date.End.Time,\\\"HH:MM\\\");\\r\\n        }\\r\\n        else if (ChartData.IsSecondPeriod(this.HQChart.Period) || ChartData.IsTickPeriod(this.HQChart.Period))\\r\\n        {\\r\\n            startDate+=' '+IFrameSplitOperator.FormatTimeString(showData.Date.Start.Time,\\\"HH:MM:SS\\\");\\r\\n            endDate+=\\\" \\\"+IFrameSplitOperator.FormatTimeString(showData.Date.End.Time,\\\"HH:MM:SS\\\");\\r\\n        }\\r\\n\\r\\n        var startLeftClass=\\\"\\\",startRightClass=\\\"\\\",endLeftClass=\\\"\\\",endRightClass=\\\"\\\";\\r\\n        if(start<=0) startLeftClass = \\\"BtnBackground\\\";\\r\\n        if(start >= end) {\\r\\n            startRightClass = \\\"BtnBackground\\\";\\r\\n            endLeftClass = \\\"BtnBackground\\\";\\r\\n        }\\r\\n        if(end >= hqData.Data.length - 1) endRightClass = \\\"BtnBackground\\\";\\r\\n\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-select-table-right';\\r\\n        div.innerHTML=\\r\\n            '<div class=\\\"jchart-select-date\\\">\\\\n' +\\r\\n            '            <span>开始: '+ startDate +'<i class=\\\"start-date-left '+ startLeftClass +'\\\"><</i><i class=\\\"start-date-right '+ startRightClass +'\\\">></i></span>\\\\n' +\\r\\n            '            <span>结束: '+ endDate +'<i class=\\\"end-date-left '+ endLeftClass +'\\\"><</i><i class=\\\"end-date-right '+ endRightClass +'\\\">></i></span>\\\\n' +\\r\\n            '            <span>总个数: '+ showData.Count +'</span>\\\\n' +\\r\\n            '        </div>\\\\n' +\\r\\n            '        <table>\\\\n' +\\r\\n            '            <tr><td><strong>起始价: </strong><span>'+ showData.YClose.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>最终价: </strong><span>'+ showData.Close.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>均价: </strong><span>'+ (IFrameSplitOperator.IsNumber(showData.AvPrice) ? showData.AvPrice.toFixed(defaultfloatPrecision):\\\"--.--\\\") +'</span></td></tr>\\\\n' +\\r\\n            '            <tr><td><strong>最低价: </strong><span>'+ showData.Low.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>最高价: </strong><span>'+ showData.High.toFixed(defaultfloatPrecision) +'</span></td>' +\\r\\n            '               <td><strong>涨跌幅: </strong><span class=\\\"'+ IFrameSplitOperator.FormatValueColor(showData.Increase) +'\\\">'+ showData.Increase.toFixed(2) +'%</span></td></tr>\\\\n' +\\r\\n            '            <tr><td><strong>振幅: </strong><span>'+ showData.Amplitude.toFixed(2) +'%</span></td>' +\\r\\n            '               <td><strong>成交量: </strong><span>'+ IFrameSplitOperator.FormatValueString(showData.Vol,2) +'股</span></td>' +\\r\\n            '               <td><strong>金额: </strong><span>'+ IFrameSplitOperator.FormatValueString(showData.Amount,2) +'元</span></td></tr>\\\\n' +\\r\\n            '            <tr><td><strong>阴线: </strong><span>'+ showData.KLine.Up +'</span></td>' +\\r\\n            '               <td><strong>阳线: </strong><span>'+ showData.KLine.Down +'</span></td>' +\\r\\n            '               <td><strong>平线: </strong><span>'+ showData.KLine.Unchanged +'</span></td></tr>\\\\n' +\\r\\n            '        </table>';\\r\\n\\r\\n        $(\\\".parameter-content\\\").html(div);\\r\\n        this.BindEvent();\\r\\n    }\\r\\n\\r\\n    this.BindEvent = function () {\\r\\n        var _self = this;\\r\\n        if(_self.SelectData.Start > 0){\\r\\n            $(\\\".jchart-select-date .start-date-left\\\").click(function () {\\r\\n                _self.SelectData.Start--;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n        }\\r\\n        if(_self.SelectData.Start < _self.SelectData.End){\\r\\n            $(\\\".jchart-select-date .start-date-right\\\").click(function () {\\r\\n                _self.SelectData.Start++;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n            $(\\\".jchart-select-date .end-date-left\\\").click(function () {\\r\\n                _self.SelectData.End--;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n        }\\r\\n        if(_self.SelectData.End < _self.SelectData.Data.Data.length - 1){\\r\\n            $(\\\".jchart-select-date .end-date-right\\\").click(function () {\\r\\n                _self.SelectData.End++;\\r\\n                _self.BindData();\\r\\n                _self.HQChart.UpdateSelectRect(_self.SelectData.Start,_self.SelectData.End);\\r\\n            })\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //显示\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        if (this.ID==null) this.Create();   //第1次 需要创建div\\r\\n        this.SelectData=event.data.SelectData;\\r\\n        this.RectSelectPaint=event.data.RectSelectPaint;\\r\\n        this.HQChart=chart;\\r\\n        this.HQChart.HideSelectRect();\\r\\n        this.BindData();\\r\\n\\r\\n        this.Show();      //通过CSS居中显示\\r\\n    }\\r\\n\\r\\n    //形态匹配\\r\\n    this.KLineMatch=function(data)\\r\\n    {\\r\\n        var waitDialog=new WaitDialog(this.DivElement);\\r\\n        waitDialog.DoModal(\\r\\n            {\\r\\n                data:\\r\\n                    {\\r\\n                        Title:'计算中......',\\r\\n                        Chart:this.HQChart\\r\\n                    }\\r\\n            });\\r\\n\\r\\n        this.Close();   //关闭窗口\\r\\n\\r\\n        var hqChart=this.HQChart;\\r\\n        var param= { Scope: { Plate:[\\\"CNA.ci\\\"],Minsimilar:0.90 }, WaitDialog:waitDialog }  //沪深A股, 相似度>=90%\\r\\n        hqChart.RequestKLineMatch(this.SelectData, param);\\r\\n    }\\r\\n}\\r\\n\\r\\n//形态选股\\r\\nfunction KLineMatchDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.MatchData;     //匹配的股票数据\\r\\n    this.Sample;        //样本数据\\r\\n    this.Dialog;\\r\\n    this.HQChart;\\r\\n\\r\\n    this.PageData; //分页数据\\r\\n\\r\\n    //隐藏窗口\\r\\n    this.Close=function()\\r\\n    {\\r\\n        this.DivElement.removeChild(this.Dialog);\\r\\n    }\\r\\n\\r\\n    //创建\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-kline-match-box';\\r\\n        div.id=this.ID;\\r\\n        div.innerHTML=\\r\\n            `<div class='parameter jchart-kline-match-box'>\\r\\n            <div class='parameter-header'>\\r\\n                <span>形态匹配</span>\\r\\n                <strong id='close' class='icon iconfont icon-close'></strong>\\r\\n            </div>\\r\\n            <div class='parameter-content'>\\r\\n                <p class='dataCount'></p>\\r\\n                <table class='matchTable'>\\r\\n                    <thead>\\r\\n                        <tr>\\r\\n                            <td>股票名称</td>\\r\\n                            <td>匹配度</td>\\r\\n                            <td>时间段</td>\\r\\n                        </tr>\\r\\n                    </thead>\\r\\n                    <tbody>\\r\\n                    </tbody>\\r\\n                </table>\\r\\n                <div class='pagination' data-current='1'></div>\\r\\n            </div>\\r\\n            <div class='parameter-footer'>\\r\\n                <button id='close' class='submit' >确定</button>\\r\\n            </div>\\r\\n        </div>`.trim();\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n        this.Dialog=div;\\r\\n\\r\\n        //关闭按钮\\r\\n        $(\\\"#\\\"+this.ID+\\\" #close\\\").click(\\r\\n            {\\r\\n                divBox:this,\\r\\n            },\\r\\n            function(event)\\r\\n            {\\r\\n                event.data.divBox.Close();\\r\\n            });\\r\\n    }\\r\\n\\r\\n    this.BindData=function()\\r\\n    {\\r\\n        JSConsole.Chart.Log(`[KLineMatchDialog::BindData] 形态源: ${this.Sample.Stock.Name} 区间:${this.Sample.Date.Start} - ${this.Sample.Date.End}`);\\r\\n        var count = this.MatchData.length + 1;\\r\\n        var pageData = {NewData:{},MetaData:[],PageCount:0,Count:count};\\r\\n        var pageCount = 0;\\r\\n        var paginationHtml = '';\\r\\n\\r\\n        $('#'+this.ID+' .dataCount').html('个数：'+count);\\r\\n\\r\\n        for(let i = 0; i < count ; i++){\\r\\n            var dataObj = {};\\r\\n            if(i == 0){\\r\\n                dataObj = {\\r\\n                    Symbol:this.Sample.Stock.Symbol,\\r\\n                    Name:this.Sample.Stock.Name,\\r\\n                    Rate:'形态源',\\r\\n                    Color:'red',\\r\\n                    Date:`${this.Sample.Date.Start}-${this.Sample.Date.End}`\\r\\n                };\\r\\n            }else{\\r\\n                let dataItem = this.MatchData[i - 1];\\r\\n                dataObj = {\\r\\n                    Symbol:dataItem.Symbol,\\r\\n                    Name:dataItem.Name,\\r\\n                    Rate:Number(dataItem.Similar * 100).toFixed(2),\\r\\n                    Color:'',\\r\\n                    Date:`${dataItem.Start}-${dataItem.End}`\\r\\n                };\\r\\n            }\\r\\n            pageData.MetaData.push(dataObj);\\r\\n        }\\r\\n\\r\\n        if(pageData.Count % 10 == 0){\\r\\n            pageCount = pageData.Count / 10;\\r\\n        }else{\\r\\n            pageCount = Math.floor(pageData.Count / 10) + 1;\\r\\n        }\\r\\n        pageData.PageCount = pageCount;\\r\\n\\r\\n        this.PaginationMetaData(pageData);\\r\\n        this.PageData = pageData;\\r\\n        JSConsole.Chart.Log('[KLineMatchDialog::DoModal pageData]',pageData);\\r\\n\\r\\n        this.RenderDom(1);\\r\\n\\r\\n        this.PaginationInit('#'+this.ID,pageData.PageCount,this.paginationCallback);\\r\\n        // $('#' + this.ID + ' .pagination').html(paginationHtml);\\r\\n\\r\\n\\r\\n    }\\r\\n    this.RenderDom = function(page){\\r\\n        let currentPageData = this.PageData.NewData[page];\\r\\n        JSConsole.Chart.Log('[KLineMatchDialog::RenderDom currentPageData]',currentPageData);\\r\\n        let bodyHtml = '';\\r\\n        for(let i = 0; i < currentPageData.length; i++){\\r\\n            bodyHtml += `<tr>\\r\\n                        <td class=${currentPageData[i].Color}>${currentPageData[i].Name}</td>\\r\\n                        <td class=${currentPageData[i].Color}>${currentPageData[i].Rate}</td>\\r\\n                        <td class=${currentPageData[i].Color}>${currentPageData[i].Date}</td>\\r\\n                    </tr>`.trim();\\r\\n        }\\r\\n\\r\\n        $('#'+this.ID + ' .matchTable tbody').html(bodyHtml)\\r\\n    }\\r\\n    var _this = this;\\r\\n    this.paginationCallback = function(page) {\\r\\n        _this.RenderDom(page);\\r\\n        _this.PaginationInit('#'+_this.ID,_this.PageData.PageCount,_this.paginationCallback); //更新UI\\r\\n    }\\r\\n    this.PaginationInit = function(id, maxPageNum, callback) {  //初始化分页\\r\\n        var spanStr = \\\"\\\";\\r\\n        var currentPageNum = $(id + \\\" .pagination\\\").data(\\\"current\\\");\\r\\n        var lastPageNum = 0;\\r\\n        var showCountPage = 5; //只显示5个数字项\\r\\n\\r\\n        if (currentPageNum < showCountPage) {  //当前页小于预显示页数\\r\\n            if (maxPageNum >= showCountPage) {\\r\\n                for (var j = 0; j < showCountPage; j++) {  //上 1 2 3 4 5 下\\r\\n                    spanStr += (j + 1) != currentPageNum ? \\\"<span>\\\" + (j + 1) + \\\"</span>\\\" : \\\"<span class='active'>\\\" + (j + 1) + \\\"</span>\\\";\\r\\n                }\\r\\n            } else {\\r\\n                for (var j = 0; j < maxPageNum; j++) {  //上 1 2 3 4 5 下\\r\\n                    spanStr += (j + 1) != currentPageNum ? \\\"<span>\\\" + (j + 1) + \\\"</span>\\\" : \\\"<span class='active'>\\\" + (j + 1) + \\\"</span>\\\";\\r\\n                }\\r\\n            }\\r\\n        } else { //大于5时，最终页数是当前页数加1\\r\\n            lastPageNum = (currentPageNum + 1) > maxPageNum ? currentPageNum : (currentPageNum + 1);\\r\\n\\r\\n            for (var i = currentPageNum - 3; i <= lastPageNum; i++) { //含最终项之前的五项\\r\\n                spanStr += i != currentPageNum ? \\\"<span>\\\" + i + \\\"</span>\\\" : \\\"<span class='active'>\\\" + i + \\\"</span>\\\";\\r\\n            }\\r\\n        }\\r\\n\\r\\n        spanStr = \\\"<span class='beforePage'>上一页</span>\\\" + spanStr + \\\"<span class='nextPage'>下一页</span>\\\";\\r\\n        $(id + \\\" .pagination\\\").html(spanStr);\\r\\n        $(id + \\\" .pagination span\\\").bind('click', { \\\"maxpage\\\": maxPageNum, \\\"Callback\\\": callback }, this.PaginationCurrentIndex);\\r\\n        // return spanStr;\\r\\n    }\\r\\n\\r\\n    this.PaginationCurrentIndex = function(event) {  //分页切换\\r\\n        var text = $(this).text();\\r\\n        JSConsole.Chart.Log('[::PaginationCurrentIndex text]',text);\\r\\n        var currentPageNum = Number($(this).parent().data(\\\"current\\\"));\\r\\n        var maxPageNum = event.data.maxpage;\\r\\n        var callback = event.data.Callback;\\r\\n        var flag = 1;\\r\\n        if (text === \\\"上一页\\\") {\\r\\n            flag = currentPageNum === 1 ? currentPageNum : currentPageNum - 1;\\r\\n        } else if (text === \\\"下一页\\\") {\\r\\n            flag = currentPageNum === maxPageNum ? currentPageNum : currentPageNum + 1;\\r\\n        } else {\\r\\n            flag = Number(text);\\r\\n        }\\r\\n        $(this).parent().data(\\\"current\\\", flag);  //将当前页存到dom上\\r\\n        callback(flag);\\r\\n    }\\r\\n\\r\\n    this.PaginationMetaData = function(data){ //假分页数据,每页10条数据\\r\\n        // data = {NewData:{},MetaData:[],PageCount:0,Callback:null};\\r\\n        var newData = {};\\r\\n        var metaData = data.MetaData;\\r\\n        var pageCount = data.PageCount;\\r\\n\\r\\n        for(let i = 0; i < pageCount; i++){\\r\\n            var itemArr = [];\\r\\n            for(let j = 0; j < 10; j++){\\r\\n                var itemIndex = 10*i + j;\\r\\n                if(itemIndex <= metaData.length - 1){\\r\\n                    var item = metaData[itemIndex];\\r\\n                    itemArr.push(item);\\r\\n                }else {\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n            newData[i+1] = itemArr;\\r\\n        }\\r\\n        data.NewData = newData;\\r\\n    }\\r\\n\\r\\n    //显示\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        if (this.ID==null) this.Create();   //第1次 需要创建div\\r\\n        this.MatchData=event.data.MatchData;\\r\\n        this.Sample=event.data.Sample;\\r\\n        this.HQChart=chart;\\r\\n\\r\\n        this.BindData();\\r\\n\\r\\n\\r\\n        //居中显示\\r\\n        var border=chart.Frame.ChartBorder;\\r\\n        var scrollPos=GetScrollPosition();\\r\\n        var left=border.GetWidth()/2;\\r\\n        var top=border.GetHeight()/2;\\r\\n\\r\\n        this.Show(left,top,200,200);      //显示\\r\\n    }\\r\\n}\\r\\n\\r\\n//等待动画窗口\\r\\nfunction WaitDialog(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Title='加载中......';\\r\\n    this.Dialog;\\r\\n\\r\\n    //隐藏窗口\\r\\n    this.Close=function()\\r\\n    {\\r\\n        if (this.Dialog)\\r\\n        {\\r\\n            this.DivElement.removeChild(this.Dialog);\\r\\n            this.Dialog=null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.SetTitle=function(title)\\r\\n    {\\r\\n        this.Title=title;\\r\\n        if (!this.Dialog) return;\\r\\n        //TODO: 更新标题数据\\r\\n    }\\r\\n\\r\\n    this.Create=function()\\r\\n    {\\r\\n        this.ID=Guid();\\r\\n        var div=document.createElement('div');\\r\\n        div.className='jchart-wait-box';\\r\\n        div.id=this.ID;\\r\\n        div.innerHTML=\\r\\n            `<div class='parameter jchart-kline-match-box'>\\r\\n            <div class='parameter-header'>\\r\\n                <span>${this.Title}</span>\\r\\n            </div>\\r\\n        </div>`.trim();\\r\\n\\r\\n        this.DivElement.appendChild(div);\\r\\n        this.Dialog=div;\\r\\n    }\\r\\n\\r\\n    //显示\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        this.Title=event.data.Title;\\r\\n        var chart=event.data.Chart;\\r\\n        if (this.ID==null) this.Create();   //第1次 需要创建div\\r\\n\\r\\n        //居中显示\\r\\n        var border=chart.Frame.ChartBorder;\\r\\n        var scrollPos=GetScrollPosition();\\r\\n        var left=border.GetWidth()/2;\\r\\n        var top=border.GetHeight()/2;\\r\\n\\r\\n        this.Show(left,top,200,40);      //显示\\r\\n    }\\r\\n}\\r\\n\\r\\n//K线右键菜单类\\r\\n//id:\\\"kline\\\"\\r\\nfunction KLineRightMenu(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.option={};\\r\\n\\r\\n    this.Create = function () {\\r\\n        var _self = this;\\r\\n\\r\\n        this.ID=Guid();\\r\\n\\r\\n        _self.BindData();\\r\\n        _self.BindEvent();\\r\\n    }\\r\\n    this.BindData=function(){\\r\\n        var _self = this;\\r\\n\\r\\n        var id=this.DivElement.id;\\r\\n        var $body = $(\\\"#\\\" + id);\\r\\n\\r\\n        $body.find(\\\"div[id^='topMenu_']\\\").remove();\\r\\n        $body.find(\\\"div[id^='childMenu_']\\\").remove();\\r\\n\\r\\n        var $topMenu = $(\\\"<div />\\\");\\r\\n        $topMenu.attr(\\\"id\\\", \\\"topMenu_\\\"+_self.ID).addClass(\\\"context-menu-wrapper topmenu\\\").hide();\\r\\n        $body.append($topMenu);\\r\\n\\r\\n        var $topTable = $(\\\"<table />\\\");\\r\\n        $topTable.attr({ id: \\\"topTable_\\\" + _self.ID, cellspacing: \\\"0\\\", cellpadding: \\\"0\\\" }).addClass(\\\"context-menu\\\");\\r\\n        $topMenu.append($topTable);\\r\\n\\r\\n        $topTable.append(_self.childrenList(_self.option.data));\\r\\n\\r\\n        for (var i = 0; i < _self.option.data.length; i++) {\\r\\n            var isHasChildren = typeof _self.option.data[i].children != \\\"undefined\\\";\\r\\n\\r\\n            if (isHasChildren) {\\r\\n\\r\\n                var $childMenu = $(\\\"<div />\\\");\\r\\n                $childMenu.attr({ id: \\\"childMenu_\\\"+_self.ID + i, \\\"data-index\\\": i }).addClass(\\\"context-menu-wrapper\\\").hide();\\r\\n                $body.append($childMenu);\\r\\n\\r\\n                var $childTable = $(\\\"<table />\\\");\\r\\n                $childTable.attr({ id: \\\"childTable_\\\" + _self.ID + i, cellspacing: \\\"0\\\", cellpadding: \\\"0\\\" }).addClass(\\\"context-menu\\\");\\r\\n                $childMenu.append($childTable);\\r\\n\\r\\n                $childTable.append(_self.childrenList(_self.option.data[i].children));\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Update=function()\\r\\n    {\\r\\n        var _self = this;\\r\\n        //var id=this.DivElement.id;\\r\\n        //var $body=$(\\\"#\\\"+id);\\r\\n        //\\r\\n        //var $topTable = $(\\\"#topTable_\\\" + _self.ID);\\r\\n        //$topTable.empty();\\r\\n        //$topTable.append(_self.childrenList(_self.option.data));\\r\\n        //\\r\\n        //for (var i = 0; i < _self.option.data.length; i++) {\\r\\n        //    var isHasChildren = typeof _self.option.data[i].children != \\\"undefined\\\";\\r\\n        //\\r\\n        //    if (isHasChildren) {\\r\\n        //        var $childTable = $(\\\"#childTable_\\\" + _self.ID + i);\\r\\n        //        $childTable.empty();\\r\\n        //        $childTable.append(_self.childrenList(_self.option.data[i].children));\\r\\n        //    }\\r\\n        //}\\r\\n\\r\\n        _self.BindData();\\r\\n        _self.BindEvent();\\r\\n    }\\r\\n\\r\\n    this.childrenList = function(list) {\\r\\n        var result = [];\\r\\n\\r\\n        for (var i = 0; i < list.length; i++) {\\r\\n            var isBorder = typeof list[i].isBorder != \\\"undefined\\\" && list[i].isBorder;\\r\\n\\r\\n            var $tr = $(\\\"<tr />\\\");\\r\\n            $tr.addClass(\\\"font_Arial context-menu\\\");\\r\\n            if (isBorder)\\r\\n                $tr.addClass(\\\"border\\\");\\r\\n\\r\\n            var $td1 = $(\\\"<td />\\\");\\r\\n            if(list[i].selected){\\r\\n                $td1.addClass(\\\"spacer context-menu\\\").html(\\\"√\\\");\\r\\n            }else{\\r\\n                $td1.addClass(\\\"spacer context-menu\\\");\\r\\n            }\\r\\n\\r\\n            var $td2 = $(\\\"<td />\\\");\\r\\n            $td2.addClass(\\\"text\\\").html(list[i].text);\\r\\n\\r\\n            var $td3 = $(\\\"<td />\\\");\\r\\n            $td3.addClass(\\\"right shortcut\\\");\\r\\n\\r\\n            var $td4 = $(\\\"<td />\\\");\\r\\n            $td4.addClass(typeof list[i].children != \\\"undefined\\\" ? \\\"submenu-arrow\\\" : \\\"context-menu spacer\\\");\\r\\n\\r\\n            $tr.append($td1).append($td2).append($td3).append($td4);\\r\\n\\r\\n            result.push($tr);\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.Show=function (obj) {\\r\\n        var _self = this;\\r\\n        $.extend(_self.option, obj);\\r\\n\\r\\n        if (!_self.ID) _self.Create();  //判断是否重复创建\\r\\n        else _self.Update();            //更新菜单状态\\r\\n\\r\\n        var $topMenu = $(\\\"#topMenu_\\\"+_self.ID),\\r\\n            topWidth = $topMenu.outerWidth(),\\r\\n            topHeight = $topMenu.outerHeight();\\r\\n\\r\\n        var x = _self.option.x,\\r\\n            y = _self.option.y;\\r\\n\\r\\n        if (topWidth > _self.option.position.X + _self.option.position.W- x) //超过了右边距\\r\\n            x = x - topWidth;\\r\\n\\r\\n        if (topHeight > _self.option.position.Y +_self.option.position.H - y)//超过了下边距\\r\\n            y = y - topHeight;\\r\\n\\r\\n        $topMenu.hide();\\r\\n        $topMenu.css({ position:\\\"absolute\\\",left: x + \\\"px\\\", top: y + \\\"px\\\" }).show();\\r\\n\\r\\n        this.isInit = true;\\r\\n    }\\r\\n\\r\\n    this.Hide=function () {\\r\\n        var _self = this;\\r\\n        if (typeof($)==\\\"undefined\\\") return;\\r\\n        $(\\\"#topMenu_\\\" + _self.ID).hide();\\r\\n        $(\\\"[id^='childMenu_\\\" + _self.ID + \\\"']\\\").hide();\\r\\n    }\\r\\n\\r\\n    this.BindEvent=function () {\\r\\n        var _self = this;\\r\\n        var $childMenu = $(\\\"[id^='childMenu_\\\" + _self.ID + \\\"']\\\");\\r\\n\\r\\n        $(\\\"#topTable_\\\" + _self.ID).find(\\\"tr\\\").mouseenter(function () {\\r\\n            var $this = $(this),\\r\\n                index = $this.index(),\\r\\n                $topMenu = $(\\\"#topMenu_\\\" + _self.ID),\\r\\n                $child = $(\\\"#childMenu_\\\" + _self.ID + index),\\r\\n                trWidth = $this.outerWidth(),\\r\\n                trHeight = $this.outerHeight();\\r\\n\\r\\n            var left = $topMenu.position().left + trWidth + 1;\\r\\n            var top = $topMenu.position().top + (trHeight * index);\\r\\n\\r\\n            if (trWidth > _self.option.position.X + _self.option.position.W - left) //超过了右边距\\r\\n                left = left - trWidth - $topMenu.outerWidth() - 2;\\r\\n\\r\\n            if ($child.outerHeight() > _self.option.position.Y +_self.option.position.H - top)//超过了下边距\\r\\n                top = $topMenu.position().top + $topMenu.outerHeight() - $child.outerHeight();\\r\\n\\r\\n            $childMenu.hide();\\r\\n            $child.css({ left: left + \\\"px\\\", top: top + \\\"px\\\" }).show();\\r\\n        }).mouseleave(function () {\\r\\n            var index = $(this).index();\\r\\n            setTimeout(function () {\\r\\n                if ($(\\\"#childMenu_\\\" + _self.ID + index).attr(\\\"data-isShow\\\") != 1) {\\r\\n                    $(\\\"#childMenu_\\\" + _self.ID + index).hide();\\r\\n                }\\r\\n            }, 10)\\r\\n\\r\\n        }).click(function () {\\r\\n            var $this = $(this);\\r\\n            var index = $this.index();\\r\\n\\r\\n            if ($.type(_self.option.data[index].click) == \\\"function\\\") {\\r\\n                _self.option.data[index].click(_self.option.returnData);\\r\\n                $this.hide();\\r\\n            }\\r\\n        }).contextmenu(function()\\r\\n        {\\r\\n            return false;   //屏蔽系统右键菜单\\r\\n        });\\r\\n\\r\\n\\r\\n        $childMenu.mouseenter(function () {\\r\\n            $(this).attr(\\\"data-isShow\\\", \\\"1\\\");\\r\\n        }).mouseleave(function () {\\r\\n            $(this).attr(\\\"data-isShow\\\", \\\"0\\\");\\r\\n        }).contextmenu(function()\\r\\n        {\\r\\n            return false;   //屏蔽系统右键菜单\\r\\n        });\\r\\n\\r\\n        $childMenu.find(\\\"tr\\\").click(function () {\\r\\n            var $this = $(this);\\r\\n            var divIndex = parseInt($this.closest(\\\"div\\\").attr(\\\"data-index\\\"));\\r\\n            var trIndex = $this.index();\\r\\n\\r\\n            if ($.type(_self.option.data[divIndex].children[trIndex].click) == \\\"function\\\") {\\r\\n                _self.option.data[divIndex].children[trIndex].click(_self.option.windowIndex || 1);\\r\\n                $childMenu.hide();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.GetPeriod=function (chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"日线\\\", Value:0,\\r\\n                    click: function () { chart.ChangePeriod(0); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"周线\\\",Value:1,\\r\\n                    click: function () { chart.ChangePeriod(1); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"双周线\\\",Value:21,\\r\\n                    click: function () { chart.ChangePeriod(21); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"月线\\\",Value:2,\\r\\n                    click: function () { chart.ChangePeriod(2); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"季线\\\",Value:9,\\r\\n                    click: function () { chart.ChangePeriod(9); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"半年\\\",Value:22,\\r\\n                    click: function () { chart.ChangePeriod(22); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"年线\\\",Value:3,\\r\\n                    click: function () { chart.ChangePeriod(3); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"1分\\\",Value:4,\\r\\n                    click: function () { chart.ChangePeriod(4); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"5分\\\",Value:5,\\r\\n                    click: function () { chart.ChangePeriod(5); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"15分\\\",Value:6,\\r\\n                    click: function () { chart.ChangePeriod(6); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"30分\\\",Value:7,\\r\\n                    click: function () { chart.ChangePeriod(7); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"60分\\\",Value:8,\\r\\n                    click: function () { chart.ChangePeriod(8); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"2小时\\\",Value:11,\\r\\n                    click: function () { chart.ChangePeriod(11); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"4小时\\\",Value:12,\\r\\n                    click: function () { chart.ChangePeriod(12); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"分笔\\\",Value:10,\\r\\n                    click: function () { chart.ChangePeriod(10); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"自定义周期:3分钟\\\",Value:20003,\\r\\n                    click: function () { chart.ChangePeriod(20003); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"自定义周期:35分钟\\\",Value:20035,\\r\\n                    click: function () { chart.ChangePeriod(20035); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"自定义周期:8日\\\",Value:40008,\\r\\n                    click: function () { chart.ChangePeriod(40008); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (item.Value==chart.Period)\\r\\n            {\\r\\n                item.selected=true;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetRight=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"不复权\\\",\\r\\n                    click: function () { chart.ChangeRight(0); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"前复权\\\",\\r\\n                    click: function () { chart.ChangeRight(1); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"后复权\\\",\\r\\n                    click: function () { chart.ChangeRight(2); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        if (chart.Right>=0 && chart.Right<data.length) data[chart.Right].selected=true;\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //指标\\r\\n    this.GetIndex=function (chart)\\r\\n    {\\r\\n        return [{\\r\\n            text: \\\"均线\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, '均线')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"BOLL\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'BOLL')\\r\\n            },\\r\\n            isBorder:true\\r\\n        }, {\\r\\n            text: \\\"MACD\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'MACD')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"KDJ\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'KDJ')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"VOL\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'VOL')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"RSI\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'RSI')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"BRAR\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'BRAR')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"WR\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'WR')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"BIAS\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'BIAS')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"OBV\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'OBV')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"DMI\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'DMI')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"CR\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'CR')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"PSY\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'PSY')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"CCI\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'CCI')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"DMA\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'DMA')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"TRIX\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'TRIX')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"VR\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'VR')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"EMV\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'EMV')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"ROC\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'ROC')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"MIM\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'MIM')\\r\\n            }\\r\\n        }, {\\r\\n            text: \\\"FSL\\\",\\r\\n            click: function (windowIndex) {\\r\\n                chart.ChangeIndex(windowIndex, 'FSL')\\r\\n            }\\r\\n        } ]\\r\\n    }\\r\\n\\r\\n    //五彩K线\\r\\n    this.GetColorIndex=function (chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"十字星\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-十字星') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"早晨之星\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-早晨之星') },\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"垂死十字\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-垂死十字') },\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"三只乌鸦\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-三只乌鸦') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"光脚阴线\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-光脚阴线') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"黄昏之星\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-黄昏之星') }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        if (chart.ColorIndex)\\r\\n        {\\r\\n            data[data.length-1].isBorder=true;\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"删除五彩K线\\\",\\r\\n                    click: function (windowIndex) { chart.CancelInstructionIndex() }\\r\\n                });\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //专家系统\\r\\n    this.GetTradeIndex=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"BIAS\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-BIAS') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"CCI\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-CCI') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"DMI\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-DMI') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"KD\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-KD') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"BOLL\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-BOLL') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"KDJ\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-KDJ') }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        if (chart.TradeIndex)\\r\\n        {\\r\\n            data[data.length-1].isBorder=true;\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"删除专家系统\\\",\\r\\n                    click: function (windowIndex) { chart.CancelInstructionIndex()}\\r\\n                });\\r\\n        }\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //叠加\\r\\n    this.GetOverlay=function (chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"上证指数\\\",\\r\\n                    click: function () { chart.OverlaySymbol('000001.sh'); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"深证成指\\\",\\r\\n                    click: function () { chart.OverlaySymbol('399001.sz'); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"中小板指\\\",\\r\\n                    click: function () { chart.OverlaySymbol('399005.sz'); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"创业板指\\\",\\r\\n                    click: function () { chart.OverlaySymbol('399006.sz'); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"沪深300\\\",\\r\\n                    click: function () { chart.OverlaySymbol('000300.sh'); },\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        for(var i in chart.OverlayChartPaint)\\r\\n        {\\r\\n            var item=chart.OverlayChartPaint[i];\\r\\n            var symbol=item.Symbol;\\r\\n            const mapSymbol=new Map([['000001.sh',0],['399001.sz',1],['399005.sz',2],['399006.sz',3],['000300.sh',4]]);\\r\\n            if (mapSymbol.has(symbol))\\r\\n            {\\r\\n                var menuItem=data[mapSymbol.get(symbol)];\\r\\n                let delSymbol=symbol;\\r\\n                menuItem.selected=true;\\r\\n                menuItem.click=function () { chart.DeleteOverlaySymbol(delSymbol); };\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (chart.OverlayChartPaint && chart.OverlayChartPaint.length>0)\\r\\n        {\\r\\n            data[data.length-1].isBorder=true;\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"取消叠加\\\",\\r\\n                    click: function () { chart.ClearOverlaySymbol();}\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //K线类型设置\\r\\n    this.GetKLineType=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"K线(空心阳线)\\\",\\r\\n                    click: function () { chart.ChangeKLineDrawType(3);}\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"K线(实心阳线)\\\",\\r\\n                    click: function () { chart.ChangeKLineDrawType(0); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"美国线\\\",\\r\\n                    click: function () { chart.ChangeKLineDrawType(2); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"收盘线\\\",\\r\\n                    click: function () { chart.ChangeKLineDrawType(1); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"收盘面积\\\",\\r\\n                    click: function () { chart.ChangeKLineDrawType(4); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        switch(chart.KLineDrawType)\\r\\n        {\\r\\n            case 0:\\r\\n                data[1].selected=true;\\r\\n                break;\\r\\n            case 1:\\r\\n                data[3].selected=true;\\r\\n                break;\\r\\n            case 2:\\r\\n                data[2].selected=true;\\r\\n                break;\\r\\n            case 3:\\r\\n                data[0].selected=true;\\r\\n                break;\\r\\n            case 4:\\r\\n                data[4].selected=true;\\r\\n                break;\\r\\n        }\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //指标窗口个数\\r\\n    this.GetIndexWindowCount=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"1个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(1); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"2个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(2); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"3个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(3); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"4个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(4); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"5个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(5); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        var count=chart.Frame.SubFrame.length;\\r\\n        if ((count-1)>=0 && (count-1)<data.length) data[count-1].selected=true;  //选中\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //坐标类型\\r\\n    this.GetCoordinateType=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"普通坐标\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( {Type:0} ); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"百分比坐标\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( {Type:1} ); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"反转坐标\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( { IsReverse:true } ); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"对数坐标\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( {Type:2} ); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"等比坐标\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( {Type:3} ); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"等分坐标\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( {Type:4} ); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"黄金分割\\\",\\r\\n                    click: function () { chart.ChangeCoordinateType( {Type:5} ); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        if (chart.Frame && chart.Frame.SubFrame && chart.Frame.SubFrame.length>0)\\r\\n        {\\r\\n            if (chart.Frame.SubFrame[0].Frame.CoordinateType==1)\\r\\n            {\\r\\n                data[2].selected=true;\\r\\n                data[2].click=function() { chart.ChangeCoordinateType( { IsReverse:false } ); } //取消反转\\r\\n            }\\r\\n\\r\\n            if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==1) data[1].selected=true;  //百分比\\r\\n            else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==0) data[0].selected=true; //普通坐标\\r\\n            else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==2) data[3].selected=true; //对数\\r\\n            else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==3) data[4].selected=true; //等比坐标\\r\\n            else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==4) data[5].selected=true; //等分坐标\\r\\n            else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==5) data[6].selected=true; //黄金分割\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //拖拽模式\\r\\n    this.GetDragModeType=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"禁止拖拽\\\",\\r\\n                    click: function () { chart.DragMode=0; }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"启动拖拽\\\",\\r\\n                    click: function () { chart.DragMode=1; }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"区间选择\\\",\\r\\n                    click: function () { chart.DragMode=2; }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        if (chart.DragMode>=0 && chart.DragMode<data.length) data[chart.DragMode].selected=true;  //选中\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //工具\\r\\n    this.GetTools=function(chart)\\r\\n    {\\r\\n        var data=[];\\r\\n        var drawTools=chart.GetExtendChartByClassName('DrawToolsButton');\\r\\n        if (drawTools)\\r\\n        {\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"关闭画图工具\\\",\\r\\n                    click: function ()\\r\\n                    {\\r\\n                        var toolsWidth=drawTools.Chart.Width;\\r\\n                        var toolsIndex=parseInt(drawTools.Index);\\r\\n                        for(var i=toolsIndex+1; i<chart.ExtendChartPaint.length; ++i)   //在画图工具后面创建的需要减去工具的宽度\\r\\n                        {\\r\\n                            var item=chart.ExtendChartPaint[i];\\r\\n                            if (item.ClassName=='StockChip')\\r\\n                            {\\r\\n                                item.Left-=toolsWidth;\\r\\n                            }\\r\\n                        }\\r\\n                        chart.DeleteExtendChart(drawTools);\\r\\n                        chart.Frame.ChartBorder.Right-=toolsWidth;\\r\\n                        chart.SetSizeChange(true);\\r\\n                        chart.Draw();\\r\\n                    }\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"画图工具\\\",\\r\\n                    click: function () {\\r\\n                        var option={Name:'画图工具', Top:chart.Frame.ChartBorder.Top };\\r\\n                        var extendChart=chart.CreateExtendChart(option.Name, option);   //创建扩展图形\\r\\n                        chart.SetSizeChange(true);\\r\\n                        chart.Draw();\\r\\n                    }\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n\\r\\n        var StockChip=chart.GetExtendChartByClassName('StockChip');\\r\\n        if (StockChip)\\r\\n        {\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"关闭移动筹码\\\",\\r\\n                    click: function ()\\r\\n                    {\\r\\n                        var chipWidth=StockChip.Chart.Width;\\r\\n                        var chipIndex=parseInt(StockChip.Index);\\r\\n                        for(var i=chipIndex+1; i<chart.ExtendChartPaint.length; ++i)   //在筹码后面创建的需要筹码的宽度\\r\\n                        {\\r\\n                            var item=chart.ExtendChartPaint[i];\\r\\n                            if (item.ClassName=='DrawToolsButton')\\r\\n                            {\\r\\n                                item.Left-=chipWidth;\\r\\n                            }\\r\\n                        }\\r\\n                        chart.DeleteExtendChart(StockChip);\\r\\n                        chart.Frame.ChartBorder.Right-=chipWidth;\\r\\n                        chart.SetSizeChange(true);\\r\\n                        chart.Draw();\\r\\n                    }\\r\\n\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"移动筹码\\\",\\r\\n                    click: function () {\\r\\n                        var option={Name:'筹码分布', ShowType:1, Width:230 };\\r\\n                        var extendChart=chart.CreateExtendChart(option.Name, option);   //创建扩展图形\\r\\n                        chart.SetSizeChange(true);\\r\\n                        chart.Draw();\\r\\n                    }\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetKLineInfo=function(chart)\\r\\n    {\\r\\n        var setInfo=new Set();\\r\\n        for(var i in chart.ChartInfo)\\r\\n        {\\r\\n            var item=chart.ChartInfo[i];\\r\\n            setInfo.add(item.ClassName);\\r\\n        }\\r\\n\\r\\n        var aryKLineInfo=[\\\"公告\\\",\\\"业绩预告\\\",\\\"调研\\\",\\\"大宗交易\\\",\\\"龙虎榜\\\",\\\"互动易\\\"]\\r\\n\\r\\n        var data=[];\\r\\n        for(var i in aryKLineInfo)\\r\\n        {\\r\\n            var infoName=aryKLineInfo[i];\\r\\n            var classInfo=JSKLineInfoMap.GetClassInfo(infoName);\\r\\n            if (!classInfo) continue;\\r\\n\\r\\n            var item=this.CreateKlineInfoItem(infoName, setInfo.has(classInfo.ClassName), chart);\\r\\n            data.push(item);\\r\\n        }\\r\\n\\r\\n        if (chart.ChartInfo.length>0)\\r\\n        {\\r\\n            data[data.length-1].isBorder=true;\\r\\n            var item={ text:'删除所有', click:function() { chart.ClearKLineInfo()} };\\r\\n            data.push(item);\\r\\n\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.CreateKlineInfoItem=function(infoName,bExist,chart)\\r\\n    {\\r\\n        var item=\\r\\n            {\\r\\n                text:infoName,\\r\\n                selected:bExist\\r\\n            }\\r\\n\\r\\n        if (bExist) item.click=function() { chart.DeleteKLineInfo(infoName) };\\r\\n        else  item.click=function() { chart.AddKLineInfo(infoName,true) }\\r\\n\\r\\n        return item;\\r\\n    }\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var rightMenu=chart.RightMenu;\\r\\n        var x = event.offsetX;\\r\\n        var y = event.offsetY;\\r\\n\\r\\n        var dataList=[{\\r\\n            text: \\\"分析周期\\\",\\r\\n            children: this.GetPeriod(chart)\\r\\n        },\\r\\n            {\\r\\n                text: \\\"复权处理\\\",\\r\\n                children: this.GetRight(chart)\\r\\n            },\\r\\n            {\\r\\n                text: \\\"指标切换\\\",\\r\\n                children: this.GetIndex(chart)\\r\\n            },\\r\\n            {\\r\\n                text:\\\"五彩K线\\\",\\r\\n                children: this.GetColorIndex(chart)\\r\\n            },\\r\\n            {\\r\\n                text:'专家系统',\\r\\n                children: this.GetTradeIndex(chart)\\r\\n            },\\r\\n            {\\r\\n                text:'信息地雷',\\r\\n                children: this.GetKLineInfo(chart)\\r\\n            },\\r\\n            {\\r\\n                text: \\\"叠加品种\\\",\\r\\n                children: this.GetOverlay(chart)\\r\\n            },\\r\\n            {\\r\\n                text:'主图线型',\\r\\n                children: this.GetKLineType(chart)\\r\\n            },\\r\\n            {\\r\\n                text:\\\"坐标类型\\\",\\r\\n                children:this.GetCoordinateType(chart)\\r\\n            },\\r\\n            {\\r\\n                text:'指标窗口个数',\\r\\n                children: this.GetIndexWindowCount(chart)\\r\\n            },\\r\\n            {\\r\\n                text:'鼠标拖拽',\\r\\n                children: this.GetDragModeType(chart)\\r\\n            },\\r\\n            {\\r\\n                text:\\\"工具\\\",\\r\\n                children:this.GetTools(chart)\\r\\n            }\\r\\n        ];\\r\\n\\r\\n        var upperSymbol=chart.Symbol.toUpperCase();\\r\\n        if(MARKET_SUFFIX_NAME.IsSHSZIndex(chart.Symbol) || MARKET_SUFFIX_NAME.IsBIT(upperSymbol))\\r\\n        {\\r\\n            dataList.splice(1,1);\\r\\n        }\\r\\n\\r\\n        var identify=event.data.FrameID;\\r\\n        var overlayIndex=this.GetOverlayIndex(chart,identify);\\r\\n        if (overlayIndex && overlayIndex.length>0)\\r\\n        {\\r\\n            var delOverlayIndexMenu={ text:'删除叠加指标', children:this.GetDeleteOverlayIndex(chart,overlayIndex) }\\r\\n            dataList.splice(3,0,delOverlayIndexMenu);\\r\\n        }\\r\\n\\r\\n        JSConsole.Chart.Log('[KLineRightMenu::DoModal]',identify);\\r\\n        rightMenu.Show({\\r\\n            windowIndex :identify,\\r\\n            x:x+chart.UIElement.offsetLeft,\\r\\n            y:y+chart.UIElement.offsetTop,\\r\\n            position:chart.Frame.Position,\\r\\n            data:dataList\\r\\n        })\\r\\n\\r\\n        $(document).click(function () {\\r\\n            rightMenu.Hide();\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.GetOverlayIndex=function(chart, windowsIndex)\\r\\n    {\\r\\n        if (windowsIndex>=chart.Frame.SubFrame.length || windowsIndex<0) return [];\\r\\n\\r\\n        var result=[];\\r\\n        var item=chart.Frame.SubFrame[windowsIndex];\\r\\n        for(var i in item.OverlayIndex)\\r\\n        {\\r\\n            var overlayItem=item.OverlayIndex[i];\\r\\n            result.push({Name:overlayItem.Script.Name, Identify:overlayItem.Identify});\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetDeleteOverlayIndex=function(chart,overlayIndex)\\r\\n    {\\r\\n        var data=[];\\r\\n        for(var i in overlayIndex)\\r\\n        {\\r\\n            let identify=overlayIndex[i].Identify;\\r\\n            data.push({text:overlayIndex[i].Name, click:function()\\r\\n                {\\r\\n                    chart.DeleteOverlayWindowsIndex(identify)\\r\\n                }});\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n}\\r\\n\\r\\n//K线区间选择右键菜单\\r\\nfunction KLineSelectRightMenu(divElement)\\r\\n{\\r\\n    this.newMethod=KLineRightMenu;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var rightMenu=this;\\r\\n        var x = event.data.X;\\r\\n        var y = event.data.Y;\\r\\n\\r\\n        var dataList=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"区间统计\\\",\\r\\n                    click: function ()\\r\\n                    {\\r\\n                        JSConsole.Chart.Log('[KLineSelectRightMenu::click] 区间统计');\\r\\n                        rightMenu.Hide();\\r\\n                        var dialog=new KLineSelectRectDialog(divElement);\\r\\n                        dialog.DoModal(event);\\r\\n                    }\\r\\n                },\\r\\n                {\\r\\n                    text:'区间放大',\\r\\n                    click:function()\\r\\n                    {\\r\\n                        JSConsole.Chart.Log('[KLineSelectRightMenu::click] 区间放大');\\r\\n                        var chart=event.data.Chart;\\r\\n                        chart.ShowSelectData(event.data.SelectData);\\r\\n                    }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        rightMenu.Show({\\r\\n            x:x,\\r\\n            y:y,\\r\\n            position:chart.Frame.Position,\\r\\n            data:dataList\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.Show=function (obj)\\r\\n    {\\r\\n        var _self = this;\\r\\n        $.extend(_self.option, obj);\\r\\n\\r\\n        //判断是否重复创建\\r\\n        if (!_self.ID) _self.Create();\\r\\n        //判断下如果DOM没了需要重新创建\\r\\n        var divIdName='topMenu_'+_self.ID;\\r\\n        var divDom=document.getElementById(divIdName);\\r\\n        if (!divDom) _self.Create();\\r\\n\\r\\n        var $topMenu = $(\\\"#topMenu_\\\"+_self.ID),\\r\\n            topWidth = $topMenu.outerWidth(),\\r\\n            topHeight = $topMenu.outerHeight();\\r\\n\\r\\n        $topMenu.contextmenu(function()\\r\\n        {\\r\\n            return false;   //屏蔽系统右键菜单\\r\\n        });\\r\\n\\r\\n        var x = _self.option.x,\\r\\n            y = _self.option.y;\\r\\n\\r\\n        if (topWidth > _self.option.position.X + _self.option.position.W- x) //超过了右边距\\r\\n            x = x - topWidth;\\r\\n\\r\\n        if (topHeight > _self.option.position.Y +_self.option.position.H - y)//超过了下边距\\r\\n            y = y - topHeight;\\r\\n\\r\\n        $topMenu.hide();\\r\\n        $topMenu.css({ position:\\\"absolute\\\",left: x + \\\"px\\\", top: y + \\\"px\\\" }).show();\\r\\n\\r\\n        $(\\\"#topMenu_\\\" + _self.ID).find(\\\"tr\\\").show();    //把菜单列表显示\\r\\n\\r\\n        this.isInit = true;\\r\\n    }\\r\\n}\\r\\n\\r\\n//分钟数据右键菜单\\r\\nfunction MinuteRightMenu(divElement)\\r\\n{\\r\\n    this.newMethod=KLineRightMenu;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var chart=event.data.Chart;\\r\\n        var rightMenu=chart.RightMenu;\\r\\n        var x = event.offsetX;\\r\\n        var y = event.offsetY;\\r\\n\\r\\n        var dataList=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"叠加品种\\\",\\r\\n                    children: this.GetOverlay(chart)\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"多日分时图\\\",\\r\\n                    children: this.GetDayCount(chart)\\r\\n                },\\r\\n                {\\r\\n                    text:'指标窗口个数',\\r\\n                    children: this.GetIndexWindowCount(chart)\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"副图指标切换\\\",\\r\\n                    children: this.GetIndex(chart)\\r\\n                },\\r\\n                {\\r\\n                    text:\\\"区间选择\\\",\\r\\n                    children:this.GetSelectRect(chart)\\r\\n                },\\r\\n\\r\\n            ];\\r\\n\\r\\n        var symbol=chart.Symbol;\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZStockA(symbol))\\r\\n        {\\r\\n            dataList.push({text:'集合竞价',children: this.GetShowBeforeData(chart)});\\r\\n        }\\r\\n\\r\\n        dataList.push({text:\\\"工具\\\", children:this.GetTools(chart)});\\r\\n\\r\\n        var identify=event.data.FrameID;\\r\\n        JSConsole.Chart.Log('[MinuteRightMenu::DoModal]',identify);\\r\\n        rightMenu.Show({\\r\\n            windowIndex :identify,\\r\\n            x:x+chart.UIElement.offsetLeft,\\r\\n            y:y+chart.UIElement.offsetTop,\\r\\n            position:chart.Frame.Position,\\r\\n            data:dataList\\r\\n        })\\r\\n\\r\\n        $(document).click(function () {\\r\\n            rightMenu.Hide();\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.GetDayCount=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"当日分时图\\\",\\r\\n                    click: function () { chart.ChangeDayCount(1); },\\r\\n                    isBorder:true\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"最近2日\\\",\\r\\n                    click: function () { chart.ChangeDayCount(2); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"最近3日\\\",\\r\\n                    click: function () { chart.ChangeDayCount(3); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"最近4日\\\",\\r\\n                    click: function () { chart.ChangeDayCount(4); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"最近5日\\\",\\r\\n                    click: function () { chart.ChangeDayCount(5); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"最近6日\\\",\\r\\n                    click: function () { chart.ChangeDayCount(6); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        if ((chart.DayCount-1)>=0 && (chart.DayCount-1)<data.length) data[chart.DayCount-1].selected=true;\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetIndex=function (chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"MACD\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'MACD') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"DMI\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'DMI') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"DMA\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'DMA') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"BRAR\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'BRAR') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"KDJ\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'KDJ') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"RSI\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'RSI') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"WR\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'WR') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"CCI\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'CCI') }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"TRIX\\\",\\r\\n                    click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'TRIX') }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetShowBeforeData=function(chart)  //是否显示集合竞价\\r\\n    {\\r\\n        if (chart.IsShowBeforeData)\\r\\n        {\\r\\n            var data=\\r\\n                [\\r\\n                    {\\r\\n                        text: \\\"隐藏\\\",\\r\\n                        click: function () { chart.ShowCallAuctionData( { Left:false, MultiDay:{ Left:false }} ); },\\r\\n                    }\\r\\n                ];\\r\\n\\r\\n            return data;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var data=\\r\\n                [\\r\\n                    {\\r\\n                        text: \\\"显示\\\",\\r\\n                        click: function () { chart.ShowCallAuctionData({Left:true, MultiDay:{ Left:true }}); },\\r\\n                    }\\r\\n                ];\\r\\n\\r\\n            return data;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetSelectRect=function(chart)  //区间选择\\r\\n    {\\r\\n        if (chart.EnableSelectRect)\\r\\n        {\\r\\n            var data=\\r\\n                [\\r\\n                    {\\r\\n                        text: \\\"禁用区间选择\\\",\\r\\n                        click: function () { chart.EnableSelectRect=false; },\\r\\n                    }\\r\\n                ];\\r\\n\\r\\n            return data;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var data=\\r\\n                [\\r\\n                    {\\r\\n                        text: \\\"启动区间选择\\\",\\r\\n                        click: function () { chart.EnableSelectRect=true },\\r\\n                    }\\r\\n                ];\\r\\n\\r\\n            return data;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //指标窗口个数\\r\\n    this.GetIndexWindowCount=function(chart)\\r\\n    {\\r\\n        var data=\\r\\n            [\\r\\n                {\\r\\n                    text: \\\"1个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(2); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"2个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(3); }\\r\\n                },\\r\\n                {\\r\\n                    text: \\\"3个窗口\\\",\\r\\n                    click: function () { chart.ChangeIndexWindowCount(4); }\\r\\n                }\\r\\n            ];\\r\\n\\r\\n        var count=chart.Frame.SubFrame.length-1;\\r\\n        if ((count-1)>=0 && (count-1)<data.length) data[count-1].selected=true;  //选中\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    //工具\\r\\n    this.GetTools=function(chart)\\r\\n    {\\r\\n        var data=[];\\r\\n        var drawTools=chart.GetExtendChartByClassName('DrawToolsButton');\\r\\n        if (drawTools)\\r\\n        {\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"关闭画图工具\\\",\\r\\n                    click: function ()\\r\\n                    {\\r\\n                        var toolsWidth=drawTools.Chart.Width;\\r\\n                        var toolsIndex=parseInt(drawTools.Index);\\r\\n                        chart.DeleteExtendChart(drawTools);\\r\\n                        chart.Frame.ChartBorder.Right-=toolsWidth;\\r\\n                        chart.SetSizeChange(true);\\r\\n                        chart.Draw();\\r\\n                    }\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            data.push(\\r\\n                {\\r\\n                    text: \\\"画图工具\\\",\\r\\n                    click: function () {\\r\\n                        var option={Name:'画图工具', Top:chart.Frame.ChartBorder.Top };\\r\\n                        var extendChart=chart.CreateExtendChart(option.Name, option);   //创建扩展图形\\r\\n                        chart.SetSizeChange(true);\\r\\n                        chart.Draw();\\r\\n                    }\\r\\n                }\\r\\n            );\\r\\n        }\\r\\n\\r\\n        return data;\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具 单个图形设置\\r\\nfunction ChartPictureSettingMenu(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.HQChart;\\r\\n    this.ChartPicture;\\r\\n    this.SubToolsDiv;\\r\\n    this.SettingMenu;\\r\\n\\r\\n    this.DoModal=function(event)\\r\\n    {\\r\\n        var $body;\\r\\n        if (!this.SubToolsDiv)\\r\\n        {\\r\\n            this.ID=Guid();\\r\\n            var div=document.createElement(\\\"div\\\");\\r\\n            div.className='subTolls';\\r\\n            div.id=this.ID;\\r\\n            this.DivElement.appendChild(div);\\r\\n            //$body = $(\\\".\\\"+event.data.HQChart.ClassName).context.body;\\r\\n            //$body.append(div);\\r\\n            this.SubToolsDiv=div;\\r\\n        }\\r\\n        this.HQChart=event.data.HQChart;\\r\\n        this.ChartPicture=event.data.ChartPicture;\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var frame=this.HQChart.Frame.SubFrame[0].Frame;\\r\\n        // var top=frame.ChartBorder.GetTopTitle();\\r\\n        var top=frame.ChartBorder.Top + 40;\\r\\n        // var right=frame.ChartBorder.GetRight();\\r\\n        var right=frame.ChartBorder.Right;\\r\\n        var left=frame.ChartBorder.GetLeft();\\r\\n        var className = this.ChartPicture.ClassName; //='ChartDrawPictureText'时加“设置”\\r\\n        var toolsDiv = \\\"\\\";\\r\\n        if(className === 'ChartDrawPictureText'){\\r\\n            toolsDiv = '<span class=\\\"changes-color\\\" title=\\\"改变图形颜色\\\">'+\\r\\n                '<i class=\\\"iconfont icon-bianji\\\"></i>'+\\r\\n                '<input type=\\\"color\\\" name=\\\"color\\\" id=\\\"color\\\" class=\\\"change-color\\\" value=\\\"'+ this.ChartPicture.LineColor +'\\\">'+\\r\\n                '</span>\\\\n' +\\r\\n                '<span class=\\\"subtool-set\\\" title=\\\"设置\\\"><i class=\\\"iconfont icon-shezhi\\\"></i></span>'+\\r\\n                '<span class=\\\"subtool-del\\\"><i class=\\\"iconfont icon-recycle_bin\\\"></i></span>';\\r\\n        }else{\\r\\n            toolsDiv =\\r\\n                '<p class=\\\"changes-color\\\" title=\\\"改变图形颜色\\\"><i class=\\\"iconfont icon-bianji\\\"></i>' +\\r\\n                '<input type=\\\"color\\\" name=\\\"color\\\" id=\\\"color\\\" class=\\\"change-color\\\" value=\\\"'+ this.ChartPicture.LineColor +'\\\"></p>\\\\n' +\\r\\n                '        <p class=\\\"subtool-del\\\"><i class=\\\"iconfont icon-recycle_bin\\\"></i></p>';\\r\\n        }\\r\\n\\r\\n\\r\\n        this.SubToolsDiv.style.right = right/pixelTatio + \\\"px\\\";\\r\\n        this.SubToolsDiv.style.top = top/pixelTatio + \\\"px\\\";\\r\\n        this.SubToolsDiv.innerHTML = toolsDiv;\\r\\n        this.SubToolsDiv.style.position = \\\"absolute\\\";\\r\\n        this.SubToolsDiv.style.display = \\\"block\\\";\\r\\n\\r\\n        var hqChart = this.HQChart;\\r\\n        var picture = this.ChartPicture;\\r\\n        var subToolDiv = this.SubToolsDiv;\\r\\n        $(\\\".subtool-del\\\").click(function(){\\r\\n            hqChart.ClearChartDrawPicture(picture);\\r\\n            // subToolDiv.innerHTML = \\\"\\\";\\r\\n            $(\\\".subTolls\\\").css(\\\"display\\\",\\\"none\\\");\\r\\n        });\\r\\n        var self = this;\\r\\n        $(\\\".subtool-set\\\").click(function(){\\r\\n            $(self.SubToolsDiv).hide();\\r\\n            //创建div设置窗口\\r\\n            if (!this.SettingMenu) self.SettingMenu=new ChartPictureTextSettingMenu(frame.ChartBorder.UIElement.parentNode);\\r\\n\\r\\n            self.SettingMenu.ChartPicture=picture;\\r\\n            self.SettingMenu.HQChart=hqChart;\\r\\n            self.SettingMenu.Position={Left:right + 80,Top:top + 20};\\r\\n            self.SettingMenu.DoModal();\\r\\n        });\\r\\n        $(\\\".changes-color\\\").click(function () {\\r\\n            document.getElementById('color').click();\\r\\n            $(\\\".change-color\\\").change(function () {\\r\\n                var color = $(\\\".change-color\\\").val();\\r\\n                picture.LineColor = color;\\r\\n                picture.PointColor = color;\\r\\n                if (hqChart.ChartDrawStorage) hqChart.ChartDrawStorage.SaveDrawData(picture);   //保存下\\r\\n            });\\r\\n        })\\r\\n\\r\\n\\r\\n        JSConsole.Chart.Log(\\\"[ChartPictureSettingMenu::DoModal]\\\", {Top:top,Left:left, Right:right});\\r\\n    }\\r\\n}\\r\\n\\r\\n//画图工具 文本设置窗口\\r\\nfunction ChartPictureTextSettingMenu(divElement)\\r\\n{\\r\\n    this.newMethod=IDivDialog;   //派生\\r\\n    this.newMethod(divElement);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ChartPicture;\\r\\n    this.SettingDiv;\\r\\n    this.Position;\\r\\n\\r\\n    this.BackupData;    //画图工具备份数据\\r\\n\\r\\n    this.Close=function()\\r\\n    {\\r\\n        if (this.SettingDiv) this.DivElement.removeChild(this.SettingDiv);  //直接删除\\r\\n    }\\r\\n\\r\\n    this.DoModal=function()\\r\\n    {\\r\\n        var text=this.ChartPicture.Text;    //显示的文本\\r\\n        var fontOption=this.ChartPicture.FontOption;    //字体设置\\r\\n        var lineColor=this.ChartPicture.LineColor;\\r\\n        //数据备份, 点取消的时候把备份数据设置回去\\r\\n        this.BackupData=\\r\\n            {\\r\\n                Text:text,\\r\\n                LineColor:lineColor,\\r\\n                FontOption:{Family: fontOption.Family, Size: fontOption.Size, Weight: fontOption.Weight, Style: fontOption.Style }\\r\\n            };\\r\\n        JSConsole.Chart.Log('[ChartPictureTextSettingMenu::DoModal] picture info',this.BackupData);\\r\\n\\r\\n        var self=this;\\r\\n        var div=this.DivElement.getElementsByClassName('chartpicture-text-setting')[0];\\r\\n        if (!div)\\r\\n        {\\r\\n            div=document.createElement(\\\"div\\\");\\r\\n            div.className='chartpicture-text-setting';\\r\\n            this.DivElement.appendChild(div);\\r\\n            this.SettingDiv=div;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.SettingDiv=div;\\r\\n        }\\r\\n\\r\\n        var titleContainerStr = '<div class=\\\"titleWrap\\\">'+\\r\\n            '<span class=\\\"titleName\\\">样式设置</span>'+\\r\\n            '<i class=\\\"closeBtn iconfont icon-close\\\"></i>'+\\r\\n            '</div>';\\r\\n\\r\\n        var fontSizeArray = [10,11,12,14,16,20,24,28,32,40];\\r\\n        var fontArray = ['微软雅黑','宋体','Arial','仿宋'];\\r\\n        var sizeListStr = \\\"\\\";\\r\\n        var fontListStr = \\\"\\\";\\r\\n        fontArray.forEach(function(item,index){\\r\\n            fontListStr += index !== 0 ? '<p>'+item+'</P>' : '<p class=\\\"active\\\">'+item+'</P>';\\r\\n        });\\r\\n        fontSizeArray.forEach(function(item,index){\\r\\n            sizeListStr += index !== 5 ? '<p>'+item+'</P>' : '<p class=\\\"active\\\">'+item+'</P>';\\r\\n        });\\r\\n        var contentContainerStr = '<div class=\\\"contentWrap\\\">'+\\r\\n            '<div class=\\\"styleOptions\\\">'+\\r\\n            '<span class=\\\"colorPicker\\\"><input type=\\\"color\\\" id=\\\"fontColor\\\" value=\\\"#1e90ff\\\"></span>'+\\r\\n            '<div class=\\\"likeSelect fontSelect\\\"><span class=\\\"choicedText\\\">微软雅黑</span><div class=\\\"selectList\\\">'+fontListStr+'</div><i class=\\\"iconfont icon-xia\\\"></i></div>'+\\r\\n            '<div class=\\\"likeSelect fontSizeSelect\\\"><span class=\\\"choicedText\\\">20</span><div class=\\\"selectList\\\">'+sizeListStr+'</div><i class=\\\"iconfont icon-xia\\\"></i></div>'+\\r\\n            '<span class=\\\"strongFont likeBtn\\\"><i class=\\\"iconfont icon-jiacu\\\"></i></span>'+\\r\\n            '<span class=\\\"italicsFont likeBtn\\\"><i class=\\\"iconfont icon-qingxieL\\\"></i></span>'+\\r\\n            '</div>'+\\r\\n            '<textarea class=\\\"tArea\\\" id=\\\"tArea\\\" placeholder=\\\"Text\\\"></textarea>'+\\r\\n            '</div>';\\r\\n        var btnContainer = '<div class=\\\"btnsContainer\\\">'+\\r\\n            '<span class=\\\"okBtn btn\\\">确认</span>'+\\r\\n            '<span class=\\\"cancelBtn btn\\\">取消</span>'+\\r\\n            '</div>';\\r\\n\\r\\n        var pixelTatio = GetDevicePixelRatio();\\r\\n        var DoModalStr = titleContainerStr+contentContainerStr+btnContainer;\\r\\n        this.SettingDiv.style.left = this.Position.Left/pixelTatio + \\\"px\\\";\\r\\n        this.SettingDiv.style.top = this.Position.Top/pixelTatio + \\\"px\\\";\\r\\n        this.SettingDiv.innerHTML=DoModalStr;\\r\\n        this.SettingDiv.style.position = \\\"absolute\\\";\\r\\n        this.SettingDiv.style.display = \\\"block\\\";\\r\\n        $(\\\".chartpicture-text-setting .colorPicker\\\").css({ //初始设置\\r\\n            \\\"borderColor\\\":self.ChartPicture.LineColor,\\r\\n            \\\"background-color\\\":self.ChartPicture.LineColor\\r\\n        });\\r\\n\\r\\n        var family = this.ChartPicture.FontOption.Family;\\r\\n        $('.chartpicture-text-setting .fontSelect .choicedText').html(family);\\r\\n        fontArray.forEach(function(item,index){\\r\\n            if(item == family){\\r\\n                $('.chartpicture-text-setting .fontSelect p').removeClass('active');\\r\\n                $('.chartpicture-text-setting .fontSelect p').eq(index).addClass('active');\\r\\n            }\\r\\n        });\\r\\n\\r\\n        var size = this.ChartPicture.FontOption.Size;\\r\\n        $('.chartpicture-text-setting .fontSizeSelect .choicedText').html(size);\\r\\n        fontSizeArray.forEach(function(item,index){\\r\\n            if(item == size){\\r\\n                $('.chartpicture-text-setting .fontSizeSelect p').removeClass('active');\\r\\n                $('.chartpicture-text-setting .fontSizeSelect p').eq(index).addClass('active');\\r\\n            }\\r\\n        });\\r\\n\\r\\n        var weight = this.ChartPicture.FontOption.Weight;\\r\\n        if( weight != null && weight == 'bold'){\\r\\n            $('.chartpicture-text-setting .strongFont').addClass('hot');\\r\\n        }\\r\\n\\r\\n        var style = this.ChartPicture.FontOption.Style;\\r\\n        if( style != null && style == 'italic'){\\r\\n            $('.chartpicture-text-setting .italicsFont').addClass('hot');\\r\\n        }\\r\\n\\r\\n        var text = this.ChartPicture.Text;\\r\\n        $('.chartpicture-text-setting .tArea').val(text);  //结束初始设置\\r\\n\\r\\n        var defaultTextOption = { Family:'微软雅黑', Size:20, Weight:null, Style:null };\\r\\n        $(\\\".chartpicture-text-setting #fontColor\\\").change(\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event)\\r\\n            {  //颜色选择\\r\\n                var value = $(this).val();\\r\\n                $(this).parent().css({\\r\\n                    \\\"borderColor\\\":value,\\r\\n                    \\\"background-color\\\":value\\r\\n                });\\r\\n                var chart=event.data.Picture;\\r\\n                chart.LineColor = value;\\r\\n                if (chart.Update) chart.Update();   //更新界面\\r\\n            }\\r\\n        );\\r\\n        $(\\\".chartpicture-text-setting .fontSelect,.chartpicture-text-setting .fontSizeSelect\\\").click(function(){\\r\\n            $(this).find('.selectList').toggle();\\r\\n            $(this).toggleClass('hot');\\r\\n        });\\r\\n        $(\\\".chartpicture-text-setting .fontSelect p\\\").click(\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event){ //字体选择\\r\\n                var choicedText = $(this).closest(\\\".fontSelect\\\").find('.choicedText').html();\\r\\n                var currentSelect = event.currentTarget.innerHTML;\\r\\n                if(choicedText !== currentSelect){\\r\\n                    $(this).closest(\\\".fontSelect\\\").find('.choicedText').html(currentSelect);\\r\\n                    $(this).siblings().removeClass('active');\\r\\n                    $(this).addClass('active');\\r\\n                    var chart = event.data.Picture;\\r\\n                    chart.FontOption.Family = currentSelect;\\r\\n                    if (chart.Update) chart.Update();   //更新界面\\r\\n                }\\r\\n            });\\r\\n        $(\\\".chartpicture-text-setting .fontSizeSelect p\\\").click(\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event){  //字号选择\\r\\n                var choicedText = $(this).closest(\\\".fontSizeSelect\\\").find('.choicedText').html();\\r\\n                var currentSelect = event.currentTarget.innerHTML;\\r\\n                if(choicedText !== currentSelect){\\r\\n                    $(this).closest(\\\".fontSizeSelect\\\").find('.choicedText').html(currentSelect);\\r\\n                    $(this).siblings().removeClass('active');\\r\\n                    $(this).addClass('active');\\r\\n                    var chart = event.data.Picture;\\r\\n                    chart.FontOption.Size = Number(currentSelect);\\r\\n                    if (chart.Update) chart.Update();   //更新界面\\r\\n                }\\r\\n            });\\r\\n        $(\\\".chartpicture-text-setting .strongFont\\\").click(\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event){\\r\\n                $(this).toggleClass('hot');\\r\\n                var classnames = $(this).attr('class');\\r\\n                if(classnames.indexOf('hot') > 0){\\r\\n                    var chart = event.data.Picture;\\r\\n                    chart.FontOption.Weight = 'bold';\\r\\n                    if (chart.Update) chart.Update();   //更新界面\\r\\n                }\\r\\n            });\\r\\n        $(\\\".chartpicture-text-setting .italicsFont\\\").click(\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event){\\r\\n                $(this).toggleClass('hot')\\r\\n                var classnames = $(this).attr('class');\\r\\n                if(classnames.indexOf('hot') > 0){\\r\\n                    var chart = event.data.Picture;\\r\\n                    chart.FontOption.Style = 'italic';\\r\\n                    if (chart.Update) chart.Update();   //更新界面\\r\\n                }\\r\\n            });\\r\\n        $(\\\".chartpicture-text-setting .titleWrap .closeBtn,.chartpicture-text-setting .btnsContainer .cancelBtn\\\").click(  //取消\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event){\\r\\n                var picture = event.data.Picture;\\r\\n                picture.Text = self.BackupData.Text;\\r\\n                picture.LineColor = self.BackupData.LineColor;\\r\\n                picture.FontOption = self.BackupData.FontOption;\\r\\n                if (picture.Update) picture.Update();\\r\\n                self.Close();\\r\\n            });\\r\\n        $(\\\".chartpicture-text-setting .tArea\\\").keyup( //文本内容\\r\\n            {\\r\\n                Picture:this.ChartPicture\\r\\n            },\\r\\n            function(event){\\r\\n                JSConsole.Chart.Log('[ChartPictureTextSettingMenu::DoModal] $(\\\".chartpicture-text-setting .tArea\\\").keyup()');\\r\\n                var content = $(this).val();\\r\\n                var chart = event.data.Picture;\\r\\n                chart.Text = content;\\r\\n                if (chart.Update) chart.Update();   //更新界面\\r\\n            });\\r\\n\\r\\n        //确定按钮\\r\\n        $(\\\".chartpicture-text-setting .btnsContainer .okBtn\\\").click(\\r\\n            function()\\r\\n            {\\r\\n                self.Close();\\r\\n                if (self.HQChart && self.HQChart.ChartDrawStorage) self.HQChart.ChartDrawStorage.SaveDrawData(self.ChartPicture);   //保存下\\r\\n            }\\r\\n        );\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n///////////////////////////////////////////////////////////////////////////////////////\\r\\n//\\r\\n//  各个品种分钟走势图坐标信息\\r\\n//\\r\\n//////////////////////////////////////////////////////////////////////////////////////\\r\\nvar MARKET_SUFFIX_NAME=\\r\\n    {\\r\\n        SH:'.SH',\\r\\n        SZ:'.SZ',\\r\\n        SHSZ_C_Index:'.CI',     //自定义指数\\r\\n\\r\\n        SHO:'.SHO',          //上海交易所 股票期权\\r\\n        HK:'.HK',            //港股\\r\\n        FHK:'.FHK',          //港股期货\\r\\n        SHFE: '.SHF',        //上期所 (Shanghai Futures Exchange)\\r\\n        SHFE2:'.SHFE',       //上期所 (Shanghai Futures Exchange)\\r\\n        CFFEX: '.CFE',       //中期所 (China Financial Futures Exchange)\\r\\n        DCE: '.DCE',         //大连商品交易所(Dalian Commodity Exchange)\\r\\n        CZCE: '.CZC',        //郑州期货交易所\\r\\n        USA:'.USA',          //美股\\r\\n        FTSE:'.FTSE',        //富时中国\\r\\n\\r\\n        BIT:'.BIT',          //数字货币 如比特币\\r\\n        BIZ:'.BIZ',          //数字货币\\r\\n\\r\\n        FOREX:'.FOREX',      //外汇 (Foreign Exchange)\\r\\n\\r\\n        NYMEX:'.NYMEX',      //纽约商品期货交易所(New York Mercantile Exchange)\\r\\n        COMEX:\\\".COMEX\\\",      //纽约商品期货交易所(New York Mercantile Exchange)\\r\\n        NYBOT:\\\".NYBOT\\\",      //美國紐約商品交易所\\r\\n        CBOT:\\\".CBOT\\\",        //芝商所\\r\\n\\r\\n        LME:\\\".LME\\\",          //伦敦金属交易所\\r\\n        TOCOM:\\\".TOCOM\\\",      //东京商品交易所（TOCOM）\\r\\n        IPE:\\\".IPE\\\",          //美国洲际交易所 （ICE EUROPE）\\r\\n\\r\\n        ET:'.ET',            //其他未知的品种\\r\\n\\r\\n        IsET:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.ET) > 0;\\r\\n        },\\r\\n\\r\\n        IsETShowAvPrice:function(upperSymbol)   //是否显示均价\\r\\n        {\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsNYMEX:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.NYMEX)>0;\\r\\n        },\\r\\n\\r\\n        IsCOMEX:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.COMEX)>0;\\r\\n        },\\r\\n\\r\\n        IsNYBOT:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.NYBOT)>0;\\r\\n        },\\r\\n\\r\\n        IsCBOT:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.CBOT)>0;\\r\\n        },\\r\\n\\r\\n        IsLME:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.LME)>0;\\r\\n        },\\r\\n\\r\\n        IsTOCOM:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.TOCOM)>0;\\r\\n        },\\r\\n\\r\\n        IsIPE:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.IPE)>0;\\r\\n        },\\r\\n\\r\\n        IsForeignExchange(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.FOREX) > 0;\\r\\n        },\\r\\n\\r\\n        IsFTSE:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.FTSE) > 0;\\r\\n        },\\r\\n\\r\\n        IsFHK:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.FHK) > 0;\\r\\n        },\\r\\n\\r\\n        IsBIT:function(upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            if (upperSymbol.indexOf(this.BIT) > 0) return true;\\r\\n            if (upperSymbol.indexOf(this.BIZ) > 0) return true;\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsUSA:function(upperSymbol) //是否是美股\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.USA) > 0;\\r\\n        },\\r\\n\\r\\n        IsSH: function (upperSymbol)\\r\\n        {\\r\\n            //需要精确匹配最后3位\\r\\n            var pos = upperSymbol.length-this.SH.length;\\r\\n            var find = upperSymbol.indexOf(this.SH);\\r\\n            return find == pos;\\r\\n        },\\r\\n\\r\\n        IsSZ: function (upperSymbol)\\r\\n        {\\r\\n            var pos = upperSymbol.length - this.SZ.length;\\r\\n            var find = upperSymbol.indexOf(this.SZ);\\r\\n            return find == pos;\\r\\n        },\\r\\n\\r\\n        //自定义指数\\r\\n        IsSHSZCustomIndex:function(upperSymbol)\\r\\n        {\\r\\n            var pos = upperSymbol.length - this.SHSZ_C_Index.length;\\r\\n            var find = upperSymbol.indexOf(this.SHSZ_C_Index);\\r\\n            return find == pos;\\r\\n        },\\r\\n\\r\\n        IsSHO: function(upperSymbol)\\r\\n        {\\r\\n            var pos = upperSymbol.length - this.SHO.length;\\r\\n            var find = upperSymbol.indexOf(this.SHO);\\r\\n            return find == pos;\\r\\n        },\\r\\n\\r\\n        IsHK: function (upperSymbol)\\r\\n        {\\r\\n            var pos = upperSymbol.length - this.HK.length;\\r\\n            var find = upperSymbol.indexOf(this.HK);\\r\\n            return find == pos;\\r\\n        },\\r\\n\\r\\n        IsSHFE: function (upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            if (upperSymbol.indexOf(this.SHFE) > 0) return true;\\r\\n            if (upperSymbol.indexOf(this.SHFE2) > 0) return true;\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsCFFEX: function (upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            if (upperSymbol.indexOf(this.CFFEX) > 0) return true;\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsDCE: function (upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.DCE) > 0;\\r\\n        },\\r\\n\\r\\n        IsCZCE: function (upperSymbol)\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n            return upperSymbol.indexOf(this.CZCE) > 0;\\r\\n        },\\r\\n\\r\\n        IsChinaFutures:function(upperSymbol)   //是否是国内期货 /期权\\r\\n        {\\r\\n            return this.IsSHO(upperSymbol) || this.IsCFFEX(upperSymbol) || this.IsCZCE(upperSymbol) || this.IsDCE(upperSymbol) || this.IsSHFE(upperSymbol);\\r\\n        },\\r\\n\\r\\n        IsFutures:function(upperSymbol) //是否是期货 包含国外的\\r\\n        {\\r\\n            return this.IsChinaFutures(upperSymbol) ||\\r\\n                this.IsNYMEX(upperSymbol) || this.IsCOMEX(upperSymbol) || this.IsNYBOT(upperSymbol) || this.IsCBOT(upperSymbol) ||\\r\\n                this.IsLME(upperSymbol) || this.IsTOCOM(upperSymbol);\\r\\n        },\\r\\n\\r\\n        IsSHSZ:function(upperSymbol)            //是否是沪深的股票\\r\\n        {\\r\\n            return this.IsSZ(upperSymbol)|| this.IsSH(upperSymbol) || this.IsSHSZCustomIndex(upperSymbol);\\r\\n        },\\r\\n\\r\\n        IsSHSZFund:function(upperSymbol)        //是否是交易所基金\\r\\n        {\\r\\n            if (!upperSymbol) return false;\\r\\n\\r\\n            if (this.IsSH(upperSymbol)) //51XXXX.SH\\r\\n            {\\r\\n                if (upperSymbol.charAt(0)=='5' && upperSymbol.charAt(1)=='1') return true;\\r\\n            }\\r\\n            else if (this.IsSZ(upperSymbol)) //15XXXX.sz, 16XXXX.sz, 17XXXX.sz, 18XXXX.sz\\r\\n            {\\r\\n                if (upperSymbol.charAt(0)=='1' &&\\r\\n                    (upperSymbol.charAt(1)=='5' || upperSymbol.charAt(1)=='6' || upperSymbol.charAt(1)=='7' || upperSymbol.charAt(1)=='8') ) return true;\\r\\n            }\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsSHSZIndex:function(symbol)     //是否是沪深指数代码\\r\\n        {\\r\\n            if (!symbol) return false;\\r\\n            var upperSymbol=symbol.toUpperCase();\\r\\n            if (this.IsSH(upperSymbol))\\r\\n            {\\r\\n                var temp=upperSymbol.replace('.SH','');\\r\\n                if (upperSymbol.charAt(0)=='0' && parseInt(temp)<=3000) return true;\\r\\n\\r\\n            }\\r\\n            else if (this.IsSZ(upperSymbol))\\r\\n            {\\r\\n                if (upperSymbol.charAt(0)=='3' && upperSymbol.charAt(1)=='9') return true;\\r\\n            }\\r\\n            else if (this.IsSHSZCustomIndex(upperSymbol))  //自定义指数\\r\\n            {\\r\\n                return true;\\r\\n            }\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsSHSZStockA:function(symbol) //是否是沪深A股\\r\\n        {\\r\\n            if (!symbol) return false;\\r\\n            var upperSymbol=symbol.toUpperCase();\\r\\n            if (this.IsSH(upperSymbol))\\r\\n            {\\r\\n                var temp=upperSymbol.replace('.SH','');\\r\\n                if (upperSymbol.charAt(0)=='6') return true;\\r\\n\\r\\n            }\\r\\n            else if (this.IsSZ(upperSymbol))\\r\\n            {\\r\\n                if (upperSymbol.charAt(0)=='0')\\r\\n                {\\r\\n                    if (upperSymbol.charAt(1)=='0' && upperSymbol.charAt(2)=='2') return true;  //002 中小板\\r\\n                    if (upperSymbol.charAt(1)!='7' && upperSymbol.charAt(1)!='8') return true;\\r\\n                }\\r\\n                else if (upperSymbol.charAt(0)=='3')\\r\\n                {\\r\\n                    if (upperSymbol.charAt(1)=='0' && upperSymbol.charAt(2)=='0') return true;    //创业板 300XXX.sz\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsSHStockSTAR:function(symbol)   // 是否是科创板 Sci-Tech innovAtion boaRd (STAR Market)\\r\\n        {\\r\\n            if (!symbol) return false;\\r\\n            var upperSymbol=symbol.toUpperCase();\\r\\n            if (!this.IsSH(upperSymbol)) return false;\\r\\n            if (upperSymbol.charAt(0)=='6' && upperSymbol.charAt(1)=='8' && upperSymbol.charAt(2)=='8')\\r\\n                return true;\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        GetMarketStatus:function(symbol)    //获取市场状态 0=闭市 1=盘前 2=盘中 3=盘后\\r\\n        {\\r\\n            if (!symbol) return 0;\\r\\n            var upperSymbol=symbol.toUpperCase();\\r\\n            var nowDate= new Date();\\r\\n            var day = nowDate.getDay();\\r\\n            var time = nowDate.getHours() * 100 + nowDate.getMinutes();\\r\\n            if (this.IsUSA(upperSymbol))\\r\\n            {\\r\\n                var usaDate=GetLocalTime(-4);\\r\\n                var day = usaDate.getDay();\\r\\n                var time = usaDate.getHours() * 100 + usaDate.getMinutes();\\r\\n                if(day == 6 || day== 0) return 0;   //周末\\r\\n\\r\\n                //9:30 - 16:00 考虑夏令时间时间增加1小时 9:30 - 17:00\\r\\n                if (time>1730) return 3;\\r\\n                if (time<930) return 1;\\r\\n\\r\\n                return 2;\\r\\n            }\\r\\n            else if (this.IsBIT(upperSymbol))   //数字货币24小时\\r\\n            {\\r\\n                return 2;\\r\\n            }\\r\\n            else if (this.IsForeignExchange(upperSymbol))   //外汇24小时\\r\\n            {\\r\\n                return 2;\\r\\n            }\\r\\n            else if (this.IsFTSE(upperSymbol))  //富时中国 9:00-16:30 17:00-04:45\\r\\n            {\\r\\n                if(day == 6 || day== 0) return 0;   //周末\\r\\n                if (time>=830 && time<=2359) return 2;\\r\\n                if (time>=0 && time<=500) return 2;\\r\\n                return 0;\\r\\n            }\\r\\n            else if (this.IsFHK(upperSymbol))   //港股指数期货 9:15-12:00 13:00-16:30 17:15-01:00\\r\\n            {\\r\\n                if(day == 6 || day== 0) return 0;   //周末\\r\\n                if (time>=900 && time<=2359) return 2;\\r\\n                if (time>=0 && time<=320) return 2;\\r\\n                return 0;\\r\\n            }\\r\\n            else if (this.IsET(upperSymbol))\\r\\n            {\\r\\n                return this.GetETMarketStatus(symbol);\\r\\n            }\\r\\n            else if (this.IsHK(upperSymbol))    //港股\\r\\n            {\\r\\n                if(day == 6 || day== 0) return 0;   //周末\\r\\n                if(time>1630) return 3;\\r\\n                if(time<925) return 1;\\r\\n                return 2;\\r\\n            }\\r\\n            else if (this.IsNYMEX(upperSymbol))\\r\\n            {\\r\\n                return this.GetNYMEXMarketStatus(upperSymbol);\\r\\n            }\\r\\n            else if (this.IsCOMEX(upperSymbol))\\r\\n            {\\r\\n                return this.GetCOMEXMarketStatus(upperSymbol);\\r\\n            }\\r\\n            else if (this.IsNYBOT(upperSymbol))\\r\\n            {\\r\\n                return this.GetNYBOTMarketStatus(upperSymbol);\\r\\n            }\\r\\n            else if (this.IsCBOT(upperSymbol))\\r\\n            {\\r\\n                return this.GetCBOTMarketStatus(upperSymbol);\\r\\n            }\\r\\n            else if (this.IsLME(upperSymbol))\\r\\n            {\\r\\n                return this.GetLMEMarketStatus(upperSymbol);\\r\\n            }\\r\\n            else if (this.IsTOCOM(upperSymbol))\\r\\n            {\\r\\n                return this.GetTOCOMMarketStatus(upperSymbol);\\r\\n            }\\r\\n            else if (this.IsChinaFutures(upperSymbol))  //国内期货\\r\\n            {\\r\\n                if(day == 6 || day== 0) return 0;   //周末\\r\\n\\r\\n                //21:00-2:30\\r\\n                if(time>=2100) return 2;\\r\\n                if (time<=240) return 2;\\r\\n\\r\\n                //8:55-11:30, 13:00-15:00\\r\\n                if(time>=830 && time<=1510) return 2;\\r\\n\\r\\n                return 1;\\r\\n            }\\r\\n            else    //9:30 - 15:40\\r\\n            {\\r\\n                if(day == 6 || day== 0) return 0;   //周末\\r\\n                if(time>1540) return 3;\\r\\n                if(time<925) return 1;\\r\\n                return 2;\\r\\n            }\\r\\n\\r\\n        },\\r\\n\\r\\n        GetLimitPriceRange:function(symbol, name) //涨停范围\\r\\n        {\\r\\n            if (!this.IsSHSZStockA(symbol)) return null;\\r\\n            if (this.IsSHStockSTAR(symbol)) return {Max:0.2 , Min:-0.2};    //科创板 [20%- -20%]\\r\\n\\r\\n            if (!name) return null;\\r\\n            if (name.indexOf('ST')>=0) return { Max:0.05, Min:-0.05 }; //ST 股票 [5% - -5%]\\r\\n\\r\\n            return {Max:0.1 , Min:-0.1}; //[10% - -10%]\\r\\n        },\\r\\n\\r\\n        GetDefaultDecimal:function(symbol)  //默认小数位数\\r\\n        {\\r\\n            return 2;\\r\\n        },\\r\\n\\r\\n        GetFHKDecimal:function(symbol)  //港股指数期货 小数位数\\r\\n        {\\r\\n            return 0;\\r\\n        },\\r\\n\\r\\n        GetFTSEDecimal:function(symbol) //富时中国A50期货 小数位数\\r\\n        {\\r\\n            return 0;\\r\\n        },\\r\\n\\r\\n        GetBITDecimal:function(symbol)\\r\\n        {\\r\\n            return 2;\\r\\n        },\\r\\n\\r\\n        GetSHODecimal:function(symbol)\\r\\n        {\\r\\n            return 4;\\r\\n        },\\r\\n\\r\\n        GetETDecimal:function(symbol)\\r\\n        {\\r\\n            return 2;\\r\\n        },\\r\\n\\r\\n        GetForeignExchangeDecimal:function(symbol)\\r\\n        {\\r\\n            return 4;\\r\\n        },\\r\\n\\r\\n        GetNYMEXDecimal:function(symbol)    //纽约期货交易所\\r\\n        {\\r\\n            return g_NYMEXTimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetCOMEXDecimal:function(symbol)\\r\\n        {\\r\\n            return g_COMEXTimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetNYBOTDecimal:function(symbol)\\r\\n        {\\r\\n            return g_NYBOTTimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetCBOTDecimal:function(symbol)\\r\\n        {\\r\\n            return g_CBOTTimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetLMEDecimal:function(symbol)\\r\\n        {\\r\\n            return g_LMETimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetTOCOMDecimal:function(symbol)\\r\\n        {\\r\\n            return g_TOCOMTimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetIPEDecimal:function(symbol)\\r\\n        {\\r\\n            return g_IPETimeData.GetDecimal(symbol);\\r\\n        },\\r\\n\\r\\n        GetETMarketStatus:function(symbol)\\r\\n        {\\r\\n            // 0=闭市 1=盘前 2=盘中 3=盘后\\r\\n            return 2;\\r\\n        },\\r\\n\\r\\n        GetNYMEXMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_NYMEXTimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        GetCOMEXMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_COMEXTimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        GetNYBOTMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_NYBOTTimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        GetCBOTMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_CBOTTimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        GetLMEMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_LMETimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        GetTOCOMMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_TOCOMTimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        GetIPEMarketStatus:function(symbol)\\r\\n        {\\r\\n            return g_IPETimeData.GetMarketStatus(symbol);\\r\\n        },\\r\\n\\r\\n        IsShowMinuteVolTitle:function(symbol)   //是否画走势图成交量标题\\r\\n        {\\r\\n            if (!symbol) return false;\\r\\n            var upperSymbol=symbol.toUpperCase();\\r\\n            //if (this.IsChinaFutures(upperSymbol)) return true;\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsShowMinutePostionLine:function(upperSymbol)    //分时图 成交量图中是否显示持仓线\\r\\n        {\\r\\n            if(MARKET_SUFFIX_NAME.IsFutures(upperSymbol) || MARKET_SUFFIX_NAME.IsSHO(upperSymbol))  return true;\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsShowMinuteColorVolBar:function(symobl)        //是否分时图成绩量柱子使用彩色柱\\r\\n        {\\r\\n            if (g_JSChartResource.Minute.VolBarColor) return true;\\r\\n\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsEnableRight:function(period, symbol)    //是否支持复权\\r\\n        {\\r\\n            if (!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol)) return false;\\r\\n            if (ChartData.IsTickPeriod(period)) return false;                    //分笔没有复权\\r\\n            if (ChartData.IsMinutePeriod(period,true)) return false;             //内置分钟K线不支持复权\\r\\n\\r\\n            return true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n//走势图分钟数据对应的时间\\r\\nfunction MinuteTimeStringData()\\r\\n{\\r\\n    this.SHSZ = null;       //上海深证交易所时间\\r\\n    this.SHO=null;          //上海股票期权交易时间\\r\\n    this.HK = null;         //香港交易所时间\\r\\n    this.Futures=new Map(); //期货交易时间 key=时间名称 Value=数据\\r\\n    this.USA = null;        //美股交易时间\\r\\n    this.FTSE=null;         //富时中国\\r\\n    this.FHK=null;          //港股指数期货\\r\\n    this.ForeEx=null;       //外汇\\r\\n    this.BIT=null;          //数字货币\\r\\n\\r\\n    this.Initialize = function ()  //初始化 默认只初始化沪深的 其他市场动态生成\\r\\n    {\\r\\n        //this.SHSZ = this.CreateSHSZData();\\r\\n        //this.HK = this.CreateHKData();\\r\\n    }\\r\\n\\r\\n    this.GetET=function(upperSymbol)   //当天所有的分钟\\r\\n    {\\r\\n        throw {Name:'MinuteTimeStringData::GetET', Error:'not implement'};\\r\\n    }\\r\\n\\r\\n    this.GetSHSZ=function(upperSymbol) //动态创建\\r\\n    {\\r\\n        if (!this.SHSZ) this.SHSZ=this.CreateSHSZData();\\r\\n        return this.SHSZ;\\r\\n    }\\r\\n\\r\\n    this.GetSHO=function()\\r\\n    {\\r\\n        if (!this.SHO) this.SHO=this.CreateSHOData();\\r\\n        return this.SHO;\\r\\n    }\\r\\n\\r\\n    this.GetHK=function()\\r\\n    {\\r\\n        if (!this.HK) this.HK = this.CreateHKData();\\r\\n        return this.HK;\\r\\n    }\\r\\n\\r\\n    this.GetFutures=function(splitData)\\r\\n    {\\r\\n        if (!this.Futures.has(splitData.Name))\\r\\n        {\\r\\n            var data = this.CreateTimeData(splitData.Data);\\r\\n            this.Futures.set(splitData.Name,data);\\r\\n        }\\r\\n\\r\\n        return this.Futures.get(splitData.Name);\\r\\n    }\\r\\n\\r\\n    this.GetUSA=function()\\r\\n    {\\r\\n        if (!this.USA) this.USA=this.CreateUSAData(0);\\r\\n        return this.USA;\\r\\n    }\\r\\n\\r\\n    this.GetFTSE=function()\\r\\n    {\\r\\n        if (!this.FTSE) this.FTSE=this.CreateFTSEData();\\r\\n        return this.FTSE;\\r\\n    }\\r\\n\\r\\n    this.GetFHK=function()\\r\\n    {\\r\\n        if (!this.FHK) this.FHK=this.CreateFHKData();\\r\\n        return this.FHK;\\r\\n    }\\r\\n\\r\\n    this.GetForeignExchange=function()\\r\\n    {\\r\\n        if (!this.ForeEx) this.ForeEx=this.CreateForeignExchangeData();\\r\\n        return this.ForeEx;\\r\\n    }\\r\\n\\r\\n    this.GetBIT=function(upperSymbol)\\r\\n    {\\r\\n        if (!this.BIT) this.BIT=this.CreateBITData();\\r\\n        return this.BIT;\\r\\n    }\\r\\n\\r\\n    this.CreateSHSZData = function ()\\r\\n    {\\r\\n        const TIME_SPLIT =\\r\\n            [\\r\\n                { Start: 925, End: 925 },\\r\\n                { Start: 930, End: 1130 },\\r\\n                { Start: 1300, End: 1500 }\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateSHOData=function()\\r\\n    {\\r\\n        const TIME_SPLIT =\\r\\n            [\\r\\n                { Start: 930, End: 1129 },\\r\\n                { Start: 1300, End: 1500 }\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateHKData = function ()\\r\\n    {\\r\\n        const TIME_SPLIT =\\r\\n            [\\r\\n                { Start: 930, End: 1200 },\\r\\n                { Start: 1300, End: 1600 }\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateFTSEData=function()\\r\\n    {\\r\\n        const TIME_SPLIT=\\r\\n            [\\r\\n                { Start:1700, End:2359 },\\r\\n                { Start:0,  End:445 },\\r\\n                { Start:900, End:1630 }\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateFHKData=function()\\r\\n    {\\r\\n        //港股指数期货 9:15-12:00 13:00-16:30 17:15-03:00\\r\\n        const TIME_SPLIT=\\r\\n            [\\r\\n                { Start:1715, End:2359 },\\r\\n                { Start:0,  End:300 },\\r\\n                { Start:915, End:1200 },\\r\\n                { Start:1300, End:1630 },\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateUSAData=function(type)\\r\\n    {\\r\\n        if (type==1)    //美国夏令时\\r\\n        {\\r\\n            const TIME_SPLIT =\\r\\n                [\\r\\n                    { Start: 2130, End: 2359 },\\r\\n                    { Start: 0, End: 400 }\\r\\n                ];\\r\\n\\r\\n            return this.CreateTimeData(TIME_SPLIT);\\r\\n        }\\r\\n        else if (type==2)    //非夏令时\\r\\n        {\\r\\n            const TIME_SPLIT =\\r\\n                [\\r\\n                    { Start: 2230, End: 2359 },\\r\\n                    { Start: 0, End: 500 }\\r\\n                ];\\r\\n\\r\\n            return this.CreateTimeData(TIME_SPLIT);\\r\\n        }\\r\\n        else    //使用美国本地时间\\r\\n        {\\r\\n            const TIME_SPLIT =\\r\\n                [\\r\\n                    { Start: 930, End: 1600 }   //美国东部时间9:30到16:00\\r\\n                ];\\r\\n\\r\\n            return this.CreateTimeData(TIME_SPLIT);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateForeignExchangeData=function()\\r\\n    {\\r\\n        //外汇 7:00 - 6:59\\r\\n        const TIME_SPLIT=\\r\\n            [\\r\\n                { Start:600, End:2359 },\\r\\n                { Start:0,  End:559 },\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateBITData=function()\\r\\n    {\\r\\n        //数字货币 7:00 - 6:59\\r\\n        const TIME_SPLIT=\\r\\n            [\\r\\n                { Start:600, End:2359 },\\r\\n                { Start:0,  End:559 },\\r\\n            ];\\r\\n\\r\\n        return this.CreateTimeData(TIME_SPLIT);\\r\\n    }\\r\\n\\r\\n    this.CreateTimeData = function (timeSplit)\\r\\n    {\\r\\n        var data = [];\\r\\n        for (var i in timeSplit)\\r\\n        {\\r\\n            var item = timeSplit[i];\\r\\n            for (var j = item.Start; j <= item.End; ++j)\\r\\n            {\\r\\n                if (j % 100 >= 60) continue;    //大于60分钟的数据去掉\\r\\n                data.push(j);\\r\\n            }\\r\\n        }\\r\\n        return data;\\r\\n    }\\r\\n\\r\\n    this.GetTimeData = function (symbol)\\r\\n    {\\r\\n        if (!symbol) return this.SHSZ;\\r\\n\\r\\n        var upperSymbol = symbol.toLocaleUpperCase(); //转成大写\\r\\n        if (MARKET_SUFFIX_NAME.IsSH(upperSymbol) || MARKET_SUFFIX_NAME.IsSZ(upperSymbol)) return this.GetSHSZ(upperSymbol);\\r\\n        if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol)) return this.GetSHO();\\r\\n        if (MARKET_SUFFIX_NAME.IsHK(upperSymbol)) return this.GetHK();\\r\\n        if (MARKET_SUFFIX_NAME.IsUSA(upperSymbol)) return this.GetUSA(true);\\r\\n        if (MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol) || MARKET_SUFFIX_NAME.IsCZCE(upperSymbol) || MARKET_SUFFIX_NAME.IsDCE(upperSymbol) || MARKET_SUFFIX_NAME.IsSHFE(upperSymbol))\\r\\n        {\\r\\n            var splitData = g_FuturesTimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n        if (MARKET_SUFFIX_NAME.IsFTSE(upperSymbol)) return this.GetFTSE();\\r\\n        if (MARKET_SUFFIX_NAME.IsFHK(upperSymbol)) return this.GetFHK();\\r\\n        if (MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol)) return this.GetForeignExchange();\\r\\n        if (MARKET_SUFFIX_NAME.IsET(upperSymbol)) return this.GetET(upperSymbol);\\r\\n        if (MARKET_SUFFIX_NAME.IsBIT(upperSymbol)) return this.GetBIT(upperSymbol);\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol))    //纽约期货交易所\\r\\n        {\\r\\n            var splitData = g_NYMEXTimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsCOMEX(upperSymbol))    //纽约期货交易所\\r\\n        {\\r\\n            var splitData = g_COMEXTimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsNYBOT(upperSymbol))    //纽约期货交易所\\r\\n        {\\r\\n            var splitData = g_NYBOTTimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsCBOT(upperSymbol))    //芝商所\\r\\n        {\\r\\n            var splitData = g_CBOTTimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsLME(upperSymbol))    //伦敦LME\\r\\n        {\\r\\n            var splitData = g_LMETimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsTOCOM(upperSymbol))    //东京商品交易所（TOCOM）\\r\\n        {\\r\\n            var splitData = g_TOCOMTimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsIPE(upperSymbol))    //东京商品交易所（TOCOM）\\r\\n        {\\r\\n            var splitData = g_IPETimeData.GetSplitData(upperSymbol);\\r\\n            if (!splitData) return null;\\r\\n            return this.GetFutures(splitData);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n//走势图刻度分钟线\\r\\nfunction MinuteCoordinateData()\\r\\n{\\r\\n    //沪深走势图时间刻度\\r\\n    const SHZE_MINUTE_X_COORDINATE =\\r\\n        {\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [31, 0, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [61, 0, \\\"RGB(200,200,200)\\\", \\\"10:30\\\"],\\r\\n                    [91, 0, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    [122, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [152, 0, \\\"RGB(200,200,200)\\\", \\\"13:30\\\"],\\r\\n                    [182, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [212, 0, \\\"RGB(200,200,200)\\\", \\\"14:30\\\"],\\r\\n                    [242, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"], // 15:00\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [61, 0, \\\"RGB(200,200,200)\\\", \\\"10:30\\\"],\\r\\n                    [122, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [182, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [242, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"]\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [122, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [242, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"]\\r\\n                ],\\r\\n\\r\\n            Count: 243,\\r\\n            MiddleCount: 122,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 400) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        };\\r\\n\\r\\n    //上海股票期权时间刻度\\r\\n    const SHO_MINUTE_X_COORDINATE =\\r\\n        {\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [30, 0, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [60, 0, \\\"RGB(200,200,200)\\\", \\\"10:30\\\"],\\r\\n                    [90, 0, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [150, 0, \\\"RGB(200,200,200)\\\", \\\"13:30\\\"],\\r\\n                    [180, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [210, 0, \\\"RGB(200,200,200)\\\", \\\"14:30\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"], // 15:00\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [60, 0, \\\"RGB(200,200,200)\\\", \\\"10:30\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [180, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"]\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"]\\r\\n                ],\\r\\n\\r\\n            Count: 241,\\r\\n            MiddleCount: 120,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 400) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        };\\r\\n\\r\\n    //港股走势图时间刻度\\r\\n    const HK_MINUTE_X_COORDINATE =\\r\\n        {\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [30, 0, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [60, 1, \\\"RGB(200,200,200)\\\", \\\"10:30\\\"],\\r\\n                    [90, 0, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"11:30\\\"],\\r\\n                    [151, 0, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [181, 1, \\\"RGB(200,200,200)\\\", \\\"13:30\\\"],\\r\\n                    [211, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [241, 1, \\\"RGB(200,200,200)\\\", \\\"14:30\\\"],\\r\\n                    [271, 0, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"],\\r\\n                    [301, 1, \\\"RGB(200,200,200)\\\", \\\"15:30\\\"],\\r\\n                    [331, 1, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"]\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [60, 1, \\\"RGB(200,200,200)\\\", \\\"10:30\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"11:30\\\"],\\r\\n                    [211, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [271, 0, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"],\\r\\n                    [331, 1, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"]\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"09:30\\\"],\\r\\n                    [151, 0, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [331, 1, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"]\\r\\n                ],\\r\\n\\r\\n            Count: 332,\\r\\n            MiddleCount: 151,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 450) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        };\\r\\n\\r\\n    //美股走势图时间刻度\\r\\n    const USA_MINUTE_X_COORDINATE =\\r\\n        {\\r\\n            /*\\r\\n        Full:   //完整模式\\r\\n        [\\r\\n            [0, 0, \\\"rgb(200,200,200)\\\", \\\"21:30\\\"],\\r\\n            [60, 0, \\\"RGB(200,200,200)\\\", \\\"22:30\\\"],\\r\\n            [120, 1, \\\"RGB(200,200,200)\\\", \\\"23:30\\\"],\\r\\n            [210, 0, \\\"RGB(200,200,200)\\\", \\\"01:00\\\"],\\r\\n            [270, 0, \\\"RGB(200,200,200)\\\", \\\"02:00\\\"],\\r\\n            [330, 0, \\\"RGB(200,200,200)\\\", \\\"03:00\\\"],\\r\\n            [390, 0, \\\"RGB(200,200,200)\\\", \\\"04:00\\\"],\\r\\n        ],\\r\\n        Simple: //简洁模式\\r\\n        [\\r\\n            [0, 0, \\\"rgb(200,200,200)\\\", \\\"21:30\\\"],\\r\\n            [160, 1, \\\"RGB(200,200,200)\\\", \\\"00:00\\\"],\\r\\n            [270, 0, \\\"RGB(200,200,200)\\\", \\\"02:00\\\"],\\r\\n            [390, 0, \\\"RGB(200,200,200)\\\", \\\"04:00\\\"],\\r\\n        ],\\r\\n        Min:   //最小模式\\r\\n        [\\r\\n            [0, 0, \\\"rgb(200,200,200)\\\", \\\"21:30\\\"],\\r\\n            [160, 1, \\\"RGB(200,200,200)\\\", \\\"00:00\\\"],\\r\\n            [390, 0, \\\"RGB(200,200,200)\\\", \\\"04:00\\\"],\\r\\n        ],\\r\\n        */\\r\\n\\r\\n            //美国本地时间\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 0, \\\"rgb(200,200,200)\\\", \\\"9:30\\\"],\\r\\n                    [30, 0, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [90, 1, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    [150, 0, \\\"RGB(200,200,200)\\\", \\\"12:00\\\"],\\r\\n                    [210, 0, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [270, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [330, 0, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"],\\r\\n                    [390, 0, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"],\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [30, 0, \\\"rgb(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [150, 1, \\\"RGB(200,200,200)\\\", \\\"12:00\\\"],\\r\\n                    [270, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [390, 0, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"],\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [30, 0, \\\"rgb(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [210, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [390, 0, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"],\\r\\n                ],\\r\\n\\r\\n            Count: 391,\\r\\n            MiddleCount: 211,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 400) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        };\\r\\n\\r\\n    //富时中国\\r\\n    const FTSE_MINUTE_X_COORDINATE=\\r\\n        {\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"17:00\\\"],\\r\\n                    //[60, 0, \\\"RGB(200,200,200)\\\", \\\"18:00\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"19:00\\\"],\\r\\n                    //[180, 0, \\\"RGB(200,200,200)\\\", \\\"20:00\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"21:00\\\"],\\r\\n                    //[300, 0, \\\"RGB(200,200,200)\\\", \\\"22:00\\\"],\\r\\n                    [360, 1, \\\"RGB(200,200,200)\\\", \\\"23:00\\\"],\\r\\n                    //[420, 0, \\\"RGB(200,200,200)\\\", \\\"00:00\\\"],\\r\\n                    [480, 1, \\\"RGB(200,200,200)\\\", \\\"01:00\\\"],\\r\\n                    //[540, 0, \\\"RGB(200,200,200)\\\", \\\"02:00\\\"],\\r\\n                    [600, 1, \\\"RGB(200,200,200)\\\", \\\"03:00\\\"],\\r\\n                    //[660, 1, \\\"RGB(200,200,200)\\\", \\\"04:00\\\"],\\r\\n                    [706, 1, \\\"RGB(200,200,200)\\\", \\\"09:00\\\"],\\r\\n                    //[766, 1, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [826, 1, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    //[886, 1, \\\"RGB(200,200,200)\\\", \\\"12:00\\\"],\\r\\n                    [946, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    //[1006, 1, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [1066, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"],\\r\\n                    [1156, 1, \\\"RGB(200,200,200)\\\", \\\"16:30\\\"],\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"17:00\\\"],\\r\\n                    //[60, 0, \\\"RGB(200,200,200)\\\", \\\"18:00\\\"],\\r\\n                    //[120, 1, \\\"RGB(200,200,200)\\\", \\\"19:00\\\"],\\r\\n                    //[180, 0, \\\"RGB(200,200,200)\\\", \\\"20:00\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"21:00\\\"],\\r\\n                    //[300, 0, \\\"RGB(200,200,200)\\\", \\\"22:00\\\"],\\r\\n                    //[360, 1, \\\"RGB(200,200,200)\\\", \\\"23:30\\\"],\\r\\n                    //[420, 0, \\\"RGB(200,200,200)\\\", \\\"00:00\\\"],\\r\\n                    [480, 1, \\\"RGB(200,200,200)\\\", \\\"01:00\\\"],\\r\\n                    //[540, 0, \\\"RGB(200,200,200)\\\", \\\"02:00\\\"],\\r\\n                    //[600, 1, \\\"RGB(200,200,200)\\\", \\\"03:00\\\"],\\r\\n                    //[660, 1, \\\"RGB(200,200,200)\\\", \\\"04:00\\\"],\\r\\n                    [706, 1, \\\"RGB(200,200,200)\\\", \\\"09:00\\\"],\\r\\n                    //[766, 1, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    //[826, 1, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    //[886, 1, \\\"RGB(200,200,200)\\\", \\\"12:00\\\"],\\r\\n                    [946, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    //[1006, 1, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    //[1066, 1, \\\"RGB(200,200,200)\\\", \\\"15:00\\\"],\\r\\n                    [1156, 1, \\\"RGB(200,200,200)\\\", \\\"16:30\\\"],\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"17:00\\\"],\\r\\n                    [706, 1, \\\"RGB(200,200,200)\\\", \\\"09:00\\\"],\\r\\n                    [1156, 1, \\\"RGB(200,200,200)\\\", \\\"16:30\\\"],\\r\\n                ],\\r\\n\\r\\n            Count: 1157,\\r\\n            MiddleCount: 707,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 450) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        }\\r\\n\\r\\n    //港股指数期货\\r\\n    const FHK_MINUTE_X_COORDINATE=\\r\\n        {\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"17:15\\\"],\\r\\n                    [105, 1, \\\"RGB(200,200,200)\\\", \\\"19:00\\\"],\\r\\n                    [225, 1, \\\"RGB(200,200,200)\\\", \\\"21:00\\\"],\\r\\n                    [345, 1, \\\"RGB(200,200,200)\\\", \\\"23:00\\\"],\\r\\n                    [586, 0, \\\"RGB(200,200,200)\\\", \\\"09:15\\\"],\\r\\n                    [691, 1, \\\"RGB(200,200,200)\\\", \\\"11:00\\\"],\\r\\n                    [812, 1, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [963, 1, \\\"RGB(200,200,200)\\\", \\\"16:30\\\"],\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"17:15\\\"],\\r\\n                    [225, 1, \\\"RGB(200,200,200)\\\", \\\"21:00\\\"],\\r\\n                    [586, 0, \\\"RGB(200,200,200)\\\", \\\"09:15\\\"],\\r\\n                    [752, 1, \\\"RGB(200,200,200)\\\", \\\"13:00\\\"],\\r\\n                    [963, 1, \\\"RGB(200,200,200)\\\", \\\"16:30\\\"],\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"17:15\\\"],\\r\\n                    [586, 0, \\\"RGB(200,200,200)\\\", \\\"09:15\\\"],\\r\\n                    [963, 1, \\\"RGB(200,200,200)\\\", \\\"16:30\\\"],\\r\\n                ],\\r\\n\\r\\n            Count: 963,\\r\\n            MiddleCount: 526,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 450) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        }\\r\\n\\r\\n    //外汇\\r\\n    const FOREX_MINUTE_X_COORDINATE=\\r\\n        {\\r\\n            Full:   //完整模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"06:00\\\"],\\r\\n                    [120, 1, \\\"RGB(200,200,200)\\\", \\\"08:00\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [360, 1, \\\"RGB(200,200,200)\\\", \\\"12:00\\\"],\\r\\n                    [480, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [600, 1, \\\"RGB(200,200,200)\\\", \\\"16:00\\\"],\\r\\n                    [720, 1, \\\"RGB(200,200,200)\\\", \\\"18:00\\\"],\\r\\n                    [840, 1, \\\"RGB(200,200,200)\\\", \\\"20:00\\\"],\\r\\n                    [960, 1, \\\"RGB(200,200,200)\\\", \\\"22:00\\\"],\\r\\n                    [1080, 1, \\\"RGB(200,200,200)\\\", \\\"0:00\\\"],\\r\\n                    [1200, 1, \\\"RGB(200,200,200)\\\", \\\"02:00\\\"],\\r\\n                    [1320, 1, \\\"RGB(200,200,200)\\\", \\\"04:00\\\"],\\r\\n                ],\\r\\n            Simple: //简洁模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"06:00\\\"],\\r\\n                    [240, 1, \\\"RGB(200,200,200)\\\", \\\"10:00\\\"],\\r\\n                    [480, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [720, 1, \\\"RGB(200,200,200)\\\", \\\"18:00\\\"],\\r\\n                    [960, 1, \\\"RGB(200,200,200)\\\", \\\"22:00\\\"],\\r\\n                    [1200, 1, \\\"RGB(200,200,200)\\\", \\\"02:00\\\"],\\r\\n                ],\\r\\n            Min:   //最小模式\\r\\n                [\\r\\n                    [0, 1, \\\"RGB(200,200,200)\\\", \\\"06:00\\\"],\\r\\n                    [480, 0, \\\"RGB(200,200,200)\\\", \\\"14:00\\\"],\\r\\n                    [960, 1, \\\"RGB(200,200,200)\\\", \\\"22:00\\\"],\\r\\n                ],\\r\\n\\r\\n            Count: 1440,\\r\\n            MiddleCount: 600,\\r\\n\\r\\n            GetData: function (width)\\r\\n            {\\r\\n                if (width < 200) return this.Min;\\r\\n                else if (width < 450) return this.Simple;\\r\\n\\r\\n                return this.Full;\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n\\r\\n    this.GetCoordinateData = function (symbol, width)\\r\\n    {\\r\\n        var data = null;\\r\\n        if (!symbol)\\r\\n        {\\r\\n            data = SHZE_MINUTE_X_COORDINATE;    //默认沪深股票\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var upperSymbol = symbol.toLocaleUpperCase(); //转成大写\\r\\n            if (MARKET_SUFFIX_NAME.IsSH(upperSymbol) || MARKET_SUFFIX_NAME.IsSZ(upperSymbol) || MARKET_SUFFIX_NAME.IsSHSZIndex(upperSymbol))\\r\\n                data = this.GetSHSZData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol))\\r\\n                data=this.GetSHOData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsHK(upperSymbol))\\r\\n                data=this.GetHKData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol) || MARKET_SUFFIX_NAME.IsCZCE(upperSymbol) || MARKET_SUFFIX_NAME.IsDCE(upperSymbol) || MARKET_SUFFIX_NAME.IsSHFE(upperSymbol))\\r\\n                return this.GetChinatFuturesData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsUSA(upperSymbol))\\r\\n                data = this.GetUSAData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsFTSE(upperSymbol))\\r\\n                data=this.GetFTSEData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsFHK(upperSymbol))\\r\\n                data=this.GetFHKData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol))\\r\\n                data=this.GetForeignExchangeData(upperSymbol);\\r\\n            else if ((MARKET_SUFFIX_NAME.IsBIT(upperSymbol,width)))\\r\\n                data=this.GetBITData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsET(upperSymbol))\\r\\n                data=this.GetETData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol))\\r\\n                return  data=this.GetNYMEXData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsCOMEX(upperSymbol))\\r\\n                return  data=this.GetCOMEXData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsNYBOT(upperSymbol))\\r\\n                return  data=this.GetNYBOTData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsCBOT(upperSymbol))\\r\\n                return  data=this.GetCBOTData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsLME(upperSymbol))\\r\\n                return  data=this.GetLMEData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsTOCOM(upperSymbol))\\r\\n                return  data=this.GetTOCOMData(upperSymbol,width);\\r\\n            else if (MARKET_SUFFIX_NAME.IsIPE(upperSymbol))\\r\\n                return  data=this.GetIPEData(upperSymbol,width);\\r\\n\\r\\n        }\\r\\n\\r\\n        //JSConsole.Chart.Log('[MiuteCoordinateData]', width);\\r\\n        var result = { Count: data.Count, MiddleCount: data.MiddleCount, Data: data.GetData(width) };\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetSHSZData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=SHZE_MINUTE_X_COORDINATE;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetUSAData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=USA_MINUTE_X_COORDINATE;\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetHKData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=HK_MINUTE_X_COORDINATE;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetSHOData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=SHO_MINUTE_X_COORDINATE;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetFuturesData = function (upperSymbol,width,timeData)\\r\\n    {\\r\\n        var splitData = timeData.GetSplitData(upperSymbol);\\r\\n        if (!splitData) return null;\\r\\n        var stringData = g_MinuteTimeStringData.GetFutures(splitData);\\r\\n        if (!stringData) return null;\\r\\n        var result = { Count: stringData.length };\\r\\n        var coordinate=null;\\r\\n        var minWidth=200, simpleWidth=480;\\r\\n        /*\\r\\n        if (splitData.Name =='21:00-1:00,9:00-10:15,10:30-11:30,13:30-15:00')\\r\\n        {\\r\\n            minWidth=250;\\r\\n            simpleWidth=500;\\r\\n        }\\r\\n        */\\r\\n\\r\\n        if (width < minWidth) coordinate = splitData.Coordinate.Min;\\r\\n        else if (width < simpleWidth) coordinate = splitData.Coordinate.Simple;\\r\\n        else coordinate = splitData.Coordinate.Full;\\r\\n\\r\\n        var data=[];\\r\\n        for(var i=0;i<stringData.length;++i)\\r\\n        {\\r\\n            var value = stringData[i];\\r\\n            for(var j=0;j<coordinate.length;++j)\\r\\n            {\\r\\n                var coordinateItem = coordinate[j];\\r\\n                if (value == coordinateItem.Value)\\r\\n                {\\r\\n                    var item = [i, 0, 'RGB(200,200,200)', coordinateItem.Text];\\r\\n                    data.push(item);\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        result.Data = data;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetChinatFuturesData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_FuturesTimeData);\\r\\n    }\\r\\n\\r\\n    this.GetNYMEXData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_NYMEXTimeData);\\r\\n    }\\r\\n\\r\\n    this.GetCOMEXData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_COMEXTimeData);\\r\\n    }\\r\\n\\r\\n    this.GetNYBOTData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_NYBOTTimeData);\\r\\n    }\\r\\n\\r\\n    this.GetCBOTData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_CBOTTimeData);\\r\\n    }\\r\\n\\r\\n    this.GetLMEData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_LMETimeData);\\r\\n    }\\r\\n\\r\\n    this.GetTOCOMData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_TOCOMTimeData);\\r\\n    }\\r\\n\\r\\n    this.GetIPEData=function(upperSymbol,width)\\r\\n    {\\r\\n        return this.GetFuturesData(upperSymbol,width, g_IPETimeData);\\r\\n    }\\r\\n\\r\\n    this.GetFTSEData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=FTSE_MINUTE_X_COORDINATE;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetFHKData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=FHK_MINUTE_X_COORDINATE;\\r\\n        return result\\r\\n    }\\r\\n\\r\\n    this.GetForeignExchangeData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=FOREX_MINUTE_X_COORDINATE;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetBITData=function(upperSymbol,width)\\r\\n    {\\r\\n        var result=FOREX_MINUTE_X_COORDINATE;   //先用外汇的吧\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetETData=function(upperSymbol,width)\\r\\n    {\\r\\n        throw {Name:'MinuteCoordinateData::GetETData', Error:'not implement'};\\r\\n    }\\r\\n}\\r\\n\\r\\n//国内期货不同品种 交易时间数据\\r\\nfunction FuturesTimeData()\\r\\n{\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            //ID=0 9:00-10:15,10:31-11:30,13:31-15:00\\r\\n            {\\r\\n                Name:'9:00-10:15,10:31-11:30,13:31-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        //9:00-10:15,10:30-11:30,13:30-15:00\\r\\n                        { Start: 900, End: 1015 },\\r\\n                        { Start: 1031, End: 1130 },\\r\\n                        { Start: 1331, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            //ID=1 9:30-11:30,13:01-15:15\\r\\n            {\\r\\n\\r\\n                Name:'9:30-11:30,13:01-15:15',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 930, End: 1130 },\\r\\n                        { Start: 1301, End: 1515 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1515, Text: '15:15' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1515, Text: '15:15' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1515, Text: '15:15' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            //ID=2 '9:30-11:30,13:01-15:00'\\r\\n            {\\r\\n                Name:'9:30-11:30,13:00-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 930, End: 1130 },\\r\\n                        { Start: 1301, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            {\\r\\n                Name:'21:00-23:30,9:00-10:15,10:30-11:30,13:30-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 2100, End: 2330 },\\r\\n                        { Start: 901, End: 1015 },\\r\\n                        { Start: 1031, End: 1130 },\\r\\n                        { Start: 1331, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1031, Text: '10:30' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=4 21:00-1:00,9:01-10:15,10:31-11:30,13:31-15:00\\r\\n            {\\r\\n                Name:'21:00-1:00,9:01-10:15,10:31-11:30,13:31-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 2100, End: 2359 },\\r\\n                        { Start: 0, End: 100 },\\r\\n                        { Start: 901, End: 1015 },\\r\\n                        { Start: 1031, End: 1130 },\\r\\n                        { Start: 1331, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1031, Text: '10:30' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1031, Text: '10:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=5 21:00-2:30,9:01-10:15,10:31-11:30,13:31-15:00\\r\\n            {\\r\\n                Name:'21:00-2:30,9:01-10:15,10:31-11:30,13:31-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 2100, End: 2359 },\\r\\n                        { Start: 0, End: 230 },\\r\\n                        { Start: 901, End: 1015 },\\r\\n                        { Start: 1031, End: 1130 },\\r\\n                        { Start: 1331, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1031, Text: '10:30' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID:6 21:00-23:00,9:01-10:15,10:30-11:30,13:31-15:00\\r\\n            {\\r\\n                Name:'21:00-23:00,9:01-10:15,10:30-11:30,13:31-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 2100, End: 2300 },\\r\\n                        { Start: 901, End: 1015 },\\r\\n                        { Start: 1031, End: 1130 },\\r\\n                        { Start: 1331, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            {\\r\\n\\r\\n                Name:'9:00-11:30,13:00-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 1130 },\\r\\n                        { Start: 1300, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            {\\r\\n                Name:'21:00-23:00,9:00-10:15,10:30-11:30,13:30-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 2100, End: 2300 },\\r\\n                        { Start: 900, End: 1015 },\\r\\n                        { Start: 1030, End: 1130 },\\r\\n                        { Start: 1330, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1331, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=9 9:01-10:15,10:31-11:30,13:31-15:00\\r\\n            {\\r\\n                Name:'9:01-10:15,10:31-11:30,13:31-15:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        //9:01-10:15,10:31-11:30,13:31-15:00\\r\\n                        { Start: 901, End: 1015 },\\r\\n                        { Start: 1031, End: 1130 },\\r\\n                        { Start: 1331, End: 1500 }\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 930, Text: '9:30' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1030, Text: '10:30' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1430, Text: '14:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 901, Text: '9:00' },\\r\\n                                { Value: 1330, Text: '13:30' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ];\\r\\n\\r\\n    this.MAP_TWOWORDS=new Map([\\r\\n        //大连商品交易所\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-JD', {Time:0,Decimal:0,Name:\\\"鸡蛋\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-FB', {Time:0,Decimal:2,Name:\\\"纤板\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-BB', {Time:0,Decimal:2,Name:\\\"胶板\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-PP', {Time:6,Decimal:0,Name:\\\"丙烯\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-JM', {Time:6,Decimal:1,Name:'焦煤'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-EG', {Time:6,Decimal:0,Name:'乙二醇'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-EB', {Time:6,Decimal:0,Name:'苯乙烯'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-CS', {Time:6,Decimal:0,Name:'淀粉'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-PG', {Time:6,Decimal:0,Name:'液化气'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-RR', {Time:6,Decimal:0,Name:'梗米'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-LH', {Time:0,Decimal:0,Name:'生猪'}],\\r\\n\\r\\n        //上期所\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-CU', {Time:4,Decimal:0,Name:\\\"铜\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-AL', {Time:4,Decimal:0,Name:\\\"铝\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-NI', {Time:4,Decimal:0,Name:\\\"镍\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-SN', {Time:4,Decimal:0,Name:'沪锡'}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-ZN', {Time:4,Decimal:0,Name:\\\"沪锌\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-PB', {Time:4,Decimal:0,Name:'沪铅'}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-RU', {Time:6,Decimal:0,Name:\\\"天然橡胶\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-FU', {Time:6,Decimal:0,Name:\\\"燃料油\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-RB', {Time:6,Decimal:0,Name:\\\"螺纹钢\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-BU', {Time:6,Decimal:0,Name:'石油沥青'}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-HC', {Time:6,Decimal:0,Name:\\\"热轧卷板\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-SP', {Time:6,Decimal:0,Name:\\\"纸浆\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-WR', {Time:0,Decimal:0,Name:\\\"线材\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-AG', {Time:5,Decimal:0,Name:\\\"白银\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-AU', {Time:5,Decimal:2,Name:\\\"黄金\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-SS', {Time:4,Decimal:0,Name:'不锈钢'}],\\r\\n\\r\\n        //上期所-能源\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-NR', {Time:6,Decimal:1,Name:'20号胶'}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-SC', {Time:5,Decimal:1,Name:'原油'}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-LU', {Time:6,Decimal:0,Name:'低硫燃油'}],\\r\\n        [MARKET_SUFFIX_NAME.SHFE + '-BC', {Time:4,Decimal:0,Name:'国际铜'}],\\r\\n\\r\\n        //郑州期货交易所\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-CF', {Time:6,Decimal:0,Name:\\\"棉花\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-SR', {Time:6,Decimal:0,Name:\\\"白糖\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-MA', {Time:6,Decimal:0,Name:\\\"甲醇\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-ZC', {Time:6,Decimal:1,Name:'动力煤'}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-TA', {Time:6,Decimal:0,Name:\\\"精对苯二甲酸(PTA)\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-RM', {Time:6,Decimal:0,Name:'菜籽粕'}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-OI', {Time:6,Decimal:0,Name:\\\"菜籽油\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-ME', {Time:3,Decimal:0,Name:\\\"甲醇(老)\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-FG', {Time:6,Decimal:0,Name:'平板玻璃'}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-WS', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-WT', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-GN', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-RO', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-RS', {Time:0,Decimal:0,Name:\\\"菜籽\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-ER', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-RI', {Time:0,Decimal:0,Name:\\\"早籼稻\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-WH', {Time:0,Decimal:0,Name:\\\"强麦\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-AP', {Time:0,Decimal:0,Name:\\\"苹果\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-PM', {Time:0,Decimal:0,Name:\\\"普麦\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-QM', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-TC', {Time:0,Decimal:0}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-JR', {Time:0,Decimal:0,Name:\\\"粳稻\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-LR', {Time:0,Decimal:0,Name:\\\"晚籼稻\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-SF', {Time:0,Decimal:0,Name:\\\"硅铁\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-SM', {Time:0,Decimal:0,Name:\\\"锰硅\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-CJ', {Time:0,Decimal:2, Name:\\\"红枣\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-CY', {Time:6,Decimal:0, Name:\\\"棉纱\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-UR', {Time:0,Decimal:0, Name:\\\"尿素\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-SA', {Time:6,Decimal:0, Name:\\\"纯碱\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-PF', {Time:6,Decimal:0, Name:\\\"短纤\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CZCE + '-PK', {Time:0,Decimal:0, Name:\\\"花生\\\"}],\\r\\n\\r\\n\\r\\n        //中期所\\r\\n        [MARKET_SUFFIX_NAME.CFFEX + '-TF', {Time:1,Decimal:3,Name:\\\"二债\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CFFEX + '-TS', {Time:1,Decimal:3,Name:\\\"五债\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.CFFEX + '-IH', {Time:2,Decimal:1,Name:'上证股指期货'}],\\r\\n        [MARKET_SUFFIX_NAME.CFFEX + '-IC', {Time:2,Decimal:1,Name:'中证股指期货'}],\\r\\n        [MARKET_SUFFIX_NAME.CFFEX + '-IF', {Time:2,Decimal:1,Name:'沪深股指期货'}],\\r\\n    ]);\\r\\n\\r\\n    this.MAP_ONEWORD=new Map([\\r\\n        //大连商品交易所\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-C', {Time:6,Decimal:0,Name:\\\"玉米\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-L', {Time:6,Decimal:0,Name:\\\"乙烯\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-V', {Time:6,Decimal:0,Name:\\\"PVC\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-A', {Time:6,Decimal:0,Name:\\\"豆一\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-B', {Time:6,Decimal:0,Name:\\\"豆二\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-M', {Time:6,Decimal:0,Name:\\\"豆粕\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-Y', {Time:6,Decimal:0,Name:\\\"豆油\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-P', {Time:6,Decimal:0,Name:\\\"棕榈\\\"}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-J', {Time:6,Decimal:1,Name:'焦炭'}],\\r\\n        [MARKET_SUFFIX_NAME.DCE + '-I', {Time:6,Decimal:1,Name:\\\"铁矿\\\"}],\\r\\n        //中期所\\r\\n        [MARKET_SUFFIX_NAME.CFFEX + '-T', {Time:1,Decimal:3,Name:\\\"十债\\\"}],\\r\\n    ]);\\r\\n\\r\\n    //添加新品种\\r\\n    this.AddNewFutures=function(obj)    //{ Suffix:后缀, Symbol:品种代码, Time:交易时间段, Decimal:小数位数, Name:名字 }\\r\\n    {\\r\\n        if (!obj) return;\\r\\n\\r\\n        var key=obj.Suffix+'-'+obj.Symbol;\\r\\n        var item={ Time:obj.Time, Decimal:obj.Decimal, Name:obj.Name };\\r\\n        if (obj.Symbol.length==1)\\r\\n        {\\r\\n            this.MAP_ONEWORD.set(key, item);\\r\\n        }\\r\\n        else if (obj.Symbol.length==2)\\r\\n        {\\r\\n            this.MAP_TWOWORDS.set(key, item);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetData=function(upperSymbol)\\r\\n    {\\r\\n        var oneWord = upperSymbol.charAt(0);\\r\\n        var twoWords = upperSymbol.substr(0,2);\\r\\n        var oneWordName = null, twoWordsName=null;\\r\\n\\r\\n        if (MARKET_SUFFIX_NAME.IsDCE(upperSymbol))  //大连商品交易所\\r\\n        {\\r\\n            oneWordName = MARKET_SUFFIX_NAME.DCE+'-'+oneWord;\\r\\n            twoWordsName = MARKET_SUFFIX_NAME.DCE + '-' + twoWords;\\r\\n        }\\r\\n        else if (MARKET_SUFFIX_NAME.IsSHFE(upperSymbol))  //上期所\\r\\n        {\\r\\n            oneWordName = MARKET_SUFFIX_NAME.SHFE + '-' + oneWord;\\r\\n            twoWordsName = MARKET_SUFFIX_NAME.SHFE + '-' + twoWords;\\r\\n        }\\r\\n        else if (MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol))  //中期所\\r\\n        {\\r\\n            oneWordName = MARKET_SUFFIX_NAME.CFFEX + '-' + oneWord;\\r\\n            twoWordsName = MARKET_SUFFIX_NAME.CFFEX + '-' + twoWords;\\r\\n        }\\r\\n        else if (MARKET_SUFFIX_NAME.IsCZCE(upperSymbol))  //郑州期货交易所\\r\\n        {\\r\\n            oneWordName = MARKET_SUFFIX_NAME.CZCE + '-' + oneWord;\\r\\n            twoWordsName = MARKET_SUFFIX_NAME.CZCE + '-' + twoWords;\\r\\n        }\\r\\n\\r\\n        if (this.MAP_TWOWORDS.has(twoWordsName))\\r\\n        {\\r\\n            return this.MAP_TWOWORDS.get(twoWordsName);\\r\\n        }\\r\\n\\r\\n        if (this.MAP_ONEWORD.has(oneWordName))\\r\\n        {\\r\\n            return this.MAP_ONEWORD.get(oneWordName);\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetSplitData = function (upperSymbol)\\r\\n    {\\r\\n        var data=this.GetData(upperSymbol);\\r\\n        if (!data) return null;\\r\\n\\r\\n        return this.TIME_SPLIT[data.Time];\\r\\n    }\\r\\n\\r\\n    this.GetDecimal=function(upperSymbol)\\r\\n    {\\r\\n        var data=this.GetData(upperSymbol);\\r\\n        if (!data) return 2;\\r\\n\\r\\n        return data.Decimal;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n//纽约商业交易所 交易时间数据\\r\\nfunction NYMEXTimeData()\\r\\n{\\r\\n    //美国标准时间\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            {\\r\\n                Name:'6:00-5:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        //6:00 - 5:00\\r\\n                        { Start: 600, End: 2359 },\\r\\n                        { Start: 0, End: 500 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' },\\r\\n                                { Value: 400, Text: '4:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                //{ Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                //{ Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                //{ Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                //{ Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                //{ Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                                //{ Value: 400, Text: '4:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    //美国夏时令\\r\\n    this.TIME_SPLIT2=\\r\\n        [\\r\\n            {\\r\\n                Name:'7:00-6:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        //6:00 - 5:00\\r\\n                        { Start: 700, End: 2359 },\\r\\n                        { Start: 0, End: 600 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                //{ Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                //{ Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                //{ Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                //{ Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                //{ Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                                //{ Value: 500, Text: '5:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"CL\\\", Decimal:2, Time:0, Name:\\\"原油\\\"}, //原油\\r\\n            { Symbol:\\\"NG\\\", Decimal:3, Time:0, Name:\\\"天然气\\\" }, //天然气\\r\\n            { Symbol:\\\"RB\\\", Decimal:4, Time:0, Name:\\\"汽油\\\" }, //汽油\\r\\n            { Symbol:\\\"PL\\\", Decimal:1, Time:0, Name:\\\"铂金\\\" }, //铂金\\r\\n            { Symbol:\\\"PA\\\", Decimal:2, Time:0, Name:\\\"钯金\\\" }, //钯金\\r\\n            { Symbol:\\\"HR\\\", Decimal:0, Time:0, Name:\\\"热轧钢卷\\\" }, //热轧钢卷\\r\\n            { Symbol:\\\"QM\\\", Decimal:3, Time:0, Name:\\\"迷你原油\\\" }, //迷你原油\\r\\n            { Symbol:\\\"HO\\\", Decimal:4, Time:0, Name:\\\"燃油\\\"}, //燃油\\r\\n        ]\\r\\n\\r\\n    this.MarketSuffix=\\\".NYMEX\\\";\\r\\n    this.TimeType=0; // 0=标准时间 1=夏令时间 2=美国时间\\r\\n\\r\\n    this.GetFuturesInfo=function(upperSymbol)\\r\\n    {\\r\\n        if (upperSymbol.indexOf(this.MarketSuffix)<=0) return null;\\r\\n\\r\\n        for(var i in this.FUTURES_LIST)\\r\\n        {\\r\\n            var item=this.FUTURES_LIST[i];\\r\\n            if (upperSymbol.indexOf(item.Symbol)==0)\\r\\n            {\\r\\n                return item;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetSplitData=function(upperSymbol)\\r\\n    {\\r\\n        //夏令和标准时间切换\\r\\n        var timeSplit=this.TimeType==0 ? this.TIME_SPLIT : this.TIME_SPLIT2;\\r\\n        var find=this.GetFuturesInfo(upperSymbol);\\r\\n        if (find) return timeSplit[find.Time];\\r\\n\\r\\n        return timeSplit[0];\\r\\n    }\\r\\n\\r\\n    this.GetDecimal=function(upperSymbol)\\r\\n    {\\r\\n        var find=this.GetFuturesInfo(upperSymbol);\\r\\n        if (find) return find.Decimal;\\r\\n\\r\\n        return 3;\\r\\n    }\\r\\n\\r\\n    this.GetMarketStatus=function(upperSymbol) // 0=闭市 1=盘前 2=盘中 3=盘后\\r\\n    {\\r\\n        var usaDate=GetLocalTime(-4);   //需要转成美国时间的 周6 周日\\r\\n        var nowDate= new Date();\\r\\n        var day = usaDate.getDay();\\r\\n        var time = nowDate.getHours() * 100 + nowDate.getMinutes();\\r\\n        if(day == 6 || day== 0) return 0;   //周末\\r\\n        if(time>430 && time<730) return 1;\\r\\n\\r\\n        return 2;\\r\\n    }\\r\\n\\r\\n    this.AddNewFutures=function(obj) //{ Symbol:品种代码, Time:时间id, Decimal:小数位数, Name:名字 }\\r\\n    {\\r\\n        if (!obj) return;\\r\\n\\r\\n        var newItem={ Symbol:obj.Symbol, Time:obj.Time, Decimal:obj.Decimal, Name:obj.Name };\\r\\n        for(var i=0;i<this.FUTURES_LIST.length;++i)\\r\\n        {\\r\\n            var item=this.FUTURES_LIST[i];\\r\\n            if (item.Symbol==newItem.Symbol)\\r\\n            {\\r\\n                this.FUTURES_LIST[i]=newItem;\\r\\n                return;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.FUTURES_LIST.push(newItem);\\r\\n    }\\r\\n}\\r\\n\\r\\n//纽约金属交易所（COMEX）\\r\\nfunction COMEXTimeData()\\r\\n{\\r\\n    this.newMethod=NYMEXTimeData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"GC\\\", Decimal:1, Time:0, Name:\\\"COMEX黄金\\\"}, //COMEX黄金\\r\\n            { Symbol:\\\"QO\\\", Decimal:2, Time:0, Name:\\\"迷你黄金\\\" }, //迷你黄金\\r\\n            { Symbol:\\\"MG\\\", Decimal:1, Time:0, Name:\\\"微型黄金\\\" }, //微型黄金\\r\\n            { Symbol:\\\"QI\\\", Decimal:4, Time:0, Name:\\\"迷你白银\\\" }, //迷你白银\\r\\n            { Symbol:\\\"SI\\\", Decimal:3, Time:0, Name:\\\"COMEX白银\\\" }, //COMEX白银\\r\\n            { Symbol:\\\"HG\\\", Decimal:4, Time:0, Name:\\\"COMEX铜\\\" }  //COMEX铜\\r\\n        ]\\r\\n\\r\\n    this.MarketSuffix=\\\".COMEX\\\";\\r\\n}\\r\\n\\r\\n//纽约期货交易所（ICEUS-NYBOT）\\r\\nfunction NYBOTTimeData()\\r\\n{\\r\\n    this.newMethod=NYMEXTimeData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    //美国标准时间\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            {\\r\\n                Name:'9:00-2:20',\\r\\n                Data:\\r\\n                    [\\r\\n                        //9:00-2:20\\r\\n                        { Start: 900, End: 2359 },\\r\\n                        { Start: 0, End: 220 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                //{ Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                //{ Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            {\\r\\n                Name:'15:30-1:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        //9:00-2:20\\r\\n                        { Start: 1530, End: 2359 },\\r\\n                        { Start: 0, End: 100 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                //{ Value: 1600, Text: '17:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                //{ Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                //{ Value: 100, Text: '1:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    //美国夏时令\\r\\n    this.TIME_SPLIT2=\\r\\n        [\\r\\n            {\\r\\n                Name:'10:00-3:20',\\r\\n                Data:\\r\\n                    [\\r\\n                        //9:00-2:20\\r\\n                        { Start: 1000, End: 2359 },\\r\\n                        { Start: 0, End: 320 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                //{ Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                //{ Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                //{ Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                //{ Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            {\\r\\n                Name:'16:30-2:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 1630, End: 2359 },\\r\\n                        { Start: 0, End: 200 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 100, Text: '1:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1800, Text: '18:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                //{ Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2200, Text: '22:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                //{ Value: 0, Text: '0:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                                //{ Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"SB\\\", Decimal:2, Time:1 }, //11号白糖\\r\\n            { Symbol:\\\"CT\\\", Decimal:2, Time:0 }, //棉花\\r\\n            //{ Symbol:\\\"KC\\\", Decimal:2, Time:0 }, //咖啡\\r\\n            //{ Symbol:\\\"DX\\\", Decimal:2, Time:0 }, //美元指数\\r\\n            //{ Symbol:\\\"CC\\\", Decimal:2, Time:0 }  //可可\\r\\n        ]\\r\\n\\r\\n    this.MarketSuffix=\\\".NYBOT\\\";\\r\\n\\r\\n    this.GetMarketStatus=function(upperSymbol) // 0=闭市 1=盘前 2=盘中 3=盘后\\r\\n    {\\r\\n        var usaDate=GetLocalTime(-4);   //需要转成美国时间的 周6 周日\\r\\n        var day = usaDate.getDay();\\r\\n        var time = usaDate.getHours() * 100 + usaDate.getMinutes();\\r\\n        if(day == 6 || day== 0) return 0;   //周末\\r\\n\\r\\n        var find=this.GetFuturesInfo(upperSymbol);\\r\\n        if (!find) return 2;\\r\\n\\r\\n        if (find.Symbol==\\\"SB\\\")  //Sugar No. 11 Futures 03:30 - 13:00\\r\\n        {\\r\\n            if (time>300 && time<1400) return 2;\\r\\n        }\\r\\n        else if (find.Symbol==\\\"CT\\\") //美棉 21:00-14:20\\r\\n        {\\r\\n            if( (time>=0 && time<=1500 ) || (time>=2000 && time<=2359) ) return 2;\\r\\n            return 1;\\r\\n        }\\r\\n\\r\\n        return 0;\\r\\n    }\\r\\n}\\r\\n\\r\\n//芝加哥期货交易所\\r\\nfunction CBOTTimeData()\\r\\n{\\r\\n    this.newMethod=NYMEXTimeData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    //标准时间\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            //ID=0 8:00-2:20\\r\\n            {\\r\\n                Name:'8:00-2:20',\\r\\n                Data:\\r\\n                    [\\r\\n                        //6:00 - 5:00\\r\\n                        { Start: 800, End: 2359 },\\r\\n                        { Start: 0, End: 220 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                //{ Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                //{ Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                //{ Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                //{ Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' }\\r\\n                                //{ Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            //ID=1 8:00-2:45\\r\\n            {\\r\\n                Name:'8:00-2:45',\\r\\n                Data:\\r\\n                    [\\r\\n                        //6:00 - 5:00\\r\\n                        { Start: 800, End: 2359 },\\r\\n                        { Start: 0, End: 245 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                //{ Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                //{ Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                //{ Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                //{ Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' }\\r\\n                                //{ Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            //ID=2 6:00-5:00\\r\\n            {\\r\\n                Name:'6:00-5:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        //6:00 - 5:00\\r\\n                        { Start: 600, End: 2359 },\\r\\n                        { Start: 0, End: 500 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' },\\r\\n                                { Value: 400, Text: '4:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                //{ Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                //{ Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                //{ Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                //{ Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                //{ Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                                //{ Value: 400, Text: '4:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=3 08:00-20:45 21:31-02:20\\r\\n            {\\r\\n                Name:'08:00-20:45 21:31-02:20',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 800, End: 2045 },\\r\\n                        { Start: 2131, End: 2359 },\\r\\n                        { Start: 0, End: 220 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                //{ Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                //{ Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                //{ Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                //{ Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' }\\r\\n                                //{ Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=4 8:00-20:45 21:31-2:45\\r\\n            {\\r\\n                Name:'8:00-2:45',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 800, End: 2045 },\\r\\n                        { Start: 2131, End: 2359 },\\r\\n                        { Start: 0, End: 245 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                //{ Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                //{ Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                //{ Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                //{ Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' }\\r\\n                                //{ Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=5 06:00-04:15 04:31-05:00\\r\\n            {\\r\\n                Name:'06:00-04:15 04:31-05:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 600, End: 2359 },\\r\\n                        { Start: 0, End: 415 },\\r\\n                        { Start: 431, End: 500 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' },\\r\\n                                { Value: 400, Text: '4:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                //{ Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                //{ Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                //{ Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                //{ Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                //{ Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                                //{ Value: 400, Text: '4:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    //夏令时间\\r\\n    this.TIME_SPLIT2=\\r\\n        [\\r\\n            //ID=0 9:00-3:20\\r\\n            {\\r\\n                Name:'9:00-3:20',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 2359 },\\r\\n                        { Start: 0, End: 320 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                //{ Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                //{ Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' }\\r\\n                                //{ Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            //ID=1 9:00-3:45\\r\\n            {\\r\\n                Name:'9:00-3:45',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 2359 },\\r\\n                        { Start: 0, End: 345 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                //{ Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                //{ Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' }\\r\\n                                //{ Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n            //ID=2 7:00-6:00\\r\\n            {\\r\\n                Name:'7:00-6:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 700, End: 2359 },\\r\\n                        { Start: 0, End: 600 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                //{ Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                //{ Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                //{ Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                //{ Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                //{ Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                                //{ Value: 500, Text: '5:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=3 09:00-21:45 22:31-03:20\\r\\n            {\\r\\n                Name:'09:00-21:45 22:31-03:20',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 2145 },\\r\\n                        { Start: 2231, End: 2359 },\\r\\n                        { Start: 0, End: 320 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                //{ Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                //{ Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' }\\r\\n                                //{ Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=4 09:00-21:45 22:31-03:45\\r\\n            {\\r\\n                Name:'09:00-21:45 22:31-03:45',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 2145 },\\r\\n                        { Start: 2231, End: 2359 },\\r\\n                        { Start: 0, End: 345 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                //{ Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                //{ Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' }\\r\\n                                //{ Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            },\\r\\n\\r\\n            //ID=5 07:00-05:15 05:31-06:00\\r\\n            {\\r\\n                Name:'07:00-05:15 05:31-06:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 700, End: 2359 },\\r\\n                        { Start: 0, End: 515 },\\r\\n                        { Start: 531, End: 600 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                //{ Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                //{ Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                //{ Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                //{ Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                //{ Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                                //{ Value: 500, Text: '5:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 700, Text: '7:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 500, Text: '5:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"ZC\\\", Decimal:2, Time:0, Name:\\\"玉米\\\" }, //玉米\\r\\n            { Symbol:\\\"XC\\\", Decimal:2, Time:1, Name:\\\"迷你玉米\\\" }, //迷你玉米\\r\\n            { Symbol:\\\"ZS\\\", Decimal:2, Time:0, Name:'大豆' }, //大豆\\r\\n            { Symbol:\\\"XK\\\", Decimal:2, Time:1, Name:\\\"迷你大豆\\\" }, //迷你大豆\\r\\n            { Symbol:\\\"ZL\\\", Decimal:2, Time:0, Name:\\\"豆油\\\"}, //豆油\\r\\n            { Symbol:\\\"ZR\\\", Decimal:2, Time:0, Name:\\\"稻谷\\\" }, //稻谷\\r\\n            { Symbol:\\\"ZO\\\", Decimal:2, Time:0, Name:\\\"燕麦\\\" }, //燕麦\\r\\n            { Symbol:\\\"ZW\\\", Decimal:2, Time:0, Name:'小麦'}, //小麦\\r\\n            { Symbol:\\\"XW\\\", Decimal:2, Time:1, Name:\\\"迷你小麦\\\" }, //迷你小麦\\r\\n            { Symbol:\\\"ZM\\\", Decimal:1, Time:0, Name:\\\"豆粕\\\" }, //豆粕\\r\\n\\r\\n            { Symbol:\\\"EH\\\", Decimal:3, Time:2 }, //乙醇\\r\\n\\r\\n            { Symbol:\\\"YM\\\", Decimal:0, Time:2, Name:\\\"小型道指\\\"}, //小型道指\\r\\n            { Symbol:\\\"ES\\\", Decimal:2, Time:2, Name:\\\"小型标普\\\" }, //小型标普\\r\\n            { Symbol:\\\"NQ\\\", Decimal:2, Time:2, Name:\\\"小型纳指\\\" }, //小型纳指\\r\\n\\r\\n            { Symbol:\\\"TY\\\", Decimal:4, Time:2, Name:\\\"10年美国债\\\" }, //10年美国债\\r\\n            { Symbol:\\\"TU\\\", Decimal:4, Time:2, Name:\\\"2年美国债\\\" }, //2年美国债\\r\\n            { Symbol:\\\"FV\\\", Decimal:4, Time:2, Name:\\\"5年美国债\\\" }, //5年美国债\\r\\n            { Symbol:\\\"US\\\", Decimal:4, Time:2, Name:\\\"30年美国债\\\" }, //30年美国债\\r\\n            { Symbol:\\\"UL\\\", Decimal:4, Time:2, Name:\\\"超国债\\\" }, //超国债\\r\\n        ]\\r\\n\\r\\n    this.MarketSuffix=\\\".CBOT\\\";\\r\\n}\\r\\n\\r\\n//伦敦金属交易所 LME\\r\\nfunction LMETimeData()\\r\\n{\\r\\n    this.newMethod=NYMEXTimeData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    //标准时间\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            {\\r\\n                Name:'LME 9:00-3:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 2359 },\\r\\n                        { Start: 0, End: 300 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                //{ Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                //{ Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                //{ Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                //{ Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' }\\r\\n                                // { Value: 300, Text: '3:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 300, Text: '3:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    //夏令\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            {\\r\\n                Name:'LME 8:00-2:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 800, End: 2359 },\\r\\n                        { Start: 0, End: 200 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                //{ Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                //{ Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                //{ Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                //{ Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' }\\r\\n                                //{ Value: 200, Text: '2:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 200, Text: '2:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"SN\\\", Decimal:0, Time:0, Name:\\\"LME锡\\\" }, //综合锡03\\r\\n            { Symbol:\\\"AH\\\", Decimal:2, Time:0, Name:\\\"LME铝\\\" }, //综合铝03\\r\\n            { Symbol:\\\"PB\\\", Decimal:2, Time:0, Name:\\\"LME铅\\\" }, //综合铅03\\r\\n            { Symbol:\\\"ZS\\\", Decimal:2, Time:0, Name:\\\"LME锌\\\" }, //综合锌03\\r\\n            { Symbol:\\\"CA\\\", Decimal:2, Time:0, Name:\\\"LME铜\\\" }, //综合铜03\\r\\n            { Symbol:\\\"NI\\\", Decimal:0, Time:0, Name:\\\"LME镍\\\" }, //综合镍03\\r\\n        ]\\r\\n\\r\\n    this.MarketSuffix=\\\".LME\\\";\\r\\n}\\r\\n\\r\\n//东京商品交易所（TOCOM）\\r\\nfunction TOCOMTimeData()\\r\\n{\\r\\n    this.newMethod=NYMEXTimeData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.TimeType=0;\\r\\n\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            //ID=0 15:30-04:30 07:46-14:15\\r\\n            {\\r\\n                Name:'15:30-04:30 07:46-14:15',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 1530,  End: 2359},\\r\\n                        { Start: 0,     End: 430 },\\r\\n                        { Start: 746,   End: 1415 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 1530, Text: '15:30' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' },\\r\\n                                { Value: 430, Text: '4:30' },\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1415, Text: '14:15' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 1530, Text: '15:30' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 100, Text: '1:00' },\\r\\n                                { Value: 430, Text: '4:30' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1415, Text: '14:15' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 1530, Text: '15:30' },\\r\\n                                { Value: 100, Text: '1:00' },\\r\\n                                { Value: 1415, Text: '14:15' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ];\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"JRV\\\", Decimal:0, Time:0, Name:\\\"东京TSR20橡胶\\\" },\\r\\n            { Symbol:\\\"JPL\\\", Decimal:0, Time:0, Name:\\\"东京铂金\\\" },\\r\\n            { Symbol:\\\"JAU\\\", Decimal:0, Time:0, Name:\\\"东京黄金\\\" },\\r\\n            { Symbol:\\\"JCO\\\", Decimal:0, Time:0, Name:\\\"中东原油\\\" },\\r\\n            { Symbol:\\\"JRU\\\", Decimal:1, Time:0, Name:\\\"东京RSS3橡胶橡胶\\\" },\\r\\n            { Symbol:\\\"JAG\\\", Decimal:1, Time:0, Name:\\\"日白银\\\" } ,\\r\\n            { Symbol:\\\"JPA\\\", Decimal:1, Time:0, Name:\\\"日钯金\\\" }\\r\\n        ]\\r\\n\\r\\n    this.MarketSuffix=\\\".TOCOM\\\";\\r\\n}\\r\\n\\r\\n//美国洲际交易所（ICE EUROPE）\\r\\nfunction IPETimeData()\\r\\n{\\r\\n    this.newMethod=NYMEXTimeData;   //派生\\r\\n    this.newMethod();\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.MarketSuffix=\\\".IPE\\\";\\r\\n\\r\\n    //美国标准时间\\r\\n    this.TIME_SPLIT=\\r\\n        [\\r\\n            //ID=0 8:00-6:00\\r\\n            {\\r\\n                Name:'8:00-6:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 800, End: 2359 },\\r\\n                        { Start: 0, End: 600 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1000, Text: '10:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1400, Text: '14:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 1800, Text: '18:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 2200, Text: '22:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 200, Text: '2:00' },\\r\\n                                { Value: 400, Text: '4:00' },\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 1200, Text: '12:00' },\\r\\n                                { Value: 1600, Text: '16:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 0, Text: '0:00' },\\r\\n                                { Value: 400, Text: '4:00' },\\r\\n                                { Value: 600, Text: '6:00' },\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 800, Text: '8:00' },\\r\\n                                { Value: 2000, Text: '20:00' },\\r\\n                                { Value: 600, Text: '6:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    //美国夏时令\\r\\n    this.TIME_SPLIT2=\\r\\n        [\\r\\n            //ID=0 09:00-07:00\\r\\n            {\\r\\n                Name:'09:00-07:00',\\r\\n                Data:\\r\\n                    [\\r\\n                        { Start: 900, End: 2359 },\\r\\n                        { Start: 0, End: 700 },\\r\\n                    ],\\r\\n                Coordinate:\\r\\n                    {\\r\\n                        Full://完整模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1100, Text: '11:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1500, Text: '15:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 1900, Text: '19:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 2300, Text: '23:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 300, Text: '3:00' },\\r\\n                                { Value: 500, Text: '5:00' },\\r\\n                                { Value: 700, Text: '7:00' }\\r\\n                            ],\\r\\n                        Simple: //简洁模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 1300, Text: '13:00' },\\r\\n                                { Value: 1700, Text: '17:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 1, Text: '1:00' },\\r\\n                                { Value: 500, Text: '5:00' },\\r\\n                                { Value: 700, Text: '7:00' }\\r\\n                            ],\\r\\n                        Min:   //最小模式\\r\\n                            [\\r\\n                                { Value: 900, Text: '9:00' },\\r\\n                                { Value: 2100, Text: '21:00' },\\r\\n                                { Value: 700, Text: '7:00' }\\r\\n                            ]\\r\\n                    }\\r\\n            }\\r\\n        ]\\r\\n\\r\\n    this.FUTURES_LIST=\\r\\n        [\\r\\n            { Symbol:\\\"RC\\\", Decimal:2, Time:0, Name:\\\"罗布斯塔咖啡\\\" },\\r\\n            { Symbol:\\\"W\\\", Decimal:2, Time:0, Name:\\\"白糖\\\" },\\r\\n            { Symbol:\\\"C\\\", Decimal:2, Time:0, Name:\\\"伦敦可可\\\" },\\r\\n            { Symbol:\\\"R\\\", Decimal:2, Time:0, Name:\\\"长期英国国债\\\" },\\r\\n            { Symbol:\\\"L\\\", Decimal:2, Time:0, Name:\\\"3个月英镑利率\\\" },\\r\\n            { Symbol:\\\"T\\\", Decimal:2, Time:0, Name:\\\"WTI原油\\\" },\\r\\n            { Symbol:\\\"G\\\", Decimal:2, Time:0, Name:\\\"低硫柴油\\\" },\\r\\n            { Symbol:\\\"B\\\", Decimal:2, Time:0, Name:\\\"布伦特原油\\\" }\\r\\n        ]\\r\\n}\\r\\n\\r\\nvar g_MinuteTimeStringData = new MinuteTimeStringData();\\r\\nvar g_MinuteCoordinateData = new MinuteCoordinateData();\\r\\nvar g_FuturesTimeData = new FuturesTimeData();\\r\\nvar g_NYMEXTimeData=new NYMEXTimeData();\\r\\nvar g_COMEXTimeData=new COMEXTimeData();\\r\\nvar g_NYBOTTimeData=new NYBOTTimeData();\\r\\nvar g_CBOTTimeData=new CBOTTimeData();\\r\\nvar g_LMETimeData=new LMETimeData();\\r\\nvar g_TOCOMTimeData=new TOCOMTimeData();\\r\\nvar g_IPETimeData=new IPETimeData();\\r\\n\\r\\n\\r\\nfunction GetfloatPrecision(symbol)  //获取小数位数\\r\\n{\\r\\n    var defaultfloatPrecision=2;    //默认2位\\r\\n    if (!symbol) return defaultfloatPrecision;\\r\\n    var upperSymbol=symbol.toUpperCase();\\r\\n\\r\\n    //全部由外部控制\\r\\n    if (typeof(MARKET_SUFFIX_NAME.GetCustomDecimal)=='function') return MARKET_SUFFIX_NAME.GetCustomDecimal(upperSymbol);\\r\\n\\r\\n    if (MARKET_SUFFIX_NAME.IsSHSZFund(upperSymbol)) defaultfloatPrecision=3;    //基金3位小数\\r\\n    else if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol)) defaultfloatPrecision=MARKET_SUFFIX_NAME.GetSHODecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsChinaFutures(upperSymbol)) defaultfloatPrecision=g_FuturesTimeData.GetDecimal(upperSymbol);  //期货小数位数读配置\\r\\n    else if (MARKET_SUFFIX_NAME.IsFHK(upperSymbol)) defaultfloatPrecision=MARKET_SUFFIX_NAME.GetFHKDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsFTSE(upperSymbol)) defaultfloatPrecision=MARKET_SUFFIX_NAME.GetFTSEDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsBIT(upperSymbol)) defaultfloatPrecision=MARKET_SUFFIX_NAME.GetBITDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsET(upperSymbol)) defaultfloatPrecision=MARKET_SUFFIX_NAME.GetETDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol)) defaultfloatPrecision=MARKET_SUFFIX_NAME.GetForeignExchangeDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol)) defaultfloatPrecision=g_NYMEXTimeData.GetDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsCOMEX(upperSymbol)) defaultfloatPrecision=g_COMEXTimeData.GetDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsNYBOT(upperSymbol)) defaultfloatPrecision=g_NYBOTTimeData.GetDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsCBOT(upperSymbol)) defaultfloatPrecision=g_CBOTTimeData.GetDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsLME(upperSymbol)) defaultfloatPrecision=g_LMETimeData.GetDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsTOCOM(upperSymbol)) defaultfloatPrecision=g_TOCOMTimeData.GetDecimal(upperSymbol);\\r\\n    else if (MARKET_SUFFIX_NAME.IsIPE(upperSymbol)) defaultfloatPrecision=g_IPETimeData.GetDecimal(upperSymbol);\\r\\n    else defaultfloatPrecision=MARKET_SUFFIX_NAME.GetDefaultDecimal(upperSymbol);\\r\\n\\r\\n    return defaultfloatPrecision;\\r\\n}\\r\\n\\r\\n//把不连续的分时数据转成连续的分时数据\\r\\nfunction GenerateMinuteStockJsonData(data)\\r\\n{\\r\\n    var stock =\\r\\n        {\\r\\n            symbol:data.symbol, name:data.name,time:data.time, date:data.date,\\r\\n            price:data.price, open:data.open, yclose:data.yclose, high:data.high, low:data.low, vol:data.vol,amount:data.amount,\\r\\n            minute:[]\\r\\n        };\\r\\n\\r\\n    var mapMinute=new Map();\\r\\n    for(var i in data.minute)\\r\\n    {\\r\\n        var item=data.minute[i];\\r\\n        mapMinute.set(item.time,item);\\r\\n    }\\r\\n\\r\\n    var timeData=g_MinuteTimeStringData.GetTimeData(stock.symbol);\\r\\n    for(var i in timeData)  //根据交易时间产生数据\\r\\n    {\\r\\n        var time=timeData[i];\\r\\n        var minuteItem={ time:time, vaild:false };\\r\\n        if (mapMinute.has(time))\\r\\n        {\\r\\n            var find=mapMinute.get(time);\\r\\n            minuteItem.vaild=true;\\r\\n            minuteItem.price=find.price;\\r\\n            minuteItem.open=find.open;\\r\\n            minuteItem.high=find.high;\\r\\n            minuteItem.low=find.low;\\r\\n            minuteItem.avprice=find.avprice;\\r\\n            minuteItem.vol=find.vol;\\r\\n            minuteItem.amount=find.amount;\\r\\n            if (IFrameSplitOperator.IsNumber(find.increase)) minuteItem.increase=find.increase;\\r\\n            if (IFrameSplitOperator.IsNumber(find.risefall)) minuteItem.risefall=find.risefall;\\r\\n            if (IFrameSplitOperator.IsNumber(find.position)) minuteItem.position=find.position;\\r\\n        }\\r\\n        stock.minute.push(minuteItem);\\r\\n    }\\r\\n\\r\\n    var vaildCount=0;\\r\\n    for(var i=stock.minute.length-1;i>=0;--i)\\r\\n    {\\r\\n        vaildCount=i+1;\\r\\n        var item=stock.minute[i];\\r\\n        if (item.vaild==true) break;\\r\\n    }\\r\\n\\r\\n    stock.minute=stock.minute.slice(0,vaildCount);  //去掉最后无用的数据\\r\\n\\r\\n    return stock;\\r\\n}\\r\\n\\r\\nfunction GetLocalTime(i)    //得到标准时区的时间的函数\\r\\n{\\r\\n    if (typeof i !== 'number') return;\\r\\n    var d = new Date();\\r\\n    //得到1970年一月一日到现在的秒数\\r\\n    var len = d.getTime();\\r\\n    //本地时间与GMT时间的时间偏移差\\r\\n    var offset = d.getTimezoneOffset() * 60000;\\r\\n    //得到现在的格林尼治时间\\r\\n    var utcTime = len + offset;\\r\\n    return new Date(utcTime + 3600000 * i);\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n   Copyright (c) 2018 jones\\r\\n\\r\\n    http://www.apache.org/licenses/LICENSE-2.0\\r\\n\\r\\n   开源项目 https://github.com/jones2000/HQChart\\r\\n\\r\\n   jones_2000@163.com\\r\\n\\r\\n   分析家语法编译执行器 (H5版本)\\r\\n*/\\r\\n\\r\\n//日志输出类\\r\\nif (!JSConsole)\\r\\n{\\r\\n    var JSConsole=\\r\\n        {\\r\\n            Chart:{ Log:console.log, Warn:console.warn },      //图形日志\\r\\n            Complier:{ Log:console.log, Warn:console.warn }    //编译器日志\\r\\n        };\\r\\n}\\r\\n\\r\\n//API默认地址\\r\\nvar g_JSComplierResource=\\r\\n    {\\r\\n        Domain : \\\"https://opensource.zealink.com\\\",               //API域名\\r\\n        CacheDomain : \\\"https://opensourcecache.zealink.com\\\",      //缓存域名\\r\\n\\r\\n        DrawIcon:\\r\\n            {\\r\\n                Family:'iconfont',\\r\\n                Data:new Map([\\r\\n                    [1, { Text:'\\\\ue660', Color:'rgb(243,28,15)'}],    //向上箭头\\r\\n                    [2, { Text:'\\\\ue661', Color:'rgb(87,247,41)'}],    //向下箭头\\r\\n                    [3, { Text:'\\\\ue662', Color:'rgb(237,153,0)'}],\\r\\n                    [4, { Text:'\\\\ue663', Color:'rgb(237,153,0)'}],\\r\\n                    [5, { Text:'\\\\ue664', Color:'rgb(237,153,0)'}],\\r\\n                    [6, { Text:'\\\\ue665', Color:'rgb(140,57,208)'}],\\r\\n                    [7, { Text:'\\\\ue666', Color:'rgb(246,135,37)'}],\\r\\n                    [8, { Text:'\\\\ue667', Color:'rgb(85,231,56)'}],\\r\\n                    [9, { Text:'\\\\ue668', Color:'rgb(227,61,41)'}],\\r\\n\\r\\n                    [10, { Text:'\\\\ue669', Color:'rgb(216,78,48)'}],\\r\\n                    [11, { Text:'\\\\ue66a', Color:'rgb(249,187,0)'}],    //点赞\\r\\n                    [12, { Text:'\\\\ue66b', Color:'rgb(249,187,0)'}],\\r\\n                    [13, { Text:'\\\\ue66c', Color:'rgb(216,42,0)'}],\\r\\n                    [14, { Text:'\\\\ue66d', Color:'rgb(58,90,236)'}],\\r\\n                    [15, { Text:'\\\\ue66e', Color:'rgb(227,149,0)'}],\\r\\n                    [16, { Text:'\\\\ue66f', Color:'rgb(208,82,78)'}],\\r\\n                    [17, { Text:'\\\\ue670', Color:'rgb(234,114,26)'}],\\r\\n                    [18, { Text:'\\\\ue671', Color:'rgb(116,25,255)'}],\\r\\n                    [19, { Text:'\\\\ue672', Color:'rgb(102,9,11)'}],\\r\\n\\r\\n                    [20, { Text:'\\\\ue673', Color:'rgb(127,125,137)'}],\\r\\n                    [21, { Text:'\\\\ue674', Color:'rgb(110,188,255)'}],\\r\\n                    [22, { Text:'\\\\ue675', Color:'rgb(238,79,51)'}],\\r\\n                    [23, { Text:'\\\\ue676', Color:'rgb(244,71,0)'}],\\r\\n                    [24, { Text:'\\\\ue677', Color:'rgb(102,183,248)'}],\\r\\n                    [25, { Text:'\\\\ue678', Color:'rgb(234,88,231)'}],\\r\\n                    [26, { Text:'\\\\ue679', Color:'rgb(242,171,0)'}],\\r\\n                    [27, { Text:'\\\\ue67a', Color:'rgb(87,247,168)'}],\\r\\n                    [28, { Text:'\\\\ue67b', Color:'rgb(97,204,113)'}],\\r\\n                    [29, { Text:'\\\\ue67c', Color:'rgb(84,115,193)'}],\\r\\n\\r\\n                    [30, { Text:'\\\\ue67d', Color:'rgb(141,51,255)'}],\\r\\n                    [31, { Text:'\\\\ue67e', Color:'rgb(200,126,24)'}],\\r\\n                    [32, { Text:'\\\\ue67f', Color:'rgb(195,41,32)'}],\\r\\n                    [33, { Text:'\\\\ue68f', Color:'rgb(215,85,194)'}],\\r\\n                    [34, { Text:'\\\\ue690', Color:'rgb(250,222,105)'}],\\r\\n                    [35, { Text:'\\\\ue691', Color:'rgb(112,249,224)'}],\\r\\n                    [36, { Text:'\\\\ue692', Color:'rgb(217,107,98)'}],\\r\\n                    [37, { Text:'\\\\ue693', Color:'rgb(114,231,17)'}],\\r\\n                    [38, { Text:'\\\\ue694', Color:'rgb(238,31,25)'}],\\r\\n                    [39, { Text:'\\\\ue695', Color:'rgb(92,247,113)'}],\\r\\n\\r\\n                    [40, { Text:'\\\\ue696', Color:'rgb(175,175,175)'}],\\r\\n                    [41, { Text:'\\\\ue697', Color:'rgb(252,228,23)'}],\\r\\n                    [42, { Text:'\\\\ue698', Color:'rgb(88,195,235)'}],\\r\\n                    [43, { Text:'\\\\ue699', Color:'rgb(55,74,94)'}],\\r\\n                    [44, { Text:'\\\\ue69a', Color:'rgb(248,175,33)'}],\\r\\n                    [45, { Text:'\\\\ue69b', Color:'rgb(194,180,112)'}],\\r\\n                    [46, { Text:'\\\\ue69c', Color:'rgb(50,153,28)'}],\\r\\n                    [47, { Text:'\\\\ue69d', Color:'rgb(17,65,152)'}],\\r\\n                    [48, { Text:'\\\\ue69e', Color:'rgb(194,55,26)'}],\\r\\n                    [49, { Text:'\\\\ue69f', Color:'rgb(243,0,0)'}],\\r\\n\\r\\n                    /*\\r\\n            [11,{ Text:'\\\\ue624', Color:'rgb(245,159,40)'}],\\r\\n            [12,{ Text:'\\\\ue600', Color:'rgb(245,159,40)'}],\\r\\n            [13,{Text:'\\\\ue70f',Color:'rgb(209,37,35)'}, ],      //B\\r\\n            [14,{Text:'\\\\ue64c',Color:'rgb(127,209,59)'} ],      //S\\r\\n            [9, {Text:'\\\\ue626',Color:'rgb(245,159,40)'} ],      //$\\r\\n            [36,{Text:'\\\\ue68c',Color:'rgb(255,106,106)'} ],     //关闭 红色\\r\\n            [37,{Text:'\\\\ue68c',Color:'rgb(46,139,87)'} ],       //关闭 绿色\\r\\n            [38,{Text:'\\\\ue68d',Color:'rgb(238,44,44)'} ],       //▲\\r\\n            [39,{Text:'\\\\ue68e',Color:'rgb(0,139,69)'} ],        //▼\\r\\n            [46,{Text:'\\\\ue64d',Color:'rgb(51,51,51)'} ],        //message\\r\\n            */\\r\\n                ])\\r\\n            },\\r\\n\\r\\n        CustomDrawIcon:\\r\\n            {\\r\\n                Data:new Map()  //自定义图标 key=id\\r\\n                                //value={ID:, Text:, Color, Family: }   //svg\\r\\n                                //value={ ID:1, Symbol:'↑', Color:'rgb(238,44,44)' } //文字\\r\\n            },\\r\\n\\r\\n        CustomFunction: //定制函数\\r\\n            {\\r\\n                Data:new Map()  //自定义函数 key=函数名, Value:{ID:函数名, Callback: }\\r\\n            },\\r\\n\\r\\n        CustomVariant:  //自定义变量\\r\\n            {\\r\\n                Data:new Map()  //自定义函数 key=变量名, Value:{ Name:变量名, Description:描述信息 }\\r\\n            },\\r\\n\\r\\n        GetDrawIcon:function(id)\\r\\n        {\\r\\n            var icon;\\r\\n            if (g_JSComplierResource.CustomDrawIcon.Data.has(id))\\r\\n            {\\r\\n                const iconfont=g_JSComplierResource.CustomDrawIcon.Data.get(id);\\r\\n                if (iconfont.Symbol)    //文字\\r\\n                    icon={ Symbol:iconfont.Symbol, Color:iconfont.Color, IconFont:false, ID:id };\\r\\n                else    //SVG图标\\r\\n                    icon={ Symbol:iconfont.Text, Color:iconfont.Color, Family:iconfont.Family, IconFont:true, ID:id };\\r\\n                return icon;\\r\\n            }\\r\\n\\r\\n            if (g_JSComplierResource.DrawIcon.Data.has(id))\\r\\n            {\\r\\n                const iconfont=g_JSComplierResource.DrawIcon.Data.get(id);\\r\\n                icon={ Symbol:iconfont.Text, Color:iconfont.Color, Family:g_JSComplierResource.DrawIcon.Family, IconFont:true, ID:id };\\r\\n                return icon;\\r\\n            }\\r\\n\\r\\n            return null;\\r\\n        },\\r\\n\\r\\n        GetDrawTextIcon:function(id)\\r\\n        {\\r\\n            //图标对应的字符代码\\r\\n            let mapIcon=new Map([\\r\\n                [1,{Symbol:'↑',Color:'rgb(238,44,44)'} ],[2,{Symbol:'↓',Color:'rgb(0,139,69)'} ],\\r\\n                [3,{Symbol:'😧'} ],[4,{Symbol:'😨'} ],[5,{Symbol:'😁'} ],[6,{Symbol:'😱'} ],\\r\\n                [7,{Symbol:'B',Color:'rgb(238,44,44)'} ],[8,{Symbol:'S',Color:'rgb(0,139,69)'} ],\\r\\n                [9,{Symbol:'💰'} ],[10,{Symbol:'📪'} ],[11,{Symbol:'👆'} ],[12,{Symbol:'👇'} ],\\r\\n                [13,{Symbol:'B',Color:'rgb(178,34,34)'}, ],[14,{Symbol:'S',Color:'rgb(0,139,69)'} ],\\r\\n                [36,{Symbol:'Χ',Color:'rgb(238,44,44)'} ],[37,{Symbol:'X',Color:'rgb(0,139,69)'} ],\\r\\n                [38,{Symbol:'▲',Color:'rgb(238,44,44)'} ],[39,{Symbol:'▼',Color:'rgb(0,139,69)'} ],\\r\\n                [40,{Symbol:'◉',Color:'rgb(238,44,44)'}], [41,{Symbol:'◈',Color:'rgb(238,44,44)'}],\\r\\n                [42,{Symbol:'📌'}], [43,{Symbol:'💎'}], [44,{Symbol:'🥇'}],[45,{Symbol:'🥈'}],[46,{Symbol:'🥉'}],[47,{Symbol:'🏅'}]\\r\\n            ]);\\r\\n\\r\\n            var icon=mapIcon.get(id);\\r\\n            return icon;\\r\\n        },\\r\\n\\r\\n        IsCustomFunction:function(name)\\r\\n        {\\r\\n            if (g_JSComplierResource.CustomFunction.Data.has(name)) return true;\\r\\n            return false;\\r\\n        },\\r\\n\\r\\n        IsCustomVariant:function(name)\\r\\n        {\\r\\n            if (g_JSComplierResource.CustomVariant.Data.has(name)) return true;\\r\\n            return false;\\r\\n        }\\r\\n    }\\r\\n\\r\\nvar Messages = {\\r\\n    BadGetterArity: 'Getter must not have any formal parameters',\\r\\n    BadSetterArity: 'Setter must have exactly one formal parameter',\\r\\n    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',\\r\\n    ConstructorIsAsync: 'Class constructor may not be an async method',\\r\\n    ConstructorSpecialMethod: 'Class constructor may not be an accessor',\\r\\n    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',\\r\\n    DefaultRestParameter: 'Unexpected token =',\\r\\n    DuplicateBinding: 'Duplicate binding %0',\\r\\n    DuplicateConstructor: 'A class may only have one constructor',\\r\\n    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',\\r\\n    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',\\r\\n    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',\\r\\n    IllegalBreak: 'Illegal break statement',\\r\\n    IllegalContinue: 'Illegal continue statement',\\r\\n    IllegalExportDeclaration: 'Unexpected token',\\r\\n    IllegalImportDeclaration: 'Unexpected token',\\r\\n    IllegalLanguageModeDirective: 'Illegal \\\\'use strict\\\\' directive in function with non-simple parameter list',\\r\\n    IllegalReturn: 'Illegal return statement',\\r\\n    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',\\r\\n    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',\\r\\n    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\\r\\n    InvalidLHSInForIn: 'Invalid left-hand side in for-in',\\r\\n    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',\\r\\n    InvalidModuleSpecifier: 'Unexpected token',\\r\\n    InvalidRegExp: 'Invalid regular expression',\\r\\n    LetInLexicalBinding: 'let is disallowed as a lexically bound name',\\r\\n    MissingFromClause: 'Unexpected token',\\r\\n    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\\r\\n    NewlineAfterThrow: 'Illegal newline after throw',\\r\\n    NoAsAfterImportNamespace: 'Unexpected token',\\r\\n    NoCatchOrFinally: 'Missing catch or finally after try',\\r\\n    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',\\r\\n    Redeclaration: '%0 \\\\'%1\\\\' has already been declared',\\r\\n    StaticPrototype: 'Classes may not have static property named prototype',\\r\\n    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\\r\\n    StrictDelete: 'Delete of an unqualified identifier in strict mode.',\\r\\n    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',\\r\\n    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\\r\\n    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\\r\\n    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\\r\\n    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\\r\\n    StrictModeWith: 'Strict mode code may not include a with statement',\\r\\n    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\\r\\n    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\\r\\n    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\\r\\n    StrictReservedWord: 'Use of future reserved word in strict mode',\\r\\n    StrictVarName: 'Variable name may not be eval or arguments in strict mode',\\r\\n    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',\\r\\n    UnexpectedEOS: 'Unexpected end of input',\\r\\n    UnexpectedIdentifier: 'Unexpected identifier',\\r\\n    UnexpectedNumber: 'Unexpected number',\\r\\n    UnexpectedReserved: 'Unexpected reserved word',\\r\\n    UnexpectedString: 'Unexpected string',\\r\\n    UnexpectedTemplate: 'Unexpected quasi %0',\\r\\n    UnexpectedToken: 'Unexpected token %0',\\r\\n    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',\\r\\n    UnknownLabel: 'Undefined label \\\\'%0\\\\'',\\r\\n    UnterminatedRegExp: 'Invalid regular expression: missing /'\\r\\n};\\r\\n\\r\\nvar Regex = {\\r\\n    // Unicode v8.0.0 NonAsciiIdentifierStart:\\r\\n    NonAsciiIdentifierStart: /[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B4\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0AF9\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58-\\\\u0C5A\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D5F-\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F5\\\\u13F8-\\\\u13FD\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2118-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309B-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FD5\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA7AD\\\\uA7B0-\\\\uA7B7\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA8FD\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB65\\\\uAB70-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]|\\\\uD800[\\\\uDC00-\\\\uDC0B\\\\uDC0D-\\\\uDC26\\\\uDC28-\\\\uDC3A\\\\uDC3C\\\\uDC3D\\\\uDC3F-\\\\uDC4D\\\\uDC50-\\\\uDC5D\\\\uDC80-\\\\uDCFA\\\\uDD40-\\\\uDD74\\\\uDE80-\\\\uDE9C\\\\uDEA0-\\\\uDED0\\\\uDF00-\\\\uDF1F\\\\uDF30-\\\\uDF4A\\\\uDF50-\\\\uDF75\\\\uDF80-\\\\uDF9D\\\\uDFA0-\\\\uDFC3\\\\uDFC8-\\\\uDFCF\\\\uDFD1-\\\\uDFD5]|\\\\uD801[\\\\uDC00-\\\\uDC9D\\\\uDD00-\\\\uDD27\\\\uDD30-\\\\uDD63\\\\uDE00-\\\\uDF36\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF67]|\\\\uD802[\\\\uDC00-\\\\uDC05\\\\uDC08\\\\uDC0A-\\\\uDC35\\\\uDC37\\\\uDC38\\\\uDC3C\\\\uDC3F-\\\\uDC55\\\\uDC60-\\\\uDC76\\\\uDC80-\\\\uDC9E\\\\uDCE0-\\\\uDCF2\\\\uDCF4\\\\uDCF5\\\\uDD00-\\\\uDD15\\\\uDD20-\\\\uDD39\\\\uDD80-\\\\uDDB7\\\\uDDBE\\\\uDDBF\\\\uDE00\\\\uDE10-\\\\uDE13\\\\uDE15-\\\\uDE17\\\\uDE19-\\\\uDE33\\\\uDE60-\\\\uDE7C\\\\uDE80-\\\\uDE9C\\\\uDEC0-\\\\uDEC7\\\\uDEC9-\\\\uDEE4\\\\uDF00-\\\\uDF35\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF72\\\\uDF80-\\\\uDF91]|\\\\uD803[\\\\uDC00-\\\\uDC48\\\\uDC80-\\\\uDCB2\\\\uDCC0-\\\\uDCF2]|\\\\uD804[\\\\uDC03-\\\\uDC37\\\\uDC83-\\\\uDCAF\\\\uDCD0-\\\\uDCE8\\\\uDD03-\\\\uDD26\\\\uDD50-\\\\uDD72\\\\uDD76\\\\uDD83-\\\\uDDB2\\\\uDDC1-\\\\uDDC4\\\\uDDDA\\\\uDDDC\\\\uDE00-\\\\uDE11\\\\uDE13-\\\\uDE2B\\\\uDE80-\\\\uDE86\\\\uDE88\\\\uDE8A-\\\\uDE8D\\\\uDE8F-\\\\uDE9D\\\\uDE9F-\\\\uDEA8\\\\uDEB0-\\\\uDEDE\\\\uDF05-\\\\uDF0C\\\\uDF0F\\\\uDF10\\\\uDF13-\\\\uDF28\\\\uDF2A-\\\\uDF30\\\\uDF32\\\\uDF33\\\\uDF35-\\\\uDF39\\\\uDF3D\\\\uDF50\\\\uDF5D-\\\\uDF61]|\\\\uD805[\\\\uDC80-\\\\uDCAF\\\\uDCC4\\\\uDCC5\\\\uDCC7\\\\uDD80-\\\\uDDAE\\\\uDDD8-\\\\uDDDB\\\\uDE00-\\\\uDE2F\\\\uDE44\\\\uDE80-\\\\uDEAA\\\\uDF00-\\\\uDF19]|\\\\uD806[\\\\uDCA0-\\\\uDCDF\\\\uDCFF\\\\uDEC0-\\\\uDEF8]|\\\\uD808[\\\\uDC00-\\\\uDF99]|\\\\uD809[\\\\uDC00-\\\\uDC6E\\\\uDC80-\\\\uDD43]|[\\\\uD80C\\\\uD840-\\\\uD868\\\\uD86A-\\\\uD86C\\\\uD86F-\\\\uD872][\\\\uDC00-\\\\uDFFF]|\\\\uD80D[\\\\uDC00-\\\\uDC2E]|\\\\uD811[\\\\uDC00-\\\\uDE46]|\\\\uD81A[\\\\uDC00-\\\\uDE38\\\\uDE40-\\\\uDE5E\\\\uDED0-\\\\uDEED\\\\uDF00-\\\\uDF2F\\\\uDF40-\\\\uDF43\\\\uDF63-\\\\uDF77\\\\uDF7D-\\\\uDF8F]|\\\\uD81B[\\\\uDF00-\\\\uDF44\\\\uDF50\\\\uDF93-\\\\uDF9F]|\\\\uD82C[\\\\uDC00\\\\uDC01]|\\\\uD82F[\\\\uDC00-\\\\uDC6A\\\\uDC70-\\\\uDC7C\\\\uDC80-\\\\uDC88\\\\uDC90-\\\\uDC99]|\\\\uD835[\\\\uDC00-\\\\uDC54\\\\uDC56-\\\\uDC9C\\\\uDC9E\\\\uDC9F\\\\uDCA2\\\\uDCA5\\\\uDCA6\\\\uDCA9-\\\\uDCAC\\\\uDCAE-\\\\uDCB9\\\\uDCBB\\\\uDCBD-\\\\uDCC3\\\\uDCC5-\\\\uDD05\\\\uDD07-\\\\uDD0A\\\\uDD0D-\\\\uDD14\\\\uDD16-\\\\uDD1C\\\\uDD1E-\\\\uDD39\\\\uDD3B-\\\\uDD3E\\\\uDD40-\\\\uDD44\\\\uDD46\\\\uDD4A-\\\\uDD50\\\\uDD52-\\\\uDEA5\\\\uDEA8-\\\\uDEC0\\\\uDEC2-\\\\uDEDA\\\\uDEDC-\\\\uDEFA\\\\uDEFC-\\\\uDF14\\\\uDF16-\\\\uDF34\\\\uDF36-\\\\uDF4E\\\\uDF50-\\\\uDF6E\\\\uDF70-\\\\uDF88\\\\uDF8A-\\\\uDFA8\\\\uDFAA-\\\\uDFC2\\\\uDFC4-\\\\uDFCB]|\\\\uD83A[\\\\uDC00-\\\\uDCC4]|\\\\uD83B[\\\\uDE00-\\\\uDE03\\\\uDE05-\\\\uDE1F\\\\uDE21\\\\uDE22\\\\uDE24\\\\uDE27\\\\uDE29-\\\\uDE32\\\\uDE34-\\\\uDE37\\\\uDE39\\\\uDE3B\\\\uDE42\\\\uDE47\\\\uDE49\\\\uDE4B\\\\uDE4D-\\\\uDE4F\\\\uDE51\\\\uDE52\\\\uDE54\\\\uDE57\\\\uDE59\\\\uDE5B\\\\uDE5D\\\\uDE5F\\\\uDE61\\\\uDE62\\\\uDE64\\\\uDE67-\\\\uDE6A\\\\uDE6C-\\\\uDE72\\\\uDE74-\\\\uDE77\\\\uDE79-\\\\uDE7C\\\\uDE7E\\\\uDE80-\\\\uDE89\\\\uDE8B-\\\\uDE9B\\\\uDEA1-\\\\uDEA3\\\\uDEA5-\\\\uDEA9\\\\uDEAB-\\\\uDEBB]|\\\\uD869[\\\\uDC00-\\\\uDED6\\\\uDF00-\\\\uDFFF]|\\\\uD86D[\\\\uDC00-\\\\uDF34\\\\uDF40-\\\\uDFFF]|\\\\uD86E[\\\\uDC00-\\\\uDC1D\\\\uDC20-\\\\uDFFF]|\\\\uD873[\\\\uDC00-\\\\uDEA1]|\\\\uD87E[\\\\uDC00-\\\\uDE1D]/,\\r\\n    // Unicode v8.0.0 NonAsciiIdentifierPart:\\r\\n    NonAsciiIdentifierPart: /[\\\\xAA\\\\xB5\\\\xB7\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B4\\\\u08E3-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0AF9\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58-\\\\u0C5A\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D5F-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1369-\\\\u1371\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F5\\\\u13F8-\\\\u13FD\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19DA\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2118-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FD5\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA7AD\\\\uA7B0-\\\\uA7B7\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA8FD\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB65\\\\uAB70-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2F\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]|\\\\uD800[\\\\uDC00-\\\\uDC0B\\\\uDC0D-\\\\uDC26\\\\uDC28-\\\\uDC3A\\\\uDC3C\\\\uDC3D\\\\uDC3F-\\\\uDC4D\\\\uDC50-\\\\uDC5D\\\\uDC80-\\\\uDCFA\\\\uDD40-\\\\uDD74\\\\uDDFD\\\\uDE80-\\\\uDE9C\\\\uDEA0-\\\\uDED0\\\\uDEE0\\\\uDF00-\\\\uDF1F\\\\uDF30-\\\\uDF4A\\\\uDF50-\\\\uDF7A\\\\uDF80-\\\\uDF9D\\\\uDFA0-\\\\uDFC3\\\\uDFC8-\\\\uDFCF\\\\uDFD1-\\\\uDFD5]|\\\\uD801[\\\\uDC00-\\\\uDC9D\\\\uDCA0-\\\\uDCA9\\\\uDD00-\\\\uDD27\\\\uDD30-\\\\uDD63\\\\uDE00-\\\\uDF36\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF67]|\\\\uD802[\\\\uDC00-\\\\uDC05\\\\uDC08\\\\uDC0A-\\\\uDC35\\\\uDC37\\\\uDC38\\\\uDC3C\\\\uDC3F-\\\\uDC55\\\\uDC60-\\\\uDC76\\\\uDC80-\\\\uDC9E\\\\uDCE0-\\\\uDCF2\\\\uDCF4\\\\uDCF5\\\\uDD00-\\\\uDD15\\\\uDD20-\\\\uDD39\\\\uDD80-\\\\uDDB7\\\\uDDBE\\\\uDDBF\\\\uDE00-\\\\uDE03\\\\uDE05\\\\uDE06\\\\uDE0C-\\\\uDE13\\\\uDE15-\\\\uDE17\\\\uDE19-\\\\uDE33\\\\uDE38-\\\\uDE3A\\\\uDE3F\\\\uDE60-\\\\uDE7C\\\\uDE80-\\\\uDE9C\\\\uDEC0-\\\\uDEC7\\\\uDEC9-\\\\uDEE6\\\\uDF00-\\\\uDF35\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF72\\\\uDF80-\\\\uDF91]|\\\\uD803[\\\\uDC00-\\\\uDC48\\\\uDC80-\\\\uDCB2\\\\uDCC0-\\\\uDCF2]|\\\\uD804[\\\\uDC00-\\\\uDC46\\\\uDC66-\\\\uDC6F\\\\uDC7F-\\\\uDCBA\\\\uDCD0-\\\\uDCE8\\\\uDCF0-\\\\uDCF9\\\\uDD00-\\\\uDD34\\\\uDD36-\\\\uDD3F\\\\uDD50-\\\\uDD73\\\\uDD76\\\\uDD80-\\\\uDDC4\\\\uDDCA-\\\\uDDCC\\\\uDDD0-\\\\uDDDA\\\\uDDDC\\\\uDE00-\\\\uDE11\\\\uDE13-\\\\uDE37\\\\uDE80-\\\\uDE86\\\\uDE88\\\\uDE8A-\\\\uDE8D\\\\uDE8F-\\\\uDE9D\\\\uDE9F-\\\\uDEA8\\\\uDEB0-\\\\uDEEA\\\\uDEF0-\\\\uDEF9\\\\uDF00-\\\\uDF03\\\\uDF05-\\\\uDF0C\\\\uDF0F\\\\uDF10\\\\uDF13-\\\\uDF28\\\\uDF2A-\\\\uDF30\\\\uDF32\\\\uDF33\\\\uDF35-\\\\uDF39\\\\uDF3C-\\\\uDF44\\\\uDF47\\\\uDF48\\\\uDF4B-\\\\uDF4D\\\\uDF50\\\\uDF57\\\\uDF5D-\\\\uDF63\\\\uDF66-\\\\uDF6C\\\\uDF70-\\\\uDF74]|\\\\uD805[\\\\uDC80-\\\\uDCC5\\\\uDCC7\\\\uDCD0-\\\\uDCD9\\\\uDD80-\\\\uDDB5\\\\uDDB8-\\\\uDDC0\\\\uDDD8-\\\\uDDDD\\\\uDE00-\\\\uDE40\\\\uDE44\\\\uDE50-\\\\uDE59\\\\uDE80-\\\\uDEB7\\\\uDEC0-\\\\uDEC9\\\\uDF00-\\\\uDF19\\\\uDF1D-\\\\uDF2B\\\\uDF30-\\\\uDF39]|\\\\uD806[\\\\uDCA0-\\\\uDCE9\\\\uDCFF\\\\uDEC0-\\\\uDEF8]|\\\\uD808[\\\\uDC00-\\\\uDF99]|\\\\uD809[\\\\uDC00-\\\\uDC6E\\\\uDC80-\\\\uDD43]|[\\\\uD80C\\\\uD840-\\\\uD868\\\\uD86A-\\\\uD86C\\\\uD86F-\\\\uD872][\\\\uDC00-\\\\uDFFF]|\\\\uD80D[\\\\uDC00-\\\\uDC2E]|\\\\uD811[\\\\uDC00-\\\\uDE46]|\\\\uD81A[\\\\uDC00-\\\\uDE38\\\\uDE40-\\\\uDE5E\\\\uDE60-\\\\uDE69\\\\uDED0-\\\\uDEED\\\\uDEF0-\\\\uDEF4\\\\uDF00-\\\\uDF36\\\\uDF40-\\\\uDF43\\\\uDF50-\\\\uDF59\\\\uDF63-\\\\uDF77\\\\uDF7D-\\\\uDF8F]|\\\\uD81B[\\\\uDF00-\\\\uDF44\\\\uDF50-\\\\uDF7E\\\\uDF8F-\\\\uDF9F]|\\\\uD82C[\\\\uDC00\\\\uDC01]|\\\\uD82F[\\\\uDC00-\\\\uDC6A\\\\uDC70-\\\\uDC7C\\\\uDC80-\\\\uDC88\\\\uDC90-\\\\uDC99\\\\uDC9D\\\\uDC9E]|\\\\uD834[\\\\uDD65-\\\\uDD69\\\\uDD6D-\\\\uDD72\\\\uDD7B-\\\\uDD82\\\\uDD85-\\\\uDD8B\\\\uDDAA-\\\\uDDAD\\\\uDE42-\\\\uDE44]|\\\\uD835[\\\\uDC00-\\\\uDC54\\\\uDC56-\\\\uDC9C\\\\uDC9E\\\\uDC9F\\\\uDCA2\\\\uDCA5\\\\uDCA6\\\\uDCA9-\\\\uDCAC\\\\uDCAE-\\\\uDCB9\\\\uDCBB\\\\uDCBD-\\\\uDCC3\\\\uDCC5-\\\\uDD05\\\\uDD07-\\\\uDD0A\\\\uDD0D-\\\\uDD14\\\\uDD16-\\\\uDD1C\\\\uDD1E-\\\\uDD39\\\\uDD3B-\\\\uDD3E\\\\uDD40-\\\\uDD44\\\\uDD46\\\\uDD4A-\\\\uDD50\\\\uDD52-\\\\uDEA5\\\\uDEA8-\\\\uDEC0\\\\uDEC2-\\\\uDEDA\\\\uDEDC-\\\\uDEFA\\\\uDEFC-\\\\uDF14\\\\uDF16-\\\\uDF34\\\\uDF36-\\\\uDF4E\\\\uDF50-\\\\uDF6E\\\\uDF70-\\\\uDF88\\\\uDF8A-\\\\uDFA8\\\\uDFAA-\\\\uDFC2\\\\uDFC4-\\\\uDFCB\\\\uDFCE-\\\\uDFFF]|\\\\uD836[\\\\uDE00-\\\\uDE36\\\\uDE3B-\\\\uDE6C\\\\uDE75\\\\uDE84\\\\uDE9B-\\\\uDE9F\\\\uDEA1-\\\\uDEAF]|\\\\uD83A[\\\\uDC00-\\\\uDCC4\\\\uDCD0-\\\\uDCD6]|\\\\uD83B[\\\\uDE00-\\\\uDE03\\\\uDE05-\\\\uDE1F\\\\uDE21\\\\uDE22\\\\uDE24\\\\uDE27\\\\uDE29-\\\\uDE32\\\\uDE34-\\\\uDE37\\\\uDE39\\\\uDE3B\\\\uDE42\\\\uDE47\\\\uDE49\\\\uDE4B\\\\uDE4D-\\\\uDE4F\\\\uDE51\\\\uDE52\\\\uDE54\\\\uDE57\\\\uDE59\\\\uDE5B\\\\uDE5D\\\\uDE5F\\\\uDE61\\\\uDE62\\\\uDE64\\\\uDE67-\\\\uDE6A\\\\uDE6C-\\\\uDE72\\\\uDE74-\\\\uDE77\\\\uDE79-\\\\uDE7C\\\\uDE7E\\\\uDE80-\\\\uDE89\\\\uDE8B-\\\\uDE9B\\\\uDEA1-\\\\uDEA3\\\\uDEA5-\\\\uDEA9\\\\uDEAB-\\\\uDEBB]|\\\\uD869[\\\\uDC00-\\\\uDED6\\\\uDF00-\\\\uDFFF]|\\\\uD86D[\\\\uDC00-\\\\uDF34\\\\uDF40-\\\\uDFFF]|\\\\uD86E[\\\\uDC00-\\\\uDC1D\\\\uDC20-\\\\uDFFF]|\\\\uD873[\\\\uDC00-\\\\uDEA1]|\\\\uD87E[\\\\uDC00-\\\\uDE1D]|\\\\uDB40[\\\\uDD00-\\\\uDDEF]/\\r\\n}\\r\\n\\r\\nvar Character =\\r\\n    {\\r\\n        FromCodePoint: function (cp) {\\r\\n            return (cp < 0x10000) ? String.fromCharCode(cp) :\\r\\n                String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +\\r\\n                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));\\r\\n        },\\r\\n\\r\\n        //是否是空格 https://tc39.github.io/ecma262/#sec-white-space\\r\\n        IsWhiteSpace:function(cp)\\r\\n        {\\r\\n            return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||\\r\\n                (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);\\r\\n        },\\r\\n\\r\\n        //是否换行 https://tc39.github.io/ecma262/#sec-line-terminators\\r\\n        IsLineTerminator:function(cp)\\r\\n        {\\r\\n            return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);\\r\\n        },\\r\\n\\r\\n        // https://tc39.github.io/ecma262/#sec-names-and-keywords\\r\\n        IsIdentifierStart:function(cp)\\r\\n        {\\r\\n            return (cp === 0x24) || (cp === 0x5F) ||\\r\\n                (cp >= 0x41 && cp <= 0x5A) ||\\r\\n                (cp >= 0x61 && cp <= 0x7A) ||\\r\\n                (cp === 0x5C) ||\\r\\n                //【】\\r\\n                (cp===0x3010 || cp===0x3011) ||\\r\\n                ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(Character.FromCodePoint(cp)));\\r\\n        },\\r\\n\\r\\n        IsIdentifierPart: function (cp)\\r\\n        {\\r\\n            return (cp === 0x24) || (cp === 0x5F) ||\\r\\n                (cp >= 0x41 && cp <= 0x5A) ||\\r\\n                (cp >= 0x61 && cp <= 0x7A) ||\\r\\n                (cp >= 0x30 && cp <= 0x39) ||\\r\\n                (cp === 0x5C) || (cp===0x23) ||\\r\\n                //【】\\r\\n                (cp===0x3010 || cp===0x3011) ||\\r\\n                ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(Character.FromCodePoint(cp)));\\r\\n        },\\r\\n\\r\\n        // https://tc39.github.io/ecma262/#sec-literals-numeric-literals\\r\\n        IsDecimalDigit: function (cp)\\r\\n        {\\r\\n            return (cp >= 0x30 && cp <= 0x39); // 0..9\\r\\n        },\\r\\n\\r\\n        IsHexDigit: function (cp)\\r\\n        {\\r\\n            return (cp >= 0x30 && cp <= 0x39) || (cp >= 0x41 && cp <= 0x46) || (cp >= 0x61 && cp <= 0x66); // a..f\\r\\n        },\\r\\n\\r\\n        isOctalDigit: function (cp)\\r\\n        {\\r\\n            return (cp >= 0x30 && cp <= 0x37); // 0..7\\r\\n        }\\r\\n    }\\r\\n\\r\\nvar TOKEN_NAME={};\\r\\nTOKEN_NAME[1 /* BooleanLiteral */] = 'Boolean';\\r\\nTOKEN_NAME[2 /* EOF */] = '<end>';\\r\\nTOKEN_NAME[3 /* Identifier */] = 'Identifier';\\r\\nTOKEN_NAME[4 /* Keyword */] = 'Keyword';\\r\\nTOKEN_NAME[5 /* NullLiteral */] = 'Null';\\r\\nTOKEN_NAME[6 /* NumericLiteral */] = 'Numeric';\\r\\nTOKEN_NAME[7 /* Punctuator */] = 'Punctuator';\\r\\nTOKEN_NAME[8 /* StringLiteral */] = 'String';\\r\\nTOKEN_NAME[9 /* RegularExpression */] = 'RegularExpression';\\r\\nTOKEN_NAME[10 /* Template */] = 'Template';\\r\\n\\r\\n//公共方法\\r\\nfunction JSComplierHelper()\\r\\n{\\r\\n\\r\\n}\\r\\n\\r\\nJSComplierHelper.GetPeriodInfo=function(obj)\\r\\n{\\r\\n    const PERIOD_LIST=\\r\\n        [\\r\\n            {Name:'MIN1', Period:4, Order:1},\\r\\n            {Name:'MIN5', Period:5, Order:2},\\r\\n            {Name:'MIN15', Period:6, Order:3},\\r\\n            {Name:'MIN30', Period:7, Order:4},\\r\\n            {Name:'MIN60', Period:8, Order:5},\\r\\n\\r\\n            {Name:'DAY',    Period:0, Order:1000},\\r\\n            {Name:'MULTIDAY',    Period:40002, Order:1002},\\r\\n            {Name:'DAY2',    Period:40002, Order:1002},\\r\\n            {Name:'DAY3',    Period:40003, Order:1003},\\r\\n            {Name:'DAY4',    Period:40004, Order:1004},\\r\\n            {Name:'DAY5',    Period:40005, Order:1005},\\r\\n            {Name:'WEEK',   Period:1, Order:1005},\\r\\n\\r\\n            {Name:'DAY6',    Period:40006, Order:1006},\\r\\n            {Name:'DAY7',    Period:40007, Order:1007},\\r\\n            {Name:'DAY8',    Period:40008, Order:1008},\\r\\n            {Name:'DAY9',    Period:40009, Order:1009},\\r\\n            {Name:'DAY10',   Period:40009, Order:1010},\\r\\n            {Name:\\\"WEEK2\\\",   Period:21,    Order:1010},\\r\\n\\r\\n            {Name:'DAY11',    Period:40011, Order:1011},\\r\\n            {Name:'DAY12',    Period:40012, Order:1012},\\r\\n            {Name:'DAY13',    Period:40013, Order:1013},\\r\\n            {Name:'DAY14',    Period:40014, Order:1014},\\r\\n\\r\\n            {Name:'MONTH',  Period:2, Order:1030},\\r\\n            {Name:\\\"SEASON\\\", Period:9, Order:1090},\\r\\n            {Name:\\\"HALFYEAR\\\", Period:22, Order:1180},\\r\\n            {Name:\\\"YEAR\\\",   Period:3, Order:1365}\\r\\n        ];\\r\\n\\r\\n    if (obj.Name)\\r\\n    {\\r\\n        for(var i in PERIOD_LIST)\\r\\n        {\\r\\n            if (obj.Name && PERIOD_LIST[i].Name==obj.Name)\\r\\n                return PERIOD_LIST[i];\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    if (IFrameSplitOperator.IsNumber(obj.PeriodID))\\r\\n    {\\r\\n        for(var i in PERIOD_LIST)\\r\\n        {\\r\\n            if (PERIOD_LIST[i].Period==obj.PeriodID)\\r\\n                return PERIOD_LIST[i];\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    return null;\\r\\n}\\r\\n\\r\\nJSComplierHelper.GetConvertValueName=function(funcName)\\r\\n{\\r\\n    var valueName;\\r\\n    if (funcName=='COVER_C') valueName='CLOSE';\\r\\n    else if (funcName=='COVER_O') valueName=\\\"OPEN\\\";\\r\\n    else if (funcName=='COVER_H') valueName=\\\"HIGH\\\";\\r\\n    else if (funcName=='COVER_L') valueName=\\\"LOW\\\";\\r\\n    else if (funcName=='COVER_A') valueName=\\\"AMOUNT\\\";\\r\\n    else if (funcName=='COVER_V') valueName=\\\"VOL\\\";\\r\\n\\r\\n    return valueName;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n//编译异常, 错误类\\r\\nfunction ErrorHandler()\\r\\n{\\r\\n    this.Error=[];\\r\\n\\r\\n    this.RecordError=function(error)\\r\\n    {\\r\\n        this.Error.push(error);\\r\\n    }\\r\\n\\r\\n    this.ConstructError=function(msg,column)\\r\\n    {\\r\\n        let error=new Error(msg);\\r\\n        //通过自己抛异常并自己截获 来获取调用堆栈信息\\r\\n        try\\r\\n        {\\r\\n            throw error;\\r\\n        }\\r\\n        catch(base)\\r\\n        {\\r\\n            if (Object.create && Object.defineProperties)\\r\\n            {\\r\\n                error=Object.create(base);\\r\\n                error.Column=column;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return error;\\r\\n    }\\r\\n\\r\\n    this.CreateError=function(index, line, col, description, word)\\r\\n    {\\r\\n        let msg='Line ' + line + ': ' + description;\\r\\n        let error=this.ConstructError(msg,col);\\r\\n        error.Index=index;\\r\\n        error.LineNumber=line;\\r\\n        error.Description=description;\\r\\n        error.Word=word;    //错误单词\\r\\n        return error;\\r\\n    }\\r\\n\\r\\n    this.ThrowError=function(index, line, col, description, word)\\r\\n    {\\r\\n        let error=this.CreateError(index,line,col,description,word);\\r\\n        throw error;\\r\\n    }\\r\\n\\r\\n    //重新下载数据\\r\\n    this.ThrowDownloadJob=function(index, line, col, description,job)\\r\\n    {\\r\\n        let error=this.CreateError(index,line,col,description);\\r\\n        error.Job=job;\\r\\n        throw error;\\r\\n    }\\r\\n}\\r\\n\\r\\n//扫描类\\r\\nfunction Scanner(code, ErrorHandler)\\r\\n{\\r\\n    this.Source=code;\\r\\n    this.ErrorHandler=ErrorHandler;\\r\\n    this.Length=code.length;\\r\\n    this.Index=0;\\r\\n    this.LineNumber=(code.length>0)?1:0;\\r\\n    this.LineStart=0;\\r\\n    this.CurlyStack=[];\\r\\n\\r\\n    this.SaveState=function()   //保存当前扫描状态\\r\\n    {\\r\\n        return { Index:this.Index, LineNumber:this.LineNumber, LineStart:this.LineStart };\\r\\n    }\\r\\n\\r\\n    this.RestoreState=function(state)   //还原扫描状态\\r\\n    {\\r\\n        this.Index=state.Index;\\r\\n        this.LineNumber=state.LineNumber;\\r\\n        this.LineStart=state.LineStart;\\r\\n    }\\r\\n\\r\\n    this.IsEOF=function()     //否是已经结束\\r\\n    {\\r\\n        return this.Index>=this.Length;\\r\\n    }\\r\\n\\r\\n    this.IsKeyword=function(id)\\r\\n    {\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.CodePointAt = function (i)\\r\\n    {\\r\\n        let cp = this.Source.charCodeAt(i);\\r\\n        if (cp >= 0xD800 && cp <= 0xDBFF)\\r\\n        {\\r\\n            let second = this.Source.charCodeAt(i + 1);\\r\\n            if (second >= 0xDC00 && second <= 0xDFFF) {\\r\\n                var first = cp;\\r\\n                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\\r\\n            }\\r\\n        }\\r\\n        return cp;\\r\\n    }\\r\\n\\r\\n    this.Lex=function()\\r\\n    {\\r\\n        if (this.IsEOF()) return { Type:2/*EOF*/, Value:'', LineNumber:this.LineNumber, LineStart:this.LineStart, Start:this.Index, End:this.Index };\\r\\n        let cp=this.Source.charCodeAt(this.Index);\\r\\n\\r\\n        //变量名 或 关键字\\r\\n        if (Character.IsIdentifierStart(cp)) return this.ScanIdentifier();\\r\\n\\r\\n        //( ) ; 开头 操作符扫描\\r\\n        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) return this.ScanPunctuator();\\r\\n\\r\\n        //' \\\" 开头 字符串扫描\\r\\n        if (cp === 0x27 || cp === 0x22) return this.ScanStringLiteral();\\r\\n\\r\\n        //. 开头 浮点型\\r\\n        if (cp==0x2E)\\r\\n        {\\r\\n            if (Character.IsDecimalDigit(this.Source.charCodeAt(this.Index + 1)))\\r\\n                return this.ScanNumericLiteral();\\r\\n\\r\\n            return this.ScanPunctuator();\\r\\n        }\\r\\n\\r\\n        //数字\\r\\n        if (Character.IsDecimalDigit(cp))  return this.ScanNumericLiteral();\\r\\n\\r\\n        if (cp >= 0xD800 && cp < 0xDFFF)\\r\\n        {\\r\\n            if (Character.IsIdentifierStart(this.CodePointAt(this.Index))) return this.ScanIdentifier();\\r\\n        }\\r\\n\\r\\n        return this.ScanPunctuator();\\r\\n\\r\\n    }\\r\\n\\r\\n    //关键字 变量名 https://tc39.github.io/ecma262/#sec-names-and-keywords\\r\\n    this.ScanIdentifier=function()\\r\\n    {\\r\\n        let type;\\r\\n        let start=this.Index;\\r\\n        //0x5C 反斜杠\\r\\n        let id=(this.Source.charCodeAt(start)=== 0x5C) ? this.GetComplexIdentifier() : this.GetIdentifier();\\r\\n\\r\\n        if (id.length) type=3;                      //Identifier\\r\\n        else if (this.IsKeyword(id)) type=4;        //Keyword\\r\\n        else if (id==null) type=5;                  //NullLiteral\\r\\n        else if (id=='true' || id=='false') type=1; //BooleanLiteral\\r\\n        else type=3;                                //Identifier\\r\\n\\r\\n        if (type!=3  && (start+id.length!=this.Index))\\r\\n        {\\r\\n            let restore=this.Index;\\r\\n            this.Index=start;\\r\\n            throw Messages.InvalidEscapedReservedWord;\\r\\n            this.Index=restore;\\r\\n        }\\r\\n\\r\\n        if (id=='AND' || id=='OR') type=7 /*Punctuator*/;\\r\\n\\r\\n        return { Type:type, Value:id, LineNumber:this.LineNumber, LineStart:this.LineStart, Start:start, End:this.Index};\\r\\n    }\\r\\n\\r\\n    this.GetIdentifier=function()\\r\\n    {\\r\\n        let start=this.Index++; //start 保存进来的位置\\r\\n        while(!this.IsEOF())\\r\\n        {\\r\\n            let ch=this.Source.charCodeAt(this.Index);\\r\\n            if (ch==0x5C)\\r\\n            {\\r\\n                this.Index=start;\\r\\n                return this.GetComplexIdentifier();\\r\\n            }\\r\\n            else if (ch >= 0xD800 && ch < 0xDFFF)\\r\\n            {\\r\\n                this.Index=start;\\r\\n                return this.GetComplexIdentifier();\\r\\n            }\\r\\n\\r\\n            if (Character.IsIdentifierPart(ch)) ++this.Index;\\r\\n            else break;\\r\\n        }\\r\\n\\r\\n        return this.Source.slice(start,this.Index);\\r\\n    }\\r\\n\\r\\n    //操作符 https://tc39.github.io/ecma262/#sec-punctuators\\r\\n    this.ScanPunctuator=function()\\r\\n    {\\r\\n        let start=this.Index;\\r\\n        let str=this.Source[this.Index];\\r\\n        switch(str)\\r\\n        {\\r\\n            case '(':\\r\\n                ++this.Index;\\r\\n                break;\\r\\n            case ')':\\r\\n            case ';':\\r\\n            case ',':\\r\\n                ++this.Index;\\r\\n                break;\\r\\n            case '.':\\r\\n                ++this.Index;\\r\\n                /*if (this.Source[this.Index] === '.' && this.Source[this.Index + 1] === '.')\\r\\n                {\\r\\n                    //Spread operator: ...\\r\\n                    this.Index += 2;\\r\\n                    str = '...';\\r\\n                }\\r\\n                */\\r\\n                break;\\r\\n            default:\\r\\n                str=this.Source.substr(this.Index,3);\\r\\n                if (str=='AND')\\r\\n                {\\r\\n                    this.Index+=3;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    str = this.Source.substr(this.Index, 2);\\r\\n                    if (str === '&&' || str === '||' || str === '==' || str === '!=' || str === '<=' || str === '>=' || str === '=>' || str==':=' || str=='OR' || str=='<>')\\r\\n                    {\\r\\n                        this.Index += 2;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        str=this.Source[this.Index];\\r\\n                        if ('<>=!+-*%&|^/:'.indexOf(str) >= 0) ++this.Index;\\r\\n                    }\\r\\n                }\\r\\n        }\\r\\n\\r\\n        if (this.Index==start)\\r\\n            this.ThrowUnecpectedToken();\\r\\n\\r\\n        return { Type:7/*Punctuator*/, Value:str, LineNumber:this.LineNumber, LineStart:this.LineStart, Start:start, End:this.Index };\\r\\n    }\\r\\n\\r\\n    //字符串 https://tc39.github.io/ecma262/#sec-literals-string-literals\\r\\n    this.ScanStringLiteral=function()\\r\\n    {\\r\\n        let start=this.Index;\\r\\n        let quote=this.Source[this.Index];\\r\\n\\r\\n        ++this.Index;\\r\\n        var octal=false;\\r\\n        let str='';\\r\\n        while(!this.IsEOF())\\r\\n        {\\r\\n            let ch=this.Source[this.Index++];\\r\\n            if (ch==quote)\\r\\n            {\\r\\n                quote='';\\r\\n                break;\\r\\n            }\\r\\n            else if (ch=='\\\\\\\\')  //字符串转义\\r\\n            {\\r\\n                throw \\\"not complete\\\";\\r\\n            }\\r\\n            else if (Character.IsLineTerminator(ch.charCodeAt(0)))\\r\\n            {\\r\\n                break;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                str+=ch;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (quote!='')\\r\\n        {\\r\\n            this.Index=start;\\r\\n            this.ThrowUnecpectedToken();\\r\\n        }\\r\\n\\r\\n        return {Type:8/*StringLiteral*/, Value:str, LineNumber:this.LineNumber, LineStart:this.LineStart, Start:start, End:this.Index};\\r\\n    }\\r\\n\\r\\n    this.ScanNumericLiteral=function()\\r\\n    {\\r\\n        let start=this.Index;\\r\\n        let ch=this.Source[this.Index];\\r\\n        let num='';\\r\\n        if (ch!='.')\\r\\n        {\\r\\n            num=this.Source[this.Index++];\\r\\n            ch=this.Source[this.Index];\\r\\n            // Hex number starts with '0x'. 16进制\\r\\n            if (num=='0')\\r\\n            {\\r\\n                if (ch=='x' || ch=='X')\\r\\n                {\\r\\n                    ++this.Index;\\r\\n                    return this.ScanHexLiteral(start);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            while(Character.IsDecimalDigit(this.Source.charCodeAt(this.Index)))\\r\\n            {\\r\\n                num+=this.Source[this.Index++];\\r\\n            }\\r\\n\\r\\n            ch=this.Source[this.Index];\\r\\n        }\\r\\n\\r\\n        if (ch=='.')\\r\\n        {\\r\\n            num+=this.Source[this.Index++];\\r\\n            while(Character.IsDecimalDigit(this.Source.charCodeAt(this.Index)))\\r\\n            {\\r\\n                num+=this.Source[this.Index++];\\r\\n            }\\r\\n            ch=this.Source[this.Index];\\r\\n        }\\r\\n\\r\\n        //科学计数法\\r\\n        if (ch=='e' || ch=='E')\\r\\n        {\\r\\n            num+=this.Source[this.Index++];\\r\\n            ch=this.Source[this.Index];\\r\\n            if (ch=='+' || ch=='-') num+=this.Source[this.Index];\\r\\n            if (Character.IsDecimalDigit(this.Source.charCodeAt(this.Index)))\\r\\n            {\\r\\n                while(Character.IsDecimalDigit(this.Source.charCodeAt(this.Index)))\\r\\n                {\\r\\n                    num+=this.Source[this.Index++];\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.ThrowUnecpectedToken();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (Character.IsIdentifierStart(this.Source.charCodeAt(this.Index)))\\r\\n        {\\r\\n            this.ThrowUnecpectedToken();\\r\\n        }\\r\\n\\r\\n        return { Type:6/*NumericLiteral*/, Value:parseFloat(num), LineNumber:this.LineNumber, LineStart:this.LineStart, Start:start, End:this.Index };\\r\\n    }\\r\\n\\r\\n    //空格 或 注释\\r\\n    this.ScanComments=function()\\r\\n    {\\r\\n        let comments;\\r\\n        let start=(this.Index==0);\\r\\n        while(!this.IsEOF())\\r\\n        {\\r\\n            let ch=this.Source.charCodeAt(this.Index);\\r\\n            if (Character.IsWhiteSpace(ch)) //过滤掉空格\\r\\n            {\\r\\n                ++this.Index;\\r\\n            }\\r\\n            else if (Character.IsLineTerminator(ch))\\r\\n            {\\r\\n                ++this.Index;\\r\\n                if (ch==0x0D && this.Source.charCodeAt(this.Index)==0x0A) ++this.Index; //回车+换行\\r\\n                ++this.LineNumber;\\r\\n                this.LineStart=this.Index;\\r\\n                start=true;\\r\\n            }\\r\\n            else if (ch==0x2F)      // //注释\\r\\n            {\\r\\n                ch=this.Source.charCodeAt(this.Index+1);\\r\\n                if (ch==0x2F)\\r\\n                {\\r\\n                    this.Index+=2;\\r\\n                    let comment=this.SkipSingleLineComment(2);\\r\\n                    start=true;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n            else if (ch==0x7B)      //{ }  注释\\r\\n            {\\r\\n                this.Index+=1;\\r\\n                let comment = this.SkipMultiLineComment();\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return comments;\\r\\n    }\\r\\n\\r\\n    this.SkipMultiLineComment=function()\\r\\n    {\\r\\n        var comments = [];\\r\\n        while(!this.IsEOF())\\r\\n        {\\r\\n            var ch=this.Source.charCodeAt(this.Index);\\r\\n            if (Character.IsLineTerminator(ch))\\r\\n            {\\r\\n                ++this.LineNumber;\\r\\n                ++this.Index;\\r\\n                this.LineStart=this.Index;\\r\\n            }\\r\\n            else if (ch==0x7D)\\r\\n            {\\r\\n                this.Index+=1;\\r\\n                return comments;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                ++this.Index;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return comments;\\r\\n    }\\r\\n\\r\\n    //单行注释 https://tc39.github.io/ecma262/#sec-comments\\r\\n    this.SkipSingleLineComment=function(offset)\\r\\n    {\\r\\n        let comments=[];\\r\\n        while(!this.IsEOF())\\r\\n        {\\r\\n            let ch=this.Source.charCodeAt(this.Index);\\r\\n            ++this.Index;\\r\\n            if (Character.IsLineTerminator(ch))\\r\\n            {\\r\\n                if (ch === 13 && this.Source.charCodeAt(this.Index) === 10)\\r\\n                    ++this.Index;\\r\\n\\r\\n                ++this.LineNumber;\\r\\n                this.LineStart=this.Index;\\r\\n                return comments;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return comments;\\r\\n    }\\r\\n\\r\\n    this.ThrowUnecpectedToken=function(message,word)\\r\\n    {\\r\\n        if (!message) message = Messages.UnexpectedTokenIllegal;\\r\\n        return this.ErrorHandler.ThrowError(this.Index, this.LineNumber, this.Index - this.LineStart + 1, message, word);\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\nfunction Tokenizer(code)\\r\\n{\\r\\n    this.ErrorHandler=new ErrorHandler();   //错误信息处理类\\r\\n    this.Scanner=new Scanner(code,this.ErrorHandler);\\r\\n    this.Buffer=[];\\r\\n\\r\\n    this.GetNextToken=function()\\r\\n    {\\r\\n        if (this.Buffer.length==0)\\r\\n        {\\r\\n            let comments=this.Scanner.ScanComments();\\r\\n            if (!this.Scanner.IsEOF())\\r\\n            {\\r\\n                let token=this.Scanner.Lex();\\r\\n\\r\\n                let entry={ Type:TOKEN_NAME[token.Type], Value:this.Scanner.Source.slice(token.Start, token.End)};\\r\\n\\r\\n                this.Buffer.push(entry);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return this.Buffer.shift();\\r\\n    }\\r\\n}\\r\\n\\r\\nvar Syntax = {\\r\\n    AssignmentExpression: 'AssignmentExpression',\\r\\n    AssignmentPattern: 'AssignmentPattern',\\r\\n    ArrayExpression: 'ArrayExpression',\\r\\n    ArrayPattern: 'ArrayPattern',\\r\\n    ArrowFunctionExpression: 'ArrowFunctionExpression',\\r\\n    AwaitExpression: 'AwaitExpression',\\r\\n    BlockStatement: 'BlockStatement',\\r\\n    BinaryExpression: 'BinaryExpression',\\r\\n    BreakStatement: 'BreakStatement',\\r\\n    CallExpression: 'CallExpression',\\r\\n    CatchClause: 'CatchClause',\\r\\n    ClassBody: 'ClassBody',\\r\\n    ClassDeclaration: 'ClassDeclaration',\\r\\n    ClassExpression: 'ClassExpression',\\r\\n    ConditionalExpression: 'ConditionalExpression',\\r\\n    ContinueStatement: 'ContinueStatement',\\r\\n    DoWhileStatement: 'DoWhileStatement',\\r\\n    DebuggerStatement: 'DebuggerStatement',\\r\\n    EmptyStatement: 'EmptyStatement',\\r\\n    ExportAllDeclaration: 'ExportAllDeclaration',\\r\\n    ExportDefaultDeclaration: 'ExportDefaultDeclaration',\\r\\n    ExportNamedDeclaration: 'ExportNamedDeclaration',\\r\\n    ExportSpecifier: 'ExportSpecifier',\\r\\n    ExpressionStatement: 'ExpressionStatement',\\r\\n    ForStatement: 'ForStatement',\\r\\n    ForOfStatement: 'ForOfStatement',\\r\\n    ForInStatement: 'ForInStatement',\\r\\n    FunctionDeclaration: 'FunctionDeclaration',\\r\\n    FunctionExpression: 'FunctionExpression',\\r\\n    Identifier: 'Identifier',\\r\\n    IfStatement: 'IfStatement',\\r\\n    ImportDeclaration: 'ImportDeclaration',\\r\\n    ImportDefaultSpecifier: 'ImportDefaultSpecifier',\\r\\n    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\\r\\n    ImportSpecifier: 'ImportSpecifier',\\r\\n    Literal: 'Literal',\\r\\n    LabeledStatement: 'LabeledStatement',\\r\\n    LogicalExpression: 'LogicalExpression',\\r\\n    MemberExpression: 'MemberExpression',\\r\\n    MetaProperty: 'MetaProperty',\\r\\n    MethodDefinition: 'MethodDefinition',\\r\\n    NewExpression: 'NewExpression',\\r\\n    ObjectExpression: 'ObjectExpression',\\r\\n    ObjectPattern: 'ObjectPattern',\\r\\n    Program: 'Program',\\r\\n    Property: 'Property',\\r\\n    RestElement: 'RestElement',\\r\\n    ReturnStatement: 'ReturnStatement',\\r\\n    SequenceExpression: 'SequenceExpression',\\r\\n    SpreadElement: 'SpreadElement',\\r\\n    Super: 'Super',\\r\\n    SwitchCase: 'SwitchCase',\\r\\n    SwitchStatement: 'SwitchStatement',\\r\\n    TaggedTemplateExpression: 'TaggedTemplateExpression',\\r\\n    TemplateElement: 'TemplateElement',\\r\\n    TemplateLiteral: 'TemplateLiteral',\\r\\n    ThisExpression: 'ThisExpression',\\r\\n    ThrowStatement: 'ThrowStatement',\\r\\n    TryStatement: 'TryStatement',\\r\\n    UnaryExpression: 'UnaryExpression',\\r\\n    UpdateExpression: 'UpdateExpression',\\r\\n    VariableDeclaration: 'VariableDeclaration',\\r\\n    VariableDeclarator: 'VariableDeclarator',\\r\\n    WhileStatement: 'WhileStatement',\\r\\n    WithStatement: 'WithStatement',\\r\\n    YieldExpression: 'YieldExpression'\\r\\n};\\r\\n\\r\\n\\r\\nfunction Node(ErrorHandler)\\r\\n{\\r\\n    this.IsNeedIndexData=false;         //是否需要大盘数据\\r\\n    this.IsNeedLatestIndexData=false;   //是否需要下载最新大盘数据\\r\\n    this.IsNeedSymbolData=false;        //是否需要下载股票数据\\r\\n    this.IsNeedMarginData=new Set();\\r\\n    this.IsNeedNewsAnalysisData=new Set();      //新闻统计数据\\r\\n    this.NeedBlockIncreaseData=[];              //是否需要市场涨跌股票数据统计\\r\\n    this.IsNeedSymbolExData=new Set();          //下载股票行情的其他数据\\r\\n    this.NeedHK2SHSZData=[];                    //下载北上资金数据\\r\\n    this.IsNeedSectionFinance=new Map();        //下载截面财务数据 { key= 报告期 , Set() 字段}\\r\\n\\r\\n    this.FunctionData=[];                       //{ID:,  Args:,  FunctionName: }\\r\\n                                                //FINVALUE(ID),FINONE(ID,Y,MMDD)\\r\\n    this.Dynainfo=[];   //最新的个股行情数据 {ID:,  Args:,  FunctionName: }\\r\\n\\r\\n    this.IsAPIData=[]       //加载API数据\\r\\n\\r\\n    this.ExecuteIndex=[];       //执行调用指标\\r\\n    this.OtherSymbolData=[];    //其他股票数据 key=股票代码(小写)\\r\\n    this.PeriodSymbolData=[];   //跨周期数据 { Period:, VarName: }\\r\\n\\r\\n    this.ErrorHandler=ErrorHandler;\\r\\n\\r\\n    this.GetDataJobList=function()  //下载数据任务列表\\r\\n    {\\r\\n        let jobs=[];\\r\\n        if (this.IsNeedSymbolData) jobs.push({ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_DATA});\\r\\n        if (this.IsNeedIndexData) jobs.push({ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_DATA});\\r\\n        if (this.IsNeedLatestIndexData) jobs.push({ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_LATEST_INDEX_DATA});\\r\\n\\r\\n        //最新的个股行情数据\\r\\n        for(var i=0;i<this.Dynainfo.length;++i)\\r\\n        {\\r\\n            var item=this.Dynainfo[i];\\r\\n            jobs.push(item);\\r\\n        }\\r\\n\\r\\n        //涨跌停家数统计\\r\\n        for(var i in this.NeedBlockIncreaseData)\\r\\n        {\\r\\n            jobs.push(this.NeedBlockIncreaseData[i]);\\r\\n        }\\r\\n\\r\\n        //加载融资融券\\r\\n        for(var jobID of this.IsNeedMarginData)\\r\\n        {\\r\\n            jobs.push({ID:jobID});\\r\\n        }\\r\\n\\r\\n        //加载北上资金\\r\\n        for(var i in this.NeedHK2SHSZData)\\r\\n        {\\r\\n            jobs.push(this.NeedHK2SHSZData[i]);\\r\\n        }\\r\\n\\r\\n        //加载新闻统计\\r\\n        for(var jobID of this.IsNeedNewsAnalysisData)\\r\\n        {\\r\\n            jobs.push({ID:jobID});\\r\\n        }\\r\\n\\r\\n        //行情其他数据\\r\\n        for(var jobID of this.IsNeedSymbolExData)\\r\\n        {\\r\\n            jobs.push({ID:jobID});\\r\\n        }\\r\\n\\r\\n        //获取截面数据下载任务\\r\\n        for(var item of this.IsNeedSectionFinance)\\r\\n        {\\r\\n            jobs.push({ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_SF, SF:item});\\r\\n        }\\r\\n\\r\\n        for(var i in this.IsAPIData)\\r\\n        {\\r\\n            var item=this.IsAPIData[i];\\r\\n            jobs.push(item);\\r\\n        }\\r\\n\\r\\n        for(var i in this.ExecuteIndex)\\r\\n        {\\r\\n            var item=this.ExecuteIndex[i];\\r\\n            jobs.push(item);\\r\\n        }\\r\\n\\r\\n        for(var i in this.OtherSymbolData)\\r\\n        {\\r\\n            var item=this.OtherSymbolData[i];\\r\\n            jobs.push(item);\\r\\n        }\\r\\n\\r\\n        for(var i in this.PeriodSymbolData)\\r\\n        {\\r\\n            var item=this.PeriodSymbolData[i];\\r\\n            jobs.push(item);\\r\\n        }\\r\\n\\r\\n        for(var i in this.FunctionData)\\r\\n        {\\r\\n            var item=this.FunctionData[i];\\r\\n            jobs.push(item);\\r\\n        }\\r\\n\\r\\n        return jobs;\\r\\n    }\\r\\n\\r\\n    this.VerifySymbolVariable=function(varName, token)\\r\\n    {\\r\\n        let setIndexName=new Set(['INDEXA','INDEXC','INDEXH','INDEXL',\\\"INDEXO\\\",\\\"INDEXV\\\",'INDEXDEC','INDEXADV']);\\r\\n        if (setIndexName.has(varName))\\r\\n        {\\r\\n            this.IsNeedIndexData=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        let setSymbolDataName=new Set(['CLOSE','C','VOL','V','OPEN','O','HIGH','H','LOW','L','AMOUNT','AMO','VOLINSTK']);\\r\\n        if (setSymbolDataName.has(varName))\\r\\n        {\\r\\n            this.IsNeedSymbolData=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (varName==='VOLR')\\r\\n        {\\r\\n            if (!this.IsNeedSymbolExData.has(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VOLR_DATA))\\r\\n                this.IsNeedSymbolExData.add(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VOLR_DATA);\\r\\n        }\\r\\n\\r\\n        //CAPITAL流通股本(手), EXCHANGE 换手率, TOTALCAPITAL 总股本(手)\\r\\n        let setVariantName=new Set(\\r\\n            [\\r\\n                \\\"CAPITAL\\\",\\\"TOTALCAPITAL\\\",\\\"EXCHANGE\\\",\\r\\n                \\\"HYBLOCK\\\",\\\"DYBLOCK\\\",\\\"GNBLOCK\\\",\\\"FGBLOCK\\\",\\\"ZSBLOCK\\\",\\\"ZHBLOCK\\\",\\\"ZDBLOCK\\\",\\\"HYZSCODE\\\",\\r\\n                \\\"GNBLOCKNUM\\\",\\\"FGBLOCKNUM\\\",\\\"ZSBLOCKNUM\\\",\\\"ZHBLOCKNUM\\\",\\\"ZDBLOCKNUM\\\",\\r\\n                \\\"HYSYL\\\",\\\"HYSJL\\\"\\r\\n            ]);\\r\\n\\r\\n        if (setVariantName.has(varName))\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VARIANT, VariantName:varName };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (varName=='FROMOPEN')\\r\\n        {\\r\\n            this.IsNeedLatestIndexData=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (varName=='ADVANCE' || varName==\\\"DECLINE\\\")\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA, IsSelfSymbol:true, FunctionName:varName };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.NeedBlockIncreaseData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (varName.indexOf('#')>0)\\r\\n        {\\r\\n            var aryWrods = varName.split('#');\\r\\n            if (aryWrods.length!=2)\\r\\n            {\\r\\n                var errorMessage=`${varName}, 跨周期语法错误, 变量名#周期`;\\r\\n                this.ThrowUnexpectedToken(token,errorMessage);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                const VAR_NAME=[\\\"C\\\", \\\"CLOSE\\\", \\\"O\\\",\\\"OPEN\\\", \\\"H\\\",\\\"HIGH\\\", \\\"L\\\", \\\"LOW\\\", \\\"AMOUNT\\\", \\\"AMO\\\", \\\"VOL\\\", \\\"V\\\" , \\\"VOLINSTK\\\"];\\r\\n                if (VAR_NAME.indexOf(aryWrods[0])<0)\\r\\n                {\\r\\n                    var errorMessage=`${varName}, 跨周期语法错误, 数据只支持'OPEN,HIGH,LOW,CLOSE,VOL,AMOUNT,VOLINSTK'`;\\r\\n                    this.ThrowUnexpectedToken(token,errorMessage);\\r\\n                }\\r\\n\\r\\n                const VAR_PERIOD_NAME=\\r\\n                    [\\r\\n                        \\\"MIN1\\\",\\\"MIN5\\\",\\\"MIN15\\\",\\\"MIN30\\\",\\\"MIN60\\\",\\\"DAY\\\",\\\"WEEK\\\",\\\"MONTH\\\",\\\"SEASON\\\",\\\"YEAR\\\",\\\"HALFYEAR\\\",\\\"WEEK2\\\",\\r\\n                        \\\"MULTIDAY\\\",\\\"DAY2\\\",\\\"DAY3\\\",\\\"DAY4\\\",\\\"DAY5\\\",\\\"DAY6\\\",\\\"DAY7\\\",\\\"DAY8\\\",\\\"DAY9\\\",\\\"DAY10\\\",\\r\\n                        \\\"DAY11\\\",\\\"DAY12\\\",\\\"DAY13\\\",\\\"DAY14\\\",\\\"DAY15\\\"\\r\\n                    ];\\r\\n                if (VAR_PERIOD_NAME.indexOf(aryWrods[1])<0)\\r\\n                {\\r\\n                    var errorMessage=`${varName}, 跨周期语法错误， 周期只支持'MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH,SEASON,YEAR'`;\\r\\n                    this.ThrowUnexpectedToken(token,errorMessage);\\r\\n                }\\r\\n\\r\\n                var item={ID: JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_PERIOD_DATA, VarName:varName, ValueName:aryWrods[0], PeriodName:aryWrods[1] };\\r\\n                if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n                this.PeriodSymbolData.push(item);\\r\\n            }\\r\\n\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (g_JSComplierResource.IsCustomVariant(varName)) //自定义函数\\r\\n        {\\r\\n            var item={ VariantName:varName, ID:JS_EXECUTE_JOB_ID.JOB_CUSTOM_VARIANT_DATA };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.VerifySymbolLiteral=function(value,token)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsString(value))\\r\\n        {\\r\\n            if (value.indexOf('$')>0)\\r\\n            {\\r\\n                var aryValue=value.split('$');\\r\\n                if (aryValue.length!=2) return;\\r\\n\\r\\n                var item= { Literal:value, ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_OTHER_SYMBOL_DATA };\\r\\n                if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n\\r\\n                this.OtherSymbolData.push(item);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.VerifySymbolFunction=function(callee,args, token)\\r\\n    {\\r\\n        //自定义函数 可以覆盖系统内置函数\\r\\n        if (g_JSComplierResource.IsCustomFunction(callee.Name))\\r\\n        {\\r\\n            var item={FunctionName:callee.Name, ID:JS_EXECUTE_JOB_ID.JOB_CUSTOM_FUNCTION_DATA, Args:args}\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber};\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='DYNAINFO')\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_LATEST_DATA, Args:args,  FunctionName:callee.Name };\\r\\n            this.Dynainfo.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //财务函数\\r\\n        if (callee.Name=='FINANCE')\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINANCE, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==\\\"FINVALUE\\\")\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINVALUE, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==\\\"FINONE\\\")\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINONE, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='GPJYVALUE')\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_GPJYVALUE, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==\\\"SCJYVALUE\\\")\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SCJYVALUE, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==='MARGIN')\\r\\n        {\\r\\n            let jobID=JS_EXECUTE_JOB_ID.GetMarginJobID(args[0].Value);\\r\\n            if (jobID && !this.IsNeedMarginData.has(jobID))  this.IsNeedMarginData.add(jobID);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==='NEWS')\\r\\n        {\\r\\n            let jobID=JS_EXECUTE_JOB_ID.GetNewsAnalysisID(args[0].Value);\\r\\n            if (jobID && !this.IsNeedNewsAnalysisData.has(jobID))  this.IsNeedNewsAnalysisData.add(jobID);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==='HK2SHSZ')    //北上资金\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_HK_TO_SHSZ, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.NeedHK2SHSZData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='COST' || callee.Name=='WINNER' || callee.Name=='PPART' || callee.Name=='COSTEX' ||\\r\\n            callee.Name=='LWINNER' || callee.Name=='PWINNER')   //需要流通股\\r\\n        {\\r\\n            //下载流通股\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINANCE, Args:[7],  FunctionName:\\\"FINANCE\\\", FunctionName2:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==\\\"INBLOCK\\\")\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VARIANT, VariantName:\\\"INBLOCK\\\" }; //下载所有板块\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.FunctionData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==='BETA')    //beta需要下载上证指数\\r\\n        {\\r\\n            this.IsNeedIndexData=true;\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='UPCOUNT' || callee.Name=='DOWNCOUNT')    //上涨下跌个数\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA, Args:args, FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.NeedBlockIncreaseData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='STKINDI') //指标调用\\r\\n        {\\r\\n            var item={ ID:JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX, Args:args,  FunctionName:callee.Name };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.ExecuteIndex.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='COVER_C' || callee.Name=='COVER_O' || callee.Name=='COVER_H' || callee.Name=='COVER_L' || callee.Name=='COVER_A' || callee.Name=='COVER_V')   //跨周期函数\\r\\n        {\\r\\n            var periodName=args[0].Value;\\r\\n            const VAR_PERIOD_NAME=[\\\"MIN1\\\",\\\"MIN5\\\",\\\"MIN15\\\",\\\"MIN30\\\",\\\"MIN60\\\",\\\"DAY\\\",\\\"WEEK\\\",\\\"MONTH\\\",\\\"SEASON\\\",\\\"YEAR\\\"];\\r\\n            if (VAR_PERIOD_NAME.indexOf(periodName)<0)\\r\\n            {\\r\\n                var errorMessage=`${callee.Name}, 跨周期函数错误， 周期只支持'MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH,SEASON,YEAR'`;\\r\\n                this.ThrowUnexpectedToken(token,errorMessage);\\r\\n            }\\r\\n\\r\\n            var valueName=JSComplierHelper.GetConvertValueName(callee.Name);\\r\\n            var item={ID: JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_PERIOD_DATA, FunctionName:callee.Name, ValueName:valueName, PeriodName:periodName };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n            this.PeriodSymbolData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name=='SF')  //Section finance\\r\\n        {\\r\\n            let period=JS_EXECUTE_JOB_ID.GetSectionReportPeriod(args[0].Value,args[1].Value); //报告期\\r\\n            if (!period) return;\\r\\n            let jobID=JS_EXECUTE_JOB_ID.GetSectionFinanceID(args[2].Value);\\r\\n            if (!jobID) return;\\r\\n            var sfkey=period.Year+ '-' + period.Quarter;\\r\\n\\r\\n            if (!this.IsNeedSectionFinance.has(sfkey))\\r\\n            {\\r\\n                var finacne={ Period:period, Fields:new Set([jobID]) };\\r\\n                this.IsNeedSectionFinance.set(sfkey, finacne);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var finacne=this.IsNeedSectionFinance.get(sfkey);\\r\\n                if (!finacne.Fields.has(jobID)) finacne.Fields.add(jobID);\\r\\n            }\\r\\n\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (callee.Name==\\\"LOADAPIDATA\\\") //加载API数据\\r\\n        {\\r\\n            var item= { Name:callee.Name, ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CUSTOM_API_DATA,Args:args };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber};\\r\\n\\r\\n            this.IsAPIData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        let setStockDataName=new Set(['CLOSE',\\\"C\\\",'VOL','V','OPEN','O','HIGH','H','LOW','L','AMOUNT','AMO','VOLINSTK']);\\r\\n        if (setStockDataName.has(callee.Name))\\r\\n        {\\r\\n            var item= { Name:callee.Name, ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_OTHER_SYMBOL_DATA,Args:args };\\r\\n            if (token) item.Token={ Index:token.Start, Line:token.LineNumber};\\r\\n\\r\\n            this.OtherSymbolData.push(item);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.VerifyMemberVariable=function(object,property,token)\\r\\n    {\\r\\n        var item={ ID:JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX,  Member:{Object:object, Property:property} };\\r\\n        if (token) item.Token={ Index:token.Start, Line:token.LineNumber };\\r\\n        this.ExecuteIndex.push(item);\\r\\n        return;\\r\\n    }\\r\\n\\r\\n    this.ExpressionStatement=function(expression)\\r\\n    {\\r\\n        return { Type:Syntax.ExpressionStatement, Expression:expression };\\r\\n    }\\r\\n\\r\\n    this.Script=function(body)\\r\\n    {\\r\\n        return {Type:Syntax.Program, Body:body, SourceType:'通达信脚本' };\\r\\n    }\\r\\n\\r\\n    this.SequenceExpression=function(expression)\\r\\n    {\\r\\n        return {Type:Syntax.SequenceExpression, Expression:expression };\\r\\n    }\\r\\n\\r\\n    this.BinaryExpression=function(operator, left, right)\\r\\n    {\\r\\n        let logical = (operator === '||' || operator === '&&' || operator=='AND' || operator=='OR');\\r\\n        let type = logical ? Syntax.LogicalExpression : Syntax.BinaryExpression;\\r\\n\\r\\n        return { Type:type, Operator:operator, Left:left, Right:right };\\r\\n    }\\r\\n\\r\\n    this.Literal=function(value,raw,token)\\r\\n    {\\r\\n        this.VerifySymbolLiteral(value, token);\\r\\n        return { Type:Syntax.Literal, Value:value, Raw:raw };\\r\\n    }\\r\\n\\r\\n    this.Identifier=function(name, token)\\r\\n    {\\r\\n        this.VerifySymbolVariable(name, token);\\r\\n\\r\\n        return { Type:Syntax.Identifier, Name:name};\\r\\n    }\\r\\n\\r\\n    //成员变量, 不需要检测\\r\\n    this.MemberIdentifier=function(name, token)\\r\\n    {\\r\\n        return { Type:Syntax.Identifier, Name:name};\\r\\n    }\\r\\n\\r\\n    this.AssignmentExpression=function (operator, left, right)\\r\\n    {\\r\\n        return { Type:Syntax.AssignmentExpression, Operator:operator, Left:left, Right:right };\\r\\n    }\\r\\n\\r\\n    this.UnaryExpression=function(operator, argument)\\r\\n    {\\r\\n        return { Type:Syntax.UnaryExpression, Operator:operator, Argument:argument, Prefix:true };\\r\\n    }\\r\\n\\r\\n    this.EmptyStatement=function()\\r\\n    {\\r\\n        return { Type:Syntax.EmptyStatement };\\r\\n    }\\r\\n\\r\\n    this.CallExpression=function(callee, args, token)\\r\\n    {\\r\\n        this.VerifySymbolFunction(callee, args, token);\\r\\n\\r\\n        return { Type:Syntax.CallExpression, Callee:callee, Arguments:args };\\r\\n    }\\r\\n\\r\\n    this.StaticMemberExpression=function(object, property,token)\\r\\n    {\\r\\n        this.VerifyMemberVariable(object,property, token);\\r\\n        return { Type:Syntax.MemberExpression, Computed:false, Object:object, Property:property };\\r\\n    }\\r\\n\\r\\n    this. Directive=function(expression, directive)\\r\\n    {\\r\\n        return { Type:Syntax.ExpressionStatement, Expression : expression, Directive: directive };\\r\\n    }\\r\\n\\r\\n    ////////////////////////////////////////////////////////////////\\r\\n    this.ThrowUnexpectedToken=function(token,message)\\r\\n    {\\r\\n        throw this.UnexpectedTokenError(token,message);\\r\\n    }\\r\\n\\r\\n    this.UnexpectedTokenError=function(token,message)\\r\\n    {\\r\\n        let msg=message || Messages.UnexpectedToken;\\r\\n        let value='ILLEGAL';\\r\\n        if (token)\\r\\n        {\\r\\n            if (!message) { }\\r\\n            value=token.Value;\\r\\n        }\\r\\n\\r\\n        msg=msg.replace(\\\"%0\\\",value);\\r\\n        if (token && typeof(token.LineNumber)=='number')\\r\\n        {\\r\\n            let index=token.Start;\\r\\n            let line=token.LineNumber;\\r\\n            let column=-1\\r\\n            return this.ErrorHandler.CreateError(index,line,column,msg);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\nfunction JSParser(code)\\r\\n{\\r\\n    this.ErrorHandler=new ErrorHandler();\\r\\n    this.Scanner=new Scanner(code, this.ErrorHandler);\\r\\n    this.Node=new Node(this.ErrorHandler);   //节点创建\\r\\n\\r\\n    this.LookAhead={Type:2, Value:'', LineNumber:this.Scanner.LineNumber, LineStart:0, Start:0, End:0 };\\r\\n    this.HasLineTerminator=false;\\r\\n    this.Context = {\\r\\n        IsModule: false,\\r\\n        await: false,\\r\\n        allowIn: true,\\r\\n        allowStrictDirective: true,\\r\\n        allowYield: true,\\r\\n        FirstCoverInitializedNameError: null,\\r\\n        IsAssignmentTarget: false,\\r\\n        IsBindingElement: false,\\r\\n        InFunctionBody: false,\\r\\n        inIteration: false,\\r\\n        inSwitch: false,\\r\\n        labelSet: {},\\r\\n        Strict: false\\r\\n    };\\r\\n\\r\\n    this.PeratorPrecedence =\\r\\n        {\\r\\n            ')': 0,\\r\\n            ';': 0,\\r\\n            ',': 0,\\r\\n            ']': 0,\\r\\n            '||': 1,\\r\\n            'OR':1,\\r\\n            '&&': 2,\\r\\n            'AND':2,\\r\\n            '|': 3,\\r\\n            '^': 4,\\r\\n            '&': 5,\\r\\n            '==': 6,\\r\\n            '=': 6,\\r\\n            '!=': 6,\\r\\n            '<>':6,\\r\\n            '===': 6,\\r\\n            '!==': 6,\\r\\n            '<': 7,\\r\\n            '>': 7,\\r\\n            '<=': 7,\\r\\n            '>=': 7,\\r\\n            '<<': 8,\\r\\n            '>>': 8,\\r\\n            '>>>': 8,\\r\\n            '+': 9,\\r\\n            '-': 9,\\r\\n            '*': 11,\\r\\n            '/': 11,\\r\\n            '%': 11\\r\\n        };\\r\\n\\r\\n    this.StartMarker={Index:0, Line: this.Scanner.LineNumber, Column:0 };\\r\\n    this.LastMarker={Index:0, Line: this.Scanner.LineNumber, Column:0 };\\r\\n\\r\\n    this.Initialize=function()\\r\\n    {\\r\\n        this.NextToken();\\r\\n        this.LastMarker={ Index:this.Scanner.Index, Line:this.Scanner.LineNumber, Column:this.Scanner.Index-this.Scanner.LineStart };\\r\\n    }\\r\\n\\r\\n\\r\\n    this.CreateNode=function()\\r\\n    {\\r\\n        return { Index:this.StartMarker.Index, Line:this.StartMarker.Line, Column:this.StartMarker.Column };\\r\\n    }\\r\\n\\r\\n    this.StartNode=function(token, lastLineStart)\\r\\n    {\\r\\n        if (lastLineStart==void 0) { lastLineStart=0; }\\r\\n\\r\\n        let column = token.Start - token.LineStart;\\r\\n        let line = token.LineNumber;\\r\\n        if (column < 0)\\r\\n        {\\r\\n            column += lastLineStart;\\r\\n            line--;\\r\\n        }\\r\\n\\r\\n        return { Index: token.Start, Line: line, Column: column };\\r\\n    }\\r\\n\\r\\n    this.Match=function(value)\\r\\n    {\\r\\n        return this.LookAhead.Type==7 /*Punctuator*/ && this.LookAhead.Value==value;\\r\\n    }\\r\\n\\r\\n    this.Expect=function(value)\\r\\n    {\\r\\n        let token=this.NextToken();\\r\\n        if (token.Type!=7 /*Punctuator*/ || token.Value!=value)\\r\\n            this.ThrowUnexpectedToken(token);\\r\\n    }\\r\\n\\r\\n    //是否是赋值操作符\\r\\n    this.MatchAssign=function()\\r\\n    {\\r\\n        if (this.LookAhead.Type!=7 /*Punctuator*/) return false;\\r\\n        let op=this.LookAhead.Value;\\r\\n\\r\\n        return op==':' || op==':=';\\r\\n    }\\r\\n\\r\\n    this.GetTokenRaw=function(token)\\r\\n    {\\r\\n        return this.Scanner.Source.slice(token.Start, token.End);\\r\\n    }\\r\\n\\r\\n    this.NextToken=function()\\r\\n    {\\r\\n        let token=this.LookAhead;\\r\\n        this.LastMarker.Index=this.Scanner.Index;\\r\\n        this.LastMarker.Line=this.Scanner.LineNumber;\\r\\n        this.LastMarker.Column=this.Scanner.Index-this.Scanner.LineStart;\\r\\n        this.CollectComments(); //过滤注释 空格\\r\\n\\r\\n        if (this.Scanner.Index !== this.StartMarker.Index)\\r\\n        {\\r\\n            this.StartMarker.Index = this.Scanner.Index;\\r\\n            this.StartMarker.Line = this.Scanner.LineNumber;\\r\\n            this.StartMarker.Column = this.Scanner.Index - this.Scanner.LineStart;\\r\\n        }\\r\\n\\r\\n        let next=this.Scanner.Lex();\\r\\n        this.HasLineTerminator=(token.LineNumber!=next.LineNumber);\\r\\n        if (next && this.Context.Strict && next.Type==3/*Identifier */)\\r\\n        {\\r\\n            //TODO:\\r\\n        }\\r\\n\\r\\n        this.LookAhead=next;\\r\\n\\r\\n        return token;\\r\\n    }\\r\\n\\r\\n    this.CollectComments=function()\\r\\n    {\\r\\n        this.Scanner.ScanComments();\\r\\n    }\\r\\n\\r\\n    this.ParseScript=function()\\r\\n    {\\r\\n        let node=this.CreateNode();\\r\\n        let body=this.ParseDirectivePrologues();\\r\\n\\r\\n        while(this.LookAhead.Type!=2 /*EOF*/)\\r\\n        {\\r\\n            body.push(this.ParseStatementListItem())\\r\\n        }\\r\\n\\r\\n        return this.Finalize(node,this.Node.Script(body));\\r\\n    }\\r\\n\\r\\n    //https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive\\r\\n    this.ParseDirective=function()\\r\\n    {\\r\\n        let token=this.LookAhead;\\r\\n        let node=this.CreateNode();\\r\\n        let expr=this.ParseExpression();\\r\\n\\r\\n        let directive = (expr.Type === Syntax.Literal) ? this.GetTokenRaw(token).slice(1, -1) : null;\\r\\n        this.ConsumeSemicolon();\\r\\n\\r\\n        return this.Finalize(node, directive ? this.Node.Directive(expr, directive) : this.Node.ExpressionStatement(expr));\\r\\n    }\\r\\n\\r\\n    this.ParseDirectivePrologues=function()\\r\\n    {\\r\\n        let firstRestricted=null;\\r\\n        let body=[];\\r\\n        while(true)\\r\\n        {\\r\\n            let token=this.LookAhead;\\r\\n            if (token.Type!=8 /*StringLiteral*/) break;\\r\\n\\r\\n            let statement=this.ParseDirective();\\r\\n            body.push(statement);\\r\\n        }\\r\\n\\r\\n        return body;\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-block\\r\\n    this.ParseStatementListItem=function()\\r\\n    {\\r\\n        let statement;\\r\\n        this.Context.IsAssignmentTarget=true;\\r\\n        this.Context.IsBindingElement=true;\\r\\n        if (this.LookAhead.Type==4 /*Keyword*/)\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            statement=this.ParseStatement();\\r\\n        }\\r\\n\\r\\n        return statement;\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations\\r\\n    this.ParseStatement=function()\\r\\n    {\\r\\n        let statement;\\r\\n        switch(this.LookAhead.Type)\\r\\n        {\\r\\n            case 1 /* BooleanLiteral */:\\r\\n            case 5 /* NullLiteral */:\\r\\n            case 6 /* NumericLiteral */:\\r\\n            case 8 /* StringLiteral */:\\r\\n            case 10 /* Template */:\\r\\n            case 9 /* RegularExpression */:\\r\\n                statement = this.ParseExpressionStatement();\\r\\n                break;\\r\\n            case 7 /* Punctuator */:\\r\\n                let value = this.LookAhead.Value;\\r\\n                if (value === '(') statement = this.ParseExpressionStatement();\\r\\n                else if (value === ';') statement = this.ParseEmptyStatement();\\r\\n                else statement = this.ParseExpressionStatement();\\r\\n                break;\\r\\n            case 3 /* Identifier */:\\r\\n                statement = this.ParseLabelledStatement();\\r\\n                break;\\r\\n            case 4 /* Keyword */:\\r\\n                break;\\r\\n            default:\\r\\n                statement=\\\"error\\\";\\r\\n        }\\r\\n\\r\\n        return statement;\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-empty-statement\\r\\n    this.ParseEmptyStatement=function()\\r\\n    {\\r\\n        let node=this.CreateNode();\\r\\n        this.Expect(';');\\r\\n        return this.Finalize(node, this.Node.EmptyStatement());\\r\\n    }\\r\\n\\r\\n    //https://tc39.github.io/ecma262/#sec-labelled-statements\\r\\n    this.ParseLabelledStatement=function()\\r\\n    {\\r\\n        let node=this.CreateNode();\\r\\n        let expr=this.ParseExpression();\\r\\n        this.ConsumeSemicolon();\\r\\n        let statement = new this.Node.ExpressionStatement(expr);\\r\\n\\r\\n        return this.Finalize(node, statement);\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-comma-operator\\r\\n    this.ParseExpression=function()\\r\\n    {\\r\\n        let startToken=this.LookAhead;\\r\\n        let expr=this.IsolateCoverGrammar(this.ParseAssignmentExpression);\\r\\n        if (this.Match(','))\\r\\n        {\\r\\n            let expressions=[];\\r\\n            expressions.push(expr);\\r\\n            while(this.LookAhead.Type!=2 /*EOF*/)\\r\\n            {\\r\\n                if (!this.Match(',')) break;\\r\\n                this.NextToken();\\r\\n                expressions.push(this.IsolateCoverGrammar(this.ParseAssignmentExpression));\\r\\n            }\\r\\n\\r\\n            expr=this.Finalize(this.StartNode(startToken),this.Node.SequenceExpression(expressions));\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseAssignmentExpression=function()\\r\\n    {\\r\\n        let expr;\\r\\n\\r\\n        let startToken=this.LookAhead;\\r\\n        let token=startToken;\\r\\n        expr=this.ParseConditionalExpression();\\r\\n\\r\\n        if (this.MatchAssign())\\r\\n        {\\r\\n            if (!this.Context.IsAssignmentTarget)\\r\\n            {\\r\\n                let marker=expr.Marker;\\r\\n                this.ThrowUnexpectedError(marker.Index,marker.Line,marker.Column,Messages.InvalidLHSInAssignment);\\r\\n            }\\r\\n\\r\\n            if (!this.Match('=') && !this.Match(':'))\\r\\n            {\\r\\n                this.Context.IsAssignmentTarget=false;\\r\\n                this.Context.IsBindingElement=false;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.ReinterpretExpressionAsPattern(expr);\\r\\n            }\\r\\n\\r\\n            token=this.NextToken();\\r\\n            let operator=token.Value;\\r\\n            let right=this.IsolateCoverGrammar(this.ParseAssignmentExpression);\\r\\n            expr=this.Finalize(this.StartNode(startToken), this.Node.AssignmentExpression(operator, expr, right));\\r\\n            this.Context.FirstCoverInitializedNameError=null;\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseConditionalExpression=function()\\r\\n    {\\r\\n        let startToken=this.LookAhead;\\r\\n        let expr=this.InheritCoverGrammar(this.ParseBinaryExpression);\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseBinaryExpression=function()\\r\\n    {\\r\\n        let startToken=this.LookAhead;\\r\\n        let expr=this.InheritCoverGrammar(this.ParseExponentiationExpression);\\r\\n        let token=this.LookAhead;\\r\\n        var prec=this.BinaryPrecedence(token);\\r\\n        if (prec>0)\\r\\n        {\\r\\n            this.NextToken();\\r\\n            this.Context.IsAssignmentTarget=false;\\r\\n            this.Context.IsBindingElement=false;\\r\\n            let markers=[startToken,this.LookAhead];\\r\\n            let left=expr;\\r\\n            let right=this.IsolateCoverGrammar(this.ParseExponentiationExpression);\\r\\n            let stack=[left,token.Value,right];\\r\\n            let precedences = [prec];\\r\\n            while(true)\\r\\n            {\\r\\n                prec=this.BinaryPrecedence(this.LookAhead);\\r\\n                if (prec<=0) break;\\r\\n\\r\\n                while(stack.length>2 && prec<=precedences[precedences.length-1])\\r\\n                {\\r\\n                    right=stack.pop();\\r\\n                    let operator=stack.pop();\\r\\n                    precedences.pop();\\r\\n                    left=stack.pop();\\r\\n                    markers.pop();\\r\\n                    let node=this.StartNode(markers[markers.length - 1]);\\r\\n                    stack.push(this.Finalize(node, this.Node.BinaryExpression(operator, left, right)));\\r\\n                }\\r\\n\\r\\n                //Shift\\r\\n                stack.push(this.NextToken().Value);\\r\\n                precedences.push(prec);\\r\\n                markers.push(this.LookAhead);\\r\\n                stack.push(this.IsolateCoverGrammar(this.ParseExponentiationExpression));\\r\\n            }\\r\\n\\r\\n            let i=stack.length-1;\\r\\n            expr=stack[i];\\r\\n            let lastMarker=markers.pop();\\r\\n            while(i>1)\\r\\n            {\\r\\n                let marker=markers.pop();\\r\\n                let lastLineStart=lastMarker && lastMarker.LineStart;\\r\\n                let node=this.StartNode(marker, lastLineStart);\\r\\n                let operator=stack[i-1];\\r\\n                expr=this.Finalize(node, this.Node.BinaryExpression(operator, stack[i - 2], expr));\\r\\n                i-=2;\\r\\n                lastMarker=marker;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseExponentiationExpression=function()\\r\\n    {\\r\\n        let startToken=this.LookAhead;\\r\\n        let expr=this.InheritCoverGrammar(this.ParseUnaryExpression);\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseUnaryExpression=function()\\r\\n    {\\r\\n        let expr;\\r\\n        if (this.Match('+') || this.Match('-'))\\r\\n        {\\r\\n            let node=this.StartNode(this.LookAhead);\\r\\n            let token=this.NextToken();\\r\\n            expr=this.InheritCoverGrammar(this.ParseUnaryExpression);\\r\\n            expr=this.Finalize(node, this.Node.UnaryExpression(token.Value, expr));\\r\\n            this.Context.IsAssignmentTarget=false;\\r\\n            this.Context.IsBindingElement=false;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            expr=this.ParseUpdateExpression();\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-update-expressions\\r\\n    this.ParseUpdateExpression=function()\\r\\n    {\\r\\n        let expr;\\r\\n        let startToken=this.LookAhead;\\r\\n        expr=this.InheritCoverGrammar(this.ParseLeftHandSideExpressionAllowCall);\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseLeftHandSideExpressionAllowCall=function()\\r\\n    {\\r\\n        let startToken=this.LookAhead;\\r\\n        let expr;\\r\\n        expr=this.InheritCoverGrammar(this.ParsePrimaryExpression);\\r\\n\\r\\n        while(true)\\r\\n        {\\r\\n            if (this.Match('.'))\\r\\n            {\\r\\n                this.Context.IsBindingElement = false;\\r\\n                this.Context.IsAssignmentTarget = true;\\r\\n                this.Expect('.');\\r\\n                const property = this.ParseMemberIdentifierName();\\r\\n                expr = this.Finalize(this.StartNode(startToken), this.Node.StaticMemberExpression(expr, property,startToken));\\r\\n\\r\\n            }\\r\\n            else if (this.Match('('))\\r\\n            {\\r\\n                this.Context.IsBindingElement=false;\\r\\n                this.Context.IsAssignmentTarget=false;\\r\\n                var args=this.ParseArguments(); //解析 调用参数\\r\\n                expr=this.Finalize(this.StartNode(startToken), this.Node.CallExpression(expr,args,startToken));\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    BooleanLiteral = 1,\\r\\n    EOF=2,\\r\\n    Identifier=3,\\r\\n    Keyword=4,\\r\\n    NullLiteral=5,\\r\\n    NumericLiteral=6,\\r\\n    Punctuator=7,\\r\\n    StringLiteral=9,\\r\\n    RegularExpression=9,\\r\\n    Template=10\\r\\n    */\\r\\n    this.IsIdentifierName=function(token)\\r\\n    {\\r\\n        return token.Type === 3 //Identifier\\r\\n            || token.Type === 4 //Keyword\\r\\n            || token.Type === 1 //BooleanLiteral\\r\\n            || token.Type === 5 ;//NullLiteral;\\r\\n    }\\r\\n\\r\\n    this.ParseIdentifierName=function()\\r\\n    {\\r\\n        const node = this.CreateNode();\\r\\n        const token = this.NextToken();\\r\\n        if (!this.IsIdentifierName(token))\\r\\n        {\\r\\n            this.ThrowUnexpectedToken(token);\\r\\n        }\\r\\n\\r\\n        return this.Finalize(node, this.Node.Identifier(token.Value, token));\\r\\n    }\\r\\n\\r\\n    this.ParseMemberIdentifierName=function()\\r\\n    {\\r\\n        const node = this.CreateNode();\\r\\n        const token = this.NextToken();\\r\\n        if (!this.IsIdentifierName(token))\\r\\n        {\\r\\n            this.ThrowUnexpectedToken(token);\\r\\n        }\\r\\n\\r\\n        return this.Finalize(node, this.Node.MemberIdentifier(token.Value, token));\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions\\r\\n    this.ParseArguments=function()\\r\\n    {\\r\\n        this.Expect('(');\\r\\n        var args=[];\\r\\n        if (!this.Match(')'))\\r\\n        {\\r\\n            while(true)\\r\\n            {\\r\\n                let expr=this.IsolateCoverGrammar(this.ParseAssignmentExpression);\\r\\n                args.push(expr);\\r\\n\\r\\n                if (this.Match(')')) break;\\r\\n\\r\\n                this.ExpectCommaSeparator();\\r\\n\\r\\n                if (this.Match(')')) break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.Expect(')');\\r\\n        return args;\\r\\n    }\\r\\n\\r\\n    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().\\r\\n    this.ExpectCommaSeparator=function()\\r\\n    {\\r\\n        this.Expect(',');\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-primary-expression\\r\\n    this.ParsePrimaryExpression=function()\\r\\n    {\\r\\n        let node=this.CreateNode();\\r\\n        let expr;\\r\\n        var token, raw;\\r\\n        switch(this.LookAhead.Type)\\r\\n        {\\r\\n            case 3:/* Identifier */\\r\\n                token=this.NextToken();\\r\\n                expr=this.Finalize(node, this.Node.Identifier(token.Value, token));\\r\\n                break;\\r\\n            case 6:/* NumericLiteral */\\r\\n            case 8:/* StringLiteral */\\r\\n                this.Context.IsAssignmentTarget=false;\\r\\n                this.Context.IsBindingElement=false;\\r\\n                token=this.NextToken();\\r\\n                raw=this.GetTokenRaw(token);\\r\\n                expr=this.Finalize(node, this.Node.Literal(token.Value,raw,token));\\r\\n                break;\\r\\n            case 7:/* Punctuator */\\r\\n                switch(this.LookAhead.Value)\\r\\n                {\\r\\n                    case '(':\\r\\n                        this.Context.IsBindingElement=false;\\r\\n                        expr=this.InheritCoverGrammar(this.ParseGroupExpression);\\r\\n                        break;\\r\\n                    default:\\r\\n                        expr=this.ThrowUnexpectedToken(this.NextToken())\\r\\n                }\\r\\n                break;\\r\\n            default:\\r\\n                expr = this.ThrowUnexpectedToken(this.NextToken());\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    this.ParseGroupExpression=function()\\r\\n    {\\r\\n        let expr;\\r\\n        this.Expect('(');\\r\\n        if (this.Match(')'))\\r\\n        {\\r\\n            this.NextToken();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            let startToken=this.LookAhead;\\r\\n            let params=[];\\r\\n            let arrow=false;\\r\\n            this.Context.IsBindingElement=true;\\r\\n            expr=this.InheritCoverGrammar(this.ParseAssignmentExpression);\\r\\n            if (this.Match(','))\\r\\n            {\\r\\n                let expressions=[];\\r\\n                this.Context.IsAssignmentTarget=false;\\r\\n                expressions.push(expr);\\r\\n                while(this.LookAhead.Type!=2 /* EOF */)\\r\\n                {\\r\\n                    if (!this.Match(',')) break;\\r\\n\\r\\n                    this.NextToken();\\r\\n                    if (this.Match(')'))\\r\\n                    {\\r\\n\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!arrow)\\r\\n            {\\r\\n                this.Expect(')');\\r\\n                this.Context.IsBindingElement=false;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return expr;\\r\\n    }\\r\\n\\r\\n    // https://tc39.github.io/ecma262/#sec-expression-statement\\r\\n    this.ParseExpressionStatement=function()\\r\\n    {\\r\\n        let node=this.CreateNode();\\r\\n        let expr=this.ParseExpression();\\r\\n        this.ConsumeSemicolon();\\r\\n\\r\\n        return this.Finalize(node,this.Node.ExpressionStatement(expr));\\r\\n    }\\r\\n\\r\\n    this.ConsumeSemicolon=function()\\r\\n    {\\r\\n        if (this.Match(';'))\\r\\n        {\\r\\n            this.NextToken();\\r\\n        }\\r\\n        else if (!this.HasLineTerminator)\\r\\n        {\\r\\n            //if (this.LookAhead.Type!=2/*EOF*/ && !this.Match('}'))\\r\\n\\r\\n            this.LastMarker.Index=this.StartMarker.Index;\\r\\n            this.LastMarker.Line=this.StartMarker.Line;\\r\\n            this.LastMarker.Column=this.StartMarker.Column;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReinterpretExpressionAsPattern=function(expr)\\r\\n    {\\r\\n        switch(expr.Type)\\r\\n        {\\r\\n            case Syntax.Identifier:\\r\\n            case Syntax.MemberExpression:\\r\\n            case Syntax.AssignmentExpression:\\r\\n                break;\\r\\n            default:\\r\\n                break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.Finalize=function(marker,node)\\r\\n    {\\r\\n        node.Marker={ Line:marker.Line, Column:marker.Column, Index:marker.Index };\\r\\n        return node;\\r\\n    }\\r\\n\\r\\n    this.BinaryPrecedence = function (token)\\r\\n    {\\r\\n        let op = token.Value;\\r\\n        let precedence;\\r\\n\\r\\n        if (token.Type === 7 /* Punctuator */) precedence = this.PeratorPrecedence[op] || 0;\\r\\n        else precedence = 0;\\r\\n\\r\\n        return precedence;\\r\\n    };\\r\\n\\r\\n    this.IsolateCoverGrammar=function(parseFunction)\\r\\n    {\\r\\n        let previousIsBindingElement=this.Context.IsBindingElement;\\r\\n        let previousIsAssignmentTarget=this.Context.IsAssignmentTarget;\\r\\n        let previousFirstCoverInitializedNameError=this.Context.FirstCoverInitializedNameError;\\r\\n\\r\\n        this.Context.IsBindingElement=true;\\r\\n        this.Context.IsAssignmentTarget=true;\\r\\n        this.Context.FirstCoverInitializedNameError=null;\\r\\n        let result=parseFunction.call(this);\\r\\n\\r\\n        if (this.Context.FirstCoverInitializedNameError!=null)\\r\\n        {\\r\\n            //错误 this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);\\r\\n        }\\r\\n\\r\\n        this.Context.IsBindingElement=previousIsBindingElement;\\r\\n        this.Context.IsAssignmentTarget=previousIsAssignmentTarget;\\r\\n        this.Context.FirstCoverInitializedNameError=previousFirstCoverInitializedNameError;\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.InheritCoverGrammar = function (parseFunction)\\r\\n    {\\r\\n        let previousIsBindingElement = this.Context.IsBindingElement;\\r\\n        let previousIsAssignmentTarget = this.Context.IsAssignmentTarget;\\r\\n        let previousFirstCoverInitializedNameError = this.Context.FirstCoverInitializedNameError;\\r\\n        this.Context.IsBindingElement = true;\\r\\n        this.Context.IsAssignmentTarget = true;\\r\\n        this.Context.FirstCoverInitializedNameError = null;\\r\\n\\r\\n        let result = parseFunction.call(this);\\r\\n\\r\\n        this.Context.IsBindingElement = this.Context.IsBindingElement && previousIsBindingElement;\\r\\n        this.Context.IsAssignmentTarget = this.Context.IsAssignmentTarget && previousIsAssignmentTarget;\\r\\n        this.Context.FirstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.Context.FirstCoverInitializedNameError;\\r\\n\\r\\n        return result;\\r\\n    };\\r\\n\\r\\n    this.ThrowUnexpectedToken=function(token,message)\\r\\n    {\\r\\n        throw this.UnexpectedTokenError(token,message);\\r\\n    }\\r\\n\\r\\n    this.ThrowUnexpectedError=function(index,line,column,message)\\r\\n    {\\r\\n        let msg=message || \\\"执行异常\\\";\\r\\n\\r\\n        return this.ErrorHandler.ThrowError(index,line,column,msg);\\r\\n    }\\r\\n\\r\\n    this.UnexpectedTokenError=function(token,message)\\r\\n    {\\r\\n        let msg=message || Messages.UnexpectedToken;\\r\\n        let value='ILLEGAL';\\r\\n        if (token)\\r\\n        {\\r\\n            if (!message)\\r\\n            {\\r\\n\\r\\n            }\\r\\n            value=token.Value;\\r\\n        }\\r\\n\\r\\n        msg=msg.replace(\\\"%0\\\",value);\\r\\n        if (token && typeof(token.LineNumber)=='number')\\r\\n        {\\r\\n            let index=token.Start;\\r\\n            let line=token.LineNumber;\\r\\n            let lastMarkerLineStart=this.LastMarker.Index-this.LastMarker.Column;\\r\\n            let column=token.Start-lastMarkerLineStart+1;\\r\\n            return this.ErrorHandler.CreateError(index,line,column,msg);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            let index=this.LastMarker.Index;\\r\\n            let line=this.LastMarker.Line;\\r\\n            let column=this.LastMarker.Column+1;\\r\\n            return this.ErrorHandler.CreateError(index,line,column,msg);\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n/*\\r\\n    算法类\\r\\n*/\\r\\nfunction JSAlgorithm(errorHandler,symbolData)\\r\\n{\\r\\n    this.ErrorHandler=errorHandler;\\r\\n    this.SymbolData=symbolData; //股票数据\\r\\n\\r\\n    //相加\\r\\n    this.Add=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值相加\\r\\n        if (isNumber && isNumber2) return data+data2;\\r\\n\\r\\n        //都是数组相加\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( this.IsNumber(data[i]) && this.IsNumber(data2[i]) ) result[i]=data[i]+data2[i];\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        //单数据和数组相加\\r\\n        let value;\\r\\n        let aryData;\\r\\n        if (isNumber)\\r\\n        {\\r\\n            value=data;\\r\\n            aryData=data2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            value=data2;\\r\\n            aryData=data;\\r\\n        }\\r\\n\\r\\n        for(let i in aryData)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (this.IsNumber(aryData[i]) && this.IsNumber(value)) result[i]=value+aryData[i];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //相减\\r\\n    this.Subtract=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值相减\\r\\n        if (isNumber && isNumber2) return data-data2;\\r\\n\\r\\n        //都是数组相减\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( this.IsNumber(data[i]) &&  this.IsNumber(data2[i]) ) result[i]=data[i]-data2[i];\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data) && this.IsNumber(data2[i])) result[i]=data-data2[i];\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data[i]) && this.IsNumber(data2)) result[i]=data[i]-data2;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //相乘\\r\\n    this.Multiply=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值相乘\\r\\n        if (isNumber && isNumber2) return data*data2;\\r\\n\\r\\n        //都是数组相乘\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( this.IsNumber(data[i]) && this.IsNumber(data2[i]) ) result[i]=data[i]*data2[i];\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        //单数据和数组相乘\\r\\n        let value;\\r\\n        let aryData;\\r\\n        if (isNumber)\\r\\n        {\\r\\n            value=data;\\r\\n            aryData=data2;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            value=data2;\\r\\n            aryData=data;\\r\\n        }\\r\\n\\r\\n        for(let i in aryData)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (this.IsNumber(aryData[i]) && this.IsNumber(value)) result[i]=value*aryData[i];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //相除\\r\\n    this.Divide=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值相除\\r\\n        if (isNumber && isNumber2)\\r\\n        {\\r\\n            if (data2==0) return null;  //除0判断\\r\\n            return data/data2;\\r\\n        }\\r\\n\\r\\n        //都是数组相除\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( this.IsNumber(data[i]) && this.IsDivideNumber(data2[i]) ) result[i]=data[i]/data2[i];\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( this.IsNumber(data) && this.IsDivideNumber(data2[i]) ) result[i]=data/data2[i];\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( this.IsNumber(data[i]) && this.IsDivideNumber(data2) ) result[i]=data[i]/data2;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n\\r\\n    }\\r\\n\\r\\n    //大于\\r\\n    this.GT=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值比较\\r\\n        if (isNumber && isNumber2) return (data>data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组比较\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i]>data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data>data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i]>data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //大于等于\\r\\n    this.GTE=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值比较\\r\\n        if (isNumber && isNumber2) return (data>=data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组比较\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i]>=data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data>=data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i]>=data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //小于\\r\\n    this.LT=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值比较\\r\\n        if (isNumber && isNumber2) return (data<data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组比较\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i]<data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data<data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i]<data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //小于等于\\r\\n    this.LTE=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值比较\\r\\n        if (isNumber && isNumber2) return (data>=data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组比较\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i]<=data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data<=data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i]<=data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //等于\\r\\n    this.EQ=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值比较\\r\\n        if (isNumber && isNumber2) return (data==data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组比较\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i]==data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data==data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i]==data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //不等于\\r\\n    this.NEQ=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值比较\\r\\n        if (isNumber && isNumber2) return (data!=data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组比较\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i]!=data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data!=data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i]!=data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //AND  &&\\r\\n    this.And=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值 &&\\r\\n        if (isNumber && isNumber2) return (data && data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组 &&\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i] && data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data && data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i] && data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //OR  ||\\r\\n    this.Or=function(data,data2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值 &&\\r\\n        if (isNumber && isNumber2) return (data || data2 ? 1 : 0);\\r\\n\\r\\n        //都是数组 &&\\r\\n        let result=[];\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( !isNaN(data[i]) && !isNaN(data2[i]) ) result[i]=(data[i] || data2[i] ? 1:0);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        if (isNumber)   //单数据-数组\\r\\n        {\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data) && !isNaN(data2[i]) ) result[i]=(data || data2[i] ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n        else            //数组-单数据\\r\\n        {\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if ( !isNaN(data[i]) && !isNaN(data2) ) result[i]=(data[i] || data2 ? 1 : 0);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.IF=function(data,trueData,falseData)\\r\\n    {\\r\\n        let isNumber=this.IsNumber(data);\\r\\n        let isNumber2=this.IsNumber(trueData);\\r\\n        let isNumber3=this.IsNumber(falseData);\\r\\n\\r\\n        var isArray2=Array.isArray(trueData);\\r\\n        var isArray3=Array.isArray(falseData);\\r\\n\\r\\n        //单数值\\r\\n        if (isNumber)\\r\\n        {\\r\\n            if (isNumber2 && isNumber3) return data?trueData:falseData;\\r\\n\\r\\n            return data? trueData:falseData;\\r\\n        }\\r\\n\\r\\n        //都是数组\\r\\n        let result=[];\\r\\n        for(let i in data)\\r\\n        {\\r\\n            if (data[i])\\r\\n            {\\r\\n                if (isNumber2) result[i]=trueData;\\r\\n                else if (isArray2) result[i]=trueData[i];\\r\\n                else result[i]=null;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (isNumber3) result[i]=falseData;\\r\\n                else if (isArray3) result[i]=falseData[i];\\r\\n                else result[i]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    根据条件求不同的值,同IF判断相反.\\r\\n    用法: IFN(X,A,B)若X不为0则返回B,否则返回A\\r\\n    例如: IFN(CLOSE>OPEN,HIGH,LOW)表示该周期收阴则返回最高值,否则返回最低值\\r\\n    */\\r\\n\\r\\n    this.IFN=function(data,trueData,falseData)\\r\\n    {\\r\\n        return this.IF(data,falseData,trueData);\\r\\n    }\\r\\n\\r\\n    //指标函数 函数名全部大写\\r\\n\\r\\n    //引用若干周期前的数据(平滑处理).\\r\\n    //用法: REF(X,A),引用A周期前的X值.A可以是变量.\\r\\n    //平滑处理:当引用不到数据时进行的操作.此函数中,平滑时使用上一个周期的引用值.\\r\\n    //例如: REF(CLOSE,BARSCOUNT(C)-1)表示第二根K线的收盘价.\\r\\n    this.REF=function(data,n)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (typeof(n)=='number')\\r\\n        {\\r\\n            if (data.length<=0) return result;\\r\\n            if (n>=data.length) return result;\\r\\n\\r\\n            result=data.slice(0,data.length-n);\\r\\n\\r\\n            //平滑处理\\r\\n            var firstData=data[0];\\r\\n            for(let i=0;i<n;++i)\\r\\n                result.unshift(firstData);\\r\\n        }\\r\\n        else    //n 为数组的情况\\r\\n        {\\r\\n            for(let i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=n.length) continue;\\r\\n                var value=n[i];\\r\\n                if (value>=0 && value<=i) result[i]=data[i-value];\\r\\n                else if (i) result[i]=result[i-1];\\r\\n                else result[i]=data[i];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //引用若干周期前的数据(未作平滑处理).\\r\\n    //用法: REFV(X,A),引用A周期前的X值.A可以是变量.\\r\\n    //平滑处理:当引用不到数据时进行的操作.\\r\\n    //例如: REFV(CLOSE,BARSCOUNT(C)-1)表示第二根K线的收盘价.\\r\\n    this.REFV=function(data,n)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (typeof(n)=='number')\\r\\n        {\\r\\n            if (data.length<=0) return result;\\r\\n            if (n>=data.length) return result;\\r\\n\\r\\n            result=data.slice(0,data.length-n);\\r\\n\\r\\n            for(let i=0;i<n;++i)    //不作平滑处理\\r\\n                result.unshift(null);\\r\\n        }\\r\\n        else    //n 为数组的情况\\r\\n        {\\r\\n            for(let i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=n.length) continue;\\r\\n                var value=n[i];\\r\\n                if (value>=0 && value<=i) result[i]=data[i-value];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //属于未来函数,引用若干周期后的数据(平滑处理).\\r\\n    //用法: REFX(X,A),引用A周期后的X值.A可以是变量.\\r\\n    //平滑处理:当引用不到数据时进行的操作.此函数中,平滑时使用上一个周期的引用值.\\r\\n    //例如: TT:=IF(C>O,1,2);\\r\\n    //      REFX(CLOSE,TT);表示阳线引用下一周期的收盘价,阴线引用日后第二周期的收盘价.\\r\\n    this.REFX=function(data,n)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (typeof(n)=='number')\\r\\n        {\\r\\n            if (data.length<=0) return result;\\r\\n            if (n>=data.length) return result;\\r\\n\\r\\n            result=data.slice(n,data.length);\\r\\n\\r\\n            //平滑处理\\r\\n            var lastData=data[data.length-1];\\r\\n            for(let i=0;i<n;++i)\\r\\n                result.push(lastData);\\r\\n        }\\r\\n        else    //n 为数组的情况\\r\\n        {\\r\\n            var dataCount=data.length;\\r\\n            for(let i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=n.length) continue;\\r\\n                var value=n[i];\\r\\n                if (value>=0 && value+i<dataCount) result[i]=data[i+value];\\r\\n                else if (i) result[i]=result[i-1];\\r\\n                else result[i]=data[i];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //属于未来函数,引用若干周期后的数据(未作平滑处理).\\r\\n    //用法:REFXV(X,A),引用A周期后的X值.A可以是变量.\\r\\n    //平滑处理:当引用不到数据时进行的操作.\\r\\n    //例如: REFXV(CLOSE,1)表示下一周期的收盘价,在日线上就是明天收盘价\\r\\n    this.REFXV=function(data,n)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (typeof(n)=='number')\\r\\n        {\\r\\n            if (data.length<=0) return result;\\r\\n            if (n>=data.length) return result;\\r\\n\\r\\n            result=data.slice(n,data.length);\\r\\n\\r\\n            //平滑处理\\r\\n            for(let i=0;i<n;++i)\\r\\n                result.push(null);\\r\\n        }\\r\\n        else    //n 为数组的情况\\r\\n        {\\r\\n            var dataCount=data.length;\\r\\n            for(let i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=n.length) continue;\\r\\n                var value=n[i];\\r\\n                if (value>=0 && value+i<dataCount) result[i]=data[i+value];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //求最大值.\\r\\n    //用法:MAX(A,B,C,D ..... ) 返回A,B,C,D ..... 中的较大值\\r\\n    //例如: MAX(CLOSE-OPEN,0)表示若收盘价大于开盘价返回它们的差值,否则返回0\\r\\n    this.MAX=function(args, node)\\r\\n    {\\r\\n        if (args.length==0) this.ThrowUnexpectedNode(node,'MAX() Error: 参数个数不能为0');\\r\\n        if (args.length==1) return args[0];\\r\\n\\r\\n        var aryData=[], aryNumber=[];\\r\\n        for(var i in args)\\r\\n        {\\r\\n            var item=args[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item)) aryNumber.push(item);\\r\\n            else if (Array.isArray(item)) aryData.push(item);\\r\\n        }\\r\\n\\r\\n        var maxNumber=null;\\r\\n        if (aryNumber.length>0)\\r\\n        {\\r\\n            maxNumber=aryNumber[0];\\r\\n            for(var i=1; i<aryNumber.length; ++i)\\r\\n            {\\r\\n                maxNumber=Math.max(maxNumber,aryNumber[i]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var maxAryData=null;\\r\\n        if (aryData.length>0)\\r\\n        {\\r\\n            maxAryData=aryData[0].slice(0);\\r\\n            for(var i=1;i<aryData.length;++i)\\r\\n            {\\r\\n                var dataItem=aryData[i];\\r\\n                for(var j in dataItem)\\r\\n                {\\r\\n                    var maxItem=maxAryData[j];\\r\\n                    var item=dataItem[j];\\r\\n                    if (!IFrameSplitOperator.IsNumber(maxItem)) continue;\\r\\n                    if (!IFrameSplitOperator.IsNumber(item))\\r\\n                    {\\r\\n                        maxAryData[j]=null;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    maxAryData[j]=Math.max(maxItem,item);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (maxAryData==null && maxNumber!=null) return maxNumber;\\r\\n        if (maxAryData && maxNumber==null) return maxAryData;\\r\\n\\r\\n        for(var i in maxAryData)\\r\\n        {\\r\\n            if (!IFrameSplitOperator.IsNumber(maxAryData[i])) continue;\\r\\n            maxAryData[i]=Math.max(maxAryData[i],maxNumber);\\r\\n        }\\r\\n\\r\\n        return maxAryData;\\r\\n    }\\r\\n\\r\\n    //求最小值.\\r\\n    //用法:MIN(A,B, C, D .....)返回A,B, C ,D ......中的较小值\\r\\n    //例如:MIN(CLOSE,OPEN)返回开盘价和收盘价中的较小值\\r\\n    this.MIN=function(args, node)\\r\\n    {\\r\\n        if (args.length==0) this.ThrowUnexpectedNode(node,'MIN() Error: 参数个数不能为0');\\r\\n        if (args.length==1) return args[0];\\r\\n\\r\\n        var aryData=[], aryNumber=[];\\r\\n        for(var i in args)\\r\\n        {\\r\\n            var item=args[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item)) aryNumber.push(item);\\r\\n            else if (Array.isArray(item)) aryData.push(item);\\r\\n        }\\r\\n\\r\\n        var minNumber=null;\\r\\n        if (aryNumber.length>0)\\r\\n        {\\r\\n            minNumber=aryNumber[0];\\r\\n            for(var i=1; i<aryNumber.length; ++i)\\r\\n            {\\r\\n                minNumber=Math.min(minNumber,aryNumber[i]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var minAryData=null;\\r\\n        if (aryData.length>0)\\r\\n        {\\r\\n            minAryData=aryData[0].slice(0);\\r\\n            for(var i=1;i<aryData.length;++i)\\r\\n            {\\r\\n                var dataItem=aryData[i];\\r\\n                for(var j in dataItem)\\r\\n                {\\r\\n                    var minItem=minAryData[j];\\r\\n                    var item=dataItem[j];\\r\\n                    if (!IFrameSplitOperator.IsNumber(minItem)) continue;\\r\\n                    if (!IFrameSplitOperator.IsNumber(item))\\r\\n                    {\\r\\n                        minAryData[j]=null;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    minAryData[j]=Math.min(minItem,item);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (minAryData==null && minNumber!=null) return minNumber;\\r\\n        if (minAryData && minNumber==null) return minAryData;\\r\\n\\r\\n        for(var i in minAryData)\\r\\n        {\\r\\n            if (!IFrameSplitOperator.IsNumber(minAryData[i])) continue;\\r\\n            minAryData[i]=Math.min(minAryData[i],minNumber);\\r\\n        }\\r\\n\\r\\n        return minAryData;\\r\\n    }\\r\\n\\r\\n    //取正数\\r\\n    this.ABS=function(data)\\r\\n    {\\r\\n        let result=[];\\r\\n\\r\\n        for(let i in data)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (!isNaN(data[i])) result[i]=Math.abs(data[i]);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.MA=function(data,dayCount)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (dayCount<=0) return result;\\r\\n\\r\\n        if (!Array.isArray(dayCount))\\r\\n        {\\r\\n            if (dayCount<=0) dayCount=1;\\r\\n            if (!data || !data.length) return result;\\r\\n\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data[i])) break;\\r\\n            }\\r\\n\\r\\n            var data=data.slice(0); //复制一份数据出来\\r\\n            for(var days=0;i<data.length;++i,++days)\\r\\n            {\\r\\n                if (days<dayCount-1)\\r\\n                {\\r\\n                    result[i]=null;\\r\\n                    continue;\\r\\n                }\\r\\n\\r\\n                let preValue=data[i-(dayCount-1)];\\r\\n                let sum=0;\\r\\n                for(let j=dayCount-1;j>=0;--j)\\r\\n                {\\r\\n                    var value=data[i-j];\\r\\n                    if (!this.IsNumber(value))\\r\\n                    {\\r\\n                        value=preValue;  //空数据就取上一个数据\\r\\n                        data[i-j]=value;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        preValue=value;\\r\\n                    }\\r\\n                    sum+=value;\\r\\n                }\\r\\n\\r\\n                result[i]=sum/dayCount;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=dayCount.length) continue;\\r\\n                var sumCount=dayCount[i];\\r\\n                if (!this.IsNumber(sumCount)) continue;\\r\\n                if (sumCount<=0) continue;\\r\\n\\r\\n                var sum=0;\\r\\n                var count=0;\\r\\n                for(var j=i, k=0;j>=0 && k<sumCount;--j,++k)\\r\\n                {\\r\\n                    sum+=data[j];\\r\\n                    ++count;\\r\\n                }\\r\\n                if (count>0) result[i]=sum/count;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //指数平均数指标 EMA(close,10)\\r\\n    //N  支持周期数组\\r\\n    this.EMA=function(data,dayCount)\\r\\n    {\\r\\n        var result = [];\\r\\n        if (data.length<=0) return result;\\r\\n\\r\\n        if (Array.isArray(dayCount))\\r\\n        {\\r\\n            for(var i=0;i<dayCount.length;++i)\\r\\n            {\\r\\n                var period=dayCount[i];\\r\\n                if (!this.IsNumber(period)) continue;\\r\\n                period=parseInt(period);    //周期用整数\\r\\n                if (period<=0) continue;\\r\\n\\r\\n                if (period>i+1) period=i+1;\\r\\n                //EMA(N) = 2/(N+1)*C + (N-1)/(N+1)*EMA', EMA'为前一天的ema\\r\\n                var EMAFactor=[ 2/ (period + 1), (period - 1) / (period + 1)];\\r\\n\\r\\n                var ema=null;\\r\\n                var lastEMA=null;\\r\\n                for(var j=0;j<period;++j)\\r\\n                {\\r\\n                    var index=i-(period-j-1);\\r\\n                    var value=data[index];\\r\\n                    if (!this.IsNumber(value)) coninue;\\r\\n                    if (lastEMA==null)\\r\\n                    {\\r\\n                        ema=value;  //第一个EMA为第一个数据的价格\\r\\n                        lastEMA=ema;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        ema = EMAFactor[0] * value + EMAFactor[1] * lastEMA;\\r\\n                        lastEMA=ema;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=ema;\\r\\n            }\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var offset=0;\\r\\n            //取首个有效数据\\r\\n            for(;offset<data.length;++offset)\\r\\n            {\\r\\n                if (data[offset]!=null && !isNaN(data[offset]))\\r\\n                    break;\\r\\n            }\\r\\n\\r\\n            var p1Index=offset;\\r\\n            var p2Index=offset+1;\\r\\n\\r\\n            result[p1Index]=data[p1Index];\\r\\n            for(var i=offset+1;i<data.length;++i,++p1Index,++p2Index)\\r\\n            {\\r\\n                result[p2Index]=((2*data[p2Index]+(dayCount-1)*result[p1Index]))/(dayCount+1);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.XMA=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        var offset=0;\\r\\n        for(;offset<data.length;++offset)\\r\\n        {\\r\\n            if (this.IsNumber(data[offset])) break;\\r\\n        }\\r\\n\\r\\n        var p = parseInt((n - 2) / 2);\\r\\n        var sum = 0;\\r\\n        var count = 0, start=0, end = 0;\\r\\n\\r\\n        for(var i=offset, j=0; i<data.length; ++i)\\r\\n        {\\r\\n            start = i - p - 1;\\r\\n            end = i + (n - p) - 1;\\r\\n            for (j = start; j < end; ++j)\\r\\n            {\\r\\n                if (j >= 0 && j<data.length)\\r\\n                {\\r\\n                    if (this.IsNumber(data[j]))\\r\\n                    {\\r\\n                        sum += data[j];\\r\\n                        ++count;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (count!=0) result[i]=(sum / count);\\r\\n            else result[i]=null;\\r\\n\\r\\n            sum = 0;\\r\\n            count = 0;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n        SMA 移动平均\\r\\n        返回移动平均。\\r\\n        用法：　SMA(X，N，M)　X的N日移动平均，M为权重，如Y=(X*M+Y'*(N-M))/N\\r\\n    */\\r\\n    this.SMA=function(data,n,m)\\r\\n    {\\r\\n        var result = [];\\r\\n\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            for( var i=0;i<n.length;++i)\\r\\n            {\\r\\n                var period=n[i];\\r\\n                if (!this.IsNumber(period)) continue;\\r\\n                period=parseInt(period);\\r\\n                if (period<=0) continue;\\r\\n                if (period>i+1) period=i+1;\\r\\n\\r\\n                var lastSMA=null;\\r\\n                var sma=null;\\r\\n                for(var j=0;j<period;++j)\\r\\n                {\\r\\n                    var index=i-(period-j-1);\\r\\n                    var item=data[index];\\r\\n                    if (!this.IsNumber(item)) continue;\\r\\n                    if (lastSMA==null)\\r\\n                    {\\r\\n                        lastSMA=item;\\r\\n                        sma=item;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        sma=(m*item+(period-m)*lastSMA)/period;\\r\\n                        lastSMA=sma;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=sma;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var i=0;\\r\\n            var lastData=null;\\r\\n            for(;i<data.length; ++i)\\r\\n            {\\r\\n                if (data[i]==null || isNaN(data[i])) continue;\\r\\n                lastData=data[i];\\r\\n                result[i]=lastData; //第一天的数据\\r\\n                break;\\r\\n            }\\r\\n\\r\\n            for(++i;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=(m*data[i]+(n-m)*lastData)/n;\\r\\n                lastData=result[i];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    求动态移动平均.\\r\\n    用法: DMA(X,A),求X的动态移动平均.\\r\\n    算法: 若Y=DMA(X,A)则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1.\\r\\n    例如:DMA(CLOSE,VOL/CAPITAL)表示求以换手率作平滑因子的平均价\\r\\n    */\\r\\n    this.DMA=function(data,data2)\\r\\n    {\\r\\n        var result = [];\\r\\n        if (data.length<0 || data.length!=data2.length) return result;\\r\\n\\r\\n        var index=0;\\r\\n        for(;index<data.length;++index)\\r\\n        {\\r\\n            if (data[index]!=null && !isNaN(data[index]) && data2[index]!=null && !isNaN(data2[index]))\\r\\n            {\\r\\n                result[index]=data[index];\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for(index=index+1;index<data.length;++index)\\r\\n        {\\r\\n            if (data[index]==null || data2[index]==null)\\r\\n                result[index]=null;\\r\\n            else\\r\\n            {\\r\\n                if (data2[index]<1)\\r\\n                    result[index]=(data2[index]*data[index])+(1-data2[index])*result[index-1];\\r\\n                else\\r\\n                    result[index]= data[index];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n    /*\\r\\n    返回加权移动平均\\r\\n    用法:WMA(X,N):X的N日加权移动平均.\\r\\n    算法:Yn=(1*X1+2*X2+...+n*Xn)/(1+2+...+n)\\r\\n     */\\r\\n    this.WMA=function(data, dayCount)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (!data || !data.length) return result;\\r\\n\\r\\n        if (Array.isArray(dayCount))\\r\\n        {\\r\\n            for(i=0;i<dayCount.length && i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var period=dayCount[i];\\r\\n                if (period<=0) continue;\\r\\n                var start=0,value=0, index=0, preValue=0;\\r\\n                for(var j=0;j<period;++j)\\r\\n                {\\r\\n                    index=i-(period-j-1);\\r\\n                    value=data[index];\\r\\n                    start=j;\\r\\n                    if (this.IsNumber(value))\\r\\n                    {\\r\\n                        preValue=value;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (start>=period) continue;\\r\\n                var sum=0, count=0;\\r\\n                for(var j=start, k=1;j<period; ++j, ++k)\\r\\n                {\\r\\n                    index=i-(period-j-1);\\r\\n                    value=data[index];\\r\\n                    if (this.IsNumber(value))\\r\\n                        preValue=value;\\r\\n                    else\\r\\n                        value=preValue;\\r\\n\\r\\n                    count += k;\\r\\n                    sum += value * k;\\r\\n                }\\r\\n\\r\\n                result[i] = sum / count;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (dayCount<=0) return [];\\r\\n            var i = 0;\\r\\n            for(i = 0; i < data.length && !this.IsNumber(data[i]); ++i)\\r\\n            {\\r\\n                result[i] = null;\\r\\n            }\\r\\n            var data = data.slice(0);\\r\\n            for(var days=0; i < data.length; ++i,++days)\\r\\n            {\\r\\n                if (days < dayCount-1)\\r\\n                {\\r\\n                    result[i] = null;\\r\\n                    continue;\\r\\n                }\\r\\n                var preValue = data[i - (dayCount-1)];\\r\\n                var sum = 0;\\r\\n                var count = 0;\\r\\n                for (var j = dayCount-1; j >= 0; --j)\\r\\n                {\\r\\n                    var value = data[i-j];\\r\\n                    if (!this.IsNumber(value))\\r\\n                    {\\r\\n                        value = preValue;\\r\\n                        data[i-j] = value;\\r\\n                    }\\r\\n                    else\\r\\n                        preValue = value;\\r\\n\\r\\n                    count += dayCount - j;\\r\\n                    sum += value * (dayCount - j);\\r\\n                }\\r\\n                result[i] = sum / count;\\r\\n            }\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n    /*\\r\\n    返回平滑移动平均\\r\\n    用法:MEMA(X,N):X的N日平滑移动平均,如Y=(X+Y'*(N-1))/N\\r\\n    MEMA(X,N)相当于SMA(X,N,1)\\r\\n    */\\r\\n    this.MEMA=function(data, dayCount)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (!data || !data.length) return result;\\r\\n        var i = 0, j = 0;\\r\\n        for (j = 0; j < data.length && !this.IsNumber(data[j]); ++j)\\r\\n        {\\r\\n            result[j] = null;\\r\\n        }\\r\\n        i = j;\\r\\n        if (dayCount < 1 || i+dayCount >= data.length) return result;\\r\\n        var sum = 0;\\r\\n        var data = data.slice(0);\\r\\n        for (; i < j+dayCount; ++i)\\r\\n        {\\r\\n            result[i] = null;\\r\\n            if (!this.IsNumber(data[i]) && i-1 >= 0)\\r\\n                data[i] = data[i-1];\\r\\n            sum += data[i];\\r\\n        }\\r\\n        result[i-1] = sum / dayCount;\\r\\n        for (; i < data.length; ++i)\\r\\n        {\\r\\n            if (this.IsNumber(result[i-1]) && this.IsNumber(data[i]))\\r\\n                result[i] = (data[i]+result[i-1]*(dayCount-1)) / dayCount;\\r\\n            else if (i-1 > -1 && this.IsNumber(result[i-1]))\\r\\n                result[i] = result[i-1];\\r\\n            else\\r\\n                result[i] = null;\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n    /*\\r\\n    加权移动平均\\r\\n    返回加权移动平均\\r\\n    用法:EXPMA(X,M):X的M日加权移动平均\\r\\n    EXPMA[i]=buffer[i]*para+(1-para)*EXPMA[i-1] para=2/(1+__para)\\r\\n    */\\r\\n    this.EXPMA=function(data,dayCount)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (dayCount>=data.length) return result;\\r\\n\\r\\n        let i=dayCount;\\r\\n        for(;i<data.length;++i) //获取第1个有效数据\\r\\n        {\\r\\n            if (data[i]!=null)\\r\\n            {\\r\\n                result[i]=data[i];\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        for (i=i+1; i < data.length; ++i)\\r\\n        {\\r\\n            if (result[i-1]!=null && data[i]!=null)\\r\\n                result[i]=(2*data[i]+(dayCount-1)*result[i-1])/(dayCount+1);\\r\\n            else if (result[i-1]!=null)\\r\\n                result[i]=result[i-1];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //加权平滑平均,MEMA[i]=SMA[i]*para+(1-para)*SMA[i-1] para=2/(1+__para)\\r\\n    this.EXPMEMA=function(data,dayCount)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (dayCount>=data.length) return result;\\r\\n\\r\\n        var index=0;\\r\\n        for(;index<data.length;++index)\\r\\n        {\\r\\n            if (data[index] && !isNaN(data[index])) break;\\r\\n        }\\r\\n\\r\\n        var sum=0;\\r\\n        for(var i=0; index<data.length && i<dayCount;++i, ++index)\\r\\n        {\\r\\n            if (data[index] && !isNaN(data[index]))\\r\\n                sum+=data[index];\\r\\n            else\\r\\n                sum+=data[index-1];\\r\\n        }\\r\\n\\r\\n        result[index-1]=sum/dayCount;\\r\\n        for(;index<data.length;++index)\\r\\n        {\\r\\n            if(result[index-1]!=null && data[index]!=null)\\r\\n                result[index]=(2*data[index]+(dayCount-1)*result[index-1])/(dayCount+1);\\r\\n            else if(result[index-1]!=null)\\r\\n                result[index] = result[index-1];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n    /*\\r\\n    向前累加到指定值到现在的周期数.\\r\\n    用法:SUMBARS(X,A):将X向前累加直到大于等于A,返回这个区间的周期数\\r\\n    例如:SUMBARS(VOL,CAPITAL)求完全换手到现在的周期数\\r\\n     */\\r\\n    this.SUMBARS=function(data, data2)\\r\\n    {\\r\\n        var result = [];\\r\\n        if (!data || !data.length || !data2 || !data2.length) return result;\\r\\n        var start = 0, i = 0, j = 0;\\r\\n        for(; start < data.length && !this.IsNumber(data[start]); ++start)\\r\\n        {\\r\\n            result[start] = null;\\r\\n        }\\r\\n\\r\\n        for (i = data.length-1; i >= start; --i)\\r\\n        {\\r\\n            var total = 0;\\r\\n            for (j = i, total = 0; j >= start && total < data2[i]; --j)\\r\\n                total += data[j];\\r\\n            if (j < start) result[i] = null;\\r\\n            else result[i] = i - j;\\r\\n        }\\r\\n        for(i = start+1; i < data.length; ++i)\\r\\n        {\\r\\n            if (result[i]==null)\\r\\n                result[i] = result[i-1];\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n    /*\\r\\n    求相反数.\\r\\n    用法:REVERSE(X)返回-X.\\r\\n    例如:REVERSE(CLOSE)返回-CLOSE\\r\\n     */\\r\\n    this.REVERSE=function(data)\\r\\n    {\\r\\n        if (this.IsNumber(data))\\r\\n        {\\r\\n            return 0-data;\\r\\n        }\\r\\n\\r\\n        var result = [];\\r\\n        var i = 0;\\r\\n        for (; i<data.length && !this.IsNumber(data[i]); ++i)\\r\\n        {\\r\\n            result[i] = null;\\r\\n        }\\r\\n\\r\\n        for (; i < data.length; ++i)\\r\\n        {\\r\\n            if (!this.IsNumber(data[i]))\\r\\n                result[i] = null;\\r\\n            else\\r\\n                result[i] = 0-data[i];\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    统计满足条件的周期数.\\r\\n\\t用法:COUNT(X, N), 统计N周期中满足X条件的周期数, 若N<0则从第一个有效值开始.\\r\\n    例如 :COUNT(CLOSE>OPEN, 20)表示统计20周期内收阳的周期数\\r\\n    N 支持数组\\r\\n    */\\r\\n    this.COUNT=function(data,n)\\r\\n    {\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            var start=null;\\r\\n            var dataCount=data.length;\\r\\n            for(var i=0;i<dataCount;++i)\\r\\n            {\\r\\n                if (this.IsNumber(data[i]))\\r\\n                {\\r\\n                    start=i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n            if (start==null) return [];\\r\\n\\r\\n            var result=[];\\r\\n            var count=0;\\r\\n            for(var i=0;i<n.length;++i)\\r\\n            {\\r\\n                var period=n[i];\\r\\n                if (!IFrameSplitOperator.IsNumber(period)) continue;\\r\\n\\r\\n                if (period<1) period=i+1;\\r\\n                count=0;\\r\\n                for(var j=i, k=0 ;j>=0 && k<period ;--j,++k)    //当前往前period天 统计\\r\\n                {\\r\\n                    if (data[j]) ++count;\\r\\n                }\\r\\n\\r\\n                result[i]=count;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var period=n;\\r\\n            var dataCount=data.length;\\r\\n            var period=period<1?dataCount:period;\\r\\n\\r\\n            var i=0,j=0;\\r\\n            for(;i<dataCount;++i)   // 取第1个有效数据\\r\\n            {\\r\\n                if (this.IsNumber(data[i])) break;\\r\\n            }\\r\\n\\r\\n            var result=[];\\r\\n            var days=0;\\r\\n            for(;i<dataCount && j<period; ++i,++j)\\r\\n            {\\r\\n                days=data[i]?days+1:days;\\r\\n                result[i]=days;\\r\\n            }\\r\\n\\r\\n            for(;i<dataCount;++i)\\r\\n            {\\r\\n                if (data[i-period] && days) days--;\\r\\n\\r\\n                days=data[i] ? days+1 : days;\\r\\n                result[i]=days;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    HHV 最高值\\r\\n    求最高值。\\r\\n    用法：　HHV(X，N)　求N周期内X最高值，N=0则从第一个有效值开始。\\r\\n    例如：　HHV(HIGH,30)　表示求30日最高价。\\r\\n    */\\r\\n    this.HHV=function(data,n)\\r\\n    {\\r\\n        let result = [];\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            var max=null;\\r\\n            for(var i=0,j=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=n.length) continue;\\r\\n\\r\\n                max=null;\\r\\n                var count=n[i];\\r\\n                if (count>0 && count<=i)\\r\\n                {\\r\\n                    for(j=i-count;j<=i;++j)\\r\\n                    {\\r\\n                        if (max==null || max<data[j]) max=data[j];\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    count=i;\\r\\n                    for(j=0;j<=i;++j)\\r\\n                    {\\r\\n                        if (max==null || max<data[j]) max=data[j];\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=max;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (!IFrameSplitOperator.IsNonEmptyArray(data)) return result;\\r\\n            if (n<=0) n=data.length;\\r\\n            else if (n>data.length) n=data.length;\\r\\n\\r\\n            var nStart=this.GetFirstVaildIndex(data);\\r\\n            if (nStart>=data.length) return result;\\r\\n\\r\\n            var nMax=nStart;\\r\\n            if (nMax<data.length) result[nMax]=data[nMax];\\r\\n            for(var i=nMax+1,j=2;i<data.length && j<n;++i,++j)\\r\\n            {\\r\\n                if (data[i]>=data[nMax]) nMax=i;\\r\\n                result[i]=data[nMax];\\r\\n            }\\r\\n\\r\\n            for(;i<data.length;++i)\\r\\n            {\\r\\n                if (i-nMax<n)\\r\\n                {\\r\\n                    nMax=data[i]<data[nMax]?nMax:i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    for(j=nMax=(i-n+1);j<=i;++j)\\r\\n                    {\\r\\n                        nMax=data[j]<data[nMax]?nMax:j;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=data[nMax];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    LLV 最低值\\r\\n    求最低值。\\r\\n    用法：　LLV(X，N)　求N周期内X最低值，N=0则从第一个有效值开始。\\r\\n    例如：　LLV(LOW，0)　表示求历史最低价。\\r\\n    */\\r\\n    this.LLV=function(data,n)\\r\\n    {\\r\\n        var result = [];\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (i>=n.length) continue;\\r\\n\\r\\n                var min=null;\\r\\n                var count=n[i];\\r\\n                if (count>0 && count<=i)\\r\\n                {\\r\\n                    for(var j=i-count;j<=i;++j)\\r\\n                    {\\r\\n                        if (min==null || min>data[j]) min=data[j];\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    count=i;\\r\\n                    for(var j=0;j<=i;++j)\\r\\n                    {\\r\\n                        if (min==null || min>data[j]) min=data[j];\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=min;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (!IFrameSplitOperator.IsNonEmptyArray(data)) return result;\\r\\n            if (n<=0) n=data.length;\\r\\n            else if (n>data.length) n=data.length;\\r\\n\\r\\n            var nStart=this.GetFirstVaildIndex(data);\\r\\n            if (nStart>=data.length) return result;\\r\\n\\r\\n            var nMin=nStart;\\r\\n            if (nMin<data.length) result[nMin]=data[nMin];\\r\\n            for(var i=nMin+1,j=2;i<data.length && j<n;++i,++j)\\r\\n            {\\r\\n                if (data[i]<=data[nMin]) nMin=i;\\r\\n                result[i]=data[nMin];\\r\\n            }\\r\\n\\r\\n            for(;i<data.length;++i)\\r\\n            {\\r\\n                if (i-nMin<n)\\r\\n                {\\r\\n                    nMin=data[i]>data[nMin]?nMin:i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    for(j=nMin=(i-n+1);j<=i;++j)\\r\\n                    {\\r\\n                        nMin=data[j]>data[nMin]?nMin:j;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=data[nMin];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.STD=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        if (!Array.isArray(data)) return result;\\r\\n        var nStart=this.GetFirstVaildIndex(data);\\r\\n        if (!IFrameSplitOperator.IsNumber(n)) return result;\\r\\n        if(nStart+n>data.length || n<1) return result;\\r\\n\\r\\n        var i=nStart, j=0, bFirst=true, dTotal=0, dAvg=0;\\r\\n        for(i+=n-1;i<data.length;++i)\\r\\n        {\\r\\n            dTotal = 0;\\r\\n            if(bFirst)\\r\\n            {\\r\\n                bFirst = false;\\r\\n                for(j=i-n+1;j<=i;++j)\\r\\n                {\\r\\n                    dAvg += data[j];\\r\\n                }\\r\\n\\r\\n                dAvg /= n;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                dAvg += (data[i]-data[i-n])/n;\\r\\n            }\\r\\n\\r\\n            for(j=i-n+1;j<=i;++j)\\r\\n            {\\r\\n                dTotal += (data[j]-dAvg)*(data[j]-dAvg);\\r\\n            }\\r\\n\\r\\n\\r\\n            result[i] = Math.sqrt(dTotal/(n-1));\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //平均绝对方差\\r\\n    this.AVEDEV=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        var total=0;\\r\\n        var averageData=[]; //平均值\\r\\n        for(var i=n-1;i<data.length;++i)\\r\\n        {\\r\\n            total=0;\\r\\n            for(var j=0;j<n;++j)\\r\\n            {\\r\\n                total+=data[i-j];\\r\\n            }\\r\\n\\r\\n            averageData[i]=total/n;\\r\\n        }\\r\\n\\r\\n        for(var i=n-1;i<data.length;++i)\\r\\n        {\\r\\n            total=0;\\r\\n            for(var j=0;j<n;++j)\\r\\n            {\\r\\n                total+=Math.abs(data[i-j]-averageData[i]);\\r\\n            }\\r\\n\\r\\n            result[i]=total/n;\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //上穿\\r\\n    this.CROSS=function(data,data2)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        if (Array.isArray(data) && Array.isArray(data2))\\r\\n        {\\r\\n            if (data.length!=data2.length) return result=[];\\r\\n\\r\\n            var index=0;\\r\\n            for(;index<data.length;++index)\\r\\n            {\\r\\n                if (this.IsNumber(data[index])  && this.IsNumber(data2[index]))\\r\\n                    break;\\r\\n            }\\r\\n\\r\\n            for(++index;index<data.length;++index)\\r\\n            {\\r\\n                result[index]= (data[index]>data2[index] && data[index-1]<data2[index-1]) ? 1:0;\\r\\n            }\\r\\n        }\\r\\n        else if (Array.isArray(data) && typeof(data2)=='number')\\r\\n        {\\r\\n            var index=0;\\r\\n            for(;index<data.length;++index)\\r\\n            {\\r\\n                if (this.IsNumber(data[index])) break;\\r\\n            }\\r\\n\\r\\n            for(++index;index<data.length;++index)\\r\\n            {\\r\\n                result[index]= (data[index]>data2 && data[index-1]<data2) ? 1:0;\\r\\n            }\\r\\n        }\\r\\n        else if (typeof(data)=='number' && Array.isArray(data2))\\r\\n        {\\r\\n            var index=0;\\r\\n            for(;index<data2.length;++index)\\r\\n            {\\r\\n                if (this.IsNumber(data2[index])) break;\\r\\n            }\\r\\n\\r\\n            for(++index;index<data2.length;++index)\\r\\n            {\\r\\n                result[index]= (data2[index]<data && data2[index-1]>data) ? 1:0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //累乘\\r\\n    this.MULAR=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!Array.isArray(n))\\r\\n        {\\r\\n            if(data.length<n) return result;\\r\\n            if (n==0)\\r\\n            {\\r\\n                var index=n;\\r\\n                for(;index<data.length;++index)\\r\\n                {\\r\\n                    if (this.IsNumber(data[index]))\\r\\n                    {\\r\\n                        result[index]=data[index];\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                for(++index;index<data.length;++index)\\r\\n                {\\r\\n                    result[index]=result[index-1]*data[index];\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                for(var i=n-1,j=0;i<data.length;++i,++j)\\r\\n                {\\r\\n                    for(var k=0;k<n;++k)\\r\\n                    {\\r\\n                        if (k==0) result[i]=data[k+j];\\r\\n                        else result[i]*=data[k+j];\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var totalCount=n[i];\\r\\n                if (!this.IsNumber(totalCount)) continue;\\r\\n                totalCount=parseInt(totalCount);\\r\\n                if (totalCount<0) continue;\\r\\n\\r\\n                for(var j=i, k=0 ;j>=0 && k<totalCount ;--j,++k)\\r\\n                {\\r\\n                    if (k==0) result[i]=data[j];\\r\\n                    else result[i]*=data[j];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.SUM=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        if (!Array.isArray(n))\\r\\n        {\\r\\n            if (n==0)\\r\\n            {\\r\\n                result[0]=data[0];\\r\\n\\r\\n                for (var i=1; i<data.length; ++i)\\r\\n                {\\r\\n                    result[i] = result[i-1]+data[i];\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                for(var i=n-1,j=0;i<data.length;++i,++j)\\r\\n                {\\r\\n                    for(var k=0;k<n;++k)\\r\\n                    {\\r\\n                        if (k==0) result[i]=data[k+j];\\r\\n                        else result[i]+=data[k+j];\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var totalCount=n[i];\\r\\n                if (!(totalCount>0)) continue;\\r\\n\\r\\n                for(var j=i, k=0 ;j>=0 && k<totalCount ;--j,++k)\\r\\n                {\\r\\n                    if (k==0) result[i]=data[j];\\r\\n                    else result[i]+=data[j];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n        BARSCOUNT 有效数据周期数\\r\\n        求总的周期数。\\r\\n        用法：　BARSCOUNT(X)　第一个有效数据到当前的天数。\\r\\n        例如：　BARSCOUNT(CLOSE)　对于日线数据取得上市以来总交易日数，对于分笔成交取得当日成交笔数，对于1分钟线取得当日交易分钟数。\\r\\n    */\\r\\n    this.BARSCOUNT=function(data)\\r\\n    {\\r\\n        let result=[];\\r\\n        let days=null;\\r\\n        for(let i in data)\\r\\n        {\\r\\n            result[i]=0;\\r\\n            if (days==null)\\r\\n            {\\r\\n                if (!this.IsNumber(data[i])) continue;\\r\\n\\r\\n                days=0;\\r\\n            }\\r\\n\\r\\n            result[i]=days;\\r\\n            ++days;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //DEVSQ 数据偏差平方和\\r\\n    //DEVSQ(X，N) 　返回数据偏差平方和。\\r\\n    this.DEVSQ=function(data,n)\\r\\n    {\\r\\n        if (this.IsNumber(data) && this.IsNumber(n))\\r\\n            return 0;\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var num = null;\\r\\n            if (Array.isArray(n))   //取最后一个有效数\\r\\n            {\\r\\n                for(var i=n.length-1;i>=0;--i)\\r\\n                {\\r\\n                    if (this.IsNumber(n[i]))\\r\\n                    {\\r\\n                        num = parseInt(n[i]);\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                num = parseInt(n);\\r\\n            }\\r\\n\\r\\n            if (!this.IsNumber(num)) return result;\\r\\n\\r\\n            var datanum = data.length;\\r\\n            var i = 0, j = 0, k = 0;\\r\\n            var E = 0, DEV = 0;\\r\\n            for(i = 0; i < datanum && !this.IsNumber(data[i]); ++i)\\r\\n            {\\r\\n                result[i] = null;\\r\\n            }\\r\\n            if (num < 1 || i+num>datanum) return result;\\r\\n            for(E=0; i < datanum && j < num; ++i,++j)\\r\\n                E += data[i]/num;\\r\\n            if (j == num)\\r\\n            {\\r\\n                DEV = 0;\\r\\n                for(i--; k < num; k++)\\r\\n                    DEV += (data[i-k]-E) * (data[i-k]-E);\\r\\n                result[i] = DEV;\\r\\n                i++;\\r\\n            }\\r\\n            for(; i < datanum; ++i)\\r\\n            {\\r\\n                E += (data[i] - data[i-num]) / num;\\r\\n                for(DEV=0, k = 0; k < num; ++k)\\r\\n                    DEV += (data[i-k]-E) * (data[i-k]-E);\\r\\n                result[i] = DEV;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //NOT 取反\\r\\n    //求逻辑非。\\r\\n    //用法：　NOT(X)　返回非X，即当X=0时返回1，否则返回0。\\r\\n    //例如：　NOT(ISUP)　表示平盘或收阴。\\r\\n    this.NOT=function(data)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        if (isNumber) return data? 0:1;\\r\\n\\r\\n        let result=[];\\r\\n        for(let i in data)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (this.IsNumber(data[i])) result[i]=data[i]?0:1;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //FORCAST 线性回归预测值\\r\\n    //FORCAST(X，N)　 返回线性回归预测值。\\r\\n    this.FORCAST=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (typeof(n)!='number') n=parseInt(n); //字符串的转成数值型\\r\\n        var num = n;\\r\\n        var datanum = data.length;\\r\\n        if (num < 1 || num >= datanum)\\r\\n            return result;\\r\\n        var Ex = 0, Ey = 0, Sxy = 0, Sxx = 0, Const, Slope;\\r\\n        var i, j,x;\\r\\n        for(j = 0; j < datanum && !this.IsNumber(data[j]); ++j)\\r\\n        {\\r\\n            result[j] = null;\\r\\n        }\\r\\n        for(i = j+num-1; i < datanum; ++i)\\r\\n        {\\r\\n            Ex = Ey = Sxy = Sxx = 0;\\r\\n            for(j = 0, x=num; j < num && j <= i; ++j, --x)\\r\\n            {\\r\\n                Ex += x;\\r\\n                Ey += data[i - j];\\r\\n            }\\r\\n            Ex /= num;\\r\\n            Ey /= num;\\r\\n            for(j = 0, x=num; j < num && j <= i; ++j,--x)\\r\\n            {\\r\\n                Sxy += (x-Ex)*(data[i-j]-Ey);\\r\\n                Sxx += (x-Ex)*(x-Ex);\\r\\n            }\\r\\n            Slope = Sxy / Sxx;\\r\\n            Const = Ey - Ex*Slope;\\r\\n            result[i] = Slope * num + Const;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //TSMA(X,N)：求X在N个周期内的时间序列三角移动平均\\r\\n    //TSMA(a,n) 算法如下：\\r\\n    //ysum=a[i]+a[i-1]+...+a[i-n+1]\\r\\n    //xsum=i+i-1+..+i-n+1\\r\\n    //xxsum=i*i+(i-1)*(i-1)+...+(i-n+1)*(i-n+1)\\r\\n    //xysum=i*a[i]+(i-1)*a[i-1]+...+(i-n+1)*a[i-n+1]\\r\\n    //k=(xysum -(ysum/n)*xsum)/(xxsum- xsum/n * xsum) //斜率\\r\\n    //b= ysum/n - k*xsum/n\\r\\n    //forcast[i]=k*i+b //线性回归\\r\\n    //tsma[i] = forcast[i]+k  //线性回归+斜率\\r\\n    this.TSMA=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (typeof(n)!='number') n=parseInt(n); //字符串的转成数值型\\r\\n        var num = n;\\r\\n        var datanum = data.length;\\r\\n        if (num < 1 || num >= datanum)\\r\\n            return result;\\r\\n        var Ex = 0, Ey = 0, Sxy = 0, Sxx = 0, Const, Slope;\\r\\n        var i, j,x;\\r\\n        for(j = 0; j < datanum && !this.IsNumber(data[j]); ++j)\\r\\n        {\\r\\n            result[j] = null;\\r\\n        }\\r\\n        for(i = j+num-1; i < datanum; ++i)\\r\\n        {\\r\\n            Ex = Ey = Sxy = Sxx = 0;\\r\\n            for(j = 0, x=num; j < num && j <= i; ++j, --x)\\r\\n            {\\r\\n                Ex += x;\\r\\n                Ey += data[i - j];\\r\\n            }\\r\\n            Ex /= num;\\r\\n            Ey /= num;\\r\\n            for(j = 0, x=num; j < num && j <= i; ++j,--x)\\r\\n            {\\r\\n                Sxy += (x-Ex)*(data[i-j]-Ey);\\r\\n                Sxx += (x-Ex)*(x-Ex);\\r\\n            }\\r\\n            Slope = Sxy / Sxx;\\r\\n            Const = Ey - Ex*Slope;\\r\\n            result[i] = (Slope * num + Const) + Slope;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //SLOPE 线性回归斜率\\r\\n    //SLOPE(X，N)　 返回线性回归斜率。\\r\\n    this.SLOPE=function(data,n)\\r\\n    {\\r\\n        let result=[];\\r\\n        if (typeof(n)!='number') n=parseInt(n); //字符串的转成数值型\\r\\n        if (n<1 || !data.length) return result;\\r\\n        if (n>=data.length) return result;\\r\\n\\r\\n        let start=0;\\r\\n        for(let i=0;i<data.length;++i,++start)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (this.IsNumber(data[i])) break;\\r\\n        }\\r\\n\\r\\n        let x,y,xy,xx;\\r\\n        for(let i=start+n-1;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            x=y=xy=xx=0;\\r\\n            for(var j=0;j<n && j<=i; ++j)\\r\\n            {\\r\\n                x+=(i-j);       //数据索引相加\\r\\n                y+=data[i-j];   //数据相加\\r\\n            }\\r\\n\\r\\n            x=x/n; y=y/n;\\r\\n            for(j=0;j<n && j<=i; ++j)\\r\\n            {\\r\\n                xy+=(i-j-x)*(data[i-j]-y);\\r\\n                xx+=(i-j-x)*(i-j-x);\\r\\n            }\\r\\n\\r\\n            if (xx) result[i]= xy/xx;\\r\\n            else if (i) result[i]=result[i-1];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //STDP 总体标准差\\r\\n    //STDP(X，N)　 返回总体标准差。\\r\\n    this.STDP=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!Array.isArray(data)) return result;\\r\\n        var nStart=this.GetFirstVaildIndex(data);\\r\\n        if (!IFrameSplitOperator.IsNumber(n)) return result;\\r\\n        if(nStart+n>data.length || n<1) return result;\\r\\n\\r\\n        var i=nStart, j=0, bFirst=true, dTotal=0, dAvg=0;\\r\\n        for(i+=n-1;i<data.length;++i)\\r\\n        {\\r\\n            dTotal = 0;\\r\\n            if(bFirst)\\r\\n            {\\r\\n                bFirst = false;\\r\\n                for(j=i-n+1;j<=i;++j)\\r\\n                {\\r\\n                    dAvg += data[j];\\r\\n                }\\r\\n\\r\\n                dAvg /= n;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                dAvg += (data[i]-data[i-n])/n;\\r\\n            }\\r\\n\\r\\n            for(j=i-n+1;j<=i;++j)\\r\\n            {\\r\\n                dTotal += (data[j]-dAvg)*(data[j]-dAvg);\\r\\n            }\\r\\n\\r\\n\\r\\n            result[i] = Math.sqrt(dTotal/n);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //VAR 估算样本方差\\r\\n    //VAR(X，N)　 返回估算样本方差。\\r\\n    this.VAR=function(data,n)\\r\\n    {\\r\\n        if (this.IsNumber(data) && this.IsNumber(n)) return 0;\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data) && this.IsNumber(n))\\r\\n        {\\r\\n            var num = parseInt(n);\\r\\n            var datanum = data.length;\\r\\n            if (num <= 0 || num >= datanum) return result;\\r\\n\\r\\n            var i, j;\\r\\n            for(i = 0; i < datanum && !this.IsNumber(data[i]); ++i)\\r\\n            {\\r\\n                result[i] = null;\\r\\n            }\\r\\n            var SigmaPowerX, SigmaX;\\r\\n            for (j = 0, i = i+num-1; i < datanum; ++i)\\r\\n            {\\r\\n                SigmaPowerX = SigmaX = 0;\\r\\n                for(j=0; j < num && j <= i; ++j)\\r\\n                {\\r\\n                    SigmaPowerX += data[i-j] * data[i-j];\\r\\n                    SigmaX += data[i-j];\\r\\n                }\\r\\n                result[i] = (num*SigmaPowerX - SigmaX*SigmaX) / num * (num -1);\\r\\n            }\\r\\n        }\\r\\n        else if (Array.isArray(data) && Array.isArray(n))\\r\\n        {\\r\\n            var start=this.GetFirstVaildIndex(data);\\r\\n\\r\\n            for(var i=start; i<data.length; ++i)\\r\\n            {\\r\\n                var SigmaPowerX = SigmaX = 0;\\r\\n                if (!this.IsNumber(n[i])) continue;\\r\\n                var num=parseInt(n[i]);\\r\\n\\r\\n                if (num <= 0 || i-(num-1)<0) continue;\\r\\n\\r\\n                for (var j = 0; j<num; ++j)\\r\\n                {\\r\\n                    SigmaPowerX += data[i-j] * data[i-j];\\r\\n                    SigmaX += data[i-j];\\r\\n                }\\r\\n\\r\\n                result[i] = (num*SigmaPowerX - SigmaX*SigmaX) / num * (num -1);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //VARP 总体样本方差\\r\\n    //VARP(X，N)　 返回总体样本方差 。\\r\\n    this.VARP=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (typeof(n)!='number') n=parseInt(n); //字符串的转成数值型\\r\\n        var num = n;\\r\\n        var datanum = data.length;\\r\\n        if (num < 1 || num >= datanum)\\r\\n            return result;\\r\\n        var i = 0, j = 0;\\r\\n        for(i = 0; i < datanum && !this.IsNumber(data[i]); ++i)\\r\\n        {\\r\\n            result[i] = null;\\r\\n        }\\r\\n        var SigmaPowerX = 0, SigmaX = 0;\\r\\n        for (; i < datanum && j < num; ++i, ++j)\\r\\n        {\\r\\n            SigmaPowerX += data[i] * data[i];\\r\\n            SigmaX += data[i];\\r\\n        }\\r\\n        if (j == num)\\r\\n            result[i-1] = (num*SigmaPowerX - SigmaX*SigmaX) / (num*num);\\r\\n        for(; i < datanum; ++i)\\r\\n        {\\r\\n            SigmaPowerX += data[i]*data[i] - data[i-num]*data[i-num];\\r\\n            SigmaX += data[i] - data[i-num];\\r\\n            result[i] = (num*SigmaPowerX - SigmaX*SigmaX) / (num*num);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //RANGE(A,B,C)表示A>B AND A<C;\\r\\n    this.RANGE=function(data,range,range2)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(range)=='number';\\r\\n        let isNumber3=typeof(range2)=='number';\\r\\n\\r\\n        if (isNumber && isNumber2 && isNumber3)\\r\\n        {\\r\\n            if (data>Math.min(range,range2) && data<Math.max(range,range2)) return 1;\\r\\n            else return 0;\\r\\n        }\\r\\n\\r\\n        let result=[];\\r\\n        let value, rangeValue,rangValue2;\\r\\n        for(let i=0; i<data.length; ++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            value=data[i];\\r\\n            if (!this.IsNumber(value)) continue;\\r\\n\\r\\n            if (!isNumber2)\\r\\n            {\\r\\n                if (i>=range.length) continue;\\r\\n\\r\\n                rangeValue=range[i];\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                rangeValue=range;\\r\\n            }\\r\\n            if (!this.IsNumber(rangeValue)) continue;\\r\\n\\r\\n            if (!isNumber3)\\r\\n            {\\r\\n                if (i>=range2.length) continue;\\r\\n\\r\\n                rangeValue2=range2[i];\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                rangeValue2=range2;\\r\\n            }\\r\\n            if (!this.IsNumber(rangeValue2)) continue;\\r\\n\\r\\n\\r\\n            result[i]= (value>Math.min(rangeValue,rangeValue2) && value<Math.max(rangeValue,rangeValue2)) ? 1:0;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    是否存在.\\r\\n    例如: EXIST(CLOSE>OPEN,10)\\r\\n    表示10日内存在着阳线\\r\\n    */\\r\\n    this.EXIST=function(data,n)\\r\\n    {\\r\\n        if (typeof(data)=='number') return 0;\\r\\n\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            var result=[];\\r\\n            if (data.length<=0) return result;\\r\\n\\r\\n            for( var i in data) //初始化\\r\\n            {\\r\\n                result[i]=0;\\r\\n            }\\r\\n\\r\\n            for(var i=0;i<n.length && i<data.length;++i)\\r\\n            {\\r\\n                var period=n[i];\\r\\n                if (!this.IsNumber(period)) continue;\\r\\n                period=parseInt(period);\\r\\n                if (period<=0) continue;\\r\\n                if (period>i+1) period=i+1;\\r\\n\\r\\n                var bExist=false;\\r\\n                var index=0, value=0;\\r\\n                for(var j=0;j<period;++j)\\r\\n                {\\r\\n                    index=i-(period-j-1);\\r\\n                    value=data[i];\\r\\n                    if (this.IsNumber(value) && value>0)\\r\\n                    {\\r\\n                        bExist=true;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=bExist?1:0;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            n=parseInt(n);\\r\\n            var latestID=null; //最新满足条件的数据索引\\r\\n            var result=[];\\r\\n            var value;\\r\\n            for(let i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                value=data[i];\\r\\n                if (this.IsNumber(value) && value>0) latestID=i;\\r\\n\\r\\n                if (latestID!=null && i-latestID<n) result[i]=1;\\r\\n                else result[i]=0;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.TFILTER=function(data,data2,n)\\r\\n    {\\r\\n        n=parseInt(n);\\r\\n\\r\\n        var result=[];\\r\\n\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(range)=='number';\\r\\n\\r\\n        let count=Math.max(data.length, data2.length);\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    过滤连续出现的信号.\\r\\n    用法:FILTER(X,N):X满足条件后,将其后N周期内的数据置为0,N为常量.\\r\\n    例如:\\r\\n    FILTER(CLOSE>OPEN,5)查找阳线,5天内再次出现的阳线不被记录在内\\r\\n    */\\r\\n    this.FILTER=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        for(let i=0,j=0; i<data.length; ++i)\\r\\n        {\\r\\n            if (data[i])\\r\\n            {\\r\\n                result[i]=1;\\r\\n                for(j=0;j<n && j+i+1<data.length;++j)\\r\\n                {\\r\\n                    result[j+i+1]=0;\\r\\n                }\\r\\n                i+=n;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=0;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.BARSLAST=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!data) return result;\\r\\n\\r\\n        let day=null;\\r\\n        for(let i=0;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n\\r\\n            if (data[i]>0)  day=0;\\r\\n            else if (day!=null) ++day;\\r\\n\\r\\n            if (day!=null) result[i]=day;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    N周期内第一个条件成立到当前的周期数.\\r\\n    用法:\\r\\n    BARSSINCEN(X,N):N周期内第一次X不为0到现在的天数,N为常量\\r\\n    例如:\\r\\n    BARSSINCEN(HIGH>10,10)表示10个周期内股价超过10元时到当前的周期数\\r\\n    */\\r\\n    this.BARSSINCEN=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (this.IsNumber(n) && Array.isArray(data))\\r\\n        {\\r\\n            var nPeriod=n;\\r\\n            if (nPeriod<1) nPeriod=data.length;\\r\\n            var i=this.GetFirstVaildIndex(data);\\r\\n            if (i>=data.length) return result;\\r\\n            var j=0;\\r\\n            if (i <= nPeriod - 1) j = nPeriod - 1;\\r\\n            else j = i;\\r\\n\\r\\n            result[j] = j - i;\\r\\n\\r\\n            for (; j < data.length; ++j)\\r\\n            {\\r\\n                if (this.IsNumber(result[j - 1]))\\r\\n                {\\r\\n                    if (result[j - 1] + 1 < nPeriod)\\r\\n                    {\\r\\n                        result[j] = result[j - 1] + 1;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        for (var k = j - nPeriod+1; k <= j; ++k)\\r\\n                        {\\r\\n                            if (!(Math.abs(data[k]) < 0.000001))\\r\\n                            {\\r\\n                                result[j] = j - k;\\r\\n                                break;\\r\\n                            }\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (!(Math.abs(data[j]) < 0.000001))\\r\\n                        result[j] = 0;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    第一个条件成立到当前的周期数.\\r\\n    用法:\\r\\n    BARSSINCE(X):第一次X不为0到现在的天数\\r\\n    例如:\\r\\n    BARSSINCE(HIGH>10)表示股价超过10元时到当前的周期数\\r\\n    */\\r\\n    this.BARSSINCE=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        var day=null;\\r\\n\\r\\n        for(let i=0;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (day==null)\\r\\n            {\\r\\n                if (data[i]) day=0;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                ++day;\\r\\n            }\\r\\n\\r\\n            if (day) result[i]=day;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*三角函数调用 func 三角函数\\r\\n    反正切值. 用法: ATAN(X)返回X的反正切值\\r\\n    余弦值.  用法: COS(X)返回X的余弦值\\r\\n    正弦值.  用法: SIN(X)返回X的正弦值\\r\\n    正切值.  用法: TAN(X)返回X的正切值\\r\\n\\r\\n    求自然对数. 用法: LN(X)以e为底的对数 例如: LN(CLOSE)求收盘价的对数\\r\\n    求10为底的对数. 用法: LOG(X)取得X的对数 例如: LOG(100)等于2\\r\\n    指数. 用法: EXP(X)为e的X次幂 例如: EXP(CLOSE)返回e的CLOSE次幂\\r\\n    开平方. 用法: SQRT(X)为X的平方根 例如: SQRT(CLOSE)收盘价的平方根\\r\\n    */\\r\\n    this.Trigonometric=function(data,func)\\r\\n    {\\r\\n        if (!Array.isArray(data))\\r\\n        {\\r\\n            if (this.IsNumber(data)) return func(data);\\r\\n\\r\\n            return null;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var result=[];\\r\\n            for(let i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item)) result[i]=func(item);\\r\\n                else result[i]=null;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //反正弦值. 用法: ASIN(X)返回X的反正弦值\\r\\n    this.ASIN=function(data)\\r\\n    {\\r\\n        if (!Array.isArray(data))\\r\\n        {\\r\\n            if (this.IsNumber(data)) return Math.acos(data);\\r\\n\\r\\n            return null;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var result=[];\\r\\n            for(let i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(item))\\r\\n                {\\r\\n                    if (item>=-1 && item<=1)\\r\\n                    {\\r\\n                        result[i]=Math.asin(item);\\r\\n                    }\\r\\n                    else if (i-1>=0)\\r\\n                    {\\r\\n                        var preItem=result[i-1];\\r\\n                        if (this.IsNumber(preItem)) result[i]=preItem;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    //反余弦值. 用法: ACOS(X)返回X的反余弦值\\r\\n    this.ACOS=function(data)\\r\\n    {\\r\\n        if (!Array.isArray(data))\\r\\n        {\\r\\n            if (this.IsNumber(data)) return Math.acos(data);\\r\\n\\r\\n            return null;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var result=[];\\r\\n            for(let i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(item))\\r\\n                {\\r\\n                    if (item>=-1 && item<=1)\\r\\n                    {\\r\\n                        result[i]=Math.acos(item);\\r\\n                    }\\r\\n                    else if (i-1>=0)\\r\\n                    {\\r\\n                        var preItem=result[i-1];\\r\\n                        if (this.IsNumber(preItem)) result[i]=preItem;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    LAST(X,A,B):持续存在.\\r\\n    用法:\\r\\n    LAST(CLOSE>OPEN,10,5)\\r\\n    表示从前10日到前5日内一直阳线\\r\\n    若A为0,表示从第一天开始,B为0,表示到最后日止\\r\\n    */\\r\\n    this.LAST=function(data,n,n2)\\r\\n    {\\r\\n        if (!Array.isArray(data)) return [];\\r\\n\\r\\n        var result=[];\\r\\n        var lCount=data.length;\\r\\n        var nStart = n;\\r\\n        var nEnd = n2, k = 0, i = 0, j = 0, t = 0;\\r\\n        for (; k < lCount; ++k)\\r\\n        {\\r\\n            if (data[k]) break;\\r\\n        }\\r\\n\\r\\n        for (i = k, t = k - nEnd + 1; i<lCount; ++i, ++t)\\r\\n        {\\r\\n            j = (nStart == 0) ? k : Math.max(k, i - nStart);\\r\\n            for (; j < t; ++j)\\r\\n            {\\r\\n                if (data[j]<=0)\\r\\n                {\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            result[i]=(j<t ? 0 : 1);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    属于未来函数,之字转向.\\r\\n    用法: ZIG(K,N),当价格变化量超过N%时转向,K表示0:开盘价,1:最高价,2:最低价,3:收盘价,其余:数组信息\\r\\n    例如: ZIG(3,5)表示收盘价的5%的ZIG转向\\r\\n    */\\r\\n    this.ZIG=function(data,n)\\r\\n    {\\r\\n        var hisData=this.SymbolData.Data;\\r\\n        var result=[];\\r\\n        if (typeof(data)=='number')\\r\\n        {\\r\\n            switch(data)\\r\\n            {\\r\\n                case 0:\\r\\n                    data=hisData.GetOpen();\\r\\n                    break;\\r\\n                case 1:\\r\\n                    data=hisData.GetHigh();\\r\\n                    break;\\r\\n                case 2:\\r\\n                    data=hisData.GetLow();\\r\\n                    break;\\r\\n                case 3:\\r\\n                    data=hisData.GetClose();\\r\\n                    break;\\r\\n                default:\\r\\n                    return result;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return this.ZIG_Calculate(data,n);\\r\\n    }\\r\\n\\r\\n    this.GetFirstVaildIndex=function(data)\\r\\n    {\\r\\n        for (var i = 0; i <data.length; ++i)\\r\\n        {\\r\\n            if (this.IsNumber(data[i]))\\r\\n                return i;\\r\\n        }\\r\\n\\r\\n        return data.length;\\r\\n    }\\r\\n\\r\\n    this.ZIG_Calculate=function(data,dRate)\\r\\n    {\\r\\n        var dest=[];\\r\\n        var nDataCount=data.length;\\r\\n        var m=this.GetFirstVaildIndex(data);\\r\\n        var i = 0, lLastPos = 0, lState = 0, j = 0;\\r\\n        var dif = 0;\\r\\n        for (i = m + 1, lLastPos = lState = m; i<nDataCount - 1 && lState == m; ++i)\\r\\n        {\\r\\n            lState = Math.abs(data[i] - data[m]) * 100 >= dRate*data[m] ? (data[i]>data[m] ? i : -i) : m;\\r\\n        }\\r\\n\\r\\n        for (; i<nDataCount - 1; ++i)\\r\\n        {\\r\\n            if (data[i] >= data[i - 1] && data[i] >= data[i + 1])\\r\\n            {\\r\\n                if (lState<0)\\r\\n                {\\r\\n                    if ((data[i] - data[-lState]) * 100<dRate*data[-lState]) continue;\\r\\n                    else\\r\\n                    {\\r\\n                        dif = (data[lLastPos] - data[j = -lState]) / (-lState - lLastPos);\\r\\n                        dest[j--]=data[-lState];\\r\\n                        for (; j >= lLastPos; j--)\\r\\n                            dest[j]=data[-lState] + (-lState - j)*dif;\\r\\n                        lLastPos = -lState;\\r\\n                        lState = i;\\r\\n                    }\\r\\n                }\\r\\n                else if (data[i]>data[lState])  lState = i;\\r\\n            }\\r\\n            else if (data[i] <= data[i - 1] && data[i] <= data[i + 1])\\r\\n            {\\r\\n                if (lState>0)\\r\\n                {\\r\\n                    if ((data[lState] - data[i]) * 100<dRate*data[lState]) continue;\\r\\n                    else\\r\\n                    {\\r\\n                        dif = (data[lState] - data[j = lLastPos]) / (lState - lLastPos);\\r\\n                        dest[j++]=data[lLastPos];\\r\\n                        for (; j <= lState; ++j)\\r\\n                            dest[j]=data[lLastPos] + (j - lLastPos)*dif;\\r\\n                        lLastPos = lState;\\r\\n                        lState = -i;\\r\\n                    }\\r\\n                }\\r\\n                else if (data[i]<data[-lState]) lState = -i;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (Math.abs(lState) >= nDataCount - 2)\\r\\n        {\\r\\n            if (lState>0 && data[nDataCount - 1] >= data[lState]) lState = nDataCount - 1;\\r\\n            if (lState<0 && data[nDataCount - 1] <= data[-lState]) lState = 1 - nDataCount;\\r\\n        }\\r\\n\\r\\n        if (lState>0)\\r\\n        {\\r\\n            dif = (data[lState] - data[j = lLastPos]) / (lState - lLastPos );\\r\\n            dest[j++]=data[lLastPos];\\r\\n            for (; j <= lState; ++j)\\r\\n                dest[j]=data[lLastPos] + (j - lLastPos)*dif;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            dif = (data[lLastPos] - data[j = -lState]) / (-lState - lLastPos);\\r\\n            dest[j--]=data[-lState];\\r\\n            for (; j >= lLastPos; j--)\\r\\n                dest[j]=(data[-lState] + (-lState - j)*dif);\\r\\n        }\\r\\n        if ((lState = Math.abs(lState))<nDataCount - 1)\\r\\n        {\\r\\n            if (data[nDataCount - 1] >= data[lState])\\r\\n            {\\r\\n                dif = (data[nDataCount - 1] - data[j = lState]) / (nDataCount - lState);\\r\\n                dest[j++]=(data[lState]);\\r\\n                for (; j<nDataCount; ++j)\\r\\n                    dest[j]=(data[lState] + (j - lState)*dif);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                dif = (data[lState] - data[j = nDataCount - 1]) / (nDataCount - lState);\\r\\n                dest[j--]=(data[nDataCount - 1]);\\r\\n                for (; j >= lState; j--)\\r\\n                    dest[j]=(data[nDataCount - 1] + (nDataCount - j)*dif);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return dest;\\r\\n    }\\r\\n\\r\\n    this.JSDraw=null;\\r\\n    this.CalculateZIGLine=function(firstData,secondData,thridData,data,result)\\r\\n    {\\r\\n        if (this.JSDraw==null) this.JSDraw=new JSDraw(this.ErrorHandler);\\r\\n        var isUp=secondData.Up;\\r\\n        var findData=firstData;\\r\\n        if (isUp)\\r\\n        {\\r\\n            for(var i=firstData.ID+1;i<thridData.ID;++i)  //查找最高点\\r\\n            {\\r\\n                var subItem=data[i];\\r\\n                if (!this.IsNumber(subItem)) continue;\\r\\n                if (findData.Value<subItem) findData={ID:i, Value:subItem};\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=firstData.ID+1;i<thridData.ID;++i)  //查找最低点\\r\\n            {\\r\\n                var subItem=data[i];\\r\\n                if (!this.IsNumber(subItem)) continue;\\r\\n                if (findData.Value>subItem) findData={ID:i, Value:subItem};\\r\\n            }\\r\\n        }\\r\\n\\r\\n        secondData.Value=findData.Value;\\r\\n        secondData.ID=findData.ID;\\r\\n\\r\\n        var lineCache={ Start:{ID:firstData.ID, Value:firstData.Value}, End:{ID:secondData.ID,Value:secondData.Value}};\\r\\n        var lineData=this.JSDraw.CalculateDrawLine(lineCache);//计算2个点的线上 其他点的数值\\r\\n        for(var i in lineData)\\r\\n        {\\r\\n            var lineItem=lineData[i];\\r\\n            result[lineItem.ID]=lineItem.Value;\\r\\n        }\\r\\n\\r\\n        if (thridData.ID==data.length-1)    //最后一组数据\\r\\n        {\\r\\n            //最后2个点的数据连成线\\r\\n            lineCache={ Start:{ID:secondData.ID, Value:secondData.Value}, End:{ID:thridData.ID,Value:thridData.Value} };\\r\\n            lineData=this.JSDraw.CalculateDrawLine(lineCache);//计算2个点的线上 其他点的数值\\r\\n            for(var i in lineData)\\r\\n            {\\r\\n                var lineItem=lineData[i];\\r\\n                result[lineItem.ID]=lineItem.Value;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            firstData.ID=secondData.ID;\\r\\n            firstData.Value=secondData.Value;\\r\\n\\r\\n            secondData.ID=thridData.ID;\\r\\n            secondData.Value=thridData.Value;\\r\\n            secondData.Up=firstData.Value < secondData.Value;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    属于未来函数,前M个ZIG转向波谷到当前距离.\\r\\n    用法:\\r\\n    TROUGHBARS(K,N,M)表示之字转向ZIG(K,N)的前M个波谷到当前的周期数,M必须大于等于1\\r\\n    例如:\\r\\n    TROUGHBARS(2,5,2)表示%5最低价ZIG转向的前2个波谷到当前的周期数\\r\\n    */\\r\\n    this.TROUGHBARS=function(data,n,n2)\\r\\n    {\\r\\n        var zigData=this.ZIG(data,n);   //计算ZIG\\r\\n        var dest=[];\\r\\n\\r\\n        var lEnd =n2;\\r\\n        if (lEnd<1) return dest;\\r\\n\\r\\n        var nDataCount = zigData.length;\\r\\n        var trough = [];\\r\\n        for(var i=0;i<lEnd;++i) trough[i]=0;\\r\\n        var lFlag = 0;\\r\\n        var i = this.GetFirstVaildIndex(zigData) + 1;\\r\\n        for (lEnd--; i<nDataCount && zigData[i]>zigData[i - 1]; ++i);\\r\\n\\r\\n        for (; i<nDataCount && zigData[i]<zigData[i - 1]; ++i);\\r\\n\\r\\n        for (trough[0] = --i; i<nDataCount - 1; ++i)\\r\\n        {\\r\\n            if (zigData[i]<zigData[i + 1])\\r\\n            {\\r\\n                if (lFlag)\\r\\n                {\\r\\n                    if (lEnd)\\r\\n                    {\\r\\n                        var tempTrough=trough.slice(0);\\r\\n                        for(var j=0;j<lEnd;++j)\\r\\n                        {\\r\\n                            trough[j+1]=tempTrough[j];\\r\\n                        }\\r\\n                    }\\r\\n                    trough[lFlag = 0] = i;\\r\\n                }\\r\\n            }\\r\\n            else lFlag = 1;\\r\\n            if (trough[lEnd]) dest[i]=(i - trough[lEnd]);\\r\\n        }\\r\\n        if (trough[lEnd]) dest[i]=(i - trough[lEnd]);\\r\\n\\r\\n        return dest;\\r\\n    }\\r\\n\\r\\n    this.TROUGH=function(data,n,n2)\\r\\n    {\\r\\n        var zigData=this.ZIG(data,n);   //计算ZIG\\r\\n        var dest=[];\\r\\n\\r\\n        var End=n2;\\r\\n        if(End<1) return dest;\\r\\n\\r\\n        var nDataCount = zigData.length;\\r\\n        var trough=[];\\r\\n        for(var i=0;i<End;++i) trough[i]=0;\\r\\n        var i=1,Flag=0;\\r\\n        var i = this.GetFirstVaildIndex(zigData) + 1;\\r\\n\\r\\n        for(End--; i<nDataCount && zigData[i]>zigData[i-1]; ++i);\\r\\n\\r\\n        for(; i<nDataCount && zigData[i]<zigData[i-1]; ++i);\\r\\n\\r\\n        for(trough[0]=--i;i<nDataCount-1;++i)\\r\\n        {\\r\\n            if(zigData[i]<zigData[i+1])\\r\\n            {\\r\\n                if(Flag)\\r\\n                {\\r\\n                    if(End)\\r\\n                    {\\r\\n                        var tempTrough=trough.slice(0);\\r\\n                        for(var j=0;j<End;++j)\\r\\n                        {\\r\\n                            trough[j+1]=tempTrough[j];\\r\\n                        }\\r\\n                    }\\r\\n                    trough[Flag=0]=i;\\r\\n                }\\r\\n            }\\r\\n            else Flag=1;\\r\\n            if(trough[End]) dest[i]=zigData[trough[End]];\\r\\n        }\\r\\n        if(trough[End]) dest[i]=zigData[trough[End]];\\r\\n\\r\\n        return dest;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    属于未来函数,前M个ZIG转向波峰到当前距离.\\r\\n    用法:\\r\\n    PEAKBARS(K,N,M)表示之字转向ZIG(K,N)的前M个波峰到当前的周期数,M必须大于等于1\\r\\n    例如:\\r\\n    PEAKBARS(0,5,1)表示%5开盘价ZIG转向的上一个波峰到当前的周期数\\r\\n    */\\r\\n    this.PEAKBARS=function(data,n,n2)\\r\\n    {\\r\\n        var zigData=this.ZIG(data,n);   //计算ZIG\\r\\n        var dest=[];\\r\\n\\r\\n        var nDataCount = zigData.length;\\r\\n        var lEnd = n2;\\r\\n        if (lEnd < 1) return dest;\\r\\n\\r\\n        var peak = [];\\r\\n        for(var i=0;i<lEnd;++i) peak[i]=0;\\r\\n        var lFlag = 0;\\r\\n\\r\\n        var i = this.GetFirstVaildIndex(zigData) + 1;\\r\\n        for (lEnd--; i<nDataCount && zigData[i]<zigData[i - 1]; ++i);\\r\\n\\r\\n        for (; i<nDataCount && zigData[i]>zigData[i - 1]; ++i);\\r\\n\\r\\n        for (peak[0] = --i; i<nDataCount - 1; ++i)\\r\\n        {\\r\\n            if (zigData[i]>zigData[i + 1])\\r\\n            {\\r\\n                if (lFlag)\\r\\n                {\\r\\n                    if (lEnd)\\r\\n                    {\\r\\n                        var tempPeak=peak.slice(0);\\r\\n                        for(var j=0;j<lEnd;++j)\\r\\n                        {\\r\\n                            peak[j+1]=tempPeak[j];\\r\\n                        }\\r\\n                    }\\r\\n                    peak[lFlag = 0] = i;\\r\\n                }\\r\\n            }\\r\\n            else lFlag = 1;\\r\\n            if (peak[lEnd]) dest[i]=(i - peak[lEnd]);\\r\\n        }\\r\\n        if (peak[lEnd])dest[i]=(i - peak[lEnd]);\\r\\n\\r\\n        return dest;\\r\\n    }\\r\\n\\r\\n    this.PEAK=function(data,n,n2)\\r\\n    {\\r\\n        var zigData=this.ZIG(data,n);   //计算ZIG\\r\\n        var dest=[];\\r\\n\\r\\n        var nDataCount = zigData.length;\\r\\n        var lEnd = n2;\\r\\n        if (lEnd < 1) return dest;\\r\\n\\r\\n        var lFlag = 0;\\r\\n        var peak = [];\\r\\n        for(var i=0;i<lEnd;++i) peak[i]=0;\\r\\n\\r\\n        var i = this.GetFirstVaildIndex(zigData) + 1;\\r\\n        for (lEnd--; i<nDataCount && zigData[i]<zigData[i - 1]; ++i);\\r\\n\\r\\n        for (; i<nDataCount && zigData[i]>zigData[i - 1]; ++i);\\r\\n\\r\\n        for (peak[0] = --i; i<nDataCount - 1; ++i)\\r\\n        {\\r\\n            if (zigData[i]>zigData[i + 1])\\r\\n            {\\r\\n                if (lFlag)\\r\\n                {\\r\\n                    if (lEnd)\\r\\n                    {\\r\\n                        var tempPeak=peak.slice(0);\\r\\n                        for(var j=0;j<lEnd;++j)\\r\\n                        {\\r\\n                            peak[j+1]=tempPeak[j];\\r\\n                        }\\r\\n                    }\\r\\n                    peak[lFlag = 0] = i;\\r\\n                }\\r\\n            }\\r\\n            else lFlag = 1;\\r\\n            if (peak[lEnd]) dest[i]=(zigData[peak[lEnd]]);\\r\\n        }\\r\\n        if (peak[lEnd]) dest[i]=(zigData[peak[lEnd]]);\\r\\n\\r\\n        return dest;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    一直存在.\\r\\n    例如:\\r\\n    EVERY(CLOSE>OPEN,N)\\r\\n    表示N日内一直阳线(N应大于0,小于总周期数,N支持变量)\\r\\n    */\\r\\n    this.EVERY=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<1) return result;\\r\\n        var i=0;\\r\\n        for(;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (this.IsNumber(data[i])) break;\\r\\n        }\\r\\n\\r\\n        var flag=0;\\r\\n        for(;i<data.length;++i)\\r\\n        {\\r\\n            if (data[i]) flag+=1;\\r\\n            else flag=0;\\r\\n\\r\\n            if (flag==n)\\r\\n            {\\r\\n                result[i]=1;\\r\\n                --flag;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result[i]=0;\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    成本分布情况.\\r\\n    用法:\\r\\n    COST(10),表示10%获利盘的价格是多少,即有10%的持仓量在该价格以下,其余90%在该价格以上,为套牢盘\\r\\n    该函数仅对日线分析周期有效\\r\\n    */\\r\\n    this.COST=function(data, node)\\r\\n    {\\r\\n        var result=[];\\r\\n        var rate=data/100;\\r\\n        if(rate<0.000001 || rate>1) return result;\\r\\n\\r\\n        var kData=this.SymbolData.Data.Data;\\r\\n        if (!kData || kData.length<=0) return result;\\r\\n        var aryCapital=this.SymbolData.GetStockCacheData({ FunctionName:\\\"FINANCE\\\", Args:[7], ArgCount:1, Node:node } ); //流通股本\\r\\n\\r\\n        var dMaxPrice=kData[0].High,dMinPrice=kData[0].Low;\\r\\n        for(var i=0;i<kData.length;++i)\\r\\n        {\\r\\n            var item=kData[i];\\r\\n            dMinPrice = Math.min(dMinPrice,item.Low);\\r\\n            dMaxPrice = Math.max(dMaxPrice,item.High);\\r\\n        }\\r\\n\\r\\n        if (dMinPrice > 2000 || dMinPrice < 0 || dMaxPrice>2000 || dMinPrice < 0)\\r\\n            this.ThrowUnexpectedNode(node,'COST() 历史K线最大最小值错误, 超出(0,1000)范围');\\r\\n\\r\\n        var lMaxPrice = parseInt(dMaxPrice * 100 + 1);\\r\\n        var lMinPrice = parseInt(dMinPrice * 100 - 1);\\r\\n        var lLow = 0, lHigh = 0, lClose = 0;\\r\\n        //去掉小数\\r\\n        dMaxPrice = lMaxPrice / 100.0;\\r\\n        dMinPrice = lMinPrice / 100.0;\\r\\n        var lSpeed = lMaxPrice - lMinPrice + 1;\\r\\n        if (lSpeed < 1) return result;\\r\\n\\r\\n        var aryVolPrice=[],aryPerVol=[];\\r\\n        for(var i=0;i<lSpeed;++i)\\r\\n        {\\r\\n            aryVolPrice[i]=0;\\r\\n            aryPerVol[i]=0;\\r\\n        }\\r\\n\\r\\n        var dHSL = 0, dTotalVol = 0, dVol = 0, dCost=0;\\r\\n        for(var i=0;i<kData.length;++i)\\r\\n        {\\r\\n            if (i >= aryCapital.length) continue;\\r\\n            if (aryCapital[i]>1)\\r\\n            {\\r\\n                var kItem=kData[i]\\r\\n                dHSL = kItem.Vol/aryCapital[i];\\r\\n\\r\\n                for( var j=0;j<lSpeed;j++)\\r\\n                    aryVolPrice[j]*=(1-dHSL);\\r\\n\\r\\n                lLow=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Low *100)))-lMinPrice;\\r\\n                lHigh=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.High*100)))-lMinPrice;\\r\\n                lClose=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Close*100)))-lMinPrice;\\r\\n\\r\\n                for(var j=0;j<lSpeed;++j) aryPerVol[j]=0;\\r\\n\\r\\n                var lHalf =parseInt((lLow + lHigh + 2 * lClose) / 4);\\r\\n                if (lHalf == lHigh || lHalf == lLow)\\r\\n                {\\r\\n                    aryPerVol[lHalf] += kItem.Vol;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var\\tdVH = kItem.Vol / (lHalf - lLow);\\r\\n                    for (var k = lLow; k<lHalf; ++k)\\r\\n                    {\\r\\n                        aryPerVol[k] += (k - lLow)*(dVH / (lHalf - lLow));\\r\\n                    }\\r\\n                    for (k; k <= lHigh; ++k)\\r\\n                    {\\r\\n                        aryPerVol[k] += (k - lHigh)*(dVH / (lHalf - lHigh));\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                var dTotalVol = 0;\\r\\n                for (var j = lLow; j <= lHigh; j++)\\r\\n                {\\r\\n                    aryVolPrice[j] += aryPerVol[j];\\r\\n                }\\r\\n\\r\\n                for (var j = 0; j < lSpeed; j++)\\r\\n                {\\r\\n                    dTotalVol += aryVolPrice[j];\\r\\n                }\\r\\n\\r\\n                for(j=0,dCost=dVol=0;j<lSpeed;++j)\\r\\n                {\\r\\n                    dVol+=aryVolPrice[j];\\r\\n                    if(dVol>=dTotalVol*rate)\\r\\n                    {\\r\\n                        dCost=(dMaxPrice-dMinPrice)*j/lSpeed+dMinPrice;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            result[i]=dCost;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    this.COST=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        var exchangeID=201;\\r\\n        var exchangeData=this.SymbolData.GetFinanceCacheData(exchangeID);    //换手率\\r\\n        if (!exchangeData) return result;\\r\\n\\r\\n        var isNumber=Array.isArray(data)?false:true;\\r\\n        var singleData=null;\\r\\n        if (isNumber) singleData=parseFloat(data);\\r\\n        var compareData=null;\\r\\n\\r\\n        for(let i=this.SymbolData.Data.Data.length-1, j=0,k=0 ; i>=0; --i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            var chipData=this.CalculateChip(i,exchangeData,this.SymbolData.Data.Data,1);\\r\\n            if (chipData.Max==null || chipData.Min==null || chipData.Max<=0 || chipData.Min<=0) continue;\\r\\n\\r\\n            var max=parseInt(chipData.Max*100);\\r\\n            var min=parseInt(chipData.Min*100);\\r\\n\\r\\n            if (singleData!=null)\\r\\n            {\\r\\n                compareData=singleData;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (i>=data.length) continue;\\r\\n                compareData=data[i];\\r\\n            }\\r\\n\\r\\n            var totalVol=0,vol=0;\\r\\n            var aryMap=new Map();\\r\\n            for(j=i; j>=0; --j)\\r\\n            {\\r\\n                var item=chipData.Data[j];\\r\\n                var start=parseInt(item.Low*100);\\r\\n                var end=parseInt(item.High*100);\\r\\n                if ((end-start+1)<=0) continue;\\r\\n\\r\\n                var iAverageVolume=item.Vol;\\r\\n                iAverageVolume=iAverageVolume/(end-start+1);\\r\\n                if (iAverageVolume<=0) continue;\\r\\n\\r\\n                for(k=start;k<=end && k<=max;++k)\\r\\n                {\\r\\n                    if (aryMap.has(k))\\r\\n                    {\\r\\n                        vol=aryMap.get(k);\\r\\n                        aryMap.set(k,vol+iAverageVolume);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        aryMap.set(k,iAverageVolume);\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                totalVol+=item.Vol;\\r\\n            }\\r\\n\\r\\n            //计算获利盘\\r\\n            vol=0;\\r\\n            for(var priceData of aryMap)\\r\\n            {\\r\\n                vol+=priceData[1];\\r\\n                result[i]=priceData[0]/100;\\r\\n                if (vol/totalVol*100>compareData)\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n    */\\r\\n\\r\\n    /*\\r\\n    获利盘比例.\\r\\n    用法:\\r\\n    WINNER(CLOSE),表示以当前收市价卖出的获利盘比例,例如返回0.1表示10%获利盘;WINNER(10.5)表示10.5元价格的获利盘比例\\r\\n    该函数仅对日线分析周期有效\\r\\n    */\\r\\n    this.WINNER=function(data, node)\\r\\n    {\\r\\n        var result=[];\\r\\n        var kData=this.SymbolData.Data.Data;\\r\\n        if (!kData || kData.length<=0) return result;\\r\\n        var aryCapital=this.SymbolData.GetStockCacheData({ FunctionName:\\\"FINANCE\\\", Args:[7], ArgCount:1, Node:node } ); //流通股本\\r\\n\\r\\n        var dMaxPrice=kData[0].High,dMinPrice=kData[0].Low;\\r\\n        for(var i=0;i<kData.length;++i)\\r\\n        {\\r\\n            var item=kData[i];\\r\\n            dMinPrice = Math.min(dMinPrice,item.Low);\\r\\n            dMaxPrice = Math.max(dMaxPrice,item.High);\\r\\n        }\\r\\n\\r\\n        if (dMinPrice > 1000 || dMinPrice < 0 || dMaxPrice>1000 || dMinPrice < 0)\\r\\n            this.ThrowUnexpectedNode(node,'WINNER() 历史K线最大最小值错误, 超出(0,1000)范围');\\r\\n\\r\\n        var lMaxPrice = parseInt(dMaxPrice * 100 + 1);\\r\\n        var lMinPrice = parseInt(dMinPrice * 100 - 1);\\r\\n        var lLow = 0, lHigh = 0, lClose = 0;\\r\\n        //去掉小数\\r\\n        dMaxPrice = lMaxPrice / 100.0;\\r\\n        dMinPrice = lMinPrice / 100.0;\\r\\n        var lSpeed = lMaxPrice - lMinPrice + 1;\\r\\n        if (lSpeed < 1) return result;\\r\\n\\r\\n        var aryVolPrice=[],aryPerVol=[];\\r\\n        for(var i=0;i<lSpeed;++i)\\r\\n        {\\r\\n            aryVolPrice[i]=0;\\r\\n            aryPerVol[i]=0;\\r\\n        }\\r\\n\\r\\n        var dHSL = 0, dTotalVol = 0, dVol = 0;\\r\\n        for(var i=0;i<kData.length;++i)\\r\\n        {\\r\\n            if (i >= aryCapital.length) continue;\\r\\n            if (!(aryCapital[i]>1)) continue;\\r\\n            var kItem=kData[i]\\r\\n            dHSL = kItem.Vol/aryCapital[i];\\r\\n\\r\\n            for( var j=0;j<lSpeed;j++)\\r\\n                aryVolPrice[j]*=(1-dHSL);\\r\\n\\r\\n            lLow=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Low *100)))-lMinPrice;\\r\\n            lHigh=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.High*100)))-lMinPrice;\\r\\n            lClose=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Close*100)))-lMinPrice;\\r\\n\\r\\n            for(var j=0;j<lSpeed;++j) aryPerVol[j]=0;\\r\\n\\r\\n            var lHalf =parseInt((lLow + lHigh + 2 * lClose) / 4);\\r\\n            if (lHalf == lHigh || lHalf == lLow)\\r\\n            {\\r\\n                aryPerVol[lHalf] += kItem.Vol;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var\\tdVH = kItem.Vol / (lHalf - lLow);\\r\\n                for (var k = lLow; k<lHalf; ++k)\\r\\n                {\\r\\n                    aryPerVol[k] += (k - lLow)*(dVH / (lHalf - lLow));\\r\\n                }\\r\\n                for (k; k <= lHigh; ++k)\\r\\n                {\\r\\n                    aryPerVol[k] += (k - lHigh)*(dVH / (lHalf - lHigh));\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var dTotalVol = 0;\\r\\n            for (var j = lLow; j <= lHigh; j++)\\r\\n            {\\r\\n                aryVolPrice[j] += aryPerVol[j];\\r\\n            }\\r\\n\\r\\n            for (var j = 0; j < lSpeed; j++)\\r\\n            {\\r\\n                dTotalVol += aryVolPrice[j];\\r\\n            }\\r\\n\\r\\n            if (Array.isArray(data))\\r\\n                lHigh = parseInt(Math.min((data[i] * 100) - lMinPrice, lSpeed - 1));\\r\\n            else\\r\\n                lHigh = parseInt(Math.min((data * 100) - lMinPrice, lSpeed - 1));\\r\\n\\r\\n            for (var j = 0, dVol = 0; j <= lHigh; j++)\\r\\n            {\\r\\n                dVol += aryVolPrice[j];\\r\\n            }\\r\\n\\r\\n            if (dTotalVol > 0) result[i]=dVol / dTotalVol;\\r\\n            else if (i - 1 >= 0) result[i] = result[i - 1];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    this.WINNER=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        var exchangeID=201;\\r\\n        var exchangeData=this.SymbolData.GetFinanceCacheData(exchangeID);    //换手率\\r\\n        if (!exchangeData) return result;\\r\\n\\r\\n        var isNumber=Array.isArray(data)?false:true;\\r\\n        var singleData=null;\\r\\n        if (isNumber) singleData=parseInt(parseFloat(data)*100);\\r\\n        var compareData=null;\\r\\n\\r\\n        for(let i=this.SymbolData.Data.Data.length-1, j=0,k=0 ; i>=0; --i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            var chipData=this.CalculateChip(i,exchangeData,this.SymbolData.Data.Data,1);\\r\\n            if (chipData.Max==null || chipData.Min==null || chipData.Max<=0 || chipData.Min<=0) continue;\\r\\n\\r\\n            var max=parseInt(chipData.Max*100);\\r\\n            var min=parseInt(chipData.Min*100);\\r\\n\\r\\n            if (singleData!=null)\\r\\n            {\\r\\n                compareData=singleData;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (i>=data.length) continue;\\r\\n                compareData=parseInt(data[i]*100);\\r\\n            }\\r\\n\\r\\n            var totalVol=0,vol=0;\\r\\n            for(j=i; j>=0; --j)\\r\\n            {\\r\\n                var item=chipData.Data[j];\\r\\n                var start=parseInt(item.Low*100);\\r\\n                var end=parseInt(item.High*100);\\r\\n                if ((end-start+1)<=0) continue;\\r\\n\\r\\n                var iAverageVolume=item.Vol;\\r\\n                iAverageVolume=iAverageVolume/(end-start+1);\\r\\n                if (iAverageVolume<=0) continue;\\r\\n\\r\\n                var profitVol=0;    //获利的成交量\\r\\n                if (compareData>end) profitVol=item.Vol;\\r\\n                else if (compareData<start) profitVol=0;\\r\\n                else profitVol=item.Vol*(compareData-start+1)/(end-start+1);\\r\\n\\r\\n                vol+=profitVol;\\r\\n                totalVol+=item.Vol;\\r\\n            }\\r\\n\\r\\n            if (totalVol>0) result[i]=vol/totalVol;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n    */\\r\\n\\r\\n    /*\\r\\n    区间成本.\\r\\n    用法:\\r\\n    例如COSTEX(CLOSE,REF(CLOSE,1)),表示近两日收盘价格间筹码的成本\\r\\n    该函数仅对日线分析周期有效\\r\\n    */\\r\\n    this.COSTEX=function(data, data2, node)\\r\\n    {\\r\\n        var result=[];\\r\\n        var kData=this.SymbolData.Data.Data;\\r\\n        if (!kData || kData.length<=0) return result;\\r\\n        var aryCapital=this.SymbolData.GetStockCacheData({ FunctionName:\\\"FINANCE\\\", Args:[7], ArgCount:1, Node:node } ); //流通股本\\r\\n\\r\\n        var dMaxPrice=kData[0].High,dMinPrice=kData[0].Low;\\r\\n        for(var i=0;i<kData.length;++i)\\r\\n        {\\r\\n            var item=kData[i];\\r\\n            dMinPrice = Math.min(dMinPrice,item.Low);\\r\\n            dMaxPrice = Math.max(dMaxPrice,item.High);\\r\\n        }\\r\\n\\r\\n        if (dMinPrice > 1000 || dMinPrice < 0 || dMaxPrice>1000 || dMinPrice < 0)\\r\\n            this.ThrowUnexpectedNode(node,'COSTEX() 历史K线最大最小值错误, 超出(0,1000)范围');\\r\\n\\r\\n        var lMaxPrice = parseInt(dMaxPrice * 100 + 1);\\r\\n        var lMinPrice = parseInt(dMinPrice * 100 - 1);\\r\\n        var lLow = 0, lHigh = 0, lClose = 0;\\r\\n        //去掉小数\\r\\n        dMaxPrice = lMaxPrice / 100.0;\\r\\n        dMinPrice = lMinPrice / 100.0;\\r\\n        var lSpeed = lMaxPrice - lMinPrice + 1;\\r\\n        if (lSpeed < 1) return result;\\r\\n\\r\\n        var aryVolPrice=[],aryPerVol=[];\\r\\n        for(var i=0;i<lSpeed;++i)\\r\\n        {\\r\\n            aryVolPrice[i]=0;\\r\\n            aryPerVol[i]=0;\\r\\n        }\\r\\n\\r\\n        var dHSL = 0, dTotalVol = 0, dVol = 0, dVola=0, dPerVola=0, dVolb=0, dPerVolb=0;\\r\\n        for(var i=0, j=0;i<kData.length;++i)\\r\\n        {\\r\\n            if (i >= aryCapital.length) continue;\\r\\n            if (aryCapital[i]>1)\\r\\n            {\\r\\n                var kItem=kData[i]\\r\\n                dHSL = kItem.Vol/aryCapital[i];\\r\\n\\r\\n                for( var j=0;j<lSpeed;j++)\\r\\n                    aryVolPrice[j]*=(1-dHSL);\\r\\n\\r\\n                lLow=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Low *100)))-lMinPrice;\\r\\n                lHigh=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.High*100)))-lMinPrice;\\r\\n                lClose=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Close*100)))-lMinPrice;\\r\\n\\r\\n                for(var j=0;j<lSpeed;++j) aryPerVol[j]=0;\\r\\n\\r\\n                var lHalf =parseInt((lLow + lHigh + 2 * lClose) / 4);\\r\\n                if (lHalf == lHigh || lHalf == lLow)\\r\\n                {\\r\\n                    aryPerVol[lHalf] += kItem.Vol;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var\\tdVH = kItem.Vol / (lHalf - lLow);\\r\\n                    for (var k = lLow; k<lHalf; ++k)\\r\\n                    {\\r\\n                        aryPerVol[k] += (k - lLow)*(dVH / (lHalf - lLow));\\r\\n                    }\\r\\n                    for (k; k <= lHigh; ++k)\\r\\n                    {\\r\\n                        aryPerVol[k] += (k - lHigh)*(dVH / (lHalf - lHigh));\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                dTotalVol = 0;\\r\\n                for (var j = lLow; j <= lHigh; j++)\\r\\n                {\\r\\n                    aryVolPrice[j] += aryPerVol[j];\\r\\n                }\\r\\n\\r\\n                for (var j = 0; j < lSpeed; j++)\\r\\n                {\\r\\n                    dTotalVol += aryVolPrice[j];\\r\\n                }\\r\\n\\r\\n                if (Array.isArray(data)) lHigh = parseInt(Math.min((data[i] * 100) - lMinPrice, lSpeed - 1));\\r\\n                else lHigh = parseInt(Math.min((data * 100) - lMinPrice, lSpeed - 1));\\r\\n                for (j = 0, dVola = 0, dPerVola = 0; j <= lHigh; j++)\\r\\n                {\\r\\n                    dVola += aryVolPrice[j];\\r\\n                    dPerVola += (0.01*(j + lMinPrice))*aryVolPrice[j];\\r\\n                }\\r\\n\\r\\n                if (Array.isArray(data2)) lHigh = parseInt(Math.min((data2[i] * 100) - lMinPrice, lSpeed - 1));\\r\\n                else lHigh = parseInt(Math.min((data2 * 100) - lMinPrice, lSpeed - 1));\\r\\n                for (j = 0,  dVolb = 0, dPerVolb = 0; j <= lHigh; j++)\\r\\n                {\\r\\n                    dVolb += aryVolPrice[j];\\r\\n                    dPerVolb += (0.01*(j + lMinPrice))*aryVolPrice[j];\\r\\n                }\\r\\n\\r\\n                dVol = dVola - dVolb;\\r\\n                dPerVolRange = dPerVola - dPerVolb;\\r\\n                if (Math.abs(dPerVolRange) > 0.001 && dVol!=0 ) result[i]=dPerVolRange / dVol;\\r\\n                else if (i-1>=0) result[i] = result[i - 1];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    远期成本分布比例.\\r\\n    用法:\\r\\n    PPART(10),表示10前的成本占总成本的比例,0.2表示20%\\r\\n    */\\r\\n    this.PPART=function(n,node)\\r\\n    {\\r\\n        var result=[];\\r\\n        var startDay=n;\\r\\n        if (startDay<0) return result;\\r\\n\\r\\n        var kData=this.SymbolData.Data.Data;\\r\\n        if (!kData || kData.length<=0) return result;\\r\\n        var aryCapital=this.SymbolData.GetStockCacheData({ FunctionName:\\\"FINANCE\\\", Args:[7], ArgCount:1, Node:node } ); //流通股本\\r\\n\\r\\n        for (var i = startDay, j = 0; i < kData.length; ++i)\\r\\n        {\\r\\n            var start = i - startDay;\\r\\n            if (start < 0) continue;\\r\\n\\r\\n            var partVol = 0;\\r\\n            for (j = 0; j < startDay; ++j)\\t//前n日成交量和\\r\\n            {\\r\\n                var kItem=kData[j + start];\\r\\n                partVol += kItem.Vol;\\r\\n            }\\r\\n\\r\\n            if (i < aryCapital.length)\\r\\n            {\\r\\n                if (aryCapital[i]>0)\\r\\n                {\\r\\n                    var value=1 - (partVol / aryCapital[i]);\\r\\n                    result[i]=value;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    近期获利盘比例.\\r\\n    用法: LWINNER(5,CLOSE),表示最近5天的那部分成本以当前收市价卖出的获利盘比例\\r\\n    例如: 返回0.1表示10%获利盘\\r\\n    */\\r\\n    this.LWINNER=function(n, data, node)\\r\\n    {\\r\\n        var startDay =n;\\r\\n        if (startDay<=0) this.ThrowUnexpectedNode(node,'LWINNER() 第1个参数错误');\\r\\n\\r\\n        var result=[];\\r\\n        var kData=this.SymbolData.Data.Data;\\r\\n        if (!kData || kData.length<=0) return result;\\r\\n        var aryCapital=this.SymbolData.GetStockCacheData({ FunctionName:\\\"FINANCE\\\", Args:[7], ArgCount:1, Node:node } ); //流通股本\\r\\n        var dTotalVol=0,dVol=0;\\r\\n        for (var i = startDay-1, j=0, k=0 ; i < kData.length; ++i)\\r\\n        {\\r\\n            var index = i - startDay + 1;\\r\\n\\r\\n            var dMaxPrice=kData[index].High,dMinPrice=kData[index].Low;\\r\\n            for(var j=0;j<startDay;++j)\\r\\n            {\\r\\n                var item=kData[index+j];\\r\\n                dMinPrice = Math.min(dMinPrice,item.Low);\\r\\n                dMaxPrice = Math.max(dMaxPrice,item.High);\\r\\n            }\\r\\n\\r\\n            if (dMinPrice > 1000 || dMinPrice < 0 || dMaxPrice>1000 || dMinPrice < 0)\\r\\n                this.ThrowUnexpectedNode(node,'LWINNER() 历史K线最大最小值错误, 超出(0,1000)范围');\\r\\n\\r\\n            var lMaxPrice = parseInt(dMaxPrice * 100 + 1);\\r\\n            var lMinPrice = parseInt(dMinPrice * 100 - 1);\\r\\n            var lLow = 0, lHigh = 0, lClose = 0;\\r\\n            dMaxPrice = lMaxPrice / 100.0;\\r\\n            dMinPrice = lMinPrice / 100.0;\\r\\n            var lSpeed = lMaxPrice - lMinPrice + 1;\\r\\n            if (lSpeed < 1) return result;\\r\\n\\r\\n            var aryVolPrice=[],aryPerVol=[];\\r\\n            for(var j=0;j<lSpeed;++j)\\r\\n            {\\r\\n                aryVolPrice[j]=0;\\r\\n                aryPerVol[j]=0;\\r\\n            }\\r\\n\\r\\n            for (j = 0; j<startDay; ++j)\\r\\n            {\\r\\n                var capital=aryCapital[index + j];\\r\\n                if (capital<1) continue;\\r\\n\\r\\n                var kItem=kData[index + j];\\r\\n                var dHSL = kItem.Vol / capital;\\r\\n                for (k = 0; k < lSpeed; k++)\\r\\n                {\\r\\n                    aryVolPrice[k] *= (1 - dHSL);\\r\\n                }\\r\\n\\r\\n                lLow=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Low *100)))-lMinPrice;\\r\\n                lHigh=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.High*100)))-lMinPrice;\\r\\n                lClose=parseInt(Math.min(lMaxPrice,Math.max(lMinPrice,kItem.Close*100)))-lMinPrice;\\r\\n\\r\\n                for(var k=0;k<lSpeed;++k) aryPerVol[k]=0;\\r\\n\\r\\n                var lHalf =parseInt((lLow + lHigh + 2 * lClose) / 4);\\r\\n                if (lHalf == lHigh || lHalf == lLow)\\r\\n                {\\r\\n                    aryPerVol[lHalf] += kItem.Vol;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var\\tdVH = kItem.Vol / (lHalf - lLow);\\r\\n                    for (let k = lLow; k<lHalf; ++k)\\r\\n                    {\\r\\n                        aryPerVol[k] += (k - lLow)*(dVH / (lHalf - lLow));\\r\\n                    }\\r\\n                    for (let k; k <= lHigh; ++k)\\r\\n                    {\\r\\n                        aryPerVol[k] += (k - lHigh)*(dVH / (lHalf - lHigh));\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                dTotalVol = 0;\\r\\n                for (var k = lLow; k <= lHigh; k++)\\r\\n                {\\r\\n                    aryVolPrice[k] += aryPerVol[k];\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for (var j = 0; j < lSpeed; j++)\\r\\n            {\\r\\n                dTotalVol += aryVolPrice[j];\\r\\n            }\\r\\n\\r\\n            if (Array.isArray(data))\\r\\n                lHigh = parseInt(Math.min((data[i] * 100) - lMinPrice, lSpeed - 1));\\r\\n            else\\r\\n                lHigh = parseInt(Math.min((data * 100) - lMinPrice, lSpeed - 1));\\r\\n\\r\\n            dVol = 0;\\r\\n            for (k = 0 ; k <= lHigh; k++)\\r\\n            {\\r\\n                dVol += aryVolPrice[k];\\r\\n            }\\r\\n\\r\\n            if (dTotalVol > 0 && dVol > 0 && dVol <= dTotalVol) result[i]=dVol / dTotalVol;\\r\\n            else if (i - 1 >= 0) result[i] = result[i - 1];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.PWINNER=function(n, data, node)\\r\\n    {\\r\\n        var result=[];\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //计算截至到某一天的历史所有筹码\\r\\n    this.CalculateChip=function(index,exchangeData,hisData,dRate)\\r\\n    {\\r\\n        var result={Min:null,Max:null,Data:[]};\\r\\n        var seed=1;//筹码历史衰减换手系数\\r\\n        var max=null, min=null;\\r\\n        for(let i=index; i>=0; --i)\\r\\n        {\\r\\n            let item={};    //Vol:量 High:最高 Low:最低\\r\\n            var kData=hisData[i];\\r\\n            if (i==index) item.Vol=kData.Vol*exchangeData[i];\\r\\n            else item.Vol=kData.Vol*seed;\\r\\n\\r\\n            item.Date=kData.Date;\\r\\n            item.High=kData.High;\\r\\n            item.Low=kData.Low;\\r\\n\\r\\n            if (max==null) max=item.High;\\r\\n            else if (max<item.High) max=item.High;\\r\\n            if (min==null) min=item.Low;\\r\\n            else if (min<item.Low) min=item.Low;\\r\\n\\r\\n            result.Data[i]=item;\\r\\n\\r\\n            seed*=(1-(exchangeData[i]/100)*dRate);\\t//换手率累乘\\r\\n        }\\r\\n\\r\\n        result.Max=max;\\r\\n        result.Min=min;\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    返回是否连涨周期数.\\r\\n    用法:\\r\\n    UPNDAY(CLOSE,M)\\r\\n    表示连涨M个周期,M为常量\\r\\n    */\\r\\n    this.UPNDAY=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<1) return result;\\r\\n        if (data==null || n>data.length) return result;\\r\\n\\r\\n        var days=0;\\r\\n        for(let i=0;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=0;\\r\\n            if (i-1<0) continue;\\r\\n            if (!this.IsNumber(data[i]) || !this.IsNumber(data[i-1])) //无效数都不算连涨\\r\\n            {\\r\\n                days=0;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (data[i]>data[i-1]) ++days;\\r\\n            else days=0;\\r\\n\\r\\n            if (days==n)\\r\\n            {\\r\\n                result[i]=1;\\r\\n                --days;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    返回是否连跌周期.\\r\\n    用法:\\r\\n    DOWNNDAY(CLOSE,M)\\r\\n    表示连跌M个周期,M为常量\\r\\n    */\\r\\n    this.DOWNNDAY=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<1) return result;\\r\\n        if (data==null || n>data.length) return result;\\r\\n\\r\\n        var days=0;\\r\\n        for(let i=0;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=0;\\r\\n            if (i-1<0) continue;\\r\\n            if (!this.IsNumber(data[i]) || !this.IsNumber(data[i-1])) //无效数都不算连涨\\r\\n            {\\r\\n                days=0;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (data[i]<data[i-1]) ++days;\\r\\n            else days=0;\\r\\n\\r\\n            if (days==n)\\r\\n            {\\r\\n                result[i]=1;\\r\\n                --days;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    返回是否持续存在X>Y\\r\\n    用法:\\r\\n    NDAY(CLOSE,OPEN,3)\\r\\n    表示连续3日收阳线\\r\\n    */\\r\\n    this.NDAY=function(data,data2,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<1) return result;\\r\\n        if (!Array.isArray(data) && !Array.isArray(data2)) return result;\\r\\n        if (data==null || data2==null ) return result;\\r\\n\\r\\n        if (Array.isArray(data) && Array.isArray(data2))\\r\\n        {\\r\\n            if (n>=data.length || n>=data2.length) return result;\\r\\n            var count=Math.max(data.length,data2.length);\\r\\n            var days=0;\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                if (i>=data.length || i>=data2.length) continue;\\r\\n                if (!this.IsNumber(data[i]) || !this.IsNumber(data2[i]))\\r\\n                {\\r\\n                    days=0;\\r\\n                    continue;\\r\\n                }\\r\\n\\r\\n                if (data[i]>data2[i]) ++days;\\r\\n                else days=0;\\r\\n\\r\\n                if (days==n)\\r\\n                {\\r\\n                    result[i]=1;\\r\\n                    --days;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (Array.isArray(data) && !Array.isArray(data2))\\r\\n        {\\r\\n            if (n>=data.length || !this.IsNumber(data2)) return;\\r\\n            var days=0;\\r\\n            for(let i in data)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                if (!this.IsNumber(data[i]))\\r\\n                {\\r\\n                    days=0;\\r\\n                    continue;\\r\\n                }\\r\\n\\r\\n                if (data[i]>data2) ++days;\\r\\n                else days=0;\\r\\n\\r\\n                if (days==n)\\r\\n                {\\r\\n                    result[i]=1;\\r\\n                    --days;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (!Array.isArray(data) && Array.isArray(data2))\\r\\n        {\\r\\n            if (n>=data2.length || !this.IsNumber(data)) return;\\r\\n            var days=0;\\r\\n            for(let i in data2)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                if (!this.IsNumber(data2[i]))\\r\\n                {\\r\\n                    days=0;\\r\\n                    continue;\\r\\n                }\\r\\n\\r\\n                if (data>data2[i]) ++days;\\r\\n                else days=0;\\r\\n\\r\\n                if (days==n)\\r\\n                {\\r\\n                    result[i]=1;\\r\\n                    --days;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    两条线维持一定周期后交叉.\\r\\n    用法:LONGCROSS(A,B,N)表示A在N周期内都小于B,本周期从下方向上穿过B时返回1,否则返回0\\r\\n    */\\r\\n    this.LONGCROSS=function(data,data2,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n            result[i]=0;\\r\\n            if (i-1<0) continue;\\r\\n            if (i>=data.length || i>=data2.length) continue;\\r\\n            if (!this.IsNumber(data[i]) || !this.IsNumber(data2[i]) || !this.IsNumber(data[i-1]) || !this.IsNumber(data2[i-1])) continue;\\r\\n\\r\\n            if (data[i]>data2[i] && data[i-1]<data2[i-1]) result[i]=1;\\r\\n        }\\r\\n\\r\\n        for(let i=0,j=0;i<count;++i)\\r\\n        {\\r\\n            if (!result[i]) continue;\\r\\n\\r\\n            for(j=1;j<=n && i-j>=0;++j)\\r\\n            {\\r\\n                if (data[i-j]>=data2[i-j])\\r\\n                {\\r\\n                    result[i]=0;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    EXISTR(X,A,B):是否存在(前几日到前几日间).\\r\\n    例如: EXISTR(CLOSE>OPEN,10,5)\\r\\n    表示从前10日内到前5日内存在着阳线\\r\\n    若A为0,表示从第一天开始,B为0,表示到最后日止\\r\\n    */\\r\\n    this.EXISTR=function(data,n,n2)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!Array.isArray(data)) return result;\\r\\n\\r\\n        n=parseInt(n);\\r\\n        n2=parseInt(n2);\\r\\n        if (n<=0) n=data.length;\\r\\n        if (n2<=0) n2=1;\\r\\n        if (n2>n) return result;\\r\\n\\r\\n        var result=[];\\r\\n        var value;\\r\\n        for(let i=0,j=0;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            if (i-n<0 || i-n2<0) continue;\\r\\n\\r\\n            result[i]=0;\\r\\n            for(j=n;j>=n2;--j)\\r\\n            {\\r\\n                var value=data[i-j];\\r\\n                if (this.IsNumber(value) && value)\\r\\n                {\\r\\n                    result[i]=1;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    RELATE(X,Y,N) 返回X和Y的N周期的相关系数\\r\\n    RELATE(X,Y,N)=(∑[(Xi-Avg(X))(Yi-Avg(y))])/N ÷ √((∑(Xi-Avg(X))^2)/N * (∑(Yi-Avg(Y))^2)/N)\\r\\n    其中 avg(x)表示x的N周期均值：  avg(X) = (∑Xi)/N\\r\\n    √(...)表示开平方\\r\\n    */\\r\\n    this.RELATE=function(data,data2,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<1) n=1;\\r\\n\\r\\n        if (!Array.isArray(data)|| !Array.isArray(data2)) return result;\\r\\n\\r\\n        var dataAverage=this.CalculateAverage(data,n);\\r\\n        var data2Average=this.CalculateAverage(data2,n);\\r\\n\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n        for(let i=0,j=0;i<count;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n\\r\\n            if (i>=data.length || i>=data2.length || i>=dataAverage.length || i>=data2Average.length) continue;\\r\\n\\r\\n            var average=dataAverage[i];\\r\\n            var average2=data2Average[i];\\r\\n\\r\\n            var total=0,total2=0,total3=0;\\r\\n            for(j=i-n+1;j<=i;++j)\\r\\n            {\\r\\n                total+=(data[j]-average)*(data2[j]-average2);   //∑[(Xi-Avg(X))(Yi-Avg(y))])\\r\\n                total2+=Math.pow(data[j]-average,2);            //∑(Xi-Avg(X))^2\\r\\n                total3+=Math.pow(data2[j]-average2,2);          //∑(Yi-Avg(Y))^2)\\r\\n            }\\r\\n\\r\\n            result[i]=(total/n)/(Math.sqrt(total2/n)*Math.sqrt(total3/n));\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //计算数组n周期内的均值\\r\\n    this.CalculateAverage=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<1) return result;\\r\\n\\r\\n        var total=0;\\r\\n\\r\\n        for(var i=0;i<data.length;++i)  //去掉开始的无效数\\r\\n        {\\r\\n            if (this.IsNumber(data[i])) break;\\r\\n        }\\r\\n\\r\\n        for(;i<data.length && i<n;++i)  //计算第1个周期的数据\\r\\n        {\\r\\n            result[i]=null;\\r\\n            var value=data[i];\\r\\n            if (!this.IsNumber(value)) continue;\\r\\n            total+=value;\\r\\n        }\\r\\n        result[i-1]=total/n;\\r\\n\\r\\n        for(;i<data.length;++i)         //计算后面的周期数据\\r\\n        {\\r\\n            var value=data[i];\\r\\n            var preValue=data[i-n];     //上一个周期的第1个数据\\r\\n            if (!this.IsNumber(value)) value=0;\\r\\n            if (!this.IsNumber(preValue)) preValue=0;\\r\\n\\r\\n            total=total-preValue+value; //当前周期的数据 等于上一个周期数据 去掉上一个周期的第1个数据 加上这个周期的最后1个数据\\r\\n            result[i]=total/n;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    COVAR(X,Y,N) 返回X和Y的N周期的协方差\\r\\n    */\\r\\n    this.COVAR=function(data,data2,n)\\r\\n    {\\r\\n        if (this.IsNumber(data) || this.IsNumber(data2)) return 0;\\r\\n\\r\\n        var result=[];\\r\\n        if (n<1) n=1;\\r\\n\\r\\n        if (!Array.isArray(data)|| !Array.isArray(data2)) return result;\\r\\n\\r\\n        var dataAverage=this.CalculateAverage(data,n);\\r\\n        var data2Average=this.CalculateAverage(data2,n);\\r\\n\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n\\r\\n        var count=Math.max(data.length,data2.length);\\r\\n        for(let i=0,j=0;i<count;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n\\r\\n            if (i>=data.length || i>=data2.length || i>=dataAverage.length || i>=data2Average.length) continue;\\r\\n\\r\\n            var average=dataAverage[i];\\r\\n            var average2=data2Average[i];\\r\\n\\r\\n            var total=0;\\r\\n            for(j=i-n+1;j<=i;++j)\\r\\n            {\\r\\n                total+=(data[j]-average)*(data2[j]-average2);\\r\\n            }\\r\\n\\r\\n            result[i]=(total/n);\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    求上一高点到当前的周期数.\\r\\n    用法:\\r\\n    HHVBARS(X,N):求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计\\r\\n    例如:\\r\\n    HHVBARS(HIGH,0)求得历史新高到到当前的周期数\\r\\n    */\\r\\n    this.HHVBARS=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!Array.isArray(data)) return result;\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            for(var i=0;i<n.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var period=n[i];\\r\\n                if (!this.IsNumber(period)) continue;\\r\\n\\r\\n                var start=i-period;\\r\\n                if (start<0) start=0;\\r\\n                var nMax=null;\\r\\n                var j=start;\\r\\n                for(; j<data.length;++j)\\r\\n                {\\r\\n                    if (this.IsNumber(data[j]))\\r\\n                    {\\r\\n                        nMax=j;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                for(var k=0; j<data.length && k<period;++k, ++j)\\r\\n                {\\r\\n                    if (data[j]>=data[nMax]) nMax=j;\\r\\n                }\\r\\n\\r\\n                if (nMax!=null)\\r\\n                    result[i]=(i-nMax);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (n<1) n=data.length;\\r\\n\\r\\n            var nMax=null;  //最大值索引\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data[i]))\\r\\n                {\\r\\n                    nMax=i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var j=0;\\r\\n            for(i=nMax+1;i<data.length && j<n ;++i,++j) //求第1个最大值\\r\\n            {\\r\\n                if (data[i]>=data[nMax]) nMax=i;\\r\\n                if(n==data.length) result[i]=(i-nMax);\\r\\n            }\\r\\n\\r\\n            for(;i<data.length;++i)\\r\\n            {\\r\\n                if (i-nMax<n)\\r\\n                {\\r\\n                    if (data[i]>=data[nMax]) nMax=i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    nMax=i-n+1;\\r\\n                    for(j=nMax;j<=i;++j)    //计算区间最大值\\r\\n                    {\\r\\n                        if (data[j]>=data[nMax]) nMax=j;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=i-nMax;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    求上一低点到当前的周期数.\\r\\n    用法: LLVBARS(X,N):求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计\\r\\n    例如: LLVBARS(HIGH,20)求得20日最低点到当前的周期数\\r\\n    */\\r\\n    this.LLVBARS=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!Array.isArray(data)) return result;\\r\\n\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            for(var i=0;i<n.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var period=n[i];\\r\\n                if (!this.IsNumber(period)) continue;\\r\\n\\r\\n                var start=i-period;\\r\\n                if (start<0) start=0;\\r\\n                var nMin=null;\\r\\n                var j=start;\\r\\n                for(; j<data.length;++j)\\r\\n                {\\r\\n                    if (this.IsNumber(data[j]))\\r\\n                    {\\r\\n                        nMin=j;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                for(var k=0; j<data.length && k<period;++k, ++j)\\r\\n                {\\r\\n                    if (data[j]<=data[nMin]) nMin=j;\\r\\n                }\\r\\n\\r\\n                if (nMin!=null)\\r\\n                    result[i]=(i-nMin);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (n<1) n=data.length;\\r\\n\\r\\n            var nMin=null;  //最小值索引\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data[i]))\\r\\n                {\\r\\n                    nMin=i;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var j=0;\\r\\n            for(i=nMin+1;i<data.length && j<n ;++i,++j) //求第1个最大值\\r\\n            {\\r\\n                if (data[i]<=data[nMin]) nMin=i;\\r\\n                if(n==data.length) result[i]=(i-nMin);\\r\\n            }\\r\\n\\r\\n            for(;i<data.length;++i)\\r\\n            {\\r\\n                if (i-nMin<n)\\r\\n                {\\r\\n                    if (data[i]<=data[nMin]) nMin=i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    nMin=i-n+1;\\r\\n                    for(j=nMin;j<=i;++j)    //计算区间最小值\\r\\n                    {\\r\\n                        if (data[j]<=data[nMin]) nMin=j;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                result[i]=i-nMin;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    β(Beta)系数\\r\\n    BETA(N) 返回当前证券N周期收益与对应大盘指数收益相比的贝塔系数\\r\\n    需要下载上证指数历史数据\\r\\n    涨幅(X)=(现价-上一个交易日收盘价）/上一个交易日收盘价\\r\\n    公式=股票和指数协方差/指数方差\\r\\n    */\\r\\n    this.BETA=function(n)\\r\\n    {\\r\\n        var result=[];\\r\\n        var stockData= this.SymbolData.Data;\\r\\n        var indexData=this.SymbolData.IndexData;\\r\\n        if (n<=0) n=1;\\r\\n\\r\\n        var stockProfit=[]; //股票涨幅\\r\\n        var indexProfit=[]; //指数涨幅\\r\\n\\r\\n        for(let i=0;i<stockData.Data.length;++i)\\r\\n        {\\r\\n            stockProfit[i]=0;\\r\\n            indexProfit[i]=0;\\r\\n\\r\\n            var stockItem=stockData.Data[i];\\r\\n            var indexItem=indexData.Data[i];\\r\\n\\r\\n            if (stockItem.Close>0 && stockItem.YClose>0) stockProfit[i]=(stockItem.Close-stockItem.YClose)/stockItem.YClose;\\r\\n            if (indexItem.Close>0 && indexItem.YClose>0) indexProfit[i]=(indexItem.Close-indexItem.YClose)/indexItem.YClose;\\r\\n        }\\r\\n\\r\\n        //计算均值数组\\r\\n        var averageStockProfit=this.CalculateAverage(stockProfit,n);\\r\\n        var averageIndexProfit=this.CalculateAverage(indexProfit,n);\\r\\n\\r\\n        for(var i=0,j=0;i<stockData.Data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n\\r\\n            if (i>=stockProfit.length || i>=indexProfit.length || i>=averageStockProfit.length || i>=averageIndexProfit.length) continue;\\r\\n\\r\\n            var averageStock=averageStockProfit[i];\\r\\n            var averageIndex=averageIndexProfit[i];\\r\\n\\r\\n            var covariance=0;   //协方差\\r\\n            var variance=0;     //方差\\r\\n            for(j=i-n+1;j<=i;++j)\\r\\n            {\\r\\n                var value=(indexProfit[j]-averageIndex);\\r\\n                var value2=(stockProfit[j]-averageStock);\\r\\n                covariance+=value*value2;\\r\\n                variance+=value*value;\\r\\n            }\\r\\n\\r\\n            if (this.IsDivideNumber(variance) && this.IsNumber(covariance))\\r\\n                result[i]=covariance/variance;  //(covariance/n)/(variance/n)=covariance/variance;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    用法:BETA2(X,Y,N)为X与Y的N周期相关放大系数,表示Y变化1%,则X将变化N%\\r\\n    例如:BETA2(CLOSE,INDEXC,10)表示收盘价与大盘指数之间的10周期相关放大率\\r\\n    */\\r\\n    this.BETA2=function(x,y,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (n<=0) n=1;\\r\\n\\r\\n        var xProfit=[null]; //x数据的涨幅\\r\\n        var yProfit=[null]; //y数据的涨幅\\r\\n\\r\\n        var count=Math.max(x.length,y.length);\\r\\n\\r\\n        var lastItem={X:x[0], Y:y[0]};\\r\\n        for(var i=1;i<count;++i)\\r\\n        {\\r\\n            xProfit[i]=0;\\r\\n            yProfit[i]=0;\\r\\n\\r\\n            var xItem=x[i];\\r\\n            var yItem=y[i];\\r\\n\\r\\n            if (lastItem.X>0) xProfit[i]=(xItem-lastItem.X)/lastItem.X;\\r\\n            if (lastItem.Y>0) yProfit[i]=(yItem-lastItem.Y)/lastItem.Y;\\r\\n\\r\\n            lastItem={X:xItem, Y:yItem};\\r\\n        }\\r\\n\\r\\n        //计算均值数组\\r\\n        var averageXProfit=this.CalculateAverage(xProfit,n);\\r\\n        var averageYProfit=this.CalculateAverage(yProfit,n);\\r\\n\\r\\n        for(var i=0,j=0;i<count;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n\\r\\n            if (i>=xProfit.length || i>=yProfit.length || i>=averageXProfit.length || i>=averageYProfit.length) continue;\\r\\n\\r\\n            var averageX=averageXProfit[i];\\r\\n            var averageY=averageYProfit[i];\\r\\n\\r\\n            var covariance=0;   //协方差\\r\\n            var variance=0;     //方差\\r\\n            for(j=i-n+1;j<=i;++j)\\r\\n            {\\r\\n                var value=(xProfit[j]-averageX);\\r\\n                var value2=(yProfit[j]-averageY);\\r\\n                covariance+=value*value2;\\r\\n                variance+=value*value;\\r\\n            }\\r\\n\\r\\n            if (this.IsDivideNumber(variance) && this.IsNumber(covariance))\\r\\n                result[i]=covariance/variance;  //(covariance/n)/(variance/n)=covariance/variance;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    抛物转向.\\r\\n    用法:\\r\\n    SAR(N,S,M),N为计算周期,S为步长,M为极值\\r\\n    例如:\\r\\n    SAR(10,2,20)表示计算10日抛物转向,步长为2%,极限值为20%\\r\\n    */\\r\\n    this.SAR=function(n,step,exValue)\\r\\n    {\\r\\n        var result=[];\\r\\n        var stockData= this.SymbolData.Data;\\r\\n        if (n>=stockData.Data.length) return result;\\r\\n\\r\\n        var high=null,low=null;\\r\\n        for(var i=0;i<n;++i)\\r\\n        {\\r\\n            var item=stockData.Data[i];\\r\\n            if (high==null) high=item.High;\\r\\n            else if (high<item.High) high=item.High;\\r\\n            if (low==null) low=item.Low;\\r\\n            else if (low>item.Low) low=item.Low;\\r\\n        }\\r\\n\\r\\n        const SAR_LONG=0, SAR_SHORT=1;\\r\\n        var position=SAR_LONG;\\r\\n        result[n-1]=low;\\r\\n        var nextSar=low, sip=stockData.Data[0].High,af=step/100;\\r\\n        for(var i=n;i<stockData.Data.length;++i)\\r\\n        {\\r\\n            var ysip=sip;\\r\\n            var item=stockData.Data[i];\\r\\n            var yitem=stockData.Data[i-1];\\r\\n\\r\\n            if (position==SAR_LONG)\\r\\n            {\\r\\n                if (item.Low<result[i-1])\\r\\n                {\\r\\n                    position=SAR_SHORT;\\r\\n                    sip=item.Low;\\r\\n                    af=step/100;\\r\\n                    nextSar =Math.max(item.High,yitem.High);\\r\\n                    nextSar =Math.max(nextSar,ysip+af*(sip-ysip));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    position = SAR_LONG;\\r\\n                    if(item.High>ysip)\\r\\n                    {\\r\\n                        sip=item.High;\\r\\n                        af=Math.min(af+step/100,exValue/100);\\r\\n                    }\\r\\n                    nextSar=Math.min(item.Low,yitem.Low);\\r\\n                    nextSar=Math.min(nextSar,result[i-1]+af*(sip-result[i-1]));\\r\\n                }\\r\\n            }\\r\\n            else if (position==SAR_SHORT)\\r\\n            {\\r\\n                if(item.High>result[i-1])\\r\\n                {\\r\\n                    position=SAR_LONG;\\r\\n                    sip=item.High;\\r\\n                    af=step/100;\\r\\n                    nextSar =Math.min(item.Low,yitem.Low);\\r\\n                    nextSar =Math.min(nextSar,result[i-1]+af*(sip-ysip));\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    position = SAR_SHORT;\\r\\n                    if(item.Low<ysip)\\r\\n                    {\\r\\n                        sip=item.Low;\\r\\n                        af=Math.min(af+step/100,exValue/100);\\r\\n                    }\\r\\n                    nextSar=Math.max(item.High,yitem.High);\\r\\n                    nextSar=Math.max(nextSar,result[i-1]+af*(sip-result[i-1]));\\r\\n                }\\r\\n            }\\r\\n\\r\\n            result[i]=nextSar;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    抛物转向点.\\r\\n    用法:\\r\\n    SARTURN(N,S,M),N为计算周期,S为步长,M为极值,若发生向上转向则返回1,若发生向下转向则返回-1,否则为0\\r\\n    其用法与SAR函数相同\\r\\n    */\\r\\n    this.SARTURN=function(n,step,exValue)\\r\\n    {\\r\\n        var result=[];\\r\\n        var sar=this.SAR(n,step,exValue);\\r\\n        var stockData= this.SymbolData.Data;\\r\\n        var index=0;\\r\\n        for(index=0;index<sar.length;++index)\\r\\n        {\\r\\n            if (this.IsNumber(sar[index])) break;\\r\\n        }\\r\\n        var flag=0;\\r\\n        if (index<stockData.Data.length) flag=stockData.Data[index].Close>sar[index];\\r\\n\\r\\n        for(var i=index+1;i<stockData.Data.length;++i)\\r\\n        {\\r\\n            var item=stockData.Data[i];\\r\\n            if (item.Close<sar[i] && flag) result[i]=-1;\\r\\n            else result[i]= (item.Close>sar[i] && !flag)? 1:0;\\r\\n\\r\\n            flag=item.Close>sar[i];\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    属于未来函数,将当前位置到若干周期前的数据设为1.\\r\\n    用法:\\r\\n    BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1.\\r\\n    例如:\\r\\n    BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0\\r\\n    */\\r\\n    this.BACKSET=function(condition,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!condition) return result;\\r\\n        var dataCount=condition.length;\\r\\n        if (!this.IsNumber(dataCount) || dataCount<=0) return result;\\r\\n\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            for(var i=0;i<dataCount;++i)    //初始化0\\r\\n            {\\r\\n                result[i]=0;\\r\\n            }\\r\\n\\r\\n            for(var i=0;i<dataCount;++i)\\r\\n            {\\r\\n                var value=condition[i];\\r\\n                var period=n[i];\\r\\n                if (this.IsNumber(value) && value && this.IsNumber(period))\\r\\n                {\\r\\n                    for(var j=i,k=0; j>=0 && k<period; --j,++k)\\r\\n                    {\\r\\n                        result[j]=1;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<dataCount;++i)    //初始化0\\r\\n            {\\r\\n                result[i]=0;\\r\\n            }\\r\\n\\r\\n            for(var pos=0;pos<dataCount;++pos)\\r\\n            {\\r\\n                if (this.IsNumber(condition[pos])) break;\\r\\n            }\\r\\n            if (pos==dataCount) return result;\\r\\n\\r\\n            var num=Math.min(dataCount-pos,Math.max(n,1));\\r\\n\\r\\n            for(var i=dataCount-1,j=0;i>=0;--i)\\r\\n            {\\r\\n                var value=condition[i];\\r\\n                if (this.IsNumber(value) && value)\\r\\n                {\\r\\n                    for(j=i;j>i-num;--j)\\r\\n                    {\\r\\n                        result[j]=1;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (condition[i])\\r\\n            {\\r\\n                for(j=i;j>=pos;--j) result[j]=1;\\r\\n            }\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //用法:BETWEEN(A,B,C)表示A处于B和C之间时返回1,否则返回0\\r\\n    //例如:BETWEEN(CLOSE,MA(CLOSE,20),MA(CLOSE,10))表示收盘价介于10日均线和20日均线之间\\r\\n    this.BETWEEN=function(condition, data, data2)\\r\\n    {\\r\\n        var result=[];\\r\\n        var isNumber=typeof(condition)=='number';\\r\\n        var isNumber2=typeof(data)=='number';\\r\\n        var isNumber3=typeof(data2)=='number';\\r\\n\\r\\n        if (isNumber && isNumber2 && isNumber3)   //单数值\\r\\n        {\\r\\n            return (condition>=data && condition<=data2) ? 1 : 0;\\r\\n        }\\r\\n\\r\\n        for(var i in condition)\\r\\n        {\\r\\n            result[i]=0;\\r\\n            var item=condition[i];\\r\\n            var left=null, right=null;\\r\\n\\r\\n            if (isNumber2) left=data;\\r\\n            else if (i<data.length-1) left=data[i];\\r\\n\\r\\n            if (isNumber3) right=data2;\\r\\n            else if (i<data2.length-1) right=data2[i];\\r\\n\\r\\n            if (left==null || right==null) continue;\\r\\n\\r\\n            if (left>right)\\r\\n            {\\r\\n                if (item>=right && item<=left)\\r\\n                    result[i]=1;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (item<=right && item>=left)\\r\\n                    result[i]=1;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //STRCAT(A,B):将两个字符串A,B(非序列化)相加成一个字符串C.\\r\\n    //用法: STRCAT('多头','开仓')将两个字符串'多头','开仓'相加成一个字符串'多头开仓'\\r\\n    this.STRCAT=function(str1, str2)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (IFrameSplitOperator.IsString(str1) && IFrameSplitOperator.IsString(str2))\\r\\n            result=str1+str2;\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //VARCAT(A,B):将两个字符串A,B相加成一个字符串C.\\r\\n    //用法: DRAWTEXT(CLOSE>OPEN,LOW,VARCAT('多头',VAR2STR(C,2))) 将两个字符串相加成一个字符串并按条件显示出来\\r\\n    this.VARCAT=function(data,data2)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (Array.isArray(data) && Array.isArray(data2))\\r\\n        {\\r\\n            var nCount=Math.max(data.length, data2.length);\\r\\n            var strValue=\\\"\\\";\\r\\n            for(var i=0;i<nCount;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                strValue=\\\"\\\";\\r\\n                if (i<data.length)\\r\\n                {\\r\\n                    var item=data[i];\\r\\n                    if (IFrameSplitOperator.IsString(item))\\r\\n                        strValue+=item;\\r\\n                }\\r\\n\\r\\n                if (i<data2.length)\\r\\n                {\\r\\n                    var item=data2[i];\\r\\n                    if (IFrameSplitOperator.IsString(item))\\r\\n                        strValue+=item;\\r\\n                }\\r\\n\\r\\n                if (strValue!=\\\"\\\")\\r\\n                    result[i]=strValue;\\r\\n            }\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsString(data) && Array.isArray(data2))\\r\\n        {\\r\\n            for(var i=0;i<data2.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=data2[i];\\r\\n                if (IFrameSplitOperator.IsString(item))\\r\\n                {\\r\\n                    result[i]=data+item;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (Array.isArray(data) && IFrameSplitOperator.IsString(data2))\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=data[i];\\r\\n                if (IFrameSplitOperator.IsString(item))\\r\\n                {\\r\\n                    result[i]=item+data2;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsString(data) && IFrameSplitOperator.IsString(data2))\\r\\n        {\\r\\n            result=data+data2;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //FINDSTR(A,B):在字符串A中查找字符串B,如果找到返回1,否则返回0.\\r\\n    //用法: FINDSTR('多头开仓','开仓')在字符串'多头开仓'中查找字符串'开仓',返回1\\r\\n    this.FINDSTR=function(data, data2)\\r\\n    {\\r\\n        var result=[];\\r\\n        var str, str2;\\r\\n        if (IFrameSplitOperator.IsNumber(data)) str=data.toString();\\r\\n        else str=data;\\r\\n        if (IFrameSplitOperator.IsNumber(data2)) str2=data2.toString();\\r\\n        else str2=data2;\\r\\n\\r\\n        if (IFrameSplitOperator.IsString(str) && IFrameSplitOperator.IsString(str2))\\r\\n        {\\r\\n            if (str.indexOf(str2)>=0) return 1;\\r\\n            else return 0;\\r\\n        }\\r\\n        else if (Array.isArray(data) && IFrameSplitOperator.IsString(str2))\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (IFrameSplitOperator.IsString(item))\\r\\n                {\\r\\n                    result[i]=item.indexOf(str2)>=0?1:0;\\r\\n                }\\r\\n                else if (IFrameSplitOperator.IsNumber(item))\\r\\n                {\\r\\n                    str=item.toString();\\r\\n                    result[i]=str.indexOf(str2)>=0?1:0;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    result[i]=0;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //STRSPACE(A):字符串附带一空格\\r\\n    this.STRSPACE=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=data[i];\\r\\n                if (IFrameSplitOperator.IsString(item))\\r\\n                    result[i]=item+' ';\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsString(data))\\r\\n                result=data+\\\" \\\";\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //CON2STR(A,N):取A最后的值(非序列值)转为字符串,小数位数N.\\r\\n    //用法: CON2STR(FINANCE(20),3)表示取营业收入,以3位小数转为字符串\\r\\n    this.CON2STR=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i=data.length-1 ; i>=0; --i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item))\\r\\n                {\\r\\n                    result=item.toFixed(n);\\r\\n                    return result;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.IsNumber(data))\\r\\n                result=data.toFixed(n);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //VAR2STR(A,N):取A的每一个值转为字符串,小数位数N.\\r\\n    //用法: VAR2STR(C,3)表示取收盘价,以3位小数转为字符串\\r\\n    this.VAR2STR=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item))\\r\\n                    result[i]=item.toFixed(n);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (this.IsNumber(data))\\r\\n                result=data.toFixed(n);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.MOD=function(data, data2)\\r\\n    {\\r\\n        var result=[];\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        let isNumber2=typeof(data2)=='number';\\r\\n\\r\\n        //单数值\\r\\n        if (isNumber && isNumber2)\\r\\n        {\\r\\n            return JSAlgorithm.MOD(data,data2);\\r\\n        }\\r\\n        else if (!isNumber && !isNumber2) //都是数组相加\\r\\n        {\\r\\n            let count=Math.max(data.length, data2.length);\\r\\n            for(let i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=null; //初始化\\r\\n\\r\\n                if (i<data.length && i<data2.length)\\r\\n                {\\r\\n                    if ( this.IsNumber(data[i]) && this.IsNumber(data2[i]) ) result[i]=JSAlgorithm.MOD(data[i],data2[i]);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else if (isNumber && !isNumber2)  //单数字 数组\\r\\n        {\\r\\n            for(var i in data2)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data) && this.IsNumber(data2[i])) result[i]=JSAlgorithm.MOD(data,data2[i]);\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else if (!isNumber && isNumber2)  //数组 单数字\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (this.IsNumber(data[i]) && this.IsNumber(data2)) result[i]=JSAlgorithm.MOD(data[i],data2);\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.POW=function(data, n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (Array.isArray(data) && Array.isArray(n))\\r\\n        {\\r\\n            for(var i=0;i<data.length;++i)\\r\\n            {\\r\\n                var value=data[i];\\r\\n                var value2=n[i];\\r\\n                if (this.IsNumber(value) && this.IsNumber(value2)) result[i]=Math.pow(value,value2);\\r\\n                else result[i]=null;\\r\\n            }\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsNumber(data) && Array.isArray(n))\\r\\n        {\\r\\n            for(var i=0;i<n.length;++i)\\r\\n            {\\r\\n                var item=n[i];\\r\\n                if (this.IsNumber(item)) result[i]=Math.pow(data,item);\\r\\n                else result[i]=null;\\r\\n            }\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsNumber(data) && IFrameSplitOperator.IsNumber(n))\\r\\n        {\\r\\n            return Math.pow(data,n);\\r\\n        }\\r\\n        else if (Array.isArray(data) && IFrameSplitOperator.IsNumber(n))\\r\\n        {\\r\\n            for(var i=0; i<data.length;++i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item)) result[i]=Math.pow(item,n);\\r\\n                else result[i]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.CEILING=function(data)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        if (isNumber) return parseInt(data);\\r\\n\\r\\n        var result=[];\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (this.IsNumber(item)) result[i]=parseInt(item);\\r\\n            else result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.FLOOR=function(data)\\r\\n    {\\r\\n        let isNumber=typeof(data)=='number';\\r\\n        if (isNumber) return parseInt((data-1));\\r\\n\\r\\n        var result=[];\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (this.IsNumber(item)) result[i]=parseInt((item-1));\\r\\n            else result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.ZTPRICE=function(data, rate)\\r\\n    {\\r\\n        if (!this.IsNumber(rate)) return null;\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var result=[];\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item)) result[i]=(1+rate)*item;\\r\\n                else result[i]=null;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else if (this.IsNumber(data))\\r\\n        {\\r\\n            var result=(1+rate)*data;\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DTPRICE=function(data, rate)\\r\\n    {\\r\\n        if (!this.IsNumber(rate)) return null;\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var result=[];\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item)) result[i]=(1-rate)*item;\\r\\n                else result[i]=null;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else if (this.IsNumber(data))\\r\\n        {\\r\\n            var result=(1-rate)*data;\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    FRACPART(A)\\t 取得小数部分\\r\\n    含义:FRACPART(A)返回数值的小数部分\\r\\n    阐释:例如FRACPART(12.3)求得0.3,FRACPART(-3.5)求得-0.5\\r\\n    */\\r\\n    this.FRACPART=function(data)\\r\\n    {\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var result=[];\\r\\n            var integer=0;\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item))\\r\\n                {\\r\\n                    integer=parseInt(item);\\r\\n                    result[i]=item-integer;\\r\\n                }\\r\\n                else result[i]=null;\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else if (this.IsNumber(data))\\r\\n        {\\r\\n            integer=parseInt(data);\\r\\n            var result=data-integer;\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    统计连续满足条件的周期数.\\r\\n    用法: BARSLASTCOUNT(X),统计连续满足X条件的周期数.\\r\\n    例如: BARSLASTCOUNT(CLOSE>OPEN)表示统计连续收阳的周期数\\r\\n    */\\r\\n    this.BARSLASTCOUNT=function(data)\\r\\n    {\\r\\n        var result=null;\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            result=[];\\r\\n            if (data.length>0)\\r\\n            {\\r\\n                var count=0;\\r\\n                for(var i=data.length-1;i>=0;--i)\\r\\n                {\\r\\n                    count=0;\\r\\n                    for(var j=i;j>=0;--j)\\r\\n                    {\\r\\n                        if (data[j]) ++count;\\r\\n                        else break;\\r\\n                    }\\r\\n                    result[i]=count;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (data) result=1;\\r\\n            else result=0;\\r\\n        }\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //取整.\\r\\n    //用法: INTPART(A)返回沿A绝对值减小方向最接近的整数\\r\\n    //例如:INTPART(12.3)求得12,INTPART(-3.5)求得-3\\r\\n    this.INTPART=function(data)\\r\\n    {\\r\\n        var result=null;\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            result=[];\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item)) result[i]=parseInt(item);\\r\\n                else result[i]=null;\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsNumber(data))\\r\\n        {\\r\\n            result=parseInt(data);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //用法:CONST(A),取A最后的值为常量.\\r\\n    //例如:CONST(INDEXC),表示取大盘现价\\r\\n    this.CONST=function(data)\\r\\n    {\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            if (count>0)\\r\\n                return data[count-1];\\r\\n\\r\\n            return null;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return data;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //当前值是近多少周期内的最大值.\\r\\n    //用法: TOPRANGE(X):X是近多少周期内X的最大值\\r\\n    //例如: TOPRANGE(HIGH)表示当前最高价是近多少周期内最高价的最大值\\r\\n    this.TOPRANGE=function(data)\\r\\n    {\\r\\n        if (this.IsNumber(data)) return 0;\\r\\n\\r\\n        var result=[];\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1; i>=0;--i)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                var item=data[i];\\r\\n                if (!this.IsNumber(item)) continue;\\r\\n\\r\\n                var value=0;\\r\\n                for(var j=i-1;j>=0;--j)\\r\\n                {\\r\\n                    if (data[j]>item)\\r\\n                    {\\r\\n                        break;\\r\\n                    }\\r\\n                    ++value;\\r\\n                }\\r\\n\\r\\n                result[i]=value;\\r\\n\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //当前值是近多少周期内的最小值.\\r\\n    //用法:LOWRANGE(X):X是近多少周期内X的最小值\\r\\n    //例如:LOWRANGE(LOW)表示当前最低价是近多少周期内最低价的最小值\\r\\n    this.LOWRANGE=function(data)\\r\\n    {\\r\\n        if (this.IsNumber(data)) return 0;\\r\\n\\r\\n        var result=[];\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1; i>=0;--i)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                var item=data[i];\\r\\n                if (!this.IsNumber(item)) continue;\\r\\n\\r\\n                var value=0;\\r\\n                for(var j=i-1;j>=0;--j)\\r\\n                {\\r\\n                    if (data[j]<item)\\r\\n                    {\\r\\n                        break;\\r\\n                    }\\r\\n                    ++value;\\r\\n                }\\r\\n\\r\\n                result[i]=value;\\r\\n\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //N周期前的M周期内的第T个最小值.\\r\\n    //用法:FINDLOW(VAR,N,M,T):VAR在N日前的M天内第T个最低价\\r\\n    this.FINDLOW=function(data,n,m,t)\\r\\n    {\\r\\n        if (this.IsNumber(data)) return data;\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1;i>=0;--i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var aryValue=[];\\r\\n                for(var j=n;j<m;++j)\\r\\n                {\\r\\n                    var index=i-j;\\r\\n                    if (index<0) break;\\r\\n                    var item=data[index];\\r\\n                    if (this.IsNumber(item)) aryValue.push(item);\\r\\n                }\\r\\n\\r\\n                if (aryValue.length>0)\\r\\n                {\\r\\n                    aryValue.sort(function(a,b) { return a-b;});\\r\\n                    var index=t-1;\\r\\n                    if (index<0) index=0;\\r\\n                    else if (index>=aryValue.length) index=aryValue.length-1;\\r\\n                    result[i]=aryValue[index];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //N周期前的M周期内的第T个最大值.\\r\\n    //用法:FINDHIGH(VAR,N,M,T):VAR在N日前的M天内第T个最高价\\r\\n    this.FINDHIGH=function(data,n,m,t)\\r\\n    {\\r\\n        if (this.IsNumber(data)) return data;\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1;i>=0;--i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var aryValue=[];\\r\\n                for(var j=n;j<m;++j)\\r\\n                {\\r\\n                    var index=i-j;\\r\\n                    if (index<0) break;\\r\\n                    var item=data[index];\\r\\n                    if (this.IsNumber(item)) aryValue.push(item);\\r\\n                }\\r\\n\\r\\n                if (aryValue.length>0)\\r\\n                {\\r\\n                    aryValue.sort(function(a,b) { return b-a;});\\r\\n                    var index=t-1;\\r\\n                    if (index<0) index=0;\\r\\n                    else if (index>=aryValue.length) index=aryValue.length-1;\\r\\n                    result[i]=aryValue[index];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //N周期前的M周期内的第T个最大值到当前周期的周期数.\\r\\n    //用法:FINDHIGHBARS(VAR,N,M,T):VAR在N日前的M天内第T个最高价到当前周期的周期数\\r\\n    this.FINDHIGHBARS=function(data, n, m, t)\\r\\n    {\\r\\n        if (this.IsNumber(data)) return (m-n-t);\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1;i>=0;--i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var aryValue=[];\\r\\n                for(var j=n;j<m;++j)\\r\\n                {\\r\\n                    var index=i-j;\\r\\n                    if (index<0) break;\\r\\n                    var item=data[index];\\r\\n                    if (this.IsNumber(item)) aryValue.push({ Value:item, Period:j });\\r\\n                }\\r\\n\\r\\n                if (aryValue.length>0)\\r\\n                {\\r\\n                    aryValue.sort(function(a,b) { return b.Value-a.Value;});\\r\\n                    var index=t-1;\\r\\n                    if (index<0) index=0;\\r\\n                    else if (index>=aryValue.length) index=aryValue.length-1;\\r\\n                    result[i]=aryValue[index].Period;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //N周期前的M周期内的第T个最小值到当前周期的周期数.\\r\\n    //用法:FINDLOWBARS(VAR,N,M,T):VAR在N日前的M天内第T个最低价到当前周期的周期数.\\r\\n    this.FINDLOWBARS=function(data, n, m, t)\\r\\n    {\\r\\n        if (this.IsNumber(data)) return (m-n-t);\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1;i>=0;--i)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var aryValue=[];\\r\\n                for(var j=n;j<m;++j)\\r\\n                {\\r\\n                    var index=i-j;\\r\\n                    if (index<0) break;\\r\\n                    var item=data[index];\\r\\n                    if (this.IsNumber(item)) aryValue.push({ Value:item, Period:j });\\r\\n                }\\r\\n\\r\\n                if (aryValue.length>0)\\r\\n                {\\r\\n                    aryValue.sort(function(a,b) { return a.Value-b.Value;});\\r\\n                    var index=t-1;\\r\\n                    if (index<0) index=0;\\r\\n                    else if (index>=aryValue.length) index=aryValue.length-1;\\r\\n                    result[i]=aryValue[index].Period;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //求高值名次.\\r\\n    //用法:HOD(X,N):求当前X数据是N周期内的第几个高值,N=0则从第一个有效值开始.\\r\\n    //例如:HOD(HIGH,20)返回是20日的第几个高价\\r\\n    this.HOD=function(data, n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (IFrameSplitOperator.IsNumber(data)) return 1;\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1;i>=0;--i)\\r\\n            {\\r\\n                var value=data[i];\\r\\n                if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n                if (Array.isArray(n)) var subCount=parseInt(n[i]);\\r\\n                else var subCount=parseInt(n);\\r\\n                if (n<=0) subCount=i;\\r\\n                var index=1;\\r\\n                for(var j=i-1, k=1; j>=0 && k<subCount; --j, ++k)\\r\\n                {\\r\\n                    var item=data[j];\\r\\n                    if (IFrameSplitOperator.IsNumber(item) && item>value) ++index;\\r\\n                }\\r\\n\\r\\n                result[i]=index;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //求低值名次.\\r\\n    //用法:LOD(X,N):求当前X数据是N周期内的第几个低值,N=0则从第一个有效值开始.\\r\\n    //例如:LOD(LOW,20)返回是20日的第几个低价\\r\\n    this.LOD=function(data, n)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (IFrameSplitOperator.IsNumber(data)) return 1;\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=count-1;i>=0;--i)\\r\\n            {\\r\\n                var value=data[i];\\r\\n                if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n                if (Array.isArray(n)) var subCount=parseInt(n[i]);\\r\\n                else var subCount=parseInt(n);\\r\\n                if (n<=0) subCount=i;\\r\\n                var index=1;\\r\\n                for(var j=i-1, k=1; j>=0 && k<subCount; --j, ++k)\\r\\n                {\\r\\n                    var item=data[j];\\r\\n                    if (IFrameSplitOperator.IsNumber(item) && item<value) ++index;\\r\\n                }\\r\\n\\r\\n                result[i]=index;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //属于未来函数,下一次条件成立到当前的周期数.\\r\\n    //用法:BARSNEXT(X):下一次X不为0到现在的天数\\r\\n    //例如:BARSNEXT(CLOSE/REF(CLOSE,1)>=1.1)表示下一个涨停板到当前的周期数\\r\\n    this.BARSNEXT=function(data)\\r\\n    {\\r\\n        if (!Array.isArray(data)) return 0;\\r\\n\\r\\n        var result=[];\\r\\n\\r\\n        for(var i=0;i<data.length;++i)\\r\\n        {\\r\\n            result[i]=0;\\r\\n            for(var j=i, k=0;j<data.length;++j, ++k)\\r\\n            {\\r\\n                var item=data[j];\\r\\n                if (item>0)\\r\\n                {\\r\\n                    result[i]=k;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //取随机数.\\r\\n    //用法:RAND(N),返回一个范围在1-N的随机整数\\r\\n    this.RAND=function(n)\\r\\n    {\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            var result=[];\\r\\n            for(var i in n)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=n[i];\\r\\n                var value=parseInt(item);\\r\\n                if (value<=0) continue;\\r\\n\\r\\n                result[i]=Math.ceil(Math.random()*value);\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var value=parseInt(n);\\r\\n            if (value<=0) return null;\\r\\n\\r\\n            var stockData= this.SymbolData.Data;\\r\\n            var count=stockData.Data.length;\\r\\n            var result=[];\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                result[i]=Math.ceil(Math.random()*value);\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //求自适应均线值.\\r\\n    //用法:AMA(X,A),A为自适应系数,必须小于1.\\r\\n    //算法:Y=Y'+A*(X-Y').初值为X\\r\\n    this.AMA=function(data,n)\\r\\n    {\\r\\n        var result=[];\\r\\n        var period;\\r\\n        if (Array.isArray(n))\\r\\n        {\\r\\n            //取最新的一个数据做为自适应系数\\r\\n            for(var i=data.length-1;i>=0;--i)\\r\\n            {\\r\\n                if (this.IsNumber(n[i]))\\r\\n                {\\r\\n                    period=n[i];\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            period=n;\\r\\n        }\\r\\n\\r\\n        if (this.IsNumber(period))\\r\\n        {\\r\\n            if (period>1) return result;\\r\\n            var index=0;\\r\\n            var value=0;\\r\\n            for(index;index<data.length;++index)\\r\\n            {\\r\\n                result[index]=null;\\r\\n                if (this.IsNumber(data[index]))\\r\\n                {\\r\\n                    value=data[index];\\r\\n                    result[index]=value;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for(var i=index+1;i<data.length;++i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                result[i]=result[i-1]+period*(item-result[i-1]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //返回移动平均\\r\\n    //用法:TMA(X,A,B),A和B必须小于1,算法\\tY=(A*Y'+B*X),其中Y'表示上一周期Y值.初值为X\\r\\n    this.TMA=function(data, a, b)\\r\\n    {\\r\\n        var result=[];\\r\\n        if (this.IsNumber(a) && a<=1 && this.IsNumber(b) && b<1)\\r\\n        {\\r\\n            var bFirstFind=false;\\r\\n            var proValue;   //上一个值\\r\\n            for(var i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                if (bFirstFind==false)\\r\\n                {\\r\\n                    var item=data[i];\\r\\n                    if (this.IsNumber(item))\\r\\n                    {\\r\\n                        result[i]=item;\\r\\n                        proValue=result[i];\\r\\n                        bFirstFind=true;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var item=data[i];\\r\\n                    if (!this.IsNumber(item)) continue;\\r\\n                    result[i]=a*result[i-1]+b*item;\\r\\n                    proValue=result[i];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.ROUND=function(data)\\r\\n    {\\r\\n        if (this.IsNumber(data))\\r\\n        {\\r\\n            return Math.round(data);\\r\\n        }\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item))\\r\\n                    result[i]=Math.round(item);\\r\\n                else\\r\\n                    result[i]=null;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.ROUND2=function(data,n)\\r\\n    {\\r\\n        var ROUND2_SEED=\\r\\n            [\\r\\n                1,10,100,1000,\\r\\n                10000,\\r\\n                100000,\\r\\n                1000000,\\r\\n                10000000,\\r\\n                100000000,\\r\\n                1000000000,\\r\\n                10000000000,\\r\\n                100000000000,\\r\\n                1000000000000\\r\\n            ];\\r\\n        var decimal=0;\\r\\n        if (this.IsNumber(n)) decimal=parseInt(n);\\r\\n        if (n<0) decimal=0;\\r\\n        else if (n>=ROUND2_SEED.length) decimal=ROUND2_SEED.length-1;\\r\\n\\r\\n        if (this.IsNumber(data))\\r\\n        {\\r\\n            return Math.round(data*ROUND2_SEED[decimal])/ROUND2_SEED[decimal];\\r\\n        }\\r\\n\\r\\n        var result=[];\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (this.IsNumber(item))\\r\\n                {\\r\\n                    result[i]=Math.round(item*ROUND2_SEED[decimal])/ROUND2_SEED[decimal];\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    result[i]=null;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /* 文华\\r\\n    TRMA(X,N)： 求X在N个周期的三角移动平均值。\\r\\n\\r\\n    算法：三角移动平均线公式，是采用算数移动平均，并且对第一个移动平均线再一次应用算数移动平均。\\r\\n    TRMA(X,N) 算法如下\\r\\n    ma_half= MA(X,N/2)\\r\\n    trma=MA(ma_half,N/2)\\r\\n\\r\\n    注：\\r\\n    1、N包含当前k线。\\r\\n    2、当N为有效值，但当前的k线数不足N根，函数返回空值。\\r\\n    3、N为0或空值的情况下，函数返回空值。\\r\\n\\r\\n    例1：\\r\\n    TRMA5:TRMA(CLOSE,5);//计算5个周期内收盘价的三角移动平均。(N不能被2整除)\\r\\n    //TRMA(CLOSE,5)=MA(MA(CLOSE,(5+1)/2)),(5+1)/2);\\r\\n    例2:\\r\\n    TRMA10:TRMA(CLOSE,10);// 计算10个周期内收盘价的三角移动平均。(N能被2整除)\\r\\n    TRMA(CLOSE,10)=MA(MA(CLOSE,10/2),(10/2)+1));\\r\\n    */\\r\\n\\r\\n    this.TRMA=function(data,n)\\r\\n    {\\r\\n        if (!this.IsNumber(n) || n<=0) return [];\\r\\n        n=parseInt(n);\\r\\n        var nFalf=0,nFalf2=0;\\r\\n        if (n%2==0)\\r\\n        {\\r\\n            nFalf=parseInt(n/2);\\r\\n            nFalf2=nFalf+1;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            nFalf=parseInt((n+1)/2);\\r\\n            nFalf2=nFalf;\\r\\n        }\\r\\n\\r\\n        var maFalf=this.MA(data,nFalf);\\r\\n        var result=this.MA(maFalf,nFalf2);\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //VALUEWHEN(COND,X)\\r\\n    //当COND条件成立时,取X的当前值,否则取VALUEWHEN的上个值.\\r\\n    this.VALUEWHEN=function(cond,data)\\r\\n    {\\r\\n        if (Array.isArray(cond))\\r\\n        {\\r\\n            var result=[];\\r\\n            if (Array.isArray(data))\\r\\n            {\\r\\n                var preValue=null;\\r\\n                for(var i in cond)\\r\\n                {\\r\\n                    if (i>=data.length)\\r\\n                    {\\r\\n                        result[i]=preValue;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    var item=data[i];\\r\\n                    if (cond[i])\\r\\n                    {\\r\\n                        result[i]=item;\\r\\n                        preValue=item;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        result[i]=preValue;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var preValue=null;\\r\\n                for(var i in cond)\\r\\n                {\\r\\n                    if (cond[i])\\r\\n                    {\\r\\n                        result[i]=data;\\r\\n                        preValue=data;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        result[i]=preValue;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return result;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return cond? 1:0;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    HARMEAN(X,N) 求X在N个周期内的调和平均值。\\r\\n\\r\\n    算法举例：HARMEAN(X,5)=1/[(1/X1+1/X2+1/X3+1/X4+1/X5)/5]\\r\\n\\r\\n    注：\\r\\n    1、N包含当前k线。\\r\\n    2、调和平均值与倒数的简单平均值互为倒数。\\r\\n    3、当N为有效值，但当前的k线数不足N根，函数返回空值。\\r\\n    4、N为0或空值的情况下，函数返回空值。\\r\\n    5、X为0或空值的情况下，函数返回空值。\\r\\n    6、N可以为变量。\\r\\n\\r\\n    例：HM5:=HARMEAN(C,5);//求5周期收盘价的调和平均值。\\r\\n    */\\r\\n    this.HARMEAN=function(data, n)\\r\\n    {\\r\\n        var result=[];\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            if (Array.isArray(n))\\r\\n            {\\r\\n                for(var i=0;i<data.length;++i)\\r\\n                {\\r\\n                    if (i>=n.length)\\r\\n                    {\\r\\n                        result[i]=null;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    var count=parseInt(n[i]);\\r\\n                    if (count<=0 || count>i)\\r\\n                    {\\r\\n                        result[i]=null;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    var sum=0;\\r\\n                    for(var j=0;j<count;++j)\\r\\n                    {\\r\\n                        var item=data[i-j];\\r\\n                        if (!this.IsNumber(item) || item==0)\\r\\n                        {\\r\\n                            sum=null;\\r\\n                            break;\\r\\n                        }\\r\\n\\r\\n                        sum+=1/item;\\r\\n                    }\\r\\n\\r\\n                    if (sum==null)\\r\\n                    {\\r\\n                        result[i]=null;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        result[i]=1/(sum/count);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else if (this.IsNumber(n))\\r\\n            {\\r\\n                n=parseInt(n);\\r\\n                if (n<=0) return result;\\r\\n\\r\\n                for(var i=0;i<data.length;++i)\\r\\n                {\\r\\n                    if (n>i)\\r\\n                    {\\r\\n                        result[i]=null;\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    var sum=0;\\r\\n                    for(var j=0;j<n;++j)\\r\\n                    {\\r\\n                        var item=data[i-j];\\r\\n                        if (!this.IsNumber(item) || item==0)\\r\\n                        {\\r\\n                            sum=null;\\r\\n                            break;\\r\\n                        }\\r\\n\\r\\n                        sum+=1/item;\\r\\n                    }\\r\\n\\r\\n                    if (sum==null)\\r\\n                    {\\r\\n                        result[i]=null;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        result[i]=1/(sum/n);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //指定日期到1990.12.19的天数.\\r\\n    //用法: DATETODAY(date)\\r\\n    //DATETODAY(date).返回date到1990.12.19的天数.有效日期为(901219-1341231)\\r\\n    //例如: DATETODAY(901219)返回0.\\r\\n    this.DATETODAY=function(data)\\r\\n    {\\r\\n        var result=[];\\r\\n        var startDate=new Date('1990-12-19')\\r\\n        var startValue=19901219;\\r\\n        var ONE_DAY=1000 * 60 * 60 * 24\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=data[i];\\r\\n                if (!this.IsNumber(item)) continue;\\r\\n                var value=item+19000000;\\r\\n                if (value<startValue) continue;\\r\\n                var year=parseInt(value/10000);\\r\\n                var month=parseInt((value%10000)/100);\\r\\n                var day=parseInt(value%100);\\r\\n                var dateItem=new Date(`${year}-${month}-${day}`);\\r\\n                result[i]=Math.round((dateItem-startDate)/ONE_DAY);\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsNumber(data))\\r\\n        {\\r\\n            var value=data+19000000;\\r\\n            if (value>=startValue)\\r\\n            {\\r\\n                var year=parseInt(value/10000);\\r\\n                var month=parseInt((value%10000)/100);\\r\\n                var day=parseInt(value%100);\\r\\n                var dateItem=new Date(`${year}-${month}-${day}`);\\r\\n                return Math.round((dateItem-dateItem)/ONE_DAY);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //求1990.12.19后第若干天的日期.\\r\\n    //用法:DAYTODATE(N)\\r\\n    //DAYTODATE(N).返回1990.12.19后第N天的日期.有效天数为(0-20000)\\r\\n    //例如:DAYTODATE(0)返回901219.\\r\\n    this.DAYTODATE=function(data)\\r\\n    {\\r\\n        var startDate=new Date('1990-12-19')\\r\\n        var result=[];\\r\\n\\r\\n        if (Array.isArray(data))\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                result[i]=null;\\r\\n                var item=data[i];\\r\\n                if (!this.IsNumber(item)) continue;\\r\\n                startDate.setDate(startDate.getDate()+item);\\r\\n                var value=startDate.getFullYear()*10000+(startDate.getMonth()+1)*100+startDate.getDate();\\r\\n                value-=19000000;\\r\\n                result[i]=value;\\r\\n                startDate.setDate(startDate.getDate()-item);\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsNumber(data))\\r\\n        {\\r\\n            startDate.setDate(startDate.getDate()+data);\\r\\n            var value=startDate.getFullYear()*10000+(startDate.getMonth()+1)*100+startDate.getDate();\\r\\n            value-=19000000;\\r\\n            return value;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //函数调用\\r\\n    this.CallFunction=function(name,args,node,symbolData)\\r\\n    {\\r\\n        switch(name)\\r\\n        {\\r\\n            case 'MAX':\\r\\n            case \\\"MAX6\\\":\\r\\n                return this.MAX(args,node);\\r\\n\\r\\n            case 'MIN':\\r\\n            case \\\"MIN6\\\":\\r\\n                return this.MIN(args,node);\\r\\n            case 'REF':\\r\\n                return this.REF(args[0], args[1]);\\r\\n            case \\\"REFV\\\":\\r\\n                return this.REFV(args[0], args[1]);\\r\\n            case 'REFX':\\r\\n                return this.REFX(args[0], args[1]);\\r\\n            case \\\"REFXV\\\":\\r\\n                return this.REFXV(args[0], args[1]);\\r\\n            case 'ABS':\\r\\n                return this.ABS(args[0]);\\r\\n            case 'MA':\\r\\n                return this.MA(args[0], args[1]);\\r\\n            case \\\"EMA\\\":\\r\\n                return this.EMA(args[0], args[1]);\\r\\n            case \\\"SMA\\\":\\r\\n                return this.SMA(args[0], args[1],args[2]);\\r\\n            case \\\"DMA\\\":\\r\\n                return this.DMA(args[0], args[1]);\\r\\n            case \\\"XMA\\\":\\r\\n                return this.XMA(args[0], args[1]);\\r\\n            case 'EXPMA':\\r\\n                return this.EXPMA(args[0], args[1]);\\r\\n            case 'EXPMEMA':\\r\\n                return this.EXPMEMA(args[0], args[1]);\\r\\n            case 'COUNT':\\r\\n                return this.COUNT(args[0], args[1]);\\r\\n            case 'LLV':\\r\\n                return this.LLV(args[0], args[1]);\\r\\n            case 'LLVBARS':\\r\\n                return this.LLVBARS(args[0], args[1]);\\r\\n            case 'HHV':\\r\\n                return this.HHV(args[0], args[1]);\\r\\n            case 'HHVBARS':\\r\\n                return this.HHVBARS(args[0], args[1]);\\r\\n            case 'MULAR':\\r\\n                return this.MULAR(args[0], args[1]);\\r\\n            case 'CROSS':\\r\\n                return this.CROSS(args[0], args[1]);\\r\\n            case 'LONGCROSS':\\r\\n                return this.LONGCROSS(args[0], args[1], args[2]);\\r\\n            case 'AVEDEV':\\r\\n                return this.AVEDEV(args[0], args[1]);\\r\\n            case 'STD':\\r\\n                return this.STD(args[0], args[1]);\\r\\n            case 'IF':\\r\\n            case 'IFF':\\r\\n                return this.IF(args[0], args[1], args[2]);\\r\\n            case 'IFN':\\r\\n                return this.IFN(args[0], args[1], args[2]);\\r\\n            case 'NOT':\\r\\n                return this.NOT(args[0]);\\r\\n            case 'SUM':\\r\\n                return this.SUM(args[0], args[1]);\\r\\n            case 'RANGE':\\r\\n                return this.RANGE(args[0],args[1],args[2]);\\r\\n            case 'EXIST':\\r\\n                return this.EXIST(args[0],args[1]);\\r\\n            case 'EXISTR':\\r\\n                return this.EXISTR(args[0],args[1],args[2]);\\r\\n            case 'FILTER':\\r\\n                return this.FILTER(args[0],args[1]);\\r\\n            case 'TFILTER':\\r\\n                return this.TFILTER(args[0],args[1],args[2]);\\r\\n            case 'SLOPE':\\r\\n                return this.SLOPE(args[0],args[1]);\\r\\n            case 'BARSLAST':\\r\\n                return this.BARSLAST(args[0]);\\r\\n            case 'BARSCOUNT':\\r\\n                return this.BARSCOUNT(args[0]);\\r\\n            case 'BARSSINCEN':\\r\\n                return this.BARSSINCEN(args[0],args[1]);\\r\\n            case 'BARSSINCE':\\r\\n                return this.BARSSINCE(args[0]);\\r\\n            case 'LAST':\\r\\n                return this.LAST(args[0],args[1],args[2]);\\r\\n            case 'EVERY':\\r\\n                return this.EVERY(args[0],args[1]);\\r\\n            case 'DEVSQ':\\r\\n                return this.DEVSQ(args[0], args[1]);\\r\\n            case 'ZIG':\\r\\n                return this.ZIG(args[0],args[1]);\\r\\n            case 'TROUGHBARS':\\r\\n                return this.TROUGHBARS(args[0],args[1],args[2]);\\r\\n            case \\\"TROUGH\\\":\\r\\n                return this.TROUGH(args[0],args[1],args[2]);\\r\\n            case 'PEAKBARS':\\r\\n                return this.PEAKBARS(args[0],args[1],args[2]);\\r\\n            case 'PEAK':\\r\\n                return this.PEAK(args[0],args[1],args[2]);\\r\\n            case 'COST':\\r\\n                return this.COST(args[0]);\\r\\n            case 'WINNER':\\r\\n                return this.WINNER(args[0],node);\\r\\n            case 'PPART':\\r\\n                return this.PPART(args[0],node);\\r\\n            case \\\"COSTEX\\\":\\r\\n                return this.COSTEX(args[0],args[1],node);\\r\\n            case \\\"LWINNER\\\":\\r\\n                return this.LWINNER(args[0],args[1],node);\\r\\n            case \\\"PWINNER\\\":\\r\\n                return this.PWINNER(args[0],args[1],node);\\r\\n            case 'FORCAST':\\r\\n                return this.FORCAST(args[0], args[1]);\\r\\n            case \\\"TSMA\\\":\\r\\n                return this.TSMA(args[0], args[1]);\\r\\n            case 'STDP':\\r\\n                return this.STDP(args[0], args[1]);\\r\\n            case 'VAR':\\r\\n                return this.VAR(args[0], args[1]);\\r\\n            case 'VARP':\\r\\n                return this.VARP(args[0], args[1]);\\r\\n            case 'UPNDAY':\\r\\n                return this.UPNDAY(args[0],args[1]);\\r\\n            case 'DOWNNDAY':\\r\\n                return this.DOWNNDAY(args[0],args[1]);\\r\\n            case 'NDAY':\\r\\n                return this.NDAY(args[0],args[1],args[2]);\\r\\n            case 'RELATE':\\r\\n                return this.RELATE(args[0],args[1],args[2]);\\r\\n            case 'COVAR':\\r\\n                return this.COVAR(args[0],args[1],args[2]);\\r\\n            case 'BETA':\\r\\n                return this.BETA(args[0]);\\r\\n            case 'BETA2':\\r\\n                return this.BETA2(args[0],args[1],args[2]);\\r\\n            case 'WMA':\\r\\n                return this.WMA(args[0], args[1]);\\r\\n            case 'MEMA':\\r\\n                return this.MEMA(args[0], args[1]);\\r\\n            case 'SUMBARS':\\r\\n                return this.SUMBARS(args[0], args[1]);\\r\\n            case 'REVERSE':\\r\\n                return this.REVERSE(args[0]);\\r\\n            case 'SAR':\\r\\n                return this.SAR(args[0], args[1], args[2]);\\r\\n            case 'SARTURN':\\r\\n                return this.SARTURN(args[0], args[1], args[2]);\\r\\n            case 'BACKSET':\\r\\n                return this.BACKSET(args[0], args[1]);\\r\\n            case 'BETWEEN':\\r\\n                return this.BETWEEN(args[0], args[1], args[2]);\\r\\n            case 'STRCAT':\\r\\n                return this.STRCAT(args[0], args[1]);\\r\\n            case 'CON2STR':\\r\\n                return this.CON2STR(args[0], args[1]);\\r\\n            case \\\"VAR2STR\\\":\\r\\n                return this.VAR2STR(args[0], args[1]);\\r\\n            case \\\"VARCAT\\\":\\r\\n                return this.VARCAT(args[0], args[1]);\\r\\n            case \\\"STRSPACE\\\":\\r\\n                return this.STRSPACE(args[0]);\\r\\n            case \\\"FINDSTR\\\":\\r\\n                return this.FINDSTR(args[0], args[1]);\\r\\n            case 'DTPRICE':\\r\\n                return this.DTPRICE(args[0], args[1]);\\r\\n            case 'ZTPRICE':\\r\\n                return this.ZTPRICE(args[0], args[1]);\\r\\n            case 'MOD':\\r\\n                return this.MOD(args[0],args[1]);\\r\\n            case 'POW':\\r\\n                return this.POW(args[0],args[1]);\\r\\n            case 'CEILING':\\r\\n                return this.CEILING(args[0]);\\r\\n            case 'FLOOR':\\r\\n                return this.FLOOR(args[0]);\\r\\n            case 'FRACPART':\\r\\n                return this.FRACPART(args[0]);\\r\\n            case 'BARSLASTCOUNT':\\r\\n                return this.BARSLASTCOUNT(args[0]);\\r\\n            case 'INTPART':\\r\\n                return this.INTPART(args[0]);\\r\\n            case \\\"CONST\\\":\\r\\n                return this.CONST(args[0]);\\r\\n            case \\\"TOPRANGE\\\":\\r\\n                return this.TOPRANGE(args[0]);\\r\\n            case \\\"LOWRANGE\\\":\\r\\n                return this.LOWRANGE(args[0]);\\r\\n            case \\\"FINDLOW\\\":\\r\\n                return this.FINDLOW(args[0],args[1],args[2],args[3]);\\r\\n            case \\\"FINDLOWBARS\\\":\\r\\n                return this.FINDLOWBARS(args[0],args[1],args[2],args[3]);\\r\\n            case \\\"FINDHIGH\\\":\\r\\n                return this.FINDHIGH(args[0],args[1],args[2],args[3]);\\r\\n            case \\\"FINDHIGHBARS\\\":\\r\\n                return this.FINDHIGHBARS(args[0],args[1],args[2],args[3]);\\r\\n            case \\\"BARSNEXT\\\":\\r\\n                return this.BARSNEXT(args[0]);\\r\\n\\r\\n            case \\\"HOD\\\":\\r\\n                return this.HOD(args[0], args[1]);\\r\\n            case \\\"LOD\\\":\\r\\n                return this.LOD(args[0], args[1]);\\r\\n            case \\\"AMA\\\":\\r\\n                return this.AMA(args[0], args[1]);\\r\\n            case \\\"TMA\\\":\\r\\n                return this.TMA(args[0],args[1],args[2]);\\r\\n            case \\\"ROUND\\\":\\r\\n                return this.ROUND(args[0]);\\r\\n            case \\\"ROUND2\\\":\\r\\n                return this.ROUND2(args[0],args[1]);\\r\\n            case \\\"TRMA\\\":\\r\\n                return this.TRMA(args[0],args[1]);\\r\\n            case \\\"VALUEWHEN\\\":\\r\\n                return this.VALUEWHEN(args[0],args[1]);\\r\\n            case \\\"HARMEAN\\\":\\r\\n                return this.HARMEAN(args[0],args[1]);\\r\\n            case \\\"DATETODAY\\\":\\r\\n                return this.DATETODAY(args[0]);\\r\\n            case \\\"DAYTODATE\\\":\\r\\n                return this.DAYTODATE(args[0]);\\r\\n\\r\\n            //三角函数\\r\\n            case 'ATAN':\\r\\n                return this.Trigonometric(args[0],Math.atan);\\r\\n            case 'ACOS':\\r\\n                return this.ACOS(args[0]);\\r\\n            case 'ASIN':\\r\\n                return this.ASIN(args[0]);\\r\\n            case 'COS':\\r\\n                return this.Trigonometric(args[0],Math.cos);\\r\\n            case 'SIN':\\r\\n                return this.Trigonometric(args[0],Math.sin);\\r\\n            case 'TAN':\\r\\n                return this.Trigonometric(args[0],Math.tan);\\r\\n            case 'LN':\\r\\n                return this.Trigonometric(args[0],Math.log);\\r\\n            case 'LOG':\\r\\n                return this.Trigonometric(args[0],Math.log10);\\r\\n            case 'EXP':\\r\\n                return this.Trigonometric(args[0],Math.exp);\\r\\n            case 'SQRT':\\r\\n                return this.Trigonometric(args[0],Math.sqrt);\\r\\n            case \\\"RAND\\\":\\r\\n                return this.RAND(args[0]);\\r\\n            default:\\r\\n                this.ThrowUnexpectedNode(node,'函数'+name+'不存在', name);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //调用自定义函数 返回数据格式{Out:输出数据, Draw:绘图数据(可选)}\\r\\n    this.CallCustomFunction=function(name, args, symbolData, node)\\r\\n    {\\r\\n        var functionInfo=g_JSComplierResource.CustomFunction.Data.get(name);\\r\\n        var dwonloadData=symbolData.GetStockCacheData({ CustomName:name, Node:node });\\r\\n        if (!functionInfo.Invoke)\\r\\n            return { Out: dwonloadData }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSAlgorithm::CallCustomFunction] call custom function functionInfo=',functionInfo);\\r\\n\\r\\n        var self=this;\\r\\n        var obj=\\r\\n            {\\r\\n                Name:name,\\r\\n                Args:args,\\r\\n                Symbol:symbolData.Symbol, Period:symbolData.Period, Right:symbolData.Right,\\r\\n                KData:symbolData.Data,  //K线数据\\r\\n                DownloadData:dwonloadData,\\r\\n                ThrowError:function(error)\\r\\n                {\\r\\n                    self.ThrowUnexpectedNode(node, error);\\r\\n                }\\r\\n            };\\r\\n\\r\\n        return functionInfo.Invoke(obj);\\r\\n    }\\r\\n\\r\\n    this.ThrowUnexpectedNode=function(node,message,word)\\r\\n    {\\r\\n        let marker=node.Marker;\\r\\n        let msg=message || \\\"执行异常\\\";\\r\\n\\r\\n        return this.ErrorHandler.ThrowError(marker.Index,marker.Line,marker.Column,msg,word);\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//是否有是有效的数字\\r\\nJSAlgorithm.prototype.IsNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\n//是否有是有效的除数\\r\\nJSAlgorithm.prototype.IsDivideNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n    if (value==0) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\n//取模\\r\\nJSAlgorithm.MOD=function(number,divisor)\\r\\n{\\r\\n    if( (number < 0 && divisor < 0) || (number >=0 && divisor >= 0))     //同号\\r\\n    {\\r\\n        if(parseInt(number) == number && parseInt(divisor) == divisor)  //全为整数\\r\\n        {\\r\\n            return number%divisor;\\r\\n        }\\r\\n        else  //被除数-(整商×除数)之后在第一位小数位进行四舍五入\\r\\n        {\\r\\n            var value = parseFloat((number - (Math.floor(number/divisor) * divisor)).toFixed(1));\\r\\n            return value;\\r\\n        }\\r\\n    }\\r\\n    else    //异号\\r\\n    {\\r\\n        var absNumber = Math.abs(number);        //绝对值\\r\\n        var absDivisor = Math.abs(divisor);      //绝对值\\r\\n        var value = Math.abs(Math.abs(divisor) * (Math.floor(absNumber/absDivisor) + 1) - Math.abs(number));\\r\\n        if(divisor < 0) value = -value\\r\\n        return value;\\r\\n    }\\r\\n}\\r\\n\\r\\n/*\\r\\n   绘图函数\\r\\n*/\\r\\nfunction JSDraw(errorHandler,symbolData)\\r\\n{\\r\\n    this.ErrorHandler=errorHandler;\\r\\n    this.SymbolData=symbolData;\\r\\n\\r\\n    this.DRAWTEXT=function(condition,price,text)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'DRAWTEXT',Text:text};\\r\\n\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            if (condition.length<=0) return result;\\r\\n\\r\\n            var IsNumber=this.IsNumber(price);\\r\\n\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n\\r\\n                if (isNaN(condition[i]) || !condition[i]) continue;\\r\\n\\r\\n                if (IsNumber)\\r\\n                {\\r\\n                    drawData[i]=price;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(price[i])) drawData[i]=price[i];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else if (this.IsNumber(condition) && condition)\\r\\n        {\\r\\n            var IsNumber=this.IsNumber(price);\\r\\n            for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n            {\\r\\n                if (IsNumber)\\r\\n                {\\r\\n                    drawData[i]=price;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(price[i])) drawData[i]=price[i];\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.DRAWTEXT_FIX=function(condition,x,y,type,text)\\r\\n    {\\r\\n        var drawData={ Value:[], Text:[]  };\\r\\n        var result={DrawData:drawData, DrawType:'DRAWTEXT_FIX', Text:null, Position:{ X:x, Y:y, Type:type } };\\r\\n        if (condition.length<=0) return result;\\r\\n\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                drawData.Text[i]=null;\\r\\n                drawData.Value[i]=0;\\r\\n                if (isNaN(condition[i]) || !condition[i]) continue;\\r\\n\\r\\n                drawData.Value[i]=1;\\r\\n                drawData.Text[i]=text;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if(condition)\\r\\n            {\\r\\n                for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n                {\\r\\n                    drawData.Text[i]=text;\\r\\n                    drawData.Value[i]=1;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //direction 文字Y轴位置 0=middle 1=价格的顶部 2=价格的底部\\r\\n    //offset 文字Y轴偏移\\r\\n    this.SUPERDRAWTEXT=function(condition,price,text,direction,offset)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'SUPERDRAWTEXT',Text:text,YOffset:offset,Direction:direction,TextAlign:'center'};\\r\\n        if (condition.length<=0) return result;\\r\\n\\r\\n        var IsNumber=typeof(price)==\\\"number\\\";\\r\\n\\r\\n        for(var i in condition)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n\\r\\n            if (isNaN(condition[i]) || !condition[i]) continue;\\r\\n\\r\\n            if (IsNumber)\\r\\n            {\\r\\n                drawData[i]=price;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.IsNumber(price[i])) drawData[i]=price[i];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    STICKLINE 绘制柱线\\r\\n    在图形上绘制柱线。\\r\\n    用法：　STICKLINE(COND，PRICE1，PRICE2，WIDTH，EMPTY)，当COND条件满足时，在PRICE1和PRICE2位置之间画柱状线，宽度为WIDTH(10为标准间距)，EMPTH不为0则画空心柱。\\r\\n    例如：　STICKLINE(CLOSE>OPEN，CLOSE，OPEN，0.8，1)表示画K线中阳线的空心柱体部分。\\r\\n    */\\r\\n    this.STICKLINE=function(condition,data,data2,width,type)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'STICKLINE',Width:width, Type:type};\\r\\n        if (result.Width<0) result.Width=3;    //<0的宽度 使用K线宽度\\r\\n\\r\\n        var IsNumber=typeof(data)==\\\"number\\\";\\r\\n        var IsNumber2=typeof(data2)==\\\"number\\\";\\r\\n\\r\\n        if (Array.isArray(condition))   //数组\\r\\n        {\\r\\n            if(condition.length<=0) return result;\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n\\r\\n                if (isNaN(condition[i]) || !condition[i]) continue;\\r\\n\\r\\n                if (IsNumber && IsNumber2)\\r\\n                {\\r\\n                    drawData[i]={Value:data,Value2:data2};\\r\\n                }\\r\\n                else if (IsNumber && !IsNumber2)\\r\\n                {\\r\\n                    if (isNaN(data2[i])) continue;\\r\\n                    drawData[i]={Value:data,Value2:data2[i]};\\r\\n                }\\r\\n                else if (!IsNumber && IsNumber2)\\r\\n                {\\r\\n                    if (isNaN(data[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2};\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isNaN(data[i]) || isNaN(data2[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2[i]};\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else    //单值\\r\\n        {\\r\\n            if(!condition) return result;\\r\\n\\r\\n            for(var i=0;i<this.SymbolData.Data.Data.length;++i) //以K线长度为数据长度\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n\\r\\n                if (IsNumber && IsNumber2)\\r\\n                {\\r\\n                    drawData[i]={Value:data,Value2:data2};\\r\\n                }\\r\\n                else if (IsNumber && !IsNumber2)\\r\\n                {\\r\\n                    if (!IFrameSplitOperator.IsNumber(data2[i])) continue;\\r\\n                    drawData[i]={Value:data,Value2:data2[i]};\\r\\n                }\\r\\n                else if (!IsNumber && IsNumber2)\\r\\n                {\\r\\n                    if (!IFrameSplitOperator.IsNumber(data[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2};\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (!IFrameSplitOperator.IsNumber(data[i]) || !IFrameSplitOperator.IsNumber(data2[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2[i]};\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    DRAWLINE 绘制直线段\\r\\n    在图形上绘制直线段。\\r\\n    用法：　DRAWLINE(COND1，PRICE1，COND2，PRICE2，EXPAND)\\r\\n    当COND1条件满足时，在PRICE1位置画直线起点，当COND2条件满足时，在PRICE2位置画直线终点，EXPAND为延长类型。\\r\\n    例如：　DRAWLINE(HIGH>=HHV(HIGH,20),HIGH,LOW<=LLV(LOW,20),LOW,1)　表示在创20天新高与创20天新低之间画直线并且向右延长。\\r\\n    */\\r\\n    this.DRAWLINE=function(condition,data,condition2,data2,expand)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'DRAWLINE', Expand:expand};\\r\\n\\r\\n        if(condition.length<=0) return result;\\r\\n        let count=Math.max(condition.length,condition2.length);\\r\\n\\r\\n        let bFirstPoint=false;\\r\\n        let bSecondPont=false;\\r\\n        let lineCache={Start:{ },End:{ }, List:new Array()};\\r\\n\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n            if (i<condition.length && i<condition2.length)\\r\\n            {\\r\\n                if (bFirstPoint==false && bSecondPont==false)\\r\\n                {\\r\\n                    if (condition[i]==null || !condition[i]) continue;\\r\\n\\r\\n                    bFirstPoint=true;\\r\\n                    lineCache.Start={ID:i, Value:data[i]};  //第1个点\\r\\n                }\\r\\n                else if (bFirstPoint==true && bSecondPont==false)\\r\\n                {\\r\\n                    var bCondition2=(condition2[i]!=null && condition2[i]); //条件2\\r\\n                    if (!bCondition2)\\r\\n                    {\\r\\n                        if (condition[i] ) //条件1满足\\r\\n                            lineCache.Start={ID:i, Value:data[i]};  //移动第1个点\\r\\n                        continue;\\r\\n                    }\\r\\n\\r\\n                    if (bCondition2)\\r\\n                    {\\r\\n                        bSecondPont=true;\\r\\n                        lineCache.End={ID:i, Value:data2[i]};   //第2个点\\r\\n                    }\\r\\n                }\\r\\n                else if (bFirstPoint==true && bSecondPont==true)\\r\\n                {\\r\\n                    var bCondition2=(condition2[i]!=null && condition2[i]); //条件2\\r\\n                    if (bCondition2)    //条件2满足\\r\\n                    {\\r\\n                        lineCache.End={ID:i, Value:data2[i]};   //移动第2个点\\r\\n                    }\\r\\n                    else if (condition[i])  //条件1满足\\r\\n                    {\\r\\n                        let lineData=this.CalculateDrawLine(lineCache);     //计算2个点的线上 其他点的数值\\r\\n\\r\\n                        for(let j in lineData)\\r\\n                        {\\r\\n                            let item=lineData[j];\\r\\n                            drawData[item.ID]=item.Value;\\r\\n                        }\\r\\n\\r\\n                        if (expand==1) this.CalculateDrawDataExtendLine(drawData, lineCache.Start.ID-2);//右延长线\\r\\n\\r\\n                        bFirstPoint=bSecondPont=false;\\r\\n                        lineCache={Start:{ },End:{ }};\\r\\n\\r\\n                        bFirstPoint=true;\\r\\n                        bSecondPont=false;\\r\\n                        lineCache.Start={ID:i, Value:data[i]};  //第1个点\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            //最后一组线\\r\\n            if (bFirstPoint==true && bSecondPont==true)\\r\\n            {\\r\\n                let lineData=this.CalculateDrawLine(lineCache);\\r\\n                for(let j in lineData)\\r\\n                {\\r\\n                    let item=lineData[j];\\r\\n                    drawData[item.ID]=item.Value;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (expand==1) this.CalculateDrawDataExtendLine(drawData);//右延长线\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    画出带状线.\\r\\n    用法: DRAWBAND(VAL1,COLOR1,VAL2,COLOR2),当VAL1>VAL2时,在VAL1和VAL2之间填充COLOR1;当VAL1<VAL2时,填充COLOR2,这里的颜色均使用RGB函数计算得到.\\r\\n    例如: DRAWBAND(OPEN,RGB(0,224,224),CLOSE,RGB(255,96,96));\\r\\n    */\\r\\n    this.DRAWBAND=function(data,color,data2,color2)\\r\\n    {\\r\\n        var drawData=[];\\r\\n        var result={DrawData:drawData, DrawType:'DRAWBAND', Color:[color.toLowerCase(),color2.toLowerCase()]};  //颜色使用小写字符串\\r\\n        var isNumber=IFrameSplitOperator.IsNumber(data);\\r\\n        var isNumber2=IFrameSplitOperator.IsNumber(data2);\\r\\n        if (!isNumber && !isNumber2)\\r\\n        {\\r\\n            var count=Math.max(data.length, data2.length);\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                var item={Value:null, Value2:null};\\r\\n                if (i<data.length) item.Value=data[i];\\r\\n                if (i<data2.length) item.Value2=data2[i];\\r\\n                drawData.push(item);\\r\\n            }\\r\\n        }\\r\\n        else if (isNumber && !isNumber2)\\r\\n        {\\r\\n            var count=data2.length;\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                var item={Value:data, Value2:null};\\r\\n                if (i<data2.length) item.Value2=data2[i];\\r\\n                drawData.push(item);\\r\\n            }\\r\\n        }\\r\\n        else if (!isNumber && isNumber2)\\r\\n        {\\r\\n            var count=data.length;\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                var item={Value:null, Value2:data2};\\r\\n                if (i<data.length) item.Value=data[i];\\r\\n                drawData.push(item);\\r\\n            }\\r\\n        }\\r\\n        else if (isNumber && isNumber2)\\r\\n        {\\r\\n            var count=this.SymbolData.Data.Data.length;\\r\\n            for(var i=0;i<count;++i)\\r\\n            {\\r\\n                var item={Value:data, Value2:data2};\\r\\n                drawData.push(item);\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetDataByIndex=function(data, index)\\r\\n    {\\r\\n        var result={Result:false , Data:null };\\r\\n        if (this.IsNumber(data))\\r\\n        {\\r\\n            result.Result=true;\\r\\n            result.Data=data;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (index<data.length)\\r\\n            {\\r\\n                result.Result=true;\\r\\n                result.Data=data[index];\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result.Result=false;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    FILLRGN(MA1>MA2, MA1,MA2),colorred\\r\\n    表示MA1>MA2时以红色填充MA1和MA2之间的区域\\r\\n    */\\r\\n    this.FILLRGN=function(condition, data,data2)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'FILLRGN'};\\r\\n        var isNumber=this.IsNumber(data);\\r\\n        var isNumber2=this.IsNumber(data2);\\r\\n\\r\\n        if (Array.isArray(condition))   //数组\\r\\n        {\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n                var condItem=condition[i];\\r\\n                if (!condItem) continue;\\r\\n\\r\\n                var value=this.GetDataByIndex(data, i);\\r\\n                if (!value.Result) continue;\\r\\n\\r\\n                var value2=this.GetDataByIndex(data2, i);\\r\\n                if (!value2.Result) continue;\\r\\n\\r\\n                var item={ Value:value.Data, Value2:value2.Data };\\r\\n                drawData[i]=item;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (condition)\\r\\n            {\\r\\n                for(var i=0;i<this.SymbolData.Data.Data.length;++i) //以K线长度为数据长度\\r\\n                {\\r\\n                    drawData[i]=null;\\r\\n\\r\\n                    var value=this.GetDataByIndex(data, i);\\r\\n                    if (!value.Result) continue;\\r\\n\\r\\n                    var value2=this.GetDataByIndex(data2, i);\\r\\n                    if (!value2.Result) continue;\\r\\n\\r\\n                    var item={ Value:value.Data, Value2:value2.Data };\\r\\n                    drawData[i]=item;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.DRAWKLINE=function(high,open,low,close)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'DRAWKLINE'};\\r\\n        let count=Math.max(high.length, open.length,low.length,close.length);\\r\\n\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n            let item={Open:null,High:null, Low:null, Close:null};\\r\\n\\r\\n            if (i<high.length && i<open.length && i<low.length && i<close.length)\\r\\n            {\\r\\n                item.Open=open[i];\\r\\n                item.High=high[i];\\r\\n                item.Low=low[i];\\r\\n                item.Close=close[i];\\r\\n            }\\r\\n\\r\\n            drawData[i]=item;\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //满足条件画一根K线\\r\\n    this.DRAWKLINE_IF=function(condition,high,open,low,close)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'DRAWKLINE_IF'};\\r\\n        let count=Math.max(condition.length,high.length, open.length,low.length,close.length);\\r\\n\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n            let item={Open:null,High:null, Low:null, Close:null};\\r\\n\\r\\n            if (i<high.length && i<open.length && i<low.length && i<close.length && i<condition.length)\\r\\n            {\\r\\n                if (condition[i])\\r\\n                {\\r\\n                    item.Open=open[i];\\r\\n                    item.High=high[i];\\r\\n                    item.Low=low[i];\\r\\n                    item.Close=close[i];\\r\\n                }\\r\\n            }\\r\\n\\r\\n            drawData[i]=item;\\r\\n        }\\r\\n\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    PLOYLINE 折线段\\r\\n    在图形上绘制折线段。\\r\\n    用法：　PLOYLINE(COND，PRICE)，当COND条件满足时，以PRICE位置为顶点画折线连接。\\r\\n    例如：　PLOYLINE(HIGH>=HHV(HIGH,20),HIGH)表示在创20天新高点之间画折线。\\r\\n    */\\r\\n    this.POLYLINE=function(condition,data)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'POLYLINE'};\\r\\n        let isNumber=typeof(data)=='number';\\r\\n\\r\\n        let bFirstPoint=false;\\r\\n        let bSecondPont=false;\\r\\n        if (isNumber)\\r\\n        {\\r\\n            if (this.IsNumber(condition))\\r\\n            {\\r\\n                if (condition)\\r\\n                {\\r\\n                    var count=this.SymbolData.Data.Data.length;\\r\\n                    for(var i=0;i<count;++i )\\r\\n                    {\\r\\n                        drawData[i]=data;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var bFind=false;\\r\\n                for(var i in condition)\\r\\n                {\\r\\n                    drawData[i]=null;\\r\\n                    if (bFind)\\r\\n                    {\\r\\n                        drawData[i]=data;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (!condition[i]) continue;\\r\\n\\r\\n                        bFind=true;\\r\\n                        drawData[i]=data;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            let lineCache={Start:{ },End:{ }, List:new Array()};\\r\\n            for(let i in condition)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n                if (bFirstPoint==false && bSecondPont==false)\\r\\n                {\\r\\n                    if (condition[i]==null || !condition[i]) continue;\\r\\n                    if (i>=data.length || !this.IsNumber(data[i])) continue;\\r\\n\\r\\n                    bFirstPoint=true;\\r\\n                    lineCache.Start={ID:parseInt(i), Value:data[i]};  //第1个点\\r\\n                }\\r\\n                else if (bFirstPoint==true && bSecondPont==false)\\r\\n                {\\r\\n                    if (condition[i]==null || !condition[i]) continue;\\r\\n                    if (i>=data.length || !this.IsNumber(data[i])) continue;\\r\\n\\r\\n                    lineCache.End={ID:parseInt(i), Value:data[i]};   //第2个点\\r\\n                    //根据起始点和结束点 计算中间各个点的数据\\r\\n                    let lineData=this.CalculateDrawLine(lineCache);     //计算2个点的线上 其他点的数值\\r\\n\\r\\n                    for(let j in lineData)\\r\\n                    {\\r\\n                        let item=lineData[j];\\r\\n                        drawData[item.ID]=item.Value;\\r\\n                    }\\r\\n\\r\\n                    let start={ ID:lineCache.End.ID,Value:lineCache.End.Value };\\r\\n                    lineCache={Start:start,End:{ } };\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.CalculateDrawDataExtendLine(drawData);\\r\\n        }\\r\\n\\r\\n        return result\\r\\n    }\\r\\n\\r\\n    this.CalculateDrawDataExtendLine=function(drawData, maxCount)\\r\\n    {\\r\\n        if (maxCount<0) return;\\r\\n\\r\\n        var x2=null;\\r\\n        var count=drawData.length;\\r\\n        if (this.IsNumber(maxCount) && maxCount<count) count=maxCount;\\r\\n        for(var i=count-1;i>=0;--i)\\r\\n        {\\r\\n            if (this.IsNumber(drawData[i]))\\r\\n            {\\r\\n                x2=i;\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n        //y3=(y1-y2)*(x3-x1)/(x2-x1)\\r\\n        if (x2!=null && x2-1>=0)\\r\\n        {\\r\\n            var x1=x2-1;\\r\\n            for(var i=x2+1;i<count;++i)\\r\\n            {\\r\\n                var y1=drawData[x1];\\r\\n                var y2=drawData[x2];\\r\\n                var y3=(y1-y2)*(i-x1)/(x2-x1);\\r\\n                if (y1-y3<0) break;\\r\\n                drawData[i]=y1-y3;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    画出数字.\\r\\n    用法:\\r\\n    DRAWNUMBER(COND,PRICE,NUMBER),当COND条件满足时,在PRICE位置书写数字NUMBER.\\r\\n    例如:\\r\\n    DRAWNUMBER(CLOSE/OPEN>1.08,LOW,C)表示当日实体阳线大于8%时在最低价位置显示收盘价.\\r\\n    */\\r\\n    this.DRAWNUMBER=function(condition,data,data2)\\r\\n    {\\r\\n        let drawData={ Value:new Array(), Text:new Array() };\\r\\n        let result={DrawData:drawData, DrawType:'DRAWNUMBER'};\\r\\n        let isNumber=typeof(data2)=='number';\\r\\n        var isArrayData=Array.isArray(data);\\r\\n        let text;\\r\\n        if (isNumber)\\r\\n        {\\r\\n            if (IFrameSplitOperator.IsInteger(data2)) text=data2.toString();\\r\\n            else text=data2.toFixed(2);\\r\\n        }\\r\\n\\r\\n        for(let i in condition)\\r\\n        {\\r\\n            drawData.Value[i]=null;\\r\\n            if (!condition[i]) continue;\\r\\n\\r\\n            if (isArrayData)\\r\\n            {\\r\\n                if (i>=data.length || !this.IsNumber(data[i])) continue;\\r\\n\\r\\n                if (isNumber)\\r\\n                {\\r\\n                    drawData.Value[i]=data[i];\\r\\n                    drawData.Text[i]=text;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (i>=data2.length || !data2[i]) continue;\\r\\n                    drawData.Value[i]=data[i];\\r\\n                    if (this.IsNumber(data2[i]))\\r\\n                    {\\r\\n                        if (IFrameSplitOperator.IsInteger(data2[i])) drawData.Text[i]=data2[i].toString();\\r\\n                        else drawData.Text[i] = data2[i].toFixed(2);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        drawData.Text[i] = data2[i].toString();\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            else if (this.IsNumber(data))\\r\\n            {\\r\\n                if (isNumber)\\r\\n                {\\r\\n                    drawData.Value[i]=data;\\r\\n                    drawData.Text[i]=text;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (i>=data2.length || !data2[i]) continue;\\r\\n                    drawData.Value[i]=data;\\r\\n                    if (this.IsNumber(data2[i]))\\r\\n                    {\\r\\n                        if (IFrameSplitOperator.IsInteger(data2[i])) drawData.Text[i]=data2[i].toString();\\r\\n                        else drawData.Text[i] = data2[i].toFixed(2);\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        drawData.Text[i] = data2[i].toString();\\r\\n                    }\\r\\n\\r\\n                }\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    固定位置显示数字.\\r\\n    用法: DRAWNUMBER_FIX(COND,X,Y,TYPE,NUMBER),当COND条件满足时,在当前指标窗口内(X,Y)位置书写数字NUMBER,X,Y为书写点在窗口中相对于左上角的百分比,TYPE:0为左对齐,1为右对齐.\\r\\n    例如: DRAWNUMBER_FIX(CURRBARSCOUNT=1 AND CLOSE/OPEN>1.08,0.5,0.5,0,C)表示最后一个交易日实体阳线大于8%时在窗口中间位置显示收盘价.\\r\\n    */\\r\\n    this.DRAWNUMBER_FIX=function(condition,x,y,align,data)\\r\\n    {\\r\\n        var drawData={ Value:[], Text:[],  };\\r\\n        var result={ DrawData:drawData, DrawType:'DRAWNUMBER_FIX', Position:{ X:x, Y:y, Type:align } };\\r\\n        var isNumber=IFrameSplitOperator.IsNumber(data);\\r\\n\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                drawData.Text[i]=null;\\r\\n                drawData.Value[i]=null;\\r\\n                if (!condition[i]) continue;\\r\\n\\r\\n                if (isNumber)\\r\\n                {\\r\\n                    drawData.Text[i]=this.RemoveZero(data.toFixed(2));\\r\\n                    drawData.Value[i]=data;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (i>=data.length || !IFrameSplitOperator.IsNumber(data[i])) continue;\\r\\n\\r\\n                    var item=data[i];\\r\\n                    drawData.Text[i]=this.RemoveZero(item.toFixed(2));\\r\\n                    drawData.Value[i]=item;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if(!condition)\\r\\n            {\\r\\n\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n                {\\r\\n                    if (isNumber)\\r\\n                    {\\r\\n                        drawData.Text[i]=this.RemoveZero(data.toFixed(2));\\r\\n                        drawData.Value[i]=data;\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (i>=data.length || !IFrameSplitOperator.IsNumber(data[i])) continue;\\r\\n\\r\\n                        var item=data[i];\\r\\n                        drawData.Text[i]=this.RemoveZero(item.toFixed(2));\\r\\n                        drawData.Value[i]=item;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    在图形上绘制小图标.\\r\\n    用法:\\r\\n    DRAWICON(COND,PRICE,TYPE),当COND条件满足时,在PRICE位置画TYPE号图标(TYPE为1--41).\\r\\n    例如:\\r\\n    DRAWICON(CLOSE>OPEN,LOW,1)表示当收阳时在最低价位置画1号图标.\\r\\n    */\\r\\n    this.DRAWICON=function(condition,data,type)\\r\\n    {\\r\\n        var icon=g_JSComplierResource.GetDrawIcon(type);\\r\\n        if (!icon) g_JSComplierResource.GetDrawTextIcon(type);\\r\\n        if (!icon) icon={Symbol:'🚩'};\\r\\n\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'DRAWICON',Icon:icon};\\r\\n        if (condition.length<=0) return result;\\r\\n\\r\\n        var IsNumber=typeof(data)==\\\"number\\\";\\r\\n        if (typeof(condition)=='number')\\r\\n        {\\r\\n            if (!condition) return result;\\r\\n\\r\\n            for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n            {\\r\\n                if (IsNumber)\\r\\n                {\\r\\n                    drawData[i]=data;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (i<data.length && this.IsNumber(data[i])) drawData[i]=data[i];\\r\\n                    else drawData[i]=null;\\r\\n                }\\r\\n            }\\r\\n            return result;\\r\\n        }\\r\\n\\r\\n        for(var i in condition)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n\\r\\n            if (!condition[i]) continue;\\r\\n\\r\\n            if (IsNumber)\\r\\n            {\\r\\n                drawData[i]=data;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (this.IsNumber(data[i])) drawData[i]=data[i];\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    绘制通道\\r\\n    condition:条件\\r\\n    data,data2:通道顶部和底部\\r\\n    borderColor: 通道顶部和底部线段颜色RGB(24,30,40) 不填就不画\\r\\n    borderWidth: 通道顶部和底部线段宽度\\r\\n    areaColor: 通道面积颜色 RGB(200,30,44) 不填使用默认颜色\\r\\n    dotted: 通道顶部和底部虚线设置 '3,4' , 不填默认 3,3\\r\\n    */\\r\\n    this.DRAWCHANNEL=function(condition, data, data2, borderColor, borderWidth, dotted, areaColor)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'DRAWCHANNEL', Border:{ }};\\r\\n        if (condition.length<=0) return result;\\r\\n\\r\\n        if (borderColor) result.Border.Color=borderColor;\\r\\n        if (areaColor) result.AreaColor=areaColor;\\r\\n        if (borderWidth>0) result.Border.Width=borderWidth;\\r\\n        if (dotted)\\r\\n        {\\r\\n            let ary=dotted.split(',');\\r\\n            result.Border.Dotted=[];\\r\\n            for(var i in ary)\\r\\n            {\\r\\n                var item=ary[i];\\r\\n                if (!item) continue;\\r\\n                var value=parseInt(ary[i]);\\r\\n                if (value<=0) continue;\\r\\n                result.Border.Dotted.push(value);\\r\\n            }\\r\\n            if (result.Border.Dotted.length<=0) result.Border.Dotted=null;\\r\\n        }\\r\\n\\r\\n        var IsNumber=typeof(data)==\\\"number\\\";\\r\\n        var IsNumber2=typeof(data2)==\\\"number\\\";\\r\\n        if (typeof(condition)=='number')\\r\\n        {\\r\\n            if (!condition) return result;  //条件是否\\r\\n\\r\\n            for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n\\r\\n                if (IsNumber && IsNumber2)\\r\\n                {\\r\\n                    drawData[i]={Value:data,Value2:data2};\\r\\n                }\\r\\n                else if (IsNumber && !IsNumber2)\\r\\n                {\\r\\n                    if (isNaN(data2[i])) continue;\\r\\n                    drawData[i]={Value:data,Value2:data2[i]};\\r\\n                }\\r\\n                else if (!IsNumber && IsNumber2)\\r\\n                {\\r\\n                    if (isNaN(data[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2};\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isNaN(data[i]) || isNaN(data2[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2[i]};\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<condition.length;++i)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n\\r\\n                if (isNaN(condition[i]) || !condition[i]) continue;\\r\\n\\r\\n                if (IsNumber && IsNumber2)\\r\\n                {\\r\\n                    drawData[i]={Value:data,Value2:data2};\\r\\n                }\\r\\n                else if (IsNumber && !IsNumber2)\\r\\n                {\\r\\n                    if (isNaN(data2[i])) continue;\\r\\n                    drawData[i]={Value:data,Value2:data2[i]};\\r\\n                }\\r\\n                else if (!IsNumber && IsNumber2)\\r\\n                {\\r\\n                    if (isNaN(data[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2};\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (isNaN(data[i]) || isNaN(data2[i])) continue;\\r\\n                    drawData[i]={Value:data[i],Value2:data2[i]};\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.RGB=function(r,g,b)\\r\\n    {\\r\\n        var rgb=`RGB(${r},${g},${b})`;\\r\\n        return rgb;\\r\\n    }\\r\\n\\r\\n    this.RGBA=function(r,g,b,a)\\r\\n    {\\r\\n        var rgba=`RGB(${r},${g},${b},${a})`;\\r\\n        return rgba;\\r\\n    }\\r\\n\\r\\n    //用法:PARTLINE(PRICE,COND1,COLOR1,COND2,COLOR2...),\\r\\n    //绘制PRICE线,当COND1条件满足时,用COLOR1颜色,当COND2条件满足时,用COLOR2颜色,否则不绘制,从COLOR1之后的参数均可以省略,最多可以有10组条件\\r\\n    //例如:PARTLINE(CLOSE,CLOSE>OPEN,RGB(255,0,0),CLOSE<OPEN,RGB(0,255,0),1,RGB(0,0,255))\\r\\n    //表示画收盘价线,阳线时用红色,阴线时用绿色,平盘用蓝色.注意最后一个条件为1,表示前面都不满足时必然满足这个条件\\r\\n    this.PARTLINE=function(args)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'PARTLINE'};\\r\\n        if (args.length<3) return result;\\r\\n\\r\\n        var data=args[0];\\r\\n        var condition=[];\\r\\n        for(var i=1;i<args.length && i+1<args.length;i+=2)\\r\\n        {\\r\\n            condition.push({Cond:args[i], RGB:args[i+1]});\\r\\n        }\\r\\n\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var drawItem={Value:null, RGB:null};\\r\\n            drawData[i]=drawItem;\\r\\n\\r\\n            var value=data[i];\\r\\n            if (!this.IsNumber(value)) continue;\\r\\n\\r\\n            var rgb=null;\\r\\n            for(var j in condition)\\r\\n            {\\r\\n                var item=condition[j];\\r\\n                if (Array.isArray(item.Cond))\\r\\n                {\\r\\n                    if (i<item.Cond.length && item.Cond[i])\\r\\n                    {\\r\\n                        rgb=item.RGB;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(item.Cond) && item.Cond)  //单数值条件\\r\\n                    {\\r\\n                        rgb=item.RGB;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (rgb)\\r\\n            {\\r\\n                drawItem.Value=value;\\r\\n                drawItem.RGB=rgb;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //函数:FILLRGN,根据条件用RGN颜色填充区域\\r\\n    //用法：FILLRGN(PRICE1,PRICE2,COND1,COLOR1,COND2,COLOR2...),填充PRICE1到PRICE2之间的区域，当COND1条件满足时,用COLOR1颜色，当COND2条件满足时,用COLOR2颜色，否则不填充，从COLOR1之后的参数均可以省略，最多可以有15组条件。\\r\\n    //例如：FILLRGN(CLOSE,OPEN,CLOSE>OPEN,RGB(255,0,0),CLOSE<OPEN,RGB(0,255,0))表示填充开盘价和收盘价之间的区域，阳线时用红色，阴线时用绿色，平盘不绘制。\\r\\n    this.FILLRGN2=function(args)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'FILLRGN2'};\\r\\n        if (args.length<4) return result;\\r\\n\\r\\n\\r\\n        var price=args[0];\\r\\n        var price2=args[1];\\r\\n        var condition=[];\\r\\n        for(var i=2;i<args.length && i+1<args.length;i+=2)\\r\\n        {\\r\\n            condition.push({Cond:args[i], Color:args[i+1]});\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n\\r\\n            var drawItem={ Value:null, Value2:null, Color:null };\\r\\n\\r\\n            for(var j in condition)\\r\\n            {\\r\\n                var item=condition[j];\\r\\n                if (Array.isArray(item.Cond))\\r\\n                {\\r\\n                    if (i<item.Cond.length && item.Cond[i])\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(item.Cond) && item.Cond)  //单数值条件\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!drawItem.Color) continue;\\r\\n\\r\\n            if (Array.isArray(price))\\r\\n            {\\r\\n                if (i>=price.length) continue;\\r\\n                if (!this.IsNumber(price[i])) continue;\\r\\n                drawItem.Value=price[i];\\r\\n            }\\r\\n            else if (this.IsNumber(price))\\r\\n            {\\r\\n                drawItem.Value=price;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (Array.isArray(price2))\\r\\n            {\\r\\n                if (i>=price2.length) continue;\\r\\n                if (!this.IsNumber(price2[i])) continue;\\r\\n                drawItem.Value2=price2[i];\\r\\n            }\\r\\n            else if　(this.IsNumber(price2))\\r\\n            {\\r\\n                drawItem.Value2=price2;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            drawData[i]=drawItem;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //用法:FLOATRGN(PRICE,WIDTH,COND1,COLOR1,COND2,COLOR2...),以PRICE为基础填充宽度为WIDTH像素的区域,WIDTH为负则向下填充,当COND1条件满足时,用COLOR1颜色,当COND2条件满足时,用COLOR2颜色,否则不填充,从COND1之后的参数均可以省略,最多可以有10组条件\\r\\n    //例如:FLOATRGN(CLOSE,VOL/HHV(VOL,10)*15,CLOSE>OPEN,RGB(255,0,0),1,RGB(0,255,0))表示沿收盘价填充宽度为成交量的区域,区域最大宽度为15像素,阳线时用红色,阴线时用绿色。\\r\\n    this.FLOATRGN=function(args)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:'FLOATRGN'};\\r\\n        if (args.length<4) return result;\\r\\n\\r\\n        var price=args[0];\\r\\n        var width=args[1];\\r\\n        var condition=[];\\r\\n        for(var i=2;i<args.length && i+1<args.length;i+=2)\\r\\n        {\\r\\n            condition.push({Cond:args[i], Color:args[i+1]});\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n\\r\\n            var drawItem={ Value:null, Value2:null, Color:null };\\r\\n\\r\\n            for(var j in condition)\\r\\n            {\\r\\n                var item=condition[j];\\r\\n                if (Array.isArray(item.Cond))\\r\\n                {\\r\\n                    if (i<item.Cond.length && item.Cond[i])\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(item.Cond) && item.Cond)  //单数值条件\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!drawItem.Color) continue;\\r\\n\\r\\n            if (Array.isArray(price))\\r\\n            {\\r\\n                if (i>=price.length) continue;\\r\\n                if (!this.IsNumber(price[i])) continue;\\r\\n                drawItem.Value=price[i];\\r\\n            }\\r\\n            else if (this.IsNumber(price))\\r\\n            {\\r\\n                drawItem.Value=price;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (Array.isArray(width))\\r\\n            {\\r\\n                if (i>=width.length) continue;\\r\\n                if (!this.IsNumber(width[i])) continue;\\r\\n                drawItem.Value2=width[i];\\r\\n            }\\r\\n            else if　(this.IsNumber(width))\\r\\n            {\\r\\n                drawItem.Value2=width;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            drawData[i]=drawItem;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //函数:FILLTOPRGN / FILLBOTTOMRGN 根据条件填充顶部或底部区域\\r\\n    //用法 FILLTOPRGN(PRICE, COND1, COLOR, COND2, COLOR2)\\r\\n    this.FILLBGRGN=function(type,args)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:(type==1 ?'FILLTOPRGN':\\\"FILLBOTTOMRGN\\\")};\\r\\n        if (args.length<3) return result;\\r\\n\\r\\n        var price=args[0];\\r\\n        var condition=[];\\r\\n        for(var i=1;i<args.length && i+1<args.length;i+=2)\\r\\n        {\\r\\n            condition.push({Cond:args[i], Color:args[i+1]});\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n            var drawItem={ Value:null, Color:null };\\r\\n\\r\\n            for(var j in condition)\\r\\n            {\\r\\n                var item=condition[j];\\r\\n                if (Array.isArray(item.Cond))\\r\\n                {\\r\\n                    if (i<item.Cond.length && item.Cond[i])\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(item.Cond) && item.Cond)  //单数值条件\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!drawItem.Color) continue;\\r\\n\\r\\n            if (Array.isArray(price))\\r\\n            {\\r\\n                if (i>=price.length) continue;\\r\\n                if (!this.IsNumber(price[i])) continue;\\r\\n                drawItem.Value=price[i];\\r\\n            }\\r\\n            else if (this.IsNumber(price))\\r\\n            {\\r\\n                drawItem.Value=price;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            drawData[i]=drawItem;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //函数:FILLVERTICALRGN 根据条件填充顶部到底部区域\\r\\n    //用法 FILLVERTICALRGN(COND1, COLOR, COND2, COLOR2)\\r\\n    this.FILLVERTICALRGN=function(args)\\r\\n    {\\r\\n        let drawData=[];\\r\\n        let result={DrawData:drawData, DrawType:\\\"FILLVERTICALRGN\\\"};\\r\\n        if (args.length<2) return result;\\r\\n\\r\\n        var condition=[];\\r\\n        for(var i=0;i<args.length && i+1<args.length;i+=2)\\r\\n        {\\r\\n            condition.push({Cond:args[i], Color:args[i+1]});\\r\\n        }\\r\\n\\r\\n        for(var i=0;i<this.SymbolData.Data.Data.length;++i)\\r\\n        {\\r\\n            drawData[i]=null;\\r\\n            var drawItem={ Color:null };\\r\\n\\r\\n            for(var j in condition)\\r\\n            {\\r\\n                var item=condition[j];\\r\\n                if (Array.isArray(item.Cond))\\r\\n                {\\r\\n                    if (i<item.Cond.length && item.Cond[i])\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.IsNumber(item.Cond) && item.Cond)  //单数值条件\\r\\n                    {\\r\\n                        drawItem.Color=item.Color;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!drawItem.Color) continue;\\r\\n\\r\\n            drawData[i]=drawItem;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //填充背景.\\r\\n    //用法: DRAWGBK(COND,COLOR1,COLOR2,colorAngle)  colorAngle=渐近色角度\\r\\n    //例如: DRAWGBK(O>C,RGB(0,255,0),RGB(255,0,0),0);\\r\\n    this.DRAWGBK=function(condition, color, color2, colorAngle)\\r\\n    {\\r\\n        let drawData={ Color:[],  Angle:colorAngle };\\r\\n        if (color) drawData.Color.push(color);\\r\\n        if (color2) drawData.Color.push(color2);\\r\\n\\r\\n        let result={DrawData:null, DrawType:'DRAWGBK'};\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                var item=condition[i];\\r\\n                if (item)\\r\\n                {\\r\\n                    result.DrawData=drawData;\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (condition) result.DrawData=drawData;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.DRAWGBK2=function(condition, color, color2, colorAngle)\\r\\n    {\\r\\n        let drawData={ Color:[],  Angle:colorAngle };\\r\\n        if (color) drawData.Color.push(color);\\r\\n        if (color2) drawData.Color.push(color2);\\r\\n\\r\\n        let result={DrawData:null, DrawType:'DRAWGBK2'};\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            drawData.Data=[];\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                var item=condition[i];\\r\\n                drawData.Data[i]=item ? 1:0;\\r\\n            }\\r\\n\\r\\n            result.DrawData=drawData;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (condition)\\r\\n            {\\r\\n                result.DrawData=drawData;\\r\\n                result.DrawType=\\\"DRAWGBK\\\";\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //画文字 及线段\\r\\n    this.DRAWTEXT_LINE=function(condition, price, text, textcolor, fontSize, linetype, linecolor)\\r\\n    {\\r\\n        let drawData={ Text:{ Title:text, Color:textcolor }, Line:{ Type:linetype, Color:linecolor } };\\r\\n        if (fontSize<=0) fontSize=12;\\r\\n        drawData.Text.Font=fontSize*GetDevicePixelRatio()+'px 微软雅黑';\\r\\n\\r\\n        let result={DrawData:null, DrawType:'DRAWTEXT_LINE'};\\r\\n\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                var item=condition[i];\\r\\n                if (item)\\r\\n                {\\r\\n                    if (Array.isArray(price)) drawData.Price=price[i];\\r\\n                    else drawData.Price=price;\\r\\n                    result.DrawData=drawData;\\r\\n\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (condition)\\r\\n            {\\r\\n                if (Array.isArray(price)) drawData.Price=price[0];\\r\\n                else drawData.Price=price;\\r\\n                result.DrawData=drawData;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    // 相对位置上画矩形.\\r\\n    //用法: DRAWRECTREL(LEFT,TOP,RIGHT,BOTTOM,COLOR),以图形窗口(LEFT,TOP)为左上角,(RIGHT,BOTTOM)为右下角绘制矩形,坐标单位是窗口沿水平和垂直方向的1/1000,取值范围是0—999,超出范围则可能显示在图形窗口外,矩形中间填充颜色COLOR,COLOR为0表示不填充.\\r\\n    //例如: DRAWRECTREL(0,0,500,500,RGB(255,255,0))表示在图形最左上部1/4位置用黄色绘制矩形\\r\\n    this.DRAWRECTREL=function(left, top, right,bottom, color)\\r\\n    {\\r\\n\\r\\n        let drawData={ Rect:{Left:Math.min(left,right), Top:Math.min(top,bottom), Right:Math.max(right,left), Bottom:Math.max(bottom,top) }, Color:color };\\r\\n        if (color==0) drawData.Color=null;\\r\\n        let result={DrawData:drawData, DrawType:'DRAWRECTREL'};\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //DRAWTEXTREL(X,Y,TEXT),在图形窗口(X,Y)坐标位置书写文字TEXT，坐标单位是窗口沿水平和垂直方向的1/1000，X、Y取值范围是0—999,超出范围则可能显示在图形窗口外。\\r\\n    //例如：DRAWTEXTREL(500,500,'注意')表示在图形中间位置显示'注意'字样。\\r\\n    this.DRAWTEXTREL=function(x, y, text)\\r\\n    {\\r\\n        let drawData={ Point:{X:x, Y:y} };\\r\\n        if (IFrameSplitOperator.IsString(text))\\r\\n            drawData.Text=text;\\r\\n        else if (IFrameSplitOperator.IsNonEmptyArray(text))\\r\\n            drawData.Text=text[0];\\r\\n\\r\\n        let result={DrawData:drawData, DrawType:'DRAWTEXTREL'};\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //DRAWTEXTABS(X,Y,TEXT),在图形窗口(X,Y)坐标位置书写文字TEXT，坐标单位是像素,图形窗口左上角坐标为(0,0)。\\r\\n    //例如：DRAWTEXTABS(0,0,'注意')表示在图形最左上角位置显示'注意'字样。\\r\\n    this.DRAWTEXTABS=function(x, y, text)\\r\\n    {\\r\\n        let drawData={ Point:{X:x, Y:y} };\\r\\n        if (IFrameSplitOperator.IsString(text))\\r\\n            drawData.Text=text;\\r\\n        else if (IFrameSplitOperator.IsNonEmptyArray(text))\\r\\n            drawData.Text=text[0];\\r\\n\\r\\n        let result={DrawData:drawData, DrawType:'DRAWTEXTABS'};\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //画百分比叠加线\\r\\n    this.DRAWOVERLAYLINE=function(data, mainData, title)\\r\\n    {\\r\\n        let drawData={ Data:data, MainData:mainData };\\r\\n        if (title && typeof(title)=='string') drawData.Title=title;\\r\\n        let result={ DrawData:drawData, DrawType:'DRAWOVERLAYLINE' };\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //绘制斜线.\\r\\n    //用法:DRAWSL(COND,PRICE,SLOPE,LEN,DIRECT),当COND条件满足时,在PRICE位置画斜线,SLOPE为斜率,LEN为长度,DIRECT为0向右延伸,1向左延伸,2双向延伸.\\r\\n    //注意:\\r\\n    //1.K线间的纵向高度差为SLOPE;\\r\\n    //2.SLOPE为0时,为水平线;\\r\\n    //3.SLOPE为10000时,为垂直线,LEN为向上的像素高度,DIRECT表示向上或向下延伸;\\r\\n    //4.SLOPE和LEN支持变量;\\r\\n    this.DRAWSL=function(condition, data, slope, len, direct)\\r\\n    {\\r\\n        let drawData={ Data:[], Option:[] };\\r\\n        let result={ DrawData:drawData, DrawType:'DRAWSL' };\\r\\n        var isNumber=this.IsNumber(data);\\r\\n\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            for(var i in condition)\\r\\n            {\\r\\n                drawData[i]=null;\\r\\n                if (!condition[i]) continue;\\r\\n\\r\\n                if (isNumber)\\r\\n                {\\r\\n                    drawData.Data[i]=data;\\r\\n                    drawData.Option[i]={Slope:slope, Length:len, Direct:direct };\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (i<data.length && this.IsNumber(data[i]))\\r\\n                    {\\r\\n                        drawData.Data[i]=data[i];\\r\\n                        drawData.Option[i]={Slope:slope, Length:len, Direct:direct };\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (condition)\\r\\n            {\\r\\n                var count=this.SymbolData.Data.Data.length;\\r\\n                for(var i=0; i<count; ++i)\\r\\n                {\\r\\n                    drawData[i]=null;\\r\\n                    if (isNumber)\\r\\n                    {\\r\\n                        drawData.Data[i]=data;\\r\\n                        drawData.Option[i]={Slope:slope, Length:len, Direct:direct };\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        if (i<data.length && this.IsNumber(data[i]))\\r\\n                        {\\r\\n                            drawData.Data[i]= data[i];\\r\\n                            drawData.Option[i]={Slope:slope, Length:len, Direct:direct };\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //含义:在图形上绘制垂直线。\\r\\n    //用法:\\r\\n    //VERTLINE(COND,TYPE),当COND条件满足时,沿垂直方向绘制TYPE类型的线段,TYPE=0表示实线，1表示虚线'---'，2表示点线'...'，3表示点划线'-.-.-'，4表示点点划线'-..-..-'。\\r\\n    //例如：VERTLINE(HIGH>=HHV(HIGH,20),1)表示在创20天新高画垂直虚线。\\r\\n\\r\\n    this.VERTLINE=function(condition, type)\\r\\n    {\\r\\n        let drawData={ Data:[], LineType:type };\\r\\n        let result={ DrawData:drawData, DrawType:'VERTLINE' };\\r\\n        if (Array.isArray(condition))\\r\\n        {\\r\\n            for(var i=0;i<condition.length;++i)\\r\\n            {\\r\\n                var item=condition[i];\\r\\n                if (item) drawData.Data[i]=1;\\r\\n                else drawData.Data[i]=0;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //含义:在图形上绘制水平线。\\r\\n    //用法:\\r\\n    //HORLINE(COND,PRICE,TYPE,EXTEND),当COND条件满足时,在PRICE位置沿水平方向绘制TYPE类型的线段,TYPE=0表示实线，1表示虚线'---'，2表示点线'...'，3表示点划线'-.-.-'，4表示点点划线'-..-..-'。EXTEND=1 表示向左延长，=2表示向右延长，=3表示左右延长。\\r\\n    //例如：HORLINE(HIGH>=HHV(HIGH,20),HIGH,1,2)表示在创20天新高时画水平虚线向右延伸。\\r\\n    this.HORLINE=function(condition, data, type, extend)\\r\\n    {\\r\\n        let drawData={ Data:[], LineType:type, Extend:extend };\\r\\n        let result={ DrawData:drawData, DrawType:'HORLINE' };\\r\\n        if (Array.isArray(condition) && Array.isArray(data))\\r\\n        {\\r\\n            for(var i=0;i<condition.length;++i)\\r\\n            {\\r\\n                var item=condition[i];\\r\\n                drawData.Data[i]=null;\\r\\n                if (!item) continue;\\r\\n                if (i>=data.length) continue;\\r\\n                var value=data[i];\\r\\n                if (IFrameSplitOperator.IsNumber(value)) drawData.Data[i]=value;\\r\\n            }\\r\\n        }\\r\\n        else if (Array.isArray(condition) && IFrameSplitOperator.IsNumber(data))\\r\\n        {\\r\\n            for(var i=0;i<condition.length;++i)\\r\\n            {\\r\\n                var item=condition[i];\\r\\n                drawData.Data[i]=null;\\r\\n                if (!item) continue;\\r\\n                drawData.Data[i]=data;\\r\\n            }\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsNumber(condition) && condition)\\r\\n        {\\r\\n            if (this.SymbolData && this.SymbolData.Data && this.SymbolData.Data.Data)\\r\\n            {\\r\\n                if (Array.isArray(data))\\r\\n                {\\r\\n                    var count=this.SymbolData.Data.Data.length;\\r\\n                    for(var i=0; i<count; ++i)\\r\\n                    {\\r\\n                        drawData.Data[i]=null;\\r\\n                        if (i>=data.length) continue;\\r\\n                        var value=data[i];\\r\\n                        if (IFrameSplitOperator.IsNumber(value)) drawData.Data[i]=value;\\r\\n                    }\\r\\n                }\\r\\n                else if (IFrameSplitOperator.IsNumber(data))\\r\\n                {\\r\\n                    var count=this.SymbolData.Data.Data.length;\\r\\n                    for(var i=0; i<count; ++i)\\r\\n                    {\\r\\n                        drawData.Data[i]=data;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\nJSDraw.prototype.CalculateDrawLine=function(lineCache)\\r\\n{\\r\\n    lineCache.List=[];\\r\\n    for(let i=lineCache.Start.ID; i<=lineCache.End.ID; ++i) lineCache.List.push(i);\\r\\n\\r\\n    let height=Math.abs(lineCache.Start.Value-lineCache.End.Value);\\r\\n    let width=lineCache.List.length-1;\\r\\n\\r\\n    var result=[];\\r\\n    result.push({ID:lineCache.Start.ID, Value:lineCache.Start.Value});  //第1个点\\r\\n\\r\\n    if (lineCache.Start.Value>lineCache.End.Value)\\r\\n    {\\r\\n        for(let i=1;i<lineCache.List.length-1;++i)\\r\\n        {\\r\\n            var value=height*(lineCache.List.length-1-i)/width+lineCache.End.Value;\\r\\n            result.push({ID:lineCache.List[i], Value:value});\\r\\n        }\\r\\n    }\\r\\n    else\\r\\n    {\\r\\n        for(let i=1;i<lineCache.List.length-1;++i)\\r\\n        {\\r\\n            var value=height*i/width+lineCache.Start.Value;\\r\\n            result.push({ID:lineCache.List[i], Value:value});\\r\\n        }\\r\\n    }\\r\\n\\r\\n    result.push({ID:lineCache.End.ID, Value:lineCache.End.Value});      //最后一个点\\r\\n\\r\\n    return result;\\r\\n}\\r\\n\\r\\n//是否有是有效的数字\\r\\nJSDraw.prototype.IsNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\nJSDraw.prototype.IsDrawFunction=function(name)\\r\\n{\\r\\n    let setFunctionName=new Set(\\r\\n        [\\r\\n            \\\"STICKLINE\\\",\\\"DRAWTEXT\\\",'SUPERDRAWTEXT','DRAWLINE','DRAWBAND','DRAWKLINE','DRAWKLINE_IF','PLOYLINE',\\r\\n            'POLYLINE','DRAWNUMBER',\\\"DRAWNUMBER_FIX\\\",'DRAWICON','DRAWCHANNEL','PARTLINE','DRAWTEXT_FIX','DRAWGBK','DRAWTEXT_LINE','DRAWRECTREL',\\\"DRAWTEXTABS\\\",\\\"DRAWTEXTREL\\\",\\r\\n            'DRAWOVERLAYLINE',\\\"FILLRGN\\\", \\\"FILLRGN2\\\",\\\"FILLTOPRGN\\\", \\\"FILLBOTTOMRGN\\\", \\\"FILLVERTICALRGN\\\",\\\"FLOATRGN\\\",\\\"DRAWSL\\\", \\\"DRAWGBK2\\\",\\r\\n            \\\"VERTLINE\\\",\\\"HORLINE\\\"\\r\\n        ]);\\r\\n    if (setFunctionName.has(name)) return true;\\r\\n\\r\\n    return false;\\r\\n}\\r\\n\\r\\nJSDraw.prototype.RemoveZero = function (strValue)\\r\\n{\\r\\n    while(strValue.length>0)\\r\\n    {\\r\\n        var index=strValue.length-1;\\r\\n        var ch=strValue[index];\\r\\n        if (ch==\\\"0\\\")\\r\\n        {\\r\\n            strValue=strValue.substr(0,index);\\r\\n        }\\r\\n        else if (ch==\\\".\\\")\\r\\n        {\\r\\n            strValue=strValue.substr(0,index);\\r\\n            break;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    return strValue;\\r\\n}\\r\\n\\r\\n//http://www.newone.com.cn/helpcontroller/index?code=zszy_pc\\r\\nvar DYNAINFO_ARGUMENT_ID=\\r\\n    {\\r\\n        YCLOSE:3,\\r\\n        OPEN:4,\\r\\n        HIGH:5,\\r\\n        LOW:6,\\r\\n        CLOSE:7,\\r\\n        VOL:8,\\r\\n        AMOUNT:10,\\r\\n        AMPLITUDE:13,   //振幅\\r\\n        INCREASE:14,    //涨幅\\r\\n        EXCHANGERATE:37,    //换手率\\r\\n    };\\r\\n\\r\\nfunction JSSymbolData(ast,option,jsExecute)\\r\\n{\\r\\n    this.AST=ast;               //语法树\\r\\n    this.Execute=jsExecute;\\r\\n\\r\\n    this.Symbol='600000.sh';\\r\\n    this.Name;\\r\\n    this.Data=null;             //个股数据\\r\\n    this.PeriodData=new Map();  //跨周期数据 {Key=period, value=[histroydata]}\\r\\n    this.IsApiPeriod=false;     //是否是后台api周期数据\\r\\n    this.SourceData=null;       //不复权的个股数据\\r\\n    this.MarketValue=null;      //总市值\\r\\n    this.Period=0;              //周期\\r\\n    this.Right=0;               //复权\\r\\n    this.DataType=0;            //默认K线数据 2=分钟走势图数据 3=多日分钟走势图\\r\\n    this.IsBeforeData=false;    //当日走势图数据是否包含开盘前数据\\r\\n    this.DayCount;              //多日分时图天数\\r\\n    this.Arguments=[];          //指标参数\\r\\n\\r\\n    this.KLineApiUrl= g_JSComplierResource.Domain+\\\"/API/KLine2\\\";                   //日线\\r\\n    this.MinuteKLineApiUrl= g_JSComplierResource.Domain+'/API/KLine3';             //分钟K线\\r\\n    this.RealtimeApiUrl= g_JSComplierResource.Domain+'/API/stock';                 //实时行情\\r\\n    this.HistoryMinuteApiUrl=g_JSChartResource.Domain+'/API/StockMinuteData';      //历史分钟数据(多日分时图)\\r\\n    this.StockHistoryDayApiUrl= g_JSComplierResource.Domain+'/API/StockHistoryDay';    //历史财务数据\\r\\n    this.StockHistoryDay3ApiUrl= g_JSComplierResource.Domain+'/API/StockHistoryDay3';  //历史财务数据\\r\\n    this.StockHistoryDay2ApiUrl= g_JSComplierResource.Domain+'/API/StockHistoryDay2';  //历史财务数据\\r\\n    this.StockNewsAnalysisApiUrl= g_JSComplierResource.CacheDomain+'/cache/newsanalyze';                //新闻分析数据\\r\\n    this.HKToSHSZApiUrl=    //北上资金 !!顺序不要变 后面都是写死的\\r\\n        [\\r\\n            g_JSComplierResource.CacheDomain+'/cache/historyday/all/hk2shsz.json',      //日线数据\\r\\n            g_JSComplierResource.CacheDomain+'/cache/analyze/hk2shsz/hk2shsz.json',     //最新分钟\\r\\n            g_JSComplierResource.Domain+'/API/HKToSHSZMinuteData',                      //多日分时分钟\\r\\n            g_JSComplierResource.CacheDomain+'/cache/analyze/hk2szshanalyze'            //个股的北上\\r\\n        ] ;\\r\\n\\r\\n    this.MaxRequestDataCount=1000;\\r\\n    this.MaxRequestMinuteDayCount=5;\\r\\n    this.KLineDateTimeRange;        //请求的K线日期范围\\r\\n\\r\\n    this.LatestData=new Map();  //最新行情 key=id value=数据\\r\\n    this.IndexData;             //大盘指数\\r\\n    this.LatestIndexData;       //最新大盘数据\\r\\n    this.MarginData=new Map();  //融资融券\\r\\n    this.HKToSHSZData=new Map();    //北上资金\\r\\n    this.NewsAnalysisData=new Map();    //新闻统计\\r\\n    this.ExtendData=new Map();          //其他的扩展数据\\r\\n    this.UserData=new Map();            //用户数据\\r\\n    this.CustomAPIData=new Map();       //自定义API数据\\r\\n    this.ScriptIndexOutData=new Map();  //调用脚本执行返回的数据\\r\\n    this.OtherSymbolData=new Map();     //其他股票信息 key=symbol value=[historydata]\\r\\n\\r\\n    //股票数据缓存 key=函数名(参数)  { Data: value=拟合的数据 , Error: }\\r\\n    //FinValue(id)\\r\\n    this.StockData=new Map();\\r\\n\\r\\n    this.SectionFinanceData=new Map();  //截面报告数据\\r\\n    this.ThrowSFPeirod=new Set();       //重新获取数据\\r\\n\\r\\n    this.NetworkFilter;                 //网络请求回调 function(data, callback);\\r\\n\\r\\n\\r\\n\\r\\n    //使用option初始化\\r\\n    if (option)\\r\\n    {\\r\\n        if (option.HQDataType) this.DataType=option.HQDataType;\\r\\n        if (option.Data)\\r\\n        {\\r\\n            this.Data=option.Data;\\r\\n            if (this.DataType!=HQ_DATA_TYPE.MINUTE_ID && this.DataType!=HQ_DATA_TYPE.MULTIDAY_MINUTE_ID && this.DataType!=HQ_DATA_TYPE.HISTORY_MINUTE_ID)   //分钟走势图数据 没有周期和复权\\r\\n            {\\r\\n                this.Period=option.Data.Period; //周期\\r\\n                this.Right=option.Data.Right;   //复权\\r\\n            }\\r\\n            //this.Data=null;\\r\\n        }\\r\\n\\r\\n        if (option.SourceData) this.SourceData=option.SourceData;\\r\\n        if (option.Symbol) this.Symbol=option.Symbol;\\r\\n        if (option.Name) this.Name=option.Name;\\r\\n        if (option.MaxRequestDataCount>0) this.MaxRequestDataCount=option.MaxRequestDataCount;\\r\\n        if (option.MaxRequestMinuteDayCount>0) this.MaxRequestMinuteDayCount=option.MaxRequestMinuteDayCount;\\r\\n        if (option.KLineApiUrl) this.KLineApiUrl=option.KLineApiUrl;\\r\\n        if (option.Right) this.Right=option.Right;\\r\\n        if (option.Period) this.Period=option.Period;\\r\\n        if (option.IsBeforeData===true) this.IsBeforeData=option.IsBeforeData;\\r\\n        if (option.NetworkFilter) this.NetworkFilter=option.NetworkFilter;\\r\\n        if (option.DayCount>0) this.DayCount=option.DayCount;\\r\\n        if (option.Arguments) this.Arguments=option.Arguments;\\r\\n        if (option.KLineRange) this.KLineDateTimeRange=option.KLineRange;\\r\\n        if (option.IsApiPeriod) this.IsApiPeriod=option.IsApiPeriod;\\r\\n    }\\r\\n\\r\\n    this.RecvError=function(request)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvError] ajax error.',request.status);\\r\\n        throw {FunctionName:'RecvError', Request:request};\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetLatestDataKey=function(key)\\r\\n    {\\r\\n        var key=`DYNAINFO-${key}`;\\r\\n        return key;\\r\\n    }\\r\\n\\r\\n    //最新行情\\r\\n    this.GetLatestData=function(jobItem)\\r\\n    {\\r\\n        var aryArgs=this.JobArgumentsToArray(jobItem, 1);\\r\\n        var lID=aryArgs[0];\\r\\n        var key=this.GetLatestDataKey(lID);\\r\\n\\r\\n        if (this.LatestData.has(key)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetLatestData', //类名::\\r\\n                    Explain:'DYNAINFO()',\\r\\n                    Args:aryArgs,\\r\\n                    Request:{ Url:self.RealtimeApiUrl,  Type:'POST' ,\\r\\n                        Data: { symbol:[this.Symbol], field: [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"time\\\",\\\"increase\\\",\\\"exchangerate\\\",\\\"amplitude\\\"] } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvLatestData(data);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.RealtimeApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"time\\\",\\\"increase\\\",\\\"exchangerate\\\",\\\"amplitude\\\"],\\r\\n                    \\\"symbol\\\": [this.Symbol]\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvLatestData(recvData);\\r\\n                self.Execute.RunNextJob();\\r\\n            },\\r\\n            error: function(request)\\r\\n            {\\r\\n                self.RecvError(request);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvLatestData=function(data)\\r\\n    {\\r\\n        if (data.ver==2.0)\\r\\n        {\\r\\n            this.RecvLatestDataVer2(data);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n\\r\\n        let stock=data.stock[0];\\r\\n        if (!stock) return;\\r\\n\\r\\n        if (IFrameSplitOperator.IsNumber(stock.yclose)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.YCLOSE,stock.yclose);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.open)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.OPEN,stock.open);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.high)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.HIGH,stock.high);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.low)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.LOW,stock.low);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.price)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.CLOSE,stock.price);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.vol)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.VOL,stock.vol);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.amount)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.AMOUNT,stock.amount);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.increase)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.INCREASE,stock.increase);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.exchangerate)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.EXCHANGERATE,stock.exchangerate);\\r\\n        if (IFrameSplitOperator.IsNumber(stock.amplitude)) this.LatestData.set(DYNAINFO_ARGUMENT_ID.AMPLITUDE,stock.amplitude);\\r\\n\\r\\n        /*\\r\\n        this.LatestData={ Symbol:stock.symbol, Name:stock.name, Date:stock.date, Time:stock.time,\\r\\n            YClose:stock.yclose,Price:stock.price, Open:stock.open, High:stock.high, Low:stock.low, Vol:stock.vol, Amount:stock.amount,\\r\\n            Increase:stock.increase, Exchangerate:stock.exchangerate, Amplitude:stock.amplitude};\\r\\n        */\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvLatestData] symbol, LatestData', stock.symbol, this.LatestData);\\r\\n    }\\r\\n\\r\\n    //data:[{ id:, value: }]\\r\\n    this.RecvLatestDataVer2=function(data)\\r\\n    {\\r\\n        if (!IFrameSplitOperator.IsNonEmptyArray(data.data)) return;\\r\\n\\r\\n        var symbol=data.symbol;\\r\\n        for(var i=0;i<data.data.length;++i)\\r\\n        {\\r\\n            var item=data.data[i];\\r\\n            if (!item) continue;\\r\\n            if (!IFrameSplitOperator.IsNumber(item.id)) continue;\\r\\n            if (IFrameSplitOperator.IsNumber(item.value) || IFrameSplitOperator.IsString(item.value))\\r\\n            {\\r\\n                JSConsole.Complier.Log(`[JSSymbolData::RecvLatestDataVer2] symbol=${symbol} DYNAINFO(${item.id})=${item.value}.`);\\r\\n                this.LatestData.set(item.id, item.value);\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvLatestDataVer2]', this.LatestData);\\r\\n    }\\r\\n\\r\\n    this.GetLatestCacheData=function(dataname)\\r\\n    {\\r\\n        if (this.LatestData.has(dataname)) return this.LatestData.get(dataname);\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.GetLatestIndexData=function()\\r\\n    {\\r\\n        if (this.LatestIndexData) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetLatestIndexData', //类名:: 函数\\r\\n                    Explain:'最新大盘数据',\\r\\n                    Request:{ Url:self.RealtimeApiUrl,  Type:'POST' ,\\r\\n                        Data: { symbol:['000001.sh'], field: [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"time\\\",\\\"increase\\\",\\\"amplitude\\\"] } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvLatestIndexData(data);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.RealtimeApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"time\\\",\\\"increase\\\",\\\"amplitude\\\"],\\r\\n                    \\\"symbol\\\": ['000001.sh']\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvLatestIndexData(recvData);\\r\\n                self.Execute.RunNextJob();\\r\\n            },\\r\\n            error: function(request)\\r\\n            {\\r\\n                self.RecvError(request);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvLatestIndexData=function(data)\\r\\n    {\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n\\r\\n        let stock=data.stock[0];\\r\\n        this.LatestIndexData={ Symbol:stock.symbol, Name:stock.name, Date:stock.date, Time:stock.time,\\r\\n            YClose:stock.yclose,Price:stock.price, Open:stock.open, High:stock.high, Low:stock.low, Vol:stock.vol, Amount:stock.amount,\\r\\n            Increase:stock.increase, Amplitude:stock.amplitude};\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvLatestIndexData]', this.LatestIndexData);\\r\\n    }\\r\\n\\r\\n    this.GetLatestIndexCacheData=function(dataname)\\r\\n    {\\r\\n        if (!this.LatestIndexData) return  null;\\r\\n\\r\\n        switch(dataname)\\r\\n        {\\r\\n            case 'FROMOPEN':\\r\\n            {\\r\\n                var value=parseInt(this.LatestIndexData.Time/100);\\r\\n                var time=parseInt(value/100)*60+(value%100);    //转化为分钟个数\\r\\n                var index=0;\\r\\n                if(time <= 9 * 60 + 25) index=0;\\r\\n                else if(time < 9 * 60 + 30) index=1;\\r\\n                else if(time <= 11 * 60 + 30) index=(time - (9 * 60 + 30) + 1);\\r\\n                else if(time < 13 * 60) index=121;\\r\\n                else if(time <= 15 * 60) index=(122 + time - 13 * 60);\\r\\n                else index=242;\\r\\n                return index;\\r\\n            }\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetVolRateData=function(job,node)\\r\\n    {\\r\\n        var volrKey=job.ID.toString()+'-VolRate-'+this.Symbol;\\r\\n        if (this.ExtendData.has(volrKey)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.RealtimeApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"avgvol5\\\", 'date'],\\r\\n                    \\\"symbol\\\": [this.Symbol]\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvVolRateData(recvData,volrKey);\\r\\n                self.Execute.RunNextJob();\\r\\n            },\\r\\n            error: function(request)\\r\\n            {\\r\\n                self.RecvError(request);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvVolRateData=function(data,key)\\r\\n    {\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n        var avgVol5=data.stock[0].avgvol5;\\r\\n        var date=data.stock[0].date;\\r\\n        var item={AvgVol5:avgVol5, Date:date};\\r\\n        this.ExtendData.set(key,item);\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvVolRateData]', item);\\r\\n    }\\r\\n\\r\\n    this.GetVolRateCacheData=function(node)\\r\\n    {\\r\\n        var key=JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VOLR_DATA.toString()+'-VolRate-'+this.Symbol;\\r\\n        if (!key || !this.ExtendData.has(key)) this.Execute.ThrowUnexpectedNode(node,'不支持VOLR');\\r\\n\\r\\n        var result=[];\\r\\n        var value=this.ExtendData.get(key);\\r\\n        var avgVol5=value.AvgVol5/241;\\r\\n        var totalVol=0;\\r\\n        //5日成交总量只取了最新一天的,历史的暂时没有取,所以数据计算的时候只计算最新的一天, 其他都空\\r\\n        for(var i=0, j=0;i<this.Data.Data.length;++i)\\r\\n        {\\r\\n            result[i]=null;\\r\\n            var item=this.Data.Data[i];\\r\\n            var dateTime=item.DateTime; //日期加时间\\r\\n            if (!dateTime) continue;\\r\\n            var aryValue=dateTime.split(' ');\\r\\n            if (aryValue.length!=2) continue;\\r\\n            var date=parseInt(aryValue[0]);\\r\\n            if (date!=value.Date) continue;\\r\\n\\r\\n            totalVol+=item.Vol;\\r\\n            if (avgVol5>0) result[i]=totalVol/(j+1)/avgVol5*100;\\r\\n            ++j;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //获取大盘指数数据\\r\\n    this.GetIndexData=function()\\r\\n    {\\r\\n        if (this.IndexData) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))     //请求日线数据 9=季线\\r\\n        {\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var dateRange=this.Data.GetDateRange();\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'JSSymbolData::GetIndexData', //类名::\\r\\n                        Explain:'大盘数据',\\r\\n                        Period:self.Period,\\r\\n                        Request:\\r\\n                            {\\r\\n                                Url:self.KLineApiUrl,  Type:'POST' ,\\r\\n                                Data:\\r\\n                                    {\\r\\n                                        field:[ \\\"name\\\", \\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",'up','down','stop','unchanged'],\\r\\n                                        indexSymbol:\\\"000001.sh\\\", symbol: this.Symbol, period:this.Period,\\r\\n                                        dateRange:dateRange\\r\\n                                    }\\r\\n                            },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    self.RecvIndexHistroyData(data);\\r\\n                    self.Execute.RunNextJob();\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.KLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [ \\\"name\\\", \\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",'up','down','stop','unchanged'],\\r\\n                        \\\"symbol\\\": '000001.sh',\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestDataCount+500   //多请求2年的数据 确保股票剔除停牌日期以后可以对上\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvIndexHistroyData(recvData);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else  if (ChartData.IsMinutePeriod(this.Period, true))          //请求分钟数据\\r\\n        {\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var dateRange=this.Data.GetDateRange();\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'JSSymbolData::GetIndexData', //类名::\\r\\n                        Explain:'大盘数据',\\r\\n                        Period:self.Period,\\r\\n                        Request:{ Url:self.MinuteKLineApiUrl,  Type:'POST' ,\\r\\n                            Data:\\r\\n                                {\\r\\n                                    field:[\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                                    indexSymbol:\\\"000001.sh\\\", symbol: this.Symbol, period:this.Period,\\r\\n                                    dateRange:dateRange\\r\\n                                }\\r\\n                        },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    self.RecvIndexMinuteHistroyData(data);\\r\\n                    self.Execute.RunNextJob();\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.MinuteKLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": '000001.sh',\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestMinuteDayCount+5\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvIndexMinuteHistroyData(data);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.RecvIndexHistroyData=function(data)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvIndexHistroyData] recv data' , data);\\r\\n\\r\\n        let hisData=this.JsonDataToHistoryData(data);\\r\\n        this.IndexData=new ChartData();\\r\\n        this.IndexData.DataType=0; /*日线数据 */\\r\\n        this.IndexData.Data=hisData;\\r\\n\\r\\n        if (this.IsApiPeriod==true)\\r\\n        {\\r\\n            this.IndexData.Period=this.Period;\\r\\n            this.IndexData.Data=this.Data.FixKData(hisData,this.Period);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var aryOverlayData=this.SourceData.GetOverlayData(this.IndexData.Data);      //和主图数据拟合以后的数据\\r\\n            this.IndexData.Data=aryOverlayData;\\r\\n\\r\\n            if (ChartData.IsDayPeriod(this.Period,false))   //周期数据\\r\\n            {\\r\\n                let periodData=this.IndexData.GetPeriodData(this.Period);\\r\\n                this.IndexData.Data=periodData;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvIndexMinuteHistroyData=function(data)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvIndexMinuteHistroyData] recv data' , data);\\r\\n\\r\\n        let hisData=this.JsonDataToMinuteHistoryData(data);\\r\\n        this.IndexData=new ChartData();\\r\\n        this.IndexData.DataType=1; /*分钟线数据 */\\r\\n        this.IndexData.Data=hisData;\\r\\n\\r\\n        if (this.IsApiPeriod==true)\\r\\n        {\\r\\n            this.IndexData.Period=this.Period;\\r\\n            this.IndexData.Data=this.Data.FixKData(hisData,this.Period);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (ChartData.IsMinutePeriod(this.Period,false))   //周期数据\\r\\n            {\\r\\n                let periodData=this.IndexData.GetPeriodData(this.Period);\\r\\n                this.IndexData.Data=periodData;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetOtherSymbolParam=function(name)\\r\\n    {\\r\\n        var args=name.split(\\\"$\\\");\\r\\n        var setStockDataName=new Set(['CLOSE',\\\"C\\\",'VOL','V','OPEN','O','HIGH','H','LOW','L','AMOUNT','AMO','VOLINSTK']);\\r\\n        if (!setStockDataName.has(args[1])) return null;\\r\\n\\r\\n        var symbol=args[0];\\r\\n        if (symbol.length==6)\\r\\n        {\\r\\n            if (symbol[0]==\\\"6\\\" || symbol[0]==\\\"5\\\" || symbol[0]==\\\"8\\\" || symbol[0]==\\\"9\\\")\\r\\n                symbol+=\\\".SH\\\";\\r\\n            else if (symbol[0]=='0' || symbol[0]=='1' || symbol[0]=='2' || symbol[0]=='3')\\r\\n                symbol+='.SZ';\\r\\n        }\\r\\n        else if (symbol.indexOf(\\\"SZ\\\")==0)\\r\\n        {\\r\\n            symbol=symbol.substr(2)+\\\".SZ\\\";\\r\\n        }\\r\\n        else if (symbol.indexOf(\\\"SH\\\")==0)\\r\\n        {\\r\\n            symbol=symbol.substr(2)+\\\".SH\\\";\\r\\n        }\\r\\n        else if (symbol.indexOf(\\\"_\\\")>0)\\r\\n        {\\r\\n            var arySymbol=symbol.split(\\\"_\\\");\\r\\n            symbol=`${arySymbol[1]}.${arySymbol[0]}`;\\r\\n        }\\r\\n        else\\r\\n            return null;\\r\\n\\r\\n        return { Symbol:symbol.toLowerCase(), DataName:args[1] };\\r\\n\\r\\n    }\\r\\n\\r\\n    //获取其他股票数据\\r\\n    this.GetOtherSymbolData=function(job)\\r\\n    {\\r\\n        var symbol=this.Symbol;\\r\\n        if (job.Literal)\\r\\n        {\\r\\n            var args=this.GetOtherSymbolParam(job.Literal.toUpperCase());\\r\\n            if (!args)\\r\\n            {\\r\\n                var token=job.Token;\\r\\n                this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`${job.Literal} Error.`);\\r\\n            }\\r\\n\\r\\n            symbol=args.Symbol;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var args=job.Args;\\r\\n            if (args.length>0)\\r\\n            {\\r\\n                var item=args[0];\\r\\n                if (item.Type==Syntax.Literal)\\r\\n                {\\r\\n                    symbol=item.Value;\\r\\n                }\\r\\n                else if (item.Type==Syntax.Identifier)  //变量 !!只支持默认的变量值\\r\\n                {\\r\\n                    var isFind=false;\\r\\n                    for(var j in this.Arguments)\\r\\n                    {\\r\\n                        const argItem=this.Arguments[j];\\r\\n                        if (argItem.Name==item.Name)\\r\\n                        {\\r\\n                            symbol=argItem.Value;\\r\\n                            isFind=true;\\r\\n                            break;\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    if (!isFind)\\r\\n                    {\\r\\n                        var token=job.Token;\\r\\n                        this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`${job.FunctionName}() Error: can't read ${item.Name}`);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        job.Symbol=symbol.toLowerCase();\\r\\n        if (job.Symbol==this.Symbol) return this.Execute.RunNextJob();\\r\\n        if (this.OtherSymbolData.has(job.Symbol)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        if (this.DataType==HQ_DATA_TYPE.KLINE_ID &&　ChartData.IsDayPeriod(this.Period,true))     //请求日线数据 9=季线\\r\\n        {\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var dateRange=this.Data.GetDateRange();\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'JSSymbolData::GetOtherSymbolData', //类名::函数名\\r\\n                        Explain:'指定个股数据',\\r\\n                        Request:\\r\\n                            {\\r\\n                                Data:\\r\\n                                    {\\r\\n                                        symbol:job.Symbol,\\r\\n                                        right:self.Right,\\r\\n                                        period:self.Period,\\r\\n                                        dateRange:dateRange\\r\\n                                    }\\r\\n                            },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    self.RecvOtherSymbolKData(data,job);\\r\\n                    self.Execute.RunNextJob();\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.KLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [ \\\"name\\\", \\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": job.Symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestDataCount+500   //多请求2年的数据 确保股票剔除停牌日期以后可以对上\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvOtherSymbolKDayData(recvData,job);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else  if (ChartData.IsMinutePeriod(this.Period, true) || this.DataType==HQ_DATA_TYPE.MINUTE_ID || this.DataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)          //请求分钟数据\\r\\n        {\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var dateRange=this.Data.GetDateRange();\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'JSSymbolData::GetOtherSymbolData', //类名::函数名\\r\\n                        Explain:'指定个股数据',\\r\\n                        Request:\\r\\n                            {\\r\\n                                Data:\\r\\n                                    {\\r\\n                                        symbol:job.Symbol,\\r\\n                                        right:self.Right,\\r\\n                                        period:self.Period,\\r\\n                                        dateRange:dateRange\\r\\n                                    }\\r\\n                            },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    self.RecvOtherSymbolKData(data,job);\\r\\n                    self.Execute.RunNextJob();\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.MinuteKLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": job.Symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestMinuteDayCount+5\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvOtherSymbolKMinuteData(data,job);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //第3方数据对接\\r\\n    this.RecvOtherSymbolKData=function(data,job)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvOtherSymbolKDayData2] recv data' , data);\\r\\n\\r\\n        var kData=new ChartData();\\r\\n        var hisData=null;\\r\\n        var period=this.Period;\\r\\n        if (this.DataType==HQ_DATA_TYPE.KLINE_ID && ChartData.IsDayPeriod(this.Period,true))    //日线数据\\r\\n        {\\r\\n            hisData=this.JsonDataToHistoryData(data);\\r\\n            kData.DataType=0;\\r\\n        }\\r\\n        else    //分钟线数据\\r\\n        {\\r\\n            hisData=this.JsonDataToMinuteHistoryData(data);\\r\\n            kData.DataType=1;\\r\\n            //走势图使用1分钟K线模式\\r\\n            if (this.DataType==HQ_DATA_TYPE.MINUTE_ID || this.DataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)\\r\\n                period=4;\\r\\n        }\\r\\n\\r\\n        kData.Period=this.Period;\\r\\n        kData.Right=this.Right;\\r\\n\\r\\n        kData.Data=this.Data.FixKData(hisData,period);\\r\\n        this.OtherSymbolData.set(job.Symbol, kData);\\r\\n    }\\r\\n\\r\\n    this.RecvOtherSymbolKDayData=function(data,job)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvOtherSymbolKDayData] recv data' , data);\\r\\n\\r\\n        let hisData=this.JsonDataToHistoryData(data);\\r\\n        var kData=new ChartData();\\r\\n        kData.DataType=0; //日线数据\\r\\n        kData.Data=hisData;\\r\\n\\r\\n        var aryOverlayData=this.SourceData.GetOverlayData(kData.Data);      //和主图数据拟合以后的数据\\r\\n        kData.Data=aryOverlayData;\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period,false))   //周期数据\\r\\n        {\\r\\n            let periodData=kData.GetPeriodData(this.Period);\\r\\n            kData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        this.OtherSymbolData.set(job.Symbol, kData);\\r\\n    }\\r\\n\\r\\n    this.RecvOtherSymbolKMinuteData=function(data, job)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvOtherSymbolKMinuteData] recv data' , data);\\r\\n\\r\\n        let hisData=this.JsonDataToMinuteHistoryData(data);\\r\\n        var kData=new ChartData();\\r\\n        kData.DataType=1; /*分钟线数据 */\\r\\n        kData.Data=hisData;\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(this.Period,false))   //周期数据\\r\\n        {\\r\\n            let periodData=kData.GetPeriodData(this.Period);\\r\\n            kData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        this.OtherSymbolData.set(job.Symbol, kData);\\r\\n    }\\r\\n\\r\\n    this.GetOtherSymolCacheData=function(obj)\\r\\n    {\\r\\n        var symbol,dataName;\\r\\n        if (obj.FunctionName)\\r\\n        {\\r\\n            dataName=obj.FunctionName;\\r\\n            var args=obj.Args;\\r\\n            if (args.length<=0) return this.GetSymbolCacheData(dataName);\\r\\n            symbol=args[0].toString().toLowerCase();\\r\\n        }\\r\\n        else if (obj.Literal)\\r\\n        {\\r\\n            var args=this.GetOtherSymbolParam(obj.Literal.toUpperCase());\\r\\n            if (!args) return [];\\r\\n            symbol=args.Symbol;\\r\\n            dataName=args.DataName;\\r\\n        }\\r\\n\\r\\n        if (symbol==this.Symbol) return this.GetSymbolCacheData(dataName);\\r\\n        if (!this.OtherSymbolData.has(symbol)) return [];\\r\\n\\r\\n        var kData=this.OtherSymbolData.get(symbol);\\r\\n        var upperSymbol=symbol.toUpperCase();\\r\\n\\r\\n        switch(dataName)\\r\\n        {\\r\\n            case 'CLOSE':\\r\\n            case 'C':\\r\\n                return kData.GetClose();\\r\\n            case 'VOL':\\r\\n            case 'V':\\r\\n                if (MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol))\\r\\n                    return kData.GetVol(100);   //A股的 把股转成手\\r\\n                return kData.GetVol();\\r\\n            case 'OPEN':\\r\\n            case 'O':\\r\\n                return kData.GetOpen();\\r\\n            case 'HIGH':\\r\\n            case 'H':\\r\\n                return kData.GetHigh();\\r\\n            case 'LOW':\\r\\n            case 'L':\\r\\n                return kData.GetLow();\\r\\n            case 'AMOUNT':\\r\\n            case 'AMO':\\r\\n                return kData.GetAmount();\\r\\n            case 'VOLINSTK':\\r\\n                return kData.GetPosition();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //获取大盘指数缓存数据\\r\\n    this.GetIndexCacheData=function(dataName)\\r\\n    {\\r\\n        if (!this.IndexData) return  new Array();\\r\\n\\r\\n        switch(dataName)\\r\\n        {\\r\\n            case 'INDEXA':\\r\\n                return this.IndexData.GetAmount();\\r\\n            case 'INDEXC':\\r\\n                return this.IndexData.GetClose();\\r\\n            case 'INDEXH':\\r\\n                return this.IndexData.GetHigh();\\r\\n            case 'INDEXL':\\r\\n                return this.IndexData.GetLow();\\r\\n            case 'INDEXO':\\r\\n                return this.IndexData.GetOpen();\\r\\n            case 'INDEXV':\\r\\n                return this.IndexData.GetVol();\\r\\n            case 'INDEXADV':\\r\\n                return this.IndexData.GetUp();\\r\\n            case 'INDEXDEC':\\r\\n                return this.IndexData.GetDown();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //指数转成对应的板块\\r\\n    this.GetBlockSymbol=function(symbol)\\r\\n    {\\r\\n        //中文对应板块代码\\r\\n        const BLOCK_CN_NAME_MAP=new Map([ [\\\"沪深A股\\\",\\\"CNA.ci\\\"], [\\\"创业板\\\",\\\"GEM.ci\\\"], [\\\"沪市A股\\\",\\\"SHA.ci\\\"], [\\\"中小板\\\",\\\"SME.ci\\\"], [\\\"深市A股\\\",\\\"SZA.ci\\\"] ]);\\r\\n        if (BLOCK_CN_NAME_MAP.has(symbol)) return BLOCK_CN_NAME_MAP.get(symbol);\\r\\n\\r\\n        if (!symbol) return null;\\r\\n        var blockSymbol=null;\\r\\n        var upperSymbol=symbol.toUpperCase();\\r\\n\\r\\n        if (upperSymbol.indexOf('.SH')>0 || upperSymbol.indexOf('.SZ')>0 )\\r\\n        {\\r\\n            const INDEX_SYMBOL_SET=new Set([\\\"000001.SH\\\", \\\"000003.SH\\\", \\\"000016.SH\\\", \\\"000300.SH\\\", \\\"000905.SH\\\", \\\"399001.SZ\\\", \\\" 399005.SZ\\\", \\\"399006.SZ\\\"]);\\r\\n            if (!INDEX_SYMBOL_SET.has(upperSymbol)) return null;\\r\\n\\r\\n            blockSymbol=symbol.replace('.SH','.sh');\\r\\n            blockSymbol=symbol.replace('.SZ','.sz');\\r\\n        }\\r\\n        else if (symbol.indexOf('.CI')>0)\\r\\n        {\\r\\n            blockSymbol=symbol.replace('.CI','.ci');\\r\\n        }\\r\\n\\r\\n        /*\\r\\n        const SYMBOL_TO_BLOCK_MAP=new Map([\\r\\n            [\\\"000001.SH\\\",\\\"SME.ci\\\"],\\r\\n            [\\\"399001.SZ\\\",\\\"SZA.ci\\\"],[\\\"399001.SZ\\\",\\\" GEM.ci\\\"],[\\\"399005.SZ\\\",\\\"SME.ci\\\"]\\r\\n        ]);\\r\\n\\r\\n        if (SYMBOL_TO_BLOCK_MAP.has(upperSymbol)) return SYMBOL_TO_BLOCK_MAP.get(upperSymbol);\\r\\n\\r\\n        if(upperSymbol.indexOf('.CI')<0) return null;\\r\\n        */\\r\\n\\r\\n        return blockSymbol;\\r\\n    }\\r\\n\\r\\n    //分钟涨幅股票个数统计数据下载\\r\\n    this.GetIndexIncreaseData=function(job)\\r\\n    {\\r\\n        var symbol=null;\\r\\n        if (job.IsSelfSymbol)\\r\\n        {\\r\\n            symbol=this.Symbol;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (!job.Args || job.Args.length<=0)\\r\\n            {\\r\\n                var token=job.Token;\\r\\n                this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`${job.FunctionName} Error: 参数不能为空`);\\r\\n            }\\r\\n            symbol=job.Args[0].Value;\\r\\n        }\\r\\n\\r\\n        var blockSymbol=this.GetBlockSymbol(symbol);\\r\\n        if (!blockSymbol)\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`${job.FunctionName} Error: can't support ${symbol}`);\\r\\n        }\\r\\n\\r\\n        var upKey=job.ID.toString()+'-UpCount-'+blockSymbol;\\r\\n        var downKey=job.ID.toString()+'-DownCount-'+blockSymbol;\\r\\n        if (this.ExtendData.has(upKey) && this.ExtendData.has(downKey)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dataType={Type: this.DataType};\\r\\n            if (this.DataType===HQ_DATA_TYPE.KLINE_ID) dataType.Period=this.Period;\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetIndexIncreaseData', //类名::\\r\\n                    Explain:'涨停家数统计',\\r\\n                    DateRange:dateRange,\\r\\n                    DataType:dataType,\\r\\n                    Request:{ Url:'www.121287.com',  Type:'POST' ,\\r\\n                        Data: { symbol:this.Symbol, blocksymbol:blockSymbol, field: [\\\"up\\\", \\\"down\\\"] } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                if (this.DataType===HQ_DATA_TYPE.KLINE_ID) this.RecvHistoryIncreaseDataV2(data, {UpKey:upKey,DownKey:downKey});\\r\\n                else this.RecvMinuteIncreaseDataV2(data, {UpKey:upKey,DownKey:downKey});\\r\\n\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        if (this.DataType===HQ_DATA_TYPE.MINUTE_ID || this.DataType===HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)  //走势图数据\\r\\n        {\\r\\n            var apiUrl=g_JSComplierResource.CacheDomain+'/cache/analyze/increaseanalyze/'+blockSymbol+'.json';\\r\\n            JSConsole.Complier.Log('[JSSymbolData::GetIndexIncreaseData] minute Get url=' , apiUrl);\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: apiUrl,\\r\\n                type:\\\"get\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvMinuteIncreaseData(data, {UpKey:upKey,DownKey:downKey});\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else if (this.DataType===HQ_DATA_TYPE.KLINE_ID && ChartData.IsDayPeriod(this.Period,true)) //K线图 日线\\r\\n        {\\r\\n            JSConsole.Complier.Log('[JSSymbolData::GetIndexIncreaseData] K day Get url=' , self.KLineApiUrl);\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.KLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"symbol\\\": blockSymbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestDataCount,\\r\\n                        \\\"field\\\":['up', 'down']\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvHistoryIncreaseData(data, {UpKey:upKey,DownKey:downKey});\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.Execute.RunNextJob();\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    //格式{ ver：2.0 data:[{date, time, up, down}, .....]}\\r\\n    this.RecvHistoryIncreaseDataV2=function(data,key)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvHistoryIncreaseData] recv data, key' , data,key);\\r\\n\\r\\n        var upData=[],downData=[];\\r\\n        for(var i in data.data)\\r\\n        {\\r\\n            var item=data.data[i];\\r\\n            let upItem=new SingleData();\\r\\n            let downItem=new SingleData();\\r\\n            var date=item[0];\\r\\n            var time=null;\\r\\n            upItem.Date=date;\\r\\n            downItem.Date=date;\\r\\n            if (ChartData.IsMinutePeriod(this.Period,true) && IFrameSplitOperator.IsNumber(item[1]))\\r\\n            {\\r\\n                time=item[1];\\r\\n                upItem.Time=time;\\r\\n                downItem.Time=time;\\r\\n            }\\r\\n\\r\\n            upItem.Value=item[2];\\r\\n            upData[i]=upItem;\\r\\n\\r\\n            downItem.Value=item[3];\\r\\n            downData[i]=downItem;\\r\\n        }\\r\\n\\r\\n        var upFixedData=this.Data.GetFittingData2(upData,0);\\r\\n        var downFixedData=this.Data.GetFittingData2(downData,0);\\r\\n\\r\\n        this.ExtendData.set(key.UpKey,upFixedData);\\r\\n        this.ExtendData.set(key.DownKey,downFixedData);\\r\\n    }\\r\\n\\r\\n    this.RecvHistoryIncreaseData=function(data,key)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvHistoryIncreaseData] recv data' , data);\\r\\n\\r\\n        var upData=[],downData=[];\\r\\n        for(var i in data.data)\\r\\n        {\\r\\n            var item=data.data[i];\\r\\n            let upItem=new SingleData();\\r\\n            let downItem=new SingleData();\\r\\n            upItem.Date=item[0];\\r\\n            upItem.Value=item[8];\\r\\n            upData[i]=upItem;\\r\\n            downItem.Date=item[0];\\r\\n            downItem.Value=item[9];\\r\\n            downData[i]=downItem;\\r\\n        }\\r\\n\\r\\n        var upFixedData, downFixedData;\\r\\n        if (this.SourceData) upFixedData=this.SourceData.GetFittingData(upData);\\r\\n        else upFixedData=this.Data.GetFittingData(aryData);\\r\\n\\r\\n        if (this.SourceData) downFixedData=this.SourceData.GetFittingData(downData);\\r\\n        else downFixedData=this.Data.GetFittingData(aryData);\\r\\n\\r\\n        this.ExtendData.set(key.UpKey,upFixedData);\\r\\n        this.ExtendData.set(key.DownKey,downFixedData);\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteIncreaseDataV2=function(data, key)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvMinuteIncreaseDataV2] recv data, key' , data, key);\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteIncreaseData=function(data,key)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvMinuteIncreaseData] recv data' , data);\\r\\n        if (!data.minute) return;\\r\\n        var minuteData=data.minute;\\r\\n        if (!minuteData.time || !minuteData.up || !minuteData.down) return;\\r\\n        var upData=[],downData=[];\\r\\n\\r\\n        if (this.IsBeforeData)\\r\\n        {\\r\\n            for(var i=0, j=0;i<this.Data.Data.length;++i)\\r\\n            {\\r\\n                upData[i]=null;\\r\\n                downData[i]=null;\\r\\n                var item=this.Data.Data[i];\\r\\n                if (item.Before) continue;  //盘前数据\\r\\n                var dateTime=item.DateTime; //日期加时间\\r\\n                if (!dateTime) continue;\\r\\n                var aryValue=dateTime.split(' ');\\r\\n                if (aryValue.length!=2) continue;\\r\\n                var date=parseInt(aryValue[0]);\\r\\n                if (date!=data.date) continue;\\r\\n\\r\\n                upData[i]=minuteData.up[j];\\r\\n                downData[i]=minuteData.down[j];\\r\\n                ++j;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0, j=0;i<this.Data.Data.length;++i)\\r\\n            {\\r\\n                upData[i]=null;\\r\\n                downData[i]=null;\\r\\n                var item=this.Data.Data[i];\\r\\n                var dateTime=item.DateTime; //日期加时间\\r\\n                if (!dateTime) continue;\\r\\n                var aryValue=dateTime.split(' ');\\r\\n                if (aryValue.length!=2) continue;\\r\\n                var date=parseInt(aryValue[0]);\\r\\n                if (date!=data.date) continue;\\r\\n\\r\\n                upData[i]=minuteData.up[j];\\r\\n                downData[i]=minuteData.down[j];\\r\\n                ++j;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        this.ExtendData.set(key.UpKey,upData);\\r\\n        this.ExtendData.set(key.DownKey,downData);\\r\\n    }\\r\\n\\r\\n    //分钟涨幅股票个数统计数据\\r\\n    this.GetIndexIncreaseCacheData=function(funcName,symbol,node)\\r\\n    {\\r\\n        var blockSymbol=this.GetBlockSymbol(symbol);\\r\\n        if (!blockSymbol) this.Execute.ThrowUnexpectedNode(node,'不支持函数'+funcName+'('+symbol+')');\\r\\n\\r\\n        var key;\\r\\n        if (funcName=='UPCOUNT' || funcName=='ADVANCE') key=JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA.toString()+'-UpCount-'+blockSymbol;\\r\\n        else if (funcName=='DOWNCOUNT' || funcName=='DECLINE') key=JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA.toString()+'-DownCount-'+blockSymbol;\\r\\n\\r\\n        if (!key || !this.ExtendData.has(key)) this.Execute.ThrowUnexpectedNode(node,'不支持函数'+funcName+'('+symbol+')');\\r\\n\\r\\n        if (this.DataType===HQ_DATA_TYPE.MINUTE_ID || this.DataType===HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)  //分时图\\r\\n        {\\r\\n            return this.ExtendData.get(key);\\r\\n        }\\r\\n        else if (this.DataType===HQ_DATA_TYPE.KLINE_ID && ChartData.IsDayPeriod(this.Period,true))  //K线图\\r\\n        {\\r\\n            var data=this.ExtendData.get(key);\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=data;\\r\\n            bindData.Period=this.Period;    //周期\\r\\n\\r\\n            if (bindData.Period>0)          //周期数据\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodSingleData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n\\r\\n            return bindData.GetValue();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.GetSymbolData=function()\\r\\n    {\\r\\n        if (this.Data) return this.Execute.RunNextJob();\\r\\n\\r\\n        let self=this;\\r\\n\\r\\n        if (this.DataType===HQ_DATA_TYPE.MINUTE_ID)  //当天分钟数据\\r\\n        {\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.RealtimeApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\",\\\"amount\\\",\\\"date\\\",\\\"minute\\\",\\\"time\\\",\\\"minutecount\\\"],\\r\\n                        \\\"symbol\\\": [self.Symbol],\\r\\n                        \\\"start\\\": -1\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvMinuteData(recvData);\\r\\n                    self.Execute.RunNextJob();\\r\\n                }\\r\\n            });\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (this.DataType===HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)\\r\\n        {\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.HistoryMinuteApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"symbol\\\": self.Symbol,\\r\\n                        \\\"daycount\\\": self.DayCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvMultiDayMinuteData(recvData);\\r\\n                    self.Execute.RunNextJob();\\r\\n                }\\r\\n            });\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))     //请求日线数据\\r\\n        {\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'JSSymbolData::GetSymbolData',\\r\\n                        Explain:\\\"日线数据\\\",\\r\\n                        Request:\\r\\n                            { Url:self.RealtimeApiUrl,  Type:'POST' ,\\r\\n                                Data:\\r\\n                                    {\\r\\n                                        \\\"field\\\": [ \\\"name\\\", \\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                                        \\\"symbol\\\": self.Symbol,\\r\\n                                        \\\"start\\\": -1,\\r\\n                                        \\\"count\\\": self.MaxRequestDataCount\\r\\n                                    }\\r\\n                            },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n\\r\\n                if (this.KLineDateTimeRange)\\r\\n                {\\r\\n                    obj.Request.KLineDataTimeRange={Start:{ Date:this.KLineDateTimeRange.Start.Date},  End:{ Date:this.KLineDateTimeRange.End.Date} };\\r\\n                    if (this.IsNumber(this.KLineDateTimeRange.Start.Time)) obj.Request.KLineDataTimeRange.Start.Time=this.KLineDateTimeRange.Start.Time;\\r\\n                    if (this.IsNumber(this.KLineDateTimeRange.End.Time)) obj.Request.KLineDataTimeRange.End.Time=this.KLineDateTimeRange.End.Time;\\r\\n                }\\r\\n\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    self.RecvHistroyData(data);\\r\\n                    self.Execute.RunNextJob();\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.KLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [ \\\"name\\\", \\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": self.Symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestDataCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvHistroyData(recvData);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(this.Period, true))               //请求分钟数据\\r\\n        {\\r\\n            if (this.NetworkFilter)\\r\\n            {\\r\\n                var obj=\\r\\n                    {\\r\\n                        Name:'JSSymbolData::GetSymbolData',\\r\\n                        Explain:\\\"分钟K线数据\\\",\\r\\n                        Request:\\r\\n                            { Url:self.MinuteKLineApiUrl,  Type:'POST' ,\\r\\n                                Data:\\r\\n                                    {\\r\\n                                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                                        \\\"symbol\\\": self.Symbol,\\r\\n                                        \\\"start\\\": -1,\\r\\n                                        \\\"count\\\": self.MaxRequestMinuteDayCount\\r\\n                                    }\\r\\n                            },\\r\\n                        Self:this,\\r\\n                        PreventDefault:false\\r\\n                    };\\r\\n\\r\\n                if (this.KLineDateTimeRange)\\r\\n                {\\r\\n                    obj.Request.KLineDataTimeRange={Start:{ Date:this.KLineDateTimeRange.Start.Date},  End:{ Date:this.KLineDateTimeRange.End.Date} };\\r\\n                    if (this.IsNumber(this.KLineDateTimeRange.Start.Time)) obj.Request.KLineDataTimeRange.Start.Time=this.KLineDateTimeRange.Start.Time;\\r\\n                    if (this.IsNumber(this.KLineDateTimeRange.End.Time)) obj.Request.KLineDataTimeRange.End.Time=this.KLineDateTimeRange.End.Time;\\r\\n                }\\r\\n\\r\\n                this.NetworkFilter(obj, function(data)\\r\\n                {\\r\\n                    self.RecvMinuteHistroyData(data);\\r\\n                    self.Execute.RunNextJob();\\r\\n                });\\r\\n\\r\\n                if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n            }\\r\\n\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: this.MinuteKLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": self.Symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestMinuteDayCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvMinuteHistroyData(data);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvHistroyData=function(data)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvHistroyData] recv data' , data);\\r\\n\\r\\n        let hisData=this.JsonDataToHistoryData(data);\\r\\n        this.Data=new ChartData();\\r\\n        this.Data.DataType=0; /*日线数据 */\\r\\n        this.Data.Data=hisData;\\r\\n        this.SourceData=new ChartData;\\r\\n        this.SourceData.Data=hisData;\\r\\n\\r\\n        if (this.Right>0)    //复权\\r\\n        {\\r\\n            let rightData=this.Data.GetRightData(this.Right);\\r\\n            this.Data.Data=rightData;\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsDayPeriod(this.Period,false))   //周期数据\\r\\n        {\\r\\n            let periodData=this.Data.GetPeriodData(this.Period);\\r\\n            this.Data.Data=periodData;\\r\\n        }\\r\\n\\r\\n        this.Data.Right=this.Right;\\r\\n        this.Data.Period=this.Period;\\r\\n        this.Name=data.name;\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteHistroyData=function(data)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvMinuteHistroyData] recv data' , data);\\r\\n\\r\\n        let hisData=this.JsonDataToMinuteHistoryData(data);\\r\\n        this.Data=new ChartData();\\r\\n        this.Data.DataType=1; /*分钟线数据 */\\r\\n        this.Data.Data=hisData;\\r\\n        this.SourceData=new ChartData;\\r\\n        this.SourceData.Data=hisData;\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(this.Period,false))   //周期数据\\r\\n        {\\r\\n            let periodData=this.Data.GetPeriodData(this.Period);\\r\\n            this.Data.Data=periodData;\\r\\n        }\\r\\n\\r\\n        this.Data.Period=this.Period;\\r\\n        this.Name=data.name;\\r\\n    }\\r\\n\\r\\n    //最新的分钟数据走势图\\r\\n    this.RecvMinuteData=function(data)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvMinuteData] recv data' , data);\\r\\n\\r\\n        var aryMinuteData=this.JsonDataToMinuteData(data);\\r\\n        this.Data=new ChartData();\\r\\n        this.Data.DataType=2; /*分钟走势图数据 */\\r\\n        this.Data.Data=aryMinuteData;\\r\\n\\r\\n        this.Name=data.stock[0].name;\\r\\n    }\\r\\n\\r\\n    this.RecvMultiDayMinuteData=function(data)\\r\\n    {\\r\\n        var aryMinuteData=this.JsonDataToMultiDayMinuteData(data);\\r\\n        this.Data=new ChartData();\\r\\n        this.Data.DataType=2; /*分钟走势图数据 */\\r\\n        this.Data.Data=aryMinuteData;\\r\\n\\r\\n        this.Name=data.name;\\r\\n    }\\r\\n\\r\\n    this.GetSymbolCacheData=function(dataName)\\r\\n    {\\r\\n        if (!this.Data) return new Array();\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n\\r\\n        switch(dataName)\\r\\n        {\\r\\n            case 'CLOSE':\\r\\n            case 'C':\\r\\n                return this.Data.GetClose();\\r\\n            case 'VOL':\\r\\n            case 'V':\\r\\n                if (MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol))\\r\\n                    return this.Data.GetVol(100);   //A股的 把股转成手\\r\\n                return this.Data.GetVol();\\r\\n            case 'OPEN':\\r\\n            case 'O':\\r\\n                return this.Data.GetOpen();\\r\\n            case 'HIGH':\\r\\n            case 'H':\\r\\n                return this.Data.GetHigh();\\r\\n            case 'LOW':\\r\\n            case 'L':\\r\\n                return this.Data.GetLow();\\r\\n            case 'AMOUNT':\\r\\n            case 'AMO':\\r\\n                return this.Data.GetAmount();\\r\\n\\r\\n            case \\\"OPI\\\":         //文华 持仓量\\r\\n            case 'VOLINSTK':    //通达信 持仓量\\r\\n                return this.Data.GetPosition();\\r\\n\\r\\n\\r\\n            case \\\"ZSTJJ\\\":      //均价\\r\\n                return this.Data.GetAvPrice();\\r\\n\\r\\n            case \\\"SETTLE\\\":  //文华 结算价\\r\\n            case \\\"QHJSJ\\\":   //通达信 结算价\\r\\n                return this.Data.GetSettlementPrice();  //结算价\\r\\n\\r\\n            case \\\"ISEQUAL\\\": //平盘\\r\\n                return this.Data.GetIsEqual();\\r\\n            case \\\"ISUP\\\":    //收阳\\r\\n                return this.Data.GetIsUp();\\r\\n            case \\\"ISDOWN\\\":  //收阴\\r\\n                return this.Data.GetIsDown();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetSymbolPeriodData=function(job)\\r\\n    {\\r\\n        var periodID=JSComplierHelper.GetPeriodInfo({ Name:job.PeriodName }).Period;\\r\\n        var periodInfo={ PeriodID:periodID, PeriodName:job.PeriodName };\\r\\n        //同周期不请求\\r\\n        if (periodID==this.Period) this.Execute.RunNextJob();\\r\\n        if (this.IsApiPeriod)\\r\\n        {\\r\\n            if (this.PeriodData.has(job.PeriodName)) return this.Execute.RunNextJob();\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (ChartData.IsDayPeriod(periodID,true))\\r\\n            {\\r\\n                if (ChartData.IsDayPeriod(this.Period,true)) return this.Execute.RunNextJob();\\r\\n                periodInfo={PeriodID:0, PeriodName:'DAY' };\\r\\n            }\\r\\n            else if (ChartData.IsMinutePeriod(periodID,true))\\r\\n            {\\r\\n                if (ChartData.IsMinutePeriod(this.Period,true)) return this.Execute.RunNextJob();\\r\\n                periodInfo={ PeriodID:4, PeriodName:\\\"MIN1\\\" };\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                return this.Execute.RunNextJob();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetSymbolPeriodData',\\r\\n                    Explain:\\\"跨周期数据\\\",\\r\\n                    Request:\\r\\n                        {\\r\\n                            Data:\\r\\n                                {\\r\\n                                    \\\"field\\\": [ 'symbol','name', job.ValueName ],\\r\\n                                    \\\"period\\\":job.PeriodName,\\r\\n                                    \\\"symbol\\\": self.Symbol,\\r\\n                                }\\r\\n                        },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n\\r\\n            this.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                self.RecvSymbolPeriodData(data, periodInfo);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        if (ChartData.IsMinutePeriod(periodID,true))\\r\\n        {\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: this.MinuteKLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [\\\"name\\\",\\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": self.Symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestMinuteDayCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvSymbolPeriodData(data,periodInfo);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else if (ChartData.IsDayPeriod(periodID,true))\\r\\n        {\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: self.KLineApiUrl,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"field\\\": [ \\\"name\\\", \\\"symbol\\\",\\\"yclose\\\",\\\"open\\\",\\\"price\\\",\\\"high\\\",\\\"low\\\",\\\"vol\\\"],\\r\\n                        \\\"symbol\\\": self.Symbol,\\r\\n                        \\\"start\\\": -1,\\r\\n                        \\\"count\\\": self.MaxRequestDataCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (data)\\r\\n                {\\r\\n                    self.RecvSymbolPeriodData(data, periodInfo);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                error: function(request)\\r\\n                {\\r\\n                    self.RecvError(request);\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            return this.Execute.RunNextJob();\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.RecvSymbolPeriodData=function(data, periodInfo)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvSymbolPeriodData] data, periodInfo ' , data, periodInfo);\\r\\n\\r\\n        if (ChartData.IsDayPeriod(periodInfo.PeriodID,true))\\r\\n        {\\r\\n            var hisData=this.JsonDataToHistoryData(data);\\r\\n            var dayData=new ChartData();\\r\\n            dayData.DataType=0;     //日线数据\\r\\n            dayData.Data=hisData;   //保存原始数据 不复权\\r\\n            dayData.Right=0;\\r\\n            dayData.Period=periodInfo.PeriodID;\\r\\n            this.PeriodData.set(periodInfo.PeriodName, dayData);\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(periodInfo.PeriodID,true))\\r\\n        {\\r\\n            var hisData=this.JsonDataToMinuteHistoryData(data);\\r\\n            var minData=new ChartData();\\r\\n            minData.DataType=1;     //分钟线数据\\r\\n            minData.Data=hisData;\\r\\n            minData.Right=0;\\r\\n            minData.Period=periodInfo.PeriodID;\\r\\n            this.PeriodData.set(periodInfo.PeriodName, minData);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetSymbolPeriodCacheData=function(valueName,periodName)\\r\\n    {\\r\\n        var periodInfo=JSComplierHelper.GetPeriodInfo({Name:periodName});\\r\\n        if (this.Period==periodInfo.Period)\\r\\n            return this.GetSymbolCacheData(valueName);\\r\\n\\r\\n        var hisData=null;\\r\\n        if (this.IsApiPeriod)\\r\\n        {\\r\\n            var curPeriodInfo=JSComplierHelper.GetPeriodInfo({PeriodID:this.Period});\\r\\n            if (!curPeriodInfo) return null;\\r\\n            if (curPeriodInfo.Order>periodInfo.Order) return null;   //只能小周期转大周期\\r\\n\\r\\n            if (!this.PeriodData.has(periodName)) return null;\\r\\n            hisData=this.PeriodData.get(periodName);\\r\\n            hisData=hisData.Data;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var curPeriodInfo=JSComplierHelper.GetPeriodInfo({PeriodID:this.Period});\\r\\n            if (!curPeriodInfo) return null;\\r\\n\\r\\n            if (curPeriodInfo.Order>periodInfo.Order) return null;   //只能小周期转大周期\\r\\n\\r\\n            if (ChartData.IsDayPeriod(periodInfo.Period,true) && ChartData.IsMinutePeriod(this.Period,true))\\r\\n            {\\r\\n                var dayData=this.PeriodData.get('DAY'); //日线\\r\\n                if (periodInfo.Period==0) hisData=dayData.Data;\\r\\n                else hisData=dayData.GetPeriodData(periodInfo.Period);  //日线周期\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                var bindData=new ChartData();\\r\\n                bindData.Data=this.SourceData.Data;\\r\\n                bindData.Period=this.Period;\\r\\n                bindData.Right=this.Right;\\r\\n\\r\\n                if (ChartData.IsDayPeriod(periodInfo.Period,true) && bindData.Right>0) //日线数据才复权\\r\\n                {\\r\\n                    var rightData=bindData.GetRightData(bindData.Right);\\r\\n                    bindData.Data=rightData;\\r\\n                }\\r\\n\\r\\n                hisData=bindData.GetPeriodData(periodInfo.Period);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var data=this.Data.ConverPeriod(hisData, this.Period, periodInfo.Period);\\r\\n        var result=new ChartData();\\r\\n        result.Data=data;\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n        switch(valueName)\\r\\n        {\\r\\n            case 'C':\\r\\n            case \\\"CLOSE\\\":\\r\\n                return result.GetClose();\\r\\n            case 'O':\\r\\n            case \\\"OPEN\\\":\\r\\n                return result.GetOpen();\\r\\n            case 'H':\\r\\n            case \\\"HIGH\\\":\\r\\n                return result.GetHigh();\\r\\n            case 'L':\\r\\n            case \\\"LOW\\\":\\r\\n                return result.GetLow();\\r\\n            case 'AMO':\\r\\n            case \\\"AMOUNT\\\":\\r\\n                return result.GetAmount();\\r\\n            case 'V':\\r\\n            case \\\"VOL\\\":\\r\\n                if (MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol))\\r\\n                    return result.GetVol(100);\\r\\n                return result.GetVol();\\r\\n            case \\\"VOLINSTK\\\":\\r\\n                return result.GetPosition();\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetSymbolPeriodCacheData2=function(valueName,periodName,n)\\r\\n    {\\r\\n        var periodInfo=JSComplierHelper.GetPeriodInfo({Name:periodName});\\r\\n        if (!periodInfo) return null;\\r\\n\\r\\n        var curPeriodInfo=JSComplierHelper.GetPeriodInfo({PeriodID:this.Period});\\r\\n        if (!curPeriodInfo) return null;\\r\\n\\r\\n        if (curPeriodInfo.Order>periodInfo.Order) return null;   //只能小周期转大周期\\r\\n\\r\\n        var result;\\r\\n        if (curPeriodInfo.Period==periodInfo.Period)\\r\\n        {\\r\\n            result=this.Data;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var hisData;\\r\\n            if (this.IsApiPeriod)\\r\\n            {\\r\\n                if (!this.PeriodData.has(periodName)) return null;\\r\\n                hisData=this.PeriodData.get(periodName);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                if (ChartData.IsMinutePeriod(curPeriodInfo.Period,true) && ChartData.IsDayPeriod(periodInfo.Period,true))\\r\\n                {\\r\\n                    var dayData=this.PeriodData.get('DAY'); //日线\\r\\n                    if (periodInfo.Period==0) hisData=dayData;\\r\\n                    else hisData=dayData.GetPeriodData(periodInfo.Period);  //日线周期\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var bindData=new ChartData();\\r\\n                    bindData.Data=this.SourceData.Data;\\r\\n                    bindData.Period=this.Period;\\r\\n                    bindData.Right=this.Right;\\r\\n\\r\\n                    if (ChartData.IsDayPeriod(periodInfo.Period,true) && bindData.Right>0) //日线数据才复权\\r\\n                    {\\r\\n                        var rightData=bindData.GetRightData(bindData.Right);\\r\\n                        bindData.Data=rightData;\\r\\n                    }\\r\\n\\r\\n                    hisData=bindData.GetPeriodData(periodInfo.Period);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var data=this.Data.ConverPeriod(hisData, this.Period, periodInfo.Period);\\r\\n            var result=new ChartData();\\r\\n            result.Data=data;\\r\\n        }\\r\\n\\r\\n        if (IFrameSplitOperator.IsPlusNumber(n))\\r\\n        {\\r\\n            var refResult=new ChartData();\\r\\n            var data=result.GetRef(n);\\r\\n            refResult.Data=data;\\r\\n            result=refResult;\\r\\n        }\\r\\n\\r\\n        var upperSymbol=this.Symbol.toUpperCase();\\r\\n\\r\\n        switch(valueName)\\r\\n        {\\r\\n            case 'C':\\r\\n            case \\\"CLOSE\\\":\\r\\n                return result.GetClose();\\r\\n            case 'O':\\r\\n            case \\\"OPEN\\\":\\r\\n                return result.GetOpen();\\r\\n            case 'H':\\r\\n            case \\\"HIGH\\\":\\r\\n                return result.GetHigh();\\r\\n            case 'L':\\r\\n            case \\\"LOW\\\":\\r\\n                return result.GetLow();\\r\\n            case 'AMO':\\r\\n            case \\\"AMOUNT\\\":\\r\\n                return result.GetAmount();\\r\\n            case 'V':\\r\\n            case \\\"VOL\\\":\\r\\n                if (MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol))\\r\\n                    return result.GetVol(100);\\r\\n                return result.GetVol();\\r\\n            case \\\"VOLINSTK\\\":\\r\\n                return result.GetPosition();\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetCurrBarsCount=function()\\r\\n    {\\r\\n        let result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        let lCount=this.Data.Data.length;\\r\\n        for(let i=lCount-1;i>=0;--i)\\r\\n            result.push(i+1);   //数据从0开始\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetTotalTradeMinuteCount=function()\\r\\n    {\\r\\n        var data=g_MinuteCoordinateData.GetCoordinateData(this.Symbol);\\r\\n        if (data && data.Count>0) return data.Count-1;\\r\\n        return 242;\\r\\n    }\\r\\n\\r\\n    this.GetTotalBarsCount=function()\\r\\n    {\\r\\n        let lCount=this.Data.Data.length;\\r\\n        return lCount;\\r\\n    }\\r\\n\\r\\n    this.GetIsLastBar=function()\\r\\n    {\\r\\n        let result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result\\r\\n\\r\\n        let lCount=this.Data.Data.length;\\r\\n        for(let i=0;i<lCount;++i)\\r\\n        {\\r\\n            if (i==lCount-1) result.push(1);\\r\\n            else result.push(0);\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //BARSTATUS返回数据位置信息,1表示第一根K线,2表示最后一个数据,0表示中间位置.\\r\\n    //例如:BARSTATUS=2表示当天是该数据的最后一个周期.\\r\\n    this.GetBarStatus=function()\\r\\n    {\\r\\n        let result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result\\r\\n\\r\\n        let lCount=this.Data.Data.length;\\r\\n        for(var i=0 ;i<lCount;++i)\\r\\n        {\\r\\n            if (i==0) result[i]=1;\\r\\n            else if (i==lCount-1) result[i]=2;\\r\\n            else result[i]=0;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //融资融券函数\\r\\n    this.GetMarginCacheData=function(id, node)\\r\\n    {\\r\\n        let jobID=JS_EXECUTE_JOB_ID.GetMarginJobID(id);\\r\\n        if (!jobID) this.Execute.ThrowUnexpectedNode(node,'不支持MARGIN('+id+')');\\r\\n        if(this.MarginData.has(jobID)) return this.MarginData.get(jobID);\\r\\n\\r\\n        return [];\\r\\n    }\\r\\n\\r\\n    //下融资融券\\r\\n    this.GetMarginData=function(jobID)\\r\\n    {\\r\\n        if (this.MarginData.has(jobID)) return this.Execute.RunNextJob();\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::GetMarginData] jobID=', jobID);\\r\\n        var self=this;\\r\\n        let fieldList=[\\\"name\\\",\\\"date\\\",\\\"symbol\\\"];\\r\\n\\r\\n        switch(jobID)\\r\\n        {\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE:           //融资融券余额\\r\\n                fieldList.push(\\\"margin.balance\\\");\\r\\n                break;\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE:              //融资占比\\r\\n                fieldList.push(\\\"margin.rate\\\");\\r\\n                break;\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE:       //买入信息-融资余额\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT:        //买入信息-买入额\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY:         //买入信息-偿还额\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET:           //买入信息-融资净买入\\r\\n                fieldList.push(\\\"margin.buy\\\");\\r\\n                break;\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE:      //卖出信息-融券余量\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME:       //卖出信息-卖出量\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY:        //卖出信息-偿还量\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET:          //卖出信息-融券净卖出\\r\\n                fieldList.push(\\\"margin.sell\\\");\\r\\n                break;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.StockHistoryDayApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"orderfield\\\":\\\"date\\\"\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvMarginData(recvData,jobID);\\r\\n                self.Execute.RunNextJob();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvMarginData=function(data,jobID)\\r\\n    {\\r\\n        JSConsole.Complier.Log(data);\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n\\r\\n        let stock=data.stock[0];\\r\\n        var aryData=new Array();\\r\\n        var aryData2=[], aryData3=[], aryData4=[];  //其他3个数据\\r\\n        for(let i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n            var marginData=item.margin;\\r\\n            if (!marginData) continue;\\r\\n\\r\\n            let indexData=new SingleData();\\r\\n            indexData.Date=item.date;\\r\\n\\r\\n            switch(jobID)\\r\\n            {\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE:\\r\\n                    if (!this.IsNumber(marginData.balance)) continue;\\r\\n                    indexData.Value=marginData.balance; //融资融券余额\\r\\n                    aryData.push(indexData);\\r\\n                    break;\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE:\\r\\n                    if (!this.IsNumber(marginData.rate)) continue;\\r\\n                    indexData.Value=marginData.rate;    //融资占比\\r\\n                    aryData.push(indexData);\\r\\n                    break;\\r\\n\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE:       //买入信息-融资余额\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT:        //买入信息-买入额\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY:         //买入信息-偿还额\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET:           //买入信息-融资净买入\\r\\n                    var buyData=marginData.buy;\\r\\n                    if (!buyData) continue;\\r\\n                    if (!this.IsNumber(buyData.balance) || !this.IsNumber(buyData.amount) || !this.IsNumber(buyData.repay) || !this.IsNumber(buyData.net)) continue;\\r\\n\\r\\n                    indexData.Value=buyData.balance;\\r\\n                    var indexData2=new SingleData();\\r\\n                    indexData2.Date=item.date;\\r\\n                    indexData2.Value=buyData.amount;\\r\\n                    var indexData3=new SingleData();\\r\\n                    indexData3.Date=item.date;\\r\\n                    indexData3.Value=buyData.repay;\\r\\n                    var indexData4=new SingleData();\\r\\n                    indexData4.Date=item.date;\\r\\n                    indexData4.Value=buyData.net;\\r\\n\\r\\n                    aryData.push(indexData);\\r\\n                    aryData2.push(indexData2);\\r\\n                    aryData3.push(indexData3);\\r\\n                    aryData4.push(indexData4);\\r\\n                    break;\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE:      //卖出信息-融券余量\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME:       //卖出信息-卖出量\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY:        //卖出信息-偿还量\\r\\n                case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET:          //卖出信息-融券净卖出\\r\\n                    var sellData=marginData.sell;\\r\\n                    if (!sellData) continue;\\r\\n                    if (!this.IsNumber(sellData.balance) || !this.IsNumber(sellData.volume) || !this.IsNumber(sellData.repay) || !this.IsNumber(sellData.net)) continue;\\r\\n\\r\\n                    indexData.Value=buyData.balance;\\r\\n                    var indexData2=new SingleData();\\r\\n                    indexData2.Date=item.date;\\r\\n                    indexData2.Value=buyData.volume;\\r\\n                    var indexData3=new SingleData();\\r\\n                    indexData3.Date=item.date;\\r\\n                    indexData3.Value=buyData.repay;\\r\\n                    var indexData4=new SingleData();\\r\\n                    indexData4.Date=item.date;\\r\\n                    indexData4.Value=buyData.net;\\r\\n\\r\\n                    aryData.push(indexData);\\r\\n                    aryData2.push(indexData2);\\r\\n                    aryData3.push(indexData3);\\r\\n                    aryData4.push(indexData4);\\r\\n                    break;\\r\\n                default:\\r\\n                    continue;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var allData=[];\\r\\n        if (jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE || jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE)\\r\\n        {\\r\\n            allData.push({JobID:jobID,Data:aryData});\\r\\n        }\\r\\n        else if (jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE || jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT ||\\r\\n            jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY || jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET)\\r\\n        {\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE,Data:aryData});\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT,Data:aryData2});\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY,Data:aryData3});\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET,Data:aryData4});\\r\\n        }\\r\\n        else if (jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE || jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME ||\\r\\n            jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY || jobID===JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET)\\r\\n        {\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE,Data:aryData});\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME,Data:aryData2});\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY,Data:aryData3});\\r\\n            allData.push({JobID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET,Data:aryData4});\\r\\n        }\\r\\n\\r\\n        for(let i in allData)\\r\\n        {\\r\\n            let aryFixedData=this.SourceData.GetFittingData(allData[i].Data);\\r\\n\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFixedData;\\r\\n            bindData.Period=this.Period;    //周期\\r\\n\\r\\n            if (bindData.Period>0)          //周期数据\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodSingleData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n\\r\\n            let data=bindData.GetValue();\\r\\n            this.MarginData.set(allData[i].JobID,data);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetNewsAnalysisCacheData=function(id,node)\\r\\n    {\\r\\n\\r\\n        let jobID=JS_EXECUTE_JOB_ID.GetNewsAnalysisID(id);\\r\\n        if (!jobID) this.Execute.ThrowUnexpectedNode(node,'不支持NEWS('+id+')');\\r\\n        if(this.NewsAnalysisData.has(jobID)) return this.NewsAnalysisData.get(jobID);\\r\\n\\r\\n        return [];\\r\\n    }\\r\\n\\r\\n    this.GetHKToSHSZData=function(job)\\r\\n    {\\r\\n        var args=job.Args;\\r\\n        var code=this.Symbol;\\r\\n        if (args.length>0)\\r\\n        {\\r\\n            var item=args[0];\\r\\n            if (item.Type==Syntax.Literal)\\r\\n            {\\r\\n                code=item.Value;\\r\\n            }\\r\\n            else if (item.Type==Syntax.Identifier)  //变量 !!只支持默认的变量值\\r\\n            {\\r\\n                var isFind=false;\\r\\n                for(var j in this.Arguments)\\r\\n                {\\r\\n                    const argItem=this.Arguments[j];\\r\\n                    if (argItem.Name==item.Name)\\r\\n                    {\\r\\n                        code=argItem.Value;\\r\\n                        isFind=true;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (!isFind)\\r\\n                {\\r\\n                    var token=job.Token;\\r\\n                    this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`HK2SHSZ() Error: can't read ${item.Name}`);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        job.Symbol=code;\\r\\n\\r\\n        if (code==1 || code==2 || code==3)    //下载全市场数据\\r\\n            this.GetHKToSHSZMarketData(code,job);\\r\\n        else\\r\\n            this.GetHKToSHSZStockData(code,job);      //下载个股数据\\r\\n    }\\r\\n\\r\\n    this.GetHKToSHSZStockData=function(symbol,job)\\r\\n    {\\r\\n        if (this.HKToSHSZData.has(symbol)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var upperSymbol=symbol.toLowerCase();   //代码小写\\r\\n        var self=this;\\r\\n        var url=`${this.HKToSHSZApiUrl[3]}/${upperSymbol}.json`;\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            type:\\\"get\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvHKToSHSZStockData(recvData,job);\\r\\n                self.Execute.RunNextJob();\\r\\n            },\\r\\n            error:function(request)\\r\\n            {\\r\\n                console.warn(`[JSSymbolData::GetHKToSHSZStockData] request url=${url} failed. error=${request.status}`);\\r\\n                self.RecvHKToSHSZStockData(null,job);\\r\\n                self.Execute.RunNextJob();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvHKToSHSZStockData=function(data,job)\\r\\n    {\\r\\n        if (!data) return;\\r\\n\\r\\n        var symbol=data.symbol;\\r\\n        var upperSymbol=symbol.toUpperCase();\\r\\n        var aryData=[];\\r\\n        for(var i=0;i<data.date.length;++i)\\r\\n        {\\r\\n            var item=new SingleData();\\r\\n            item.Date=data.date[i];\\r\\n            item.Value=data.vol[i];   //股\\r\\n            aryData.push(item);\\r\\n        }\\r\\n\\r\\n        var aryFixedData=this.Data.GetFittingData(aryData);\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFixedData;\\r\\n        bindData.Period=this.Period;    //周期\\r\\n\\r\\n        if (bindData.Period>0)          //周期数据\\r\\n        {\\r\\n            var periodData=bindData.GetPeriodSingleData(bindData.Period);\\r\\n            bindData.Data=periodData;\\r\\n        }\\r\\n\\r\\n        var data=bindData.GetValue();\\r\\n        this.HKToSHSZData.set(upperSymbol,data);\\r\\n    }\\r\\n\\r\\n    this.GetHKToSHSZMarketData=function(symbol,job)\\r\\n    {\\r\\n        if (this.HKToSHSZData.has(symbol)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var url, dataType=0;\\r\\n        if (this.DataType===HQ_DATA_TYPE.MINUTE_ID) dataType=1;\\r\\n        else if (this.DataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID) dataType=2;\\r\\n        else if (this.Period<=3) dataType=0;\\r\\n\\r\\n        url=this.HKToSHSZApiUrl[dataType];\\r\\n        var self=this;\\r\\n        JSConsole.Complier.Log(`[JSSymbolData::GetHKToSHSZMarketData] code=${symbol} url=${url}, dataType=${dataType}`);\\r\\n\\r\\n        if (dataType===2)   //多日分时数据 (取这个股票的多日日期对应的北上数据)\\r\\n        {\\r\\n            //请求数据\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: url,\\r\\n                data:\\r\\n                    {\\r\\n                        \\\"symbol\\\": this.Symbol,\\r\\n                        'daycount': this.MaxRequestMinuteDayCount\\r\\n                    },\\r\\n                type:\\\"post\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    self.RecvMulitMinuteHKToSHSZData(recvData,job);\\r\\n                    self.Execute.RunNextJob();\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //请求数据\\r\\n            JSNetwork.HttpRequest({\\r\\n                url: url,\\r\\n                type:\\\"get\\\",\\r\\n                dataType: \\\"json\\\",\\r\\n                async:true,\\r\\n                success: function (recvData)\\r\\n                {\\r\\n                    if (dataType==0) self.RecvHKToSHSZData(recvData,job);\\r\\n                    else if (dataType==1) self.RecvMinuteHKToSHSZData(recvData,job);\\r\\n                    self.Execute.RunNextJob();\\r\\n                }\\r\\n            });\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    this.RecvMinuteHKToSHSZData=function(data,job)\\r\\n    {\\r\\n        var arySHSZData=[], arySHData=[], arySZData=[];\\r\\n        if (this.IsBeforeData)\\r\\n        {\\r\\n            for( i in this.SourceData.Data)\\r\\n            {\\r\\n                var item=this.SourceData.Data[i];\\r\\n                if (item.Before)\\r\\n                {\\r\\n                    arySHSZData.push(null);\\r\\n                    arySHData.push(null);\\r\\n                    arySZData.push(null);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            for(var i=0;i<data.time.length;++i)\\r\\n            {\\r\\n                var time=data.time[i];\\r\\n                if (time===925) continue;\\r\\n\\r\\n                var SHValue=data.hk2sh[i];\\r\\n                var SZValue=data.hk2sz[i];\\r\\n                var total=SHValue+SZValue;\\r\\n\\r\\n                arySHSZData.push(total);\\r\\n                arySHData.push(SHValue);\\r\\n                arySZData.push(SZValue);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            for(var i=0;i<data.time.length;++i)\\r\\n            {\\r\\n                var time=data.time[i];\\r\\n                var SHValue=data.hk2sh[i];\\r\\n                var SZValue=data.hk2sz[i];\\r\\n                var total=SHValue+SZValue;\\r\\n\\r\\n                arySHSZData.push(total);\\r\\n                arySHData.push(SHValue);\\r\\n                arySZData.push(SZValue);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var allData=\\r\\n            [\\r\\n                {Data:arySHSZData, ID:1},\\r\\n                {Data:arySHData,ID:2},\\r\\n                {Data:arySZData,ID:3}\\r\\n            ];\\r\\n\\r\\n        for(var i in allData)\\r\\n        {\\r\\n            var item=allData[i];\\r\\n            this.HKToSHSZData.set(item.ID,item.Data);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvHKToSHSZData=function(data,job)\\r\\n    {\\r\\n        var arySHSZData=[], arySHData=[], arySZData=[];\\r\\n        for(var i=0;i<data.date.length;++i)\\r\\n        {\\r\\n            var date=data.date[i];\\r\\n            var SHValue=data.hk2sh[i]*1000000;  //单位是百万\\r\\n            var SZValue=data.hk2sz[i]*1000000;  //单位是百万\\r\\n            var total=SHValue+SZValue;\\r\\n\\r\\n            let itemSHSZData=new SingleData();\\r\\n            itemSHSZData.Date=date;\\r\\n            itemSHSZData.Value=total;\\r\\n\\r\\n            let itemSHData=new SingleData();\\r\\n            itemSHData.Date=date;\\r\\n            itemSHData.Value=SHValue;\\r\\n\\r\\n            let itemSZData=new SingleData();\\r\\n            itemSZData.Date=date;\\r\\n            itemSZData.Value=SZValue;\\r\\n\\r\\n            arySHSZData.push(itemSHSZData);\\r\\n            arySHData.push(itemSHData);\\r\\n            arySZData.push(itemSZData);\\r\\n        }\\r\\n\\r\\n        var allData=\\r\\n            [\\r\\n                {Data:arySHSZData, ID:1},\\r\\n                {Data:arySHData,ID:2 },\\r\\n                {Data:arySZData,ID:3 }\\r\\n            ];\\r\\n\\r\\n        for(let i in allData)\\r\\n        {\\r\\n            let aryFixedData=this.Data.GetFittingData(allData[i].Data);\\r\\n\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFixedData;\\r\\n            bindData.Period=this.Period;    //周期\\r\\n\\r\\n            if (bindData.Period>0)          //周期数据\\r\\n            {\\r\\n                var periodData=bindData.GetPeriodSingleData(bindData.Period);\\r\\n                bindData.Data=periodData;\\r\\n            }\\r\\n\\r\\n            let data=bindData.GetValue();\\r\\n            this.HKToSHSZData.set(allData[i].ID,data);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvMulitMinuteHKToSHSZData=function(data,job)   //多日分时图北上资金\\r\\n    {\\r\\n        if (!data.data || data.data.length<=0) return;\\r\\n\\r\\n        var arySHSZData=[], arySHData=[], arySZData=[];\\r\\n        for(var i=0 ,j=0;i<this.Data.Data.length && j<data.data.length; )\\r\\n        {\\r\\n            arySHSZData[i]=null;\\r\\n            arySHData[i]=null;\\r\\n            arySZData[i]=null;\\r\\n            var item=this.Data.Data[i];\\r\\n            var dateTime=item.DateTime; //日期加时间\\r\\n            if (!dateTime)\\r\\n            {\\r\\n                ++i;\\r\\n                continue;\\r\\n            }\\r\\n            var aryValue=dateTime.split(' ');\\r\\n            if (aryValue.length!=2)\\r\\n            {\\r\\n                ++i;\\r\\n                continue;\\r\\n            }\\r\\n            var date=parseInt(aryValue[0]);\\r\\n            var day=data.data[j];\\r\\n            if (!day.minute || day.minute.length<=0)\\r\\n            {\\r\\n                ++j;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            if (day.date>date)\\r\\n            {\\r\\n                ++i;\\r\\n                continue;\\r\\n            }\\r\\n            else if (day.date<date)\\r\\n            {\\r\\n                ++j;\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            for(var k in day.minute)\\r\\n            {\\r\\n                var timeItem=day.minute[k];\\r\\n\\r\\n                var SHValue=timeItem[1];\\r\\n                var SZValue=timeItem[2];\\r\\n                var total=SHValue+SZValue;\\r\\n\\r\\n                arySHSZData[i]=total;\\r\\n                arySHData[i]=SHValue;\\r\\n                arySZData[i]=SZValue;\\r\\n                ++i;\\r\\n            }\\r\\n\\r\\n            ++j;\\r\\n        }\\r\\n\\r\\n        var allData=\\r\\n            [\\r\\n                {Data:arySHSZData, ID:1},\\r\\n                {Data:arySHData,ID:2},\\r\\n                {Data:arySZData,ID:3}\\r\\n            ];\\r\\n\\r\\n        for(var i in allData)\\r\\n        {\\r\\n            var item=allData[i];\\r\\n            this.HKToSHSZData.set(item.ID,item.Data);\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    //北上资金函数\\r\\n    this.GetHKToSHSZCacheData=function(code, node)\\r\\n    {\\r\\n        //if (!this.HKToSHSZData.has(code)) this.Execute.ThrowUnexpectedNode(node,`不支持HK2SHSZ(${code})`);\\r\\n        if (!code) code=this.Symbol;\\r\\n        if (typeof(code)=='string') code=code.toUpperCase();\\r\\n        if(this.HKToSHSZData.has(code)) return this.HKToSHSZData.get(code);\\r\\n        return [];\\r\\n    }\\r\\n\\r\\n    //下载新闻统计\\r\\n    this.GetNewsAnalysisData=function(jobID)\\r\\n    {\\r\\n        if (this.NewsAnalysisData.has(jobID)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        var mapFolder=new Map([\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_NEGATIVE,     \\\"negative\\\"],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_RESEARCH,     'research'],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_INTERACT,     'interact'],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE, 'holderchange'],      //NEWS(4)   股东增持\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2,'holderchange'],      //NEWS(5)   股东减持\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TRUSTHOLDER,  'trustholder'],       //NEWS(6)   信托持股\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_BLOCKTRADING, 'Blocktrading'],      //NEWS(7)   大宗交易\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_COMPANYNEWS,  'companynews'],       //NEWS(8)   官网新闻\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TOPMANAGERS,  'topmanagers'],       //NEWS(9)   高管要闻\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_PLEDGE,       'Pledge'],            //NEWS(10)  股权质押\\r\\n        ]);\\r\\n\\r\\n        if (!mapFolder.has(jobID))\\r\\n        {\\r\\n            this.Execute.RunNextJob();\\r\\n            return;\\r\\n        }\\r\\n        var folderName=mapFolder.get(jobID);\\r\\n        var url=this.StockNewsAnalysisApiUrl+'/'+folderName+'/'+this.Symbol+'.json';\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: url,\\r\\n            type:\\\"get\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvNewsAnalysisData(recvData,jobID);\\r\\n                self.Execute.RunNextJob();\\r\\n            },\\r\\n            error:function(request, textStatus)\\r\\n            {\\r\\n                self.RecvNewsAnalysisDataError(request, textStatus,jobID);\\r\\n                self.Execute.RunNextJob();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvNewsAnalysisDataError=function(request, textStatus,jobID)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvNewsAnalysisDataError] ajax error.',request.status);\\r\\n\\r\\n        //没有新闻使用0数据填充\\r\\n        var aryData=[];\\r\\n        for(var i=0;i<this.Data.Data.length;++i)\\r\\n        {\\r\\n            var item=new SingleData();\\r\\n            item.Date=this.Data.Data[i].Date;\\r\\n            item.Value=0\\r\\n            aryData.push(item);\\r\\n        }\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryData;\\r\\n        this.NewsAnalysisData.set(jobID,bindData.GetValue());\\r\\n    }\\r\\n\\r\\n    this.RecvNewsAnalysisData=function(data,jobID)\\r\\n    {\\r\\n        if (!data.data || !data.date) return;\\r\\n        if (data.data.length<=0 || data.data.length!=data.date.length) return;\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvNewsAnalysisData] jobID',jobID, data.update);\\r\\n        if (jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE|| jobID==JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2)\\r\\n        {\\r\\n            var aryData=[], aryData2=[];\\r\\n            for(var i=0;i<data.data.length;++i)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=data.date[i];\\r\\n                item.Value=data.data[i];\\r\\n                if (this.IsNumber(item.Value)) aryData.push(item);\\r\\n\\r\\n                if (i<data.data2.length)\\r\\n                {\\r\\n                    item=new SingleData();\\r\\n                    item.Date=data.date[i];\\r\\n                    item.Value=data.data2[i];\\r\\n                    if (this.IsNumber(item.Value)) aryData2.push(item);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            let aryFixedData=this.Data.GetFittingData2(aryData,0);\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFixedData;\\r\\n            this.NewsAnalysisData.set(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE,bindData.GetValue());\\r\\n\\r\\n            aryFixedData=this.Data.GetFittingData2(aryData2,0);\\r\\n            bindData=new ChartData();\\r\\n            bindData.Data=aryFixedData;\\r\\n            this.NewsAnalysisData.set(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2,bindData.GetValue());\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var aryData=[];\\r\\n            for(var i=0;i<data.data.length;++i)\\r\\n            {\\r\\n                var item=new SingleData();\\r\\n                item.Date=data.date[i];\\r\\n                item.Value=data.data[i];\\r\\n                aryData.push(item);\\r\\n            }\\r\\n\\r\\n            let aryFixedData=this.Data.GetFittingData2(aryData,0);\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFixedData;\\r\\n            this.NewsAnalysisData.set(jobID,bindData.GetValue());\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetSectionFinanceData=function(job)\\r\\n    {\\r\\n        var sfKey=job.SF[0];\\r\\n        var period=job.SF[1].Period;\\r\\n        if (this.SectionFinanceData.has(sfKey)) return this.Execute.RunNextJob();\\r\\n\\r\\n        JSConsole.Complier.Log(`[JSSymbolData::GetSectionFinanceData] ${period.Year}-${period.Quarter}`);\\r\\n        var fieldName='announcement'+period.Quarter;\\r\\n        var self=this;\\r\\n        var fieldList=[\\\"name\\\",\\\"date\\\",\\\"symbol\\\", fieldName,'finance'+period.Quarter];\\r\\n        var cond=[fieldName+'.year', \\\"int32\\\", \\\"eq\\\", period.Year.toString() ];\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.StockHistoryDayApiUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"condition\\\":[{item:cond}]\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvSectionFinanceData(recvData,job);\\r\\n                self.Execute.RunNextJob();\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvSectionFinanceData=function(data,job)\\r\\n    {\\r\\n        if (!data.stock || data.stock.length!=1) return;\\r\\n        var stockItem=data.stock[0];\\r\\n        if (!stockItem.stockday || stockItem.stockday.length<=0) return;\\r\\n        var dayItem=stockItem.stockday[0];\\r\\n        var period=job.SF[1].Period;\\r\\n        var finance=null;\\r\\n        if (period.Quarter===1) finance=dayItem.finance1;\\r\\n        else if (period.Quarter===2) finance=dayItem.finance2;\\r\\n        else if (period.Quarter===3) finance=dayItem.finance3;\\r\\n        else if (period.Quarter===4) finance=dayItem.finance4;\\r\\n        if (!finance) return;\\r\\n\\r\\n        var data=new Map([\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_01,finance.currentassets],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_02,finance.monetaryfunds],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_03,finance.inventory],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_04,finance.currentliabilities],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_05,finance.ncurrentliabilities],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_06,finance.expenses3],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_07,finance.investmentincome],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_08,finance.pcnprofit],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_09,finance.nnetprofit],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_10,finance.npersearning],\\r\\n\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_11,finance.woewa],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_12,finance.inprocess],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_13,finance.accdepreciation],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_14,finance.mholderprofit],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_15,finance.lossexchange],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_16,finance.baddebts],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_17,finance.fixedassets],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_18,finance.curdepreciation],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_19,finance.orevenues],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_20,finance.moprofit],\\r\\n\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_21,finance.oprofit],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_22,finance.nprofit],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_23,finance.areceivable],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_24,finance.financialcost],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_25,finance.ccfo],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_26,finance.totalassets],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_27,finance.totalliabilities],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_28,finance.totalownersequity],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_29,finance.grossmargin],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_30,finance.percreserve],\\r\\n\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_31,finance.peruprofit],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_32,finance.persearning],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_33,finance.pernetasset],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_34,finance.perccfo],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_38,finance.alratio],\\r\\n            [JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_39,finance.profityoy],\\r\\n        ]);\\r\\n\\r\\n        if (period.Quarter===4) //年报才有的数据\\r\\n        {\\r\\n            data.set(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_35,finance.nnprofitincrease);\\r\\n            data.set(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_36,finance.nnprofitspeed);\\r\\n            data.set(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_37,finance.nprofitincrease);\\r\\n        }\\r\\n\\r\\n        var sfKey=job.SF[0];\\r\\n        this.SectionFinanceData.set(sfKey,data);\\r\\n    }\\r\\n\\r\\n    this.GetSectionFinanceCacheData=function(year,quarter,fieldName,node)\\r\\n    {\\r\\n        var period=JS_EXECUTE_JOB_ID.GetSectionReportPeriod(year,quarter);\\r\\n        if (!period) this.Execute.ThrowUnexpectedNode(node,`不支持FS(${year}, ${quarter}, '${fieldName}') 报告期错误`);\\r\\n        var id=JS_EXECUTE_JOB_ID.GetSectionFinanceID(fieldName);\\r\\n        if (!id) this.Execute.ThrowUnexpectedNode(node,`不支持FS(${year}, ${quarter},'${fieldName}') 财务数据字段名称错误`);\\r\\n\\r\\n        var sfKey=period.Year+'-'+period.Quarter;\\r\\n        if (!this.SectionFinanceData.has(sfKey) && !this.ThrowSFPeirod.has(sfKey)) //动态下载的数据, 抛异常以后重新下载执行\\r\\n        {\\r\\n            this.ThrowSFPeirod.add(sfKey);  //抛过的异常就不抛了\\r\\n            var job={ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_SF, SF:[sfKey, {Period:period, Fields:new Set([id])}]};\\r\\n            this.Execute.ThrowDownloadSF(node, job, `FS(${year}, ${quarter}, '${fieldName}') 动态下载`);\\r\\n        }\\r\\n\\r\\n        if (!this.SectionFinanceData.has(sfKey))\\r\\n            return this.Execute.ThrowUnexpectedNode(node,`不支持FS(${year}, ${quarter}, '${fieldName}') 没有这期财务数据`);\\r\\n\\r\\n        var financeData=this.SectionFinanceData.get(sfKey);\\r\\n        if (!financeData.has(id)) this.Execute.ThrowUnexpectedNode(node,`不支持FS(${year}, ${quarter}, '${fieldName}') 没有这期财务数据字段`);\\r\\n\\r\\n        return financeData.get(id);\\r\\n    }\\r\\n\\r\\n    this.GetFinOne=function(jobItem)\\r\\n    {\\r\\n        var aryArgs=this.JobArgumentsToArray(jobItem, 3);\\r\\n        var key=this.GetStockDataKey(jobItem,aryArgs);\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetFinOne', //类名::\\r\\n                    Explain:'财务数据FINONE(ID,Y,MMDD)',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:{ Url:self.StockHistoryDayApiUrl, Type:'POST', Data:{ Args:aryArgs, symbol: this.Symbol, daterange:dateRange } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                self.RecvStockValue(recvData,jobItem,key,1);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        var apiDownload=new DownloadFinOneData(\\r\\n            {\\r\\n                Job:jobItem,\\r\\n                Symbol:this.Symbol,\\r\\n                Url:this.StockHistoryDayApiUrl,\\r\\n                Args:aryArgs,\\r\\n                DataKey:key,\\r\\n                Callback:function(recvData, jobItem, key)\\r\\n                {\\r\\n                    self.RecvStockValue(recvData, jobItem, key,1);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                ErrorCallback:function(strError)\\r\\n                {\\r\\n                    self.AddStockValueError(key,strError);\\r\\n                }\\r\\n            });\\r\\n\\r\\n        apiDownload.Download();\\r\\n    }\\r\\n\\r\\n    this.GetStockDataKey=function(jobItem, aryArgs)\\r\\n    {\\r\\n        var key=jobItem.FunctionName;\\r\\n        if (aryArgs.length>0)\\r\\n        {\\r\\n            key+=\\\"(\\\";\\r\\n            for(var i=0;i<aryArgs.length;++i)\\r\\n            {\\r\\n                if (i>0) key+=\\\",\\\";\\r\\n                key+=aryArgs[i].toString();\\r\\n            }\\r\\n            key+=\\\")\\\";\\r\\n        }\\r\\n\\r\\n        return key;\\r\\n    }\\r\\n\\r\\n    this.GetFinValue=function(jobItem)\\r\\n    {\\r\\n        var aryArgs=this.JobArgumentsToArray(jobItem, 1);\\r\\n        var lID=aryArgs[0];\\r\\n        var key=this.GetStockDataKey(jobItem,aryArgs);\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetFinValue', //类名::\\r\\n                    Explain:'财务数据FINVALUE(ID)',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:{ Url:self.StockHistoryDayApiUrl, Type:'POST', Data:{ id:lID, symbol: this.Symbol, daterange:dateRange } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                self.RecvStockValue(recvData,jobItem,key,0);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        var apiDownload=new DownloadFinValueData(\\r\\n            {\\r\\n                Job:jobItem,\\r\\n                Symbol:this.Symbol,\\r\\n                Url:this.StockHistoryDayApiUrl,\\r\\n                Args:aryArgs,\\r\\n                DataKey:key,\\r\\n                Callback:function(recvData, jobItem, key)\\r\\n                {\\r\\n                    self.RecvStockValue(recvData, jobItem, key,0);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                ErrorCallback:function(strError)\\r\\n                {\\r\\n                    self.AddStockValueError(key,strError);\\r\\n                }\\r\\n            });\\r\\n\\r\\n        apiDownload.Download();\\r\\n    }\\r\\n\\r\\n    this.GetFinance=function(jobItem)\\r\\n    {\\r\\n        var aryArgs=this.JobArgumentsToArray(jobItem, 1);\\r\\n        var lID=aryArgs[0];\\r\\n        var key=this.GetStockDataKey(jobItem,aryArgs);\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetFinance', //类名::\\r\\n                    Explain:'财务数据FINANCE(ID)',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:{ Url:self.RealtimeApiUrl, Type:'POST', Data:{ id:lID, symbol: this.Symbol, daterange:dateRange } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                self.RecvStockValue(recvData,jobItem,key,0);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        var apiDownload=new DownloadFinanceData(\\r\\n            {\\r\\n                Job:jobItem,\\r\\n                Symbol:this.Symbol,\\r\\n                Url:this.StockHistoryDayApiUrl,\\r\\n                RealtimeUrl:this.RealtimeApiUrl,\\r\\n                Args:aryArgs,\\r\\n                DataKey:key,\\r\\n                Callback:function(recvData, jobItem, key)\\r\\n                {\\r\\n                    self.RecvStockValue(recvData, jobItem, key,0);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                ErrorCallback:function(strError)\\r\\n                {\\r\\n                    self.AddStockValueError(key,strError);\\r\\n                }\\r\\n            });\\r\\n\\r\\n        apiDownload.Download();\\r\\n    }\\r\\n\\r\\n    this.GetGPJYValue=function(jobItem)\\r\\n    {\\r\\n        var aryArgs=this.JobArgumentsToArray(jobItem, 3);\\r\\n        var key=this.GetStockDataKey(jobItem,aryArgs);\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        //TYPE:为1表示做平滑处理,没有数据的周期返回上一周期的值;为0表示不做平滑处理\\r\\n        var dataType=aryArgs[2]==1?0:2;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetGPJYValue', //类名::\\r\\n                    Explain:'股票交易类数据GPJYVALUE(ID,N,TYPE)',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:{ Url:self.StockHistoryDayApiUrl, Type:'POST', Data:{ Args:aryArgs, symbol: this.Symbol, daterange:dateRange } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                self.RecvStockValue(recvData,jobItem,key,dataType);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        var apiDownload=new DownloadGPJYValue(\\r\\n            {\\r\\n                Job:jobItem,\\r\\n                Symbol:this.Symbol,\\r\\n                Url:this.StockHistoryDayApiUrl,\\r\\n                Args:aryArgs,\\r\\n                DataKey:key,\\r\\n                Callback:function(recvData, jobItem, key)\\r\\n                {\\r\\n                    self.RecvStockValue(recvData, jobItem, key,dataType);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                ErrorCallback:function(strError)\\r\\n                {\\r\\n                    self.AddStockValueError(key,strError);\\r\\n                }\\r\\n            });\\r\\n\\r\\n        apiDownload.Download();\\r\\n    }\\r\\n\\r\\n    this.GetSCJYValue=function(jobItem)\\r\\n    {\\r\\n        var aryArgs=this.JobArgumentsToArray(jobItem, 3);\\r\\n        var key=this.GetStockDataKey(jobItem,aryArgs);\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        //TYPE:为1表示做平滑处理,没有数据的周期返回上一周期的值;为0表示不做平滑处理\\r\\n        var dataType=aryArgs[2]==1?0:2;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetSCJYValue', //类名::\\r\\n                    Explain:'股票交易类数据SCJYVALUE(ID,N,TYPE)',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:{ Url:self.StockHistoryDayApiUrl, Type:'POST', Data:{ Args:aryArgs, symbol: this.Symbol, daterange:dateRange } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                self.RecvStockValue(recvData,jobItem,key,dataType);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        var apiDownload=new DownloadSCJYValue(\\r\\n            {\\r\\n                Job:jobItem,\\r\\n                Symbol:this.Symbol,\\r\\n                Url:this.StockHistoryDayApiUrl,\\r\\n                Args:aryArgs,\\r\\n                DataKey:key,\\r\\n                Callback:function(recvData, jobItem, key)\\r\\n                {\\r\\n                    self.RecvStockValue(recvData, jobItem, key,dataType);\\r\\n                    self.Execute.RunNextJob();\\r\\n                },\\r\\n                ErrorCallback:function(strError)\\r\\n                {\\r\\n                    self.AddStockValueError(key,strError);\\r\\n                }\\r\\n            });\\r\\n\\r\\n        apiDownload.Download();\\r\\n    }\\r\\n\\r\\n    this.GetVariantData=function(jobItem)\\r\\n    {\\r\\n        var key=jobItem.VariantName;\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetVariantData', //类名::函数名\\r\\n                    Explain:'变量数据下载',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:{ Url:\\\"www.121287.com\\\", Type:'POST', Data:{ VariantName:jobItem.VariantName, symbol: this.Symbol, daterange:dateRange } },\\r\\n                    Self:this,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                if (recvData.Error)\\r\\n                {\\r\\n                    self.AddStockValueError(key,recvData.Error);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    var dataType=0;\\r\\n                    if (IFrameSplitOperator.IsNumber(recvData.DataType)) dataType=recvData.DataType;\\r\\n                    self.RecvStockValue(recvData.Data,jobItem,key,dataType);\\r\\n                }\\r\\n\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        var errorCallback=function(strError)\\r\\n        {\\r\\n            self.AddStockValueError(key,strError);\\r\\n        };\\r\\n\\r\\n        var apiDownload;\\r\\n        if (jobItem.VariantName==\\\"CAPITAL\\\" || jobItem.VariantName==\\\"TOTALCAPITAL\\\" || jobItem.VariantName==\\\"EXCHANGE\\\")\\r\\n        {\\r\\n            var callback=function(recvData, jobItem, key)\\r\\n            {\\r\\n                self.RecvStockValue(recvData, jobItem, key,0);\\r\\n                self.Execute.RunNextJob();\\r\\n            };\\r\\n\\r\\n            apiDownload=new DownloadFinanceData(\\r\\n                {\\r\\n                    Job:jobItem,\\r\\n                    Symbol:this.Symbol,\\r\\n                    Url:this.StockHistoryDayApiUrl,\\r\\n                    RealtimeUrl:this.RealtimeApiUrl,\\r\\n                    Args:[jobItem.VariantName],\\r\\n                    DataKey:key,\\r\\n                    Callback:callback,\\r\\n                    ErrorCallback:errorCallback\\r\\n                });\\r\\n        }\\r\\n        else if (jobItem.VariantName==\\\"HYBLOCK\\\" || jobItem.VariantName==\\\"DYBLOCK\\\" || jobItem.VariantName==\\\"GNBLOCK\\\")\\r\\n        {\\r\\n            var callback=function(recvData, jobItem, key, dataType)\\r\\n            {\\r\\n                self.RecvStockValue(recvData, jobItem, key, dataType);\\r\\n                self.Execute.RunNextJob();\\r\\n            };\\r\\n\\r\\n            apiDownload=new DownloadGroupData(\\r\\n                {\\r\\n                    Job:jobItem,\\r\\n                    Symbol:this.Symbol,\\r\\n                    Url:this.StockHistoryDayApiUrl,\\r\\n                    RealtimeUrl:this.RealtimeApiUrl,\\r\\n                    Args:[jobItem.VariantName],\\r\\n                    DataKey:key,\\r\\n                    Callback:callback,\\r\\n                    ErrorCallback:errorCallback\\r\\n                });\\r\\n        }\\r\\n        else if (jobItem.VariantName==\\\"INBLOCK\\\")\\r\\n        {\\r\\n            var errorMessage=`${jobItem.VariantName}, 请对接外部数据.`;\\r\\n            this.AddStockValueError(key,errorMessage);\\r\\n            this.Execute.RunNextJob();\\r\\n            return;\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var errorMessage=`不支持变量${jobItem.VariantName}, 请对接外部数据.`;\\r\\n            this.AddStockValueError(key,errorMessage);\\r\\n            this.Execute.RunNextJob();\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        apiDownload.Download();\\r\\n    }\\r\\n\\r\\n    //自定义变量数据下载\\r\\n    this.GetCustomVariantData=function(jobItem)\\r\\n    {\\r\\n        var key=jobItem.VariantName;\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();\\r\\n\\r\\n        var variantInfo=g_JSComplierResource.CustomVariant.Data.get(key);\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetCustomVariantData', //类名::函数名\\r\\n                    Explain:'自定义变量数据下载',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:\\r\\n                        {\\r\\n                            Url:\\\"www.121287.com\\\", Type:'POST',\\r\\n                            Data:{ VariantName:jobItem.VariantName, symbol: this.Symbol, daterange:dateRange, period:this.Period }\\r\\n                        },\\r\\n                    Self:this,\\r\\n                    VariantInfo:variantInfo,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                if (recvData.Error) self.AddStockValueError(key,recvData.Error);\\r\\n                else self.RecvStockValue(recvData.Data,jobItem,key,recvData.DataType);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.AddStockValueError(key, `自定义变量${key}下载失败`);\\r\\n            this.Execute.RunNextJob();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetCustomFunctionData=function(jobItem)\\r\\n    {\\r\\n        var key=jobItem.FunctionName;\\r\\n        var functionInfo=g_JSComplierResource.CustomFunction.Data.get(key);\\r\\n        if (!functionInfo.IsDownload) return this.Execute.RunNextJob();\\r\\n        if (this.StockData.has(key)) return this.Execute.RunNextJob();  //一个函数只能缓存一个数据, 保存多个外部自己保存\\r\\n\\r\\n        var self=this;\\r\\n        if (this.NetworkFilter)\\r\\n        {\\r\\n            var dateRange=this.Data.GetDateRange();\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'JSSymbolData::GetCustomFunctionData', //类名::函数名\\r\\n                    Explain:'自定义函数数据下载',\\r\\n                    JobID:jobItem.ID,\\r\\n                    Request:\\r\\n                        {\\r\\n                            Url:\\\"www.121287.com\\\", Type:'POST',\\r\\n                            Data:\\r\\n                                {\\r\\n                                    FunctionName:jobItem.FunctionName,\\r\\n                                    symbol: this.Symbol, daterange:dateRange,\\r\\n                                    JobItem:jobItem //函数编译信息\\r\\n                                }\\r\\n                        },\\r\\n                    Self:this,\\r\\n                    FunctionInfo:functionInfo,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n            this.NetworkFilter(obj, function(recvData)\\r\\n            {\\r\\n                if (recvData.Error) self.AddStockValueError(key,recvData.Error);\\r\\n                else self.RecvStockValue(recvData.Data,jobItem,key,recvData.DataType);\\r\\n                self.Execute.RunNextJob();\\r\\n            });\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.AddStockValueError(key, `自定义函数${key}下载失败`);\\r\\n            this.Execute.RunNextJob();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvStockValue=function(recvData,jobItem,key,dataType)\\r\\n    {\\r\\n        if (!recvData)\\r\\n        {\\r\\n            JSConsole.Complier.Log(`[JSSymbolData::RecvStockValue] key=${key} data is null`);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        if (dataType==0)\\r\\n        {\\r\\n            if (Array.isArray(recvData))\\r\\n            {\\r\\n                var kdata=this.Data;   //K线\\r\\n                var aryFittingData;\\r\\n                if (ChartData.IsDayPeriod(this.Period,true))\\r\\n                    aryFittingData=kdata.GetFittingFinanceData(recvData);        //数据和主图K线拟合\\r\\n                else if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n                    aryFittingData=kdata.GetMinuteFittingFinanceData(recvData);  //数据和主图K线拟合\\r\\n                else\\r\\n                    return;\\r\\n\\r\\n                var bindData=new ChartData();\\r\\n                bindData.Data=aryFittingData;\\r\\n                var result=bindData.GetValue();\\r\\n\\r\\n                if (key==\\\"EXCHANGE\\\")    //计算换手率=成交量/流通股本*100\\r\\n                {\\r\\n                    for(var i in result)\\r\\n                    {\\r\\n                        var kitem=kdata.Data[i];\\r\\n                        if (IFrameSplitOperator.IsPlusNumber(result[i]))\\r\\n                            result[i]=kitem.Vol/result[i] * 100;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                this.StockData.set(key,{ Data:result });\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                this.StockData.set(key,{ Data:recvData.Value });\\r\\n            }\\r\\n        }\\r\\n        else if (dataType==1)   //单数值\\r\\n        {\\r\\n            this.StockData.set(key,{ Data:recvData.Value });\\r\\n        }\\r\\n        else if (dataType==2)\\r\\n        {\\r\\n            var kdata=this.Data;   //K线\\r\\n            var aryFittingData;\\r\\n            if (ChartData.IsDayPeriod(this.Period,true))\\r\\n                aryFittingData=kdata.GetFittingTradeData(recvData, 0);        //数据和主图K线拟合\\r\\n            else if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n                aryFittingData=kdata.GetMinuteFittingTradeData(recvData, 0);  //数据和主图K线拟合\\r\\n            else if (ChartData.IsTickPeriod(this.Period))\\r\\n                aryFittingData=kdata.GetMinuteFittingTradeData(recvData, 0);  //数据和主图K线拟合\\r\\n            else\\r\\n                return;\\r\\n\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFittingData;\\r\\n            var result=bindData.GetValue();\\r\\n\\r\\n            this.StockData.set(key,{ Data:result });\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.AddStockValueError=function(key, message)\\r\\n    {\\r\\n        this.StockData.set(key,{ Error:message  });\\r\\n    }\\r\\n\\r\\n    this.GetStockCacheData=function(obj)\\r\\n    {\\r\\n        var key;\\r\\n        if (obj.FunctionName)\\r\\n            key=this.GetStockDataKey({FunctionName:obj.FunctionName}, obj.Args);\\r\\n        else if (obj.VariantName)\\r\\n            key=obj.VariantName;\\r\\n        else if (obj.CustomName)\\r\\n            key=obj.CustomName;  //自定义名字\\r\\n        else\\r\\n            return null;\\r\\n\\r\\n        if (!this.StockData.has(key)) return null;\\r\\n        var data=this.StockData.get(key);\\r\\n\\r\\n        if (data.Error) this.Execute.ThrowUnexpectedNode(obj.Node, data.Error);\\r\\n        return data.Data;\\r\\n    }\\r\\n\\r\\n    this.IsInBlock=function(blockName, node)\\r\\n    {\\r\\n        var data=this.GetStockCacheData({ VariantName:\\\"INBLOCK\\\", Node:node });\\r\\n        if (!data) return 0;\\r\\n        var aryBlock=data.split('|');\\r\\n        for(var i=0; i<aryBlock.length; ++i)\\r\\n        {\\r\\n            var item=aryBlock[i];\\r\\n            if (item==blockName) return 1;\\r\\n        }\\r\\n\\r\\n        return 0;\\r\\n    }\\r\\n\\r\\n    this.JobArgumentsToArray=function(job, lCount)\\r\\n    {\\r\\n        var args=job.Args;\\r\\n        if (args.length!=lCount)\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`${job.FunctionName}() Error: argument count error.`);\\r\\n        }\\r\\n\\r\\n        var aryValue=[];\\r\\n        for(var i=0;i<args.length;++i)\\r\\n        {\\r\\n            var item=args[i];\\r\\n            if (IFrameSplitOperator.IsNumber(item))\\r\\n            {\\r\\n                aryValue.push(item);\\r\\n            }\\r\\n            else if (item.Type==Syntax.Literal)\\r\\n            {\\r\\n                aryValue.push(item.Value);\\r\\n            }\\r\\n            else if (item.Type==Syntax.Identifier)  //变量 !!只支持默认的变量值\\r\\n            {\\r\\n                var isFind=false;\\r\\n                for(var j in this.Arguments)\\r\\n                {\\r\\n                    const argItem=this.Arguments[j];\\r\\n                    if (argItem.Name==item.Name)\\r\\n                    {\\r\\n                        aryValue.push(argItem.Value);\\r\\n                        isFind=true;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (!isFind)\\r\\n                {\\r\\n                    var token=job.Token;\\r\\n                    this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`${job.FunctionName}() Error: can't read ${item.Name}`);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return aryValue;\\r\\n    }\\r\\n\\r\\n    this.DownloadCustomAPIData=function(job)\\r\\n    {\\r\\n        if (!this.NetworkFilter) return this.Execute.RunNextJob();\\r\\n\\r\\n        var args=[];\\r\\n        for(var i in job.Args)\\r\\n        {\\r\\n            var item=job.Args[i];\\r\\n            if (item.Type==Syntax.Literal)\\r\\n            {\\r\\n                args.push(item.Value);\\r\\n            }\\r\\n            else if (item.Type==Syntax.Identifier)  //变量 !!只支持默认的变量值\\r\\n            {\\r\\n                var isFind=false;\\r\\n                for(var j in this.Arguments)\\r\\n                {\\r\\n                    const argItem=this.Arguments[j];\\r\\n                    if (argItem.Name==item.Name)\\r\\n                    {\\r\\n                        args.push(argItem.Value);\\r\\n                        isFind=true;\\r\\n                        break;\\r\\n                    }\\r\\n                }\\r\\n\\r\\n                if (!isFind)\\r\\n                {\\r\\n                    var token=job.Token;\\r\\n                    this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`LoadAPIData() Error: can't read ${item.Name}`);\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                return this.Execute.RunNextJob();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var self=this;\\r\\n        var obj=\\r\\n            {\\r\\n                Name:'JSSymbolData::DownloadCustomAPIData', //类名::函数名\\r\\n                Explain:'下载自定义api数据',\\r\\n                Period:this.Period,\\r\\n                Right:this.Right,\\r\\n                Symbol:this.Symbol,\\r\\n                KData:this.Data,        //K线数据\\r\\n                Cache:this.CustomAPIData,\\r\\n                Args:args,\\r\\n                Self:this,\\r\\n                PreventDefault:false\\r\\n            };\\r\\n\\r\\n        this.NetworkFilter(obj, function(data)\\r\\n        {\\r\\n            self.RecvCustomAPIData(data,args);\\r\\n            self.Execute.RunNextJob();\\r\\n        });\\r\\n\\r\\n        if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n\\r\\n        this.Execute.RunNextJob();\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    recvData:\\r\\n    {\\r\\n        Type: 0=集合数据(默认)  1=单列数据\\r\\n        DataType: 0=K线类数据  1=财务类数据\\r\\n    }\\r\\n    */\\r\\n    this.RecvCustomAPIData=function(recvData,args)\\r\\n    {\\r\\n        if (!recvData) return;\\r\\n\\r\\n        if (recvData.Type==1)\\r\\n            this.RecvCustomAPISingleData(recvData,args);\\r\\n        else\\r\\n            this.RecvCustomAPIGroupData(recvData,args);\\r\\n    }\\r\\n\\r\\n    //集合数据\\r\\n    this.RecvCustomAPIGroupData=function(recvData,args)\\r\\n    {\\r\\n        if (!recvData || !recvData.data) return;\\r\\n\\r\\n        var data=recvData.data;\\r\\n        var apiKey=this.GenerateCustomAPIKey(args);\\r\\n        if (ChartData.IsMinutePeriod(this.Period,true)) //分钟 TODO:\\r\\n        {\\r\\n            if (!data.date || !data.time) return;\\r\\n\\r\\n            var date=data.date;\\r\\n            var time=data.time;\\r\\n            for (var key in data)\\r\\n            {\\r\\n                if (key=='date' || key=='time') continue;\\r\\n                var item=data[key];\\r\\n            }\\r\\n        }\\r\\n        else if (ChartData.IsDayPeriod(this.Period,true))\\r\\n        {\\r\\n            if (!data.date) return;\\r\\n\\r\\n            var date=data.date;\\r\\n            var result={ __Type__:\\\"Object\\\" };\\r\\n            for (var key in data)\\r\\n            {\\r\\n                if (key=='date') continue;\\r\\n\\r\\n                var item=data[key];\\r\\n                if (Array.isArray(item))\\r\\n                {\\r\\n                    var value=this.FittingCustomAPIArray(item,date);\\r\\n                    result[key]=value;\\r\\n                }\\r\\n                else if (this.IsNumber(item))\\r\\n                {\\r\\n                    result[key]=item;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            this.CustomAPIData.set(apiKey, result);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //单列数据\\r\\n    this.RecvCustomAPISingleData=function(recvData,args)\\r\\n    {\\r\\n        var data=recvData.data;\\r\\n        var apiKey=this.GenerateCustomAPIKey(args);\\r\\n        if (ChartData.IsMinutePeriod(this.Period,true)) //分钟 TODO:\\r\\n        {\\r\\n            if (!data.date || !data.time) return;\\r\\n\\r\\n            var date=data.date;\\r\\n            var time=data.time;\\r\\n            for (var key in data)\\r\\n            {\\r\\n                if (key=='date' || key=='time') continue;\\r\\n                var item=data[key];\\r\\n            }\\r\\n        }\\r\\n        else if (ChartData.IsDayPeriod(this.Period,true))   //日线\\r\\n        {\\r\\n            if (!data.date) return;\\r\\n\\r\\n            var date=data.date;\\r\\n            var value=data.value;\\r\\n\\r\\n            var result=null;\\r\\n            if (Array.isArray(value))\\r\\n            {\\r\\n                if (recvData.DataType==1) result=this.FittingCustomAPIFinanceArray(value,date);\\r\\n                else result=this.FittingCustomAPIArray(value,date);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result=value;\\r\\n            }\\r\\n\\r\\n            this.CustomAPIData.set(apiKey, result);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //财务数据拟合\\r\\n    this.FittingCustomAPIFinanceArray=function(data, date, time)\\r\\n    {\\r\\n        var kdata=this.Data;   //K线\\r\\n        var arySingleData=[];\\r\\n\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var value=data[i];\\r\\n            var indexItem=new SingleData();\\r\\n            indexItem.Date=date[i];\\r\\n            if (time && i<time.length) indexItem.Time=time[i];\\r\\n            indexItem.Value=value;\\r\\n            arySingleData.push(indexItem);\\r\\n        }\\r\\n\\r\\n        var aryFittingData;\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))\\r\\n            aryFittingData=kdata.GetFittingFinanceData(arySingleData);\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n            aryFittingData=kdata.GetMinuteFittingFinanceData(arySingleData);\\r\\n        else\\r\\n            return null;\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        var result=bindData.GetValue();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //K线类数据拟合\\r\\n    this.FittingCustomAPIArray=function(data,date,time)\\r\\n    {\\r\\n        var kdata=this.Data;   //K线\\r\\n\\r\\n        var arySingleData=[];\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var value=data[i];\\r\\n            var indexItem=new SingleData(); //单列指标数据\\r\\n            indexItem.Date=date[i];\\r\\n            if (time && i<time.length) indexItem.Time=time[i];\\r\\n            indexItem.Value=value;\\r\\n            arySingleData.push(indexItem);\\r\\n        }\\r\\n\\r\\n        var aryFittingData;\\r\\n        if (ChartData.IsDayPeriod(this.Period,true))\\r\\n            aryFittingData=kdata.GetFittingData(arySingleData);        //数据和主图K线拟合\\r\\n        else if (ChartData.IsMinutePeriod(this.Period,true))\\r\\n            aryFittingData=kdata.GetMinuteFittingData(arySingleData);  //数据和主图K线拟合\\r\\n        else\\r\\n            return null;\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        var result=bindData.GetValue();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GenerateCustomAPIKey=function(args)\\r\\n    {\\r\\n        if (args.length<=0) return '__12_EMPTY_ARGS__';\\r\\n\\r\\n        var key='';\\r\\n        for(var i in args)\\r\\n        {\\r\\n            if (key.length>0) key+=','\\r\\n            key+=args[i];\\r\\n        }\\r\\n\\r\\n        return key;\\r\\n    }\\r\\n\\r\\n    this.GetCustomApiData=function(args)\\r\\n    {\\r\\n        var key=this.GenerateCustomAPIKey(args);\\r\\n\\r\\n        if (!this.CustomAPIData.has(key))\\r\\n        {\\r\\n            JSConsole.Complier.Log(`[JSSymbolData::GetCustomApiData] can't find api data key=[${key}]`);\\r\\n            return null;\\r\\n        }\\r\\n\\r\\n        return this.CustomAPIData.get(key);\\r\\n    }\\r\\n\\r\\n    this.ReadArgumentValue=function(item, result)    //读取变量值\\r\\n    {\\r\\n        result.Name=item.Name;\\r\\n        if (item.Type==Syntax.Literal)\\r\\n        {\\r\\n            result.Value=item.Value;\\r\\n            return true;\\r\\n        }\\r\\n\\r\\n        if (item.Type==Syntax.Identifier)\\r\\n        {\\r\\n            var isFind=false;\\r\\n            for(var i in this.Arguments)\\r\\n            {\\r\\n                const argItem=this.Arguments[i];\\r\\n                if (argItem.Name==item.Name)\\r\\n                {\\r\\n                    result.Value=argItem.Value;\\r\\n                    isFind=true;\\r\\n                    return true;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (!isFind)\\r\\n            {\\r\\n                result.Error=`can't read ${item.Name}` ;\\r\\n                return false;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        result.Error=`can't read ${item.Name}, type error.`;\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    //MA.MA1#WEEK\\r\\n    this.ReadIndexFunctionValue=function(item, result)  //返回 {Period:周期, Out:输出变量, Error:, Name:脚本名字 }\\r\\n    {\\r\\n        var indexParam={};\\r\\n        if (typeof(item)=== 'object')\\r\\n        {\\r\\n            if (!this.ReadArgumentValue(item,indexParam))\\r\\n            {\\r\\n                result.Error=indexParam.Error;\\r\\n                return false;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            indexParam.Value=item;\\r\\n        }\\r\\n\\r\\n        var pos=indexParam.Value.indexOf(\\\"\\\\.\\\");\\r\\n        if (pos!=-1)\\r\\n        {\\r\\n            result.Name=indexParam.Value.slice(0, pos);     //名字\\r\\n            var pos2=indexParam.Value.indexOf('#', pos+1);\\r\\n            if (pos2!=-1)\\r\\n            {\\r\\n                result.Out=indexParam.Value.slice(pos+1, pos2); //输出变量\\r\\n                result.Period=indexParam.Value.slice(pos2+1);     //周期\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result.Out=indexParam.Value.slice(pos+1);\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var pos2=indexParam.Value.indexOf('#');\\r\\n            if (pos2!=-1)\\r\\n            {\\r\\n                result.Name=indexParam.Value.slice(0,pos2);\\r\\n                result.Period=indexParam.Value.slice(pos2+1);     //周期\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                result.Name=indexParam.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        const PERIOD_MAP=new Map([\\r\\n            [\\\"DAY\\\",0 ], [\\\"WEEK\\\", 1 ], [\\\"MONTH\\\",2 ], [\\\"SEASON\\\",9 ], [\\\"YEAR\\\", 3], [\\\"HALFYEAR\\\",22], [\\\"WEEK2\\\",21],\\r\\n            [\\\"MIN1\\\", 4], [\\\"MIN5\\\", 5 ], [\\\"MIN15\\\", 6 ], [\\\"MIN30\\\",7 ], [\\\"MIN60\\\", 8 ],\\r\\n\\r\\n            [\\\"DAY2\\\", 40002],[\\\"MULTIDAY\\\",40002],[\\\"DAY3\\\", 40003],[\\\"DAY4\\\", 40004],[\\\"DAY5\\\",40005],\\r\\n            [\\\"DAY6\\\", 40006],[\\\"DAY7\\\", 40007],[\\\"DAY8\\\", 40008],[\\\"DAY9\\\", 40009],[\\\"DAY10\\\",40010],\\r\\n            [\\\"DAY11\\\", 40011],[\\\"DAY12\\\", 40012],[\\\"DAY13\\\", 40013],[\\\"DAY14\\\", 40014],[\\\"DAY15\\\", 40015],\\r\\n        ]);\\r\\n\\r\\n        if (result.Period)\\r\\n        {\\r\\n            if (!PERIOD_MAP.has(result.Period))\\r\\n            {\\r\\n                result.Error=`${result.Period}, 周期错误`;\\r\\n                return false;\\r\\n            }\\r\\n            result.PeriodID=PERIOD_MAP.get(result.Period);\\r\\n        }\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ReadSymbolArgumentValue=function(item, result) //返回{ Value:股票代码, Error:错误信息}\\r\\n    {\\r\\n        var readArgument={};\\r\\n        if (typeof(item)=== 'object')\\r\\n        {\\r\\n            if (!this.ReadArgumentValue(item,readArgument))\\r\\n            {\\r\\n                result.Error=readArgument.Error;\\r\\n                return false;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            readArgument.Value=item;\\r\\n        }\\r\\n\\r\\n        if (readArgument.Value=='') readArgument.Value=this.Symbol; //缺省使用股票代码\\r\\n\\r\\n        //A股后缀小写\\r\\n        if (readArgument.Value.indexOf('.SH')>0) result.Symbol=readArgument.Value.replace('.SH', \\\".sh\\\");\\r\\n        else if (readArgument.Value.indexOf('.SZ')>0) result.Symbol=readArgument.Value.replace('.SZ', \\\".sz\\\");\\r\\n        else result.Symbol=readArgument.Value;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    this.ReadIndexArgumentValue=function(args, result)\\r\\n    {\\r\\n        result.Args=[];\\r\\n        for(var i in result.SytemIndex.Args)    //复制参数\\r\\n        {\\r\\n            var item=result.SytemIndex.Args[i];\\r\\n            result.Args.push({Value:item.Value, Name:item.Name});\\r\\n        }\\r\\n\\r\\n        if (args.length>2 && result.SytemIndex.Args && result.SytemIndex.Args.length>0)\\r\\n        {\\r\\n            for(var i=2, j=0; i<args.length && j<result.SytemIndex.Args.length; ++i, ++j)\\r\\n            {\\r\\n                var readArgument={};\\r\\n                var item=args[i];\\r\\n                if (typeof(item)=== 'object')\\r\\n                {\\r\\n                    if (!this.ReadArgumentValue(item,readArgument))\\r\\n                    {\\r\\n                        result.Error=readArgument.Error;\\r\\n                        return false;\\r\\n                    }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    readArgument.Value=item;\\r\\n                }\\r\\n\\r\\n                result.Args[j].Value=readArgument.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //key= (代码,周期),指标(参数) => 输出\\r\\n    this.GenerateScriptIndexKey=function(indexInfo)\\r\\n    {\\r\\n        var indexParam='';\\r\\n        var args=indexInfo.Args;\\r\\n        for(var i in args)\\r\\n        {\\r\\n            if (indexParam.length>0) indexParam+=',';\\r\\n            var item=args[i];\\r\\n            indexParam+=item.Value.toString();\\r\\n        }\\r\\n\\r\\n        var out=indexInfo.Out ? indexInfo.Out :\\\"ALL\\\";\\r\\n        var key=`(${indexInfo.Symbol},${indexInfo.PeriodID}), ${indexInfo.Name}(${indexParam})=>${out}`;\\r\\n\\r\\n        return key;\\r\\n    }\\r\\n\\r\\n    //TMP2:=KDJ.K#WEEK;\\r\\n    this.CallMemberScriptIndex=function(job)\\r\\n    {\\r\\n        if (job.Member.Object.Type!=Syntax.Identifier ||job.Member.Property.Type!=Syntax.Identifier)\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallMemberScriptIndex() Error: 参数错误`);\\r\\n        }\\r\\n\\r\\n        var objName=job.Member.Object.Name;\\r\\n        var PropertyName=job.Member.Property.Name;\\r\\n        if (PropertyName==\\\"\\\" || PropertyName==null)\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallMemberScriptIndex() Error: ${objName}.${PropertyName} 指标输出变量错误`);\\r\\n        }\\r\\n\\r\\n        if (this.Execute.VarTable.has(objName))\\r\\n        {\\r\\n            var memberValue=this.Execute.VarTable.get(objName);\\r\\n            if (memberValue.hasOwnProperty(PropertyName))\\r\\n            {\\r\\n                JSConsole.Complier.Log(`[JSSymbolData::CallMemberScriptIndex] index data ${objName}.${PropertyName} in cache.`);\\r\\n                return this.Execute.RunNextJob();\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var callInfo=objName+\\\".\\\"+PropertyName;\\r\\n        var indexInfo={ Job:job, PeriodID:this.Period , Symbol:this.Symbol };\\r\\n        if (!this.ReadIndexFunctionValue(callInfo,indexInfo))     //读取指标\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallMemberScriptIndex() Error: '${callInfo}' ${indexInfo.Error}`);\\r\\n        }\\r\\n\\r\\n        var systemIndex=new JSIndexScript();\\r\\n        var systemItem=systemIndex.Get(indexInfo.Name);\\r\\n        if (!systemItem)\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallMemberScriptIndex() Error: '${callInfo}' ${indexInfo.Name} 指标不存在`);\\r\\n        }\\r\\n\\r\\n        if (Array.isArray(systemItem.Args) && systemItem.Args.length>0)\\r\\n        {\\r\\n            indexInfo.Args=[];\\r\\n            for(var i in systemItem.Args)    //复制参数\\r\\n            {\\r\\n                var item=systemItem.Args[i];\\r\\n                indexInfo.Args.push({Value:item.Value, Name:item.Name});\\r\\n            }\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::CallMemberScriptIndex] call script index', indexInfo);\\r\\n\\r\\n        var dateTimeRange=this.Data.GetDateRange();\\r\\n\\r\\n        var option=\\r\\n            {\\r\\n                HQDataType:this.DataType,\\r\\n                Symbol:indexInfo.Symbol,\\r\\n                Name:'',\\r\\n                Right:this.Right,           //复权\\r\\n                Period:indexInfo.PeriodID,  //周期\\r\\n                Data:null,\\r\\n                SourceData:null,\\r\\n                Callback:(outVar,job, symbolData)=> {\\r\\n                    this.RecvMemberScriptIndexData(outVar,job,symbolData);\\r\\n                    this.Execute.RunNextJob();\\r\\n                },\\r\\n                CallbackParam:indexInfo,\\r\\n                Async:true,\\r\\n                MaxRequestDataCount:this.MaxRequestDataCount+30*2,\\r\\n                MaxRequestMinuteDayCount:this.MaxRequestMinuteDayCount+2,\\r\\n                Arguments:indexInfo.Args,\\r\\n                //Condition:this.Condition,\\r\\n                IsBeforeData:this.IsBeforeData,\\r\\n                NetworkFilter:this.NetworkFilter,\\r\\n                KLineRange:dateTimeRange    //K线数据范围\\r\\n            };\\r\\n\\r\\n        //执行脚本\\r\\n        var run=JSComplier.Execute(systemItem.Script,option,(error, indexInfo)=>{this.ExecuteScriptIndexError(error,indexInfo)});\\r\\n\\r\\n    }\\r\\n\\r\\n    //脚本调用\\r\\n    //STKINDI('600000.sh','MA.MA1#WEEK',5,10,20,30,60,120);\\r\\n    //1=股票代码 2=指标名字.输出变量#周期, 3....参数\\r\\n    this.CallScriptIndex=function(job)\\r\\n    {\\r\\n        if (job.Member) return this.CallMemberScriptIndex(job);\\r\\n\\r\\n        if (!job.Args || !(job.Args.length>=2))\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallScriptIndex() Error: ${job.FunctionName} 参数错误`);\\r\\n        }\\r\\n\\r\\n        var indexInfo={ Job:job, PeriodID:this.Period };\\r\\n        if (!this.ReadSymbolArgumentValue(job.Args[0],indexInfo))  //读取代码\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallScriptIndex() Error: ${indexInfo.Error}`);\\r\\n        }\\r\\n\\r\\n        if (!this.ReadIndexFunctionValue(job.Args[1],indexInfo))     //读取指标\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallScriptIndex() Error: ${indexInfo.Error}`);\\r\\n        }\\r\\n\\r\\n        var systemIndex=new JSIndexScript();\\r\\n        var systemItem=systemIndex.Get(indexInfo.Name);\\r\\n        if (!systemItem)\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallScriptIndex() ${indexInfo.Name} 指标不存在`);\\r\\n        }\\r\\n\\r\\n        indexInfo.SytemIndex=systemItem;    //系统指标\\r\\n        if (!this.ReadIndexArgumentValue(job.Args,indexInfo))\\r\\n        {\\r\\n            var token=job.Token;\\r\\n            this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallScriptIndex() ${indexInfo.Name} 指标参数错误 : ${indexInfo.Error} `);\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSSymbolData::CallScriptIndex] call script index', indexInfo);\\r\\n        var DateTimeRange=null;\\r\\n        if (this.Data && this.Data.Data.length>0)\\r\\n        {\\r\\n            var start=this.Data.Data[0];\\r\\n            var end=this.Data.Data[this.Data.Data.length-1];\\r\\n            DateTimeRange=\\r\\n                {\\r\\n                    Start:{Date:start.Date, Time: start.Time},\\r\\n                    End:{Date:end.Date, Time: end.Time},\\r\\n                }\\r\\n        }\\r\\n\\r\\n        var option=\\r\\n            {\\r\\n                HQDataType:this.DataType,\\r\\n                Symbol:indexInfo.Symbol,\\r\\n                Name:'',\\r\\n                Right:this.Right,           //复权\\r\\n                Period:indexInfo.PeriodID,  //周期\\r\\n                Data:null,\\r\\n                SourceData:null,\\r\\n                Callback:(outVar,job, symbolData)=> {\\r\\n                    this.RecvScriptIndexData(outVar,job,symbolData);\\r\\n                    this.Execute.RunNextJob();\\r\\n                },\\r\\n                CallbackParam:indexInfo,\\r\\n                Async:true,\\r\\n                MaxRequestDataCount:this.MaxRequestDataCount+30*2,\\r\\n                MaxRequestMinuteDayCount:this.MaxRequestMinuteDayCount+2,\\r\\n                Arguments:indexInfo.Args,\\r\\n                //Condition:this.Condition,\\r\\n                IsBeforeData:this.IsBeforeData,\\r\\n                NetworkFilter:this.NetworkFilter,\\r\\n                KLineRange:DateTimeRange    //K线数据范围\\r\\n            };\\r\\n\\r\\n        //执行脚本\\r\\n        var run=JSComplier.Execute(indexInfo.SytemIndex.Script,option,(error, indexInfo)=>{this.ExecuteScriptIndexError(error,indexInfo)});\\r\\n    }\\r\\n\\r\\n    this.RecvMemberScriptIndexData=function(outVar,indexInfo,symbolData)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvMemberScriptIndexData] ', outVar, indexInfo, symbolData);\\r\\n        var kLine=symbolData.Data.Data;\\r\\n        var aryOutVar=outVar;\\r\\n        var data=this.Data.FitKLineIndex(kLine,aryOutVar,this.Period,indexInfo.PeriodID);\\r\\n\\r\\n        var member=indexInfo.Job.Member;\\r\\n        var objName=member.Object.Name;\\r\\n        var propertyName=member.Property.Name;\\r\\n\\r\\n        var memberValue={};\\r\\n        if (this.Execute.VarTable.has(objName))\\r\\n            memberValue=this.Execute.VarTable.get(objName);\\r\\n        else\\r\\n            this.Execute.VarTable.set(objName, memberValue);\\r\\n\\r\\n        //保存所有的指标数据, 下面用到了就可以不用算了\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var key=outVar[i].Name;\\r\\n            if (indexInfo.Period) key+='#'+indexInfo.Period;    //带周期的变量\\r\\n            memberValue[key]=data[i].Data;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.RecvScriptIndexData=function(outVar,indexInfo,symbolData)\\r\\n    {\\r\\n        var key=this.GenerateScriptIndexKey(indexInfo);\\r\\n        JSConsole.Complier.Log('[JSSymbolData::RecvScriptIndexData] ', outVar, indexInfo, symbolData, key);\\r\\n\\r\\n        var kLine=symbolData.Data.Data;\\r\\n        var aryOutVar=outVar;\\r\\n        if (indexInfo.Out)\\r\\n        {\\r\\n            for(var i in outVar)\\r\\n            {\\r\\n                var item=outVar[i];\\r\\n                if (item.Name==indexInfo.Out)\\r\\n                {\\r\\n                    aryOutVar=[item];\\r\\n                    break;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            var data=this.Data.FitKLineIndex(kLine,aryOutVar,this.Period,indexInfo.PeriodID);\\r\\n            this.ScriptIndexOutData.set(key,data[0].Data);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var data=this.Data.FitKLineIndex(kLine,aryOutVar,this.Period,indexInfo.PeriodID);\\r\\n            var result={ __Type__:\\\"Object\\\" };\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                result[item.Name]=item.Data;\\r\\n            }\\r\\n            this.ScriptIndexOutData.set(key,result);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ExecuteScriptIndexError=function(error,indexInfo)\\r\\n    {\\r\\n        var token=indexInfo.Job.Token;\\r\\n        this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallScriptIndex() ${indexInfo.Name} 指标执行错误 : ${error} `);\\r\\n    }\\r\\n\\r\\n    this.GetScriptIndexOutData=function(args,node)\\r\\n    {\\r\\n        var indexInfo={ PeriodID:this.Period };\\r\\n        if (!this.ReadSymbolArgumentValue(args[0],indexInfo))  //读取代码\\r\\n            this.Execute.ThrowUnexpectedNode(node,`STKINDI() 股票代码错误: ${indexInfo.Error}`);\\r\\n\\r\\n        if (!this.ReadIndexFunctionValue(args[1],indexInfo))     //读取指标\\r\\n            this.Execute.ThrowUnexpectedNode(node,`STKINDI() 指标错误: ${indexInfo.Error}`);\\r\\n\\r\\n        var systemIndex=new JSIndexScript();\\r\\n        var systemItem=systemIndex.Get(indexInfo.Name);\\r\\n        if (!systemItem)\\r\\n            this.Execute.ThrowUnexpectedNode(node,`STKINDI() 指标错误: ${indexInfo.Name} 指标不存在`);\\r\\n\\r\\n        indexInfo.SytemIndex=systemItem;    //系统指标\\r\\n        if (!this.ReadIndexArgumentValue(args,indexInfo))\\r\\n            this.Execute.ThrowUnexpectedNode(node,`STKINDI()  指标参数错误: ${indexInfo.Error}`);\\r\\n\\r\\n        var key=this.GenerateScriptIndexKey(indexInfo);\\r\\n        if (!this.ScriptIndexOutData.has(key)) return null;\\r\\n\\r\\n        return this.ScriptIndexOutData.get(key);\\r\\n    }\\r\\n\\r\\n    this.JsonDataToHistoryData=function(data)\\r\\n    {\\r\\n        var list = data.data;\\r\\n        var aryDayData=new Array();\\r\\n        var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7;\\r\\n        var up=8,down=9,stop=10,unchanged=11;\\r\\n        for (var i = 0; i < list.length; ++i)\\r\\n        {\\r\\n            var item = new HistoryData();\\r\\n\\r\\n            item.Date = list[i][date];\\r\\n            item.Open = list[i][open];\\r\\n            item.YClose = list[i][yclose];\\r\\n            item.Close = list[i][close];\\r\\n            item.High = list[i][high];\\r\\n            item.Low = list[i][low];\\r\\n            item.Vol = list[i][vol];    //原始单位股\\r\\n            item.Amount = list[i][amount];\\r\\n            //上涨 下跌家数\\r\\n            if (list[i].length>up) item.Up=list[i][up];\\r\\n            if (list[i].length>down) item.Down=list[i][down];\\r\\n            if (list[i].length>stop) item.Stop=list[i][stop];\\r\\n            if (list[i].length>unchanged) item.Unchanged=list[i][unchanged];\\r\\n\\r\\n            if (isNaN(item.Open) || item.Open<=0) continue; //停牌的数据剔除\\r\\n\\r\\n            aryDayData.push(item);\\r\\n        }\\r\\n\\r\\n        return aryDayData;\\r\\n    }\\r\\n\\r\\n    this.JsonDataToMinuteHistoryData=function(data)\\r\\n    {\\r\\n        var list = data.data;\\r\\n        var aryDayData=new Array();\\r\\n        var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8;\\r\\n        for (var i = 0; i < list.length; ++i)\\r\\n        {\\r\\n            let item = new HistoryData();\\r\\n\\r\\n            item.Date = list[i][date];\\r\\n            item.Open = list[i][open];\\r\\n            item.YClose = list[i][yclose];\\r\\n            item.Close = list[i][close];\\r\\n            item.High = list[i][high];\\r\\n            item.Low = list[i][low];\\r\\n            item.Vol = list[i][vol];    //原始单位股\\r\\n            item.Amount = list[i][amount];\\r\\n            item.Time=list[i][time];\\r\\n\\r\\n            // if (isNaN(item.Open) || item.Open<=0) continue; //停牌的数据剔除\\r\\n            aryDayData.push(item);\\r\\n        }\\r\\n\\r\\n        // 无效数据处理\\r\\n        for(let i = 0; i < aryDayData.length; ++i)\\r\\n        {\\r\\n            var minData = aryDayData[i];\\r\\n            if (minData == null) coninue;\\r\\n            if (isNaN(minData.Open) || minData.Open <= 0 || isNaN(minData.High) || minData.High <= 0 || isNaN(minData.Low) || minData.Low <= 0\\r\\n                || isNaN(minData.Close) || minData.Close <= 0 || isNaN(minData.YClose) || minData.YClose <= 0)\\r\\n            {\\r\\n                if (i == 0)\\r\\n                {\\r\\n                    if (minData.YClose > 0)\\r\\n                    {\\r\\n                        minData.Open = minData.YClose;\\r\\n                        minData.High = minData.YClose;\\r\\n                        minData.Low = minData.YClose;\\r\\n                        minData.Close = minData.YClose;\\r\\n                    }\\r\\n                }\\r\\n                else // 用前一个有效数据填充\\r\\n                {\\r\\n                    for(let j = i-1; j >= 0; --j)\\r\\n                    {\\r\\n                        var minData2 = aryDayData[j];\\r\\n                        if (minData2 == null) coninue;\\r\\n                        if (minData2.Open > 0 && minData2.High > 0 && minData2.Low > 0 && minData2.Close > 0)\\r\\n                        {\\r\\n                            if (minData.YClose <= 0) minData.YClose = minData2.Close;\\r\\n                            minData.Open = minData2.Open;\\r\\n                            minData.High = minData2.High;\\r\\n                            minData.Low = minData2.Low;\\r\\n                            minData.Close = minData2.Close;\\r\\n                            break;\\r\\n                        }\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        return aryDayData;\\r\\n    }\\r\\n\\r\\n    //API 返回数据 转化为array[]\\r\\n    this.JsonDataToMinuteData=function(data)\\r\\n    {\\r\\n        var aryMinuteData=new Array();\\r\\n        for(var i in data.stock[0].minute)\\r\\n        {\\r\\n            var jsData=data.stock[0].minute[i];\\r\\n            var item=new MinuteData();\\r\\n\\r\\n            item.Close=jsData.price;\\r\\n            item.Open=jsData.open;\\r\\n            item.High=jsData.high;\\r\\n            item.Low=jsData.low;\\r\\n            item.Vol=jsData.vol; //股\\r\\n            item.Amount=jsData.amount;\\r\\n            if (i==0)      //第1个数据 写死9：25\\r\\n                item.DateTime=data.stock[0].date.toString()+\\\" 0925\\\";\\r\\n            else\\r\\n                item.DateTime=data.stock[0].date.toString()+\\\" \\\"+jsData.time.toString();\\r\\n            item.Date=data.stock[0].date;\\r\\n            item.Time=jsData.time;\\r\\n            item.Increase=jsData.increase;\\r\\n            item.Risefall=jsData.risefall;\\r\\n            item.AvPrice=jsData.avprice;\\r\\n\\r\\n            aryMinuteData[i]=item;\\r\\n        }\\r\\n\\r\\n        return aryMinuteData;\\r\\n    }\\r\\n\\r\\n    //多日日线数据API 转化成array[];\\r\\n    this.JsonDataToMultiDayMinuteData=function(data)\\r\\n    {\\r\\n        var symbol=data.symbol;\\r\\n        var upperSymbol=symbol.toUpperCase();\\r\\n        var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);\\r\\n        var isFutures=MARKET_SUFFIX_NAME.IsChinaFutures(upperSymbol);\\r\\n        var result=[];\\r\\n        for(var i in data.data)\\r\\n        {\\r\\n            var minuteData=[];\\r\\n            var dayData=data.data[i];\\r\\n            var date=dayData.date;\\r\\n            var yClose=dayData.yclose;  //前收盘 计算涨幅\\r\\n            var preClose=yClose;        //前一个数据价格\\r\\n            var preAvPrice=null;           //上一个均价\\r\\n            //var preAvPrice=data.stock[0].yclose;    //前一个均价\\r\\n            for(var j in dayData.minute)\\r\\n            {\\r\\n                var jsData=dayData.minute[j];\\r\\n                if (jsData[2]) preClose=jsData[2];  //保存上一个收盘数据\\r\\n                var item=new MinuteData();\\r\\n                item.Close=jsData[2];\\r\\n                item.Open=jsData[1];\\r\\n                item.High=jsData[3];\\r\\n                item.Low=jsData[4];\\r\\n                item.Vol=jsData[5]/100; //原始单位股\\r\\n                item.Amount=jsData[6];\\r\\n                if (7<jsData.length && jsData[7]>0)\\r\\n                {\\r\\n                    item.AvPrice=jsData[7];    //均价\\r\\n                    preAvPrice=jsData[7];\\r\\n                }\\r\\n                item.DateTime=date.toString()+\\\" \\\"+jsData[0].toString();\\r\\n                item.Date=date\\r\\n                item.Time=jsData[0];\\r\\n\\r\\n                if (!item.Close)    //当前没有价格 使用上一个价格填充\\r\\n                {\\r\\n                    item.Close=preClose;\\r\\n                    item.Open=item.High=item.Low=item.Close;\\r\\n                }\\r\\n\\r\\n                if (!item.AvPrice && preAvPrice) item.AvPrice=preAvPrice;\\r\\n\\r\\n                if (item.Close && yClose) item.Increase = (item.Close - yClose)/yClose*100;\\r\\n                else item.Increase=null;\\r\\n                if (j==0)      //第1个数据 写死9：25\\r\\n                {\\r\\n                    if (isSHSZ) item.DateTime=date.toString()+\\\" 0925\\\";\\r\\n                    item.IsFristData=true;\\r\\n                }\\r\\n\\r\\n                //价格是0的 都用空\\r\\n                if (item.Open<=0) item.Open=null;\\r\\n                if (item.Close<=0) item.Close=null;\\r\\n                if (item.AvPrice<=0) item.AvPrice=null;\\r\\n                if (item.High<=0) item.High=null;\\r\\n                if (item.Low<=0) item.Low=null;\\r\\n                if (item.AvPrice<=0) item.AvPrice=null;\\r\\n\\r\\n                minuteData[j]=item;\\r\\n            }\\r\\n\\r\\n            var newData=new ChartData();\\r\\n            newData.Data=minuteData;\\r\\n            newData.YClose=yClose;\\r\\n            newData.Close=dayData.close;\\r\\n            newData.Date=date;\\r\\n\\r\\n            result.push(newData);\\r\\n        }\\r\\n\\r\\n        var minuteData=[];\\r\\n        for(var i=result.length-1; i>=0;--i)\\r\\n        {\\r\\n            var item=result[i];\\r\\n            for(var j in item.Data)\\r\\n            {\\r\\n                minuteData.push(item.Data[j]);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return minuteData;\\r\\n    }\\r\\n\\r\\n    //CODELIKE 模糊股票代码\\r\\n    this.CODELIKE=function(value)\\r\\n    {\\r\\n        if (this.Symbol && this.Symbol.indexOf(value)==0) return 1;\\r\\n        return 0;\\r\\n    }\\r\\n\\r\\n    this.NAMELIKE=function(value)\\r\\n    {\\r\\n        if (this.Name && this.Name.indexOf(value)==0) return 1;\\r\\n        return 0;\\r\\n    }\\r\\n\\r\\n    /*\\r\\n    SETCODE 市场类型\\r\\n    0:深圳 1:上海,47:中金所期货 28:郑州商品 29:大连商品 30:上海商品,27:香港指数 31:香港主板,48:香港创业板...\\r\\n    */\\r\\n    this.SETCODE=function()\\r\\n    {\\r\\n        if (this.Symbol.indexOf('.sh')) return 1;\\r\\n        if (this.Symbol.indexOf('.sz')) return 0;\\r\\n\\r\\n        return 0;\\r\\n    }\\r\\n\\r\\n    this.GetSymbol=function()\\r\\n    {\\r\\n        return this.Symbol;\\r\\n    }\\r\\n\\r\\n    this.GetName=function()\\r\\n    {\\r\\n        return this.Name;\\r\\n    }\\r\\n\\r\\n    this.DATE=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            result[i]=item.Date-19000000;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.YEAR=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (this.IsNumber(item.Date))\\r\\n                result[i]=parseInt(item.Date/10000);\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.DAY=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (this.IsNumber(item.Date))\\r\\n                result[i]=parseInt(item.Date%100);\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.MONTH=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (this.IsNumber(item.Date))\\r\\n                result[i]=parseInt(item.Date%10000/100);\\r\\n            else\\r\\n                result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.TIME=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            if (this.IsNumber(item.Time))\\r\\n                result[i]=item.Time;\\r\\n            else\\r\\n                result[i]=0;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    //星期 1-7\\r\\n    this.WEEK=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        var tempDate=new Date();\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            var item=this.Data.Data[i];\\r\\n            result[i]=null;\\r\\n            if (!this.IsNumber(item.Date)) continue;\\r\\n\\r\\n            var year=parseInt(item.Date/10000);\\r\\n            var month=parseInt(item.Date%10000/100);\\r\\n            var day=item.Date%100;\\r\\n\\r\\n            tempDate.setFullYear(year);\\r\\n            tempDate.setMonth(month-1);\\r\\n            tempDate.setDate(day);\\r\\n\\r\\n            result[i]=tempDate.getDay();\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.REFDATE=function(data,date)\\r\\n    {\\r\\n        var result=null;\\r\\n        var findDate=null;\\r\\n        if (Array.isArray(date))\\r\\n        {\\r\\n            if (date.length>0) findDate=date[date.length-1];\\r\\n        }\\r\\n        else if (this.IsNumber(date))\\r\\n        {\\r\\n            findDate=date;\\r\\n        }\\r\\n\\r\\n        if (findDate==null) return null;\\r\\n        if (findDate<5000000) findDate+=19000000;\\r\\n\\r\\n        var index=null;\\r\\n        for(let i in this.Data.Data)   //查找日期对应的索引\\r\\n        {\\r\\n            if (this.Data.Data[i].Date==findDate)\\r\\n            {\\r\\n                index=parseInt(i);\\r\\n                break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (index==null || index>=data.length) return null;\\r\\n\\r\\n        return data[index];\\r\\n    }\\r\\n\\r\\n    //用法:结果从0到11,依次分别是1/5/15/30/60分钟,日/周/月,多分钟,多日,季,年\\r\\n    this.PERIOD=function()\\r\\n    {\\r\\n        //Period周期 0=日线 1=周线 2=月线 3=年线 9=季线 4=1分钟 5=5分钟 6=15分钟 7=30分钟 8=60分钟\\r\\n        const PERIOD_MAP=[5,6,7,11, 0,1,2,3,4,5, 9];\\r\\n        if (this.Period>=0 && this.Period<=PERIOD_MAP.length-1)\\r\\n            return PERIOD_MAP[this.Period];\\r\\n\\r\\n        return this.Period;\\r\\n    }\\r\\n\\r\\n    this.GetDrawNull=function()\\r\\n    {\\r\\n        var result=[];\\r\\n        if (!this.Data || !this.Data.Data || !this.Data.Data.length) return result;\\r\\n\\r\\n        for(let i in this.Data.Data)\\r\\n        {\\r\\n            result[i]=null;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n//是否有是有效的数字\\r\\nJSSymbolData.prototype.IsNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\nJSSymbolData.prototype.IsDivideNumber=function(value)\\r\\n{\\r\\n    if (value==null) return false;\\r\\n    if (isNaN(value)) return false;\\r\\n    if (value==0) return false;\\r\\n\\r\\n    return true;\\r\\n}\\r\\n\\r\\n\\r\\nJSSymbolData.prototype.JsonDataToFinance=function(data)\\r\\n{\\r\\n    var financeData;\\r\\n\\r\\n    for(let i=1;i<=4;++i)\\r\\n    {\\r\\n        switch(i)\\r\\n        {\\r\\n            case 1:\\r\\n                var finance=data.finance1;\\r\\n                var announcement=data.announcement1;\\r\\n                break;\\r\\n            case 2:\\r\\n                var finance=data.finance2;\\r\\n                var announcement=data.announcement2;\\r\\n                break;\\r\\n            case 3:\\r\\n                var finance=data.finance3;\\r\\n                var announcement=data.announcement3;\\r\\n                break;\\r\\n            case 4:\\r\\n                var finance=data.finance4;\\r\\n                var announcement=data.announcement4;\\r\\n                break;\\r\\n            default:\\r\\n                break;\\r\\n        }\\r\\n\\r\\n        if (!finance || !announcement || !this.IsNumber(announcement.year) || !this.IsNumber(announcement.quarter)) continue;\\r\\n        if (financeData)    //如果存在1天公布多个报告期数据 只取最新的一个公告期数据\\r\\n        {\\r\\n            if (financeData.Announcement.year<announcement.year)\\r\\n                financeData={Date:data.date, Finance:finance, Announcement:announcement};\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            financeData={Date:data.date, Finance:finance, Announcement:announcement};\\r\\n        }\\r\\n\\r\\n    }\\r\\n\\r\\n    return financeData;\\r\\n}\\r\\n\\r\\nvar JS_EXECUTE_DEBUG_LOG=false;\\r\\n\\r\\nvar JS_EXECUTE_JOB_ID=\\r\\n    {\\r\\n        JOB_DOWNLOAD_SYMBOL_DATA:1, //下载股票的K线数据\\r\\n        JOB_DOWNLOAD_INDEX_DATA:2,  //下载大盘的K线数据\\r\\n        JOB_DOWNLOAD_SYMBOL_LATEST_DATA:3,  //最新的股票行情数据\\r\\n        JOB_DOWNLOAD_INDEX_INCREASE_DATA:4, //涨跌股票个数统计数据\\r\\n        JOB_DOWNLOAD_VOLR_DATA:5,           //5日量比均量下载量比数据\\r\\n        JOB_DOWNLOAD_LATEST_INDEX_DATA:8,   //下载最新大盘数据\\r\\n        JOB_DOWNLOAD_OTHER_SYMBOL_DATA:9,   //下载其他股票的K线数据\\r\\n        JOB_DOWNLOAD_SYMBOL_PERIOD_DATA:10, //下载周期数据\\r\\n\\r\\n        JOB_DOWNLOAD_FINVALUE:301,                  //引用专业财务数据 FINVALUE(ID),ID为数据编号\\r\\n        JOB_DOWNLOAD_FINONE:302,                    //引用指定年和月日的某类型的财务数据 FINONE(ID,Y,MMDD),ID为数据编号,Y和MMDD表示年和月日.\\r\\n        JOB_DOWNLOAD_FINANCE:303,                   //FINANCE(ID) 基础财务数据\\r\\n        JOB_DOWNLOAD_GPJYVALUE:304,                 //引用股票交易类数据 GPJYVALUE(ID,N,TYPE),ID为数据编号,N表示第几个数据,TYPE:为1表示做平滑处理,没有数据的周期返回上一周期的值;为0表示不做平滑处理\\r\\n        JOB_DOWNLOAD_VARIANT:305,                   //CAPITAL , TOTALCAPITAL, EXCHANGE\\r\\n        JOB_DOWNLOAD_SCJYVALUE:306,                 //引用市场总的交易类数据.SCJYVALUE(ID,N,TYPE),ID为数据编号,N表示第几个数据,TYPE:为1表示做平滑处理,没有数据的周期返回上一周期的值;为0表示不做平滑处理\\r\\n\\r\\n\\r\\n\\r\\n        JOB_DOWNLOAD_MARGIN_BALANCE:1000,           //融资融券余额\\r\\n        JOB_DOWNLOAD_MARGIN_RATE:1001,              //融资占比\\r\\n\\r\\n        JOB_DOWNLOAD_MARGIN_BUY_BALANCE:1010,       //买入信息-融资余额\\r\\n        JOB_DOWNLOAD_MARGIN_BUY_AMOUNT:1011,        //买入信息-买入额\\r\\n        JOB_DOWNLOAD_MARGIN_BUY_REPAY:1012,         //买入信息-偿还额\\r\\n        JOB_DOWNLOAD_MARGIN_BUY_NET:1013,           //买入信息-融资净买入\\r\\n\\r\\n        JOB_DOWNLOAD_MARGIN_SELL_BALANCE:1020,      //卖出信息-融券余量\\r\\n        JOB_DOWNLOAD_MARGIN_SELL_VOLUME:1021,       //卖出信息-卖出量\\r\\n        JOB_DOWNLOAD_MARGIN_SELL_REPAY:1022,        //卖出信息-偿还量\\r\\n        JOB_DOWNLOAD_MARGIN_SELL_NET:1023,          //卖出信息-融券净卖出\\r\\n\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_NEGATIVE:2000,             //负面新闻统计\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_RESEARCH:2001,             //机构调研\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_INTERACT:2002,             //互动易\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE:2003,         //股东增持\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2:2004,        //股东减持\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_TRUSTHOLDER:2005,          //信托持股\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_BLOCKTRADING:2006,         //大宗交易\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_COMPANYNEWS:2007,          //官网新闻\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_TOPMANAGERS:2008,          //高管要闻\\r\\n        JOB_DOWNLOAD_NEWS_ANALYSIS_PLEDGE:2009,               //股权质押\\r\\n\\r\\n        JOB_DOWNLOAD_HK_TO_SH:2050,      //北上流入上证\\r\\n        JOB_DOWNLOAD_HK_TO_SZ:2051,      //北上流入深证\\r\\n        JOB_DOWNLOAD_HK_TO_SH_SZ:2052,   //北上流总的\\r\\n\\r\\n        JOB_DOWNLOAD_HK_TO_SHSZ:2053,   //个股北上流入\\r\\n\\r\\n\\r\\n\\r\\n        JOB_CUSTOM_FUNCTION_DATA:6000,       //自定义函数\\r\\n        JOB_CUSTOM_VARIANT_DATA:6001,        //自定义变量\\r\\n        //截面数据\\r\\n        //财务数据 SF(公告期,数据名称)   如: SF(201901,\\\"流动资产\\\");\\r\\n        JOB_DOWNLOAD_SECTION_SF:20000,\\r\\n\\r\\n        JOB_DOWNLOAD_SECTION_F_01:20001,    //currentassets 流动资产\\r\\n        JOB_DOWNLOAD_SECTION_F_02:20002,    //monetaryfunds 货币资金\\r\\n        JOB_DOWNLOAD_SECTION_F_03:20003,    //inventory 存货\\r\\n        JOB_DOWNLOAD_SECTION_F_04:20004,    //currentliabilities 流动负债\\r\\n        JOB_DOWNLOAD_SECTION_F_05:20005,    //ncurrentliabilities 非流动负债\\r\\n        JOB_DOWNLOAD_SECTION_F_06:20006,    //3expenses 三项费用\\r\\n        JOB_DOWNLOAD_SECTION_F_07:20007,    //investmentincome 投资收益\\r\\n        JOB_DOWNLOAD_SECTION_F_08:20008,    //pcnprofit 归母净利润\\r\\n        JOB_DOWNLOAD_SECTION_F_09:20009,    //nnetprofit 扣非净利润\\r\\n        JOB_DOWNLOAD_SECTION_F_10:20010,    //npersearning 扣非每股收益\\r\\n        JOB_DOWNLOAD_SECTION_F_11:20011,    //woewa 加权平均净资产收益\\r\\n        JOB_DOWNLOAD_SECTION_F_12:20012,    //inprocess 在建工程\\r\\n        JOB_DOWNLOAD_SECTION_F_13:20013,    //accdepreciation 累计折旧\\r\\n        JOB_DOWNLOAD_SECTION_F_14:20014,    //mholderprofit 少数股东利润\\r\\n        JOB_DOWNLOAD_SECTION_F_15:20015,    //lossexchange 汇兑损益\\r\\n        JOB_DOWNLOAD_SECTION_F_16:20016,    //baddebts 坏账计提\\r\\n        JOB_DOWNLOAD_SECTION_F_17:20017,    //fixedassets 固定资产\\r\\n        JOB_DOWNLOAD_SECTION_F_18:20018,    //curdepreciation 当期折旧\\r\\n        JOB_DOWNLOAD_SECTION_F_19:20019,    //orevenues 营业总收入\\r\\n        JOB_DOWNLOAD_SECTION_F_20:20020,    //moprofit 主营业务利润\\r\\n        JOB_DOWNLOAD_SECTION_F_21:20021,    //oprofit 营业利润\\r\\n        JOB_DOWNLOAD_SECTION_F_22:20022,    //nprofit 净利润\\r\\n        JOB_DOWNLOAD_SECTION_F_23:20023,    //areceivable 应收账款\\r\\n        JOB_DOWNLOAD_SECTION_F_24:20024,    //financialcost 财务费用\\r\\n        JOB_DOWNLOAD_SECTION_F_25:20025,    //ccfo 经营性现金流\\r\\n        JOB_DOWNLOAD_SECTION_F_26:20026,    //totalassets 资产总计\\r\\n        JOB_DOWNLOAD_SECTION_F_27:20027,    //totalliabilities 负债总计\\r\\n        JOB_DOWNLOAD_SECTION_F_28:20028,    //totalownersequity 所有者权益总计\\r\\n        JOB_DOWNLOAD_SECTION_F_29:20029,    //grossmargin 毛利率\\r\\n        JOB_DOWNLOAD_SECTION_F_30:20030,    //percreserve 每股资本公积金\\r\\n        JOB_DOWNLOAD_SECTION_F_31:20031,    //peruprofit 每股未分配利润\\r\\n        JOB_DOWNLOAD_SECTION_F_32:20032,    //persearning 每股收益\\r\\n        JOB_DOWNLOAD_SECTION_F_33:20033,    //pernetasset 每股净资产\\r\\n        JOB_DOWNLOAD_SECTION_F_34:20034,    //perccfo 每股经营性现金流\\r\\n        JOB_DOWNLOAD_SECTION_F_35:20035,    //nnprofitincrease finance4特有,扣非净利润涨幅\\r\\n        JOB_DOWNLOAD_SECTION_F_36:20036,    //nnprofitspeed finance4特有,扣非净利润涨速\\r\\n        JOB_DOWNLOAD_SECTION_F_37:20037,    //nprofitincrease finance4特有,净利润涨幅\\r\\n        JOB_DOWNLOAD_SECTION_F_38:20038,    //alratio 资产负债率（数值乘以100）\\r\\n        JOB_DOWNLOAD_SECTION_F_39:20039,    //profityoy 利润同比%（数值乘以100）\\r\\n\\r\\n        JOB_DOWNLOAD_CUSTOM_API_DATA:30000,     //自定义数据\\r\\n\\r\\n        //调用其他脚本指标\\r\\n        //KDJ.K , KDJ.K#WEEK\\r\\n        //STKINDI('600000.sh','MA.MA1#WEEK',5,10,20,30,60,120);\\r\\n        JOB_EXECUTE_INDEX:30010,\\r\\n\\r\\n        JOB_RUN_SCRIPT:10000, //执行脚本\\r\\n\\r\\n        //融资融券\\r\\n        GetMarginJobID:function(value)\\r\\n        {\\r\\n            let dataMap=new Map([\\r\\n                [1,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE],          //MARGIN(1)   融资融券余额\\r\\n                [2,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE],             //MARGIN(2)   融资占比\\r\\n\\r\\n                [3,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE],       //MARGIN(3)   买入信息-融资余额\\r\\n                [4,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT],        //MARGIN(4)   买入信息-买入额\\r\\n                [5,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY],         //MARGIN(5)   买入信息-偿还额\\r\\n                [6,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET],           //MARGIN(6)   买入信息-融资净买入\\r\\n\\r\\n                [7,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE],      //MARGIN(7)   卖出信息-融券余量\\r\\n                [8,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME],       //MARGIN(8)   卖出信息-卖出量\\r\\n                [9,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY],        //MARGIN(9)   卖出信息-偿还量\\r\\n                [10,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET],         //MARGIN(10)  卖出信息-融券净卖出\\r\\n            ]);\\r\\n\\r\\n            if (dataMap.has(value)) return dataMap.get(value);\\r\\n\\r\\n            return null;\\r\\n        },\\r\\n\\r\\n        GetNewsAnalysisID:function(value)\\r\\n        {\\r\\n            let dataMap=new Map([\\r\\n                [1,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_NEGATIVE],          //NEWS(1)   负面新闻统计\\r\\n                [2,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_RESEARCH],          //NEWS(2)   机构调研统计\\r\\n                [3,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_INTERACT],          //NEWS(3)   互动易\\r\\n                [4,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE],      //NEWS(4)   股东增持\\r\\n                [5,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2],     //NEWS(5)   股东减持\\r\\n                [6,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TRUSTHOLDER],       //NEWS(6)   信托持股\\r\\n                [7,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_BLOCKTRADING],      //NEWS(7)   大宗交易\\r\\n                [8,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_COMPANYNEWS],       //NEWS(8)   官网新闻\\r\\n                [9,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TOPMANAGERS],       //NEWS(9)   高管要闻\\r\\n                [10,JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_PLEDGE],           //NEWS(10)  股权质押\\r\\n            ]);\\r\\n\\r\\n            if (dataMap.has(value)) return dataMap.get(value);\\r\\n\\r\\n            return null;\\r\\n        },\\r\\n\\r\\n        //财务截面数据 分报告期\\r\\n        GetSectionFinanceID:function(value)\\r\\n        {\\r\\n            let dataMap=new Map([\\r\\n                ['流动资产', JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_01],\\r\\n                ['货币资金', JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_02],\\r\\n                ['存货', JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_03],\\r\\n                ['流动负债', JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_04],\\r\\n                ['非流动负债',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_05],\\r\\n                ['三项费用',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_06],\\r\\n                ['投资收益',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_07],\\r\\n                ['归母净利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_08],\\r\\n                ['扣非净利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_09],\\r\\n                ['扣非每股收益',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_10],\\r\\n                ['加权平均净资产收益',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_11],\\r\\n                ['在建工程',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_12],\\r\\n                ['累计折旧',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_13],\\r\\n                ['少数股东利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_14],\\r\\n                ['汇兑损益',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_15],\\r\\n                ['坏账计提',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_16],\\r\\n                ['固定资产',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_17],\\r\\n                ['当期折旧',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_18],\\r\\n                ['营业总收入',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_19],\\r\\n                ['主营业务利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_20],\\r\\n                ['营业利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_21],\\r\\n                ['净利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_22],\\r\\n                ['应收账款',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_23],\\r\\n                ['财务费用',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_24],\\r\\n                ['经营性现金流',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_25],\\r\\n                ['资产总计',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_26],\\r\\n                ['负债总计',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_27],\\r\\n                ['所有者权益总计',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_28],\\r\\n                ['毛利率',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_29],\\r\\n                ['每股资本公积金',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_30],\\r\\n                ['每股未分配利润',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_31],\\r\\n                ['每股收益',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_32],\\r\\n                ['每股净资产',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_33],\\r\\n                ['每股经营性现金流',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_34],\\r\\n                ['扣非净利润涨幅',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_35],\\r\\n                ['扣非净利润涨速',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_36],\\r\\n                ['净利润涨幅',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_37],\\r\\n                ['资产负债率',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_38],\\r\\n                ['利润同比',JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_F_39],\\r\\n            ]);\\r\\n\\r\\n            if (dataMap.has(value)) return dataMap.get(value);\\r\\n\\r\\n            return null;\\r\\n        },\\r\\n\\r\\n        //获取报告期 2018, 1\\r\\n        GetSectionReportPeriod:function(year,quarter)\\r\\n        {\\r\\n            if (year>=2000 && quarter>=1 && quarter<=4)\\r\\n                return { Year:year, Quarter:quarter };\\r\\n            return null;\\r\\n        }\\r\\n\\r\\n    };\\r\\n\\r\\nfunction JSExecute(ast,option)\\r\\n{\\r\\n    this.AST=ast;   //语法树\\r\\n\\r\\n    this.ErrorHandler=new ErrorHandler();\\r\\n    this.VarTable=new Map();        //变量表\\r\\n    this.OutVarTable=[];   //输出变量\\r\\n    this.Arguments=[];\\r\\n    this.ErrorCallback;             //执行错误回调\\r\\n\\r\\n    //脚本自动变量表, 只读\\r\\n    this.ConstVarTable=new Map([\\r\\n        //个股数据\\r\\n        ['CLOSE',null],['VOL',null],['OPEN',null],['HIGH',null],['LOW',null],['AMOUNT',null],\\r\\n        ['C',null],['V',null],['O',null],['H',null],['L',null],['AMO',null],\\r\\n        ['VOLR',null],      //量比\\r\\n        ['VOLINSTK',null], [\\\"OPI\\\",null],    //持仓量\\r\\n        [\\\"QHJSJ\\\",null], [\\\"SETTLE\\\",null],    //结算价\\r\\n        [\\\"ZSTJJ\\\",null],     //分时图均价线,对于分时图周期指标有效.\\r\\n        [\\\"ISEQUAL\\\",null], [\\\"ISUP\\\",null],[\\\"ISDOWN\\\"], //ISUP=收阳 ISEQUAL=平盘 ISDOWN=收阴\\r\\n\\r\\n        //日期类\\r\\n        ['DATE',null],['YEAR',null],['MONTH',null],['PERIOD', null],['WEEK',null],[\\\"TIME\\\",null],[\\\"DAY\\\",null],\\r\\n\\r\\n        //大盘数据\\r\\n        ['INDEXA',null],['INDEXC',null],['INDEXH',null],['INDEXL',null],['INDEXO',null],['INDEXV',null],\\r\\n        ['INDEXADV',null],['INDEXDEC',null],\\r\\n\\r\\n        [\\\"ADVANCE\\\",null],['DECLINE', null],\\r\\n\\r\\n        ['FROMOPEN',null],      //已开盘有多长分钟\\r\\n        ['TOTALFZNUM', null],   //该品种的每天的总交易分钟数.\\r\\n\\r\\n        ['CURRBARSCOUNT',null], //到最后交易日的周期数\\r\\n        ['TOTALBARSCOUNT',null],\\r\\n        ['ISLASTBAR',null],     //判断是否为最后一个周期\\r\\n        ['BARSTATUS',null],     //BARSTATUS返回数据位置信息,1表示第一根K线,2表示最后一个数据,0表示中间位置.\\r\\n\\r\\n        ['CAPITAL',null],   //流通股本（手）\\r\\n        [\\\"TOTALCAPITAL\\\",null], //TOTALCAPITAL  当前总股本 手\\r\\n        ['EXCHANGE',null],   //换手率\\r\\n        ['SETCODE', null],  //市场类型\\r\\n        ['CODE',null],      //品种代码\\r\\n        ['STKNAME',null],   //品种名称\\r\\n        [\\\"TQFLAG\\\",null],    //TQFLAG  当前的复权状态,0:无复权 1:前复权 2:后复权\\r\\n\\r\\n        ['HYBLOCK',null],   //所属行业板块\\r\\n        ['DYBLOCK',null],   //所属地域板块\\r\\n        ['GNBLOCK',null],   //所属概念\\r\\n        [\\\"FGBLOCK\\\",null],   //所属风格板块\\r\\n        [\\\"ZSBLOCK\\\",null],   //所属指数板块\\r\\n        [\\\"ZHBLOCK\\\",null],   //所属组合板块\\r\\n        [\\\"ZDBLOCK\\\",null],   //所属自定义板块\\r\\n        [\\\"HYZSCODE\\\",null],\\r\\n\\r\\n        [\\\"GNBLOCKNUM\\\",null],    //所属概念板块的个数\\r\\n        [\\\"FGBLOCKNUM\\\",null],    //所属风格板块的个数\\r\\n        [\\\"ZSBLOCKNUM\\\",null],    //所属指数板块的个数\\r\\n        [\\\"ZHBLOCKNUM\\\",null],    //所属组合板块的个数\\r\\n        [\\\"ZDBLOCKNUM\\\",null],    //所属自定义板块的个数\\r\\n\\r\\n        [\\\"HYSYL\\\",null],         //指数市盈率或个股所属行业的市盈率\\r\\n        [\\\"HYSJL\\\",null],         //指数市净率或个股所属行业的市净率\\r\\n\\r\\n        ['DRAWNULL',null],\\r\\n\\r\\n        [\\\"MACHINEDATE\\\",null],[\\\"MACHINETIME\\\",null],[\\\"MACHINEWEEK\\\",null]\\r\\n\\r\\n    ]);\\r\\n\\r\\n    this.SymbolData=new JSSymbolData(this.AST,option,this);\\r\\n    this.Algorithm=new JSAlgorithm(this.ErrorHandler,this.SymbolData);\\r\\n    this.Draw=new JSDraw(this.ErrorHandler,this.SymbolData);\\r\\n\\r\\n    this.JobList=[];            //执行的任务队列\\r\\n\\r\\n    this.UpdateUICallback=null; //回调\\r\\n    this.CallbackParam=null;\\r\\n    this.IsSectionMode=false;\\r\\n\\r\\n    if (option)\\r\\n    {\\r\\n        if (option.Callback) this.UpdateUICallback=option.Callback;\\r\\n        if (option.CallbackParam) this.CallbackParam=option.CallbackParam;\\r\\n        if (option.Arguments) this.Arguments=option.Arguments;\\r\\n        if (option.IsSectionMode) this.IsSectionMode=option.IsSectionMode;\\r\\n    }\\r\\n\\r\\n    this.Execute=function()\\r\\n    {\\r\\n        this.OutVarTable=[];\\r\\n        this.VarTable=new Map();\\r\\n        JSConsole.Complier.Log('[JSExecute::Execute] Load Arguments', this.Arguments);\\r\\n        for(let i in this.Arguments)    //预定义的变量\\r\\n        {\\r\\n            let item =this.Arguments[i];\\r\\n            this.VarTable.set(item.Name,item.Value);\\r\\n        }\\r\\n\\r\\n        this.RunNextJob();\\r\\n    }\\r\\n\\r\\n    this.RunNextJob=function()\\r\\n    {\\r\\n        if (this.JobList.length<=0) return;\\r\\n\\r\\n        JSConsole.Complier.Log('[JSExecute::Execute] JobList', this.JobList);\\r\\n        var jobItem=this.JobList.shift();\\r\\n\\r\\n        switch(jobItem.ID)\\r\\n        {\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_DATA:\\r\\n                return this.SymbolData.GetSymbolData();\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_PERIOD_DATA:\\r\\n                return this.SymbolData.GetSymbolPeriodData(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_DATA:\\r\\n                return this.SymbolData.GetIndexData();\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_LATEST_INDEX_DATA:\\r\\n                return this.SymbolData.GetLatestIndexData();\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_INDEX_INCREASE_DATA:\\r\\n                return this.SymbolData.GetIndexIncreaseData(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_LATEST_DATA:\\r\\n                return this.SymbolData.GetLatestData(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VOLR_DATA:  //量比\\r\\n                return this.SymbolData.GetVolRateData(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_OTHER_SYMBOL_DATA:  //指定股票数据\\r\\n                return this.SymbolData.GetOtherSymbolData(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_RELEASE_DATE_DATA:\\r\\n                return this.SymbolData.GetCompanyReleaseDate(jobItem.ID);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BALANCE:\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_RATE:\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_BALANCE:       //买入信息-融资余额\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_AMOUNT:        //买入信息-买入额\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_REPAY:         //买入信息-偿还额\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_BUY_NET:           //买入信息-融资净买入\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_BALANCE:      //卖出信息-融券余量\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_VOLUME:       //卖出信息-卖出量\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_REPAY:        //卖出信息-偿还量\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_MARGIN_SELL_NET:          //卖出信息-融券净卖出\\r\\n                return this.SymbolData.GetMarginData(jobItem.ID);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_NEGATIVE:             //负面新闻\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_RESEARCH:             //机构调研\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_INTERACT:             //互动易\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE:         //股东增持\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_HOLDERCHANGE2:        //股东减持\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TRUSTHOLDER:          //信托持股\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_BLOCKTRADING:         //大宗交易\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_COMPANYNEWS:          //官网新闻\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_TOPMANAGERS:          //高管要闻\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_NEWS_ANALYSIS_PLEDGE:               //股权质押\\r\\n                return this.SymbolData.GetNewsAnalysisData(jobItem.ID);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_HK_TO_SHSZ:\\r\\n                return this.SymbolData.GetHKToSHSZData(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SECTION_SF:\\r\\n                return this.SymbolData.GetSectionFinanceData(jobItem);   //财务截面报告数据\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINONE:\\r\\n                return this.SymbolData.GetFinOne(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINVALUE:\\r\\n                return this.SymbolData.GetFinValue(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_FINANCE:\\r\\n                return this.SymbolData.GetFinance(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_GPJYVALUE:\\r\\n                return this.SymbolData.GetGPJYValue(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SCJYVALUE:\\r\\n                return this.SymbolData.GetSCJYValue(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_VARIANT:    //CAPITAL, TOTALCAPITAL\\r\\n                return this.SymbolData.GetVariantData(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_CUSTOM_VARIANT_DATA:\\r\\n                return this.SymbolData.GetCustomVariantData(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_CUSTOM_FUNCTION_DATA:\\r\\n                return this.SymbolData.GetCustomFunctionData(jobItem);\\r\\n\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CUSTOM_API_DATA:\\r\\n                return this.SymbolData.DownloadCustomAPIData(jobItem);\\r\\n            case JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX:\\r\\n                return this.SymbolData.CallScriptIndex(jobItem);\\r\\n\\r\\n            case JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT:\\r\\n                return this.Run();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReadSymbolData=function(name,node)\\r\\n    {\\r\\n        switch(name)\\r\\n        {\\r\\n            case 'CLOSE':\\r\\n            case 'C':\\r\\n            case 'VOL':\\r\\n            case 'V':\\r\\n            case 'OPEN':\\r\\n            case 'O':\\r\\n            case 'HIGH':\\r\\n            case 'H':\\r\\n            case 'LOW':\\r\\n            case 'L':\\r\\n            case 'AMOUNT':\\r\\n            case 'AMO':\\r\\n            case \\\"OPI\\\":\\r\\n            case 'VOLINSTK':\\r\\n            case \\\"SETTLE\\\":\\r\\n            case \\\"QHJSJ\\\":\\r\\n            case \\\"ZSTJJ\\\":\\r\\n            case \\\"ISEQUAL\\\": //平盘\\r\\n            case \\\"ISUP\\\":    //收阳\\r\\n            case \\\"ISDOWN\\\":  //收阴\\r\\n                return this.SymbolData.GetSymbolCacheData(name);\\r\\n            case 'VOLR':\\r\\n                return this.SymbolData.GetVolRateCacheData(node);\\r\\n\\r\\n            //大盘数据\\r\\n            case 'INDEXA':\\r\\n            case 'INDEXC':\\r\\n            case 'INDEXH':\\r\\n            case 'INDEXH':\\r\\n            case 'INDEXO':\\r\\n            case 'INDEXV':\\r\\n            case 'INDEXL':\\r\\n            case 'INDEXADV':\\r\\n            case 'INDEXDEC':\\r\\n                return this.SymbolData.GetIndexCacheData(name);\\r\\n            case 'CURRBARSCOUNT':\\r\\n                return this.SymbolData.GetCurrBarsCount();\\r\\n            case \\\"TOTALBARSCOUNT\\\":\\r\\n                return this.SymbolData.GetTotalBarsCount();\\r\\n            case \\\"TOTALFZNUM\\\":\\r\\n                return this.SymbolData.GetTotalTradeMinuteCount();\\r\\n            case 'ISLASTBAR':\\r\\n                return this.SymbolData.GetIsLastBar();\\r\\n            case \\\"BARSTATUS\\\":\\r\\n                return this.SymbolData.GetBarStatus();\\r\\n\\r\\n            case \\\"TOTALCAPITAL\\\":\\r\\n            case 'CAPITAL':\\r\\n            case 'EXCHANGE':\\r\\n\\r\\n            case \\\"HYBLOCK\\\":\\r\\n            case \\\"DYBLOCK\\\":\\r\\n            case \\\"GNBLOCK\\\":\\r\\n            case \\\"FGBLOCK\\\":\\r\\n            case \\\"ZSBLOCK\\\":\\r\\n            case \\\"ZHBLOCK\\\":\\r\\n            case \\\"ZDBLOCK\\\":\\r\\n            case \\\"HYZSCODE\\\":\\r\\n\\r\\n            case \\\"GNBLOCKNUM\\\":\\r\\n            case \\\"FGBLOCKNUM\\\":\\r\\n            case \\\"ZSBLOCKNUM\\\":\\r\\n            case \\\"ZHBLOCKNUM\\\":\\r\\n            case \\\"ZDBLOCKNUM\\\":\\r\\n\\r\\n            case \\\"HYSYL\\\":\\r\\n            case \\\"HYSJL\\\":\\r\\n                return this.SymbolData.GetStockCacheData({ VariantName:name, Node:node });\\r\\n            case 'SETCODE':\\r\\n                return this.SymbolData.SETCODE();\\r\\n            case 'CODE':\\r\\n                return this.SymbolData.GetSymbol();\\r\\n            case 'STKNAME':\\r\\n                return this.SymbolData.GetName();\\r\\n\\r\\n            case \\\"TIME\\\":\\r\\n                return this.SymbolData.TIME();\\r\\n            case 'DATE':\\r\\n                return this.SymbolData.DATE();\\r\\n            case 'YEAR':\\r\\n                return this.SymbolData.YEAR();\\r\\n            case 'MONTH':\\r\\n                return this.SymbolData.MONTH();\\r\\n            case 'WEEK':\\r\\n                return this.SymbolData.WEEK();\\r\\n            case \\\"DAY\\\":\\r\\n                return this.SymbolData.DAY();\\r\\n            case 'PERIOD':\\r\\n                return this.SymbolData.PERIOD();\\r\\n            case 'FROMOPEN':\\r\\n                return this.SymbolData.GetLatestIndexCacheData('FROMOPEN');\\r\\n\\r\\n            case 'DRAWNULL':\\r\\n                return this.SymbolData.GetDrawNull();\\r\\n\\r\\n            case 'ADVANCE':\\r\\n            case 'DECLINE':\\r\\n                return this.SymbolData.GetIndexIncreaseCacheData(name,this.SymbolData.Symbol,node);\\r\\n\\r\\n            case \\\"TQFLAG\\\":\\r\\n                return this.SymbolData.Right;\\r\\n\\r\\n            case \\\"MACHINEDATE\\\":\\r\\n            {\\r\\n                var now=new Date();\\r\\n                return (now.getFullYear()*10000+(now.getMonth()*1)*100+now.getDate())-19000000;\\r\\n            }\\r\\n            case \\\"MACHINETIME\\\":\\r\\n            {\\r\\n                var now=new Date();\\r\\n                return now.getHours()*10000+(now.getMinutes()*1)*100+now.getSeconds();\\r\\n            }\\r\\n            case \\\"MACHINEWEEK\\\":\\r\\n            {\\r\\n                var now=new Date();\\r\\n                return now.getDay();\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ReadCustomVariant=function(name,node)\\r\\n    {\\r\\n        return this.SymbolData.GetStockCacheData({ VariantName:name, Node:node });\\r\\n    }\\r\\n\\r\\n    //读取变量\\r\\n    this.ReadVariable=function(name,node)\\r\\n    {\\r\\n        if (this.ConstVarTable.has(name))\\r\\n        {\\r\\n            let data=this.ConstVarTable.get(name);\\r\\n\\r\\n            if (data==null) //动态加载,用到再加载\\r\\n            {\\r\\n                data=this.ReadSymbolData(name,node);\\r\\n                this.ConstVarTable.set(name,data);\\r\\n            }\\r\\n\\r\\n            return data;\\r\\n        }\\r\\n\\r\\n        if (g_JSComplierResource.IsCustomVariant(name)) return this.ReadCustomVariant(name,node); //读取自定义变量\\r\\n\\r\\n        if (this.VarTable.has(name)) return this.VarTable.get(name);\\r\\n\\r\\n        if (name.indexOf('#')>0)\\r\\n        {\\r\\n            var aryPeriod=name.split('#');\\r\\n            return this.SymbolData.GetSymbolPeriodCacheData(aryPeriod[0],aryPeriod[1]);\\r\\n        }\\r\\n\\r\\n        this.ThrowUnexpectedNode(node, '变量'+name+'不存在', name);\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.ReadMemberVariable=function(node)\\r\\n    {\\r\\n        var obj=node.Object;\\r\\n        var member=node.Property;\\r\\n\\r\\n        let maiObj;\\r\\n        if (obj.Type==Syntax.BinaryExpression || obj.Type==Syntax.LogicalExpression )\\r\\n            maiObj=this.VisitBinaryExpression(obj);\\r\\n        else if (obj.Type==Syntax.CallExpression)\\r\\n            maiObj=this.VisitCallExpression(obj);\\r\\n        else\\r\\n            maiObj=this.GetNodeValue(obj);\\r\\n\\r\\n        if (!maiObj) return null;\\r\\n        var value=maiObj[member.Name];\\r\\n        if (value) return value;\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    //单数据转成数组 个数和历史数据一致\\r\\n    this.SingleDataToArrayData=function(value)\\r\\n    {\\r\\n        let count=this.SymbolData.Data.Data.length;\\r\\n        let result=[];\\r\\n        for(let i=0;i<count;++i)\\r\\n        {\\r\\n            result[i]=value;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.RunAST=function()\\r\\n    {\\r\\n        if (!this.AST) this.ThrowError();\\r\\n        if (!this.AST.Body) this.ThrowError();\\r\\n\\r\\n        for(let i in this.AST.Body)\\r\\n        {\\r\\n            let item =this.AST.Body[i];\\r\\n            this.VisitNode(item);\\r\\n\\r\\n            //输出变量\\r\\n            if (item.Type==Syntax.ExpressionStatement && item.Expression)\\r\\n            {\\r\\n                if (item.Expression.Type==Syntax.AssignmentExpression)\\r\\n                {\\r\\n                    if (item.Expression.Operator==':' && item.Expression.Left)\\r\\n                    {\\r\\n                        let assignmentItem=item.Expression;\\r\\n                        let varName=assignmentItem.Left.Name;\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        var type=0;\\r\\n                        if (outVar && typeof(outVar)=='object' && outVar.__Type__=='Object')\\r\\n                        {\\r\\n                            type=1000;\\r\\n                        }\\r\\n                        else if (!this.IsSectionMode && !Array.isArray(outVar))\\r\\n                        {\\r\\n                            if (typeof(outVar)=='string')\\r\\n                            {\\r\\n                                var floatValue=parseFloat(outVar);\\r\\n                                if (IFrameSplitOperator.IsNumber(floatValue))\\r\\n                                {\\r\\n                                    outVar=this.SingleDataToArrayData(floatValue);\\r\\n                                }\\r\\n                                else\\r\\n                                {\\r\\n                                    outVar=this.SingleDataToArrayData(outVar);\\r\\n                                    type=1001;\\r\\n                                }\\r\\n\\r\\n                            }\\r\\n                            else outVar=this.SingleDataToArrayData(outVar);\\r\\n                        }\\r\\n\\r\\n                        this.OutVarTable.push({Name:varName, Data:outVar,Type:type});\\r\\n                    }\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.CallExpression)\\r\\n                {\\r\\n                    let callItem=item.Expression;\\r\\n                    if (this.Draw.IsDrawFunction(callItem.Callee.Name))\\r\\n                    {\\r\\n                        let draw=callItem.Draw;\\r\\n                        draw.Name=callItem.Callee.Name;\\r\\n                        this.OutVarTable.push({Name:draw.Name, Draw:draw, Type:1});\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        let outVar=callItem.Out;\\r\\n                        varName=`__temp_c_${callItem.Callee.Name}_${i}__`;\\r\\n                        var type=0;\\r\\n                        if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);\\r\\n                        this.OutVarTable.push({Name:varName, Data:outVar,Type:type,NoneName:true});\\r\\n                    }\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.Identifier)\\r\\n                {\\r\\n                    let varName=item.Expression.Name;\\r\\n                    let outVar=this.ReadVariable(varName,item.Expression);\\r\\n                    var type=0;\\r\\n                    if (outVar && typeof(outVar)=='object' && outVar.__Type__=='Object')\\r\\n                    {\\r\\n                        type=1000;\\r\\n                    }\\r\\n                    else if (!this.IsSectionMode && !Array.isArray(outVar))\\r\\n                    {\\r\\n                        if (typeof(outVar)=='string') outVar=this.SingleDataToArrayData(parseFloat(outVar));\\r\\n                        else outVar=this.SingleDataToArrayData(outVar);\\r\\n                    }\\r\\n\\r\\n                    varName=\\\"__temp_i_\\\"+i+\\\"__\\\";\\r\\n                    this.OutVarTable.push({Name:varName, Data:outVar, Type:type, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.Literal)  //常量\\r\\n                {\\r\\n                    let outVar=item.Expression.Value;\\r\\n                    if (IFrameSplitOperator.IsString(outVar) && outVar.indexOf(\\\"$\\\")>0)\\r\\n                        outVar=this.SymbolData.GetOtherSymolCacheData({ Literal:outVar });\\r\\n                    varName=\\\"__temp_li_\\\"+i+\\\"__\\\";\\r\\n                    var type=0;\\r\\n                    this.OutVarTable.push({Name:varName, Data:outVar, Type:type, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.BinaryExpression)\\r\\n                {\\r\\n                    var varName=\\\"__temp_b_\\\"+i+\\\"__\\\";\\r\\n                    let outVar=item.Expression.Out;\\r\\n                    var type=0;\\r\\n                    if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);\\r\\n                    this.OutVarTable.push({Name:varName, Data:outVar,Type:type, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.LogicalExpression)    //逻辑语句 如 T1 AND T2\\r\\n                {\\r\\n                    var varName=\\\"__temp_l_\\\"+i+\\\"__\\\";\\r\\n                    let outVar=item.Expression.Out;\\r\\n                    var type=0;\\r\\n                    if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);\\r\\n                    this.OutVarTable.push({Name:varName, Data:outVar,Type:type, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.SequenceExpression)\\r\\n                {\\r\\n                    let varName;\\r\\n                    let draw;\\r\\n                    let color;\\r\\n                    let lineWidth;\\r\\n                    let colorStick=false;\\r\\n                    let pointDot=false;\\r\\n                    let circleDot=false;\\r\\n                    let lineStick=false;\\r\\n                    let stick=false;\\r\\n                    let volStick=false;\\r\\n                    let isShow=true;\\r\\n                    let isExData=false;\\r\\n                    let isDotLine=false;\\r\\n                    let isOverlayLine=false;    //叠加线\\r\\n                    var isNoneName=false;\\r\\n                    var isShowTitle=true;\\r\\n                    //显示在位置之上,对于DRAWTEXT和DRAWNUMBER等函数有用,放在语句的最后面(不能与LINETHICK等函数共用),比如:\\r\\n                    //DRAWNUMBER(CLOSE>OPEN,HIGH,CLOSE),DRAWABOVE;\\r\\n                    var isDrawAbove=false;\\r\\n                    var isDrawCenter=false;\\r\\n                    var isDrawBelow=false;\\r\\n                    for(let j in item.Expression.Expression)\\r\\n                    {\\r\\n                        let itemExpression=item.Expression.Expression[j];\\r\\n                        if (itemExpression.Type==Syntax.AssignmentExpression && itemExpression.Operator==':' && itemExpression.Left)\\r\\n                        {\\r\\n                            varName=itemExpression.Left.Name;\\r\\n                            let varValue=this.VarTable.get(varName);\\r\\n                            if (!Array.isArray(varValue))\\r\\n                            {\\r\\n                                varValue=this.SingleDataToArrayData(varValue);\\r\\n                                this.VarTable.set(varName,varValue);            //把常量放到变量表里\\r\\n                            }\\r\\n                        }\\r\\n                        else if (itemExpression.Type==Syntax.Identifier)\\r\\n                        {\\r\\n                            let value=itemExpression.Name;\\r\\n                            if (value==='COLORSTICK') colorStick=true;\\r\\n                            else if (value==='POINTDOT') pointDot=true;\\r\\n                            else if (value==='CIRCLEDOT') circleDot=true;\\r\\n                            else if (value==='DOTLINE') isDotLine=true;\\r\\n                            else if (value==='LINESTICK') lineStick=true;\\r\\n                            else if (value==='STICK') stick=true;\\r\\n                            else if (value==='VOLSTICK') volStick=true;\\r\\n                            else if (value===\\\"DRAWABOVE\\\") isDrawAbove=true;\\r\\n                            else if (value===\\\"DRAWCENTER\\\") isDrawCenter=true;\\r\\n                            else if (value==\\\"DRAWBELOW\\\") isDrawBelow=true;\\r\\n                            else if (value.indexOf('COLOR')==0) color=value;\\r\\n                            else if (value.indexOf('LINETHICK')==0) lineWidth=value;\\r\\n                            else if (value.indexOf('NODRAW')==0) isShow=false;\\r\\n                            else if (value.indexOf('EXDATA')==0) isExData=true; //扩展数据, 不显示再图形里面\\r\\n                            else if (value.indexOf('LINEOVERLAY')==0) isOverlayLine=true;\\r\\n                            else if (value.indexOf(\\\"NOTEXT\\\")==0 || value.indexOf(\\\"NOTITLE\\\")==0) isShowTitle=false; //标题不显示\\r\\n                            else\\r\\n                            {\\r\\n                                varName=itemExpression.Name;\\r\\n                                let varValue=this.ReadVariable(varName,itemExpression);\\r\\n                                if (!Array.isArray(varValue)) varValue=this.SingleDataToArrayData(varValue);\\r\\n                                varName=\\\"__temp_si_\\\"+i+\\\"__\\\";\\r\\n                                isNoneName=true;\\r\\n                                this.VarTable.set(varName,varValue);            //放到变量表里\\r\\n                            }\\r\\n                        }\\r\\n                        else if(itemExpression.Type==Syntax.Literal)    //常量\\r\\n                        {\\r\\n                            let aryValue=this.SingleDataToArrayData(itemExpression.Value);\\r\\n                            varName=itemExpression.Value.toString();\\r\\n                            this.VarTable.set(varName,aryValue);    //把常量放到变量表里\\r\\n                        }\\r\\n                        else if (itemExpression.Type==Syntax.CallExpression)\\r\\n                        {\\r\\n                            if (this.Draw.IsDrawFunction(itemExpression.Callee.Name))\\r\\n                            {\\r\\n                                draw=itemExpression.Draw;\\r\\n                                draw.Name=itemExpression.Callee.Name;\\r\\n                            }\\r\\n                            else\\r\\n                            {\\r\\n                                let varValue=itemExpression.Out;\\r\\n                                varName=`__temp_sc_${itemExpression.Callee.Name}_${i}__`;\\r\\n                                isNoneName=true;\\r\\n                                this.VarTable.set(varName,varValue);\\r\\n                            }\\r\\n                        }\\r\\n                        else if (itemExpression.Type==Syntax.BinaryExpression)\\r\\n                        {\\r\\n                            varName=\\\"__temp_sb_\\\"+i+\\\"__\\\";\\r\\n                            let aryValue=itemExpression.Out;\\r\\n                            isNoneName=true;\\r\\n                            this.VarTable.set(varName,aryValue);\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    if (pointDot && varName)   //圆点\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);\\r\\n                        let value={Name:varName, Data:outVar, Radius:g_JSChartResource.POINTDOT.Radius, Type:3};\\r\\n                        if (color) value.Color=color;\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (circleDot && varName)  //圆点\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);\\r\\n                        let value={Name:varName, Data:outVar, Radius:g_JSChartResource.CIRCLEDOT.Radius, Type:3};\\r\\n                        if (color) value.Color=color;\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (lineStick && varName)  //LINESTICK  同时画出柱状线和指标线\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        let value={Name:varName, Data:outVar, Type:4};\\r\\n                        if (color) value.Color=color;\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (stick && varName)  //STICK 画柱状线\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        let value={Name:varName, Data:outVar, Type:5};\\r\\n                        if (color) value.Color=color;\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (volStick && varName)   //VOLSTICK   画彩色柱状线\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        let value={Name:varName, Data:outVar, Type:6};\\r\\n                        if (color) value.Color=color;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (colorStick && varName)  //CYW: SUM(VAR4,10)/10000, COLORSTICK; 画上下柱子\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        let value={Name:varName, Data:outVar, Color:color, Type:2};\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        if (color) value.Color=color;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (varName && color)\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);\\r\\n                        let value={Name:varName, Data:outVar, Color:color, Type:0};\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        if (isShow == false) value.IsShow = false;\\r\\n                        if (isExData==true) value.IsExData = true;\\r\\n                        if (isDotLine==true) value.IsDotLine=true;\\r\\n                        if (isOverlayLine==true) value.IsOverlayLine=true;\\r\\n                        if (isNoneName==true) value.NoneName=true;\\r\\n                        if (isShowTitle==false) value.IsShowTitle=false;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (draw)  //画图函数\\r\\n                    {\\r\\n                        var outVar={Name:draw.Name, Draw:draw, Type:1};\\r\\n                        if (color) outVar.Color=color;\\r\\n                        if (isDotLine==true) outVar.IsDotLine=true;\\r\\n                        if (lineWidth) outVar.LineWidth=lineWidth;\\r\\n                        if (isDrawAbove) outVar.IsDrawAbove=true;\\r\\n                        if (isDrawCenter) outVar.IsDrawCenter=true;\\r\\n                        if (isDrawBelow) outVar.IsDrawBelow=true;\\r\\n                        this.OutVarTable.push(outVar);\\r\\n                    }\\r\\n                    else if (varName)\\r\\n                    {\\r\\n                        let outVar=this.VarTable.get(varName);\\r\\n                        let value={Name:varName, Data:outVar,Type:0};\\r\\n                        if (color) value.Color=color;\\r\\n                        if (lineWidth) value.LineWidth=lineWidth;\\r\\n                        if (isShow==false) value.IsShow=false;\\r\\n                        if (isExData==true) value.IsExData = true;\\r\\n                        if (isDotLine==true) value.IsDotLine=true;\\r\\n                        if (isOverlayLine==true) value.IsOverlayLine=true;\\r\\n                        if (isShowTitle==false) value.IsShowTitle=false;\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSExecute::Run]', this.VarTable);\\r\\n\\r\\n        return this.OutVarTable;\\r\\n    }\\r\\n\\r\\n    this.Run=function()\\r\\n    {\\r\\n        try\\r\\n        {\\r\\n            let data=this.RunAST();//执行脚本\\r\\n            JSConsole.Complier.Log('[JSComplier.Run] execute finish', data);\\r\\n\\r\\n            if (this.UpdateUICallback)\\r\\n            {\\r\\n                JSConsole.Complier.Log('[JSComplier.Run] invoke UpdateUICallback.');\\r\\n                if (this.CallbackParam && this.CallbackParam.Job && this.CallbackParam.Job.ID==JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX)\\r\\n                {\\r\\n                    this.UpdateUICallback(data,this.CallbackParam, this.SymbolData);\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (this.CallbackParam && this.CallbackParam.Self && this.CallbackParam.Self.ClassName==='ScriptIndexConsole') this.CallbackParam.JSExecute=this;\\r\\n                    this.UpdateUICallback(data,this.CallbackParam);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        catch(error)\\r\\n        {\\r\\n            JSConsole.Complier.Log(error);\\r\\n            if (error.Job)\\r\\n            {\\r\\n                JSConsole.Complier.Log('[JSComplier.Run] download job and reexectue', error.Job);\\r\\n                this.JobList.push(error.Job);\\r\\n                this.JobList.push({ID:JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT});\\r\\n                this.Execute();\\r\\n            }\\r\\n            else if (this.ErrorCallback)\\r\\n            {\\r\\n                this.ErrorCallback(error, this.CallbackParam);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.VisitNode=function(node)\\r\\n    {\\r\\n        switch(node.Type)\\r\\n        {\\r\\n            case Syntax.SequenceExpression:\\r\\n                this.VisitSequenceExpression(node);\\r\\n                break;\\r\\n            case Syntax.ExpressionStatement:\\r\\n                this.VisitNode(node.Expression);\\r\\n                break;\\r\\n            case Syntax.AssignmentExpression:\\r\\n                this.VisitAssignmentExpression(node);\\r\\n                break;\\r\\n            case Syntax.BinaryExpression:\\r\\n            case Syntax.LogicalExpression:\\r\\n                this.VisitBinaryExpression(node);\\r\\n                break;\\r\\n            case Syntax.CallExpression:\\r\\n                this.VisitCallExpression(node);\\r\\n                break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.VisitSequenceExpression=function(node)\\r\\n    {\\r\\n        for(let i in node.Expression)\\r\\n        {\\r\\n            let item =node.Expression[i];\\r\\n            this.VisitNode(item);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //函数调用\\r\\n    this.VisitCallExpression=function(node)\\r\\n    {\\r\\n        let funcName=node.Callee.Name;\\r\\n        let args=[];\\r\\n        for(let i in node.Arguments)\\r\\n        {\\r\\n            let item=node.Arguments[i];\\r\\n            let value;\\r\\n            if (item.Type==Syntax.BinaryExpression || item.Type==Syntax.LogicalExpression)\\r\\n                value=this.VisitBinaryExpression(item);\\r\\n            else if (item.Type==Syntax.CallExpression)\\r\\n                value=this.VisitCallExpression(item);\\r\\n            else\\r\\n                value=this.GetNodeValue(item);\\r\\n            args.push(value);\\r\\n        }\\r\\n\\r\\n        //JSConsole.Complier.Log('[JSExecute::VisitCallExpression]' , funcName, '(', args.toString() ,')');\\r\\n\\r\\n        if (g_JSComplierResource.IsCustomFunction(funcName))\\r\\n        {\\r\\n            var data=this.Algorithm.CallCustomFunction(funcName, args, this.SymbolData, node);\\r\\n            node.Out=[];\\r\\n            node.Draw=null;\\r\\n\\r\\n            if (data)\\r\\n            {\\r\\n                if (data.Out) node.Out=data.Out;\\r\\n                if (data.Draw) node.Draw=data.Draw;\\r\\n            }\\r\\n\\r\\n            return node.Out;\\r\\n        }\\r\\n\\r\\n        switch(funcName)\\r\\n        {\\r\\n            case 'DYNAINFO':    //行情最新数据\\r\\n                node.Out=this.SymbolData.GetLatestCacheData(args[0]);\\r\\n                break;\\r\\n            case 'STICKLINE':\\r\\n                node.Draw=this.Draw.STICKLINE(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWTEXT':\\r\\n                node.Draw=this.Draw.DRAWTEXT(args[0],args[1],args[2]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWTEXT_FIX':\\r\\n                node.Draw=this.Draw.DRAWTEXT_FIX(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'SUPERDRAWTEXT':\\r\\n                node.Draw=this.Draw.SUPERDRAWTEXT(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWICON':\\r\\n                node.Draw=this.Draw.DRAWICON(args[0],args[1],args[2]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWLINE':\\r\\n                node.Draw=this.Draw.DRAWLINE(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=node.Draw.DrawData;\\r\\n                break;\\r\\n            case 'DRAWBAND':\\r\\n                node.Draw=this.Draw.DRAWBAND(args[0],args[1],args[2],args[3]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"FILLRGN\\\":\\r\\n                if (args.length>=4) node.Draw=this.Draw.FILLRGN2(args);\\r\\n                else node.Draw=this.Draw.FILLRGN(args[0],args[1],args[2]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"FLOATRGN\\\":\\r\\n                node.Draw=this.Draw.FLOATRGN(args);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"FILLTOPRGN\\\":\\r\\n                node.Draw=this.Draw.FILLBGRGN(1, args);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"FILLBOTTOMRGN\\\":\\r\\n                node.Draw=this.Draw.FILLBGRGN(0, args);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"FILLVERTICALRGN\\\":\\r\\n                node.Draw=this.Draw.FILLVERTICALRGN(args);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWKLINE':\\r\\n                node.Draw=this.Draw.DRAWKLINE(args[0],args[1],args[2],args[3]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWKLINE_IF':\\r\\n                node.Draw=this.Draw.DRAWKLINE_IF(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'PLOYLINE':\\r\\n            case 'POLYLINE':\\r\\n                node.Draw=this.Draw.POLYLINE(args[0],args[1]);\\r\\n                node.Out=node.Draw.DrawData;\\r\\n                break;\\r\\n            case 'DRAWNUMBER':\\r\\n                node.Draw=this.Draw.DRAWNUMBER(args[0],args[1],args[2]);\\r\\n                node.Out=node.Draw.DrawData.Value;\\r\\n                break;\\r\\n            case \\\"DRAWNUMBER_FIX\\\":\\r\\n                node.Draw=this.Draw.DRAWNUMBER_FIX(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=node.Draw.DrawData.Value;\\r\\n                break;\\r\\n            case \\\"DRAWCHANNEL\\\":\\r\\n                node.Draw=this.Draw.DRAWCHANNEL(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'RGB':\\r\\n                node.Out=this.Draw.RGB(args[0],args[1],args[2]);\\r\\n                break;\\r\\n            case \\\"RGBA\\\":\\r\\n                node.Out=this.Draw.RGBA(args[0],args[1],args[2],args[3]);\\r\\n                break;\\r\\n            case 'PARTLINE':\\r\\n                node.Draw=this.Draw.PARTLINE(args);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWGBK':\\r\\n                node.Draw=this.Draw.DRAWGBK(args[0],args[1],args[2],args[3]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWGBK2':\\r\\n                node.Draw=this.Draw.DRAWGBK2(args[0],args[1],args[2],args[3]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWTEXT_LINE':\\r\\n                node.Draw=this.Draw.DRAWTEXT_LINE(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case 'DRAWRECTREL':\\r\\n                node.Draw=this.Draw.DRAWRECTREL(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"DRAWTEXTREL\\\":\\r\\n                node.Draw=this.Draw.DRAWTEXTREL(args[0],args[1],args[2]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"DRAWTEXTABS\\\":\\r\\n                node.Draw=this.Draw.DRAWTEXTABS(args[0],args[1],args[2]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"DRAWOVERLAYLINE\\\":\\r\\n                node.Draw=this.Draw.DRAWOVERLAYLINE(args[0],args[1],args[2]);\\r\\n                node.Out=node.Draw.DrawData.Data;\\r\\n                break;\\r\\n            case \\\"DRAWSL\\\":\\r\\n                node.Draw=this.Draw.DRAWSL(args[0],args[1],args[2],args[3],args[4]);\\r\\n                node.Out=[];\\r\\n                break;\\r\\n            case \\\"VERTLINE\\\":\\r\\n                node.Draw=this.Draw.VERTLINE(args[0],args[1]);\\r\\n                node.Out=node.Draw.DrawData.Data;\\r\\n                break;\\r\\n            case \\\"HORLINE\\\":\\r\\n                node.Draw=this.Draw.HORLINE(args[0],args[1],args[2],args[3]);\\r\\n                node.Out=node.Draw.DrawData.Data;\\r\\n                break;\\r\\n            case 'CODELIKE':\\r\\n                node.Out=this.SymbolData.CODELIKE(args[0]);\\r\\n                break;\\r\\n            case 'NAMELIKE':\\r\\n            case \\\"NAMEINCLUDE\\\":\\r\\n                node.Out=this.SymbolData.NAMELIKE(args[1]);\\r\\n                break;\\r\\n            case 'REFDATE':\\r\\n                node.Out=this.SymbolData.REFDATE(args[0],args[1]);\\r\\n                break;\\r\\n            case 'FINANCE':\\r\\n                node.Out=this.SymbolData.GetStockCacheData( {FunctionName:funcName, Args:args, ArgCount:1, Node:node } );\\r\\n                break;\\r\\n            case \\\"FINVALUE\\\":\\r\\n                node.Out=this.SymbolData.GetStockCacheData( {FunctionName:funcName, Args:args, ArgCount:1, Node:node } );\\r\\n                break;\\r\\n            case \\\"FINONE\\\":\\r\\n                node.Out=this.SymbolData.GetStockCacheData( {FunctionName:funcName, Args:args, ArgCount:3, Node:node } );\\r\\n                break;\\r\\n            case \\\"GPJYVALUE\\\":\\r\\n                node.Out=this.SymbolData.GetStockCacheData( {FunctionName:funcName, Args:args, ArgCount:3, Node:node } );\\r\\n                break;\\r\\n            case \\\"SCJYVALUE\\\":\\r\\n                node.Out=this.SymbolData.GetStockCacheData( {FunctionName:funcName, Args:args, ArgCount:3, Node:node } );\\r\\n                break;\\r\\n            case \\\"MARGIN\\\":\\r\\n                node.Out=this.SymbolData.GetMarginCacheData(args[0],node);\\r\\n                break;\\r\\n            case \\\"HK2SHSZ\\\":\\r\\n                node.Out=this.SymbolData.GetHKToSHSZCacheData(args[0],node);\\r\\n                break;\\r\\n            case \\\"NEWS\\\":\\r\\n                node.Out=this.SymbolData.GetNewsAnalysisCacheData(args[0],node);\\r\\n                break;\\r\\n            case 'UPCOUNT':\\r\\n            case 'DOWNCOUNT':\\r\\n                node.Out=this.SymbolData.GetIndexIncreaseCacheData(funcName,args[0],node);\\r\\n                break;\\r\\n            case 'SF':\\r\\n                node.Out=this.SymbolData.GetSectionFinanceCacheData(args[0],args[1],args[2],node);\\r\\n                break;\\r\\n            case 'LOADAPIDATA':\\r\\n                node.Out=this.SymbolData.GetCustomApiData(args);\\r\\n                break;\\r\\n            case \\\"STKINDI\\\":\\r\\n                node.Out=this.SymbolData.GetScriptIndexOutData(args,node);\\r\\n                break;\\r\\n            case 'CLOSE':\\r\\n            case 'C':\\r\\n            case 'VOL':\\r\\n            case 'V':\\r\\n            case 'OPEN':\\r\\n            case 'O':\\r\\n            case 'HIGH':\\r\\n            case 'H':\\r\\n            case 'LOW':\\r\\n            case 'L':\\r\\n            case 'AMOUNT':\\r\\n            case 'AMO':\\r\\n                node.Out=this.SymbolData.GetOtherSymolCacheData( {FunctionName:funcName, Args:args} );\\r\\n                break;\\r\\n            case \\\"INBLOCK\\\":\\r\\n                node.Out=this.SymbolData.IsInBlock(args[0],node);\\r\\n                break;\\r\\n\\r\\n            case 'COVER_C':\\r\\n            case 'COVER_O':\\r\\n            case 'COVER_H':\\r\\n            case 'COVER_L':\\r\\n            case 'COVER_A':\\r\\n            case 'COVER_V':\\r\\n                if (args.length==2) return this.SymbolData.GetSymbolPeriodCacheData2(JSComplierHelper.GetConvertValueName(funcName),args[0],args[1]);\\r\\n                return this.SymbolData.GetSymbolPeriodCacheData(JSComplierHelper.GetConvertValueName(funcName),args[0]);\\r\\n\\r\\n            default:\\r\\n                node.Out=this.Algorithm.CallFunction(funcName, args, node, this.SymbolData);\\r\\n                break;\\r\\n        }\\r\\n\\r\\n        return node.Out;\\r\\n    }\\r\\n\\r\\n    //赋值\\r\\n    this.VisitAssignmentExpression=function(node)\\r\\n    {\\r\\n        let left=node.Left;\\r\\n        if (left.Type!=Syntax.Identifier) this.ThrowUnexpectedNode(node);\\r\\n\\r\\n        let varName=left.Name;\\r\\n\\r\\n        let right=node.Right;\\r\\n        let value=null;\\r\\n        if (right.Type==Syntax.BinaryExpression || right.Type==Syntax.LogicalExpression)\\r\\n            value=this.VisitBinaryExpression(right);\\r\\n        else if (right.Type==Syntax.CallExpression)\\r\\n            value=this.VisitCallExpression(right);\\r\\n        else if (right.Type==Syntax.Literal)\\r\\n        {\\r\\n            value=right.Value;\\r\\n            if (IFrameSplitOperator.IsString(value) && right.Value.indexOf(\\\"$\\\")>0)\\r\\n                value=this.SymbolData.GetOtherSymolCacheData( {Literal:value} );\\r\\n        }\\r\\n        else if (right.Type==Syntax.Identifier) //右值是变量\\r\\n            value=this.ReadVariable(right.Name,right);\\r\\n        else if (right.Type==Syntax.MemberExpression)\\r\\n            value=this.ReadMemberVariable(right);\\r\\n        else if (right.Type==Syntax.UnaryExpression)\\r\\n        {\\r\\n            if (right.Operator=='-')\\r\\n            {\\r\\n                var tempValue=this.GetNodeValue(right.Argument);\\r\\n                value=this.Algorithm.Subtract(0,tempValue);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                value=right.Argument.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (JS_EXECUTE_DEBUG_LOG) JSConsole.Complier.Log('[JSExecute::VisitAssignmentExpression]' , varName, ' = ',value);\\r\\n        this.VarTable.set(varName,value);\\r\\n    }\\r\\n\\r\\n    //逻辑运算\\r\\n    this.VisitBinaryExpression=function(node)\\r\\n    {\\r\\n        let stack=[];\\r\\n        stack.push(node);\\r\\n        let temp=null;\\r\\n\\r\\n        while(stack.length!=0)\\r\\n        {\\r\\n            temp=stack[stack.length-1];\\r\\n            if (temp.Left && node!=temp.Left && node!=temp.Right)\\r\\n            {\\r\\n                stack.push(temp.Left);\\r\\n            }\\r\\n            else if (temp.Right && node!=temp.Right)\\r\\n            {\\r\\n                stack.push(temp.Right);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                let value=stack.pop();\\r\\n                if (value.Type==Syntax.BinaryExpression)    //只遍历操作符就可以\\r\\n                {\\r\\n                    let leftValue=this.GetNodeValue(value.Left);\\r\\n                    let rightValue=this.GetNodeValue(value.Right);\\r\\n\\r\\n                    if (JS_EXECUTE_DEBUG_LOG) JSConsole.Complier.Log('[JSExecute::VisitBinaryExpression] BinaryExpression',value , leftValue, rightValue);\\r\\n                    value.Out=null; //保存中间值\\r\\n\\r\\n                    switch(value.Operator)\\r\\n                    {\\r\\n                        case '-':\\r\\n                            value.Out=this.Algorithm.Subtract(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '*':\\r\\n                            value.Out=this.Algorithm.Multiply(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '/':\\r\\n                            value.Out=this.Algorithm.Divide(leftValue,rightValue)\\r\\n                            break;\\r\\n                        case '+':\\r\\n                            value.Out=this.Algorithm.Add(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '>':\\r\\n                            value.Out=this.Algorithm.GT(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '>=':\\r\\n                            value.Out=this.Algorithm.GTE(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '<':\\r\\n                            value.Out=this.Algorithm.LT(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '<=':\\r\\n                            value.Out=this.Algorithm.LTE(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '==':\\r\\n                        case '=':   //= 比较\\r\\n                            value.Out=this.Algorithm.EQ(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '!=':\\r\\n                        case '<>':\\r\\n                            value.Out=this.Algorithm.NEQ(leftValue,rightValue);\\r\\n                            break;\\r\\n                    }\\r\\n\\r\\n                    if (JS_EXECUTE_DEBUG_LOG) JSConsole.Complier.Log('[JSExecute::VisitBinaryExpression] BinaryExpression',value);\\r\\n                }\\r\\n                else if (value.Type==Syntax.LogicalExpression)\\r\\n                {\\r\\n                    let leftValue=this.GetNodeValue(value.Left);\\r\\n                    let rightValue=this.GetNodeValue(value.Right);\\r\\n\\r\\n                    if (JS_EXECUTE_DEBUG_LOG) JSConsole.Complier.Log('[JSExecute::VisitBinaryExpression] LogicalExpression',value , leftValue, rightValue);\\r\\n                    value.Out=null; //保存中间值\\r\\n\\r\\n                    switch(value.Operator)\\r\\n                    {\\r\\n                        case '&&':\\r\\n                        case 'AND':\\r\\n                            value.Out=this.Algorithm.And(leftValue,rightValue);\\r\\n                            break;\\r\\n                        case '||':\\r\\n                        case 'OR':\\r\\n                            value.Out=this.Algorithm.Or(leftValue,rightValue);\\r\\n                            break;\\r\\n                    }\\r\\n\\r\\n                    if (JS_EXECUTE_DEBUG_LOG) JSConsole.Complier.Log('[JSExecute::VisitBinaryExpression] LogicalExpression',value);\\r\\n                }\\r\\n\\r\\n                node=temp;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return node.Out;\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetNodeValue=function(node)\\r\\n    {\\r\\n        switch(node.Type)\\r\\n        {\\r\\n            case Syntax.Literal:    //数字\\r\\n                return node.Value;\\r\\n            case Syntax.UnaryExpression:\\r\\n                if (node.Operator=='-')\\r\\n                {\\r\\n                    let value=this.GetNodeValue(node.Argument);\\r\\n                    return this.Algorithm.Subtract(0,value);\\r\\n                }\\r\\n                return node.Argument.Value;\\r\\n            case Syntax.Identifier:\\r\\n                let value=this.ReadVariable(node.Name,node);\\r\\n                return value;\\r\\n            case Syntax.BinaryExpression:\\r\\n            case Syntax.LogicalExpression:\\r\\n                return node.Out;\\r\\n            case Syntax.CallExpression:\\r\\n                return this.VisitCallExpression(node);\\r\\n            default:\\r\\n                this.ThrowUnexpectedNode(node);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ThrowUnexpectedNode=function(node,message,word)\\r\\n    {\\r\\n        let marker=node.Marker;\\r\\n        let msg=message || \\\"执行异常\\\";\\r\\n\\r\\n        return this.ErrorHandler.ThrowError(marker.Index,marker.Line,marker.Column,msg, word);\\r\\n\\r\\n    }\\r\\n\\r\\n    this.ThrowDownloadSF=function(node,job,message)\\r\\n    {\\r\\n        let marker=node.Marker;\\r\\n        let msg=message;\\r\\n\\r\\n        return this.ErrorHandler.ThrowDownloadJob(marker.Index,marker.Line,marker.Column,msg,job);\\r\\n    }\\r\\n\\r\\n    this.ThrowError=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//脚本说明\\r\\nfunction JSExplainer(ast,option)\\r\\n{\\r\\n    this.AST=ast;\\r\\n    this.ErrorHandler=new ErrorHandler();\\r\\n    this.ErrorCallback;             //执行错误回调\\r\\n    this.UpdateUICallback;\\r\\n    this.CallbackParam;\\r\\n    this.JobList=[];                //执行的任务队列\\r\\n    this.VarTable=new Map();        //变量表\\r\\n    this.OutVarTable=[];            //输出变量\\r\\n\\r\\n    //脚本自动变量表, 只读\\r\\n    this.ConstVarTable=new Map(\\r\\n        [\\r\\n            //个股数据\\r\\n            ['CLOSE',\\\"收盘价\\\"],['VOL',\\\"成交量\\\"],['OPEN',\\\"开盘价\\\"],['HIGH',\\\"最高价\\\"],['LOW',\\\"最低价\\\"],['AMOUNT',\\\"成交量\\\"],\\r\\n            ['C',\\\"收盘价\\\"],['V',\\\"成交量\\\"],['O',\\\"开盘价\\\"],['H',\\\"最高价\\\"],['L',\\\"最低价\\\"],['AMO',\\\"成交量\\\"],\\r\\n            ['VOLR',\\\"量比\\\"], ['VOLINSTK',\\\"持仓量\\\"], [\\\"OPI\\\",\\\"持仓量\\\"], [\\\"ZSTJJ\\\",\\\"均价\\\"], [\\\"QHJSJ\\\",\\\"结算价\\\"], [\\\"SETTLE\\\", \\\"结算价\\\"],\\r\\n\\r\\n            //日期类\\r\\n            ['DATE',\\\"日期\\\"],['YEAR',\\\"年份\\\"],['MONTH',\\\"月份\\\"],['PERIOD', \\\"周期\\\"],['WEEK',\\\"星期\\\"],[\\\"TIME\\\",\\\"时间\\\"],\\r\\n\\r\\n            //大盘数据\\r\\n            ['INDEXA',\\\"大盘成交额\\\"],['INDEXC',\\\"大盘收盘价\\\"],['INDEXH',\\\"大盘最高价\\\"],['INDEXL',\\\"大盘最低价\\\"],['INDEXO',\\\"大盘开盘价\\\"],['INDEXV',\\\"大盘成交量\\\"],\\r\\n            ['INDEXADV',\\\"大盘上涨家数\\\"],['INDEXDEC',\\\"´大盘下跌家数\\\"],\\r\\n\\r\\n            [\\\"ADVANCE\\\",\\\"上涨家数\\\"], ['DECLINE', \\\"下跌家数\\\"],\\r\\n\\r\\n            ['FROMOPEN',\\\"当前离开盘分钟数\\\"],\\r\\n            ['TOTALFZNUM', \\\"总分钟数\\\"],\\r\\n\\r\\n            ['CURRBARSCOUNT',\\\"到最后交易的周期\\\"], //到最后交易日的周期数\\r\\n            ['TOTALBARSCOUNT',\\\"总的周期数\\\"],\\r\\n            ['ISLASTBAR',\\\"是否是最后一个周期\\\"],     //判断是否为最后一个周期\\r\\n            ['BARSTATUS',\\\"数据位置状态\\\"],     //BARSTATUS返回数据位置信息,1表示第一根K线,2表示最后一个数据,0表示中间位置.\\r\\n\\r\\n            ['CAPITAL',\\\"当前流通股本(手)\\\"], [\\\"TOTALCAPITAL\\\",\\\"当前总股本(手)\\\"],\\r\\n            ['EXCHANGE',\\\"换手率\\\"],   //换手率\\r\\n            ['SETCODE', \\\"市场类型\\\"],  //市场类型\\r\\n            ['CODE',\\\"品种代码\\\"],      //品种代码\\r\\n            ['STKNAME',\\\"品种名称\\\"],   //品种名称\\r\\n            [\\\"TQFLAG\\\",\\\"当前复权状态\\\"],    //TQFLAG  当前的复权状态,0:无复权 1:前复权 2:后复权\\r\\n\\r\\n            ['HYBLOCK',\\\"所属行业\\\"],   //所属行业板块\\r\\n            ['DYBLOCK',\\\"所属地域\\\"],   //所属地域板块\\r\\n            ['GNBLOCK',\\\"所属概念\\\"],   //所属概念\\r\\n            [\\\"FGBLOCK\\\",\\\"所属风格板块\\\"],\\r\\n            [\\\"ZSBLOCK\\\",\\\"所属指数板块\\\"],\\r\\n            [\\\"ZHBLOCK\\\",'所属组合板块'],\\r\\n            [\\\"ZDBLOCK\\\",'所属自定义板块'],\\r\\n            [\\\"HYZSCODE\\\",\\\"所属行业的板块指数代码\\\"],\\r\\n\\r\\n            [\\\"GNBLOCKNUM\\\",\\\"所属概念板块的个数\\\"],\\r\\n            [\\\"FGBLOCKNUM\\\",\\\"所属风格板块的个数\\\"],\\r\\n            [\\\"ZSBLOCKNUM\\\",\\\"所属指数板块的个数\\\"],\\r\\n            [\\\"ZHBLOCKNUM\\\",\\\"所属组合板块的个数\\\"],\\r\\n            [\\\"ZDBLOCKNUM\\\",\\\"所属自定义板块的个数\\\"],\\r\\n\\r\\n            [\\\"HYSYL\\\",\\\"指数市盈率或个股所属行业的市盈率\\\"],\\r\\n            [\\\"HYSJL\\\",\\\"指数市净率或个股所属行业的市净率\\\"],\\r\\n\\r\\n            ['DRAWNULL',\\\"无效数据\\\"]\\r\\n\\r\\n        ]);\\r\\n\\r\\n    if (option)\\r\\n    {\\r\\n        if (option.Callback) this.UpdateUICallback=option.Callback;\\r\\n        if (option.CallbackParam) this.CallbackParam=option.CallbackParam;\\r\\n        if (option.Arguments) this.Arguments=option.Arguments;\\r\\n    }\\r\\n\\r\\n    this.Run=function()\\r\\n    {\\r\\n        try\\r\\n        {\\r\\n            this.OutVarTable=[];\\r\\n            this.VarTable=new Map();\\r\\n            JSConsole.Complier.Log('[JSExecute::JSExplainer] Load Arguments', this.Arguments);\\r\\n            for(let i in this.Arguments)    //预定义的变量\\r\\n            {\\r\\n                let item =this.Arguments[i];\\r\\n                this.VarTable.set(item.Name,item.Value);\\r\\n            }\\r\\n\\r\\n            let data=this.RunAST();//执行脚本\\r\\n            JSConsole.Complier.Log('[JSExplainer.Run] explain finish', data);\\r\\n            if (this.UpdateUICallback) //回调发送结果, 可以支持异步\\r\\n            {\\r\\n                JSConsole.Complier.Log('[JSExplainer.Run] invoke UpdateUICallback.');\\r\\n                this.UpdateUICallback(data);\\r\\n            }\\r\\n        }\\r\\n        catch(error)\\r\\n        {\\r\\n            JSConsole.Complier.Log('[JSExplainer.Run] throw error ', error);\\r\\n            if (this.ErrorCallback)\\r\\n            {\\r\\n                this.ErrorCallback(error, this.OutVarTable);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n\\r\\n    this.RunAST=function()\\r\\n    {\\r\\n        if (!this.AST) this.ThrowError();\\r\\n        if (!this.AST.Body) this.ThrowError();\\r\\n\\r\\n        for(let i in this.AST.Body)\\r\\n        {\\r\\n            let item =this.AST.Body[i];\\r\\n            this.VisitNode(item);\\r\\n\\r\\n            //输出变量\\r\\n            if (item.Type==Syntax.ExpressionStatement && item.Expression)\\r\\n            {\\r\\n                if (item.Expression.Type==Syntax.AssignmentExpression)\\r\\n                {\\r\\n                    if (item.Expression.Operator==':' && item.Expression.Left)\\r\\n                    {\\r\\n                        let assignmentItem=item.Expression;\\r\\n                        let varName=assignmentItem.Left.Name;\\r\\n                        let outVar=`输出${varName}: ${this.VarTable.get(varName)}`;\\r\\n                        this.OutVarTable.push({ Name:varName, Data:outVar,Type:0});\\r\\n                    }\\r\\n                    else if (item.Expression.Operator==':=' && item.Expression.Left)\\r\\n                    {\\r\\n                        let assignmentItem=item.Expression;\\r\\n                        let varName=assignmentItem.Left.Name;\\r\\n                        let outVar=`赋值${varName}: ${this.VarTable.get(varName)}`;\\r\\n                        this.OutVarTable.push({ Name:varName, Data:outVar,Type:0, IsOut:false });\\r\\n                    }\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.CallExpression)\\r\\n                {\\r\\n                    let callItem=item.Expression;\\r\\n                    if (this.IsDrawFunction(callItem.Callee.Name))\\r\\n                    {\\r\\n                        let outVar=callItem.Out;\\r\\n                        var drawName=callItem.Callee.Name;\\r\\n                        this.OutVarTable.push({Name:drawName, Draw:`输出: ${outVar}`, Type:1});\\r\\n                    }\\r\\n                    else\\r\\n                    {\\r\\n                        let outVar=callItem.Out;\\r\\n                        varName=`__temp_c_${callItem.Callee.Name}_${i}__`;\\r\\n                        this.OutVarTable.push({Name:varName, Data:`输出: ${outVar}`,Type:0, NoneName:true});\\r\\n                    }\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.Identifier)\\r\\n                {\\r\\n                    let varName=item.Expression.Name;\\r\\n                    let outVar=this.ReadVariable(varName,item.Expression);\\r\\n                    varName=\\\"__temp_i_\\\"+i+\\\"__\\\";\\r\\n                    this.OutVarTable.push({Name:varName, Data:`输出: ${outVar}`, Type:0, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.Literal)  //常量\\r\\n                {\\r\\n                    let outVar=item.Expression.Value;\\r\\n                    if (IFrameSplitOperator.IsString(outVar) && outVar.indexOf(\\\"$\\\")>0)\\r\\n                        outVar=this.GetOtherSymbolExplain({ Literal:outVar }, item);\\r\\n                    varName=\\\"__temp_li_\\\"+i+\\\"__\\\";\\r\\n                    var type=0;\\r\\n                    this.OutVarTable.push({Name:varName, Data:`输出: ${outVar}`, Type:0, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.BinaryExpression) // CLOSE+OPEN;\\r\\n                {\\r\\n                    var varName=\\\"__temp_b_\\\"+i+\\\"__\\\";\\r\\n                    let outVar=item.Expression.Out;\\r\\n                    this.OutVarTable.push({Name:varName, Data:`输出: ${outVar}`,Type:0, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.LogicalExpression)    //逻辑语句 如 T1 AND T2\\r\\n                {\\r\\n                    var varName=\\\"__temp_l_\\\"+i+\\\"__\\\";\\r\\n                    let outVar=item.Expression.Out;\\r\\n                    this.OutVarTable.push({Name:varName, Data:`输出: ${outVar}`,Type:0, NoneName:true});\\r\\n                }\\r\\n                else if (item.Expression.Type==Syntax.SequenceExpression)\\r\\n                {\\r\\n                    let varName;\\r\\n                    let drawName;\\r\\n                    let draw;\\r\\n                    let color;\\r\\n                    let lineWidth;\\r\\n                    let colorStick=false;\\r\\n                    let pointDot=false;\\r\\n                    let circleDot=false;\\r\\n                    let lineStick=false;\\r\\n                    let stick=false;\\r\\n                    let volStick=false;\\r\\n                    let isShow=true;\\r\\n                    let isExData=false;\\r\\n                    let isDotLine=false;\\r\\n                    let isOverlayLine=false;    //叠加线\\r\\n                    var isNoneName=false;\\r\\n                    //显示在位置之上,对于DRAWTEXT和DRAWNUMBER等函数有用,放在语句的最后面(不能与LINETHICK等函数共用),比如:\\r\\n                    //DRAWNUMBER(CLOSE>OPEN,HIGH,CLOSE),DRAWABOVE;\\r\\n                    var isDrawAbove=false;\\r\\n                    for(let j in item.Expression.Expression)\\r\\n                    {\\r\\n                        let itemExpression=item.Expression.Expression[j];\\r\\n                        if (itemExpression.Type==Syntax.AssignmentExpression && itemExpression.Operator==':' && itemExpression.Left)\\r\\n                        {\\r\\n                            varName=itemExpression.Left.Name;\\r\\n                            let varValue=this.VarTable.get(varName);\\r\\n                            this.VarTable.set(varName,varValue);            //把常量放到变量表里\\r\\n                        }\\r\\n                        else if (itemExpression.Type==Syntax.Identifier)\\r\\n                        {\\r\\n                            let value=itemExpression.Name;\\r\\n                            if (value==='COLORSTICK') colorStick=true;\\r\\n                            else if (value==='POINTDOT') pointDot=true;\\r\\n                            else if (value==='CIRCLEDOT') circleDot=true;\\r\\n                            else if (value==='DOTLINE') isDotLine=true;\\r\\n                            else if (value==='LINESTICK') lineStick=true;\\r\\n                            else if (value==='STICK') stick=true;\\r\\n                            else if (value==='VOLSTICK') volStick=true;\\r\\n                            else if (value===\\\"DRAWABOVE\\\") isDrawAbove=true;\\r\\n                            else if (value.indexOf('COLOR')==0) color=value;\\r\\n                            else if (value.indexOf('LINETHICK')==0) lineWidth=value;\\r\\n                            else if (value.indexOf('NODRAW')==0) isShow=false;\\r\\n                            else if (value.indexOf('EXDATA')==0) isExData=true; //扩展数据, 不显示再图形里面\\r\\n                            else if (value.indexOf('LINEOVERLAY')==0) isOverlayLine=true;\\r\\n                            else\\r\\n                            {\\r\\n                                varName=itemExpression.Name;\\r\\n                                let varValue=this.ReadVariable(varName,itemExpression);\\r\\n                                varName=\\\"__temp_si_\\\"+i+\\\"__\\\";\\r\\n                                isNoneName=true;\\r\\n                                this.VarTable.set(varName,varValue);            //放到变量表里\\r\\n                            }\\r\\n                        }\\r\\n                        else if(itemExpression.Type==Syntax.Literal)    //常量\\r\\n                        {\\r\\n                            let aryValue=itemExpression.Value;\\r\\n                            varName=itemExpression.Value.toString();\\r\\n                            isNoneName=true;\\r\\n                            this.VarTable.set(varName,aryValue);    //把常量放到变量表里\\r\\n                        }\\r\\n                        else if (itemExpression.Type==Syntax.CallExpression)\\r\\n                        {\\r\\n                            if (this.IsDrawFunction(itemExpression.Callee.Name))\\r\\n                            {\\r\\n                                draw=itemExpression.Out;\\r\\n                                drawName=itemExpression.Callee.Name;\\r\\n                            }\\r\\n                            else\\r\\n                            {\\r\\n                                let varValue=itemExpression.Out;\\r\\n                                varName=`__temp_sc_${itemExpression.Callee.Name}_${i}__`;\\r\\n                                isNoneName=true;\\r\\n                                this.VarTable.set(varName,varValue);\\r\\n                            }\\r\\n                        }\\r\\n                        else if (itemExpression.Type==Syntax.BinaryExpression)\\r\\n                        {\\r\\n                            varName=\\\"__temp_sb_\\\"+i+\\\"__\\\";\\r\\n                            let aryValue=itemExpression.Out;\\r\\n                            isNoneName=true;\\r\\n                            this.VarTable.set(varName,aryValue);\\r\\n                        }\\r\\n                    }\\r\\n\\r\\n                    var outValue;\\r\\n                    if (draw) outValue=`输出: ${draw}`;\\r\\n                    else if (isNoneName) outValue=`输出: ${this.VarTable.get(varName)}`;\\r\\n                    else outValue=`输出${varName}: ${this.VarTable.get(varName)}`;\\r\\n\\r\\n                    if (color) outValue+=`,颜色${this.GetColorExplain(color)}`;\\r\\n                    if (lineWidth) outValue+=`,线段粗细${this.GetLineWidthExplain(lineWidth)}`;\\r\\n                    if (isShow==false) outValue+=\\\",不显示\\\";\\r\\n                    if (isDotLine==true) outValue+=\\\",画虚线\\\";\\r\\n                    if (isDrawAbove==true) outValue+=',显示在位置之上';\\r\\n\\r\\n                    if (pointDot && varName)   //圆点\\r\\n                    {\\r\\n                        outValue+=\\\",画小圆点线\\\";\\r\\n                        let value={Name:varName, Data:outValue, Radius:g_JSChartResource.POINTDOT.Radius, Type:3};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (circleDot && varName)  //圆点\\r\\n                    {\\r\\n                        outValue+=\\\",画小圆圈线\\\";\\r\\n                        let value={Name:varName, Data:outValue, Radius:g_JSChartResource.CIRCLEDOT.Radius, Type:3};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (lineStick && varName)  //LINESTICK  同时画出柱状线和指标线\\r\\n                    {\\r\\n                        outValue+=\\\",画出柱状线和指标线\\\";\\r\\n                        let value={Name:varName, Data:outValue, Type:4};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (stick && varName)  //STICK 画柱状线\\r\\n                    {\\r\\n                        outValue+=\\\",画柱状线\\\";\\r\\n                        let value={Name:varName, Data:outValue, Type:5};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (volStick && varName)   //VOLSTICK   画彩色柱状线\\r\\n                    {\\r\\n                        outValue+=\\\",画成交量柱状线\\\";\\r\\n                        let value={Name:varName, Data:outValue, Type:6};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (varName && color)\\r\\n                    {\\r\\n                        let value={Name:varName, Data:outValue, Color:color, Type:0};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (draw)  //画图函数\\r\\n                    {\\r\\n                        var outVar={ Name:drawName, Data:outValue, Type:1 };\\r\\n                        this.OutVarTable.push(outVar);\\r\\n                    }\\r\\n                    else if (colorStick && varName)  //CYW: SUM(VAR4,10)/10000, COLORSTICK; 画上下柱子\\r\\n                    {\\r\\n                        outValue+=\\\",画彩色柱状线\\\";\\r\\n                        let value={Name:varName, Data:outValue, Color:color, Type:2};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                    else if (varName)\\r\\n                    {\\r\\n                        let value={Name:varName, Data:outValue,Type:0};\\r\\n                        this.OutVarTable.push(value);\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSExplainer::Run]', this.VarTable);\\r\\n        return this.OutVarTable;\\r\\n    }\\r\\n\\r\\n    this.VisitNode=function(node)\\r\\n    {\\r\\n        switch(node.Type)\\r\\n        {\\r\\n            case Syntax.SequenceExpression:\\r\\n                this.VisitSequenceExpression(node);\\r\\n                break;\\r\\n            case Syntax.ExpressionStatement:\\r\\n                this.VisitNode(node.Expression);\\r\\n                break;\\r\\n            case Syntax.AssignmentExpression:\\r\\n                this.VisitAssignmentExpression(node);\\r\\n                break;\\r\\n            case Syntax.BinaryExpression:\\r\\n            case Syntax.LogicalExpression:\\r\\n                this.VisitBinaryExpression(node);\\r\\n                break;\\r\\n            case Syntax.CallExpression:\\r\\n                this.VisitCallExpression(node);\\r\\n                break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.VisitSequenceExpression=function(node)\\r\\n    {\\r\\n        for(let i in node.Expression)\\r\\n        {\\r\\n            let item =node.Expression[i];\\r\\n            this.VisitNode(item);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //函数调用\\r\\n    this.VisitCallExpression=function(node)\\r\\n    {\\r\\n        let funcName=node.Callee.Name;\\r\\n        let args=[];\\r\\n        for(let i in node.Arguments)\\r\\n        {\\r\\n            let item=node.Arguments[i];\\r\\n            let value;\\r\\n            if (item.Type==Syntax.BinaryExpression || item.Type==Syntax.LogicalExpression)\\r\\n                value=this.VisitBinaryExpression(item);\\r\\n            else if (item.Type==Syntax.CallExpression)\\r\\n                value=this.VisitCallExpression(item);\\r\\n            else\\r\\n                value=this.GetNodeValue(item);\\r\\n            args.push(value);\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSExplainer::VisitCallExpression]' , funcName, '(', args.toString() ,')');\\r\\n\\r\\n        if (g_JSComplierResource.IsCustomFunction(funcName))\\r\\n        {\\r\\n            var data=this.Algorithm.CallCustomFunction(funcName, args, this.SymbolData, node);\\r\\n            node.Out=[];\\r\\n            node.Draw=null;\\r\\n\\r\\n            if (data)\\r\\n            {\\r\\n                if (data.Out) node.Out=data.Out;\\r\\n                if (data.Draw) node.Draw=data.Draw;\\r\\n            }\\r\\n\\r\\n            return node.Out;\\r\\n        }\\r\\n\\r\\n        node.Out=this.CallFunctionExplain(funcName, args, node);\\r\\n        return node.Out;\\r\\n    }\\r\\n\\r\\n    this.FUNCTION_INFO_LIST=new Map(\\r\\n        [\\r\\n            [\\\"REF\\\",     { Name:\\\"REF\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日前的${args[0]}`; } } ],\\r\\n            [\\\"REFX\\\",    { Name:\\\"REFX\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日后的${args[0]}`; } } ],\\r\\n            [\\\"REFV\\\",    { Name:\\\"REFV\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日前的(未作平滑处理)${args[0]}`; } } ],\\r\\n            [\\\"REFXV\\\",   { Name:\\\"REFXV\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日后的(未作平滑处理)${args[0]}`; } } ],\\r\\n\\r\\n            [\\\"REFDATE\\\", { Name:\\\"REFDATE\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日${args[0]}`; } } ],\\r\\n            [\\\"COUNT\\\",   { Name:\\\"COUNT\\\", Param:{ Count:2 }, ToString:function(args) { return `统计${args[1]}日中满足${args[0]}的天数`; } } ],\\r\\n            [\\\"BARSLASTCOUNT\\\", { Name:\\\"BARSLASTCOUNT\\\", Param:{ Count:1 }, ToString:function(args) { return `条件${args[0]}连续成立次数`; } } ],\\r\\n            [\\\"BARSCOUNT\\\",   { Name:\\\"BARSCOUNT\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}有效数据周期数`; } } ],\\r\\n            [\\\"BARSLAST\\\",    { Name:\\\"BARSLAST\\\", Param:{ Count:1 }, ToString:function(args) { return `上次${args[0]}不为0距今天数`; } } ],\\r\\n            [\\\"BARSNEXT\\\",    { Name:\\\"BARSNEXT\\\", Param:{ Count:1 }, ToString:function(args) { return `下次${args[0]}不为0距今天数`; } } ],\\r\\n            [\\\"BARSSINCEN\\\",  { Name:\\\"BARSSINCEN\\\", Param:{ Count:2 }, ToString:function(args) { return `在${args[1]}周期内首次${args[0]}距今天数`; } } ],\\r\\n            [\\\"BARSSINCE\\\",   { Name:\\\"BARSSINCE\\\", Param:{ Count:1 }, ToString:function(args) { return `首次${args[0]}距今天数`; } } ],\\r\\n            [\\\"HHV\\\", { Name:\\\"HHV\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日内${args[0]}的最高值`; } } ],\\r\\n            [\\\"LLV\\\", { Name:\\\"LLV\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日内${args[0]}的最低值`; } } ],\\r\\n\\r\\n            [\\\"HOD\\\", { Name:\\\"HOD\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日内${args[0]}的高值名次`; } } ],\\r\\n            [\\\"LOD\\\", { Name:\\\"LOD\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[1]}日内${args[0]}的低值名次`; } } ],\\r\\n            [\\\"REVERSE\\\", { Name:\\\"REVERSE\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的相反数`; } } ],\\r\\n            [\\\"FILTER\\\", { Name:\\\"FILTER\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日过滤`; } } ],\\r\\n            [\\\"FILTERX\\\", { Name:\\\"FILTERX\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日反向过滤`; } } ],\\r\\n            [\\\"SUMBARS\\\", { Name:\\\"SUMBARS\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}累加至${args[1]}的天数`; } } ],\\r\\n            [\\\"MA\\\", { Name:\\\"MA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日简单移动平均`; } } ],\\r\\n            [\\\"SMA\\\", { Name:\\\"SMA\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}的${args[1]}日[${args[2]}日权重]移动平均`; } } ],\\r\\n            [\\\"MEMA\\\", { Name:\\\"MEMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日平滑移动平均`; } } ],\\r\\n            [\\\"EMA\\\", { Name:\\\"EMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日指数移动平均`; } } ],\\r\\n            [\\\"EXPMA\\\", { Name:\\\"EXPMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日指数移动平均`; } } ],\\r\\n            [\\\"EXPMEMA\\\", { Name:\\\"EXPMEMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日指数平滑移动平均`; } }],\\r\\n            [\\\"WMA\\\", { Name:\\\"WMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日加权移动平均`; } } ],\\r\\n            [\\\"DMA\\\", { Name:\\\"DMA\\\", Param:{ Count:2 }, ToString:function(args) { return `以${args[1]}为权重${args[0]}的动态移动平均`; } } ],\\r\\n            [\\\"XMA\\\", { Name:\\\"XMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日偏移移动平均`; } } ],\\r\\n\\r\\n            [\\\"RANGE\\\", { Name:\\\"RANGE\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}位于${args[1]}和${args[2]}之间`; } } ],\\r\\n            [\\\"CONST\\\", { Name:\\\"CONST\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的最后一日值`; } } ],\\r\\n            [\\\"TOPRANGE\\\", { Name:\\\"TOPRANGE\\\", Param:{ Count:1 }, ToString:function(args) { return `当前值是近${args[0]}周期的最大值`; } } ],\\r\\n            [\\\"LOWRANGE\\\", { Name:\\\"LOWRANGE\\\", Param:{ Count:1 }, ToString:function(args) { return `当前值是近${args[0]}周期的最小值`; } } ],\\r\\n            [\\\"FINDHIGH\\\", { Name:\\\"FINDHIGH\\\", Param:{ Count:4 }, ToString:function(args) { return `${args[0]}在${args[1]}日前的${args[2]}天内第${args[3]}个最高价`; } } ],\\r\\n            [\\\"FINDHIGHBARS\\\", { Name:\\\"FINDHIGHBARS\\\", Param:{ Count:4 }, ToString:function(args) { return `${args[0]}在${args[1]}日前的${args[2]}天内第${args[3]}个最高价到当前周期的周期数`; } } ],\\r\\n            [\\\"FINDLOW\\\", { Name:\\\"FINDLOW\\\", Param:{ Count:4 }, ToString:function(args) { return `${args[0]}在${args[1]}日前的${args[2]}天内第${args[3]}个最低价`; } } ],\\r\\n            [\\\"FINDLOWBARS\\\", { Name:\\\"FINDLOWBARS\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}在${args[1]}日前的${args[2]}天内第${args[3]}个最低价到当前周期的周期数`; } } ],\\r\\n            [\\\"SUM\\\", { Name:\\\"SUM\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}${args[1]}日累加`; } } ],\\r\\n            [\\\"MULAR\\\", { Name:\\\"MULAR\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}和${args[1]}日累乘`; } } ],\\r\\n            [\\\"AMA\\\", { Name:\\\"AMA\\\", Param:{ Count:2 }, ToString:function(args) { return `以${args[1]}为权重${args[0]}的自适应均线`; } } ],\\r\\n            [\\\"TMA\\\", { Name:\\\"TMA\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}的${args[1]}日[${args[2]}日权重]移动平均`; } } ],\\r\\n            [\\\"CROSS\\\", { Name:\\\"CROSS\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}上穿${args[1]}`; } } ],\\r\\n            [\\\"LONGCROSS\\\", { Name:\\\"LONGCROSS\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}小于${args[1]}保持${args[2]}个交易日后交叉上穿`; } } ],\\r\\n            [\\\"UPNDAY\\\", { Name:\\\"UPNDAY\\\", Param:{ Count:2 }, ToString:function(args) { return `最近${args[1]}日${args[0]}连涨`; } } ],\\r\\n            [\\\"DOWNNDAY\\\", { Name:\\\"DOWNNDAY\\\", Param:{ Count:2 }, ToString:function(args) { return `最近${args[1]}日${args[0]}连跌`; } } ],\\r\\n            [\\\"NDAY\\\", { Name:\\\"NDAY\\\", Param:{ Count:3 }, ToString:function(args) { return `最近${args[2]}日${args[0]}一直大于${args[1]}`; } } ],\\r\\n            [\\\"EXIST\\\", { Name:\\\"EXIST\\\", Param:{ Count:2 }, ToString:function(args) { return `最近${args[1]}日存在${args[0]}`; } } ],\\r\\n            [\\\"EXISTR\\\", { Name:\\\"EXISTR\\\", Param:{ Count:3 }, ToString:function(args) { return `从前${args[1]}日到前${args[2]}日存在${args[0]}`; } } ],\\r\\n            [\\\"EVERY\\\", { Name:\\\"EVERY\\\", Param:{ Count:2 }, ToString:function(args) { return `最近${args[1]}日一直存在${args[0]}`; } } ],\\r\\n            [\\\"LAST\\\", { Name:\\\"LAST\\\", Param:{ Count:3 }, ToString:function(args) { return `从前${args[1]}日到前${args[2]}日持续${args[0]}`; } } ],\\r\\n            [\\\"NOT\\\", { Name:\\\"NOT\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}取反`; } } ],\\r\\n            [\\\"IF\\\", { Name:\\\"IF\\\", Param:{ Count:3 }, ToString:function(args) { return `如果${args[0]},返回${args[1]},否则返回${args[2]}`; } } ],\\r\\n            [\\\"IFF\\\", { Name:\\\"IFF\\\", Param:{ Count:3 }, ToString:function(args) { return `如果${args[0]},返回${args[1]},否则返回${args[2]}`; } } ],\\r\\n            [\\\"IFN\\\", { Name:\\\"IFN\\\", Param:{ Count:3 }, ToString:function(args) { return `如果${args[0]},返回${args[1]},否则返回${args[2]}`; } } ],\\r\\n\\r\\n            [\\\"MAX\\\", { Name:\\\"MAX\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}和${args[1]}的较大值`; } } ],\\r\\n            [\\\"MIN\\\", { Name:\\\"MIN\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}和${args[1]}的较小值`; } } ],\\r\\n            [\\\"ACOS\\\", { Name:\\\"ACOS\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的反余弦`; } } ],\\r\\n            [\\\"ASIN\\\", { Name:\\\"ASIN\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的反正弦`; } } ],\\r\\n            [\\\"ATAN\\\", { Name:\\\"ATAN\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的反正切`; } } ],\\r\\n            [\\\"COS\\\", { Name:\\\"COS\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的余弦`; } } ],\\r\\n            [\\\"SIN\\\", { Name:\\\"SIN\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的正弦`; } } ],\\r\\n            [\\\"TAN\\\", { Name:\\\"TAN\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的正切`; } } ],\\r\\n            [\\\"EXP\\\", { Name:\\\"EXP\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的指数`; } } ],\\r\\n            [\\\"LN\\\", { Name:\\\"LN\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的自然对数`; } } ],\\r\\n            [\\\"LOG\\\", { Name:\\\"LOG\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的对数`; } } ],\\r\\n            [\\\"SQRT\\\", { Name:\\\"SQRT\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的开方`; } } ],\\r\\n            [\\\"ABS\\\", { Name:\\\"ABS\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的绝对值`; } } ],\\r\\n            [\\\"POW\\\", { Name:\\\"POW\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}乘幂`; } } ],\\r\\n            [\\\"CEILING\\\", { Name:\\\"CEILING\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的向上舍入`; } } ],\\r\\n            [\\\"FLOOR\\\", { Name:\\\"FLOOR\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的向上舍入`; } } ],\\r\\n            [\\\"INTPART\\\", { Name:\\\"INTPART\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的整数部分`; } } ],\\r\\n            [\\\"BETWEEN\\\", { Name:\\\"BETWEEN\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}位于${args[1]}和${args[2]}之间`; } } ],\\r\\n            [\\\"FRACPART\\\", { Name:\\\"FRACPART\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的小数部分`; } } ],\\r\\n            [\\\"ROUND\\\", { Name:\\\"ROUND\\\", Param:{ Count:1 }, ToString:function(args) { return `对${args[0]}(进行)四舍五入`; } } ],\\r\\n            [\\\"ROUND2\\\", { Name:\\\"ROUND2\\\", Param:{ Count:2 }, ToString:function(args) { return `对${args[0]}(进行)四舍五入`; } } ],\\r\\n            [\\\"SIGN\\\", { Name:\\\"SIGN\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}的符号`; } } ],\\r\\n            [\\\"MOD\\\", { Name:\\\"MOD\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}关于${args[1]}的模`; } } ],\\r\\n            [\\\"RAND\\\", { Name:\\\"RAND\\\", Param:{ Count:1 }, ToString:function(args) { return `随机正整数`; } } ],\\r\\n\\r\\n            [\\\"AVEDEV\\\", { Name:\\\"AVEDEV\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日平均绝对偏差`; } } ],\\r\\n            [\\\"DEVSQ\\\", { Name:\\\"DEVSQ\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日数据偏差平方和`; } } ],\\r\\n            [\\\"FORCAST\\\", { Name:\\\"FORCAST\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日线性回归预测值`; } } ],\\r\\n            [\\\"TSMA\\\", { Name:\\\"TSMA\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}在${args[1]}个周期内的时间序列三角移动平均`; } } ],\\r\\n            [\\\"SLOPE\\\", { Name:\\\"SLOPE\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日线性回归斜率`; } } ],\\r\\n            [\\\"STD\\\", { Name:\\\"STD\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日估算标准差`; } } ],\\r\\n            [\\\"STDP\\\", { Name:\\\"STDP\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日总体标准差`; } } ],\\r\\n            [\\\"STDDEV\\\", { Name:\\\"STDDEV\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日标准偏差`; } } ],\\r\\n            [\\\"VAR\\\", { Name:\\\"VAR\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日估算样本方差`; } } ],\\r\\n            [\\\"VARP\\\", { Name:\\\"VARP\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}的${args[1]}日总体样本方差`; } } ],\\r\\n            [\\\"COVAR\\\", { Name:\\\"COVAR\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}和${args[1]}的${args[2]}周期的协方差`; } } ],\\r\\n            [\\\"RELATE\\\", { Name:\\\"RELATE\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}和${args[1]}的${args[0]}周期的相关系数`; } } ],\\r\\n            [\\\"BETA\\\", { Name:\\\"BETA\\\", Param:{ Count:1 }, ToString:function(args) { return `β(Beta)系数`; } } ],\\r\\n            [\\\"BETAEX\\\", { Name:\\\"BETAEX\\\", Param:{ Count:3 }, ToString:function(args) { return `${args[0]}和${args[1]}的${args[2]}周期的相关放大系数`; } } ],\\r\\n\\r\\n            [\\\"COST\\\", { Name:\\\"COST\\\", Param:{ Count:1 }, ToString:function(args) { return `获利盘为${args[0]}%的成本分布`; } } ],\\r\\n            [\\\"WINNER\\\", { Name:\\\"WINNER\\\", Param:{ Count:1 }, ToString:function(args) { return `以${args[0]}计算的获利盘比例`; } } ],\\r\\n            [\\\"LWINNER\\\", { Name:\\\"LWINNER\\\", Param:{ Count:2 }, ToString:function(args) { return `最近${args[0]}日那部分成本以${args[1]}价格卖出的获利盘比例`; } } ],\\r\\n            [\\\"PWINNER\\\", { Name:\\\"PWINNER\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}日前那部分成本以${args[1]}价格卖出的获利盘比例`; } } ],\\r\\n            [\\\"COSTEX\\\", { Name:\\\"COSTEX\\\", Param:{ Count:2 }, ToString:function(args) { return `位于价格${args[0]}和${args[1]}间的成本`; } } ],\\r\\n            [\\\"PPART\\\", { Name:\\\"PPART\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}日前那部分成本占总成本的比例`; } } ],\\r\\n\\r\\n            [\\\"SAR\\\", { Name:\\\"SAR\\\", Param:{ Count:3 }, ToString:function(args) { return `步长为${args[1]}极限值为${args[0]}的${args[2]}日抛物转向`; } } ],\\r\\n            [\\\"SARTURN\\\", { Name:\\\"SARTURN\\\", Param:{ Count:3 }, ToString:function(args) { return `步长为${args[1]}极限值为${args[0]}的${args[2]}日抛物转向点`; } } ],\\r\\n\\r\\n            //字符串函数\\r\\n            [\\\"CON2STR\\\", { Name:\\\"CON2STR\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}转为字符串`; } } ],\\r\\n            [\\\"VAR2STR\\\", { Name:\\\"VAR2STR\\\", Param:{ Count:2 }, ToString:function(args) { return `${args[0]}转为字符串`; } } ],\\r\\n            [\\\"STR2CON\\\", { Name:\\\"STR2CON\\\", Param:{ Count:1 }, ToString:function(args) { return `${args[0]}转为数字`; } } ],\\r\\n            [\\\"STRLEN\\\", { Name:\\\"STRLEN\\\", Param:{ Count:1 }, ToString:function(args) { return `得到${args[0]}字符串长度`; } } ],\\r\\n            [\\\"STRCAT\\\", { Name:\\\"STRCAT\\\", Param:{ Count:2 }, ToString:function(args) { return `字符串相加`; } } ],\\r\\n            [\\\"VARCAT\\\", { Name:\\\"VARCAT\\\", Param:{ Count:2 }, ToString:function(args) { return `字符串相加`; } } ],\\r\\n            [\\\"STRSPACE\\\", { Name:\\\"STRSPACE\\\", Param:{ Count:1 }, ToString:function(args) { return `字符串${args[0]}加一空格`; } } ],\\r\\n            [\\\"SUBSTR\\\", { Name:\\\"SUBSTR\\\", Param:{ Count:3 }, ToString:function(args) { return `字符串${args[0]}中取一部分`; } } ],\\r\\n            [\\\"STRCMP\\\", { Name:\\\"STRCMP\\\", Param:{ Count:2 }, ToString:function(args) { return `字符串${args[0]}和字符串${args[1]}比较`; } } ],\\r\\n            [\\\"FINDSTR\\\", { Name:\\\"FINDSTR\\\", Param:{ Count:2 }, ToString:function(args) { return `字符串${args[0]}中查找字符串${args[1]}`; } } ],\\r\\n            [\\\"NAMEINCLUD\\\", { Name:\\\"NAMEINCLUD\\\", Param:{ Count:1 }, ToString:function(args) { return `查找品种名称中包含${args[0]}`; } } ],\\r\\n            [\\\"CODELIKE\\\", { Name:\\\"CODELIKE\\\", Param:{ Count:1 }, ToString:function(args) { return `查找品种名称中包含${args[0]}`; } } ],\\r\\n            [\\\"INBLOCK\\\", { Name:\\\"AVEDEV\\\", Param:{ Count:1 }, ToString:function(args) { return `属于${args[0]}板块`; } } ],\\r\\n\\r\\n\\r\\n            [\\r\\n                \\\"HHVBARS\\\",\\r\\n                {\\r\\n                    Name:\\\"HHVBARS\\\", Param:{ Count:2 },\\r\\n                    ToString:function(args)\\r\\n                    {\\r\\n                        if (args[1]==0) return `历史${args[0]}新高距今天数`;\\r\\n                        return `${args[1]}日内${args[0]}新高距今天数`;\\r\\n                    }\\r\\n                }\\r\\n            ],\\r\\n\\r\\n            [\\r\\n                \\\"LLVBARS\\\",\\r\\n                {\\r\\n                    Name:\\\"LLVBARS\\\", Param:{ Count:2 },\\r\\n                    ToString:function(args)\\r\\n                    {\\r\\n                        if (args[1]==0) return `历史${args[0]}新低距今天数`;\\r\\n                        return `${args[1]}日内${args[0]}新低距今天数`;\\r\\n                    }\\r\\n                }\\r\\n            ]\\r\\n        ]\\r\\n    );\\r\\n\\r\\n    this.CallFunctionExplain=function(funcName, args, node)\\r\\n    {\\r\\n        if (this.FUNCTION_INFO_LIST.has(funcName))\\r\\n        {\\r\\n            var item=this.FUNCTION_INFO_LIST.get(funcName);\\r\\n            if (item.Param.Count!=args.length)\\r\\n                this.ThrowUnexpectedNode(node,`函数${funcName}参数个数不正确. 需要${item.Param.Count}个参数`);\\r\\n            return item.ToString(args);\\r\\n        }\\r\\n\\r\\n        switch(funcName)\\r\\n        {\\r\\n            case \\\"CALCSTOCKINDEX\\\":\\r\\n                return `引用${args[0]}的${args[1]}指标第${args[2]}个输出值`;\\r\\n\\r\\n            case \\\"PEAK\\\":\\r\\n            case \\\"PEAKBARS\\\":\\r\\n            case \\\"ZIG\\\":\\r\\n            case \\\"ZIGA\\\":\\r\\n            case \\\"TROUGH\\\":\\r\\n            case \\\"TROUGHBARS\\\":\\r\\n                return this.GetZIGExplain(funcName,args);\\r\\n\\r\\n            case \\\"FINANCE\\\":\\r\\n                return this.GetFinanceExplain(args);\\r\\n            case \\\"DYNAINFO\\\":\\r\\n                return this.GetDynainfoExplain(args);\\r\\n\\r\\n\\r\\n            case 'CLOSE':\\r\\n            case 'C':\\r\\n            case 'VOL':\\r\\n            case 'V':\\r\\n            case 'OPEN':\\r\\n            case 'O':\\r\\n            case 'HIGH':\\r\\n            case 'H':\\r\\n            case 'LOW':\\r\\n            case 'L':\\r\\n            case 'AMOUNT':\\r\\n            case 'AMO':\\r\\n                return this.GetOtherSymbolExplain( {FunctionName:funcName, Args:args} ,node);\\r\\n\\r\\n\\r\\n            //绘图函数\\r\\n            case \\\"PLOYLINE\\\":\\r\\n                return `当满足条件${args[0]}时以${args[1]}位置为顶点画折线连接`;\\r\\n            case \\\"DRAWLINE\\\":\\r\\n                return `当满足条件${args[0]}时,在${args[1]}位置画直线起点，当满足条件${args[2]}时,在${args[3]}位置画直线终点,${args[4]}表示是否延长`;\\r\\n            case \\\"DRAWSL\\\":\\r\\n                return `当满足条件${args[0]}时,在${args[1]}位置画斜线线性回归,${args[2]}斜率,${args[3]}长度,${args[4]}方向`;\\r\\n            case \\\"DRAWKLINE\\\":\\r\\n                return 'K线';\\r\\n            case \\\"DRAWICON\\\":\\r\\n                return `当满足条件${args[0]}时,在${args[1]}位置画${args[2]}号图标`;\\r\\n            case \\\"DRAWTEXT\\\":\\r\\n                return `当满足条件${args[0]}时,在${args[1]}位置书写文字`;\\r\\n            case \\\"DRAWTEXT_FIX\\\":\\r\\n                return `当满足条件${args[0]}时,在横轴${args[1]}纵轴${args[2]}位置书写文字`;\\r\\n            case \\\"DRAWNUMBER\\\":\\r\\n                return `当满足条件${args[0]}时,在${args[1]}位置书写数字`;\\r\\n            case \\\"DRAWNUMBER_FIX\\\":\\r\\n                return `当满足条件${args[0]}时,在横轴${args[1]}纵轴${args[2]}位置书写数字`;\\r\\n            case \\\"RGB\\\":\\r\\n                return `自定色[${args[0]},${args[1]},${args[2]}]`;\\r\\n            case \\\"DRAWBAND\\\":\\r\\n                return '画带状线';\\r\\n            case \\\"DRAWRECTREL\\\":\\r\\n                return \\\"相对位置上画矩形.\\\";\\r\\n            case \\\"DRAWGBK\\\":\\r\\n                return \\\"填充背景\\\";\\r\\n            case \\\"STICKLINE\\\":\\r\\n                var barType=\\\"\\\";\\r\\n                if (args[4]==-1) barType=\\\"虚线空心柱\\\";\\r\\n                else if (args[4]==0) barType=\\\"实心柱\\\";\\r\\n                else barType=\\\"实线空心柱\\\";\\r\\n                return `当满足条件${args[0]}时, 在${args[1]}和${args[2]}位置之间画柱状线,宽度为${args[3]},${barType}`;\\r\\n\\r\\n            default:\\r\\n                this.ThrowUnexpectedNode(node,`函数${funcName}不存在`);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetDynainfoExplain=function(args)\\r\\n    {\\r\\n        const DATA_NAME_MAP=new Map(\\r\\n            [\\r\\n                [3,\\\"前收盘价\\\"], [4,\\\"开盘价\\\"], [5,\\\"最高价\\\"], [6,\\\"最低价\\\"], [7,\\\"现价\\\"], [8,'总量'], [9,\\\"现量\\\"],\\r\\n                [10,\\\"总金额\\\"], [11,\\\"均价\\\"], [12,\\\"日涨跌\\\"], [13,\\\"振幅\\\"], [14,\\\"涨幅\\\"], [15,\\\"开盘时的成交金额\\\"],\\r\\n                [16,\\\"前5日每分钟均量\\\"], [17,\\\"量比\\\"], [18,\\\"上涨家数\\\"], [19,\\\"下跌家数\\\"]\\r\\n            ]);\\r\\n\\r\\n        var id=args[0];\\r\\n        if (DATA_NAME_MAP.has(id)) return DATA_NAME_MAP.get(id);\\r\\n\\r\\n        return `即时行情[${id}]`;\\r\\n    }\\r\\n\\r\\n    this.GetFinanceExplain=function(args)\\r\\n    {\\r\\n        const DATA_NAME_MAP=new Map(\\r\\n            [\\r\\n                [1,\\\"总股本\\\"], [2,\\\"市场类型\\\"], [3,\\\"沪深品种类型\\\"], [4,\\\"沪深行业代码\\\"], [5,\\\"B股\\\"], [6,\\\"H股\\\"], [7,\\\"流通股本[股]\\\"], [8,\\\"股东人数[户]\\\"], [9,\\\"资产负债率%\\\"],\\r\\n                [10,\\\"总资产\\\"], [11,\\\"流动资产\\\"], [12,\\\"固定资产\\\"], [13,\\\"无形资产\\\"], [15,\\\"流动负债\\\"], [16,\\\"少数股东权益\\\"]\\r\\n\\r\\n            ]);\\r\\n        var id=args[0];\\r\\n\\r\\n        if (DATA_NAME_MAP.has(id)) return DATA_NAME_MAP.get(id);\\r\\n\\r\\n        return `财务数据[${id}]`;\\r\\n    }\\r\\n\\r\\n    this.GetZIGExplain=function(funcName,args)\\r\\n    {\\r\\n        var value=args[0];\\r\\n        if (value==0) value=\\\"开盘价\\\";\\r\\n        else if (value==1) value=\\\"最高价\\\";\\r\\n        else if (value==2) value=\\\"最低价\\\";\\r\\n        else if (value==3) value=\\\"收盘价\\\";\\r\\n\\r\\n        switch(funcName)\\r\\n        {\\r\\n            case \\\"PEAK\\\":\\r\\n                return `${value}的${args[1]}%之字转向的前${args[2]}个波峰值`;\\r\\n            case \\\"PEAKBARS\\\":\\r\\n                return `${value}的${args[1]}5%之字转向的前${args[2]}个波峰位置`;\\r\\n            case \\\"ZIG\\\":\\r\\n                return `${value}的${args[1]}的之字转向`;\\r\\n            case \\\"ZIGA\\\":\\r\\n                return `${value}变化${args[1]}的之字转向`;\\r\\n            case \\\"TROUGH\\\":\\r\\n                return `${value}的${args[1]}%之字转向的前${args[2]}个波谷值`;\\r\\n            case \\\"TROUGHBARS\\\":\\r\\n                return `${value}的${args[1]}%之字转向的前${args[2]}个波谷位置`;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.GetColorExplain=function(colorName)\\r\\n    {\\r\\n        const COLOR_MAP=new Map(\\r\\n            [\\r\\n                ['COLORBLACK','黑色'],['COLORBLUE','蓝色'],['COLORGREEN','绿色'],['COLORCYAN','青色'],['COLORRED','红色'],\\r\\n                ['COLORMAGENTA','洋红色'],['COLORBROWN','棕色'],['COLORLIGRAY','淡灰色'],['COLORGRAY','深灰色'],['COLORLIBLUE','淡蓝色'],\\r\\n                ['COLORLIGREEN','淡绿色'],['COLORLICYAN','淡青色'],['COLORLIRED','淡红色'],['COLORLIMAGENTA','淡洋红色'],['COLORWHITE','白色'],['COLORYELLOW','黄色']\\r\\n            ]);\\r\\n\\r\\n        if (COLOR_MAP.has(colorName)) return COLOR_MAP.get(colorName);\\r\\n\\r\\n        //COLOR 自定义色\\r\\n        //格式为COLOR+“RRGGBB”：RR、GG、BB表示红色、绿色和蓝色的分量，每种颜色的取值范围是00-FF，采用了16进制。\\r\\n        //例如：MA5：MA(CLOSE，5)，COLOR00FFFF　表示纯红色与纯绿色的混合色：COLOR808000表示淡蓝色和淡绿色的混合色。\\r\\n        if (colorName.indexOf('COLOR')==0) return '#'+colorName.substr(5);\\r\\n\\r\\n        return 'rgb(30,144,255)';\\r\\n    }\\r\\n\\r\\n    this.GetLineWidthExplain=function(lineWidth)\\r\\n    {\\r\\n        var width=parseInt(lineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n        if (IFrameSplitOperator.IsPlusNumber(width)) return width;\\r\\n        return 1;\\r\\n    }\\r\\n\\r\\n    this.SymbolPeriodExplain=function(valueName,period)\\r\\n    {\\r\\n        const mapStockDataName=new Map(\\r\\n            [\\r\\n                ['CLOSE',\\\"收盘价\\\"],[\\\"C\\\",\\\"收盘价\\\"],['VOL',\\\"成交量\\\"],['V',\\\"成交量\\\"], ['OPEN',\\\"开盘价\\\"], ['O',\\\"开盘价\\\"],\\r\\n                ['HIGH',\\\"最高价\\\"],['H',\\\"最高价\\\"], ['LOW',\\\"最低价\\\"],['L',\\\"最低价\\\"],['AMOUNT',\\\"成交金额\\\"],['AMO',\\\"成交金额\\\"],\\r\\n                ['VOLINSTK',\\\"持仓量\\\"]\\r\\n            ]);\\r\\n        //MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH,SEASON,YEAR\\r\\n        const mapPeriodName=new Map(\\r\\n            [\\r\\n                [\\\"MIN1\\\",\\\"1分钟\\\"], [\\\"MIN5\\\", \\\"5分钟\\\"], [\\\"MIN15\\\", \\\"15分钟\\\"], [\\\"MIN30\\\",\\\"30分钟\\\"],[\\\"MIN60\\\",\\\"60分钟\\\"],\\r\\n                [\\\"DAY\\\",\\\"日\\\"],[\\\"WEEK\\\",\\\"周\\\"], [\\\"MONTH\\\", \\\"月\\\"], ['SEASON',\\\"季\\\"], [\\\"YEAR\\\", \\\"年\\\"],[\\\"WEEK2\\\",\\\"双周\\\"], [\\\"HALFYEAR\\\", \\\"半年\\\"]\\r\\n            ]);\\r\\n\\r\\n        var dataName=valueName;\\r\\n        if (mapStockDataName.has(valueName)) dataName=mapStockDataName.get(valueName);\\r\\n\\r\\n        var periodName=period;\\r\\n        if (mapPeriodName.has(period)) periodName=mapPeriodName.get(period);\\r\\n\\r\\n        return `${dataName}[取${periodName}数据]`;\\r\\n    }\\r\\n\\r\\n    this.GetOtherSymbolExplain=function(obj, node)\\r\\n    {\\r\\n        const mapStockDataName=new Map(\\r\\n            [\\r\\n                ['CLOSE',\\\"收盘价\\\"],[\\\"C\\\",\\\"收盘价\\\"],['VOL',\\\"成交量\\\"],['V',\\\"成交量\\\"], ['OPEN',\\\"开盘价\\\"], ['O',\\\"开盘价\\\"],\\r\\n                ['HIGH',\\\"最高价\\\"],['H',\\\"最高价\\\"], ['LOW',\\\"最低价\\\"],['L',\\\"最低价\\\"],['AMOUNT',\\\"成交金额\\\"],['AMO',\\\"成交金额\\\"],\\r\\n                ['VOLINSTK',\\\"持仓量\\\"]\\r\\n            ]);\\r\\n\\r\\n        if (obj.FunctionName)\\r\\n        {\\r\\n            var args=obj.Args;\\r\\n            var dataName=mapStockDataName.get(obj.FunctionName);\\r\\n            return `[${args[0]}]${dataName}`;\\r\\n        }\\r\\n        else if (obj.Literal)\\r\\n        {\\r\\n            var value=obj.Literal.toUpperCase();\\r\\n            var args=value.split(\\\"$\\\");\\r\\n            if (!mapStockDataName.has(args[1])) return \\\"\\\";\\r\\n            var symbol=args[0];\\r\\n            var dataName=mapStockDataName.get(args[1]);\\r\\n            return `[${symbol}]${dataName}`;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.IsDrawFunction=function(name)\\r\\n    {\\r\\n        let setFunctionName=new Set(\\r\\n            [\\r\\n                \\\"STICKLINE\\\",\\\"DRAWTEXT\\\",'SUPERDRAWTEXT','DRAWLINE','DRAWBAND','DRAWKLINE','DRAWKLINE_IF','PLOYLINE',\\r\\n                'POLYLINE','DRAWNUMBER',\\\"DRAWNUMBER_FIX\\\",'DRAWICON','DRAWCHANNEL','PARTLINE','DRAWTEXT_FIX','DRAWGBK','DRAWTEXT_LINE','DRAWRECTREL',\\\"DRAWTEXTABS\\\",\\r\\n                'DRAWOVERLAYLINE',\\\"FILLRGN\\\", \\\"FILLRGN2\\\",\\\"FILLTOPRGN\\\", \\\"FILLBOTTOMRGN\\\", \\\"FILLVERTICALRGN\\\",\\\"FLOATRGN\\\",\\\"DRAWSL\\\", \\\"DRAWGBK2\\\"\\r\\n            ]);\\r\\n        if (setFunctionName.has(name)) return true;\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    //赋值\\r\\n    this.VisitAssignmentExpression=function(node)\\r\\n    {\\r\\n        let left=node.Left;\\r\\n        if (left.Type!=Syntax.Identifier) this.ThrowUnexpectedNode(node);\\r\\n\\r\\n        let varName=left.Name;\\r\\n\\r\\n        let right=node.Right;\\r\\n        let value=null;\\r\\n        if (right.Type==Syntax.BinaryExpression || right.Type==Syntax.LogicalExpression)\\r\\n            value=this.VisitBinaryExpression(right);\\r\\n        else if (right.Type==Syntax.CallExpression)\\r\\n            value=this.VisitCallExpression(right);\\r\\n        else if (right.Type==Syntax.Literal)\\r\\n        {\\r\\n            value=right.Value;\\r\\n            if (IFrameSplitOperator.IsString(value) && right.Value.indexOf(\\\"$\\\")>0)\\r\\n                value=this.GetOtherSymbolExplain({ Literal:value }, node);\\r\\n        }\\r\\n        else if (right.Type==Syntax.Identifier) //右值是变量\\r\\n            value=this.ReadVariable(right.Name,right);\\r\\n        else if (right.Type==Syntax.MemberExpression)\\r\\n            value=this.ReadMemberVariable(right);\\r\\n        else if (right.Type==Syntax.UnaryExpression)\\r\\n        {\\r\\n            if (right.Operator=='-')\\r\\n            {\\r\\n                var tempValue=this.GetNodeValue(right.Argument);\\r\\n                value='-'+tempValue;\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                value=right.Argument.Value;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        JSConsole.Complier.Log('[JSExplainer::VisitAssignmentExpression]' , varName, ' = ',value);\\r\\n        this.VarTable.set(varName,value);\\r\\n    }\\r\\n\\r\\n    //逻辑运算\\r\\n    this.VisitBinaryExpression=function(node)\\r\\n    {\\r\\n        let stack=[];\\r\\n        stack.push(node);\\r\\n        let temp=null;\\r\\n\\r\\n        while(stack.length!=0)\\r\\n        {\\r\\n            temp=stack[stack.length-1];\\r\\n            if (temp.Left && node!=temp.Left && node!=temp.Right)\\r\\n            {\\r\\n                stack.push(temp.Left);\\r\\n            }\\r\\n            else if (temp.Right && node!=temp.Right)\\r\\n            {\\r\\n                stack.push(temp.Right);\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                let value=stack.pop();\\r\\n                if (value.Type==Syntax.BinaryExpression)    //只遍历操作符就可以\\r\\n                {\\r\\n                    let leftValue=this.GetNodeValue(value.Left);\\r\\n                    let rightValue=this.GetNodeValue(value.Right);\\r\\n\\r\\n                    JSConsole.Complier.Log('[JSExplainer::VisitBinaryExpression] BinaryExpression',value , leftValue, rightValue);\\r\\n                    value.Out=null; //保存中间值\\r\\n\\r\\n                    value.Out=`(${leftValue} ${value.Operator} ${rightValue})`;\\r\\n                    if (leftValue==\\\"收盘价\\\" && rightValue==\\\"开盘价\\\")\\r\\n                    {\\r\\n                        if (value.Operator==\\\">\\\") value.Out='(收阳线)';\\r\\n                        else if (value.Operator==\\\"<\\\") value.Out='(收阴线)';\\r\\n                        else if (value.Operator==\\\"=\\\") value.Out='(平盘)';\\r\\n                    }\\r\\n                    else if (leftValue==\\\"开盘价\\\" && rightValue==\\\"收盘价\\\")\\r\\n                    {\\r\\n                        if (value.Operator==\\\"<\\\") value.Out='(收阳线)';\\r\\n                        else if (value.Operator==\\\">\\\") value.Out='(收阴线)';\\r\\n                        else if (value.Operator==\\\"=\\\") value.Out='(平盘)';\\r\\n                    }\\r\\n\\r\\n                    JSConsole.Complier.Log('[JSExplainer::VisitBinaryExpression] BinaryExpression',value);\\r\\n                }\\r\\n                else if (value.Type==Syntax.LogicalExpression)\\r\\n                {\\r\\n                    let leftValue=this.GetNodeValue(value.Left);\\r\\n                    let rightValue=this.GetNodeValue(value.Right);\\r\\n\\r\\n                    JSConsole.Complier.Log('[JSExecute::VisitBinaryExpression] LogicalExpression',value , leftValue, rightValue);\\r\\n                    value.Out=null; //保存中间值\\r\\n\\r\\n                    switch(value.Operator)\\r\\n                    {\\r\\n                        case '&&':\\r\\n                        case 'AND':\\r\\n                            value.Out=`(${leftValue} 并且 ${rightValue})`;\\r\\n                            break;\\r\\n                        case '||':\\r\\n                        case 'OR':\\r\\n                            value.Out=`(${leftValue} 或者 ${rightValue})`;\\r\\n                            break;\\r\\n                    }\\r\\n\\r\\n                    JSConsole.Complier.Log('[JSExplainer::VisitBinaryExpression] LogicalExpression',value);\\r\\n                }\\r\\n\\r\\n                node=temp;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return node.Out;\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetNodeValue=function(node)\\r\\n    {\\r\\n        switch(node.Type)\\r\\n        {\\r\\n            case Syntax.Literal:    //数字\\r\\n                return node.Value;\\r\\n            case Syntax.UnaryExpression:\\r\\n                if (node.Operator=='-')\\r\\n                {\\r\\n                    let value=this.GetNodeValue(node.Argument);\\r\\n                    return '-'+value;\\r\\n                }\\r\\n                return node.Argument.Value;\\r\\n            case Syntax.Identifier:\\r\\n                let value=this.ReadVariable(node.Name,node);\\r\\n                return value;\\r\\n            case Syntax.BinaryExpression:\\r\\n            case Syntax.LogicalExpression:\\r\\n                return node.Out;\\r\\n            case Syntax.CallExpression:\\r\\n                return this.VisitCallExpression(node);\\r\\n            default:\\r\\n                this.ThrowUnexpectedNode(node);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //读取变量\\r\\n    this.ReadVariable=function(name,node)\\r\\n    {\\r\\n        if (this.ConstVarTable.has(name))\\r\\n        {\\r\\n            let data=this.ConstVarTable.get(name);\\r\\n            return data;\\r\\n        }\\r\\n\\r\\n        if (g_JSComplierResource.IsCustomVariant(name)) return this.ReadCustomVariant(name,node); //读取自定义变量\\r\\n\\r\\n        if (this.VarTable.has(name)) return this.VarTable.get(name);\\r\\n\\r\\n        if (name.indexOf('#')>0)\\r\\n        {\\r\\n            var aryPeriod=name.split('#');\\r\\n            return this.SymbolPeriodExplain(aryPeriod[0],aryPeriod[1]);\\r\\n        }\\r\\n\\r\\n        this.ThrowUnexpectedNode(node, '变量'+name+'不存在');\\r\\n        return name;\\r\\n    }\\r\\n\\r\\n    this.ThrowUnexpectedNode=function(node,message)\\r\\n    {\\r\\n        let marker=node.Marker;\\r\\n        let msg=message || \\\"执行异常\\\";\\r\\n\\r\\n        return this.ErrorHandler.ThrowError(marker.Index,marker.Line,marker.Column,msg);\\r\\n\\r\\n    }\\r\\n\\r\\n    this.ThrowError=function()\\r\\n    {\\r\\n\\r\\n    }\\r\\n}\\r\\n\\r\\n//对外导出类\\r\\nfunction JSComplier()\\r\\n{\\r\\n\\r\\n}\\r\\n\\r\\n\\r\\n//词法分析\\r\\nJSComplier.Tokenize=function(code)\\r\\n{\\r\\n    JSConsole.Complier.Log('[JSComplier.Tokenize]', code);\\r\\n    let tokenizer=new Tokenizer(code);\\r\\n    let tokens=[];\\r\\n    try\\r\\n    {\\r\\n        while(true)\\r\\n        {\\r\\n            let token=tokenizer.GetNextToken();\\r\\n            if (!token) break;\\r\\n\\r\\n            tokens.push(token);\\r\\n        }\\r\\n    }\\r\\n    catch(e)\\r\\n    {\\r\\n\\r\\n    }\\r\\n\\r\\n    return tokens;\\r\\n}\\r\\n\\r\\n//语法解析 生成抽象语法树(Abstract Syntax Tree)\\r\\nJSComplier.Parse=function(code)\\r\\n{\\r\\n    JSConsole.Complier.Log('[JSComplier.Parse]',code);\\r\\n\\r\\n    let parser=new JSParser(code);\\r\\n    parser.Initialize();\\r\\n    let program=parser.ParseScript();\\r\\n    let ast=program;\\r\\n    return ast;\\r\\n}\\r\\n\\r\\n/*\\r\\n    执行\\r\\n    option.Symbol=股票代码\\r\\n    option.Name=股票名称\\r\\n    option.Data=这个股票的ChartData\\r\\n    option.Right=复权\\r\\n    option.MaxReqeustDataCount=请求数据的最大个数\\r\\n*/\\r\\n\\r\\nfunction timeout(ms) {\\r\\n    return new Promise((resolve) => {\\r\\n        setTimeout(resolve, ms);\\r\\n    });\\r\\n}\\r\\n\\r\\n\\r\\nJSComplier.Execute=function(code,option,errorCallback)\\r\\n{\\r\\n    //异步调用\\r\\n    //var asyncExecute= async function() es5不能执行 去掉异步\\r\\n    var asyncExecute= function()\\r\\n    {\\r\\n        try\\r\\n        {\\r\\n            JSConsole.Complier.Log('[JSComplier.Execute]',code,option);\\r\\n\\r\\n            JSConsole.Complier.Log('[JSComplier.Execute] parser .....');\\r\\n            let parser=new JSParser(code);\\r\\n            parser.Initialize();\\r\\n            let program=parser.ParseScript();\\r\\n\\r\\n            let ast=program;\\r\\n            JSConsole.Complier.Log('[JSComplier.Execute] parser finish.', ast);\\r\\n\\r\\n            JSConsole.Complier.Log('[JSComplier.Execute] execute .....');\\r\\n            let execute=new JSExecute(ast,option);\\r\\n            execute.ErrorCallback=errorCallback;        //执行错误回调\\r\\n            execute.JobList=parser.Node.GetDataJobList();\\r\\n            if (option.ClassName=='ScriptIndexConsole') execute.JobList.unshift({ID:JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_SYMBOL_DATA});\\r\\n            execute.JobList.push({ID:JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT});\\r\\n\\r\\n            let result=execute.Execute();\\r\\n\\r\\n        }catch(error)\\r\\n        {\\r\\n            JSConsole.Complier.Log(error);\\r\\n            if (errorCallback) errorCallback(error, option.CallbackParam);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    asyncExecute();\\r\\n\\r\\n    JSConsole.Complier.Log('[JSComplier.Execute] async execute.');\\r\\n}\\r\\n\\r\\nJSComplier.Explain=function(code,option, errorCallback)\\r\\n{\\r\\n    //异步调用\\r\\n    //var asyncExecute= async function() es5不能执行 去掉异步\\r\\n    var asyncExplain= function()\\r\\n    {\\r\\n        try\\r\\n        {\\r\\n            JSConsole.Complier.Log('[JSComplier.Explain]',code,option);\\r\\n\\r\\n            JSConsole.Complier.Log('[JSComplier.Explain] parser .....');\\r\\n            let parser=new JSParser(code);\\r\\n            parser.Initialize();\\r\\n            let program=parser.ParseScript();\\r\\n\\r\\n            let ast=program;\\r\\n            JSConsole.Complier.Log('[JSComplier.Explain] parser finish.', ast);\\r\\n\\r\\n            JSConsole.Complier.Log('[JSComplier.Explain] explain .....');\\r\\n            let execute=new JSExplainer(ast,option);\\r\\n            execute.ErrorCallback=errorCallback;            //执行错误回调\\r\\n            execute.JobList=parser.Node.GetDataJobList();\\r\\n            execute.JobList.push({ID:JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT});\\r\\n            let result=execute.Run();\\r\\n\\r\\n        }catch(error)\\r\\n        {\\r\\n            JSConsole.Complier.Log(error);\\r\\n\\r\\n            if (errorCallback) errorCallback(error, option.CallbackParam);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    asyncExplain();\\r\\n\\r\\n    JSConsole.Complier.Log('[JSComplier.Explain] async explain.');\\r\\n}\\r\\n\\r\\n\\r\\nJSComplier.SetDomain = function (domain, cacheDomain)   //修改API地址\\r\\n{\\r\\n    if (domain) g_JSComplierResource.Domain = domain;\\r\\n    if (cacheDomain) g_JSComplierResource.CacheDomain = cacheDomain;\\r\\n}\\r\\n\\r\\n\\r\\nJSComplier.AddIcon=function(obj)    //添加一个obj={ID:, Text:, Color, Family: }\\r\\n{\\r\\n    g_JSComplierResource.CustomDrawIcon.Data.set(obj.ID, obj);\\r\\n}\\r\\n\\r\\nJSComplier.AddFunction=function(obj)    //添加函数 { Name:函数名, Description:描述信息, IsDownload:是否需要下载数据, Invoke:函数执行(可选) }\\r\\n{\\r\\n    if (!obj || !obj.Name) return;\\r\\n\\r\\n    var ID=obj.Name.toUpperCase();\\r\\n    g_JSComplierResource.CustomFunction.Data.set(ID, obj);\\r\\n}\\r\\n\\r\\nJSComplier.AddVariant=function(obj) //{ Name:变量名, Description:描述信息 }\\r\\n{\\r\\n    if (!obj || !obj.Name) return;\\r\\n\\r\\n    var ID=obj.Name.toUpperCase();\\r\\n    g_JSComplierResource.CustomVariant.Data.set(ID, obj);\\r\\n}\\r\\n\\r\\nvar HQ_DATA_TYPE=\\r\\n    {\\r\\n        KLINE_ID:0,         //K线\\r\\n        MINUTE_ID:2,        //当日走势图\\r\\n        HISTORY_MINUTE_ID:3,//历史分钟走势图\\r\\n        MULTIDAY_MINUTE_ID:4,//多日走势图\\r\\n    };\\r\\n\\r\\n\\r\\n//脚本指标\\r\\n//name=指标名字 args=参数名字 参数值\\r\\nfunction ScriptIndex(name,script,args,option)\\r\\n{\\r\\n    this.newMethod=BaseIndex;   //派生\\r\\n    this.newMethod(name);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"ScriptIndex\\\";\\r\\n    this.Script=script;\\r\\n    this.Arguments=[];\\r\\n    this.OutVar=[];\\r\\n    this.ID;                //指标ID\\r\\n    this.FloatPrecision=2;  //小数位数\\r\\n    this.StringFormat;\\r\\n    this.KLineType=null;    //K线显示类型\\r\\n    this.InstructionType;   //五彩K线, 交易指标\\r\\n    this.YSpecificMaxMin=null;  //最大最小值\\r\\n    this.YSplitScale=null;      //固定刻度\\r\\n    this.Condition=null;        //限制条件\\r\\n    this.OutName=null;          //动态输出指标名字\\r\\n\\r\\n    //指标上锁配置信息\\r\\n    this.IsLocked=false;    //是否锁住指标\\r\\n    this.LockCallback=null;\\r\\n    this.LockID=null;\\r\\n    this.LockBG=null;       //锁背景色\\r\\n    this.LockTextColor=null;\\r\\n    this.LockText=null;\\r\\n    this.LockFont=null;\\r\\n    this.LockCount=20;\\r\\n    this.LockMinWidth=null;\\r\\n    this.TitleFont=g_JSChartResource.TitleFont;     //标题字体\\r\\n    this.IsShortTitle=false;                        //是否显示指标参数\\r\\n\\r\\n    if (option)\\r\\n    {\\r\\n        if (option.FloatPrecision>=0) this.FloatPrecision=option.FloatPrecision;\\r\\n        if (option.StringFormat>0) this.StringFormat=option.StringFormat;\\r\\n        if (option.ID) this.ID=option.ID;\\r\\n        if (option.KLineType>=0 || option.KLineType===-1) this.KLineType=option.KLineType;\\r\\n        if (option.InstructionType) this.InstructionType=option.InstructionType;\\r\\n        if (option.YSpecificMaxMin) this.YSpecificMaxMin=option.YSpecificMaxMin;\\r\\n        if (option.YSplitScale) this.YSplitScale=option.YSplitScale;\\r\\n        if (option.Condition) this.Condition=option.Condition;\\r\\n        if (option.TitleFont) this.TitleFont=option.TitleFont;\\r\\n        if (option.IsShortTitle) this.IsShortTitle=option.IsShortTitle;\\r\\n        if (option.OutName) this.OutName=option.OutName;\\r\\n    }\\r\\n\\r\\n    if (option && option.Lock)\\r\\n    {\\r\\n        if (option.Lock.IsLocked==true) this.IsLocked=true;  //指标上锁\\r\\n        if (option.Lock.Callback) this.LockCallback=option.Lock.Callback;    //锁回调\\r\\n        if (option.Lock.ID) this.LockID=option.Lock.ID;                      //锁ID\\r\\n        if (option.Lock.BG) this.LockBG=option.Lock.BG;\\r\\n        if (option.Lock.TextColor) this.LockTextColor=option.Lock.TextColor;\\r\\n        if (option.Lock.Text) this.LockText=option.Lock.Text;\\r\\n        if (option.Lock.Font) this.LockFont=option.Lock.Font;\\r\\n        if (option.Lock.Count) this.LockCount=option.Lock.Count;\\r\\n        if (option.Lock.MinWidth) this.LockMinWidth=option.Lock.MinWidth*GetDevicePixelRatio();\\r\\n    }\\r\\n\\r\\n    if (args) this.Arguments=args;\\r\\n\\r\\n    this.CopyTo=function(dest)   //赋值到新实例出来\\r\\n    {\\r\\n        dest.FloatPrecision=this.FloatPrecision;\\r\\n        dest.StringFormat=this.StringFormat;\\r\\n        dest.KLineType=this.KLineType;\\r\\n        dest.InstructionType=this.InstructionType;\\r\\n        dest.Condition=this.Condition;\\r\\n        dest.TitleFont=this.TitleFont;\\r\\n        dest.IsShortTitle=this.IsShortTitle;\\r\\n        dest.OutName=this.OutName;\\r\\n\\r\\n        dest.Arguments=this.Arguments;\\r\\n        dest.Script=this.Script;\\r\\n        dest.Name=this.Name;\\r\\n    }\\r\\n\\r\\n    this.SetLock=function(lockData)\\r\\n    {\\r\\n        if (lockData.IsLocked==true)\\r\\n        {\\r\\n            this.IsLocked=true;  //指标上锁\\r\\n            if (lockData.Callback) this.LockCallback=lockData.Callback;    //锁回调\\r\\n            if (lockData.ID) this.LockID=lockData.ID;                      //锁ID\\r\\n            if (lockData.BG) this.LockBG=lockData.BG;\\r\\n            if (lockData.TextColor) this.LockTextColor=lockData.TextColor;\\r\\n            if (lockData.Text) this.LockText=lockData.Text;\\r\\n            if (lockData.Font) this.LockFont=lockData.Font;\\r\\n            if (lockData.Count) this.LockCount=lockData.Count;\\r\\n            if (lockData.MinWidth) this.LockMinWidth=lockData.MinWidth*GetDevicePixelRatio();\\r\\n        }\\r\\n        else\\r\\n        {   //清空锁配置信息\\r\\n            this.IsLocked=false;    //是否锁住指标\\r\\n            this.LockCallback=null;\\r\\n            this.LockID=null;\\r\\n            this.LockBG=null;       //锁背景色\\r\\n            this.LockTextColor=null;\\r\\n            this.LockText=null;\\r\\n            this.LockFont=null;\\r\\n            this.LockCount=20;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ExecuteScript=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        this.OutVar=[];\\r\\n        let self = this;\\r\\n        let param=\\r\\n            {\\r\\n                HQChart:hqChart,\\r\\n                WindowIndex:windowIndex,\\r\\n                HistoryData:hisData,\\r\\n                Self:this\\r\\n            };\\r\\n\\r\\n        //数据类型\\r\\n        let hqDataType=HQ_DATA_TYPE.KLINE_ID;   //默认K线\\r\\n        if (hqChart.ClassName==='MinuteChartContainer' || hqChart.ClassName==='MinuteChartHScreenContainer')\\r\\n        {\\r\\n            if (hqChart.DayCount>1) hqDataType=HQ_DATA_TYPE.MULTIDAY_MINUTE_ID; //多日分钟\\r\\n            else hqDataType=HQ_DATA_TYPE.MINUTE_ID;                             //分钟数据\\r\\n        }\\r\\n        else if (hqChart.ClassName==='HistoryMinuteChartContainer')\\r\\n        {\\r\\n            hqDataType=HQ_DATA_TYPE.HISTORY_MINUTE_ID;   //历史分钟\\r\\n        }\\r\\n        let option=\\r\\n            {\\r\\n                HQDataType:hqDataType,\\r\\n                Symbol:hqChart.Symbol,\\r\\n                Name:hqChart.Name,\\r\\n                Data:hisData,\\r\\n                SourceData:hqChart.SourceData,\\r\\n                Callback:this.RecvResultData, CallbackParam:param,\\r\\n                Async:true,\\r\\n                MaxRequestDataCount:hqChart.MaxReqeustDataCount,\\r\\n                MaxRequestMinuteDayCount:hqChart.MaxRequestMinuteDayCount,\\r\\n                Arguments:this.Arguments,\\r\\n                Condition:this.Condition,\\r\\n                IsBeforeData:hqChart.IsBeforeData,\\r\\n                IsApiPeriod:hqChart.IsApiPeriod,\\r\\n            };\\r\\n\\r\\n        if (hqDataType===HQ_DATA_TYPE.HISTORY_MINUTE_ID) option.TrateDate=hqChart.TradeDate;\\r\\n        if (hqDataType===HQ_DATA_TYPE.MULTIDAY_MINUTE_ID) option.DayCount=hqChart.DayCount;\\r\\n        if (hqChart.NetworkFilter) option.NetworkFilter=hqChart.NetworkFilter;\\r\\n\\r\\n        if (this.Condition && !this.IsMeetCondition(param,option))\\r\\n        {\\r\\n            this.ShowConditionError(param);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        let code=this.Script;\\r\\n        let run=JSComplier.Execute(code,option,hqChart.ScriptErrorCallback);\\r\\n    }\\r\\n\\r\\n    //是否符合限制条件\\r\\n    this.IsMeetCondition=function(param,option)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[ScriptIndex::IsMeetCondition] ', this.Condition);\\r\\n        if (this.Condition.Period)      //周期是否满足\\r\\n        {\\r\\n            if (!this.IsMeetPeriodCondition(param,option)) return false;\\r\\n            if (!this.IsMeetIncludeCondition(param,option)) return false;\\r\\n        }\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //周期是否满足条件\\r\\n    this.IsMeetPeriodCondition=function(param,option)\\r\\n    {\\r\\n        if (!this.Condition.Period) return true;\\r\\n\\r\\n        for(var i in this.Condition.Period)\\r\\n        {\\r\\n            var item=this.Condition.Period[i];\\r\\n            switch(item)\\r\\n            {\\r\\n                case CONDITION_PERIOD.MINUTE_ID:\\r\\n                    if (option.HQDataType==HQ_DATA_TYPE.MINUTE_ID) return true;\\r\\n                    break;\\r\\n                case CONDITION_PERIOD.MULTIDAY_MINUTE_ID:\\r\\n                    if (option.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID) return true;\\r\\n                    break;\\r\\n                case CONDITION_PERIOD.KLINE_DAY_ID:\\r\\n                case CONDITION_PERIOD.KLINE_WEEK_ID:\\r\\n                case CONDITION_PERIOD.KLINE_MONTH_ID:\\r\\n                case CONDITION_PERIOD.KLINE_YEAR_ID:\\r\\n                case CONDITION_PERIOD.KLINE_TWOWEEK_ID:\\r\\n                case CONDITION_PERIOD.KLINE_QUARTER_ID:\\r\\n\\r\\n                case CONDITION_PERIOD.KLINE_MINUTE_ID:\\r\\n                case CONDITION_PERIOD.KLINE_5_MINUTE_ID:\\r\\n                case CONDITION_PERIOD.KLINE_15_MINUTE_ID:\\r\\n                case CONDITION_PERIOD.KLINE_30_MINUTE_ID:\\r\\n                case CONDITION_PERIOD.KLINE_60_MINUTE_ID:\\r\\n                    if (param.HQChart.Period==item) return true;\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    this.IsMeetIncludeCondition=function(param,option)\\r\\n    {\\r\\n        if (!this.Condition.Include || this.Condition.Include.length<=0) return true;\\r\\n\\r\\n        var symbol=param.HQChart.Symbol;\\r\\n        if (symbol) symbol=symbol.toUpperCase();\\r\\n        for(var i in this.Condition.Include)\\r\\n        {\\r\\n            var item=this.Condition.Include[i];\\r\\n            if (symbol==item) return true;\\r\\n        }\\r\\n        return false;\\r\\n    }\\r\\n\\r\\n    //显示指标不符合条件\\r\\n    this.ShowConditionError=function(param)\\r\\n    {\\r\\n        var hqChart=param.HQChart;\\r\\n        var windowIndex=param.WindowIndex;\\r\\n\\r\\n        hqChart.DeleteIndexPaint(windowIndex);\\r\\n        if (windowIndex==0) hqChart.ShowKLine(true);\\r\\n\\r\\n        var message='指标不支持当前品种或周期';\\r\\n\\r\\n        let line=new ChartLine();\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        line.NotSupportMessage=message;\\r\\n        hqChart.ChartPaint.push(line);\\r\\n        hqChart.Draw();\\r\\n    }\\r\\n\\r\\n    this.RecvResultData=function(outVar,param)\\r\\n    {\\r\\n        let hqChart=param.HQChart;\\r\\n        let windowIndex=param.WindowIndex;\\r\\n        let hisData=param.HistoryData;\\r\\n        param.Self.OutVar=outVar;\\r\\n        param.Self.BindData(hqChart,windowIndex,hisData);\\r\\n\\r\\n        if (param.Self.IsLocked==false) //不上锁\\r\\n        {\\r\\n            param.HQChart.Frame.SubFrame[windowIndex].Frame.SetLock(null);\\r\\n        }\\r\\n        else    //上锁\\r\\n        {\\r\\n            let lockData={ IsLocked:true,Callback:param.Self.LockCallback,IndexName:param.Self.Name ,ID:param.Self.LockID,\\r\\n                BG:param.Self.LockBG,Text:param.Self.LockText,TextColor:param.Self.LockTextColor, Font:param.Self.LockFont, Count:param.Self.LockCount, MinWidth:param.Self.LockMinWidth };\\r\\n            param.HQChart.Frame.SubFrame[windowIndex].Frame.SetLock(lockData);\\r\\n        }\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n\\r\\n        if (hqChart.GetIndexEvent)\\r\\n        {\\r\\n            var event=hqChart.GetIndexEvent();  //指标计算完成回调\\r\\n            if (event)\\r\\n            {\\r\\n                var self=param.Self;\\r\\n                var data={ OutVar:self.OutVar, WindowIndex: windowIndex, Name: self.Name, Arguments: self.Arguments, HistoryData: hisData,\\r\\n                    Stock: {Symbol:hqChart.Symbol,Name:hqChart.Name} };\\r\\n                event.Callback(event,data,self);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let line=new ChartLine();\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.DrawType=1;\\r\\n        line.Name=varItem.Name;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) line.Color=this.GetColor(varItem.Color);\\r\\n        else line.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) line.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        if (varItem.IsDotLine) line.IsDotLine=true; //虚线\\r\\n        if (varItem.IsShow==false) line.IsShow=false;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        line.Data.Data=varItem.Data;\\r\\n        if (varItem.IsShowTitle===false)    //NOTEXT 不绘制标题\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsString(varItem.Name) && varItem.Name.indexOf(\\\"NOTEXT\\\")==0) //标题中包含NOTEXT不绘制标题\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            if (varItem.NoneName)\\r\\n                hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,null,line.Color);\\r\\n            else\\r\\n                hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);\\r\\n        }\\r\\n\\r\\n        hqChart.ChartPaint.push(line);\\r\\n    }\\r\\n\\r\\n    this.CreateOverlayLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let line=new ChartSubLine();\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.DrawType=1;\\r\\n        line.Name=varItem.Name;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) line.Color=this.GetColor(varItem.Color);\\r\\n        else line.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) line.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        if (varItem.IsDotLine) line.IsDotLine=true; //虚线\\r\\n        if (varItem.IsShow==false) line.IsShow=false;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        line.Data.Data=varItem.Data;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(line);\\r\\n    }\\r\\n\\r\\n    //创建柱子\\r\\n    this.CreateBar=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let bar=new ChartStickLine();\\r\\n        bar.Canvas=hqChart.Canvas;\\r\\n        if (varItem.Draw.Width>0) bar.Width=varItem.Draw.Width;\\r\\n        else bar.Width=0;\\r\\n\\r\\n        bar.Name=varItem.Name;\\r\\n        bar.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        bar.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) bar.Color=this.GetColor(varItem.Color);\\r\\n        else bar.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        bar.Data.Data=varItem.Draw.DrawData;\\r\\n        bar.BarType=varItem.Draw.Type;\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(bar);\\r\\n    }\\r\\n\\r\\n    //创建文本\\r\\n    this.CreateText=function(hqChart,windowIndex,varItem,id,resource)\\r\\n    {\\r\\n        let chartText=new ChartSingleText();\\r\\n        chartText.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chartText.Name=varItem.Name;\\r\\n        chartText.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chartText.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chartText.ReloadResource();\\r\\n\\r\\n        if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);\\r\\n        else chartText.Color=this.GetDefaultColor(id);\\r\\n        if (varItem.IsDrawCenter===true) chartText.TextAlign='center';\\r\\n        if (varItem.IsDrawAbove===true) chartText.Direction=1;\\r\\n        if (varItem.IsDrawBelow===true) chartText.Direction=2;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        if (varItem.Draw.Position) chartText.Position=varItem.Draw.Position;    //赋值坐标\\r\\n        if (varItem.Draw.DrawData) chartText.Data.Data=varItem.Draw.DrawData;\\r\\n        chartText.Text=varItem.Draw.Text;\\r\\n        if (varItem.Draw.Direction>0) chartText.Direction=varItem.Draw.Direction;\\r\\n        if (varItem.Draw.YOffset>0) chartText.YOffset=varItem.Draw.YOffset;\\r\\n        if (varItem.Draw.TextAlign) chartText.TextAlign=varItem.Draw.TextAlign;\\r\\n\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chartText);\\r\\n    }\\r\\n\\r\\n    //COLORSTICK\\r\\n    this.CreateMACD=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chartMACD=new ChartMACD();\\r\\n        chartMACD.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chartMACD.Name=varItem.Name;\\r\\n        chartMACD.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chartMACD.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            var width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chartMACD.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chartMACD.Data.Data=varItem.Data;\\r\\n        var clrTitle=this.GetDefaultColor(id);\\r\\n        if (varItem.Color) clrTitle=this.GetColor(varItem.Color);\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(chartMACD.Data,varItem.Name,clrTitle);\\r\\n\\r\\n        hqChart.ChartPaint.push(chartMACD);\\r\\n    }\\r\\n\\r\\n    this.CreatePointDot=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let pointDot=new ChartPointDot();\\r\\n        pointDot.Canvas=hqChart.Canvas;\\r\\n        pointDot.Name=varItem.Name;\\r\\n        pointDot.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        pointDot.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) pointDot.Color=this.GetColor(varItem.Color);\\r\\n        else pointDot.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.Radius) pointDot.Radius=varItem.Radius;\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) pointDot.Radius=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        pointDot.Data.Data=varItem.Data;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(pointDot.Data,varItem.Name,pointDot.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(pointDot);\\r\\n    }\\r\\n\\r\\n    this.CreateStick=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartStick();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateLineStick=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartLineStick();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateStraightLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let line=new ChartLine();\\r\\n        line.DrawType=1;\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.Name=varItem.Name;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) line.Color=this.GetColor(varItem.Color);\\r\\n        else line.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) line.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        line.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        if (varItem.Name==\\\"DRAWLINE\\\")\\r\\n            hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,null,line.Color);\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(line);\\r\\n    }\\r\\n\\r\\n    this.CreateVolStick=function(hqChart,windowIndex,varItem,id,hisData)\\r\\n    {\\r\\n        let chart=new ChartVolStick();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chart.KLineDrawType=hqChart.KLineDrawType;  //设置K线显示类型\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        chart.HistoryData=hisData;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateBand=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartBand();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.FirstColor = varItem.Draw.Color[0];\\r\\n        chart.SecondColor = varItem.Draw.Color[1];\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateFillRGN=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartLineArea();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateFillRGN2=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartFillRGN();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateFillBGRGN=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartFillBGRGN();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateFLOATRGN=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartFLOATRGN();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建K线图\\r\\n    this.CreateKLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartKLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        chart.IsShowMaxMinPrice=false;\\r\\n        chart.IsShowKTooltip=false;\\r\\n\\r\\n        if (varItem.Color)  //如果设置了颜色,使用外面设置的颜色\\r\\n            chart.UnchagneColor=chart.DownColor=chart.UpColor=this.GetColor(varItem.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreatePolyLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let line=new ChartLine();\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.Name=varItem.Name;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) line.Color=this.GetColor(varItem.Color);\\r\\n        else line.Color=this.GetDefaultColor(id);\\r\\n        if (varItem.IsDotLine) line.IsDotLine=true; //虚线\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) line.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        line.Data.Data=varItem.Draw.DrawData;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,' ',line.Color); //给一个空的标题\\r\\n\\r\\n        hqChart.ChartPaint.push(line);\\r\\n    }\\r\\n\\r\\n    this.CreateChartSlopeLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let line=new ChartSlopeLine();\\r\\n        line.Canvas=hqChart.Canvas;\\r\\n        line.Name=varItem.Name;\\r\\n        line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) line.Color=this.GetColor(varItem.Color);\\r\\n        else line.Color=this.GetDefaultColor(id);\\r\\n        if (varItem.IsDotLine) line.IsDotLine=true; //虚线\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) line.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        line.Data.Data=varItem.Draw.DrawData.Data;\\r\\n        line.Option=varItem.Draw.DrawData.Option;\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,null,line.Color); //给一个空的标题\\r\\n\\r\\n        hqChart.ChartPaint.push(line);\\r\\n    }\\r\\n\\r\\n    this.CreateChartVericaltLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var chart=new ChartVericaltLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        this.SetChartLineDash(chart,varItem.Draw.DrawData);\\r\\n        chart.Data.Data=varItem.Draw.DrawData.Data;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.SetChartLineDash=function(chart, option)\\r\\n    {\\r\\n        if (IFrameSplitOperator.IsNumber(option.LineType))\\r\\n        {\\r\\n            var lineType=option.LineType;\\r\\n            var pixelRatio=GetDevicePixelRatio();\\r\\n            switch(lineType)\\r\\n            {\\r\\n                case 1:\\r\\n                    chart.LineType=[10*pixelRatio,10*pixelRatio];\\r\\n                    break;\\r\\n                case 2:\\r\\n                    chart.LineType=[0,10*pixelRatio];\\r\\n                    chart.LineCap=\\\"square\\\";\\r\\n                    break;\\r\\n                case 3:\\r\\n                    chart.LineType=[10*pixelRatio, 3*pixelRatio, 3*pixelRatio, 3*pixelRatio];\\r\\n                    break;\\r\\n                case 4:\\r\\n                    chart.LineType=[10*pixelRatio, 3*pixelRatio, 3*pixelRatio, 3*pixelRatio,3*pixelRatio,3*pixelRatio];\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n        else if (IFrameSplitOperator.IsString(option.LineType))\\r\\n        {\\r\\n            var aryString=option.LineType.split(',');\\r\\n            var aryLinType=[];\\r\\n            for(var i=0;i<aryString.length;++i)\\r\\n            {\\r\\n                aryLinType.push(parseInt(aryString[i]));\\r\\n            }\\r\\n            chart.LineType=aryLinType;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.CreateChartHorizontalLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var chart=new ChartHorizontalLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        this.SetChartLineDash(chart,varItem.Draw.DrawData);\\r\\n        chart.ExtendType=varItem.Draw.DrawData.Extend;\\r\\n        chart.Data.Data=varItem.Draw.DrawData.Data;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n\\r\\n    this.CreateBackgroud=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartBackground();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Draw && varItem.Draw.DrawData)\\r\\n        {\\r\\n            var drawData=varItem.Draw.DrawData;\\r\\n            chart.Color=drawData.Color;\\r\\n            chart.ColorAngle=drawData.Angle;\\r\\n\\r\\n            if (drawData.Data) chart.Data.Data=drawData.Data;\\r\\n        }\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateTextLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartTextLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Draw && varItem.Draw.DrawData)\\r\\n        {\\r\\n            var drawData=varItem.Draw.DrawData;\\r\\n            chart.Text=drawData.Text;\\r\\n            chart.Line=drawData.Line;\\r\\n            chart.Price=drawData.Price;\\r\\n        }\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateNumberText=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chartText=new ChartSingleText();\\r\\n        chartText.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chartText.Name=varItem.Name;\\r\\n        chartText.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chartText.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chartText.ReloadResource();\\r\\n        chartText.TextAlign=\\\"center\\\";\\r\\n\\r\\n        if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);\\r\\n        else chartText.Color=this.GetDefaultColor(id);\\r\\n        if (varItem.IsDrawAbove) chartText.Direction=1;\\r\\n        else chartText.Direction=2;\\r\\n\\r\\n        if (varItem.Draw.Position) chartText.Position=varItem.Draw.Position;    //赋值坐标\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chartText.Data.Data=varItem.Draw.DrawData.Value;\\r\\n        chartText.Text=varItem.Draw.DrawData.Text;\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chartText);\\r\\n    }\\r\\n\\r\\n    this.CreateDrawText=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chartText=new ChartSingleText();\\r\\n        chartText.Canvas=hqChart.Canvas;\\r\\n        chartText.Name=varItem.Name;\\r\\n        chartText.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chartText.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chartText.ReloadResource();\\r\\n\\r\\n        if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);\\r\\n        else chartText.Color=this.GetDefaultColor(id);\\r\\n        if (varItem.IsDrawAbove) chartText.Direction=1;\\r\\n        else chartText.Direction=0;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chartText.DrawData=varItem.Draw.DrawData;\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chartText);\\r\\n    }\\r\\n\\r\\n    //创建图标\\r\\n    this.CreateIcon=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chartText=new ChartSingleText();\\r\\n        chartText.Canvas=hqChart.Canvas;\\r\\n        chartText.TextAlign='center';\\r\\n\\r\\n        chartText.Name=varItem.Name;\\r\\n        chartText.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chartText.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chartText.Direction=2;\\r\\n        if (varItem.IsDrawAbove) chartText.Direction=1;\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chartText.Data.Data=varItem.Draw.DrawData;\\r\\n        var icon=varItem.Draw.Icon;\\r\\n        if (icon.IconFont==true)\\r\\n        {\\r\\n            chartText.IconFont={ Family:icon.Family, Text:icon.Symbol, Color:icon.Color };\\r\\n            if (varItem.Color) chartText.IconFont.Color=this.GetColor(varItem.Color);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            chartText.Text=icon.Symbol;\\r\\n            if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);\\r\\n            else if (icon.Color) chartText.Color=icon.Color;\\r\\n            else chartText.Color='rgb(0,0,0)';\\r\\n        }\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chartText);\\r\\n    }\\r\\n\\r\\n    //创建通道\\r\\n    this.CreateChannel=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartChannel();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        if(varItem.Draw.AreaColor) chart.AreaColor=varItem.Draw.AreaColor;\\r\\n        else if (varItem.Color) chart.AreaColor=this.GetColor(varItem.Color);\\r\\n        else chart.AreaColor=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.Draw.Border.Color) chart.LineColor=varItem.Draw.Border.Color;\\r\\n        else chart.LineColor=null;\\r\\n\\r\\n        if (varItem.Draw.Border.Dotted) chart.LineDotted=varItem.Draw.Border.Dotted;\\r\\n        if (varItem.Draw.Border.Width>0) chart.LineWidth=varItem.Draw.Border.Width;\\r\\n\\r\\n        //let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreatePartLine=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartPartLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiLine=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartMultiLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Lines=varItem.Draw.DrawData;\\r\\n        if (varItem.Draw.LineDash) chart.LineDash=varItem.Draw.LineDash;\\r\\n        if (IFrameSplitOperator.IsNumber(varItem.Draw.LineWidth)) chart.LineWidth=varItem.Draw.LineWidth;\\r\\n        if(varItem.Draw.Arrow)  //箭头配置\\r\\n        {\\r\\n            var item=varItem.Draw.Arrow;\\r\\n            if (item.Start==true) chart.Arrow.Start=true;\\r\\n            if (item.End==true) chart.Arrow.End=true;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Angle)) chart.ArrawAngle=item.Angle;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Length)) chart.ArrawLength=item.Length;\\r\\n            if (IFrameSplitOperator.IsNumber(item.LineWidth)) chart.ArrawLineWidth=item.LineWidth;\\r\\n        }\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiBar=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        let chart=new ChartMultiBar();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Bars=varItem.Draw.DrawData;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);\\r\\n        titleData.IsShow=false;\\r\\n        titleData.DataType=\\\"MULTI_BAR\\\";\\r\\n        hqChart.TitlePaint[titleIndex].Data[id]=titleData;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiText=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartMultiText();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Texts=varItem.Draw.DrawData;\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiSVGIcon=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartMultiSVGIcon();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Family=varItem.Draw.DrawData.Family;\\r\\n        chart.Icon= varItem.Draw.DrawData.Icon;\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMulitHtmlDom=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartMultiHtmlDom();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        chart.HQChart=hqChart;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Texts=varItem.Draw.DrawData;\\r\\n        chart.DrawCallback= varItem.Draw.Callback;\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateColorKLine=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartColorKline();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.KLineColor= varItem.Draw.DrawData.KLine;\\r\\n        if (varItem.Color) chart.Color=varItem.Color;\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateRectangle=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartRectangle();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Color=[varItem.Draw.DrawData.Color];\\r\\n        chart.Rect=varItem.Draw.DrawData.Rect;\\r\\n        if (varItem.Color) chart.BorderColor=this.GetColor(varItem.Color);\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateScriptOverlayLine=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        let chart=new ChartOverlayLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.DrawType=1;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(i);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        if (varItem.IsDotLine) chart.IsDotLine=true; //虚线\\r\\n        if (varItem.IsShow==false) chart.IsShow=false;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData.Data;\\r\\n        chart.MainData.Data=varItem.Draw.DrawData.MainData;\\r\\n\\r\\n        if (varItem.Draw.DrawData.Title)\\r\\n            hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(chart.Data,varItem.Draw.DrawData.Title,chart.Color);\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建K线\\r\\n    this.CreateSelfKLine=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        let chart=new ChartKLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=\\\"Self Kline\\\"\\r\\n        chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;\\r\\n        chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;\\r\\n\\r\\n        chart.Data=hisData\\r\\n        chart.IsShowMaxMinPrice=false;\\r\\n        chart.IsShowKTooltip=false;\\r\\n        chart.DrawType=this.KLineType;\\r\\n\\r\\n        hqChart.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.BindInstructionData=function(hqChart,windowIndex,hisData)  //绑定指示指标\\r\\n    {\\r\\n        if (this.OutVar==null || this.OutVar.length<0) return;\\r\\n\\r\\n        //参数\\r\\n        var indexParam='';\\r\\n        for(let i in this.Arguments)\\r\\n        {\\r\\n            let item=this.Arguments[i];\\r\\n            if (indexParam.length>0) indexParam+=',';\\r\\n            indexParam+=item.Value.toString();\\r\\n        }\\r\\n        if (indexParam.length>0) indexParam='('+indexParam+')';\\r\\n\\r\\n        if (this.InstructionType==2)        //五彩K线\\r\\n        {\\r\\n            let varItem=this.OutVar[this.OutVar.length-1]; //取最后一组数据作为指示数据\\r\\n            hqChart.SetInstructionData(this.InstructionType, {Data:varItem.Data, Name:this.Name, Param:indexParam, ID:this.ID });       //设置指示数据\\r\\n            return true;\\r\\n        }\\r\\n        else if (this.InstructionType==1)   //交易系统\\r\\n        {\\r\\n            var buyData, sellData;\\r\\n            for(var i in this.OutVar)\\r\\n            {\\r\\n                let item=this.OutVar[i];\\r\\n                if (item.Name=='ENTERLONG') buyData=item.Data;\\r\\n                else if (item.Name=='EXITLONG') sellData=item.Data;\\r\\n            }\\r\\n\\r\\n            hqChart.SetInstructionData(this.InstructionType, {Buy:buyData, Sell:sellData, Name:this.Name, Param:indexParam, ID:this.ID});       //设置指示数据\\r\\n            return true;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        if (windowIndex==0 && this.InstructionType)\\r\\n        {\\r\\n            this.BindInstructionData(hqChart,windowIndex,hisData);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //清空主指标图形\\r\\n        hqChart.DeleteIndexPaint(windowIndex);\\r\\n        if (windowIndex==0) hqChart.ShowKLine(true);\\r\\n\\r\\n        if (this.OutVar==null || this.OutVar.length<0) return;\\r\\n\\r\\n        //叠加一个K线背景\\r\\n        if (this.KLineType!=null)\\r\\n        {\\r\\n            if (this.KLineType===0 || this.KLineType===1 || this.KLineType===2) this.CreateSelfKLine(hqChart,windowIndex,hisData);\\r\\n            else if (this.KLineType===-1 && windowIndex==0) hqChart.ShowKLine(false);\\r\\n        }\\r\\n\\r\\n        if (windowIndex>=1 && hqChart.Frame)\\r\\n        {\\r\\n            hqChart.Frame.SubFrame[windowIndex].Frame.YSplitOperator.FloatPrecision=this.FloatPrecision;\\r\\n            if (this.YSpecificMaxMin)  hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin=this.YSpecificMaxMin;  //最大最小值\\r\\n            if (this.YSplitScale)   hqChart.Frame.SubFrame[windowIndex].Frame.YSplitScale=this.YSplitScale;             //固定刻度\\r\\n        }\\r\\n\\r\\n        /*\\r\\n        if (this.Name=='MA')    //测试多线段\\r\\n        {\\r\\n            var point1={Point:[{Index:300, Value:15.5}, {Index:301, Value:14.2} , {Index:304, Value:14.05}], Color:'rgb(244,55,50)'};\\r\\n            var point2={Point:[{Index:307, Value:14.5}, {Index:308, Value:14.2} , {Index:309, Value:14.15}], Color:'rgb(0,55,50)'};\\r\\n            var testData={ Name:'MULTI_LINE', Type:1,Draw:{ DrawType:'MULTI_LINE', DrawData:[point1,point2] } };\\r\\n            this.OutVar.push(testData);\\r\\n        }\\r\\n        */\\r\\n\\r\\n        for(let i in this.OutVar)\\r\\n        {\\r\\n            let item=this.OutVar[i];\\r\\n            if (item.IsExData===true) continue; //扩展数据不显示图形\\r\\n            if (item.Type==1000 || item.Type==1001) continue;      //数据集合, 字符串\\r\\n\\r\\n            if (item.Type==0)\\r\\n            {\\r\\n                if (item.IsOverlayLine) this.CreateOverlayLine(hqChart,windowIndex,item,i);\\r\\n                else this.CreateLine(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==1)\\r\\n            {\\r\\n                switch(item.Draw.DrawType)\\r\\n                {\\r\\n                    case 'STICKLINE':\\r\\n                        this.CreateBar(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWTEXT':\\r\\n                    case 'SUPERDRAWTEXT':\\r\\n                        this.CreateText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWLINE':\\r\\n                        this.CreateStraightLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWBAND':\\r\\n                        this.CreateBand(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"FILLRGN\\\":\\r\\n                        this.CreateFillRGN(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"FILLRGN2\\\":\\r\\n                        this.CreateFillRGN2(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"FILLTOPRGN\\\":\\r\\n                    case \\\"FILLBOTTOMRGN\\\":\\r\\n                    case \\\"FILLVERTICALRGN\\\":\\r\\n                        this.CreateFillBGRGN(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"FLOATRGN\\\":\\r\\n                        this.CreateFLOATRGN(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWKLINE':\\r\\n                        this.CreateKLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWKLINE_IF':\\r\\n                        this.CreateKLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'POLYLINE':\\r\\n                        this.CreatePolyLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWGBK':\\r\\n                    case \\\"DRAWGBK2\\\":\\r\\n                        this.CreateBackgroud(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWTEXT_LINE':\\r\\n                        this.CreateTextLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWNUMBER':\\r\\n                    case \\\"DRAWNUMBER_FIX\\\":\\r\\n                    case 'DRAWTEXT_FIX':\\r\\n                        this.CreateNumberText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWICON':\\r\\n                        this.CreateIcon(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWCHANNEL':\\r\\n                        this.CreateChannel(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'PARTLINE':\\r\\n                        this.CreatePartLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWRECTREL':\\r\\n                        this.CreateRectangle(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"DRAWTEXTABS\\\":\\r\\n                    case \\\"DRAWTEXTREL\\\":\\r\\n                        this.CreateDrawText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"DRAWOVERLAYLINE\\\":\\r\\n                        this.CreateScriptOverlayLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"DRAWSL\\\":\\r\\n                        this.CreateChartSlopeLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"VERTLINE\\\":\\r\\n                        this.CreateChartVericaltLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"HORLINE\\\":\\r\\n                        this.CreateChartHorizontalLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_LINE':\\r\\n                        this.CreateMultiLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_BAR':\\r\\n                        this.CreateMultiBar(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_TEXT':\\r\\n                        this.CreateMultiText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_SVGICON':\\r\\n                        this.CreateMultiSVGIcon(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"MULTI_HTMLDOM\\\":\\r\\n                        this.CreateMulitHtmlDom(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"COLOR_KLINE\\\":\\r\\n                        this.CreateColorKLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"KLINE_BG\\\":\\r\\n                        this.CreateBackgroud(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                }\\r\\n            }\\r\\n            else if (item.Type==2)\\r\\n            {\\r\\n                this.CreateMACD(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==3)\\r\\n            {\\r\\n                this.CreatePointDot(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==4)\\r\\n            {\\r\\n                this.CreateLineStick(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==5)\\r\\n            {\\r\\n                this.CreateStick(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==6)\\r\\n            {\\r\\n                this.CreateVolStick(hqChart,windowIndex,item,i,hisData);\\r\\n            }\\r\\n\\r\\n            var titlePaint=hqChart.TitlePaint[windowIndex+1];\\r\\n            if (titlePaint &&  titlePaint.Data && i<titlePaint.Data.length) //设置标题数值 小数位数和格式\\r\\n            {\\r\\n                if (this.StringFormat>0) titlePaint.Data[i].StringFormat=this.StringFormat;\\r\\n                if (this.FloatPrecision>=0) titlePaint.Data[i].FloatPrecision=this.FloatPrecision;\\r\\n\\r\\n                if (this.OutName && this.OutName.length>0 && this.Arguments && this.Arguments.length>0)\\r\\n                {\\r\\n                    titlePaint.SetDynamicTitle(this.OutName,this.Arguments);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        hqChart.TitlePaint[titleIndex].Title=this.Name;\\r\\n\\r\\n        if (!this.IsShortTitle)\\r\\n        {\\r\\n            let indexParam='';\\r\\n            for(let i in this.Arguments)\\r\\n            {\\r\\n                let item=this.Arguments[i];\\r\\n                if (indexParam.length>0) indexParam+=',';\\r\\n                indexParam+=item.Value.toString();\\r\\n            }\\r\\n\\r\\n            if (indexParam.length>0) hqChart.TitlePaint[titleIndex].Title=this.Name+'('+indexParam+')';\\r\\n        }\\r\\n\\r\\n        if (this.TitleFont) hqChart.TitlePaint[titleIndex].Font=this.TitleFont;\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n\\r\\n    //给一个默认的颜色\\r\\n    this.GetDefaultColor=function(id)\\r\\n    {\\r\\n        let COLOR_ARRAY=null;\\r\\n        //使用全局线段配置\\r\\n        if (g_JSChartResource && g_JSChartResource.Index && g_JSChartResource.Index.LineColor)\\r\\n        {\\r\\n            COLOR_ARRAY=g_JSChartResource.Index.LineColor;\\r\\n        }\\r\\n\\r\\n        if (!COLOR_ARRAY || !Array.isArray(COLOR_ARRAY))\\r\\n        {\\r\\n            COLOR_ARRAY=\\r\\n                [\\r\\n                    \\\"rgb(255,174,0)\\\",\\r\\n                    \\\"rgb(25,199,255)\\\",\\r\\n                    \\\"rgb(175,95,162)\\\",\\r\\n                    \\\"rgb(236,105,65)\\\",\\r\\n                    \\\"rgb(68,114,196)\\\",\\r\\n                    \\\"rgb(229,0,79)\\\",\\r\\n                    \\\"rgb(0,128,255)\\\",\\r\\n                    \\\"rgb(252,96,154)\\\",\\r\\n                    \\\"rgb(42,230,215)\\\",\\r\\n                    \\\"rgb(24,71,178)\\\",\\r\\n                ];\\r\\n        }\\r\\n\\r\\n        let number=parseInt(id);\\r\\n        return COLOR_ARRAY[number%(COLOR_ARRAY.length-1)];\\r\\n    }\\r\\n\\r\\n    //获取颜色\\r\\n    this.GetColor=function(colorName)\\r\\n    {\\r\\n        let COLOR_MAP=new Map([\\r\\n            ['COLORBLACK','rgb(0,0,0)'],\\r\\n            ['COLORBLUE','rgb(18,95,216)'],\\r\\n            ['COLORGREEN','rgb(25,158,0)'],\\r\\n            ['COLORCYAN','rgb(0,255,198)'],\\r\\n            ['COLORRED','rgb(238,21,21)'],\\r\\n            ['COLORMAGENTA','rgb(255,0,222)'],\\r\\n            ['COLORBROWN','rgb(149,94,15)'],\\r\\n            ['COLORLIGRAY','rgb(218,218,218)'],      //画淡灰色\\r\\n            ['COLORGRAY','rgb(133,133,133)'],        //画深灰色\\r\\n            ['COLORLIBLUE','rgb(94,204,255)'],       //淡蓝色\\r\\n            ['COLORLIGREEN','rgb(183,255,190)'],      //淡绿色\\r\\n            ['COLORLICYAN','rgb(154,255,242)'],      //淡青色\\r\\n            ['COLORLIRED','rgb(255,172,172)'],       //淡红色\\r\\n            ['COLORLIMAGENTA','rgb(255,145,241)'],   //淡洋红色\\r\\n            ['COLORWHITE','rgb(255,255,255)'],       //白色\\r\\n            ['COLORYELLOW','rgb(255,198,0)']\\r\\n        ]);\\r\\n\\r\\n        if (COLOR_MAP.has(colorName)) return COLOR_MAP.get(colorName);\\r\\n\\r\\n        //COLOR 自定义色\\r\\n        //格式为COLOR+“RRGGBB”：RR、GG、BB表示红色、绿色和蓝色的分量，每种颜色的取值范围是00-FF，采用了16进制。\\r\\n        //例如：MA5：MA(CLOSE，5)，COLOR00FFFF　表示纯红色与纯绿色的混合色：COLOR808000表示淡蓝色和淡绿色的混合色。\\r\\n        if (colorName.indexOf('COLOR')==0) return '#'+colorName.substr(5);\\r\\n\\r\\n        return 'rgb(30,144,255)';\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction OverlayScriptIndex(name,script,args,option)\\r\\n{\\r\\n    this.newMethod=ScriptIndex;   //派生\\r\\n    this.newMethod(name,script,args,option);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"OverlayScriptIndex\\\";\\r\\n    //叠加指标\\r\\n    this.OverlayIndex=null; // { IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame }\\r\\n\\r\\n    this.BindData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        if (!this.OverlayIndex || this.OverlayIndex.IsOverlay!=true) return;\\r\\n\\r\\n        this.OverlayIndex.Frame.ChartPaint=[];\\r\\n        if (this.OutVar==null || this.OutVar.length<0) return;\\r\\n\\r\\n        /*叠加一个K线背景\\r\\n        if (this.KLineType!=null)\\r\\n        {\\r\\n            if (this.KLineType===0 || this.KLineType===1 || this.KLineType===2) this.CreateSelfKLine(hqChart,windowIndex,hisData);\\r\\n            else if (this.KLineType===-1 && windowIndex==0) hqChart.ShowKLine(false);\\r\\n        }\\r\\n\\r\\n        if (windowIndex>=1 && hqChart.Frame)\\r\\n        {\\r\\n            hqChart.Frame.SubFrame[windowIndex].Frame.YSplitOperator.FloatPrecision=this.FloatPrecision;\\r\\n            if (this.YSpecificMaxMin)  hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin=this.YSpecificMaxMin;  //最大最小值\\r\\n            if (this.YSplitScale)   hqChart.Frame.SubFrame[windowIndex].Frame.YSplitScale=this.YSplitScale;             //固定刻度\\r\\n        }\\r\\n        */\\r\\n\\r\\n        //指标名字\\r\\n        var titleInfo={ Data:[], Title:this.Name };\\r\\n        let indexParam='';\\r\\n        for(var i in this.Arguments)\\r\\n        {\\r\\n            let item=this.Arguments[i];\\r\\n            if (indexParam.length>0) indexParam+=',';\\r\\n            indexParam+=item.Value.toString();\\r\\n        }\\r\\n        if (indexParam.length>0) titleInfo.Title=this.Name+'('+indexParam+')';\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);\\r\\n        this.OverlayIndex.Frame.Frame.Title=titleInfo.Title;    //给子框架设置标题\\r\\n        if (this.OutName && this.OutName.length>0 && this.Arguments && this.Arguments.length>0)\\r\\n        {\\r\\n            titlePaint.SetDynamicTitle(this.OutName,this.Arguments, this.OverlayIndex.Identify);\\r\\n        }\\r\\n\\r\\n        for(var i in this.OutVar)\\r\\n        {\\r\\n            let item=this.OutVar[i];\\r\\n            if (item.IsExData===true) continue; //扩展数据不显示图形\\r\\n\\r\\n            if (item.Type==0)\\r\\n            {\\r\\n                this.CreateLine(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==1)\\r\\n            {\\r\\n                switch(item.Draw.DrawType)\\r\\n                {\\r\\n                    case 'STICKLINE':\\r\\n                        this.CreateBar(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWTEXT':\\r\\n                    case 'SUPERDRAWTEXT':\\r\\n                        this.CreateText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWLINE':\\r\\n                        this.CreateStraightLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWBAND':\\r\\n                        this.CreateBand(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWKLINE':\\r\\n                        this.CreateKLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWKLINE_IF':\\r\\n                        this.CreateKLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'POLYLINE':\\r\\n                        this.CreatePolyLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWNUMBER':\\r\\n                    case \\\"DRAWNUMBER_FIX\\\":\\r\\n                    case 'DRAWTEXT_FIX':\\r\\n                        this.CreateNumberText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWICON':\\r\\n                        this.CreateIcon(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWCHANNEL':\\r\\n                        this.CreateChannel(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'DRAWTEXT_LINE':\\r\\n                        this.CreateTextLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"VERTLINE\\\":\\r\\n                        this.CreateChartVericaltLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"HORLINE\\\":\\r\\n                        this.CreateChartHorizontalLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n\\r\\n                    case 'MULTI_LINE':\\r\\n                        this.CreateMultiLine(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_BAR':\\r\\n                        this.CreateMultiBar(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_TEXT':\\r\\n                        this.CreateMultiText(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case 'MULTI_SVGICON':\\r\\n                        this.CreateMultiSVGIcon(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                    case \\\"MULTI_HTMLDOM\\\":\\r\\n                        this.CreateMulitHtmlDom(hqChart,windowIndex,item,i);\\r\\n                        break;\\r\\n                }\\r\\n            }\\r\\n            else if (item.Type==2)\\r\\n            {\\r\\n                this.CreateMACD(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==3)\\r\\n            {\\r\\n                this.CreatePointDot(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==4)\\r\\n            {\\r\\n                this.CreateLineStick(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==5)\\r\\n            {\\r\\n                this.CreateStick(hqChart,windowIndex,item,i);\\r\\n            }\\r\\n            else if (item.Type==6)\\r\\n            {\\r\\n                this.CreateVolStick(hqChart,windowIndex,item,i,hisData);\\r\\n            }\\r\\n        }\\r\\n\\r\\n\\r\\n        /*\\r\\n        hqChart.TitlePaint[titleIndex].Title=this.Name;\\r\\n\\r\\n        let indexParam='';\\r\\n        for(let i in this.Arguments)\\r\\n        {\\r\\n            let item=this.Arguments[i];\\r\\n            if (indexParam.length>0) indexParam+=',';\\r\\n            indexParam+=item.Value.toString();\\r\\n        }\\r\\n\\r\\n        if (indexParam.length>0) hqChart.TitlePaint[titleIndex].Title=this.Name+'('+indexParam+')';\\r\\n        */\\r\\n\\r\\n        return true;\\r\\n    }\\r\\n\\r\\n    //指标执行完成\\r\\n    this.RecvResultData=function(outVar,param)\\r\\n    {\\r\\n        let hqChart=param.HQChart;\\r\\n        let windowIndex=param.WindowIndex;\\r\\n        let hisData=param.HistoryData;\\r\\n        param.Self.OutVar=outVar;\\r\\n        param.Self.BindData(hqChart,windowIndex,hisData);\\r\\n\\r\\n        param.HQChart.UpdataDataoffset();           //更新数据偏移\\r\\n        param.HQChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        param.HQChart.Draw();\\r\\n\\r\\n        var event=hqChart.GetOverlayIndexEvent();  //指标计算完成回调\\r\\n        if (event)\\r\\n        {\\r\\n            var self=param.Self;\\r\\n            var data={ OutVar:self.OutVar, WindowIndex: windowIndex, Name: self.Name, Arguments: self.Arguments, HistoryData: hisData,\\r\\n                Identify:self.OverlayIndex.Identify,\\r\\n                Stock: {Symbol:hqChart.Symbol,Name:hqChart.Name} };\\r\\n            event.Callback(event,data,self);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //////////////////////////////////////////////////////////////////////////////////////\\r\\n    //  图形创建\\r\\n    /////////////////////////////////////////////////////////////////////////////////////\\r\\n\\r\\n    this.CreateLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.DrawType=1;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        if (varItem.IsShow==false) chart.IsShow=false;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建柱子\\r\\n    this.CreateBar=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartStickLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        if (varItem.Draw.Width>0) chart.Width=varItem.Draw.Width;\\r\\n        else chart.Width=1;\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建文本\\r\\n    this.CreateText=function(hqChart,windowIndex,varItem,id, drawName)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartSingleText();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        chart.ReloadResource();\\r\\n\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        if (varItem.Draw.Position) chart.Position=varItem.Draw.Position;    //赋值坐标\\r\\n        if (varItem.Draw.DrawData) chart.Data.Data=varItem.Draw.DrawData;\\r\\n        chart.Text=varItem.Draw.Text;\\r\\n        if (varItem.Draw.Direction>0) chart.Direction=varItem.Draw.Direction;\\r\\n        if (varItem.Draw.YOffset>0) chart.YOffset=varItem.Draw.YOffset;\\r\\n        if (varItem.Draw.TextAlign) chart.TextAlign=varItem.Draw.TextAlign;\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //COLORSTICK\\r\\n    this.CreateMACD=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartMACD();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        var clrTitle=this.GetDefaultColor(id);\\r\\n        if (varItem.Color) clrTitle=this.GetColor(varItem.Color);\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,clrTitle);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreatePointDot=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartPointDot();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.Radius) chart.Radius=varItem.Radius;\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.Radius=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateStick=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartStick();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateLineStick=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartLineStick();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateStraightLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartLine();\\r\\n        chart.DrawType=1;\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateVolStick=function(hqChart,windowIndex,varItem,id,hisData)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartVolStick();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        chart.KLineDrawType=hqChart.KLineDrawType;  //设置K线显示类型\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Data;\\r\\n        chart.HistoryData=hisData;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateBand=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartBand();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.FirstColor = varItem.Draw.Color[0];\\r\\n        chart.SecondColor = varItem.Draw.Color[1];\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建K线图\\r\\n    this.CreateKLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartKLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        chart.IsShowMaxMinPrice=false;\\r\\n        chart.IsShowKTooltip=false;\\r\\n\\r\\n        if (varItem.Color)  //如果设置了颜色,使用外面设置的颜色\\r\\n            chart.UnchagneColor=chart.DownColor=chart.UpColor=this.GetColor(varItem.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreatePolyLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(line.Data,' ',line.Color); //给一个空的标题\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateNumberText=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartSingleText();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        chart.ReloadResource();\\r\\n\\r\\n        chart.TextAlign=\\\"center\\\";\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n        if (varItem.IsDrawAbove) chart.Direction=1;\\r\\n        else chart.Direction=2;\\r\\n\\r\\n        if (varItem.Draw.Position) chart.Position=varItem.Draw.Position;    //赋值坐标\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData.Value;\\r\\n        chart.Text=varItem.Draw.DrawData.Text;\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateTextLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartTextLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        if (varItem.Draw && varItem.Draw.DrawData)\\r\\n        {\\r\\n            var drawData=varItem.Draw.DrawData;\\r\\n            chart.Text=drawData.Text;\\r\\n            chart.Line=drawData.Line;\\r\\n            chart.Price=drawData.Price;\\r\\n        }\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建图标\\r\\n    this.CreateIcon=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartSingleText();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.TextAlign='center';\\r\\n\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        var icon=varItem.Draw.Icon;\\r\\n        if (icon.IconFont==true)\\r\\n        {\\r\\n            chart.IconFont={ Family:icon.Family, Text:icon.Symbol, Color:icon.Color };\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            chart.Text=icon.Symbol;\\r\\n            if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n            else if (icon.Color) chart.Color=icon.Color;\\r\\n            else chart.Color='rgb(0,0,0)';\\r\\n        }\\r\\n\\r\\n        //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建通道\\r\\n    this.CreateChannel=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartChannel();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        if(varItem.Draw.AreaColor) chart.AreaColor=varItem.Draw.AreaColor;\\r\\n        else if (varItem.Color) chart.AreaColor=this.GetColor(varItem.Color);\\r\\n        else chart.AreaColor=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.Draw.Border.Color) chart.LineColor=varItem.Draw.Border.Color;\\r\\n        else chart.LineColor=null;\\r\\n\\r\\n        if (varItem.Draw.Border.Dotted) chart.LineDotted=varItem.Draw.Border.Dotted;\\r\\n        if (varItem.Draw.Border.Width>0) chart.LineWidth=varItem.Draw.Border.Width;\\r\\n\\r\\n        //let titleIndex=windowIndex+1;\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //\\r\\n    this.CreatePartLine=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartPartLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data.Data=varItem.Draw.DrawData;\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiLine=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartMultiLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Lines=varItem.Draw.DrawData;\\r\\n        if (varItem.Draw.LineDash) chart.LineDash=varItem.Draw.LineDash;\\r\\n        if (IFrameSplitOperator.IsNumber(varItem.Draw.LineWidth)) chart.LineWidth=varItem.Draw.LineWidth;\\r\\n        if(varItem.Draw.Arrow)  //箭头配置\\r\\n        {\\r\\n            var item=varItem.Draw.Arrow;\\r\\n            if (item.Start==true) chart.Arrow.Start=true;\\r\\n            if (item.End==true) chart.Arrow.End=true;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Angle)) chart.ArrawAngle=item.Angle;\\r\\n            if (IFrameSplitOperator.IsNumber(item.Length)) chart.ArrawLength=item.Length;\\r\\n            if (IFrameSplitOperator.IsNumber(item.LineWidth)) chart.ArrawLineWidth=item.LineWidth;\\r\\n        }\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiBar=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartMultiBar();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Bars=varItem.Draw.DrawData;\\r\\n\\r\\n        var titleIndex=windowIndex+1;\\r\\n        var titlePaint=hqChart.TitlePaint[titleIndex];\\r\\n        var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);\\r\\n        titleData.IsShow=false;\\r\\n        titleData.DataType=\\\"MULTI_BAR\\\";\\r\\n        titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiText=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartMultiText();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Texts=varItem.Draw.DrawData;\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMultiSVGIcon=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartMultiSVGIcon();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Family=varItem.Draw.DrawData.Family;\\r\\n        chart.Icon= varItem.Draw.DrawData.Icon;\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateMulitHtmlDom=function(hqChart,windowIndex,varItem,i)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartMultiHtmlDom();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        chart.HQChart=hqChart;\\r\\n\\r\\n        chart.Data=hqChart.ChartPaint[0].Data;//绑定K线\\r\\n        chart.Texts=varItem.Draw.DrawData;\\r\\n        chart.DrawCallback= varItem.Draw.Callback;\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateChartVericaltLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        var chart=new ChartVericaltLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        chart.HQChart=hqChart;\\r\\n\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        this.SetChartLineDash(chart,varItem.Draw.DrawData);\\r\\n        chart.Data.Data=varItem.Draw.DrawData.Data;\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    this.CreateChartHorizontalLine=function(hqChart,windowIndex,varItem,id)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        var chart=new ChartHorizontalLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=varItem.Name;\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n        chart.HQChart=hqChart;\\r\\n\\r\\n        if (varItem.Color) chart.Color=this.GetColor(varItem.Color);\\r\\n        else chart.Color=this.GetDefaultColor(id);\\r\\n\\r\\n        if (varItem.LineWidth)\\r\\n        {\\r\\n            let width=parseInt(varItem.LineWidth.replace(\\\"LINETHICK\\\",\\\"\\\"));\\r\\n            if (!isNaN(width) && width>0) chart.LineWidth=width;\\r\\n        }\\r\\n\\r\\n        this.SetChartLineDash(chart,varItem.Draw.DrawData);\\r\\n        chart.ExtendType=varItem.Draw.DrawData.Extend;\\r\\n        chart.Data.Data=varItem.Draw.DrawData.Data;\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //创建K线\\r\\n    this.CreateSelfKLine=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        var overlayIndex=this.OverlayIndex;\\r\\n        var frame=overlayIndex.Frame;\\r\\n        let chart=new ChartKLine();\\r\\n        chart.Canvas=hqChart.Canvas;\\r\\n        chart.Name=\\\"Self Kline\\\"\\r\\n        chart.ChartBorder=frame.Frame.ChartBorder;\\r\\n        chart.ChartFrame=frame.Frame;\\r\\n        chart.Identify=overlayIndex.Identify;\\r\\n\\r\\n        chart.Data=hisData\\r\\n        chart.IsShowMaxMinPrice=false;\\r\\n        chart.IsShowKTooltip=false;\\r\\n        chart.DrawType=this.KLineType;\\r\\n\\r\\n        frame.ChartPaint.push(chart);\\r\\n    }\\r\\n\\r\\n    //给一个默认的颜色\\r\\n    this.GetDefaultColor=function(id)\\r\\n    {\\r\\n        let COLOR_ARRAY=\\r\\n            [\\r\\n                \\\"rgb(24,71,178)\\\",\\r\\n                \\\"rgb(42,230,215)\\\",\\r\\n                \\\"rgb(252,96,154)\\\",\\r\\n                \\\"rgb(0,128,255)\\\",\\r\\n                \\\"rgb(229,0,79)\\\",\\r\\n                \\\"rgb(68,114,196)\\\",\\r\\n                \\\"rgb(255,174,0)\\\",\\r\\n                \\\"rgb(25,199,255)\\\",\\r\\n                \\\"rgb(175,95,162)\\\",\\r\\n                \\\"rgb(236,105,65)\\\",\\r\\n            ];\\r\\n\\r\\n        let number=parseInt(id);\\r\\n        return COLOR_ARRAY[number%(COLOR_ARRAY.length-1)];\\r\\n    }\\r\\n}\\r\\n\\r\\n//后台执行指标\\r\\nfunction APIScriptIndex(name,script,args,option, isOverlay)\\r\\n{\\r\\n    if (isOverlay) this.newMethod=OverlayScriptIndex;\\r\\n    else this.newMethod=ScriptIndex;\\r\\n    this.newMethod(name,script,args,option);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.ClassName=\\\"APIScriptIndex\\\";\\r\\n    this.IsOverlayIndex=(isOverlay==true);  //是否是叠加指标\\r\\n    this.ApiUrl;    //指标执行api地址\\r\\n    this.HQDataType;\\r\\n    this.Version=1; //1=默认数据格式  1=新的.net数据格式\\r\\n\\r\\n    if (option && option.API)\\r\\n    {\\r\\n        if (option.API.Url) this.ApiUrl=option.API.Url;\\r\\n        if (option.API.Name) this.Name=this.ID=option.API.Name;\\r\\n        if (option.API.ID) this.ID=option.API.ID;\\r\\n        if (option.API.Version>0) this.Version=option.API.Version;\\r\\n    }\\r\\n\\r\\n    this.Super_CopyTo=this.CopyTo;  //父类方法\\r\\n    this.CopyTo=function(dest)      //赋值到新实例出来\\r\\n    {\\r\\n        this.Super_CopyTo(dest);\\r\\n\\r\\n        dest.ApiUrl=this.ApiUrl;\\r\\n        dest.Version=this.Version;\\r\\n        dest.IsOverlayIndex=this.IsOverlayIndex;\\r\\n    }\\r\\n\\r\\n    this.ExecuteScript=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[APIScriptIndex::ExecuteScript] name, Arguments ', this.Name,this.Arguments );\\r\\n\\r\\n        //数据类型\\r\\n        let hqDataType=HQ_DATA_TYPE.KLINE_ID;   //默认K线\\r\\n        var dateRange=null;\\r\\n        if (hqChart.ClassName==='MinuteChartContainer' || hqChart.ClassName==='MinuteChartHScreenContainer')\\r\\n        {\\r\\n            if (hqChart.DayCount>1) hqDataType=HQ_DATA_TYPE.MULTIDAY_MINUTE_ID; //多日分钟\\r\\n            else hqDataType=HQ_DATA_TYPE.MINUTE_ID;                             //分钟数据\\r\\n\\r\\n            dateRange=hisData.GetDateRange();\\r\\n        }\\r\\n        else if (hqChart.ClassName==='HistoryMinuteChartContainer')\\r\\n        {\\r\\n            hqDataType=HQ_DATA_TYPE.HISTORY_MINUTE_ID;   //历史分钟\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            dateRange=hisData.GetDateRange();\\r\\n        }\\r\\n\\r\\n        var args=[];\\r\\n        if (this.Arguments)\\r\\n        {\\r\\n            for(var i in this.Arguments)\\r\\n            {\\r\\n                var item=this.Arguments[i];\\r\\n                args.push({name:item.Name, value:item.Value});\\r\\n            }\\r\\n        }\\r\\n\\r\\n        var requestCount;\\r\\n        if (hqChart.GetRequestDataCount) requestCount=hqChart.GetRequestDataCount();\\r\\n        var self=this;\\r\\n        var postData =\\r\\n            {\\r\\n                indexname:this.ID,  symbol: hqChart.Symbol, script:this.Script, args:args,\\r\\n                period:hqChart.Period, right:hqChart.Right, hqdatatype: hqDataType\\r\\n            };\\r\\n\\r\\n        if (dateRange) postData.DateRange=dateRange;\\r\\n\\r\\n        if (requestCount)\\r\\n        {\\r\\n            postData.maxdatacount=requestCount.MaxRequestDataCount;\\r\\n            postData.maxminutedaycount=requestCount.MaxRequestMinuteDayCount;\\r\\n        }\\r\\n\\r\\n        if (hqDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID || hqDataType==HQ_DATA_TYPE.MINUTE_ID) postData.daycount=hqChart.DayCount;\\r\\n        this.HQDataType=hqDataType;\\r\\n\\r\\n        if (hqChart.NetworkFilter)\\r\\n        {\\r\\n            var obj=\\r\\n                {\\r\\n                    Name:'APIScriptIndex::ExecuteScript', //类名::\\r\\n                    Explain:'指标计算',\\r\\n                    Request:{ Url:self.ApiUrl,  Type:'POST', Data: postData },\\r\\n                    Self:this,\\r\\n                    HQChart:hqChart,\\r\\n                    PreventDefault:false\\r\\n                };\\r\\n\\r\\n            hqChart.NetworkFilter(obj, function(data)\\r\\n            {\\r\\n                if (self.Version==2)\\r\\n                    self.RecvAPIData2(data,hqChart,windowIndex,hisData);\\r\\n                else\\r\\n                    self.RecvAPIData(data,hqChart,windowIndex,hisData);\\r\\n            });\\r\\n\\r\\n            if (obj.PreventDefault==true) return;   //已被上层替换,不调用默认的网络请求\\r\\n        }\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.ApiUrl,\\r\\n            data: postData,\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                self.RecvAPIData(recvData,hqChart,windowIndex,hisData);\\r\\n            },\\r\\n            error: function(request)\\r\\n            {\\r\\n                self.RecvError(request);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    //.net 新版后台指标计算格式\\r\\n    this.RecvAPIData2=function(data,hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[APIScriptIndex::RecvAPIData2] recv data ', this.Name,data );\\r\\n        //if (data.code!=0) return;\\r\\n\\r\\n        if (this.HQDataType==HQ_DATA_TYPE.KLINE_ID)\\r\\n        {\\r\\n            this.OutVar=this.ConvertToLocalData(data,hqChart);\\r\\n            JSConsole.Complier.Log('[APIScriptIndex::RecvAPIData2] conver to OutVar ', this.OutVar);\\r\\n        }\\r\\n        else if (this.HQDataType==HQ_DATA_TYPE.MINUTE_ID)\\r\\n        {\\r\\n            this.OutVar=this.ConvertToLocalData(data,hqChart);\\r\\n            JSConsole.Complier.Log('[APIScriptIndex::RecvAPIData2] conver to OutVar ', this.OutVar);\\r\\n        }\\r\\n        else if (this.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)\\r\\n        {\\r\\n            this.OutVar=this.ConvertToLocalData(data,hqChart);\\r\\n            JSConsole.Complier.Log('[APIScriptIndex::RecvAPIData2] conver to OutVar ', this.OutVar);\\r\\n        }\\r\\n\\r\\n        this.BindData(hqChart,windowIndex,hisData);\\r\\n\\r\\n        hqChart.UpdataDataoffset();           //更新数据偏移\\r\\n        hqChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        hqChart.Draw();\\r\\n\\r\\n        if (hqChart.GetIndexEvent)\\r\\n        {\\r\\n            var event=hqChart.GetIndexEvent();  //指标计算完成回调\\r\\n            if (event)\\r\\n            {\\r\\n                var data={ OutVar:this.OutVar, WindowIndex: windowIndex, Name: this.Name, Arguments: this.Arguments, HistoryData: hisData,\\r\\n                    Stock: {Symbol:hqChart.Symbol,Name:hqChart.Name} };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ConvertToLocalData=function(jsonData, hqChart)\\r\\n    {\\r\\n        var outVar=jsonData.OutVar;\\r\\n        if (hqChart.ClassName==\\\"MinuteChartContainer\\\" || hqChart.ClassName==\\\"MinuteChartHScreenContainer\\\")\\r\\n        {\\r\\n            var kdata=hqChart.SourceData;\\r\\n            var aryDataIndex=kdata.GetAPIDataIndex(jsonData.Date,jsonData.Time);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            var kdata=hqChart.ChartPaint[0].Data;\\r\\n            if (ChartData.IsDayPeriod(jsonData.Period,true))\\r\\n                var aryDataIndex=kdata.GetAPIDataIndex(jsonData.Date);\\r\\n            else\\r\\n                var aryDataIndex=kdata.GetAPIDataIndex(jsonData.Date,jsonData.Time);\\r\\n        }\\r\\n\\r\\n        var localOutVar=[];\\r\\n        for(var i in outVar)\\r\\n        {\\r\\n            var item=outVar[i];\\r\\n            var outItem={ Type:item.Type, Name:item.Name };\\r\\n\\r\\n            if (item.Type==0)\\r\\n            {\\r\\n                outItem.Data=[];\\r\\n                for(var j=0;j<aryDataIndex.length;++j)\\r\\n                {\\r\\n                    var indexItem=aryDataIndex[j];\\r\\n                    if (indexItem.Index<0) outItem.Data[j]=null;\\r\\n                    else outItem.Data[j]=item.Data[indexItem.Index];\\r\\n                }\\r\\n\\r\\n                if (outItem.Name && outItem.Name.indexOf(\\\"@NODRAW@\\\")>=0)\\r\\n                    outItem.Name=outItem.Name.replace(\\\"@NODRAW@\\\",\\\"\\\");\\r\\n\\r\\n            }\\r\\n            else if (item.Type==1)  //绘图函数\\r\\n            {\\r\\n                outItem.Name=item.DrawType;\\r\\n                outItem.Draw={ DrawType:item.DrawType };\\r\\n                var draw=item.Draw;\\r\\n                switch(item.DrawType)\\r\\n                {\\r\\n                    case \\\"STICKLINE\\\":\\r\\n                    {\\r\\n                        var drawData=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var price=draw.Price[index];\\r\\n                            var price2=draw.Price2[index];\\r\\n                            if ( !IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(price2))\\r\\n                                continue;\\r\\n\\r\\n                            drawData[j]={ Value:price, Value2:price2 };\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                        outItem.Draw.Width=draw.Width;\\r\\n                        outItem.Draw.Type=draw.Empty;\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWTEXT\\\":\\r\\n                    {\\r\\n                        var drawData=[];\\r\\n                        var aryText=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var price=draw.Price[index];\\r\\n                            if ( IFrameSplitOperator.IsNumber(price))\\r\\n                            {\\r\\n                                drawData[j]=price;\\r\\n                            }\\r\\n\\r\\n                            if (Array.isArray(draw.Text))    //字符串数组\\r\\n                            {\\r\\n                                var item=draw.Text[index];\\r\\n                                if (IFrameSplitOperator.IsString(item)) aryText[j]=item;\\r\\n                            }\\r\\n                        }\\r\\n\\r\\n                        if (Array.isArray(draw.Text))  outItem.Draw.Text=aryText;\\r\\n                        else outItem.Draw.Text=draw.Text;\\r\\n\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWNUMBER\\\":\\r\\n                    {\\r\\n                        var drawData={Value:[], Text:[]};\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData.Value[j]=null;\\r\\n                            drawData.Text[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var price=draw.Price[index];\\r\\n                            var number=draw.Number[index];\\r\\n                            if ( !IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(number)) continue;\\r\\n\\r\\n                            drawData.Value[j]=price;\\r\\n                            drawData.Text[j]=number.toFixed(2);\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWBAND\\\":\\r\\n                    {\\r\\n                        var drawData=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var price=draw.Val1[index];\\r\\n                            var price2=draw.Val2[index];\\r\\n                            if ( !IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(price2)) continue;\\r\\n\\r\\n                            drawData[j]={ Value:price, Value2:price2 };\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                        outItem.Draw.Color=[draw.Color1.toLowerCase(), draw.Color2.toLowerCase()];\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWKLINE\\\":\\r\\n                    {\\r\\n                        var drawData=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            var item={ Open:null,High:null, Low:null, Close:null };\\r\\n                            drawData[j]=item;\\r\\n\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var high=draw.High[index];\\r\\n                            var low=draw.Low[index];\\r\\n                            var open=draw.Open[index];\\r\\n                            var close=draw.Close[index];\\r\\n                            if ( IFrameSplitOperator.IsPlusNumber(high) && IFrameSplitOperator.IsPlusNumber(low) &&\\r\\n                                IFrameSplitOperator.IsPlusNumber(open) && IFrameSplitOperator.IsPlusNumber(close))\\r\\n                            {\\r\\n                                item.Open=open;\\r\\n                                item.Close=close;\\r\\n                                item.High=high;\\r\\n                                item.Low=low;\\r\\n                            }\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWTEXT_FIX\\\":\\r\\n                    {\\r\\n                        var drawData={ Value:[], Text:[] };\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData.Value[j]=0;\\r\\n                            drawData.Text[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var condItem=draw.Cond[index];\\r\\n                            if (!condItem) continue;\\r\\n\\r\\n                            drawData.Value[j]=1;\\r\\n                            drawData.Text[j]=draw.Text;\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                        outItem.Draw.Position={ X:draw.X, Y:draw.Y, Type:draw.Type };\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWNUMBER_FIX\\\":\\r\\n                    {\\r\\n                        var drawData={ Value:[], Text:[] };\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData.Value[j]=null;\\r\\n                            drawData.Text[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var value=draw.Number[index];\\r\\n                            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n\\r\\n                            drawData.Value[j]=value;\\r\\n                            drawData.Text[j]=IFrameSplitOperator.RemoveZero(value.toFixed(2));\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                        outItem.Draw.Position={ X:draw.X, Y:draw.Y, Type:draw.Type };\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"DRAWICON\\\":\\r\\n                    {\\r\\n                        var icon=g_JSComplierResource.GetDrawIcon(draw.Type);\\r\\n                        if (!icon) g_JSComplierResource.GetDrawTextIcon(draw.Type);\\r\\n                        if (!icon) icon={Symbol:'🚩'};\\r\\n                        outItem.Draw.Icon=icon;\\r\\n                        var drawData=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var value=draw.Price[index];\\r\\n                            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n\\r\\n                            drawData[j]=value;\\r\\n                        }\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"PARTLINE\\\":\\r\\n                    {\\r\\n                        var drawData=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData[j]={Value:null, RGB:null};\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var color=draw.Color[index];\\r\\n                            if (!IFrameSplitOperator.IsString(color)) continue;\\r\\n                            var value=draw.Price[index];\\r\\n                            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n\\r\\n                            drawData[j].Value=value;\\r\\n                            drawData[j].RGB=color;\\r\\n                        }\\r\\n\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                    }\\r\\n                        break;\\r\\n                    case \\\"FILLRGN\\\":\\r\\n                    {\\r\\n                        var drawData=[];\\r\\n                        for(var j=0;j<aryDataIndex.length;++j)\\r\\n                        {\\r\\n                            drawData[j]=null;\\r\\n                            var indexItem=aryDataIndex[j];\\r\\n                            var index=indexItem.Index;\\r\\n                            if (index<0) continue;\\r\\n\\r\\n                            var color=draw.Color[index];\\r\\n                            if (!IFrameSplitOperator.IsString(color)) continue;\\r\\n                            var value=draw.Price[index];\\r\\n                            if (!IFrameSplitOperator.IsNumber(value)) continue;\\r\\n                            var value2=draw.Price2[index];\\r\\n                            if (!IFrameSplitOperator.IsNumber(value2)) continue;\\r\\n\\r\\n                            drawData[j]={ Value:value, Value2:value2, Color:color };\\r\\n                        }\\r\\n\\r\\n                        outItem.Draw.DrawData=drawData;\\r\\n                        outItem.Draw.DrawType=\\\"FILLRGN2\\\";\\r\\n                    }\\r\\n                        break;\\r\\n                    default:\\r\\n                        continue;\\r\\n                }\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            for(var i in item.Attribute)\\r\\n            {\\r\\n                var attr=item.Attribute[i];\\r\\n                switch(attr)\\r\\n                {\\r\\n                    case \\\"COLORSTICK\\\":\\r\\n                        outItem.Type=2; //画上下柱子\\r\\n                        break;\\r\\n                    case \\\"POINTDOT\\\":\\r\\n                        outItem.Radius=g_JSChartResource.POINTDOT.Radius;\\r\\n                        outItem.Type=3;\\r\\n                        break;\\r\\n                    case \\\"CIRCLEDOT\\\":\\r\\n                        outItem.Radius=g_JSChartResource.CIRCLEDOT.Radius;\\r\\n                        outItem.Type=3;\\r\\n                        break;\\r\\n                    case \\\"DOTLINE\\\":\\r\\n                        outItem.IsDotLine=true;\\r\\n                        break;\\r\\n                    case \\\"DRAWABOVE\\\":\\r\\n                        outItem.IsDrawAbove=true;\\r\\n                        break;\\r\\n                    case \\\"LINESTICK\\\":\\r\\n                        outItem.Type=4;\\r\\n                        break;\\r\\n                    case \\\"STICK\\\":   //STICK 画柱状线\\r\\n                        outItem.Type=5;\\r\\n                        break;\\r\\n                    case \\\"VOLSTICK\\\":    //成交量柱子\\r\\n                        outItem.Type=6;\\r\\n                        break;\\r\\n                    case \\\"NODRAW\\\":  //不画该线\\r\\n                        outItem.IsShow = false;\\r\\n                        break;\\r\\n                    case \\\"NONE_OUT_NAME\\\":   //不显示标题\\r\\n                        outItem.NoneName=true;\\r\\n                        break;\\r\\n                    case \\\"NOTEXT\\\":  //不显示标题\\r\\n                        outItem.IsShowTitle=false;\\r\\n                        break;\\r\\n                }\\r\\n\\r\\n\\r\\n                if (attr.indexOf('COLOR')==0)\\r\\n                {\\r\\n                    outItem.Color=attr;\\r\\n                }\\r\\n                else if (attr.indexOf('LINETHICK')==0)\\r\\n                {\\r\\n                    outItem.LineWidth=attr;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            localOutVar.push(outItem);\\r\\n        }\\r\\n\\r\\n        return localOutVar;\\r\\n    }\\r\\n\\r\\n    this.RecvAPIData=function(data,hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        JSConsole.Complier.Log('[APIScriptIndex::RecvAPIData] recv data ', this.Name,data );\\r\\n        if (data.code!=0) return;\\r\\n\\r\\n        if (data.outdata && data.outdata.name) this.Name=data.outdata.name;\\r\\n\\r\\n        if (data.outdata.args)  //外部修改参数\\r\\n        {\\r\\n            this.Arguments=[];\\r\\n            for(var i in data.outdata.args)\\r\\n            {\\r\\n                var item= data.outdata.args[i];\\r\\n                this.Arguments.push({Name:item.name, Value:item.value});\\r\\n            }\\r\\n        }\\r\\n\\r\\n        if (this.HQDataType==HQ_DATA_TYPE.KLINE_ID)\\r\\n        {\\r\\n            this.OutVar=this.FittingData(data.outdata,hqChart);\\r\\n            JSConsole.Complier.Log('[APIScriptIndex::RecvAPIData] conver to OutVar ', this.OutVar);\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            this.OutVar=this.FittingMinuteData(data.outdata,hqChart);   //走势图数据\\r\\n        }\\r\\n        this.BindData(hqChart,windowIndex,hisData);\\r\\n\\r\\n        if (this.IsLocked==false) //不上锁\\r\\n        {\\r\\n            hqChart.Frame.SubFrame[windowIndex].Frame.SetLock(null);\\r\\n        }\\r\\n        else    //上锁\\r\\n        {\\r\\n            let lockData={ IsLocked:true,Callback:this.LockCallback,IndexName:this.Name ,ID:this.LockID,\\r\\n                BG:this.LockBG,Text:this.LockText,TextColor:this.LockTextColor, Font:this.LockFont, Count:this.LockCount, MinWidth:this.LockMinWidth };\\r\\n            hqChart.Frame.SubFrame[windowIndex].Frame.SetLock(lockData);\\r\\n        }\\r\\n\\r\\n        hqChart.UpdataDataoffset();           //更新数据偏移\\r\\n        hqChart.UpdateFrameMaxMin();          //调整坐标最大 最小值\\r\\n        hqChart.Draw();\\r\\n\\r\\n        if (hqChart.GetIndexEvent)\\r\\n        {\\r\\n            var event=hqChart.GetIndexEvent();  //指标计算完成回调\\r\\n            if (event)\\r\\n            {\\r\\n                var data={ OutVar:this.OutVar, WindowIndex: windowIndex, Name: this.Name, Arguments: this.Arguments, HistoryData: hisData,\\r\\n                    Stock: {Symbol:hqChart.Symbol,Name:hqChart.Name} };\\r\\n                event.Callback(event,data,this);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.FittingArray=function(sourceData,date,time,hqChart,arrayType)  //arrayType 0=单值数组 1=结构体\\r\\n    {\\r\\n        var kdata=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n        var arySingleData=[];\\r\\n        for(var i in sourceData)\\r\\n        {\\r\\n            var value=sourceData[i];\\r\\n            var indexItem=new SingleData(); //单列指标数据\\r\\n            indexItem.Date=date[i];\\r\\n            if (time && i<time.length) indexItem.Time=time[i];\\r\\n            indexItem.Value=value;\\r\\n            arySingleData.push(indexItem);\\r\\n        }\\r\\n\\r\\n        var aryFittingData;\\r\\n        if (ChartData.IsDayPeriod(hqChart.Period,true))\\r\\n            aryFittingData=kdata.GetFittingData(arySingleData);        //数据和主图K线拟合\\r\\n        else\\r\\n            aryFittingData=kdata.GetMinuteFittingData(arySingleData);  //数据和主图K线拟合\\r\\n\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        var result;\\r\\n        if (arrayType==1) result=bindData.GetObject();\\r\\n        else result=bindData.GetValue();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.FittingMultiLine=function(sourceData,date,time,hqChart)\\r\\n    {\\r\\n        var kdata=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n        if (ChartData.IsDayPeriod(hqChart.Period,true))  //日线\\r\\n        {\\r\\n            var kdata=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n            var aryPoint=[];\\r\\n            for(var i in sourceData)\\r\\n            {\\r\\n                var item=sourceData[i];\\r\\n                for(var j in item.Point)\\r\\n                {\\r\\n                    var point=item.Point[j];\\r\\n                    aryPoint.push(point);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            aryPoint.sort(function(a,b) { return a.Date-b.Date; });\\r\\n            kdata.GetDateIndex(aryPoint);\\r\\n            return sourceData;\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(hqChart.Period,true) || ChartData.IsTickPeriod(hqChart.Period)) //分钟线\\r\\n        {\\r\\n            var kdata=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n            var aryPoint=[];\\r\\n            for(var i in sourceData)\\r\\n            {\\r\\n                var item=sourceData[i];\\r\\n                for(var j in item.Point)\\r\\n                {\\r\\n                    var point=item.Point[j];\\r\\n                    aryPoint.push(point);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            aryPoint.sort(function(a,b)\\r\\n                {\\r\\n                    if (a.Date==b.Date) return a.Time-b.Time;\\r\\n                    return a.Date-b.Date;\\r\\n                }\\r\\n            );\\r\\n\\r\\n            kdata.GetDateTimeIndex(aryPoint);\\r\\n            return sourceData;\\r\\n        }\\r\\n        else if (this.HQDataType==HQ_DATA_TYPE.MINUTE_ID || this.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)\\r\\n        {\\r\\n            var minuteData=hqChart.SourceData;\\r\\n\\r\\n            var aryPoint=[];\\r\\n            for(var i in sourceData)\\r\\n            {\\r\\n                var item=sourceData[i];\\r\\n                for(var j in item.Point)\\r\\n                {\\r\\n                    var point=item.Point[j];\\r\\n                    aryPoint.push(point);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            aryPoint.sort(function(a,b)\\r\\n                {\\r\\n                    if (a.Date==b.Date) return a.Time-b.Time;\\r\\n                    return a.Date-b.Date;\\r\\n                }\\r\\n            );\\r\\n\\r\\n            minuteData.GetDateTimeIndex(aryPoint);\\r\\n            return sourceData;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.FittingMultiText=function(sourceData,date,time,hqChart)\\r\\n    {\\r\\n        if (ChartData.IsDayPeriod(hqChart.Period,true))  //日线\\r\\n        {\\r\\n            var kdata=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n            sourceData.sort(function(a,b) { return a.Date-b.Date; });\\r\\n            kdata.GetDateIndex(sourceData);\\r\\n            return sourceData;\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(hqChart.Period,true) || ChartData.IsTickPeriod(hqChart.Period)) //分钟线\\r\\n        {\\r\\n            var kdata=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n            sourceData.sort(function(a,b)\\r\\n                {\\r\\n                    if (a.Date==b.Date) return a.Time-b.Time;\\r\\n                    return a.Date-b.Date;\\r\\n                }\\r\\n            );\\r\\n\\r\\n            kdata.GetDateTimeIndex(sourceData);\\r\\n            return sourceData;\\r\\n        }\\r\\n        else if (this.HQDataType==HQ_DATA_TYPE.MINUTE_ID || this.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)\\r\\n        {\\r\\n            var minuteData=hqChart.SourceData;\\r\\n\\r\\n            sourceData.sort(function(a,b)\\r\\n                {\\r\\n                    if (a.Date==b.Date) return a.Time-b.Time;\\r\\n                    return a.Date-b.Date;\\r\\n                }\\r\\n            );\\r\\n\\r\\n            minuteData.GetDateTimeIndex(sourceData);\\r\\n            return sourceData;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.FittingData=function(jsonData, hqChart)\\r\\n    {\\r\\n        var outVar=jsonData.outvar;\\r\\n        var date=jsonData.date;\\r\\n        var time=jsonData.time;\\r\\n        var kdata=hqChart.ChartPaint[0].Data;\\r\\n\\r\\n        //把数据拟合到kdata上\\r\\n        var result=[];\\r\\n\\r\\n        for(var i in outVar)\\r\\n        {\\r\\n            var item=outVar[i];\\r\\n            var indexData=[];\\r\\n            var outVarItem={Name:item.name,Type:item.type};\\r\\n            if (item.color) outVarItem.Color=item.color;\\r\\n            if (item.data)\\r\\n            {\\r\\n                outVarItem.Data=this.FittingArray(item.data,date,time,hqChart);\\r\\n\\r\\n                if (item.color) outVarItem.Color=item.color;\\r\\n                if (item.linewidth) outVarItem.LineWidth=item.linewidth;\\r\\n                if (item.isshow==false) outVarItem.IsShow = false;\\r\\n                if (item.isexdata==true) outVarItem.IsExData = true;\\r\\n\\r\\n                result.push(outVarItem);\\r\\n            }\\r\\n            else if (item.Draw)\\r\\n            {\\r\\n                var draw=item.Draw;\\r\\n                var drawItem={};\\r\\n                if (draw.DrawType=='DRAWICON')  //图标\\r\\n                {\\r\\n                    drawItem.Icon=draw.Icon;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='DRAWTEXT') //文本\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='STICKLINE')    //柱子\\r\\n                {\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.Type=draw.Type;\\r\\n                    drawItem.Width=draw.Width;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart,1);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_LINE')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);\\r\\n                    for(var k in drawItem.DrawData)\\r\\n                    {\\r\\n                        this.GetKLineData(drawItem.DrawData[k].Point, hqChart);\\r\\n                    }\\r\\n                    outVarItem.Draw=drawItem;\\r\\n                    if (draw.LineDash) drawItem.LineDash=draw.LineDash;\\r\\n                    if (draw.Arrow) drawItem.Arrow=draw.Arrow;\\r\\n                    if (IFrameSplitOperator.IsNumber(draw.LineWidth)) drawItem.LineWidth=draw.LineWidth;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_BAR')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_TEXT')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);\\r\\n                    this.GetKLineData(drawItem.DrawData, hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_SVGICON')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData={ Icon:this.FittingMultiText(draw.DrawData.Icon,date,time,hqChart), Family:draw.DrawData.Family };\\r\\n                    this.GetKLineData(drawItem.DrawData.Icon, hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType==\\\"MULTI_HTMLDOM\\\")    //外部自己创建dom\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.Callback=draw.Callback;\\r\\n                    drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);\\r\\n                    this.GetKLineData(drawItem.DrawData, hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType==\\\"COLOR_KLINE\\\")\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    var klineOption=this.FittingMultiText(draw.DrawData.KLine,date,time,hqChart);\\r\\n                    var mapKLineOption=new Map();\\r\\n                    for(var i in klineOption)\\r\\n                    {\\r\\n                        var item=klineOption[i];\\r\\n                        mapKLineOption.set(item.Index,item);\\r\\n                    }\\r\\n\\r\\n                    drawItem.DrawData={ KLine:mapKLineOption };\\r\\n                    if (draw.Color)  outVarItem.Color=draw.Color;\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType==\\\"KLINE_BG\\\")\\r\\n                {\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData={ };\\r\\n                    drawItem.DrawData.Color=draw.Color;\\r\\n                    drawItem.DrawData.Angle=draw.Angle;\\r\\n                    drawItem.DrawData.Data=this.FittingKLineBG(draw.DrawData, hqChart);\\r\\n\\r\\n                    outVarItem.Draw=drawItem;\\r\\n                    outVarItem.Name=draw.DrawType;\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    // h, high, low l. c, close\\r\\n    this.GetKLineData=function(data,hqChart)\\r\\n    {\\r\\n        if (!data) return;\\r\\n        if (!Array.isArray(data)) return;\\r\\n\\r\\n        if (this.HQDataType==HQ_DATA_TYPE.MINUTE_ID || this.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID)\\r\\n            var kData=hqChart.SourceData;   //走势图分钟数据\\r\\n        else\\r\\n            var kData=hqChart.ChartPaint[0].Data;   //K线\\r\\n\\r\\n        for(var i in data)\\r\\n        {\\r\\n            var item=data[i];\\r\\n            if (!IFrameSplitOperator.IsString(item.Value)) continue;\\r\\n            if (!IFrameSplitOperator.IsNumber(item.Index)) continue;\\r\\n            if (item.Index<0 || item.Index>=kData.Data.length) continue;\\r\\n            var valueName=item.Value.toUpperCase();\\r\\n            var kItem=kData.Data[item.Index];\\r\\n            switch(valueName)\\r\\n            {\\r\\n                case \\\"HIGH\\\":\\r\\n                case \\\"H\\\":\\r\\n                    item.Value=kItem.High;\\r\\n                    break;\\r\\n                case \\\"L\\\":\\r\\n                case \\\"LOW\\\":\\r\\n                    item.Value=kItem.Low;\\r\\n                    break;\\r\\n                case \\\"C\\\":\\r\\n                case \\\"CLOSE\\\":\\r\\n                    item.Value=kItem.Close;\\r\\n                    break;\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.FittingKLineBG=function(data, hqChart)\\r\\n    {\\r\\n        var kData=hqChart.ChartPaint[0].Data;   //K线\\r\\n        var result=[];\\r\\n        if (ChartData.IsDayPeriod(hqChart.Period,true))  //日线\\r\\n        {\\r\\n            var bFill=false;\\r\\n            for(var i=0,j=0;i<kData.Data.length;)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                var kItem=kData.Data[i];\\r\\n                if (j>=data.length)\\r\\n                {\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n                var dataItem=data[j];\\r\\n\\r\\n                if (dataItem.Date<kItem.Date)\\r\\n                {\\r\\n                    ++j;\\r\\n                }\\r\\n                else if (dataItem.Date>kItem.Date)\\r\\n                {\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    bFill=true;\\r\\n                    result[i]=1;\\r\\n                    ++j;\\r\\n                    ++i;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (bFill) return result;\\r\\n        }\\r\\n        else if (ChartData.IsMinutePeriod(hqChart.Period,true)) //分钟线\\r\\n        {\\r\\n            var bFill=false;\\r\\n            for(var i=0,j=0;i<kData.Data.length;)\\r\\n            {\\r\\n                result[i]=0;\\r\\n                var kItem=kData.Data[i];\\r\\n                if (j>=data.length)\\r\\n                {\\r\\n                    ++i;\\r\\n                    continue;\\r\\n                }\\r\\n                var dataItem=data[j];\\r\\n\\r\\n                if (dataItem.Date<kItem.Date || (dataItem.Date==kItem.Date && dataItem.Time<kItem.Time))\\r\\n                {\\r\\n                    ++j;\\r\\n                }\\r\\n                else if (dataItem.Date>kItem.Date || (dataItem.Date==kItem.Date && dataItem.Time>kItem.Time))\\r\\n                {\\r\\n                    ++i;\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    bFill=true;\\r\\n                    result[i]=1;\\r\\n                    ++j;\\r\\n                    ++i;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (bFill) return result;\\r\\n        }\\r\\n\\r\\n        return null;\\r\\n    }\\r\\n\\r\\n    this.FittingMinuteData=function(jsonData, hqChart)\\r\\n    {\\r\\n        var outVar=jsonData.outvar;\\r\\n        var date=jsonData.date;\\r\\n        var time=jsonData.time;\\r\\n        var result=[];\\r\\n\\r\\n        for(var i in outVar)\\r\\n        {\\r\\n            var item=outVar[i];\\r\\n            var outVarItem={Name:item.name,Type:item.type}\\r\\n            if (item.data)\\r\\n            {\\r\\n                outVarItem.Data=this.FittingMinuteArray(item.data,date,time,hqChart);\\r\\n                if (item.color) outVarItem.Color=item.color;\\r\\n                if (item.linewidth>=1) outVarItem.LineWidth=item.linewidth;\\r\\n                if (item.isshow==false) outVarItem.IsShow = false;\\r\\n                if (item.isexdata==true) outVarItem.IsExData = true;\\r\\n\\r\\n                result.push(outVarItem);\\r\\n            }\\r\\n            else if (item.Draw)\\r\\n            {\\r\\n                var draw=item.Draw;\\r\\n                var drawItem={};\\r\\n                if (draw.DrawType=='DRAWICON')  //图标\\r\\n                {\\r\\n                    drawItem.Icon=draw.Icon;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='DRAWTEXT') //文本\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='STICKLINE')    //柱子\\r\\n                {\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.Type=draw.Type;\\r\\n                    drawItem.Width=draw.Width;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart,1);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_LINE')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);\\r\\n                    for(var k in drawItem.DrawData)\\r\\n                    {\\r\\n                        this.GetKLineData(drawItem.DrawData[k].Point, hqChart);\\r\\n                    }\\r\\n\\r\\n                    outVarItem.Draw=drawItem;\\r\\n                    if (draw.LineDash) drawItem.LineDash=draw.LineDash;\\r\\n                    if (draw.Arrow) drawItem.Arrow=draw.Arrow;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_TEXT')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);\\r\\n                    this.GetKLineData(drawItem.DrawData, hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType=='MULTI_SVGICON')\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.DrawData={ Icon:this.FittingMultiText(draw.DrawData.Icon,date,time,hqChart), Family:draw.DrawData.Family };\\r\\n                    this.GetKLineData(drawItem.DrawData.Icon, hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n                else if (draw.DrawType==\\\"MULTI_HTMLDOM\\\")    //外部自己创建dom\\r\\n                {\\r\\n                    drawItem.Text=draw.Text;\\r\\n                    drawItem.Name=draw.Name;\\r\\n                    drawItem.DrawType=draw.DrawType;\\r\\n                    drawItem.Callback=draw.Callback;\\r\\n                    drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);\\r\\n                    this.GetKLineData(drawItem.DrawData, hqChart);\\r\\n                    outVarItem.Draw=drawItem;\\r\\n\\r\\n                    result.push(outVarItem);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.FittingMinuteArray=function(sourceData,date,time,hqChart)\\r\\n    {\\r\\n        var minutedata=hqChart.SourceData;;   //分钟线\\r\\n\\r\\n        var arySingleData=[];\\r\\n        for(var i in sourceData)\\r\\n        {\\r\\n            var value=sourceData[i];\\r\\n            var indexItem=new SingleData(); //单列指标数据\\r\\n            indexItem.Date=date[i];\\r\\n            if (time && i<time.length) indexItem.Time=time[i];\\r\\n            indexItem.Value=value;\\r\\n            arySingleData.push(indexItem);\\r\\n        }\\r\\n\\r\\n        var aryFittingData=minutedata.GetMinuteFittingData(arySingleData);  //数据和主图K线拟合\\r\\n        var bindData=new ChartData();\\r\\n        bindData.Data=aryFittingData;\\r\\n        var result=bindData.GetValue();\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n}\\r\\n\\r\\n// 本地json数据指标\\r\\nfunction LocalJsonDataIndex(name,args,option)\\r\\n{\\r\\n    this.newMethod=ScriptIndex;   //派生\\r\\n    this.newMethod(name,null,args,null);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.JsonData;  //json格式数据\\r\\n    if (option.JsonData) this.JsonData=option.JsonData;\\r\\n\\r\\n    this.RequestData=function(hqChart,windowIndex,hisData)\\r\\n    {\\r\\n        if (!this.JsonData)\\r\\n        {\\r\\n            console.warn(\\\"[LocalJsonDataIndex::RequestData] JsonData is null\\\");\\r\\n            if (param.HQChart.ScriptErrorCallback) param.HQChart.ScriptErrorCallback('json 数据不能为空');\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        this.OutVar=this.FittingData(this.JsonData,hisData);\\r\\n        this.BindData(hqChart,windowIndex,hisData);\\r\\n    }\\r\\n\\r\\n    this.FittingData=function(jsonData, hisData)\\r\\n    {\\r\\n        outVar=jsonData.OutVar;\\r\\n        date=jsonData.Date;\\r\\n        time=jsonData.Time;\\r\\n\\r\\n        result=[];\\r\\n\\r\\n        for(i in outVar)\\r\\n        {\\r\\n            item=outVar[i];\\r\\n            JSConsole.Complier.Log('[LocalJsonDataIndex::FittingData] item', item);\\r\\n            if (item.Type!=0 && item.Type!=3)   //复杂的图形不支持\\r\\n            {\\r\\n                console.warn(\\\"[LocalJsonDataIndex::FittingData] can't support \\\", item.Name, item.Type);\\r\\n                continue;\\r\\n            }\\r\\n\\r\\n            var indexData=[];\\r\\n            outVarItem={Name:item.Name,Type:item.Type}\\r\\n            for(j in item.Data)\\r\\n            {\\r\\n                var indexItem=new SingleData(); //单列指标数据\\r\\n                indexItem.Date=date[j];\\r\\n                if (time && j<time.length) indexItem.Time=time[j];\\r\\n                indexItem.Value=item.Data[j];\\r\\n                indexData.push(indexItem);\\r\\n            }\\r\\n\\r\\n            if (hisData.Period<4)\\r\\n                var aryFittingData=hisData.GetFittingData(indexData); //数据和主图K线拟合\\r\\n            else\\r\\n                var aryFittingData=hisData.GetMinuteFittingData(indexData); //数据和主图K线拟合\\r\\n            var bindData=new ChartData();\\r\\n            bindData.Data=aryFittingData;\\r\\n            outVarItem.Data=bindData.GetValue();\\r\\n            result.push(outVarItem)\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n////////////////////////////////////////////////////////////////////////\\r\\n//  无UI指标执行\\r\\n// obj: { Name:指标名字 , ID:指标ID , Script:指标脚本, Args:指标参数, ErrorCallback:错误回调 }\\r\\n//\\r\\n///////////////////////////////////////////////////////////////////////\\r\\nfunction ScriptIndexConsole(obj)\\r\\n{\\r\\n    this.ID;                //指标ID\\r\\n    this.Name;              //指标名字\\r\\n    this.Script;            //脚本\\r\\n    this.Arguments=[];      //参数\\r\\n    this.ClassName='ScriptIndexConsole';\\r\\n    this.ErrorCallback;     //执行错误回调\\r\\n    this.FinishCallback;    //执行完成回调\\r\\n    this.IsSectionMode=false;   //截面报表模式\\r\\n    this.NetworkFilter;         //数据接口\\r\\n\\r\\n    if (obj)\\r\\n    {\\r\\n        if (obj.Name) this.Name=obj.Name;\\r\\n        if (obj.Script) this.Script=obj.Script;\\r\\n        if (obj.ID) this.ID=obj.ID;\\r\\n        if (obj.Args) this.Arguments=obj.Args;\\r\\n        if (obj.ErrorCallback) this.ErrorCallback=obj.ErrorCallback;\\r\\n        if (obj.FinishCallback) this.FinishCallback=obj.FinishCallback;\\r\\n        if (obj.IsSectionMode) this.IsSectionMode=obj.IsSectionMode;\\r\\n        if (obj.NetworkFilter) this.NetworkFilter=obj.NetworkFilter;\\r\\n    }\\r\\n\\r\\n    //执行脚本\\r\\n    //obj:\\r\\n    //     HQDataType:(HQ_DATA_TYPE), Period:周期, Right:复权\\r\\n    //     Stock: {Name:, Symbol:}, Request: { MaxDataCount:请求K线数据个数, MaxMinuteDayCount:请求分钟数据天数, TradeDate: 历史走势图才用}, :\\r\\n    //     Data: 当前计算数据(周期|复权以后), Source:  原始股票数据\\r\\n    this.ExecuteScript=function(obj)\\r\\n    {\\r\\n        this.OutVar=[];\\r\\n        let param= { Self:this };\\r\\n\\r\\n        let option=\\r\\n            {\\r\\n                HQDataType:obj.HQDataType,\\r\\n                Symbol:obj.Stock.Symbol,\\r\\n                Name:obj.Stock.Name,\\r\\n                Period:obj.Period,\\r\\n                Right:obj.Right,\\r\\n                Callback:this.RecvResultData, CallbackParam:param,\\r\\n                Async:true,\\r\\n                MaxRequestDataCount:obj.Request.MaxDataCount,\\r\\n                MaxRequestMinuteDayCount:obj.Request.MaxMinuteDayCount,\\r\\n                Arguments:this.Arguments,\\r\\n                IsSectionMode:this.IsSectionMode,\\r\\n                ClassName:'ScriptIndexConsole',\\r\\n                NetworkFilter:this.NetworkFilter,\\r\\n            };\\r\\n\\r\\n        if (obj.HQDataType===HQ_DATA_TYPE.HISTORY_MINUTE_ID) option.TrateDate=obj.Request.TradeDate;\\r\\n        if (obj.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID) option.DayCount=obj.DayCount;\\r\\n\\r\\n        let code=this.Script;\\r\\n        let run=JSComplier.Execute(code,option,this.ErrorCallback);\\r\\n    }\\r\\n\\r\\n    this.RecvResultData=function(outVar,param)\\r\\n    {\\r\\n        var self=param.Self;\\r\\n        var jsExec=param.JSExecute;\\r\\n\\r\\n        var date=null;\\r\\n        if (jsExec.SymbolData.Data)\\r\\n            date=jsExec.SymbolData.Data.GetDate();\\r\\n\\r\\n        var result=\\r\\n            {\\r\\n                Out:outVar,\\r\\n                Date:date,  //日期对应 上面的数据\\r\\n                Stock:{ Name:jsExec.SymbolData.Name, Symbol:jsExec.SymbolData.Symbol }, //股票信息\\r\\n                Index: { Name:self.Name, ID:self.ID }   //指标信息\\r\\n            };\\r\\n\\r\\n        if (jsExec.SymbolData.DataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID || jsExec.SymbolData.DataType==HQ_DATA_TYPE.MINUTE_ID) result.Time=jsExec.SymbolData.Data.GetTime();\\r\\n        else if (jsExec.SymbolData.DataType==HQ_DATA_TYPE.KLINE_ID && ChartData.IsMinutePeriod(jsExec.SymbolData.Period,true)) result.Time=jsExec.SymbolData.Data.GetTime();\\r\\n        //JSConsole.Complier.Log('[ScriptIndexConsole::RecvResultData] outVar ', outVar);\\r\\n        if (self.FinishCallback) self.FinishCallback(result, param.JSExecute);\\r\\n    }\\r\\n}\\r\\n\\r\\nScriptIndexConsole.SetDomain = function (domain, cacheDomain)   //修改API地址\\r\\n{\\r\\n    JSComplier.SetDomain(domain,cacheDomain);\\r\\n}\\r\\n\\r\\n//////////////////////////////////////////////////////////////////////////////////////////////\\r\\n//内置财务数据下载\\r\\n//\\r\\nfunction DownloadFinValueData(obj)\\r\\n{\\r\\n    this.Url=obj.Url;\\r\\n    this.Job=obj.Job;\\r\\n    this.Symbol=obj.Symbol;\\r\\n    this.Args=obj.Args;\\r\\n    this.DataKey=obj.DataKey;\\r\\n    this.RecvCallback=obj.Callback;\\r\\n    this.ErrorCallback=obj.ErrorCallback;\\r\\n\\r\\n    this.Download=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var fieldList=this.GetFieldList();\\r\\n        if (!fieldList)\\r\\n        {\\r\\n            message=`${this.Job.FunctionName}(${this.Args[0]}) can't support.`;\\r\\n            this.ErrorCallback(message);\\r\\n            self.RecvCallback(null, self.Job, self.DataKey);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.Url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"condition\\\":[ {\\\"item\\\":[\\\"finance\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"]}] ,\\r\\n                    \\\"start\\\": 0,\\r\\n                    \\\"end\\\": 200\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.ToHQChartData(recvData);\\r\\n                if (data) //排序\\r\\n                    data.sort(function (a, b) { return (a.Date - b.Date) });\\r\\n\\r\\n                self.RecvCallback(data, self.Job, self.DataKey);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.ToHQChartData=function(recvData)\\r\\n    {\\r\\n        if (!recvData.stock || recvData.stock.length!=1) return null;\\r\\n\\r\\n        var aryData=[];\\r\\n        var setDate=new Set();  //有重复数据 去掉\\r\\n        var stock=recvData.stock[0];\\r\\n        for(var i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n            if (item.announcement1)\\r\\n            {\\r\\n                var hqchartItem=this.ToHQChartItemData(item.announcement1, item.finance1, item);\\r\\n                if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n                {\\r\\n                    aryData.push(hqchartItem);\\r\\n                    setDate.add(hqchartItem.Date);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (item.announcement2)\\r\\n            {\\r\\n                var hqchartItem=this.ToHQChartItemData(item.announcement2, item.finance2, item);\\r\\n                if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n                {\\r\\n                    aryData.push(hqchartItem);\\r\\n                    setDate.add(hqchartItem.Date);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (item.announcement3)\\r\\n            {\\r\\n                var hqchartItem=this.ToHQChartItemData(item.announcement3, item.finance3, item);\\r\\n                if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n                {\\r\\n                    aryData.push(hqchartItem);\\r\\n                    setDate.add(hqchartItem.Date);\\r\\n                }\\r\\n            }\\r\\n\\r\\n            if (item.announcement4)\\r\\n            {\\r\\n                var hqchartItem=this.ToHQChartItemData(item.announcement4, item.finance4, item);\\r\\n                if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n                {\\r\\n                    aryData.push(hqchartItem);\\r\\n                    setDate.add(hqchartItem.Date);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return aryData;\\r\\n    }\\r\\n\\r\\n    //{ Date：日期 , Value:数值 }\\r\\n    this.ToHQChartItemData=function(announcement, finance, sourceItem)\\r\\n    {\\r\\n        var id=this.Args[0];\\r\\n        var date=announcement.year*10000;\\r\\n        var quarter=announcement.quarter;\\r\\n        switch(quarter)\\r\\n        {\\r\\n            case 1:\\r\\n                date+=331;\\r\\n                break;\\r\\n            case 2:\\r\\n                date+=630;\\r\\n                break;\\r\\n            case 3:\\r\\n                date+=930;\\r\\n                break;\\r\\n            case 4:\\r\\n                date+=1231;\\r\\n                break;\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n\\r\\n        var result={ Date:date, Value:0 };\\r\\n        switch(id)\\r\\n        {\\r\\n            case 0:\\r\\n                result.Value=date%1000000;  //0--返回报告期(YYMMDD格式),150930表示为2015年第三季\\r\\n                break;\\r\\n            case 1:\\r\\n                result.Value=finance.persearning;\\r\\n                break;\\r\\n            case 3:\\r\\n                result.Value=finance.peruprofit;\\r\\n                break;\\r\\n            case 4:\\r\\n                result.Value=finance.pernetasset;\\r\\n                break;\\r\\n            case 5:\\r\\n                result.Value=finance.percreserve;\\r\\n                break;\\r\\n            case 6:\\r\\n                result.Value=finance.woewa;\\r\\n                break;\\r\\n            case 7:\\r\\n                result.Value=finance.perccfo;\\r\\n                break;\\r\\n            case 8:\\r\\n                result.Value=finance.monetaryfunds;\\r\\n                break;\\r\\n            case 11:\\r\\n                result.Value=finance.areceivable;\\r\\n                break;\\r\\n        }\\r\\n\\r\\n        return result;\\r\\n    }\\r\\n\\r\\n    this.GetFieldList=function()\\r\\n    {\\r\\n        var id=this.Args[0];\\r\\n        switch(id)\\r\\n        {\\r\\n            case 0:\\r\\n                return [\\\"finance.date\\\"];\\r\\n            case 1: //persearning\\t每股收益\\r\\n                return [\\\"finance.persearning\\\"];\\r\\n            case 3: //peruprofit\\t每股未分配利润\\r\\n                return [\\\"finance.peruprofit\\\"];\\r\\n            case 4: //pernetasset\\t每股净资产\\r\\n                return [\\\"finance.pernetasset\\\"];\\r\\n            case 5: //percreserve\\t每股资本公积金\\r\\n                return [\\\"finance.percreserve\\\"];\\r\\n            case 6: //woewa\\t加权平均净资产收益\\r\\n                return [\\\"finance.woewa\\\"];\\r\\n            case 7: //perccfo\\t每股经营性现金流\\r\\n                return [\\\"finance.perccfo\\\"];\\r\\n            case 8: //monetaryfunds\\t货币资金\\r\\n                return [\\\"finance.monetaryfunds\\\"];\\r\\n            case 11: //areceivable\\t应收账款\\r\\n                return [\\\"finance.areceivable\\\"];\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n/////////////////////////////////////////////////////////\\r\\n// 内置财务数据下载 某一期的数据\\r\\n//\\r\\nfunction DownloadFinOneData(obj)\\r\\n{\\r\\n    this.newMethod=DownloadFinValueData;   //派生\\r\\n    this.newMethod(obj);\\r\\n    delete this.newMethod;\\r\\n\\r\\n    this.Download=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var fieldList=this.GetFieldList();\\r\\n        if (!fieldList)\\r\\n        {\\r\\n            message=`${this.Job.FunctionName}(${this.Args[0]}, ${this.Args[1]}, ${this.Args[2]}) can't support.`;\\r\\n            this.ErrorCallback(message);\\r\\n            self.RecvCallback(null, self.Job, self.DataKey);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        var aryCondition=[ {\\\"item\\\":[\\\"finance\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"] } ];\\r\\n\\r\\n        var year=this.Args[1];\\r\\n        var month=this.Args[2];\\r\\n        var dataIndex=0;\\r\\n        var dataEnd=3;\\r\\n        var preYear=null;\\r\\n        if (year==0 && month==0)    //如果Y和MMDD都为0,表示最新的财报;\\r\\n        {\\r\\n\\r\\n        }\\r\\n        else if (year==0 && month<300)  //如果Y为0,MMDD为小于300的数字,表示最近一期向前推MMDD期的数据,如果是331,630,930,1231这些,表示最近一期的对应季报的数据;\\r\\n        {\\r\\n            dataIndex=month;\\r\\n            dataEnd=200;\\r\\n        }\\r\\n        else if (month==0 && year<1000) //如果Y为0,MMDD为小于300的数字,表示最近一期向前推MMDD期的数据,如果是331,630,930,1231这些,表示最近一期的对应季报的数据;\\r\\n        {\\r\\n            preYear=year;\\r\\n        }\\r\\n        else if (year>1909)\\r\\n        {\\r\\n            if (month==331)\\r\\n            {\\r\\n                aryCondition=\\r\\n                    [\\r\\n                        {\\\"item\\\":[\\\"announcement1.year\\\",\\\"int32\\\",\\\"eq\\\",year]},\\r\\n                        {\\\"item\\\":[\\\"finance1\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"]}\\r\\n                    ];\\r\\n\\r\\n                fieldList.push(\\\"announcement1.year\\\");\\r\\n                fieldList.push(\\\"announcement1.quarter\\\");\\r\\n            }\\r\\n            else if (month==630)\\r\\n            {\\r\\n                aryCondition=\\r\\n                    [\\r\\n                        {\\\"item\\\":[\\\"announcement2.year\\\",\\\"int32\\\",\\\"eq\\\",year]},\\r\\n                        {\\\"item\\\":[\\\"finance2\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"]}\\r\\n                    ];\\r\\n\\r\\n                fieldList.push(\\\"announcement2.year\\\");\\r\\n                fieldList.push(\\\"announcement2.quarter\\\");\\r\\n            }\\r\\n            else if (month==930)\\r\\n            {\\r\\n                aryCondition=\\r\\n                    [\\r\\n                        {\\\"item\\\":[\\\"announcement3.year\\\",\\\"int32\\\",\\\"eq\\\",year]},\\r\\n                        {\\\"item\\\":[\\\"finance3\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"]}\\r\\n                    ];\\r\\n\\r\\n                fieldList.push(\\\"announcement4.year\\\");\\r\\n                fieldList.push(\\\"announcement4.quarter\\\");\\r\\n            }\\r\\n            else\\r\\n            {\\r\\n                aryCondition=\\r\\n                    [\\r\\n                        {\\\"item\\\":[\\\"announcement4.year\\\",\\\"int32\\\",\\\"eq\\\",year]},\\r\\n                        {\\\"item\\\":[\\\"finance4\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"]}\\r\\n                    ];\\r\\n\\r\\n                fieldList.push(\\\"announcement4.year\\\");\\r\\n                fieldList.push(\\\"announcement4.quarter\\\");\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.Url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"condition\\\":aryCondition,\\r\\n                    \\\"start\\\": 0,\\r\\n                    \\\"end\\\": dataEnd\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.ToHQChartData(recvData);\\r\\n                var result=null;\\r\\n                if (data && data.length>0)\\r\\n                {\\r\\n                    data.sort(function (a, b) { return (b.Date-a.Date) });\\r\\n                    if (preYear==null)\\r\\n                        result=data[dataIndex];   //返回一个数据\\r\\n                    else\\r\\n                        result=self.GetPreYearData(data, preYear);\\r\\n                }\\r\\n                self.RecvCallback(result, self.Job, self.DataKey);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.GetPreYearData=function(data, preYear)\\r\\n    {\\r\\n        //331,630,930,1231这些,表示最近一期的对应季报的数据;\\r\\n        if (preYear==331 || preYear==630|| preYear==930 || preYear==1231)\\r\\n        {\\r\\n            for(var i in data)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (item.Date%10000==preYear) return item;\\r\\n            }\\r\\n        }\\r\\n        else\\r\\n        {\\r\\n            //如果MMDD为0,Y为一数字,表示最近一期向前推Y年的同期数据;\\r\\n            var month=data[0].Date%1000;\\r\\n            for(var i=1, j=0; i<data.length ;++i)\\r\\n            {\\r\\n                var item=data[i];\\r\\n                if (item.Date%10000==month)\\r\\n                {\\r\\n                    ++j;\\r\\n                    if (j==preYear) return item;\\r\\n                }\\r\\n            }\\r\\n\\r\\n            return null;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\nfunction DownloadFinanceData(obj)\\r\\n{\\r\\n    this.Url=obj.Url;\\r\\n    this.RealtimeUrl=obj.RealtimeUrl;\\r\\n    this.Job=obj.Job;\\r\\n    this.Symbol=obj.Symbol;\\r\\n    this.Args=obj.Args;\\r\\n    this.DataKey=obj.DataKey;\\r\\n    this.RecvCallback=obj.Callback;\\r\\n    this.ErrorCallback=obj.ErrorCallback;\\r\\n\\r\\n    this.Download=function()\\r\\n    {\\r\\n        var id=this.Args[0];\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1: //FINANCE(1) 总股本(随时间可能有变化) 股\\r\\n            case 7: //FINANCE(7) 流通股本(随时间可能有变化) 股\\r\\n            case \\\"EXCHANGE\\\": //换手率\\r\\n                this.DownloadHistoryData(id);\\r\\n                break;\\r\\n            case 3:\\r\\n                this.GetSymbolType(id);\\r\\n                break;\\r\\n\\r\\n            case 9:     //FINANCE(9)  资产负债率\\r\\n            case 18:    //FINANCE(18)  每股公积金\\r\\n            case 30:    //FINANCE(30)  净利润\\r\\n            case 32:    //FINANCE(32)  每股未分配利润\\r\\n            case 33:    //FINANCE(33)  每股收益(折算为全年收益),对于沪深品种有效\\r\\n            case 34:    //FINANCE(34)  每股净资产\\r\\n            case 38:    //FINANCE(38)  每股收益(最近一期季报)\\r\\n            case 40:    //FINANCE(40)  流通市值\\r\\n            case 41:    //FINANCE(41)  总市值\\r\\n            case 42:    //FINANCE(42)  上市的天数\\r\\n            case 43:    //FINANCE(43)  利润同比\\r\\n\\r\\n            case \\\"CAPITAL\\\":\\r\\n            case \\\"TOTALCAPITAL\\\":\\r\\n\\r\\n            //定制\\r\\n            case 100:   //股东人数\\r\\n                this.DownloadRealtimeData(id);\\r\\n                break;\\r\\n\\r\\n            default:\\r\\n                this.DownloadRealtimeData(id);\\r\\n                break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //FINANCE(3) 沪深品种类型\\r\\n    //0:指数,1:A股主板,2:中小板,3:创业板,4:科创板,5:B股,6:债券,7:基金,8:权证,9:其它,10:非沪深品种\\r\\n    this.GetSymbolType=function(id)\\r\\n    {\\r\\n        var value=1;\\r\\n        if (MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol)) value=0;\\r\\n        var data={ Date:null, Value:value };\\r\\n        this.RecvCallback(data,this.Job, this.DataKey);\\r\\n    }\\r\\n\\r\\n    //最新一期数据\\r\\n    this.DownloadRealtimeData=function(id)\\r\\n    {\\r\\n        var self=this;\\r\\n        var fieldList=this.GetFieldList();\\r\\n        if (!fieldList)\\r\\n        {\\r\\n            if (this.Job.FunctionName2) message=`${this.Job.FunctionName2} can't support.`;\\r\\n            else if (this.Job.FunctionName) message=`${this.Job.FunctionName}(${this.Args[0]}) can't support.`;\\r\\n            else message=`${this.Args[0]} can't support.`;\\r\\n            this.ErrorCallback(message);\\r\\n            self.RecvCallback(null, self.Job, self.DataKey);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.RealtimeUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"condition\\\":[ ] ,\\r\\n                    \\\"start\\\": 0,\\r\\n                    \\\"end\\\": 10\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.RealtimeDataToHQChartData(recvData);\\r\\n                self.RecvCallback(data, self.Job, self.DataKey);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    //历史数据\\r\\n    this.DownloadHistoryData=function(id)\\r\\n    {\\r\\n        var self=this;\\r\\n        var fieldList=this.GetFieldList();\\r\\n        if (!fieldList)\\r\\n        {\\r\\n            message=`${this.Job.FunctionName}(${this.Args[0]}) can't support.`;\\r\\n            this.ErrorCallback(message);\\r\\n            self.RecvCallback(null, self.Job, self.DataKey);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.Url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"condition\\\":[ ] ,\\r\\n                    \\\"start\\\": 0,\\r\\n                    \\\"end\\\": 200\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.ToHQChartData(recvData);\\r\\n                if (data) //排序\\r\\n                    data.sort(function (a, b) { return (a.Date - b.Date) });\\r\\n\\r\\n                self.RecvCallback(data, self.Job, self.DataKey);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.GetFieldList=function()\\r\\n    {\\r\\n        var id=this.Args[0];\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1:\\r\\n                return [\\\"capital.total\\\", \\\"capital.date\\\"];\\r\\n            case 7:\\r\\n                return [\\\"capital.a\\\", \\\"capital.date\\\"];\\r\\n            case \\\"EXCHANGE\\\":\\r\\n                return [\\\"capital.a\\\", \\\"capital.date\\\"];\\r\\n\\r\\n            case 9:\\r\\n                return [\\\"finance.peruprofit\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 18:\\r\\n                return [\\\"finance.percreserve\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 30:\\r\\n                return [\\\"finance.nprofit\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 32:\\r\\n                return [\\\"finance.peruprofit\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 33:\\r\\n                return [\\\"finance.persearning\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 34:\\r\\n                return [\\\"finance.pernetasset\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 38:\\r\\n                return [\\\"finance.persearning\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 40:\\r\\n                return [\\\"capital.a\\\", \\\"capital.date\\\",\\\"symbol\\\",\\\"date\\\", \\\"price\\\"];\\r\\n            case 41:\\r\\n                return [\\\"capital.total\\\", \\\"capital.date\\\",\\\"symbol\\\",\\\"date\\\",\\\"price\\\"];\\r\\n            case \\\"CAPITAL\\\":\\r\\n                return [\\\"capital.a\\\", \\\"capital.date\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case \\\"TOTALCAPITAL\\\":\\r\\n                return [\\\"capital.total\\\", \\\"capital.date\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 42:\\r\\n                return [\\\"company.releasedate\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 43:\\r\\n                return [\\\"dividendyield\\\",\\\"symbol\\\",\\\"date\\\"];\\r\\n            case 100:\\r\\n                return [\\\"shareholder\\\",\\\"symbol\\\",\\\"date\\\"]\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //最新报告期数据\\r\\n    this.RealtimeDataToHQChartData=function(recvData,id)\\r\\n    {\\r\\n        if (!recvData.stock || recvData.stock.length!=1) return null;\\r\\n        var stock=recvData.stock[0];\\r\\n        var id=this.Args[0];\\r\\n        var date=stock.date;\\r\\n        switch(id)\\r\\n        {\\r\\n            case 9:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.peruprofit };\\r\\n            case 18:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.percreserve };\\r\\n            case 30:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.nprofit };\\r\\n            case 32:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.peruprofit };\\r\\n            case 33:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.persearning };\\r\\n            case 34:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.pernetasset };\\r\\n            case 38:\\r\\n                if (!stock.finance) return null;\\r\\n                return { Date:date, Value:stock.finance.persearning };\\r\\n            case 40:    //FINANCE(40)  流通市值\\r\\n                if (!stock.capital) return null;\\r\\n                return { Date:date, Value:stock.capital.a*stock.price };    //流通股*最新价格\\r\\n            case 41:   //FINANCE(41)  总市值\\r\\n                if (!stock.capital) return null;\\r\\n                return { Date:date, Value:stock.capital.total*stock.price };    //总股本*最新价格\\r\\n            case 42:    //FINANCE(42)  上市的天数\\r\\n                if (!stock.company) return null;\\r\\n            {\\r\\n                var releaseDate=stock.company.releasedate;\\r\\n                var year=parseInt(releaseDate/10000);\\r\\n                var month=parseInt((releaseDate%10000)/100);\\r\\n                var day=releaseDate%100;\\r\\n                var firstDate=new Date(year, month-1, day);\\r\\n                var nowDate=new Date();\\r\\n                var days=parseInt((nowDate.getTime()-firstDate.getTime())/(1000 * 60 * 60 * 24));\\r\\n                return { Date:date, Value:days+1 };\\r\\n            }\\r\\n            case 43:\\r\\n                if (!stock.dividendyield) return null;\\r\\n                return { Date:date, Value:stock.dividendyield.quarter4 };\\r\\n            case 100:\\r\\n                if (!stock.shareholder) return null;\\r\\n                return { Date:date, Value:stock.shareholder.count };\\r\\n            case \\\"CAPITAL\\\":\\r\\n                if (!stock.capital) return null;\\r\\n                return { Date:date, Value:stock.capital.a/100 };    //当前流通股本 手\\r\\n            case \\\"TOTALCAPITAL\\\":\\r\\n                if (!stock.capital) return null;\\r\\n                return { Date:date, Value:stock.capital.total/100 };    //当前流通股本 手\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //历史数据转\\r\\n    this.ToHQChartData=function(recvData)\\r\\n    {\\r\\n        if (!recvData.stock || recvData.stock.length!=1) return null;\\r\\n\\r\\n        var aryData=[];\\r\\n        var setDate=new Set();  //有重复数据 去掉\\r\\n        var stock=recvData.stock[0];\\r\\n        var id=this.Args[0];\\r\\n        for(var i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n\\r\\n            var hqchartItem=this.ToHQChartItemData(item,id);\\r\\n            if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n            {\\r\\n                aryData.push(hqchartItem);\\r\\n                setDate.add(hqchartItem.Date);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return aryData;\\r\\n    }\\r\\n\\r\\n    this.ToHQChartItemData=function(item, id)\\r\\n    {\\r\\n        if (!item) return null;\\r\\n        var date=item.date;\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1:\\r\\n                if (!item.capital) return null;\\r\\n                return { Date:date, Value:item.capital.total };\\r\\n            case 7:\\r\\n            case \\\"EXCHANGE\\\":    //换手率 历史流通股本\\r\\n                if (!item.capital) return null;\\r\\n                return { Date:date, Value:item.capital.a };\\r\\n\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction DownloadGPJYValue(obj)\\r\\n{\\r\\n    this.Url=obj.Url;\\r\\n    this.RealtimeUrl=obj.RealtimeUrl;\\r\\n    this.Job=obj.Job;\\r\\n    this.Symbol=obj.Symbol;\\r\\n    this.Args=obj.Args;\\r\\n    this.DataKey=obj.DataKey;\\r\\n    this.RecvCallback=obj.Callback;\\r\\n    this.ErrorCallback=obj.ErrorCallback;\\r\\n\\r\\n    this.Download=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var fieldList=this.GetFieldList();\\r\\n        if (!fieldList)\\r\\n        {\\r\\n            message=`${this.Job.FunctionName}(${this.Args[0]}, ${this.Args[1]}, ${this.Args[2]}) can't support.`;\\r\\n            this.ErrorCallback(message);\\r\\n            self.RecvCallback(null, self.Job, self.DataKey, true);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.Url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": fieldList,\\r\\n                    \\\"symbol\\\": [this.Symbol],\\r\\n                    \\\"orderfield\\\":\\\"date\\\",\\r\\n                    \\\"order\\\":-1,\\r\\n                    \\\"start\\\":0,\\r\\n                    \\\"end\\\":5\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.ToHQChartData(recvData);\\r\\n                if (data && data.length>0)\\r\\n                {\\r\\n                    data.sort(function (a, b) { return (a.Date-b.Date) });\\r\\n                }\\r\\n                self.RecvCallback(data, self.Job, self.DataKey);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.GetFieldList=function()\\r\\n    {\\r\\n        var id=this.Args[0];\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1: //1--股东人数 股东户数(户)\\r\\n                return [\\\"shareholder\\\", \\\"date\\\", \\\"symbol\\\"];\\r\\n            case 2: //2--龙虎榜   买入总计(万元) 卖出总计(万元)\\r\\n                return [\\\"tradedetail.buy\\\",\\\"tradedetail.sell\\\", \\\"date\\\", \\\"symbol\\\"];\\r\\n            case 3: //3--融资融券1 融资余额(万元) 融券余量(股)\\r\\n                return [\\\"margin\\\",\\\"date\\\", \\\"symbol\\\"];\\r\\n            case 4: //4--大宗交易 成交均价(元) 成交额(万元)\\r\\n                return [\\\"blocktrading.amount\\\",\\\"blocktrading.price\\\",\\\"date\\\", \\\"symbol\\\"]\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ToHQChartData=function(recvData)\\r\\n    {\\r\\n        if (!recvData.stock || recvData.stock.length!=1) return null;\\r\\n\\r\\n        var aryData=[];\\r\\n        var setDate=new Set();  //有重复数据 去掉\\r\\n        var stock=recvData.stock[0];\\r\\n        var id=this.Args[0];\\r\\n        var subID=this.Args[1];\\r\\n        for(var i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n\\r\\n            var hqchartItem=this.ToHQChartItemData(item,id,subID);\\r\\n            if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n            {\\r\\n                aryData.push(hqchartItem);\\r\\n                setDate.add(hqchartItem.Date);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return aryData;\\r\\n    }\\r\\n\\r\\n    this.ToHQChartItemData=function(item, id, subID)\\r\\n    {\\r\\n        if (!item) return null;\\r\\n        var date=item.date;\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1:\\r\\n                if (!item.shareholder) return null;\\r\\n                return { Date:date, Value:item.shareholder.count };\\r\\n            case 2:\\r\\n                if (!item.tradedetail && item.tradedetail[0]) return null;\\r\\n                if (subID==0)\\r\\n                    return { Date:date, Value:item.tradedetail[0].buy };\\r\\n                else\\r\\n                    return { Date:date, Value:item.tradedetail[0].sell };\\r\\n            case 3:\\r\\n                if (!item.margin) return null;\\r\\n                if (subID==0)\\r\\n                {\\r\\n                    if (item.margin.buy)\\r\\n                        return { Date:date, Value:item.margin.buy.balance };\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (item.margin.sell)\\r\\n                        return { Date:date, Value:item.margin.sell.balance };\\r\\n                }\\r\\n                return null;\\r\\n            case 4:\\r\\n                if (!item.blocktrading) return null;\\r\\n                if (subID==0)\\r\\n                    return { Date:date, Value:item.blocktrading.price };\\r\\n                else\\r\\n                    return { Date:date, Value:item.blocktrading.amount };\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n引用市场总的交易类数据.如果指标支持云数据函数,则不需要[专业财务数据]下载.\\r\\nSCJYVALUE(ID,N,TYPE),ID为数据编号,N表示第几个数据,TYPE:为1表示做平滑处理,没有数据的周期返回上一周期的值;为0表示不做平滑处理\\r\\n\\r\\n市场交易类数据函数，数据编号如下:\\r\\n1--融资融券       沪深融资余额(万元) 沪深融券余额(万元)\\r\\n2--陆股通资金流入 沪股通流入金额(亿元) 深股通流入金额(亿元)\\r\\n3--沪深涨停股个数 涨停股个数  曾涨停股个数 [注：该指标展示20160926日之后的数据]\\r\\n4--沪深跌停股个数 跌停股个数  曾跌停股个数\\r\\n5--上证50股指期货  净持仓(手)[注：该指标展示20171009日之后的数据]\\r\\n6--沪深300股指期货 净持仓(手) [注：该指标展示20171009日之后的数据]\\r\\n7--中证500股指期货 净持仓(手) [注：该指标展示20171009日之后的数据]\\r\\n8--ETF基金规模数据 ETF基金规模(亿) ETF净申赎(亿)\\r\\n9--每周新增投资者 新增投资者(万户)\\r\\n10--增减持统计    增持额(万元)  减持额(万元)[注：部分公司公告滞后,造成每天查看的数据可能会不一样]\\r\\n11--大宗交易      溢价的大宗交易额(万元) 折价的大宗交易额(万元)\\r\\n12--限售解禁      限售解禁计划额(亿元)  限售解禁股份实际上市金额(亿元)[注：该指标展示201802月之后的数据;部分股票的解禁日期延后，造成不同日期提取的某天的计划额可能不同]\\r\\n13--分红          市场总分红额(亿元)[注：除权派息日的A股市场总分红额]\\r\\n14--募资          市场总募资额(亿元)[注：发行日期/除权日期的首发、配股和增发的总募资额]\\r\\n15--打板资金    封板成功资金(亿元) 封板失败资金(亿元) [注：该指标展示20160926日之后的数据]\\r\\n*/\\r\\nfunction DownloadSCJYValue(obj)\\r\\n{\\r\\n    this.Url=obj.Url;\\r\\n    //this.RealtimeUrl=obj.RealtimeUrl;\\r\\n    this.Job=obj.Job;\\r\\n    this.Symbol=obj.Symbol;\\r\\n    this.Args=obj.Args;\\r\\n    this.DataKey=obj.DataKey;\\r\\n    this.RecvCallback=obj.Callback;\\r\\n    this.ErrorCallback=obj.ErrorCallback;\\r\\n\\r\\n    this.Download=function()\\r\\n    {\\r\\n        var self=this;\\r\\n        var query=this.GetQueryCondtion();\\r\\n        if (!query)\\r\\n        {\\r\\n            message=`${this.Job.FunctionName}(${this.Args[0]}, ${this.Args[1]}, ${this.Args[2]}) can't support.`;\\r\\n            this.ErrorCallback(message);\\r\\n            self.RecvCallback(null, self.Job, self.DataKey, true);\\r\\n            return;\\r\\n        }\\r\\n\\r\\n        //请求数据\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: this.Url,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": query.Field,\\r\\n                    \\\"symbol\\\": query.Symbol,\\r\\n                    \\\"condition\\\":query.Cond ,\\r\\n                    \\\"start\\\": 0,\\r\\n                    \\\"end\\\": 2000\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.ToHQChartData(recvData);\\r\\n                if (data) //排序\\r\\n                    data.sort(function (a, b) { return (a.Date - b.Date) });\\r\\n\\r\\n                self.RecvCallback(data, self.Job, self.DataKey);\\r\\n            }\\r\\n        });\\r\\n\\r\\n    }\\r\\n\\r\\n    this.GetQueryCondtion=function()\\r\\n    {\\r\\n        var day=new Date();\\r\\n        var endDate=day.getFullYear()*10000+(day.getMonth()+1)*100+day.getDate();\\r\\n        day.setDate(day.getDate()-100); //取最近1000条数据\\r\\n        var startDate=day.getFullYear()*10000+(day.getMonth()+1)*100+day.getDate()\\r\\n        var id=this.Args[0];\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1:\\r\\n                var data=\\r\\n                    {\\r\\n                        Symbol:[\\\"CNA.ci\\\"],\\r\\n                        Field:[\\\"margin\\\"],\\r\\n                        Cond:\\r\\n                            [\\r\\n                                {\\\"item\\\":[\\\"date\\\",\\\"int32\\\",\\\"gte\\\",startDate.toString(),\\\"lte\\\",endDate.toString()]},\\r\\n                                {\\\"item\\\":[\\\"margin\\\",\\\"doc\\\",\\\"exists\\\",\\\"true\\\"]}\\r\\n                            ]\\r\\n                    }\\r\\n                return data;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.ToHQChartData=function(recvData)\\r\\n    {\\r\\n        if (!recvData.stock || recvData.stock.length!=1) return null;\\r\\n\\r\\n        var aryData=[];\\r\\n        var setDate=new Set();  //有重复数据 去掉\\r\\n        var stock=recvData.stock[0];\\r\\n        var id=this.Args[0];\\r\\n        var subID=this.Args[1];\\r\\n        for(var i in stock.stockday)\\r\\n        {\\r\\n            var item=stock.stockday[i];\\r\\n\\r\\n            var hqchartItem=this.ToHQChartItemData(item,id,subID);\\r\\n            if (hqchartItem && !setDate.has(hqchartItem.Date))\\r\\n            {\\r\\n                aryData.push(hqchartItem);\\r\\n                setDate.add(hqchartItem.Date);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        return aryData;\\r\\n    }\\r\\n\\r\\n    this.ToHQChartItemData=function(item, id, subID)\\r\\n    {\\r\\n        if (!item) return null;\\r\\n        var date=item.date;\\r\\n        var subItem=null;\\r\\n        switch(id)\\r\\n        {\\r\\n            case 1:\\r\\n                if (!item.margin) return null;\\r\\n                subItem=item.margin;\\r\\n                if (subID==1)\\r\\n                {\\r\\n                    if (!subItem.buy || !IFrameSplitOperator.IsNumber(subItem.buy.balance)) return null;\\r\\n                    return { Date:date, Value:subItem.buy.balance }\\r\\n                }\\r\\n                else\\r\\n                {\\r\\n                    if (!IFrameSplitOperator.IsNumber(subItem.sell.balance)) return null;\\r\\n                    return { Date:date, Value:subItem.sell.balance }\\r\\n                }\\r\\n\\r\\n            default:\\r\\n                return null;\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\nfunction DownloadGroupData(obj)\\r\\n{\\r\\n    this.Url=obj.Url;\\r\\n    this.RealtimeUrl=obj.RealtimeUrl;\\r\\n    this.Job=obj.Job;\\r\\n    this.Symbol=obj.Symbol;\\r\\n    this.Args=obj.Args;\\r\\n    this.DataKey=obj.DataKey;\\r\\n    this.RecvCallback=obj.Callback;\\r\\n    this.ErrorCallback=obj.ErrorCallback;\\r\\n\\r\\n    this.Download=function()\\r\\n    {\\r\\n        var varName=this.Args[0];\\r\\n        switch(varName)\\r\\n        {\\r\\n            case \\\"HYBLOCK\\\":\\r\\n            case \\\"DYBLOCK\\\":\\r\\n            case \\\"GNBLOCK\\\":\\r\\n                this.DownloadGroupName(varName);\\r\\n                break;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    this.DownloadGroupName=function(blockType)\\r\\n    {\\r\\n        var self=this;\\r\\n        var field=[\\\"name\\\",\\\"symbol\\\"];\\r\\n        if (blockType==\\\"HYBLOCK\\\") field.push(\\\"industry\\\");\\r\\n        else if (blockType==\\\"DYBLOCK\\\") field.push(\\\"region\\\");\\r\\n        else if (blockType==\\\"GNBLOCK\\\") field.push(\\\"concept\\\");\\r\\n\\r\\n        JSNetwork.HttpRequest({\\r\\n            url: self.RealtimeUrl,\\r\\n            data:\\r\\n                {\\r\\n                    \\\"field\\\": field,\\r\\n                    \\\"symbol\\\": [this.Symbol]\\r\\n                },\\r\\n            type:\\\"post\\\",\\r\\n            dataType: \\\"json\\\",\\r\\n            async:true,\\r\\n            success: function (recvData)\\r\\n            {\\r\\n                var data=self.RecvGroupName(recvData);\\r\\n                self.RecvCallback(data, self.Job, self.DataKey, 1);\\r\\n            },\\r\\n            error: function(request)\\r\\n            {\\r\\n                self.ErrorCallback(request);\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n\\r\\n    this.RecvGroupName=function(recvData)\\r\\n    {\\r\\n        if (!recvData.stock || recvData.stock.length!=1) return null;\\r\\n        var stock=recvData.stock[0];\\r\\n        var varName=this.Args[0];\\r\\n        var value=null;\\r\\n        if (varName==\\\"HYBLOCK\\\")\\r\\n        {\\r\\n            var industry=stock.industry;\\r\\n            if (!industry) return null;\\r\\n            var value;\\r\\n            for(var i in industry)\\r\\n            {\\r\\n                var item=industry[i];\\r\\n                value=item.name;\\r\\n            }\\r\\n        }\\r\\n        else if (varName==\\\"DYBLOCK\\\")\\r\\n        {\\r\\n            var region=stock.region;\\r\\n            if (!region) return null;\\r\\n            for(var i in region)\\r\\n            {\\r\\n                var item=region[i];\\r\\n                value=item.name;\\r\\n            }\\r\\n        }\\r\\n        else if (varName==\\\"GNBLOCK\\\")\\r\\n        {\\r\\n            var concept=stock.concept;\\r\\n            if (!concept) return null;\\r\\n            value=\\\"\\\";\\r\\n            for(var i in concept)\\r\\n            {\\r\\n                var item=concept[i];\\r\\n                if (value.length>0) value+=' ';\\r\\n                value+=item.name;\\r\\n            }\\r\\n\\r\\n        }\\r\\n\\r\\n        return { Value:value };\\r\\n    }\\r\\n}\\r\\n\\r\\n/* 测试例子\\r\\nvar code1='VARHIGH:IF(VAR1<=REF(HH,-1),REF(H,BARSLAST(VAR1>=REF(HH,1))),DRAWNULL),COLORYELLOW;';\\r\\nvar code2='VAR1=((SMA(MAX((CLOSE - LC),0),3,1) / SMA(ABS((CLOSE - LC)),3,1)) * 100);';\\r\\nvar code3='mm1=1-2*-9+20;';\\r\\n\\r\\nJSConsole.Complier.Log(code1+code2)\\r\\nvar tokens=JSComplier.Tokenize(code1+code2);\\r\\nvar ast=JSComplier.Parse(code2+code1);\\r\\n\\r\\nJSConsole.Complier.Log(ast);\\r\\n*//*\\r\\n   Copyright (c) 2018 jones\\r\\n\\r\\n    http://www.apache.org/licenses/LICENSE-2.0\\r\\n\\r\\n   开源项目 https://github.com/jones2000/HQChart\\r\\n\\r\\n   jones_2000@163.com\\r\\n\\r\\n   配色\\r\\n*/\\r\\n\\r\\n/*\\r\\n    不同风格行情配置文件\\r\\n    !!手机上字体大小需要*分辨率比\\r\\n*/\\r\\n\\r\\n/* umychart.js 里面已经有了\\r\\nfunction GetDevicePixelRatio()\\r\\n{\\r\\n    return window.devicePixelRatio || 1;\\r\\n}\\r\\n*/\\r\\n\\r\\n//黑色风格\\r\\nvar BLACK_STYLE=\\r\\n    {\\r\\n        BGColor:'rgb(0,0,0)', //背景色\\r\\n        TooltipBGColor: \\\"rgb(255, 255, 255)\\\", //背景色\\r\\n        TooltipAlpha: 0.92,                  //透明度\\r\\n\\r\\n        SelectRectBGColor: \\\"rgba(1,130,212,0.06)\\\", //背景色\\r\\n        //  SelectRectAlpha: 0.06;                  //透明度\\r\\n\\r\\n        //K线颜色\\r\\n        UpBarColor: \\\"rgb(238,21,21)\\\",   //上涨\\r\\n        DownBarColor: \\\"rgb(25,158,0)\\\",  //下跌\\r\\n        UnchagneBarColor: \\\"rgb(228,228,228)\\\", //平盘\\r\\n        EmptyBarBGColor:'rgb(0,0,0)',   //空心柱子背景色\\r\\n\\r\\n        Minute:\\r\\n            {\\r\\n                VolBarColor: null,\\r\\n                PriceColor: \\\"rgb(25,180,231)\\\",\\r\\n                AreaPriceColor:\\\"rgba(63,158,255,.3)\\\",\\r\\n                AvPriceColor: \\\"rgb(255,236,0)\\\",\\r\\n                PositionColor:'rgb(218,165,32)',\\r\\n                VolTitleColor:\\\"rgb(190,190,190)\\\",\\r\\n                Before:\\r\\n                    {\\r\\n                        BGColor:\\\"rgba(105,105,105,0.5)\\\",\\r\\n                        AvPriceColor:'rgb(248,248,255)'     //均线\\r\\n                    }\\r\\n            },\\r\\n\\r\\n\\r\\n        DefaultTextColor: \\\"rgb(101,104,112)\\\",\\r\\n        DefaultTextFont: 14*GetDevicePixelRatio() +'px 微软雅黑',\\r\\n        TitleFont: 13*GetDevicePixelRatio() +'px 微软雅黑',    //标题字体(动态标题 K线及指标的动态信息字体)\\r\\n\\r\\n        UpTextColor: \\\"rgb(238,21,21)\\\",\\r\\n        DownTextColor: \\\"rgb(25,158,0)\\\",\\r\\n        UnchagneTextColor: \\\"rgb(101,104,112)\\\",\\r\\n        CloseLineColor: 'rgb(178,34,34)',\\r\\n\\r\\n        Title:\\r\\n            {\\r\\n                TradeIndexColor:'rgb(105,105,105)', //交易指标颜色\\r\\n                ColorIndexColor:'rgb(112,128,144)',  //五彩K线颜色\\r\\n\\r\\n                VolColor:\\\"rgb(101,104,112)\\\",       //标题成交量\\r\\n                AmountColor:\\\"rgb(101,104,112)\\\",    //成交金额\\r\\n                DateTimeColor:\\\"rgb(101,104,112)\\\",  //时间,日期\\r\\n                SettingColor:\\\"rgb(101,104,112)\\\",   //周期,复权\\r\\n                NameColor:\\\"rgb(101,104,112)\\\" ,     //股票名称\\r\\n                TurnoverRateColor:'rgb(101,104,112)',       //换手率\\r\\n                PositionColor:\\\"rgb(101,104,112)\\\"       //持仓\\r\\n            },\\r\\n\\r\\n        FrameBorderPen: \\\"rgba(236,236,236,0.13)\\\",     //边框\\r\\n        FrameSplitPen: \\\"rgba(236,236,236,0.13)\\\",          //分割线\\r\\n        FrameSplitTextColor: \\\"rgb(101,104,112)\\\",     //刻度文字颜色\\r\\n        FrameSplitTextFont: 12*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",        //坐标刻度文字字体\\r\\n        FrameTitleBGColor: \\\"rgb(0,0,0)\\\",      //标题栏背景色\\r\\n        OverlayIndexTitleBGColor:'rgba(0,0,0,0.7)', //叠加指标背景色\\r\\n\\r\\n        Frame:\\r\\n            {\\r\\n                XBottomOffset:1*GetDevicePixelRatio(), //X轴文字向下偏移\\r\\n\\r\\n                PercentageText:      //百分比坐标文字颜色\\r\\n                    {\\r\\n                        PriceColor:'rgb(101,104,112)',\\r\\n                        PercentageColor:\\\"rgb(101,104,112)\\\",\\r\\n                        SplitColor:\\\"rgb(101,104,112)\\\",\\r\\n                        Font:14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\"\\r\\n                    }\\r\\n            },\\r\\n\\r\\n\\r\\n        FrameLatestPrice : {\\r\\n            TextColor:'rgb(255,255,255)',   //最新价格文字颜色\\r\\n            UpBarColor:\\\"rgb(238,21,21)\\\",    //上涨\\r\\n            DownBarColor:\\\"rgb(25,158,0)\\\",   //下跌\\r\\n            UnchagneBarColor:\\\"rgb(190,190,190)\\\",   //平盘\\r\\n            BGAlpha:0.6\\r\\n        },\\r\\n\\r\\n        CorssCursorBGColor: \\\"rgb(43,54,69)\\\",            //十字光标背景\\r\\n        CorssCursorTextColor: \\\"rgb(255,255,255)\\\",\\r\\n        CorssCursorTextFont: 12*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",\\r\\n        CorssCursorHPenColor: \\\"rgb(130,130,130)\\\",           //十字光标线段颜色\\r\\n        CorssCursorVPenColor: \\\"rgb(130,130,130)\\\",           //十字光标线段颜色\\r\\n\\r\\n        CorssCursor:\\r\\n            {\\r\\n                RightButton :\\r\\n                    {\\r\\n                        BGColor:'rgb(43,54,69)',\\r\\n                        PenColor:'rgb(255,255,255)',\\r\\n                        Icon: { Text:'\\\\ue6a3', Color:'rgb(255,255,255)', Family:\\\"iconfont\\\", Size:18 }\\r\\n                    }\\r\\n            },\\r\\n\\r\\n        KLine:\\r\\n            {\\r\\n                MaxMin: { Font: 12*GetDevicePixelRatio() +'px 微软雅黑', Color: 'rgb(255,250,240)', RightArrow:\\\"→\\\", LeftArrow:\\\"←\\\", HighYOffset:0, LowYOffset:0 },   //K线最大最小值显示\\r\\n                Info:  //信息地雷\\r\\n                    {\\r\\n                        Investor:\\r\\n                            {\\r\\n                                ApiUrl:'/API/NewsInteract', //互动易\\r\\n                                IconFont: { Family:'iconfont', Text:'\\\\ue631' , HScreenText:'\\\\ue684', Color:'#1c65db'} //SVG 文本\\r\\n                            },\\r\\n                        Announcement:                                           //公告\\r\\n                            {\\r\\n                                ApiUrl:'/API/ReportList',\\r\\n                                IconFont: { Family:'iconfont', Text:'\\\\ue633', HScreenText:'\\\\ue685', Color:'#f5a521' }, //SVG 文本\\r\\n                                IconFont2: { Family:'iconfont', Text:'\\\\ue634', HScreenText:'\\\\ue686', Color:'#ed7520' } //SVG 文本 //季报\\r\\n                            },\\r\\n                        Pforecast:  //业绩预告\\r\\n                            {\\r\\n                                ApiUrl:'/API/StockHistoryDay',\\r\\n                                IconFont: { Family:'iconfont', Text:'\\\\ue62e', HScreenText:'\\\\ue687', Color:'#986cad' } //SVG 文本\\r\\n                            },\\r\\n                        Research:   //调研\\r\\n                            {\\r\\n                                ApiUrl:'/API/InvestorRelationsList',\\r\\n                                IconFont: { Family:'iconfont', Text:'\\\\ue632', HScreenText:'\\\\ue688', Color:'#19b1b7' } //SVG 文本\\r\\n                            },\\r\\n                        BlockTrading:   //大宗交易\\r\\n                            {\\r\\n                                ApiUrl:'/API/StockHistoryDay',\\r\\n                                IconFont: { Family:'iconfont', Text:'\\\\ue630', HScreenText:'\\\\ue689', Color:'#f39f7c' } //SVG 文本\\r\\n                            },\\r\\n                        TradeDetail:    //龙虎榜\\r\\n                            {\\r\\n                                ApiUrl:'/API/StockHistoryDay',\\r\\n                                IconFont: { Family:'iconfont', Text:'\\\\ue62f', HScreenText:'\\\\ue68a' ,Color:'#b22626' } //SVG 文本\\r\\n                            }\\r\\n\\r\\n                    },\\r\\n                NumIcon:\\r\\n                    {\\r\\n                        Color:'rgb(251,80,80)',Family:'iconfont',\\r\\n                        Text:[  '\\\\ue649',\\r\\n                            '\\\\ue63b','\\\\ue640','\\\\ue63d','\\\\ue63f','\\\\ue645','\\\\ue641','\\\\ue647','\\\\ue648','\\\\ue646','\\\\ue636',\\r\\n                            '\\\\ue635','\\\\ue637','\\\\ue638','\\\\ue639','\\\\ue63a','\\\\ue63c','\\\\ue63e','\\\\ue642','\\\\ue644','\\\\ue643'\\r\\n                        ]\\r\\n                    },\\r\\n                TradeIcon:  //交易指标 图标\\r\\n                    {\\r\\n                        Family:'iconfont',\\r\\n                        Buy: { Color:'rgb(255,15,4)', Text:'\\\\ue683', HScreenText:'\\\\ue682'},\\r\\n                        Sell: { Color:'rgb(64,122,22)', Text:'\\\\ue681',HScreenText:'\\\\ue680'},\\r\\n                    }\\r\\n            },\\r\\n\\r\\n        Index:\\r\\n            {\\r\\n                LineColor:  //指标线段颜色\\r\\n                    [\\r\\n                        \\\"rgb(255,189,09)\\\",\\r\\n                        \\\"rgb(22,198,255)\\\",\\r\\n                        \\\"rgb(174,35,161)\\\",\\r\\n                        \\\"rgb(236,105,65)\\\",\\r\\n                        \\\"rgb(68,114,196)\\\",\\r\\n                        \\\"rgb(229,0,79)\\\",\\r\\n                        \\\"rgb(0,128,255)\\\",\\r\\n                        \\\"rgb(252,96,154)\\\",\\r\\n                        \\\"rgb(42,230,215)\\\",\\r\\n                        \\\"rgb(24,71,178)\\\",\\r\\n                    ],\\r\\n                NotSupport: { Font: \\\"14px 微软雅黑\\\", TextColor: \\\"rgb(52,52,52)\\\" }\\r\\n            },\\r\\n\\r\\n        ColorArray:       //自定义指标默认颜色\\r\\n            [\\r\\n                \\\"rgb(255,174,0)\\\",\\r\\n                \\\"rgb(25,199,255)\\\",\\r\\n                \\\"rgb(175,95,162)\\\",\\r\\n                \\\"rgb(236,105,65)\\\",\\r\\n                \\\"rgb(68,114,196)\\\",\\r\\n                \\\"rgb(229,0,79)\\\",\\r\\n                \\\"rgb(0,128,255)\\\",\\r\\n                \\\"rgb(252,96,154)\\\",\\r\\n                \\\"rgb(42,230,215)\\\",\\r\\n                \\\"rgb(24,71,178)\\\",\\r\\n            ],\\r\\n\\r\\n        DrawPicture:  //画图工具\\r\\n            {\\r\\n                LineColor: \\\"rgb(30,144,255)\\\",\\r\\n                PointColor: \\\"rgb(105,105,105)\\\",\\r\\n            },\\r\\n\\r\\n        TooltipPaint :\\r\\n            {\\r\\n                BGColor:'rgba(20,20,20,0.8)',    //背景色\\r\\n                BorderColor:'rgb(210,210,210)',     //边框颜色\\r\\n                TitleColor:'rgb(210,210,210)',       //标题颜色\\r\\n                TitleFont:13*GetDevicePixelRatio() +'px 微软雅黑',   //字体\\r\\n                DateTimeColor:'rgb(210,210,210)',\\r\\n                VolColor:\\\"rgb(210,210,210)\\\",       //标题成交量\\r\\n                AmountColor:\\\"rgb(210,210,210)\\\",    //成交金额\\r\\n            },\\r\\n\\r\\n        //走势图 信息地雷\\r\\n        MinuteInfo:\\r\\n            {\\r\\n                TextColor: 'rgb(84,143,255)',\\r\\n                Font: 14*GetDevicePixelRatio() +'px 微软雅黑',\\r\\n                PointColor:'rgb(38,113,254)',\\r\\n                LineColor:'rgb(120,167,255)',\\r\\n                TextBGColor:'rgba(255,255,255,1)'\\r\\n            },\\r\\n\\r\\n        //筹码分布图\\r\\n        StockChip:\\r\\n            {\\r\\n                InfoColor:'rgb(255,255,255)', //文字颜色\\r\\n                DayInfoColor:'rgb(0,0,0)' //周期颜色内文字颜色\\r\\n            },\\r\\n\\r\\n        //深度图\\r\\n        DepthChart:\\r\\n            {\\r\\n                BidColor: { Line:\\\"rgb(82,176,123)\\\", Area:\\\"rgba(82,176,123,0.5)\\\"},  //卖\\r\\n                AskColor: { Line:\\\"rgb(207,76,89)\\\", Area:\\\"rgba(207,76,89, 0.5)\\\"},   //买\\r\\n                LineWidth:4\\r\\n            },\\r\\n\\r\\n        DepthCorss:\\r\\n            {\\r\\n                BidColor: { Line:\\\"rgb(82,176,123)\\\" },  //卖\\r\\n                AskColor: { Line:\\\"rgb(207,76,89)\\\" },   //买\\r\\n                LineWidth:2,    //线段宽度\\r\\n                LineDash:[3,3],\\r\\n                Tooltip:\\r\\n                    {\\r\\n                        BGColor:'rgba(54,54,54, 0.8)', TextColor:\\\"rgb(203,215,224)\\\",\\r\\n                        Border:{ Top:5, Left:20, Bottom:5, Center: 5},\\r\\n                        Font:14*GetDevicePixelRatio() +\\\"px 微软雅黑\\\",\\r\\n                        LineHeight:16   //单行高度\\r\\n                    }\\r\\n            },\\r\\n\\r\\n        //区间选择\\r\\n        RectSelect:\\r\\n            {\\r\\n                LineColor:\\\"rgb(115,83,64)\\\",          //竖线\\r\\n                LineWidth:1*GetDevicePixelRatio(),\\r\\n                LineDotted:[3,3],\\r\\n                AreaColor:\\\"rgba(26,13,7,0.5)\\\",     //面积\\r\\n            }\\r\\n\\r\\n    };\\r\\n\\r\\nvar STYLE_TYPE_ID=\\r\\n    {\\r\\n        BLACK_ID:1, //黑色风格\\r\\n    }\\r\\n\\r\\nfunction HQChartStyle()\\r\\n{\\r\\n\\r\\n}\\r\\n\\r\\nHQChartStyle.GetStyleConfig=function(styleid)    //获取一个风格的配置变量\\r\\n{\\r\\n    switch (styleid)\\r\\n    {\\r\\n        case STYLE_TYPE_ID.BLACK_ID:\\r\\n            return BLACK_STYLE;\\r\\n        default:\\r\\n            return null;\\r\\n    }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n/*\\r\\n    单独的网络接口\\r\\n*/\\r\\nfunction JSNetwork() { }\\r\\n\\r\\nJSNetwork.HttpRequest=function(obj) //使用uniapp 网络接口接口  !!每家平台都喜欢自定义接口, 低层不都是一样的嘛\\r\\n{\\r\\n    let method=obj.type.toUpperCase();\\r\\n    uni.request({\\r\\n        url: obj.url,\\r\\n        data: obj.data,\\r\\n        method:method,\\r\\n        success: (res)=>\\r\\n        {\\r\\n            obj.success(res.data);\\r\\n        },\\r\\n        fail: obj.error,\\r\\n    });\\r\\n}\\r\\n\\r\\n//把给外界调用的方法暴露出来\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\\r\\n\\r\\n    //类导出\\r\\n    JSChart:JSChart,                            //行情图形库\\r\\n    ChartData:ChartData,\\r\\n    MARKET_SUFFIX_NAME:MARKET_SUFFIX_NAME,      //判断股票属性\\r\\n    IFrameSplitOperator:IFrameSplitOperator,    //格式化字符串方法\\r\\n    FrameSplitKLinePriceY:FrameSplitKLinePriceY,\\r\\n    FrameSplitKLineX:FrameSplitKLineX,\\r\\n    JSKLineInfoMap:JSKLineInfoMap,\\r\\n    JSCHART_EVENT_ID:JSCHART_EVENT_ID,          //可以订阅的事件类型\\r\\n    JSCHART_OPERATOR_ID:JSCHART_OPERATOR_ID,    //图形控制类型\\r\\n    JSAlgorithm:JSAlgorithm,                    //算法类\\r\\n    JSComplier:JSComplier,                      //指标编译器\\r\\n    JSIndexScript:JSIndexScript,                //系统指标库\\r\\n    GetDevicePixelRatio,GetDevicePixelRatio,\\r\\n\\r\\n    ScriptIndexConsole:ScriptIndexConsole,      //指标执行 无UI\\r\\n    //style.js相关\\r\\n    STYLE_TYPE_ID:STYLE_TYPE_ID,\\r\\n    HQChartStyle:HQChartStyle,                  //预定义全局的配色 黑\\r\\n\\r\\n    JSConsole:JSConsole,    //日志输出\\r\\n\\r\\n    KLineTooltipPaint:KLineTooltipPaint,    //K线tooltip\\r\\n    MinuteTooltipPaint:MinuteTooltipPaint,  //走势图tooltip\\r\\n\\r\\n    CoordinateInfo:CoordinateInfo,\\r\\n});\\r\\n\\r\\n\\n\\n//# sourceURL=webpack://mUtils/./src/index.js?\");\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The require scope\n/******/ \tvar __webpack_require__ = {};\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\n/******/ \t\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \t// This entry module can't be inlined because the eval devtool is used.\n/******/ \tvar __webpack_exports__ = {};\n/******/ \t__webpack_modules__[\"./src/index.js\"](0, __webpack_exports__, __webpack_require__);\n/******/ \t\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});"]}