You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2437 lines
84 KiB

  1. /*
  2. copyright (c) 2018 jones
  3. http://www.apache.org/licenses/LICENSE-2.0
  4. 开源项目 https://github.com/jones2000/HQChart
  5. jones_2000@163.com
  6. 坐标轴相关算法
  7. */
  8. import
  9. {
  10. g_JSChartResource,
  11. JSCHART_LANGUAGE_ID,
  12. g_JSChartLocalization,
  13. } from './umychart.resource.wechat.js'
  14. import {
  15. ChartData, HistoryData,
  16. SingleData, MinuteData,
  17. JSCHART_EVENT_ID,
  18. } from "./umychart.data.wechat.js";
  19. import { JSCommonCoordinateData } from "./umychart.coordinatedata.wechat.js";
  20. var MARKET_SUFFIX_NAME = JSCommonCoordinateData.MARKET_SUFFIX_NAME;
  21. var WEEK_NAME=["日","一","二","三","四","五","六"];
  22. //坐标信息
  23. function CoordinateInfo()
  24. {
  25. this.Value; //坐标数据
  26. this.Message = new Array(); //坐标输出文字信息
  27. this.TextColor = g_JSChartResource.FrameSplitTextColor //文字颜色
  28. this.Font = g_JSChartResource.FrameSplitTextFont; //字体
  29. this.LineColor = g_JSChartResource.FrameSplitPen; //线段颜色
  30. this.LineDash=null; //当线段类型==2时 可以设置虚线样式
  31. this.LineType = 1; //线段类型 -1=不画线段, 2=虚线
  32. }
  33. /////////////////////////////////////////////////////////////////////////////////////////////////////
  34. //坐标分割
  35. //
  36. //
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////
  38. function IFrameSplitOperator()
  39. {
  40. this.ChartBorder; //边框信息
  41. this.Frame; //框架信息
  42. this.FrameSplitData; //坐标轴分割方法
  43. this.SplitCount = 5; //刻度个数
  44. this.StringFormat = 0; //刻度字符串格式 -1 刻度文字全部不显示 -2 刻度文字右边不显示
  45. this.IsShowLeftText = true; //显示左边刻度
  46. this.IsShowRightText = true; //显示右边刻度
  47. this.LanguageID = JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;
  48. this.GetEventCallback; //事件回调
  49. //////////////////////
  50. // data.Min data.Max data.Interval data.Count
  51. //
  52. this.IntegerCoordinateSplit = function (data)
  53. {
  54. var splitItem = this.FrameSplitData.Find(data.Interval);
  55. if (!splitItem) return false;
  56. if (data.Interval == splitItem.Interval) return true;
  57. var fixMax=data.Max, fixMin=data.Min;
  58. var maxValue=data.Max/splitItem.FixInterval;
  59. var minValue=data.Min/splitItem.FixInterval;
  60. //调整到整数倍数,不能整除的 +1
  61. if (IFrameSplitOperator.IsFloat(maxValue)) fixMax=parseInt((maxValue+0.5).toFixed(0))*splitItem.FixInterval;
  62. if (IFrameSplitOperator.IsFloat(minValue)) fixMin=parseInt((minValue-0.5).toFixed(0))*splitItem.FixInterval;
  63. if (data.Min == 0) fixMin = 0; //最小值是0 不用调整了.
  64. if (fixMin < 0 && data.Min > 0) fixMin = 0; //都是正数的, 最小值最小调整为0
  65. var count = 0;
  66. for (var i = fixMin; (i - fixMax) < 0.00000001; i += splitItem.FixInterval)
  67. {
  68. ++count;
  69. }
  70. data.Interval = splitItem.FixInterval;
  71. data.Max = fixMax;
  72. data.Min = fixMin;
  73. data.Count = count;
  74. return true;
  75. }
  76. this.Filter=function (aryInfo, keepZero, filterType) //keepZero 保留0轴
  77. {
  78. if (this.SplitCount <= 0 || aryInfo.length <= 0 || aryInfo.length <= this.SplitCount) return aryInfo;
  79. //分割线比预设的多, 过掉一些
  80. var filter = parseInt(aryInfo.length / this.SplitCount);
  81. if (filter <= 1) filter = 2;
  82. var data = [];
  83. if (filterType==1)
  84. {
  85. for (var i = 0; i < aryInfo.length; i += filter)
  86. {
  87. data.push(aryInfo[i]);
  88. }
  89. }
  90. else
  91. {
  92. for (var i = 0; i < aryInfo.length; i += filter)
  93. {
  94. if (i + filter >= aryInfo.length && i != aryInfo.length - 1) //最后一个数据放进去
  95. {
  96. data.push(aryInfo[aryInfo.length - 1]);
  97. }
  98. else {
  99. data.push(aryInfo[i]);
  100. }
  101. }
  102. }
  103. if (this.SplitCount == 2 && data.length > 2) //之显示第1个和最后一个刻度
  104. {
  105. for (var i = 1; i < data.length - 1; ++i)
  106. {
  107. var item = data[i];
  108. item.Message[0] = null;
  109. item.Message[1] = null;
  110. }
  111. }
  112. if (keepZero) //如果不存在0轴,增加一个0轴,刻度信息部显示
  113. {
  114. var bExsitZero = false;
  115. for (var i = 0; i < data.length; ++i)
  116. {
  117. var item = data[i];
  118. if (Math.abs(item.Value) < 0.00000001)
  119. {
  120. bExsitZero = true;
  121. break;
  122. }
  123. }
  124. if (bExsitZero == false)
  125. {
  126. var zeroCoordinate = new CoordinateInfo();
  127. zeroCoordinate.Value = 0;
  128. zeroCoordinate.Message[0] = null
  129. zeroCoordinate.Message[1] = null;
  130. data.push(zeroCoordinate);
  131. }
  132. }
  133. return data;
  134. }
  135. this.RemoveZero = function (aryInfo) //移除小数后面多余的0
  136. {
  137. //所有的数字小数点后面都0,才会去掉
  138. var isAllZero = [true, true];
  139. for (var i in aryInfo) {
  140. var item = aryInfo[i];
  141. var message = item.Message[0];
  142. if (!this.IsDecimalZeroEnd(message)) isAllZero[0] = false;
  143. var message = item.Message[1];
  144. if (!this.IsDecimalZeroEnd(message)) isAllZero[1] = false;
  145. }
  146. if (isAllZero[0] == false && isAllZero[1] == false) return;
  147. for (var i in aryInfo)
  148. {
  149. var item = aryInfo[i];
  150. if (isAllZero[0])
  151. {
  152. var message = item.Message[0];
  153. if (message != null)
  154. {
  155. if (typeof (message) == 'number') message = message.toString();
  156. item.Message[0] = message.replace(/[.][0]+/g, '');
  157. }
  158. }
  159. if (isAllZero[1])
  160. {
  161. var message = item.Message[1];
  162. if (message != null)
  163. {
  164. if (typeof (message) == 'number') message = message.toString();
  165. item.Message[1] = message.replace(/[.][0]+/g, '');
  166. }
  167. }
  168. }
  169. }
  170. this.IsDecimalZeroEnd = function (text) //是否是0结尾的小数
  171. {
  172. if (text == null) return true;
  173. if (text == '0') return true;
  174. if (typeof (text) == 'number') text = text.toString();
  175. var pos = text.search(/[.]/);
  176. if (pos < 0) return false;
  177. for (var i = pos + 1; i < text.length; ++i)
  178. {
  179. var char = text.charAt(i);
  180. if (char >= '1' && char <= '9') return false;
  181. }
  182. return true;
  183. }
  184. this.Reset=function() //重置
  185. {
  186. }
  187. this.SetOption=function(option)
  188. {
  189. }
  190. //计算上下预留
  191. this.ReservedHeight=function(splitData)
  192. {
  193. if (!this.Frame) return;
  194. if (this.Frame.IsHScreen) return; //横屏以后再搞
  195. var yReserved=this.Frame.HorizontalReserved;
  196. if (!yReserved) return;
  197. var reservedHeight=0;
  198. if (IFrameSplitOperator.IsPlusNumber(yReserved.Top)) reservedHeight+=yReserved.Top;
  199. if (IFrameSplitOperator.IsPlusNumber(yReserved.Bottom)) reservedHeight+=yReserved.Bottom;
  200. if (reservedHeight<=0) return;
  201. var border=this.Frame.GetBorder();
  202. var top=border.TopEx;
  203. var bottom=border.BottomEx;
  204. var srcHeight=bottom-top;
  205. if (srcHeight<reservedHeight) return;
  206. var max=splitData.Max;
  207. var min=splitData.Min;
  208. if (IFrameSplitOperator.IsPlusNumber(yReserved.Top)) top-=yReserved.Top;
  209. if (IFrameSplitOperator.IsPlusNumber(yReserved.Bottom)) bottom+=yReserved.Bottom;
  210. var value=(max-min)/(bottom-top); //1个像素点对应的数值
  211. if (IFrameSplitOperator.IsPlusNumber(yReserved.Top))
  212. {
  213. var topValue=value*yReserved.Top;
  214. max+=topValue;
  215. }
  216. if (IFrameSplitOperator.IsPlusNumber(yReserved.Bottom))
  217. {
  218. var bottomValue=value*yReserved.Bottom;
  219. min-=bottomValue;
  220. }
  221. splitData.Max=max;
  222. splitData.Min=min;
  223. this.Frame.HorizontalMax=splitData.Max;
  224. this.Frame.HorizontalMin=splitData.Min;
  225. }
  226. this.SendSplitXCoordinateEvent=function()
  227. {
  228. if (!this.GetEventCallback) return;
  229. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_XCOORDINATE);
  230. if (!event || !event.Callback) return;
  231. var data={ ID:this.Frame.Identify, Frame:this.Frame };
  232. event.Callback(event,data,this);
  233. }
  234. }
  235. //字符串格式化 千分位分割
  236. IFrameSplitOperator.FormatValueThousandsString=function(value,floatPrecision)
  237. {
  238. if (value==null || isNaN(value))
  239. {
  240. if (floatPrecision>0)
  241. {
  242. var nullText='-.';
  243. for(var i=0;i<floatPrecision;++i)
  244. nullText+='-';
  245. return nullText;
  246. }
  247. return '--';
  248. }
  249. var result='';
  250. var num=value.toFixed(floatPrecision);
  251. if(floatPrecision>0){
  252. var numFloat = num.split('.')[1];
  253. var numM = num.split('.')[0];
  254. while (numM.length > 3)
  255. {
  256. result = ',' + numM.slice(-3) + result;
  257. numM = numM.slice(0, numM.length - 3);
  258. }
  259. if (numM) { result = numM + result + '.' + numFloat; }
  260. }else{
  261. while (num.length > 3)
  262. {
  263. result = ',' + num.slice(-3) + result;
  264. num = num.slice(0, num.length - 3);
  265. }
  266. if (num) { result = num + result; }
  267. }
  268. return result;
  269. }
  270. //数据输出格式化 floatPrecision=小数位数
  271. IFrameSplitOperator.FormatValueString=function(value, floatPrecision,languageID)
  272. {
  273. if (value==null || isNaN(value))
  274. {
  275. if (floatPrecision>0)
  276. {
  277. var nullText='-.';
  278. for(var i=0;i<floatPrecision;++i)
  279. nullText+='-';
  280. return nullText;
  281. }
  282. return '--';
  283. }
  284. if (value<0.00000000001 && value>-0.00000000001)
  285. {
  286. return "0";
  287. }
  288. var absValue = Math.abs(value);
  289. if (languageID===JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID)
  290. {
  291. if (absValue < 10000)
  292. return value.toFixed(floatPrecision);
  293. else if (absValue < 1000000)
  294. return (value/1000).toFixed(floatPrecision)+"K";
  295. else if (absValue < 1000000000)
  296. return (value/1000000).toFixed(floatPrecision)+"M";
  297. else if (absValue < 1000000000000)
  298. return (value/1000000000).toFixed(floatPrecision)+"B";
  299. else
  300. return (value/1000000000000).toFixed(floatPrecision)+"T";
  301. }
  302. else if (languageID===JSCHART_LANGUAGE_ID.LANGUAGE_TRADITIONAL_CHINESE_ID) //繁体
  303. {
  304. if (absValue < 10000)
  305. return value.toFixed(floatPrecision);
  306. else if (absValue < 100000000)
  307. return (value/10000).toFixed(floatPrecision)+"萬";
  308. else if (absValue < 1000000000000)
  309. return (value/100000000).toFixed(floatPrecision)+"億";
  310. else
  311. return (value/1000000000000).toFixed(floatPrecision)+"萬億";
  312. }
  313. else
  314. {
  315. if (absValue < 10000)
  316. return value.toFixed(floatPrecision);
  317. else if (absValue < 100000000)
  318. return (value/10000).toFixed(floatPrecision)+"万";
  319. else if (absValue < 1000000000000)
  320. return (value/100000000).toFixed(floatPrecision)+"亿";
  321. else
  322. return (value/1000000000000).toFixed(floatPrecision)+"万亿";
  323. }
  324. return '';
  325. }
  326. //整形输出格式化 floatPrecision=小数位数
  327. IFrameSplitOperator.FromatIntegerString=function(value, floatPrecision,languageID)
  328. {
  329. if (value<10000 && IFrameSplitOperator.IsInteger(value)) floatPrecision=0; //<10000的整形 去掉小数位数
  330. return IFrameSplitOperator.FormatValueString(value, floatPrecision,languageID);
  331. }
  332. IFrameSplitOperator.NumberToString=function(value)
  333. {
  334. if (value<10) return '0'+value.toString();
  335. return value.toString();
  336. }
  337. IFrameSplitOperator.FormatDateString=function(value,format,languageID)
  338. {
  339. var year=parseInt(value/10000);
  340. var month=parseInt(value/100)%100;
  341. var day=value%100;
  342. switch(format)
  343. {
  344. case 'MM-DD':
  345. return IFrameSplitOperator.NumberToString(month) + '-' + IFrameSplitOperator.NumberToString(day);
  346. case "YYYY-MM":
  347. return `${year}-${IFrameSplitOperator.NumberToString(month)}`;
  348. case "YYYY/MM/DD":
  349. return year.toString() + '/' + IFrameSplitOperator.NumberToString(month) + '/' + IFrameSplitOperator.NumberToString(day);
  350. case "YYYY/MM/DD/W":
  351. {
  352. var date=new Date(year,month-1,day);
  353. var week=g_JSChartLocalization.GetText(WEEK_NAME[date.getDay()],languageID);
  354. return year.toString() + '/' + IFrameSplitOperator.NumberToString(month) + '/' + IFrameSplitOperator.NumberToString(day)+"/"+ week.toString();
  355. }
  356. case "DD/MM/YYYY":
  357. return IFrameSplitOperator.NumberToString(day) + '/' + IFrameSplitOperator.NumberToString(month) + '/' + year.toString();
  358. default:
  359. return year.toString() + '-' + IFrameSplitOperator.NumberToString(month) + '-' + IFrameSplitOperator.NumberToString(day);
  360. }
  361. }
  362. IFrameSplitOperator.FormatTimeString=function(value, format) //format hh:mm:ss
  363. {
  364. if (format=='HH:MM:SS')
  365. {
  366. var hour=parseInt(value/10000);
  367. var minute=parseInt((value%10000)/100);
  368. var second=value%100;
  369. return IFrameSplitOperator.NumberToString(hour)+':'+ IFrameSplitOperator.NumberToString(minute) + ':' + IFrameSplitOperator.NumberToString(second);
  370. }
  371. else if (format == 'HH:MM')
  372. {
  373. var hour = parseInt(value / 100);
  374. var minute = value % 100;
  375. return IFrameSplitOperator.NumberToString(hour) + ':' + IFrameSplitOperator.NumberToString(minute);
  376. }
  377. else
  378. {
  379. if (value < 10000)
  380. {
  381. var hour = parseInt(value / 100);
  382. var minute = value % 100;
  383. return IFrameSplitOperator.NumberToString(hour) + ':' + IFrameSplitOperator.NumberToString(minute);
  384. }
  385. else
  386. {
  387. var hour = parseInt(value / 10000);
  388. var minute = parseInt((value % 10000) / 100);
  389. var second = value % 100;
  390. return IFrameSplitOperator.NumberToString(hour) + ':' + IFrameSplitOperator.NumberToString(minute) + ':' + IFrameSplitOperator.NumberToString(second);
  391. }
  392. }
  393. }
  394. //报告格式化
  395. IFrameSplitOperator.FormatReportDateString=function(value)
  396. {
  397. var year=parseInt(value/10000);
  398. var month=parseInt(value/100)%100;
  399. var monthText;
  400. switch(month)
  401. {
  402. case 3:
  403. monthText="一季度报";
  404. break;
  405. case 6:
  406. monthText="半年报";
  407. break;
  408. case 9:
  409. monthText="三季度报";
  410. break;
  411. case 12:
  412. monthText="年报";
  413. break;
  414. }
  415. return year.toString()+ monthText;
  416. }
  417. IFrameSplitOperator.FormatDateTimeString=function(value,isShowDate)
  418. {
  419. var aryValue=value.split(' ');
  420. if (aryValue.length<2) return "";
  421. var time=parseInt(aryValue[1]);
  422. var minute=time%100;
  423. var hour=parseInt(time/100);
  424. var text=(hour<10? ('0'+hour.toString()):hour.toString()) + ':' + (minute<10?('0'+minute.toString()):minute.toString());
  425. if (isShowDate==true)
  426. {
  427. var date=parseInt(aryValue[0]);
  428. var year=parseInt(date/10000);
  429. var month=parseInt(date%10000/100);
  430. var day=date%100;
  431. text=year.toString() +'-'+ (month<10? ('0'+month.toString()) :month.toString()) +'-'+ (day<10? ('0'+day.toString()):day.toString()) +" " +text;
  432. }
  433. return text;
  434. }
  435. //字段颜色格式化
  436. IFrameSplitOperator.FormatValueColor = function (value, value2)
  437. {
  438. if (value != null && value2 == null) //只传一个值的 就判断value正负
  439. {
  440. if (value == 0) return 'PriceNull';
  441. else if (value > 0) return 'PriceUp';
  442. else return 'PriceDown';
  443. }
  444. //2个数值对比 返回颜色
  445. if (value == null || value2 == null) return 'PriceNull';
  446. if (value == value2) return 'PriceNull';
  447. else if (value > value2) return 'PriceUp';
  448. else return 'PriceDown';
  449. }
  450. //成交量显示
  451. IFrameSplitOperator.FormatVolString=function(value,languageID)
  452. {
  453. var absValue = Math.abs(value);
  454. if (absValue<100000)
  455. return value.toFixed(0);
  456. else if (absValue<10000000)
  457. return (value/10000).toFixed(1)+"万";
  458. else if (absValue<100000000)
  459. return (value/10000).toFixed(0)+"万";
  460. else if (absValue<1000000000)
  461. return (value/100000000).toFixed(2)+"亿";
  462. else if (absValue < 1000000000000)
  463. return (value/100000000).toFixed(1)+"亿";
  464. else
  465. return (value/1000000000000).toFixed(1)+"万亿";
  466. }
  467. IFrameSplitOperator.IsNumber=function(value)
  468. {
  469. if (value==null) return false;
  470. if (isNaN(value)) return false;
  471. return typeof(value)=='number';
  472. }
  473. //判断是否是正数
  474. IFrameSplitOperator.IsPlusNumber=function(value)
  475. {
  476. if (value==null) return false;
  477. if (isNaN(value)) return false;
  478. return value>0;
  479. }
  480. //是否是整形
  481. IFrameSplitOperator.IsInteger=function(x)
  482. {
  483. return (typeof x === 'number') && (x % 1 === 0);
  484. }
  485. //是否有效
  486. IFrameSplitOperator.IsVaild=function(value)
  487. {
  488. if (isNaN(value)) return false;
  489. if (value==null) return false;
  490. if (value===undefined) return false;
  491. return true;
  492. }
  493. //判断字段是否存在
  494. IFrameSplitOperator.IsObjectExist=function(obj)
  495. {
  496. if (obj===undefined) return false;
  497. if (obj==null) return false;
  498. return true;
  499. }
  500. //是否时bool
  501. IFrameSplitOperator.IsBool=function(value)
  502. {
  503. if (value===true || value===false) return true;
  504. return false;
  505. }
  506. IFrameSplitOperator.IsString=function(value)
  507. {
  508. var type=typeof(value);
  509. if (type=='string') return true;
  510. return false;
  511. }
  512. IFrameSplitOperator.IsFloat=function(value)
  513. {
  514. if (value===undefined) return false;
  515. if (value==null) return false;
  516. if (isNaN(value)) return false;
  517. return value!=parseInt(value);
  518. }
  519. //是否是非空的数组
  520. IFrameSplitOperator.IsNonEmptyArray=function(ary)
  521. {
  522. if (!ary) return;
  523. if (!Array.isArray(ary)) return;
  524. return ary.length>0;
  525. }
  526. IFrameSplitOperator.IsUndefined=function(value)
  527. {
  528. return value===undefined;
  529. }
  530. //K线Y轴分割
  531. function FrameSplitKLinePriceY()
  532. {
  533. this.newMethod = IFrameSplitOperator; //派生
  534. this.newMethod();
  535. delete this.newMethod;
  536. this.CoordinateType = 0; //坐标类型 0=普通坐标 1=百分比坐标 (右边坐标刻度)
  537. this.Symbol;
  538. this.Data; //K线数据 (计算百分比坐标)
  539. this.FrameSplitData2; //坐标轴分割方法(计算百分比刻度)
  540. this.FloatPrecision = null; //小数位数 (设置了就使用这个位数,否则使用品种对应的小数位数)
  541. this.Custom = []; //[{Type:0}]; 定制刻度 0=显示最后的价格刻度
  542. this.SplitType = 0; //0=自动分割 1=固定分割
  543. this.DefaultSplitType=0;
  544. this.Operator = function ()
  545. {
  546. var splitData = {};
  547. splitData.Max = this.Frame.HorizontalMax;
  548. splitData.Min = this.Frame.HorizontalMin;
  549. splitData.Count = this.SplitCount;
  550. if (this.Frame.YMaxMin) //原始的数据范围
  551. {
  552. var item=this.Frame.YMaxMin;
  553. if (IFrameSplitOperator.IsNumber(item.Max) && IFrameSplitOperator.IsNumber(item.Min))
  554. {
  555. splitData.Max=item.Max;
  556. splitData.Min=item.Min;
  557. }
  558. }
  559. if (splitData.Max==splitData.Min) //如果一样上下扩大下
  560. {
  561. splitData.Max+=splitData.Max*0.01;
  562. splitData.Min-=splitData.Min*0.01
  563. }
  564. splitData.Interval = (splitData.Max - splitData.Min) / (splitData.Count - 1);
  565. var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  566. if (JSCommonCoordinateData.MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol)) defaultfloatPrecision = 0; //手机端指数不显示小数位数
  567. if (this.FloatPrecision != null) defaultfloatPrecision = this.FloatPrecision;
  568. var bFilter=true;
  569. if (FrameSplitKLinePriceY.SplitCustom)
  570. {
  571. FrameSplitKLinePriceY.SplitCustom(this,splitData,defaultfloatPrecision); //自定义分割
  572. bFilter=false;
  573. }
  574. else
  575. {
  576. switch (this.CoordinateType)
  577. {
  578. case 1:
  579. this.SplitPercentage(splitData, defaultfloatPrecision);
  580. break;
  581. default:
  582. if (this.SplitType == 1) this.SplitFixed(splitData, defaultfloatPrecision);
  583. else this.SplitDefault(splitData, defaultfloatPrecision);
  584. this.CustomCoordinate(defaultfloatPrecision);
  585. break;
  586. }
  587. }
  588. if (bFilter) this.Frame.HorizontalInfo = this.Filter(this.Frame.HorizontalInfo, false);
  589. this.Frame.HorizontalMax = splitData.Max;
  590. this.Frame.HorizontalMin = splitData.Min;
  591. if (this.GetEventCallback)
  592. {
  593. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_YCOORDINATE);
  594. if (event && event.Callback)
  595. {
  596. var data={ID:this.Frame.Identify, Frame:this.Frame };
  597. event.Callback(event,data,this);
  598. }
  599. }
  600. }
  601. this.SplitDefault = function (splitData, floatPrecision) //默认坐标
  602. {
  603. this.IntegerCoordinateSplit(splitData);
  604. this.Frame.HorizontalInfo = [];
  605. for (var i = 0, value = splitData.Min; i < splitData.Count; ++i, value += splitData.Interval)
  606. {
  607. this.Frame.HorizontalInfo[i] = new CoordinateInfo();
  608. this.Frame.HorizontalInfo[i].Value = value;
  609. if (this.IsShowLeftText) this.Frame.HorizontalInfo[i].Message[0] = value.toFixed(floatPrecision);
  610. if (this.IsShowRightText) this.Frame.HorizontalInfo[i].Message[1] = value.toFixed(floatPrecision);
  611. }
  612. }
  613. this.SplitPercentage = function (splitData, floatPrecision) //百分比坐标
  614. {
  615. var firstOpenPrice = this.GetFirstOpenPrice();
  616. splitData.Max = (splitData.Max - firstOpenPrice) / firstOpenPrice;
  617. splitData.Min = (splitData.Min - firstOpenPrice) / firstOpenPrice;
  618. splitData.Interval = (splitData.Max - splitData.Min) / (splitData.Count - 1);
  619. this.IntegerCoordinateSplit2(splitData);
  620. var maxValue=(1 + splitData.Max) * firstOpenPrice;
  621. var minValue=(1 + splitData.Min) * firstOpenPrice;
  622. this.Frame.HorizontalInfo = [];
  623. for (var i = 0, value = splitData.Min; i < splitData.Count; ++i, value += splitData.Interval)
  624. {
  625. var price = (value + 1) * firstOpenPrice;
  626. if (price<minValue || price>maxValue) continue;
  627. this.Frame.HorizontalInfo[i] = new CoordinateInfo();
  628. this.Frame.HorizontalInfo[i].Value = price;
  629. if (this.IsShowLeftText) this.Frame.HorizontalInfo[i].Message[0] = price.toFixed(floatPrecision); //左边价格坐标
  630. if (this.IsShowRightText) this.Frame.HorizontalInfo[i].Message[1] = (value * 100).toFixed(2) + '%'; //右边百分比
  631. }
  632. splitData.Min = (1 + splitData.Min) * firstOpenPrice; //最大最小值调整
  633. splitData.Max = (1 + splitData.Max) * firstOpenPrice;
  634. }
  635. this.SplitFixed = function (splitData, floatPrecision) //固定分割坐标
  636. {
  637. this.Frame.HorizontalInfo = [];
  638. for (var i = 0, value = splitData.Min; i < splitData.Count; ++i, value += splitData.Interval) {
  639. this.Frame.HorizontalInfo[i] = new CoordinateInfo();
  640. this.Frame.HorizontalInfo[i].Value = value;
  641. if (this.IsShowLeftText) this.Frame.HorizontalInfo[i].Message[0] = value.toFixed(floatPrecision);
  642. if (this.IsShowRightText) this.Frame.HorizontalInfo[i].Message[1] = value.toFixed(floatPrecision);
  643. }
  644. }
  645. this.CustomCoordinate = function (floatPrecision)
  646. {
  647. if (!IFrameSplitOperator.IsNumber(floatPrecision))
  648. {
  649. floatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  650. if (JSCommonCoordinateData.MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol)) floatPrecision = 0; //手机端指数不显示小数位数
  651. if (this.FloatPrecision != null) floatPrecision = this.FloatPrecision;
  652. }
  653. this.Frame.CustomHorizontalInfo = [];
  654. for (var i=0;i<this.Custom.length; ++i)
  655. {
  656. var item = this.Custom[i];
  657. if (item.Type == 0 || item.Type==3 || item.Type==2 ) //最新价格刻度
  658. {
  659. var dec=floatPrecision;
  660. //外部设置小数位数
  661. if (IFrameSplitOperator.IsNumber(item.FloatPrecision) && item.FloatPrecision>=0) dec=item.FloatPrecision;
  662. var latestItem = this.GetLatestPrice(dec, item);
  663. if (latestItem) this.Frame.CustomHorizontalInfo.push(latestItem);
  664. }
  665. else if (item.Type == 1) //固定价格刻度
  666. {
  667. this.CustomFixedCoordinate(item);
  668. }
  669. }
  670. }
  671. this.GetLatestPrice = function (floatPrecision, option)
  672. {
  673. if (!this.Data || !this.Data.Data) return null;
  674. if (this.Data.Data.length <= 0) return null;
  675. var latestItem = this.Data.Data[this.Data.Data.length - 1];
  676. var info = new CoordinateInfo();
  677. info.Type = 0;
  678. if (option && IFrameSplitOperator.IsNumber(option.Type)) info.Type=option.Type;
  679. info.Value = latestItem.Close;
  680. info.TextColor = g_JSChartResource.FrameLatestPrice.TextColor;
  681. info.LineType = 2; //虚线
  682. if (option.Position == 'left') info.Message[0] = latestItem.Close.toFixed(floatPrecision);
  683. else info.Message[1] = latestItem.Close.toFixed(floatPrecision);
  684. if (latestItem.Close > latestItem.Open) info.LineColor = g_JSChartResource.FrameLatestPrice.UpBarColor;
  685. else if (latestItem.Close < latestItem.Open) info.LineColor = g_JSChartResource.FrameLatestPrice.DownBarColor;
  686. else info.LineColor = g_JSChartResource.FrameLatestPrice.UnchagneBarColor;
  687. if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;
  688. if (option.IsShowLine == false) info.LineType = -1;
  689. if (option.CountDown===true) info.CountDown=true; //倒计时设置
  690. if (option.PositionEx===1) info.ExtendData={ Custom:{ Position:1 } }; //强制画在内部
  691. return info;
  692. }
  693. this.GetFirstOpenPrice = function () //获取显示第1个数据的开盘价
  694. {
  695. if (!this.Data) return null;
  696. var xPointCount = this.Frame.XPointCount;
  697. for (var i = this.Data.DataOffset, j = 0; i < this.Data.Data.length && j < xPointCount; ++i, ++j)
  698. {
  699. var data = this.Data.Data[i];
  700. if (data.Open == null || data.High == null || data.Low == null || data.Close == null) continue;
  701. return data.Open;
  702. }
  703. return null;
  704. }
  705. this.CustomFixedCoordinate = function (option) //固定坐标刻度
  706. {
  707. var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  708. for (var i=0; i<option.Data.length; ++i)
  709. {
  710. var item = option.Data[i];
  711. var info = new CoordinateInfo();
  712. info.Type = 1;
  713. info.TextColor = item.TextColor;
  714. info.LineColor = item.Color;
  715. info.LineType = 2; //虚线
  716. if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;
  717. if (option.IsShowLine == false) info.LineType = -1;
  718. info.Value = item.Value;
  719. var text;
  720. if (item.Text) text = item.Text;
  721. else text = info.Value.toFixed(defaultfloatPrecision);
  722. if (option.Position == 'left') info.Message[0] = text;
  723. else info.Message[1] = text;
  724. if (option.PositionEx===1) info.ExtendData={ Custom:{ Position:1 } }; //强制画在内部
  725. this.Frame.CustomHorizontalInfo.push(info);
  726. }
  727. }
  728. //////////////////////
  729. // data.Min data.Max data.Interval data.Count
  730. //
  731. this.IntegerCoordinateSplit2 = function (data)
  732. {
  733. var splitItem = this.FrameSplitData2.Find(data.Interval);
  734. if (!splitItem) return false;
  735. if (data.Interval == splitItem.FixInterval) return true;
  736. var fixMax=data.Max, fixMin=data.Min;
  737. var maxValue=data.Max/splitItem.FixInterval;
  738. var minValue=data.Min/splitItem.FixInterval;
  739. //调整到整数倍数,不能整除的 +1
  740. if (IFrameSplitOperator.IsFloat(maxValue)) fixMax=parseInt((maxValue+0.5).toFixed(0))*splitItem.FixInterval;
  741. if (IFrameSplitOperator.IsFloat(minValue)) fixMin=parseInt((minValue-0.5).toFixed(0))*splitItem.FixInterval;
  742. if (data.Min == 0) fixMin = 0; //最小值是0 不用调整了.
  743. if (fixMin < 0 && data.Min > 0) fixMin = 0; //都是正数的, 最小值最小调整为0
  744. var count = 0;
  745. for (var i = fixMin; (i - fixMax) < 0.00000001; i += splitItem.FixInterval)
  746. {
  747. ++count;
  748. }
  749. data.Interval = splitItem.FixInterval;
  750. data.Max = fixMax;
  751. data.Min = fixMin;
  752. data.Count = count;
  753. return true;
  754. }
  755. }
  756. //一般的Y轴分割
  757. function FrameSplitY()
  758. {
  759. this.newMethod = IFrameSplitOperator; //派生
  760. this.newMethod();
  761. delete this.newMethod;
  762. this.SplitType=0; //0=自动分割 1=固定分割 2=百分比(0-100)
  763. this.FilterType=0; //自动分割过滤算法
  764. this.DefaultSplitType=0;
  765. this.FloatPrecision = 2; //坐标小数位数(默认2)
  766. this.EnableRemoveZero=g_JSChartResource.Frame.EnableRemoveZero;
  767. this.FLOATPRECISION_RANGE = [1, 0.1, 0.01, 0.001, 0.0001];
  768. this.IgnoreYValue = null; //在这个数组里的数字不显示在刻度上
  769. this.LineType=null; //线段样式
  770. this.IsShowYZero = true;
  771. this.IntegerSplitData = null;
  772. this.Reset=function() //重置
  773. {
  774. this.EnableRemoveZero=g_JSChartResource.Frame.EnableRemoveZero;
  775. this.StringFormat=g_JSChartResource.Frame.StringFormat;
  776. }
  777. this.SetOption=function(option)
  778. {
  779. if (!option) return;
  780. if (IFrameSplitOperator.IsNumber(option.FloatPrecision)) this.FloatPrecision=option.FloatPrecision;
  781. if (IFrameSplitOperator.IsNumber(option.StringFormat)) this.StringFormat=option.StringFormat;
  782. if (IFrameSplitOperator.IsBool(option.EnableRemoveZero)) this.EnableRemoveZero=option.EnableRemoveZero;
  783. }
  784. this.Operator = function ()
  785. {
  786. var splitData = {};
  787. splitData.Max = this.Frame.HorizontalMax;
  788. splitData.Min = this.Frame.HorizontalMin;
  789. if (this.Frame.YMaxMin) //原始的数据范围
  790. {
  791. var item=this.Frame.YMaxMin;
  792. if (IFrameSplitOperator.IsNumber(item.Max) && IFrameSplitOperator.IsNumber(item.Min))
  793. {
  794. splitData.Max=item.Max;
  795. splitData.Min=item.Min;
  796. }
  797. }
  798. if (splitData.Max==splitData.Min) //如果一样上下扩大下
  799. {
  800. if (splitData.Max==0)
  801. {
  802. splitData.Max=1;
  803. splitData.Min=-1;
  804. }
  805. else
  806. {
  807. splitData.Max+=splitData.Max*0.01;
  808. splitData.Min-=splitData.Min*0.01;
  809. }
  810. }
  811. if (this.Frame.YSpecificMaxMin)
  812. {
  813. splitData.Count = this.Frame.YSpecificMaxMin.Count;
  814. splitData.Interval = (splitData.Max - splitData.Min) / (splitData.Count - 1);
  815. }
  816. else if (this.SplitType==1)
  817. {
  818. splitData.Count=this.SplitCount;
  819. splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);
  820. }
  821. else if (this.SplitType==2)
  822. {
  823. splitData.Max=100;
  824. splitData.Min=0;
  825. splitData.Count=this.SplitCount;
  826. splitData.Interval=(splitData.Max-splitData.Min)/(splitData.Count-1);
  827. }
  828. else
  829. {
  830. splitData.Count = this.SplitCount * 2; //放大两倍
  831. if (this.FloatPrecision == 0) //页面配置了纵坐标小数位数FloatPrecision=0时执行
  832. {
  833. splitData.Interval = (splitData.Max - splitData.Min) / (splitData.Count - 1);
  834. this.IntegerCoordinateSplit2(splitData);
  835. }
  836. else {
  837. splitData.Interval = (splitData.Max - splitData.Min) / (splitData.Count - 1);
  838. this.IntegerCoordinateSplit(splitData);
  839. }
  840. }
  841. this.Frame.HorizontalInfo = [];
  842. if (this.Frame.YSplitScale)
  843. {
  844. for (var i in this.Frame.YSplitScale)
  845. {
  846. var value = this.Frame.YSplitScale[i];
  847. var coordinate = new CoordinateInfo();
  848. coordinate.Value = value;
  849. if (IFrameSplitOperator.IsNumber(this.LineType)) coordinate.LineType=this.LineType;
  850. var absValue = Math.abs(value);
  851. var floatPrecision = this.FloatPrecision; //数据比小数位数还小, 调整小数位数
  852. if (absValue < 0.0000000001)
  853. coordinate.Message[1] = 0;
  854. else if (absValue < this.FLOATPRECISION_RANGE[this.FLOATPRECISION_RANGE.length - 1])
  855. coordinate.Message[1] = value.toExponential(2).toString();
  856. else
  857. {
  858. if (floatPrecision < this.FLOATPRECISION_RANGE.length && absValue < this.FLOATPRECISION_RANGE[floatPrecision])++floatPrecision;
  859. if (floatPrecision < this.FLOATPRECISION_RANGE.length && absValue < this.FLOATPRECISION_RANGE[floatPrecision])++floatPrecision;
  860. if (floatPrecision < this.FLOATPRECISION_RANGE.length && absValue < this.FLOATPRECISION_RANGE[floatPrecision])++floatPrecision;
  861. coordinate.Message[1] = IFrameSplitOperator.FormatValueString(value, floatPrecision, this.LanguageID);
  862. }
  863. coordinate.Message[0] = coordinate.Message[1];
  864. if (this.StringFormat == -2) coordinate.Message[1] = null; //刻度右边不显示
  865. else if (this.StringFormat == -3) coordinate.Message[0] = null; //刻度左边不显示
  866. else if (this.StringFormat == -1) coordinate.Message[0] = coordinate.Message[1] = null; //刻度左右都不显示
  867. this.Frame.HorizontalInfo.push(coordinate);
  868. }
  869. }
  870. else
  871. {
  872. for (var i = 0, value = splitData.Min; i < splitData.Count; ++i, value += splitData.Interval)
  873. {
  874. var coordinate=new CoordinateInfo();
  875. this.Frame.HorizontalInfo[i] = coordinate;
  876. coordinate.Value=value;
  877. if (IFrameSplitOperator.IsNumber(this.LineType)) coordinate.LineType=this.LineType;
  878. var text=this.FormatValueString(value);
  879. this.Frame.HorizontalInfo[i].Message[0] = this.Frame.HorizontalInfo[i].Message[1]=text;
  880. if (this.IsShowLeftText==false) this.Frame.HorizontalInfo[i].Message[0]=null;
  881. if (this.IsShowRightText==false) this.Frame.HorizontalInfo[i].Message[1]=null;
  882. }
  883. }
  884. this.FilterIgnoreYValue();
  885. this.Frame.HorizontalInfo = this.Filter(this.Frame.HorizontalInfo, (splitData.Max > 0 && splitData.Min < 0 && this.IsShowYZero), this.FilterType);
  886. this.MainOverlayFrameSplitY(); //主图Y轴绑定叠加Y轴坐标
  887. if (this.EnableRemoveZero) this.RemoveZero(this.Frame.HorizontalInfo);
  888. this.DynamicMessageText();
  889. this.ReservedHeight(splitData);
  890. this.Frame.HorizontalMax = splitData.Max;
  891. this.Frame.HorizontalMin = splitData.Min;
  892. if (this.GetEventCallback)
  893. {
  894. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_YCOORDINATE);
  895. if (event && event.Callback)
  896. {
  897. var data={ID:this.Frame.Identify, Frame:this.Frame };
  898. event.Callback(event,data,this);
  899. }
  900. }
  901. }
  902. this.FormatValueString=function(value)
  903. {
  904. var text;
  905. if (this.StringFormat==1) //手机端格式 如果有万,亿单位了 去掉小数
  906. {
  907. var floatPrecision=this.FloatPrecision;
  908. if (IFrameSplitOperator.IsNumber(value) && Math.abs(value) > 1000) floatPrecision=0;
  909. text=IFrameSplitOperator.FormatValueString(value,floatPrecision,this.LanguageID);
  910. }
  911. else if (this.StringFormat==2) //原始数据输出
  912. {
  913. text=`${value.toFixed(this.FloatPrecision)}`;
  914. }
  915. else if (this.StringFormat == -1) //刻度不显示
  916. {
  917. }
  918. else
  919. {
  920. var absValue=Math.abs(value);
  921. if (absValue<0.0000000001)
  922. {
  923. text=0;
  924. }
  925. else if (absValue<this.FLOATPRECISION_RANGE[this.FLOATPRECISION_RANGE.length-1])
  926. {
  927. text = value.toExponential(2).toString();
  928. }
  929. else
  930. {
  931. var floatPrecision=this.GetFloatPrecision(absValue,this.FloatPrecision); //数据比小数位数还小, 调整小数位数
  932. text = IFrameSplitOperator.FormatValueString(value, floatPrecision,this.LanguageID);
  933. }
  934. }
  935. return text;
  936. }
  937. this.GetFloatPrecision=function(value,floatPrecision)
  938. {
  939. if (value>this.FLOATPRECISION_RANGE[0]) return floatPrecision;
  940. if (floatPrecision<0) return 2;
  941. for(;floatPrecision<this.FLOATPRECISION_RANGE.length;++floatPrecision)
  942. {
  943. if (value>this.FLOATPRECISION_RANGE[floatPrecision]) break;
  944. }
  945. return floatPrecision;
  946. }
  947. this.FilterIgnoreYValue = function ()
  948. {
  949. if (!this.IgnoreYValue || this.IgnoreYValue.length <= 0) return;
  950. var setValue = new Set(this.IgnoreYValue);
  951. this.Frame.HorizontalInfo = this.Frame.HorizontalInfo.filter(item => !setValue.has(item.Value));
  952. this.IsShowYZero = !setValue.has(0); //是否显示0刻度
  953. }
  954. this.DynamicMessageText=function()
  955. {
  956. if (this.SplitType==2)
  957. {
  958. for(var i=0;i<this.Frame.HorizontalInfo.length; ++i)
  959. {
  960. var item=this.Frame.HorizontalInfo[i];
  961. if (item.Message[0]) item.Message[0]+='%';
  962. if (item.Message[1]) item.Message[1]+='%';
  963. }
  964. }
  965. }
  966. this.IntegerCoordinateSplit2 = function (data) //整数分割
  967. {
  968. if (this.IntegerSplitData == null) this.IntegerSplitData = new IntegerSplitData();
  969. var splitItem = this.IntegerSplitData.Find(data.Interval);
  970. if (!splitItem) return false;
  971. if (data.Interval == splitItem.FixInterval) return true;
  972. var fixMax=data.Max, fixMin=data.Min;
  973. var maxValue=data.Max/splitItem.FixInterval;
  974. var minValue=data.Min/splitItem.FixInterval;
  975. //调整到整数倍数,不能整除的 +1
  976. if (IFrameSplitOperator.IsFloat(maxValue)) fixMax=parseInt((maxValue+0.5).toFixed(0))*splitItem.FixInterval;
  977. if (IFrameSplitOperator.IsFloat(minValue)) fixMin=parseInt((minValue-0.5).toFixed(0))*splitItem.FixInterval;
  978. if (data.Min == 0) fixMin = 0; //最小值是0 不用调整了.
  979. if (fixMin < 0 && data.Min > 0) fixMin = 0; //都是正数的, 最小值最小调整为0
  980. var count = 0;
  981. for (var i = fixMin; (i - fixMax) < 0.00000001; i += splitItem.FixInterval)
  982. {
  983. ++count;
  984. }
  985. data.Interval = splitItem.FixInterval;
  986. data.Max = fixMax;
  987. data.Min = fixMin;
  988. data.Count = count;
  989. return true;
  990. }
  991. this.MainOverlayFrameSplitY=function()
  992. {
  993. if (!this.Frame.GetMainOverlayFrame) return;
  994. var aryOverlayFrame=this.Frame.GetMainOverlayFrame();
  995. if (!aryOverlayFrame ) return;
  996. if (aryOverlayFrame[1])
  997. {
  998. var rightFrame=aryOverlayFrame[1];
  999. var ySplitOper=rightFrame.YSplitOperator;
  1000. if (ySplitOper) ySplitOper.Operator();
  1001. for(var i=0;i<this.Frame.HorizontalInfo.length;++i)
  1002. {
  1003. var item=this.Frame.HorizontalInfo[i];
  1004. var y=this.Frame.GetYFromData(item.Value);
  1005. var yValue=rightFrame.GetYData(y);
  1006. if (ySplitOper && ySplitOper.FormatValueString) item.Message[1] = ySplitOper.FormatValueString(yValue);
  1007. else item.Message[1] = this.FormatValueString(yValue);
  1008. }
  1009. }
  1010. if (aryOverlayFrame[0])
  1011. {
  1012. var leftFrame=aryOverlayFrame[0];
  1013. var ySplitOper=leftFrame.YSplitOperator
  1014. if (ySplitOper) ySplitOper.Operator();
  1015. for(var i=0;i<this.Frame.HorizontalInfo.length;++i)
  1016. {
  1017. var item=this.Frame.HorizontalInfo[i];
  1018. var y=this.Frame.GetYFromData(item.Value);
  1019. var yValue=leftFrame.GetYData(y);
  1020. if (ySplitOper && ySplitOper.FormatValueString) item.Message[0] = ySplitOper.FormatValueString(yValue);
  1021. else item.Message[0] = this.FormatValueString(yValue);
  1022. }
  1023. }
  1024. }
  1025. }
  1026. function FrameSplitKLineX()
  1027. {
  1028. this.newMethod = IFrameSplitOperator; //派生
  1029. this.newMethod();
  1030. delete this.newMethod;
  1031. this.ShowText = true; //是否显示坐标信息
  1032. this.MinDistance = 12; //刻度间隔
  1033. this.Period; //周期
  1034. this.Symbol; //股票代码
  1035. this.MinTextDistance = 50;
  1036. this.SplitDateTime = function () //根据时间分割
  1037. {
  1038. this.Frame.VerticalInfo = [];
  1039. var itemWidth = this.Frame.DistanceWidth + this.Frame.DataWidth;
  1040. var xOffset = this.Frame.Data.DataOffset;
  1041. var xPointCount = this.Frame.XPointCount;
  1042. var lastYear = null, lastMonth = null;
  1043. var textDistance = 0;
  1044. for (var i = 0, index = xOffset; i < xPointCount && index < this.Frame.Data.Data.length; ++i, ++index)
  1045. {
  1046. textDistance += itemWidth;
  1047. var infoData = null;
  1048. if (i == 0)
  1049. {
  1050. var date = IFrameSplitOperator.FormatDateString(this.Frame.Data.Data[index].Date, 'MM-DD');
  1051. infoData = { Value: index - xOffset, Text: date };
  1052. }
  1053. else if (textDistance > this.MinTextDistance)
  1054. {
  1055. var time = IFrameSplitOperator.FormatTimeString(this.Frame.Data.Data[index].Time);
  1056. infoData = { Value: index - xOffset, Text: time };
  1057. }
  1058. if (infoData)
  1059. {
  1060. var info = new CoordinateInfo();
  1061. info.Value = infoData.Value;
  1062. if (this.ShowText) info.Message[0] = infoData.Text;
  1063. if (info.Value==0) info.LineType=-1; //第1个分割线不画
  1064. this.Frame.VerticalInfo.push(info);
  1065. textDistance = 0;
  1066. if (i == 0) textDistance = -(this.MinTextDistance / 2);
  1067. }
  1068. }
  1069. }
  1070. this.SplitSecond = function () //根据时间分割
  1071. {
  1072. this.Frame.VerticalInfo = [];
  1073. var itemWidth = this.Frame.DistanceWidth + this.Frame.DataWidth;
  1074. var xOffset = this.Frame.Data.DataOffset;
  1075. var xPointCount = this.Frame.XPointCount;
  1076. var lastYear = null, lastMonth = null;
  1077. var textDistance = 0;
  1078. for (var i = 0, index = xOffset; i < xPointCount && index < this.Frame.Data.Data.length; ++i, ++index)
  1079. {
  1080. textDistance += itemWidth;
  1081. var infoData = null;
  1082. if (i == 0)
  1083. {
  1084. var date = IFrameSplitOperator.FormatDateString(this.Frame.Data.Data[index].Date, 'MM-DD');
  1085. infoData = { Value: index - xOffset, Text: date };
  1086. }
  1087. else if (textDistance > this.MinTextDistance)
  1088. {
  1089. var time = IFrameSplitOperator.FormatTimeString(this.Frame.Data.Data[index].Time,"HH:MM:SS");
  1090. infoData = { Value: index - xOffset, Text: time };
  1091. }
  1092. if (infoData)
  1093. {
  1094. var info = new CoordinateInfo();
  1095. info.Value = infoData.Value;
  1096. if (this.ShowText) info.Message[0] = infoData.Text;
  1097. this.Frame.VerticalInfo.push(info);
  1098. textDistance = 0;
  1099. if (i == 0) textDistance = -(this.MinTextDistance / 2);
  1100. }
  1101. }
  1102. }
  1103. this.SplitDate = function () //根据日期分割
  1104. {
  1105. this.Frame.VerticalInfo = [];
  1106. var xOffset = this.Frame.Data.DataOffset;
  1107. var xPointCount = this.Frame.XPointCount;
  1108. var lastYear = null, lastMonth = null;
  1109. var monthCount=0;
  1110. for (var i = 0, index = xOffset, distance = this.MinDistance; i < xPointCount && index < this.Frame.Data.Data.length; ++i, ++index)
  1111. {
  1112. var year = parseInt(this.Frame.Data.Data[index].Date / 10000);
  1113. var month = parseInt(this.Frame.Data.Data[index].Date / 100) % 100;
  1114. if (lastMonth != month) ++monthCount;
  1115. if ((distance < this.MinDistance && lastYear == year) ||
  1116. (lastYear != null && lastYear == year && lastMonth != null && lastMonth == month))
  1117. {
  1118. lastMonth = month;
  1119. ++distance;
  1120. continue;
  1121. }
  1122. var info = new CoordinateInfo();
  1123. info.Value = index - xOffset;
  1124. //info.TextColor = "rgb(51,51,51)";
  1125. var text;
  1126. if (lastYear == null || lastYear != year)
  1127. {
  1128. text = year.toString();
  1129. }
  1130. else if (lastMonth == null || lastMonth != month)
  1131. {
  1132. text = month.toString() + "月";
  1133. }
  1134. lastYear = year;
  1135. lastMonth = month;
  1136. if (this.ShowText) info.Message[0] = text;
  1137. if (info.Value==0) info.LineType=-1; //第1个分割线不画
  1138. this.Frame.VerticalInfo.push(info);
  1139. distance = 0;
  1140. }
  1141. if (this.Period == 0 && monthCount <= 2)
  1142. this.SplitShortDate();
  1143. }
  1144. //分隔在2个月一下的格式
  1145. this.SplitShortDate = function ()
  1146. {
  1147. this.Frame.VerticalInfo = [];
  1148. var xOffset = this.Frame.Data.DataOffset;
  1149. var xPointCount = this.Frame.XPointCount;
  1150. var minDistance = 12;
  1151. var isFirstYear = true;
  1152. for (var i = 0, index = xOffset, distance = minDistance; i < xPointCount && index < this.Frame.Data.Data.length; ++i, ++index)
  1153. {
  1154. var year = parseInt(this.Frame.Data.Data[index].Date / 10000);
  1155. //var month=parseInt(this.Frame.Data.Data[index].Date/100)%100;
  1156. //var day=parseInt(this.Frame.Data.Data[index].Date%100);
  1157. if (distance < minDistance)
  1158. {
  1159. ++distance;
  1160. continue;
  1161. }
  1162. var info = new CoordinateInfo();
  1163. info.Value = index - xOffset;
  1164. var text;
  1165. if (isFirstYear)
  1166. {
  1167. text = year.toString();
  1168. isFirstYear = false;
  1169. }
  1170. else
  1171. {
  1172. text = IFrameSplitOperator.FormatDateString(this.Frame.Data.Data[index].Date, 'MM-DD');
  1173. }
  1174. if (this.ShowText) info.Message[0] = text;
  1175. if (info.Value==0) info.LineType=-1; //第1个分割线不画
  1176. this.Frame.VerticalInfo.push(info);
  1177. distance = 0;
  1178. }
  1179. if (this.Frame.VerticalInfo.length==1) //只有1个刻度, 就显示年+月
  1180. {
  1181. var item=this.Frame.VerticalInfo[0];
  1182. var index=item.Value+xOffset;
  1183. var kitem=this.Frame.Data.Data[index];
  1184. var text=IFrameSplitOperator.FormatDateString(kitem.Date,'YYYY-MM');
  1185. if (this.ShowText) item.Message[0]=text;
  1186. }
  1187. }
  1188. this.Operator = function ()
  1189. {
  1190. if (this.Frame.Data == null) return;
  1191. if (FrameSplitKLineX.SplitCustom) FrameSplitKLineX.SplitCustom(this); //自定义分割
  1192. else if (ChartData.IsMinutePeriod(this.Period, true)) this.SplitDateTime();
  1193. else if (ChartData.IsSecondPeriod(this.Period)) this.SplitSecond();
  1194. else this.SplitDate();
  1195. this.SendSplitXCoordinateEvent();
  1196. }
  1197. this.CreateCoordinateInfo=function()
  1198. {
  1199. return new CoordinateInfo(); //创建一个节点坐标
  1200. }
  1201. }
  1202. //FrameSplitKLineX.SplitCustom=function(split) { }
  1203. function FrameSplitMinutePriceY()
  1204. {
  1205. this.newMethod = IFrameSplitOperator; //派生
  1206. this.newMethod();
  1207. delete this.newMethod;
  1208. this.High = null; //最高最低价
  1209. this.Low = null;
  1210. this.YClose; //昨收
  1211. this.Data; //分钟数据
  1212. this.AverageData; //分钟均线数据
  1213. this.OverlayChartPaint;
  1214. this.SplitCount = 7;
  1215. this.Symbol;
  1216. this.SplitType=0; //0=默认根据最大最小值分割 1=涨跌停分割 2=数据最大最大值分割
  1217. this.DefaultSplitType=0;
  1218. this.LimitPrice; //{Max: Min:} 涨跌停价
  1219. this.Custom;
  1220. this.Operator = function ()
  1221. {
  1222. this.Frame.HorizontalInfo = [];
  1223. this.Frame.CustomHorizontalInfo = [];
  1224. if (!this.Data) return;
  1225. var range=this.GetMaxMin();
  1226. if (this.Symbol && MARKET_SUFFIX_NAME.IsUSA(this.Symbol.toUpperCase()))
  1227. {
  1228. this.USASplit(range);
  1229. }
  1230. else if (this.SplitType==2)
  1231. {
  1232. this.USASplit(range);
  1233. }
  1234. else
  1235. {
  1236. this.DefaultSplit(range);
  1237. }
  1238. this.CustomCoordinate();
  1239. this.ReservedHeight({ Max:this.Frame.HorizontalMax, Min:this.Frame.HorizontalMin }); //预留高度
  1240. if (this.GetEventCallback)
  1241. {
  1242. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_YCOORDINATE);
  1243. if (event && event.Callback)
  1244. {
  1245. var data={ID:this.Frame.Identify, Frame:this.Frame };
  1246. event.Callback(event,data,this);
  1247. }
  1248. }
  1249. }
  1250. this.GetMaxMin = function () //计算图中所有的数据的最大最小值
  1251. {
  1252. var max = this.YClose;
  1253. var min = this.YClose;
  1254. for (var i in this.Data.Data)
  1255. {
  1256. if (!this.Data.Data[i]) continue; //价格必须大于0
  1257. if (max < this.Data.Data[i]) max = this.Data.Data[i];
  1258. if (min > this.Data.Data[i]) min = this.Data.Data[i];
  1259. }
  1260. if (this.AverageData)
  1261. {
  1262. for (var i in this.AverageData.Data)
  1263. {
  1264. if (!this.AverageData.Data[i]) continue; //价格必须大于0
  1265. if (max < this.AverageData.Data[i]) max = this.AverageData.Data[i];
  1266. if (min > this.AverageData.Data[i]) min = this.AverageData.Data[i];
  1267. }
  1268. }
  1269. for(var i=0; i<this.OverlayChartPaint.length; ++i)
  1270. {
  1271. var item=this.OverlayChartPaint[i];
  1272. var range=item.GetMaxMin();
  1273. if (range.Max && range.Max>max) max=range.Max;
  1274. if (range.Min && range.Min<min) min=range.Min;
  1275. }
  1276. if (this.SplitType==1 && this.LimitPrice)
  1277. {
  1278. if (max<this.LimitPrice.Max) max=this.LimitPrice.Max;
  1279. if (min>this.LimitPrice.Min) min=this.LimitPrice.Min;
  1280. }
  1281. if (IFrameSplitOperator.IsNumber(this.High) && IFrameSplitOperator.IsNumber(this.Low))
  1282. {
  1283. if (max < this.High) max = this.High;
  1284. if (min > this.Low) min = this.Low;
  1285. }
  1286. //叠加指标
  1287. var overlayRange=this.GetOverlayMaxMin();
  1288. if (overlayRange)
  1289. {
  1290. if (IFrameSplitOperator.IsNumber(overlayRange.Max) && overlayRange.Max>max) max=overlayRange.Max;
  1291. if (IFrameSplitOperator.IsNumber(overlayRange.Min) && overlayRange.Min<min) min=overlayRange.Min;
  1292. }
  1293. return { Max: max, Min: min };
  1294. }
  1295. //获取共享Y轴叠加指标最大,最小值
  1296. this.GetOverlayMaxMin=function()
  1297. {
  1298. if (!this.HQChart) return null;
  1299. if (!this.HQChart.Frame || !this.HQChart.Frame.SubFrame) return null;
  1300. var subFrame=this.HQChart.Frame.SubFrame[0];
  1301. if (!subFrame) return null;
  1302. if (!IFrameSplitOperator.IsNonEmptyArray(subFrame.OverlayIndex)) return null;
  1303. var range={ Max:null, Min:null };
  1304. for(var i=0;i<subFrame.OverlayIndex.length;++i)
  1305. {
  1306. var item=subFrame.OverlayIndex[i];
  1307. if (!item || !item.Frame) continue;
  1308. var overlayFrame=item.Frame;
  1309. if (overlayFrame.IsShareY!=true) continue;
  1310. if (overlayFrame.IsCalculateYMaxMin===false) continue; //叠加坐标Y轴不调整
  1311. for(var j=0;j<item.ChartPaint.length; ++j)
  1312. {
  1313. var paint=item.ChartPaint[j];
  1314. if (paint.IsShow==false) continue;
  1315. var value=paint.GetMaxMin();
  1316. if (value==null || value.Max==null || value.Min==null) continue;
  1317. if (range.Max==null || range.Max<value.Max) range.Max=value.Max;
  1318. if (range.Min==null || range.Min>value.Min ) range.Min=value.Min;
  1319. }
  1320. }
  1321. return range;
  1322. }
  1323. this.USASplit=function(range)
  1324. {
  1325. var max=range.Max;
  1326. var min=range.Min;
  1327. if (max==min)
  1328. {
  1329. max=max+max*0.1;
  1330. min=min-min*0.1;
  1331. }
  1332. else
  1333. {
  1334. var height=this.Frame.ChartBorder.GetHeight(); //画布的高度
  1335. var spacePrice=5*(max-min)/height;
  1336. max+=spacePrice;
  1337. min-=spacePrice;
  1338. if (min<0) min=range.Min;
  1339. }
  1340. var showCount=this.SplitCount;
  1341. var distance=(max-min)/(showCount-1);
  1342. const minDistance=[1, 0.1, 0.01, 0.001, 0.0001];
  1343. var defaultfloatPrecision=JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  1344. if (distance<minDistance[defaultfloatPrecision])
  1345. {
  1346. distance=minDistance[defaultfloatPrecision];
  1347. max=min+distance*showCount;
  1348. //min=this.YClose-(distance*(showCount-1)/2);
  1349. }
  1350. for(var i=0;i<showCount;++i)
  1351. {
  1352. var price=min+(distance*i);
  1353. if (this.YClose && price==this.YClose) continue;
  1354. var coordinate=new CoordinateInfo();
  1355. coordinate.Value=price;
  1356. var strPrice=price.toFixed(defaultfloatPrecision); //价格刻度字符串
  1357. if (this.IsShowLeftText) coordinate.Message[0]=strPrice;
  1358. if (IFrameSplitOperator.IsNumber(this.YClose) && this.YClose!=0)
  1359. {
  1360. var per=(price/this.YClose-1)*100;
  1361. if (per>0) coordinate.TextColor=g_JSChartResource.UpTextColor;
  1362. else if (per<0) coordinate.TextColor=g_JSChartResource.DownTextColor;
  1363. if (this.IsShowRightText)
  1364. {
  1365. if (this.RightTextFormat==1) coordinate.Message[1]=strPrice;
  1366. else coordinate.Message[1]=IFrameSplitOperator.FormatValueString(per,2)+'%'; //百分比
  1367. }
  1368. }
  1369. this.Frame.HorizontalInfo.push(coordinate);
  1370. }
  1371. if (this.YClose>min && this.YClose<max) //前收盘线
  1372. {
  1373. var coordinate=new CoordinateInfo();
  1374. coordinate.Value=this.YClose;
  1375. coordinate.LineType=2;//中间的线画虚线
  1376. if (g_JSChartResource.FrameDotSplitPen) coordinate.LineColor=g_JSChartResource.FrameDotSplitPen;
  1377. var strPrice=this.YClose.toFixed(defaultfloatPrecision); //价格刻度字符串
  1378. if (this.IsShowLeftText) coordinate.Message[0]=strPrice;
  1379. if (this.IsShowRightText)
  1380. {
  1381. if (this.RightTextFormat==1) coordinate.Message[1]=strPrice;
  1382. else coordinate.Message[1]='0.00%'; //百分比
  1383. }
  1384. this.Frame.HorizontalInfo.push(coordinate);
  1385. }
  1386. this.Frame.HorizontalInfo.sort(function(a,b) { return a.Value-b.Value; });
  1387. this.Frame.HorizontalMax=max;
  1388. this.Frame.HorizontalMin=min;
  1389. }
  1390. this.DefaultSplit = function (range)
  1391. {
  1392. var max = range.Max;
  1393. var min = range.Min;
  1394. if (this.YClose == max && this.YClose == min)
  1395. {
  1396. max = this.YClose + this.YClose * 0.1;
  1397. min = this.YClose - this.YClose * 0.1;
  1398. }
  1399. else
  1400. {
  1401. var distanceValue = Math.max(Math.abs(this.YClose - max), Math.abs(this.YClose - min));
  1402. max = this.YClose + distanceValue;
  1403. min = this.YClose - distanceValue;
  1404. if (min<0) min=range.Min;
  1405. }
  1406. var showCount = this.SplitCount;
  1407. var distance = (max - min) / (showCount - 1);
  1408. const minDistance = [1, 0.1, 0.01, 0.001, 0.0001];
  1409. var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);; //默认小数位数
  1410. //if (JSCommonCoordinateData.MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol)) defaultfloatPrecision = 0; //手机端指数不显示小数位数,太长了
  1411. if (distance < minDistance[defaultfloatPrecision])
  1412. {
  1413. distance = minDistance[defaultfloatPrecision];
  1414. max = this.YClose + (distance * (showCount - 1) / 2);
  1415. min = this.YClose - (distance * (showCount - 1) / 2);
  1416. }
  1417. for (var i = 0; i < showCount; ++i)
  1418. {
  1419. var price = min + (distance * i);
  1420. var coordinate=new CoordinateInfo();
  1421. this.Frame.HorizontalInfo[i] = coordinate;
  1422. coordinate.Value = price;
  1423. coordinate.Message[0] = price.toFixed(defaultfloatPrecision);
  1424. if (IFrameSplitOperator.IsNumber(this.YClose) && this.YClose!=0)
  1425. {
  1426. var per = (price / this.YClose - 1) * 100;
  1427. if (per > 0) coordinate.TextColor = g_JSChartResource.UpTextColor;
  1428. else if (per < 0) coordinate.TextColor = g_JSChartResource.DownTextColor;
  1429. coordinate.Message[1] = IFrameSplitOperator.FormatValueString(per, 2) + '%'; //百分比
  1430. if (Math.abs(price-this.YClose) <0.00000000001) //小数有精度问题 使用差值
  1431. {
  1432. coordinate.LineType=2;//中间的线画虚线
  1433. coordinate.TextColor=g_JSChartResource.UnchagneTextColor;
  1434. if (g_JSChartResource.FrameDotSplitPen) coordinate.LineColor=g_JSChartResource.FrameDotSplitPen;
  1435. }
  1436. }
  1437. }
  1438. this.Frame.HorizontalMax = max;
  1439. this.Frame.HorizontalMin = min;
  1440. }
  1441. this.CustomCoordinate = function () //自定义刻度
  1442. {
  1443. this.Frame.CustomHorizontalInfo = [];
  1444. if (!this.Custom) return;
  1445. for (var i=0; i<this.Custom.length; ++i)
  1446. {
  1447. var item = this.Custom[i];
  1448. if (item.Type == 1)
  1449. this.CustomFixedCoordinate(item);
  1450. else if (item.Type==0)
  1451. {
  1452. var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  1453. var latestItem = this.GetLatestPrice(defaultfloatPrecision, item);
  1454. if (latestItem) this.Frame.CustomHorizontalInfo.push(latestItem);
  1455. }
  1456. }
  1457. }
  1458. this.GetLatestPrice = function (floatPrecision, option)
  1459. {
  1460. if (!this.Data || !this.Data.Data) return null;
  1461. if (this.Data.Data.length <= 0) return null;
  1462. var price = this.Data.Data[this.Data.Data.length - 1];
  1463. if (!IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(this.YClose)) return null;
  1464. var info = new CoordinateInfo();
  1465. info.Type = 0;
  1466. info.Value = price;
  1467. info.TextColor = g_JSChartResource.FrameLatestPrice.TextColor;
  1468. info.LineType = 2; //虚线
  1469. if (option.Position == 'left') info.Message[0] = price.toFixed(floatPrecision);
  1470. else info.Message[1] = price.toFixed(floatPrecision);
  1471. if (price > this.YClose) info.LineColor = g_JSChartResource.FrameLatestPrice.UpBarColor;
  1472. else if (price < this.YClose) info.LineColor = g_JSChartResource.FrameLatestPrice.DownBarColor;
  1473. else info.LineColor = g_JSChartResource.FrameLatestPrice.UnchagneBarColor;
  1474. if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;
  1475. if (option.IsShowLine == false) info.LineType = -1;
  1476. return info;
  1477. }
  1478. this.CustomFixedCoordinate = function (option) //固定坐标刻度
  1479. {
  1480. var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  1481. for (var i in option.Data)
  1482. {
  1483. var item = option.Data[i];
  1484. var info = new CoordinateInfo();
  1485. info.Type = 1;
  1486. info.TextColor = item.TextColor;
  1487. info.LineColor = item.Color;
  1488. info.LineType = 2; //虚线
  1489. if (IFrameSplitOperator.IsNumber(option.LineType)) info.LineType=option.LineType;
  1490. if (option.IsShowLine == false) info.LineType = -1;
  1491. if (IFrameSplitOperator.IsNumber(item.Increase)) //涨幅计算价格
  1492. {
  1493. if (!IFrameSplitOperator.IsNumber(this.YClose)) continue;
  1494. info.Value = this.YClose * (1 + item.Increase);
  1495. }
  1496. else
  1497. {
  1498. info.Value = item.Value;
  1499. }
  1500. var text;
  1501. if (item.Text) text = item.Text;
  1502. else text = info.Value.toFixed(defaultfloatPrecision);
  1503. if (option.Position == 'left') info.Message[0] = text;
  1504. else info.Message[1] = text;
  1505. this.Frame.CustomHorizontalInfo.push(info);
  1506. }
  1507. }
  1508. }
  1509. function FrameSplitMinuteX()
  1510. {
  1511. this.newMethod = IFrameSplitOperator; //派生
  1512. this.newMethod();
  1513. delete this.newMethod;
  1514. this.ShowText = true; //是否显示坐标信息
  1515. this.Symbol = null; //股票代码 x轴刻度根据股票类型来调整
  1516. this.DayCount = 1;
  1517. this.DayData;
  1518. this.Operator = function ()
  1519. {
  1520. this.Frame.VerticalInfo = [];
  1521. var xPointCount = this.Frame.XPointCount;
  1522. var width = this.Frame.ChartBorder.GetWidth();
  1523. var isHScreen = (this.Frame.IsHScreen === true);
  1524. if (isHScreen) width = this.Frame.ChartBorder.GetHeight();
  1525. const minuteCoordinate = JSCommonCoordinateData.MinuteCoordinateData;
  1526. var xcoordinateData = minuteCoordinate.GetCoordinateData(this.Symbol, width);
  1527. var minuteCount = xcoordinateData.Count;
  1528. var minuteMiddleCount = xcoordinateData.MiddleCount > 0 ? xcoordinateData.MiddleCount : parseInt(minuteCount / 2);;
  1529. var xcoordinate = xcoordinateData.Data;
  1530. this.Frame.XPointCount = 243;
  1531. this.Frame.XPointCount = minuteCount * this.DayCount;
  1532. this.Frame.MinuteCount = minuteCount;
  1533. this.Frame.VerticalInfo = [];
  1534. if (this.DayCount <= 1)
  1535. {
  1536. for (var i in xcoordinate)
  1537. {
  1538. var info = new CoordinateInfo();
  1539. //info.TextColor = "rgb(51,51,51)";
  1540. info.Value = xcoordinate[i][0];
  1541. if (this.ShowText)
  1542. info.Message[0] = xcoordinate[i][3];
  1543. this.Frame.VerticalInfo[i] = info;
  1544. }
  1545. }
  1546. else
  1547. {
  1548. for (var i = this.DayData.length - 1, j = 0; i >= 0; --i, ++j)
  1549. {
  1550. var info = new CoordinateInfo();
  1551. info.Value = j * minuteCount + minuteMiddleCount;
  1552. info.LineType = -1;
  1553. if (this.ShowText) info.Message[0] = IFrameSplitOperator.FormatDateString(this.DayData[i].Date, 'MM-DD');
  1554. this.Frame.VerticalInfo.push(info);
  1555. var info = new CoordinateInfo();
  1556. info.Value = (j + 1) * minuteCount;
  1557. this.Frame.VerticalInfo.push(info);
  1558. }
  1559. }
  1560. this.SendSplitXCoordinateEvent();
  1561. }
  1562. }
  1563. function FrameSplitXData()
  1564. {
  1565. this.newMethod = IFrameSplitOperator; //派生
  1566. this.newMethod();
  1567. delete this.newMethod;
  1568. this.ShowText = true; //是否显示坐标信息
  1569. this.Operator = function ()
  1570. {
  1571. if (this.Frame.Data == null || this.Frame.XData == null) return;
  1572. this.Frame.VerticalInfo = [];
  1573. var xOffset = this.Frame.Data.DataOffset;
  1574. var xPointCount = this.Frame.XPointCount;
  1575. for (var i = 0, index = xOffset; i < xPointCount && index < this.Frame.Data.Data.length; ++i, ++index)
  1576. {
  1577. var info = new CoordinateInfo();
  1578. info.Value = index - xOffset;
  1579. if (this.ShowText)
  1580. info.Message[0] = this.Frame.XData[i];
  1581. this.Frame.VerticalInfo.push(info);
  1582. }
  1583. }
  1584. }
  1585. //深度图X轴价格信息
  1586. function FrameSplitXDepth()
  1587. {
  1588. this.newMethod=IFrameSplitOperator; //派生
  1589. this.newMethod();
  1590. delete this.newMethod;
  1591. this.ShowText=true; //是否显示坐标信息
  1592. this.SplitCount=3;
  1593. this.Symbol;
  1594. this.LineType=3;
  1595. this.Operator=function()
  1596. {
  1597. var xRange=this.Frame.VerticalRange;
  1598. if (!xRange) return;
  1599. this.Frame.VerticalInfo=[];
  1600. var floatPrecision=2;
  1601. if (this.Symbol) floatPrecision=JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  1602. var xMax=xRange.Max;
  1603. var xMin=xRange.Min;
  1604. if (xRange.Bid)
  1605. {
  1606. var interval=(xRange.Bid.Max-xMin)/this.SplitCount;
  1607. for(var i=0;i<this.SplitCount;++i)
  1608. {
  1609. var info= new CoordinateInfo();
  1610. info.Value=xMin+(interval*i);
  1611. if (info.Value<=0) continue;
  1612. if (IFrameSplitOperator.IsNumber(this.LineType)) info.LineType=this.LineType;
  1613. if (this.ShowText) info.Message[0]=info.Value.toFixed(floatPrecision);
  1614. this.Frame.VerticalInfo.push(info);
  1615. }
  1616. }
  1617. var info=new CoordinateInfo();
  1618. info.Value=xRange.Center;
  1619. this.Frame.VerticalInfo.push(info);
  1620. if (xRange.Ask)
  1621. {
  1622. var interval=(xMax-xRange.Ask.Min)/this.SplitCount;
  1623. for(var i=1;i<=this.SplitCount;++i)
  1624. {
  1625. var info= new CoordinateInfo();
  1626. info.Value=xRange.Ask.Min+(interval*i);
  1627. if (IFrameSplitOperator.IsNumber(this.LineType)) info.LineType=this.LineType;
  1628. if (this.ShowText) info.Message[0]=info.Value.toFixed(floatPrecision);
  1629. this.Frame.VerticalInfo.push(info);
  1630. }
  1631. }
  1632. if (this.GetEventCallback)
  1633. {
  1634. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SPLIT_XCOORDINATE);
  1635. if (event && event.Callback)
  1636. {
  1637. var data={ID:this.Frame.Identify, Frame:this.Frame };
  1638. event.Callback(event,data,this);
  1639. }
  1640. }
  1641. }
  1642. }
  1643. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  1644. // 数据分割
  1645. // [0]=Start起始 [1]=End结束 [2]=FixInterval修正的间隔 [3]=Increase
  1646. //
  1647. function SplitData() {
  1648. this.Data = [
  1649. [0.000001, 0.000002, 0.000001, 0.0000001],
  1650. [0.000002, 0.000004, 0.000002, 0.0000002],
  1651. [0.000004, 0.000005, 0.000004, 0.0000001],
  1652. [0.000005, 0.00001, 0.000005, 0.0000005],
  1653. [0.00001, 0.00002, 0.00001, 0.000001],
  1654. [0.00002, 0.00004, 0.00002, 0.000002],
  1655. [0.00004, 0.00005, 0.00004, 0.000001],
  1656. [0.00005, 0.0001, 0.00005, 0.000005],
  1657. [0.0001, 0.0002, 0.0001, 0.00001],
  1658. [0.0002, 0.0004, 0.0002, 0.00002],
  1659. [0.0004, 0.0005, 0.0004, 0.00001],
  1660. [0.0005, 0.001, 0.0005, 0.00005],
  1661. [0.001, 0.002, 0.001, 0.0001],
  1662. [0.002, 0.004, 0.002, 0.0002],
  1663. [0.004, 0.005, 0.004, 0.0001],
  1664. [0.005, 0.01, 0.005, 0.0005],
  1665. [0.01, 0.02, 0.01, 0.001],
  1666. [0.02, 0.04, 0.02, 0.002],
  1667. [0.04, 0.05, 0.04, 0.001],
  1668. [0.05, 0.1, 0.05, 0.005],
  1669. [0.1, 0.2, 0.1, 0.01],
  1670. [0.2, 0.4, 0.2, 0.02],
  1671. [0.4, 0.5, 0.4, 0.01],
  1672. [0.5, 1, 0.5, 0.05],
  1673. [1, 2, 1, 0.05],
  1674. [2, 4, 2, 0.05],
  1675. [4, 5, 4, 0.05],
  1676. [5, 10, 5, 0.05],
  1677. [10, 20, 10, 2],
  1678. [20, 40, 20, 5],
  1679. [40, 50, 40, 2],
  1680. [50, 100, 50, 10],
  1681. [100, 200, 100, 10],
  1682. [200, 400, 200, 20],
  1683. [400, 500, 400, 10],
  1684. [500, 1000, 500, 50],
  1685. [1000, 2000, 1000, 50],
  1686. [2000, 4000, 2000, 50],
  1687. [4000, 5000, 4000, 50],
  1688. [5000, 10000, 5000, 100],
  1689. [10000, 20000, 10000, 1000],
  1690. [20000, 40000, 20000, 2000],
  1691. [40000, 50000, 40000, 1000],
  1692. [50000, 100000, 50000, 5000],
  1693. [100000, 200000, 100000, 10000],
  1694. [200000, 400000, 200000, 20000],
  1695. [400000, 500000, 400000, 10000],
  1696. [500000, 1000000, 500000, 50000],
  1697. [1000000, 2000000, 1000000, 100000],
  1698. [2000000, 4000000, 2000000, 200000],
  1699. [4000000, 5000000, 4000000, 100000],
  1700. [5000000, 10000000, 5000000, 500000],
  1701. [10000000, 20000000, 10000000, 1000000],
  1702. [20000000, 40000000, 20000000, 2000000],
  1703. [40000000, 50000000, 40000000, 1000000],
  1704. [50000000, 100000000, 50000000, 5000000],
  1705. [100000000, 200000000, 100000000, 10000000],
  1706. [200000000, 400000000, 100000000, 10000000],
  1707. [400000000, 500000000, 100000000, 10000000],
  1708. [500000000, 1000000000, 100000000, 10000000],
  1709. [1000000000, 2000000000, 1000000000, 100000000],
  1710. [2000000000, 4000000000, 2000000000, 200000000],
  1711. [4000000000, 5000000000, 4000000000, 100000000],
  1712. [5000000000, 10000000000, 5000000000, 500000000],
  1713. ];
  1714. this.Find = function (interval) {
  1715. for (var i in this.Data) {
  1716. var item = this.Data[i];
  1717. if (interval > item[0] && interval <= item[1]) {
  1718. var result = {};
  1719. result.FixInterval = item[2];
  1720. result.Increase = item[3];
  1721. return result;
  1722. }
  1723. }
  1724. return null;
  1725. }
  1726. }
  1727. function PriceSplitData() {
  1728. this.newMethod = SplitData; //派生
  1729. this.newMethod();
  1730. delete this.newMethod;
  1731. this.Data = [
  1732. [0.000001, 0.000002, 0.000001, 0.0000001],
  1733. [0.000002, 0.000004, 0.000002, 0.0000002],
  1734. [0.000004, 0.000005, 0.000004, 0.0000001],
  1735. [0.000005, 0.00001, 0.000005, 0.0000005],
  1736. [0.00001, 0.00002, 0.00001, 0.000001],
  1737. [0.00002, 0.00004, 0.00002, 0.000002],
  1738. [0.00004, 0.00005, 0.00004, 0.000001],
  1739. [0.00005, 0.0001, 0.00005, 0.000005],
  1740. [0.0001, 0.0002, 0.0001, 0.00001],
  1741. [0.0002, 0.0004, 0.0002, 0.00002],
  1742. [0.0004, 0.0005, 0.0004, 0.00001],
  1743. [0.0005, 0.001, 0.0005, 0.00005],
  1744. [0.001, 0.002, 0.001, 0.0001],
  1745. [0.002, 0.004, 0.002, 0.0002],
  1746. [0.004, 0.005, 0.004, 0.0001],
  1747. [0.005, 0.01, 0.005, 0.0005],
  1748. [0.01, 0.02, 0.01, 0.001],
  1749. [0.02, 0.04, 0.02, 0.002],
  1750. [0.04, 0.05, 0.04, 0.001],
  1751. [0.05, 0.1, 0.05, 0.005],
  1752. [0.1, 0.2, 0.1, 0.01],
  1753. [0.2, 0.4, 0.2, 0.02],
  1754. [0.4, 0.5, 0.2, 0.01],
  1755. [0.5, 0.8, 0.2, 0.05],
  1756. [0.8, 1, 0.5, 0.05],
  1757. [1, 2, 0.5, 0.05],
  1758. [2, 4, 0.5, 0.05],
  1759. [4, 5, 0.5, 0.05],
  1760. [5, 10, 0.5, 0.05],
  1761. [10, 12, 10, 2],
  1762. [20, 40, 20, 5],
  1763. [40, 50, 40, 2],
  1764. [50, 100, 50, 10],
  1765. [100, 200, 100, 10],
  1766. [200, 400, 200, 20],
  1767. [400, 500, 400, 10],
  1768. [500, 1000, 500, 50],
  1769. [1000, 2000, 1000, 50],
  1770. [2000, 4000, 2000, 50],
  1771. [4000, 5000, 4000, 50],
  1772. [5000, 10000, 5000, 100],
  1773. [10000, 20000, 10000, 1000],
  1774. [20000, 40000, 20000, 2000],
  1775. [40000, 50000, 40000, 1000],
  1776. [50000, 100000, 50000, 5000],
  1777. [100000, 200000, 100000, 10000],
  1778. [200000, 400000, 200000, 20000],
  1779. [400000, 500000, 400000, 10000],
  1780. [500000, 1000000, 500000, 50000],
  1781. [1000000, 2000000, 1000000, 100000],
  1782. [2000000, 4000000, 2000000, 200000],
  1783. [4000000, 5000000, 4000000, 100000],
  1784. [5000000, 10000000, 5000000, 500000],
  1785. [10000000, 20000000, 10000000, 1000000],
  1786. [20000000, 40000000, 20000000, 2000000],
  1787. [40000000, 50000000, 40000000, 1000000],
  1788. [50000000, 100000000, 50000000, 5000000],
  1789. [100000000, 200000000, 100000000, 10000000],
  1790. [200000000, 400000000, 200000000, 20000000],
  1791. [400000000, 500000000, 400000000, 10000000],
  1792. [500000000, 1000000000, 500000000, 50000000],
  1793. [1000000000, 2000000000, 1000000000, 100000000],
  1794. [2000000000, 4000000000, 2000000000, 200000000],
  1795. [4000000000, 5000000000, 4000000000, 100000000],
  1796. [5000000000, 10000000000, 5000000000, 500000000],
  1797. ];
  1798. }
  1799. //整数分割
  1800. function IntegerSplitData() {
  1801. this.newMethod = SplitData; //派生
  1802. this.newMethod();
  1803. delete this.newMethod;
  1804. this.Data =
  1805. [
  1806. [0.000001, 0.000002, 0.000001, 0.0000001],
  1807. [0.000002, 0.000004, 0.000002, 0.0000002],
  1808. [0.000004, 0.000005, 0.000004, 0.0000001],
  1809. [0.000005, 0.00001, 0.000005, 0.0000005],
  1810. [0.00001, 0.00002, 0.00001, 0.000001],
  1811. [0.00002, 0.00004, 0.00002, 0.000002],
  1812. [0.00004, 0.00005, 0.00004, 0.000001],
  1813. [0.00005, 0.0001, 0.00005, 0.000005],
  1814. [0.0001, 0.0002, 0.0001, 0.00001],
  1815. [0.0002, 0.0004, 0.0002, 0.00002],
  1816. [0.0004, 0.0005, 0.0004, 0.00001],
  1817. [0.0005, 0.001, 0.0005, 0.00005],
  1818. [0.001, 0.002, 0.001, 0.0001],
  1819. [0.002, 0.004, 0.002, 0.0002],
  1820. [0.004, 0.005, 0.004, 0.0001],
  1821. [0.005, 0.01, 0.005, 0.0005],
  1822. [0.01, 0.02, 0.01, 0.001],
  1823. [0.02, 0.04, 0.02, 0.002],
  1824. [0.04, 0.05, 0.04, 0.001],
  1825. [0.05, 0.1, 0.05, 0.005],
  1826. [0.1, 0.2, 1, 1],
  1827. [0.2, 0.4, 1, 1],
  1828. [0.4, 0.5, 1, 1],
  1829. [0.5, 0.8, 1, 1],
  1830. [0.8, 1, 1, 1],
  1831. [1, 2, 1, 1],
  1832. [2, 4, 2, 1],
  1833. [4, 5, 4, 1],
  1834. [5, 10, 5, 1],
  1835. [10, 12, 10, 2],
  1836. [20, 40, 20, 5],
  1837. [40, 50, 40, 2],
  1838. [50, 100, 50, 10],
  1839. [100, 200, 100, 10],
  1840. [200, 400, 200, 20],
  1841. [400, 500, 400, 10],
  1842. [500, 1000, 500, 50],
  1843. [1000, 2000, 1000, 50],
  1844. [2000, 4000, 2000, 50],
  1845. [4000, 5000, 4000, 50],
  1846. [5000, 10000, 5000, 100],
  1847. [10000, 20000, 10000, 1000],
  1848. [20000, 40000, 20000, 2000],
  1849. [40000, 50000, 40000, 1000],
  1850. [50000, 100000, 50000, 5000],
  1851. [100000, 200000, 100000, 10000],
  1852. [200000, 400000, 200000, 20000],
  1853. [400000, 500000, 400000, 10000],
  1854. [500000, 1000000, 500000, 50000],
  1855. [1000000, 2000000, 1000000, 100000],
  1856. [2000000, 4000000, 2000000, 200000],
  1857. [4000000, 5000000, 4000000, 100000],
  1858. [5000000, 10000000, 5000000, 500000],
  1859. [10000000, 20000000, 10000000, 1000000],
  1860. [20000000, 40000000, 20000000, 2000000],
  1861. [40000000, 50000000, 40000000, 1000000],
  1862. [50000000, 100000000, 50000000, 5000000],
  1863. [100000000, 200000000, 100000000, 10000000],
  1864. [200000000, 400000000, 200000000, 20000000],
  1865. [400000000, 500000000, 400000000, 10000000],
  1866. [500000000, 1000000000, 500000000, 50000000],
  1867. [1000000000, 2000000000, 1000000000, 100000000],
  1868. [2000000000, 4000000000, 2000000000, 200000000],
  1869. [4000000000, 5000000000, 4000000000, 100000000],
  1870. [5000000000, 10000000000, 5000000000, 500000000],
  1871. ];
  1872. }
  1873. /////////////////////////////////////////////////////////////////////////////////
  1874. //
  1875. function IChangeStringFormat() {
  1876. this.Data;
  1877. this.Value; //数据
  1878. this.Text; //输出字符串
  1879. this.Operator = function () {
  1880. return false;
  1881. }
  1882. }
  1883. function HQPriceStringFormat()
  1884. {
  1885. this.newMethod = IChangeStringFormat; //派生
  1886. this.newMethod();
  1887. delete this.newMethod;
  1888. this.Symbol;
  1889. this.FrameID;
  1890. this.LanguageID = JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;
  1891. this.PercentageText; //百分比
  1892. this.RValue; //右边值
  1893. this.RText;
  1894. this.RComplexText; //{ Space:2 间距, Text:[ {Color:, Text: }] } 支持单行多颜色
  1895. this.PriceFormatType=0; //主窗口格式 0=默认 1=科学计数
  1896. this.DataFormatType=0; //副图指标格式 0=默认 1=科学计数
  1897. this.Operator = function ()
  1898. {
  1899. this.RText = null;
  1900. this.RComplexText=null;
  1901. this.PercentageText=null;
  1902. if (IFrameSplitOperator.IsString(this.RValue)) this.RText = this.RValue;
  1903. if (!this.Value) return false;
  1904. var defaultfloatPrecision = 2; //价格小数位数
  1905. if (this.FrameID == 0) //第1个窗口显示原始价格
  1906. {
  1907. var defaultfloatPrecision = JSCommonCoordinateData.GetfloatPrecision(this.Symbol);
  1908. if (this.PriceFormatType==1)
  1909. this.Text=IFrameSplitOperator.FormatValueThousandsString(this.Value,defaultfloatPrecision);
  1910. else
  1911. this.Text = this.Value.toFixed(defaultfloatPrecision);
  1912. if (this.YClose>0) this.PercentageText=((this.Value-this.YClose)*100/this.YClose).toFixed(2); //走势图右边坐标显示百分比
  1913. }
  1914. else
  1915. {
  1916. if (this.DataFormatType==1)
  1917. {
  1918. this.Text=IFrameSplitOperator.FormatValueThousandsString(this.Value,defaultfloatPrecision);
  1919. if (IFrameSplitOperator.IsNumber(this.RValue)) this.RText=IFrameSplitOperator.FormatValueString(this.RValue,defaultfloatPrecision,this.LanguageID);
  1920. }
  1921. else
  1922. {
  1923. this.Text = IFrameSplitOperator.FormatValueString(this.Value, defaultfloatPrecision, this.LanguageID);
  1924. if (IFrameSplitOperator.IsNumber(this.RValue)) this.RText=IFrameSplitOperator.FormatValueString(this.RValue,defaultfloatPrecision,this.LanguageID);
  1925. }
  1926. }
  1927. if (this.GetEventCallback)
  1928. {
  1929. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_FORMAT_CORSSCURSOR_Y_TEXT);
  1930. if (event)
  1931. {
  1932. var data={ Value:this.Value, FrameID:this.FrameID, PreventDefault:false };
  1933. event.Callback(event,data,this);
  1934. if (data.PreventDefault==true) return false;
  1935. }
  1936. }
  1937. return true;
  1938. }
  1939. }
  1940. function HQDateStringFormat()
  1941. {
  1942. this.newMethod = IChangeStringFormat; //派生
  1943. this.newMethod();
  1944. delete this.newMethod;
  1945. this.DateFormatType=0; //0=YYYY-MM-DD 1=YYYY/MM/DD 2=YYYY/MM/DD/W 3=DD/MM/YYYY
  1946. this.LanguageID=0;
  1947. this.Operator = function ()
  1948. {
  1949. if (!IFrameSplitOperator.IsNumber(this.Value) || this.Value<0) return false;
  1950. if (!this.Data) return false;
  1951. var index = this.Value;
  1952. index = parseInt(index.toFixed(0));
  1953. if (this.Data.DataOffset + index >= this.Data.Data.length) return false;
  1954. var currentData = this.Data.Data[this.Data.DataOffset + index];
  1955. var date = currentData.Date;
  1956. var dateFormatString="YYYY-MM-DD";
  1957. if (this.DateFormatType==1) dateFormatString="YYYY/MM/DD";
  1958. else if (this.DateFormatType==2) dateFormatString="YYYY/MM/DD/W";
  1959. else if (this.DateFormatType==3) dateFormatString="DD/MM/YYYY";
  1960. this.Text = IFrameSplitOperator.FormatDateString(date,dateFormatString,this.LanguageID);
  1961. if (ChartData.IsMinutePeriod(this.Data.Period, true)) // 分钟周期
  1962. {
  1963. var time = IFrameSplitOperator.FormatTimeString(currentData.Time);
  1964. this.Text = this.Text + " " + time;
  1965. }
  1966. else if (ChartData.IsSecondPeriod(this.Data.Period))
  1967. {
  1968. var time = IFrameSplitOperator.FormatTimeString(currentData.Time,"HH:MM:SS");
  1969. this.Text = this.Text + " " + time;
  1970. }
  1971. if (this.GetEventCallback)
  1972. {
  1973. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_FORMAT_CORSSCURSOR_X_TEXT);
  1974. if (event)
  1975. {
  1976. var data={ Item:currentData, Period:this.Data.Period, Date:currentData.Date, Time:currentData.Time,Index:this.Data.DataOffset+index, PreventDefault:false };
  1977. event.Callback(event,data,this);
  1978. if (data.PreventDefault==true) return false;
  1979. }
  1980. }
  1981. return true;
  1982. }
  1983. }
  1984. function HQMinuteTimeStringFormat()
  1985. {
  1986. this.newMethod = IChangeStringFormat; //派生
  1987. this.newMethod();
  1988. delete this.newMethod;
  1989. this.Frame;
  1990. this.Symbol;
  1991. this.Operator = function ()
  1992. {
  1993. if (this.Value == null || isNaN(this.Value)) return false;
  1994. var index = Math.abs(this.Value);
  1995. index = parseInt(index.toFixed(0));
  1996. var showIndex = index;
  1997. if (this.Frame && this.Frame.MinuteCount) showIndex = index % this.Frame.MinuteCount;
  1998. var timeStringData = JSCommonCoordinateData.MinuteTimeStringData;
  1999. var timeData = timeStringData.GetTimeData(this.Symbol);
  2000. if (!timeData) return false;
  2001. if (showIndex < 0) showIndex = 0;
  2002. else if (showIndex > timeData.length) showIndex = timeData.length - 1;
  2003. if (this.Frame && index >= this.Frame.XPointCount)
  2004. showIndex = timeData.length - 1;
  2005. var time = timeData[showIndex];
  2006. this.Text = IFrameSplitOperator.FormatTimeString(time);
  2007. if (this.GetEventCallback)
  2008. {
  2009. var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_FORMAT_CORSSCURSOR_X_TEXT);
  2010. if (event)
  2011. {
  2012. var data={ Time:time, Index:showIndex, PreventDefault:false };
  2013. event.Callback(event,data,this);
  2014. if (data.PreventDefault==true) return false;
  2015. }
  2016. }
  2017. return true;
  2018. }
  2019. }
  2020. function DivTooltipDataForamt()
  2021. {
  2022. this.DataMap=new Map(
  2023. [
  2024. ["CorssCursor_XStringFormat", { Create:function() { return new HQDateStringFormat(); } }],
  2025. ["CorssCursor_YStringFormat", { Create:function() { return new HQPriceStringFormat(); } }]
  2026. ]
  2027. );
  2028. this.Create=function(name)
  2029. {
  2030. if (!this.DataMap.has(name)) return null;
  2031. var item=this.DataMap.get(name);
  2032. return item.Create();
  2033. }
  2034. }
  2035. var g_DivTooltipDataForamt=new DivTooltipDataForamt();
  2036. //导出统一使用JSCommon命名空间名
  2037. export
  2038. {
  2039. CoordinateInfo,
  2040. IFrameSplitOperator,
  2041. FrameSplitKLinePriceY,
  2042. FrameSplitY,
  2043. FrameSplitKLineX,
  2044. FrameSplitMinutePriceY,
  2045. FrameSplitMinuteX,
  2046. FrameSplitXData,
  2047. SplitData,
  2048. PriceSplitData,
  2049. FrameSplitXDepth,
  2050. IChangeStringFormat,
  2051. HQPriceStringFormat,
  2052. HQDateStringFormat,
  2053. HQMinuteTimeStringFormat,
  2054. g_DivTooltipDataForamt,
  2055. }
  2056. /*
  2057. module.exports =
  2058. {
  2059. JSCommonSplit:
  2060. {
  2061. CoordinateInfo: CoordinateInfo,
  2062. IFrameSplitOperator: IFrameSplitOperator,
  2063. FrameSplitKLinePriceY: FrameSplitKLinePriceY,
  2064. FrameSplitY: FrameSplitY,
  2065. FrameSplitKLineX: FrameSplitKLineX,
  2066. FrameSplitMinutePriceY: FrameSplitMinutePriceY,
  2067. FrameSplitMinuteX: FrameSplitMinuteX,
  2068. FrameSplitXData: FrameSplitXData,
  2069. SplitData: SplitData,
  2070. PriceSplitData: PriceSplitData,
  2071. FrameSplitXDepth:FrameSplitXDepth,
  2072. IChangeStringFormat:IChangeStringFormat,
  2073. HQPriceStringFormat:HQPriceStringFormat,
  2074. HQDateStringFormat:HQDateStringFormat,
  2075. HQMinuteTimeStringFormat:HQMinuteTimeStringFormat,
  2076. },
  2077. JSCommonSplit_CoordinateInfo: CoordinateInfo,
  2078. JSCommonSplit_IFrameSplitOperator: IFrameSplitOperator,
  2079. JSCommonSplit_FrameSplitKLinePriceY: FrameSplitKLinePriceY,
  2080. JSCommonSplit_FrameSplitY: FrameSplitY,
  2081. JSCommonSplit_FrameSplitKLineX: FrameSplitKLineX,
  2082. JSCommonSplit_FrameSplitMinutePriceY: FrameSplitMinutePriceY,
  2083. JSCommonSplit_FrameSplitMinuteX: FrameSplitMinuteX,
  2084. JSCommonSplit_FrameSplitXData: FrameSplitXData,
  2085. JSCommonSplit_SplitData: SplitData,
  2086. JSCommonSplit_PriceSplitData: PriceSplitData,
  2087. JSCommonSplit_FrameSplitXDepth:FrameSplitXDepth,
  2088. JSCommonFormat_IChangeStringFormat:IChangeStringFormat,
  2089. JSCommonFormat_HQPriceStringFormat:HQPriceStringFormat,
  2090. JSCommonFormat_HQDateStringFormat:HQDateStringFormat,
  2091. JSCommonFormat_HQMinuteTimeStringFormat:HQMinuteTimeStringFormat,
  2092. JSCommonFormat_Global_DataFormat :g_DivTooltipDataForamt,
  2093. };
  2094. */