HQChartControl.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <template>
  2. <!-- #ifdef H5 -->
  3. <div class='kline' v-bind:id='KLineID' v-bind:style="{width: ChartWidth+'px', height: ChartHeight+'px'}" ref='kline'></div>
  4. <!-- #endif -->
  5. <!-- #ifndef H5 -->
  6. <canvas v-bind:id='KLineID' v-bind:canvas-id='KLineID' class='kline2' v-bind:style="{width: ChartWidth+'px', height: ChartHeight+'px'}"
  7. @touchstart="KLineTouchStart" @touchmove='KLineTouchMove' @touchend='KLineTouchEnd' ></canvas>
  8. <!-- #endif -->
  9. </template>
  10. <script>
  11. /*
  12. copyright (c) 2018 jones
  13. http://www.apache.org/licenses/LICENSE-2.0
  14. 开源项目 https://github.com/jones2000/HQChart
  15. jones_2000@163.com
  16. HQChart简单的模板类
  17. */
  18. // #ifdef H5
  19. import HQChart from './umychart.uniapp.h5.js'
  20. // #endif
  21. // #ifndef H5
  22. import {JSCommon} from './umychart.wechat.3.0.js'
  23. import {JSCommonHQStyle} from './umychart.style.wechat.js'
  24. import {JSConsole} from './umychart.console.wechat.js'
  25. //禁用日志
  26. //JSConsole.Complier.Log=()=>{ };
  27. //JSConsole.Chart.Log=()=>{ };
  28. // #endif
  29. function DefaultData() { }
  30. DefaultData.GetKLineOption = function ()
  31. {
  32. let data =
  33. {
  34. Type: '历史K线图',
  35. Windows: //窗口指标
  36. [
  37. {Index:"MA",Modify: false, Change: false},
  38. {Index:"VOL",Modify: false, Change: false}
  39. /*
  40. {
  41. Index:'多线段指标',Modify: false, Change: false,
  42. API:
  43. {
  44. Name:'多线段指标',
  45. Script:null,
  46. Args:null,
  47. Url:'http://127.0.0.1:18080/api/jsindex'
  48. }
  49. }
  50. */
  51. ],
  52. IsAutoUpdate:true,
  53. IsCorssOnlyDrawKLine:true,
  54. CorssCursorTouchEnd:true,
  55. IsClickShowCorssCursor:true,
  56. CorssCursorInfo:{ Left:2, Right:2, Bottom:1, IsShowCorss:true}, //十字光标刻度设置
  57. //IsFullDraw:true,
  58. Border: //边框
  59. {
  60. Left: 1,
  61. Right: 1, //右边间距
  62. Top: 25,
  63. Bottom: 25,
  64. },
  65. KLine:
  66. {
  67. DragMode:1,
  68. Right:1, //复权 0 不复权 1 前复权 2 后复权
  69. Period:0, //周期: 0 日线 1 周线 2 月线 3 年线
  70. PageSize:30,
  71. IsShowTooltip:false,
  72. DrawType:0,
  73. DataWidth:10
  74. },
  75. ExtendChart:
  76. [
  77. {Name:'KLineTooltip' }, //开启手机端tooltip
  78. ],
  79. Frame: //子框架设置
  80. [
  81. {SplitCount:3,Custom: [{ Type: 0, Position: 'right'}]},
  82. {SplitCount:2},
  83. {SplitCount:3},
  84. ],
  85. };
  86. return data;
  87. }
  88. DefaultData.GetMinuteOption=function()
  89. {
  90. var option=
  91. {
  92. Type:'分钟走势图', //创建图形类型
  93. Windows: //窗口指标
  94. [
  95. ],
  96. IsAutoUpdate:true, //是自动更新数据
  97. DayCount:1, //1 最新交易日数据 >1 多日走势图
  98. IsShowRightMenu:false, //是否显示右键菜单
  99. CorssCursorTouchEnd:true,
  100. IsClickShowCorssCursor:true,
  101. //IsFullDraw:true,
  102. MinuteLine:
  103. {
  104. //IsDrawAreaPrice:false, //是否画价格面积图
  105. },
  106. Border: //边框
  107. {
  108. Left:1, //左边间距
  109. Right:1, //右边间距
  110. Top:20,
  111. Bottom:20
  112. },
  113. Frame: //子框架设置
  114. [
  115. {SplitCount:3},
  116. {SplitCount:2},
  117. {SplitCount:3},
  118. ],
  119. ExtendChart: //扩展图形
  120. [
  121. {Name:'MinuteTooltip' } //手机端tooltip
  122. ],
  123. };
  124. return option;
  125. }
  126. DefaultData.CreateGuid=function()
  127. {
  128. function S4()
  129. {
  130. return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
  131. }
  132. return "guid" + (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
  133. }
  134. var g_JSChart=new Map();
  135. export default
  136. {
  137. name:"HQChartControl",
  138. props:
  139. [
  140. 'DefaultSymbol',
  141. 'DefaultChart'
  142. ],
  143. data()
  144. {
  145. let data=
  146. {
  147. Symbol:'600000.sh',
  148. ChartWidth:350,
  149. ChartHeight:500,
  150. KLineID:"HQChart_"+DefaultData.CreateGuid(),
  151. KLine:
  152. {
  153. Option:DefaultData.GetKLineOption(),
  154. },
  155. Minute:
  156. {
  157. Option:DefaultData.GetMinuteOption(),
  158. },
  159. ChartType:"KLine",
  160. };
  161. return data;
  162. },
  163. created()
  164. {
  165. if (this.DefaultSymbol) this.Symbol=this.DefaultSymbol; //默认股票
  166. if (this.DefaultChart)
  167. {
  168. //TODO:默认天数,周期在这里加
  169. if (this.DefaultChart.Type=='Minute')
  170. {
  171. this.ChartType="Minute";
  172. }
  173. else
  174. {
  175. this.ChartType="KLine";
  176. }
  177. }
  178. },
  179. methods:
  180. {
  181. SetSize(width, height)
  182. {
  183. this.ChartWidth=width;
  184. this.ChartHeight=height;
  185. },
  186. GetJSChart()
  187. {
  188. if (g_JSChart.has(this.KLineID)) return g_JSChart.get(this.KLineID);
  189. return null;
  190. },
  191. SetJSChart(jsChart)
  192. {
  193. g_JSChart.set(this.KLineID,jsChart)
  194. },
  195. ClearChart()
  196. {
  197. console.log("[ClearChart] clear");
  198. var jsChart=this.GetJSChart();
  199. if (jsChart)
  200. {
  201. jsChart.ChartDestory();
  202. this.SetJSChart(null);
  203. }
  204. // #ifdef H5
  205. var divKLine=document.getElementById(this.KLineID);
  206. while (divKLine.hasChildNodes())
  207. {
  208. divKLine.removeChild(divKLine.lastChild);
  209. } 
  210. // #endif
  211. },
  212. OnSize()
  213. {
  214. // #ifdef H5
  215. this.OnSize_h5();
  216. // #endif
  217. },
  218. OnSize_h5()
  219. {
  220. var chartHeight = this.ChartHeight;
  221. var chartWidth = this.ChartWidth;
  222. var kline=this.$refs.kline;
  223. kline.style.width=chartWidth+'px';
  224. kline.style.height=chartHeight+'px';
  225. var jsChart=this.GetJSChart();
  226. if (jsChart) jsChart.OnSize();
  227. },
  228. CreateHQChart()
  229. {
  230. if (this.ChartType=="Minute") this.CreateMinuteChart();
  231. else this.CreateKLineChart();
  232. },
  233. CreateKLineChart_h5() //创建K线图
  234. {
  235. this.ClearChart();
  236. var whiteStyle=HQChart.HQChartStyle.GetStyleConfig(HQChart.STYLE_TYPE_ID.WHITE_ID);
  237. HQChart.JSChart.SetStyle(whiteStyle);
  238. //this.$refs.kline.style.backgroundColor=whiteStyle.BGColor; //div背景色设置黑色
  239. var chart=HQChart.JSChart.Init(this.$refs.kline);
  240. this.KLine.Option.Symbol=this.Symbol;
  241. this.KLine.Option.NetworkFilter=this.NetworkFilter;
  242. this.KLine.Option.IsShowMaxMinPrice=false;
  243. chart.SetOption(this.KLine.Option);
  244. this.SetJSChart(chart);
  245. return chart;
  246. },
  247. CreateKLineChart_app()
  248. {
  249. this.ClearChart();
  250. var element = new JSCommon.JSCanvasElement();
  251. // #ifdef APP-PLUS
  252. element.IsUniApp=true; //canvas需要指定下 是uniapp的app
  253. // #endif
  254. element.ID = this.KLineID;
  255. element.Height = this.ChartHeight; //高度宽度需要手动绑定!!
  256. element.Width = this.ChartWidth;
  257. var whiteStyle=JSCommonHQStyle.GetStyleConfig(JSCommonHQStyle.STYLE_TYPE_ID.WHITE_ID);
  258. JSCommon.JSChart.SetStyle(whiteStyle);
  259. var chart = JSCommon.JSChart.Init(element);
  260. this.KLine.Option.NetworkFilter=this.NetworkFilter;
  261. this.KLine.Option.Symbol=this.Symbol;
  262. this.KLine.Option.IsClickShowCorssCursor=true;
  263. this.KLine.Option.IsFullDraw=true; //每次手势移动全屏重绘
  264. this.KLine.Option.IsShowMaxMinPrice=false;
  265. chart.SetOption(this.KLine.Option);
  266. this.SetJSChart(chart);
  267. return chart;
  268. },
  269. CreateKLineChart()
  270. {
  271. this.ChartType="KLine";
  272. // #ifdef H5
  273. return this.CreateKLineChart_h5();
  274. // #endif
  275. // #ifndef H5
  276. return this.CreateKLineChart_app();
  277. // #endif
  278. },
  279. CreateMinuteChart_h5() //创建日线图
  280. {
  281. this.ClearChart();
  282. var whiteStyle=HQChart.HQChartStyle.GetStyleConfig(HQChart.STYLE_TYPE_ID.WHITE_ID);
  283. HQChart.JSChart.SetStyle(whiteStyle);
  284. //this.$refs.kline.style.backgroundColor=whiteStyle.BGColor; //div背景色设置黑色
  285. var chart=HQChart.JSChart.Init(this.$refs.kline);
  286. this.Minute.Option.Symbol=this.Symbol;
  287. this.Minute.Option.NetworkFilter=this.NetworkFilter;
  288. chart.SetOption(this.Minute.Option);
  289. this.SetJSChart(chart);
  290. return chart;
  291. },
  292. CreateMinuteChart_app()
  293. {
  294. this.ClearChart();
  295. var element = new JSCommon.JSCanvasElement();
  296. // #ifdef APP-PLUS
  297. element.IsUniApp=true; //canvas需要指定下 是uniapp的app
  298. // #endif
  299. element.ID = this.KLineID;
  300. element.Height = this.ChartHeight; //高度宽度需要手动绑定!!
  301. element.Width = this.ChartWidth;
  302. //用黑色风格
  303. //var whiteStyle=JSCommonHQStyle.GetStyleConfig(JSCommonHQStyle.STYLE_TYPE_ID.WHITE_ID);
  304. //JSCommon.JSChart.SetStyle(whiteStyle);
  305. //var testttt=JSCommon.MARKET_SUFFIX_NAME.GetSHODecimal();
  306. //JSCommon.MARKET_SUFFIX_NAME.GetSHODecimal=(symbol)=>{ return 4; }; //设置期权代码
  307. var chart = JSCommon.JSChart.Init(element);
  308. this.Minute.Option.NetworkFilter=this.NetworkFilter;
  309. this.Minute.Option.Symbol=this.Symbol;
  310. this.Minute.Option.IsFullDraw=true; //每次手势移动全屏重绘
  311. chart.SetOption(this.Minute.Option);
  312. this.SetJSChart(chart);
  313. return chart;
  314. },
  315. CreateMinuteChart()
  316. {
  317. this.ChartType="Minute";
  318. // #ifdef H5
  319. return this.CreateMinuteChart_h5();
  320. // #endif
  321. // #ifndef H5
  322. return this.CreateMinuteChart_app();
  323. // #endif
  324. },
  325. IsKLineChart()
  326. {
  327. var jsChart=this.GetJSChart();
  328. if (!jsChart) return false;
  329. var className=jsChart.JSChartContainer.ClassName;
  330. if (className=="KLineChartContainer" || className=="KLineChartHScreenContainer") return true;
  331. return false;
  332. },
  333. IsMinuteChart()
  334. {
  335. var jsChart=this.GetJSChart();
  336. var className=jsChart.JSChartContainer.ClassName;
  337. if (className=="MinuteChartContainer" || className=="MinuteChartHScreenContainer") return true;
  338. return false;
  339. },
  340. //K线周期切换
  341. ChangeKLinePeriod(period)
  342. {
  343. var jsChart=this.GetJSChart();
  344. this.KLine.Option.KLine.Period=period;
  345. if (this.IsKLineChart() && jsChart)
  346. {
  347. jsChart.ChangePeriod(period);
  348. }
  349. else
  350. {
  351. this.CreateKLineChart();
  352. }
  353. },
  354. //走势图多日切换
  355. ChangeMinutePeriod(dayCount)
  356. {
  357. var jsChart=this.GetJSChart();
  358. this.Minute.Option.DayCount=dayCount;
  359. if (this.IsMinuteChart() && jsChart)
  360. {
  361. jsChart.ChangeDayCount(dayCount);
  362. }
  363. else
  364. {
  365. this.CreateMinuteChart(); //类型不对 删了重建
  366. }
  367. },
  368. //切换指标 windowId=窗口索引 name=指标名字
  369. ChangeKLineIndex(windowId,name)
  370. {
  371. var jsChart=this.GetJSChart();
  372. if (this.IsKLineChart() && jsChart) jsChart.ChangeIndex(windowId,name);
  373. },
  374. ChangeScriptIndex(windowId,indexdata){
  375. //{Name:指标名字, Script:指标脚本, Args:指标参数(数组) }
  376. //console.log(indexdata);
  377. var jsChart=this.GetJSChart();
  378. if (this.IsKLineChart() && jsChart) jsChart.ChangeScriptIndex(windowId,indexdata);
  379. },
  380. ChangeInstructionScriptIndex(indexdata){
  381. //{Name:指标名字, Script:指标脚本, Args:指标参数(数组) }
  382. //console.log(indexdata);
  383. var jsChart=this.GetJSChart();
  384. if (this.IsKLineChart() && jsChart) jsChart.ChangeInstructionScriptIndex(indexdata);
  385. },
  386. //切换股票
  387. ChangeSymbol(symbol)
  388. {
  389. this.Symbol=symbol;
  390. var jsChart=this.GetJSChart();
  391. if (jsChart) jsChart.ChangeSymbol(symbol);
  392. },
  393. ///////////////////////////////////////////////
  394. //手势事件 app/小程序才有
  395. //KLine事件
  396. KLineTouchStart(event)
  397. {
  398. var jsChart=this.GetJSChart();
  399. if (jsChart) jsChart.OnTouchStart(event);
  400. },
  401. KLineTouchMove (event)
  402. {
  403. var jsChart=this.GetJSChart();
  404. if (jsChart) jsChart.OnTouchMove(event);
  405. },
  406. KLineTouchEnd (event)
  407. {
  408. var jsChart=this.GetJSChart();
  409. if (jsChart) jsChart.OnTouchEnd(event);
  410. },
  411. /////////////////////////////////////////////////////////////////////////////////////////
  412. NetworkFilter(data, callback)
  413. {
  414. console.log(`[HQChartTemplate:NetworkFilter] Name=${data.Name} Explain=${data.Explain}` );
  415. },
  416. },
  417. }
  418. </script>
  419. <style>
  420. </style>