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.
511 lines
11 KiB
511 lines
11 KiB
<template>
|
|
|
|
<!-- #ifdef H5 -->
|
|
<div class='kline' v-bind:id='KLineID' v-bind:style="{width: ChartWidth+'px', height: ChartHeight+'px'}" ref='kline'></div>
|
|
<!-- #endif -->
|
|
|
|
<!-- #ifndef H5 -->
|
|
|
|
<canvas v-bind:id='KLineID' v-bind:canvas-id='KLineID' class='kline2' v-bind:style="{width: ChartWidth+'px', height: ChartHeight+'px'}"
|
|
@touchstart="KLineTouchStart" @touchmove='KLineTouchMove' @touchend='KLineTouchEnd' ></canvas>
|
|
|
|
<!-- #endif -->
|
|
|
|
</template>
|
|
|
|
<script>
|
|
|
|
/*
|
|
copyright (c) 2018 jones
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
开源项目 https://github.com/jones2000/HQChart
|
|
|
|
jones_2000@163.com
|
|
|
|
HQChart简单的模板类
|
|
*/
|
|
|
|
// #ifdef H5
|
|
import HQChart from './umychart.uniapp.h5.js'
|
|
// #endif
|
|
|
|
// #ifndef H5
|
|
import {JSCommon} from './umychart.wechat.3.0.js'
|
|
import {JSCommonHQStyle} from './umychart.style.wechat.js'
|
|
import {JSConsole} from './umychart.console.wechat.js'
|
|
|
|
//禁用日志
|
|
//JSConsole.Complier.Log=()=>{ };
|
|
//JSConsole.Chart.Log=()=>{ };
|
|
// #endif
|
|
|
|
function DefaultData() { }
|
|
|
|
DefaultData.GetKLineOption = function ()
|
|
{
|
|
let data =
|
|
{
|
|
Type: '历史K线图',
|
|
|
|
Windows: //窗口指标
|
|
[
|
|
{Index:"MA",Modify: false, Change: false},
|
|
{Index:"VOL",Modify: false, Change: false}
|
|
/*
|
|
{
|
|
Index:'多线段指标',Modify: false, Change: false,
|
|
API:
|
|
{
|
|
Name:'多线段指标',
|
|
Script:null,
|
|
Args:null,
|
|
Url:'http://127.0.0.1:18080/api/jsindex'
|
|
}
|
|
}
|
|
*/
|
|
],
|
|
|
|
IsAutoUpdate:true,
|
|
IsCorssOnlyDrawKLine:true,
|
|
CorssCursorTouchEnd:true,
|
|
IsClickShowCorssCursor:true,
|
|
CorssCursorInfo:{ Left:2, Right:2, Bottom:1, IsShowCorss:true}, //十字光标刻度设置
|
|
//IsFullDraw:true,
|
|
|
|
Border: //边框
|
|
{
|
|
Left: 1,
|
|
Right: 1, //右边间距
|
|
Top: 25,
|
|
Bottom: 25,
|
|
},
|
|
|
|
KLine:
|
|
{
|
|
DragMode:1,
|
|
Right:1, //复权 0 不复权 1 前复权 2 后复权
|
|
Period:0, //周期: 0 日线 1 周线 2 月线 3 年线
|
|
PageSize:30,
|
|
IsShowTooltip:false,
|
|
DrawType:0,
|
|
DataWidth:10
|
|
},
|
|
|
|
ExtendChart:
|
|
[
|
|
{Name:'KLineTooltip' }, //开启手机端tooltip
|
|
],
|
|
|
|
Frame: //子框架设置
|
|
[
|
|
{SplitCount:3,Custom: [{ Type: 0, Position: 'right'}]},
|
|
{SplitCount:2},
|
|
{SplitCount:3},
|
|
],
|
|
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
DefaultData.GetMinuteOption=function()
|
|
{
|
|
var option=
|
|
{
|
|
Type:'分钟走势图', //创建图形类型
|
|
|
|
Windows: //窗口指标
|
|
[
|
|
|
|
],
|
|
|
|
IsAutoUpdate:true, //是自动更新数据
|
|
DayCount:1, //1 最新交易日数据 >1 多日走势图
|
|
IsShowRightMenu:false, //是否显示右键菜单
|
|
CorssCursorTouchEnd:true,
|
|
IsClickShowCorssCursor:true,
|
|
//IsFullDraw:true,
|
|
|
|
MinuteLine:
|
|
{
|
|
//IsDrawAreaPrice:false, //是否画价格面积图
|
|
},
|
|
|
|
Border: //边框
|
|
{
|
|
Left:1, //左边间距
|
|
Right:1, //右边间距
|
|
Top:20,
|
|
Bottom:20
|
|
},
|
|
|
|
Frame: //子框架设置
|
|
[
|
|
{SplitCount:3},
|
|
{SplitCount:2},
|
|
{SplitCount:3},
|
|
],
|
|
|
|
ExtendChart: //扩展图形
|
|
[
|
|
{Name:'MinuteTooltip' } //手机端tooltip
|
|
],
|
|
};
|
|
|
|
return option;
|
|
}
|
|
|
|
DefaultData.CreateGuid=function()
|
|
{
|
|
function S4()
|
|
{
|
|
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
|
|
}
|
|
|
|
return "guid" + (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
|
|
}
|
|
|
|
var g_JSChart=new Map();
|
|
|
|
export default
|
|
{
|
|
name:"HQChartControl",
|
|
|
|
props:
|
|
[
|
|
'DefaultSymbol',
|
|
'DefaultChart'
|
|
],
|
|
|
|
|
|
data()
|
|
{
|
|
let data=
|
|
{
|
|
Symbol:'600000.sh',
|
|
ChartWidth:350,
|
|
ChartHeight:500,
|
|
KLineID:"HQChart_"+DefaultData.CreateGuid(),
|
|
|
|
KLine:
|
|
{
|
|
Option:DefaultData.GetKLineOption(),
|
|
},
|
|
|
|
Minute:
|
|
{
|
|
Option:DefaultData.GetMinuteOption(),
|
|
},
|
|
|
|
ChartType:"Minute",
|
|
};
|
|
|
|
return data;
|
|
},
|
|
|
|
created()
|
|
{
|
|
if (this.DefaultSymbol) this.Symbol=this.DefaultSymbol; //默认股票
|
|
if (this.DefaultChart)
|
|
{
|
|
//TODO:默认天数,周期在这里加
|
|
if (this.DefaultChart.Type=='Minute')
|
|
{
|
|
this.ChartType="Minute";
|
|
}
|
|
else
|
|
{
|
|
this.ChartType="KLine";
|
|
}
|
|
}
|
|
},
|
|
|
|
methods:
|
|
{
|
|
SetSize(width, height)
|
|
{
|
|
this.ChartWidth=width;
|
|
this.ChartHeight=height;
|
|
},
|
|
|
|
GetJSChart()
|
|
{
|
|
if (g_JSChart.has(this.KLineID)) return g_JSChart.get(this.KLineID);
|
|
|
|
return null;
|
|
},
|
|
|
|
SetJSChart(jsChart)
|
|
{
|
|
g_JSChart.set(this.KLineID,jsChart)
|
|
},
|
|
|
|
ClearChart()
|
|
{
|
|
console.log("[ClearChart] clear");
|
|
var jsChart=this.GetJSChart();
|
|
if (jsChart)
|
|
{
|
|
jsChart.ChartDestory();
|
|
this.SetJSChart(null);
|
|
}
|
|
|
|
// #ifdef H5
|
|
var divKLine=document.getElementById(this.KLineID);
|
|
while (divKLine.hasChildNodes())
|
|
{
|
|
divKLine.removeChild(divKLine.lastChild);
|
|
}
|
|
// #endif
|
|
},
|
|
|
|
OnSize()
|
|
{
|
|
// #ifdef H5
|
|
this.OnSize_h5();
|
|
// #endif
|
|
},
|
|
|
|
OnSize_h5()
|
|
{
|
|
var chartHeight = this.ChartHeight;
|
|
var chartWidth = this.ChartWidth;
|
|
|
|
var kline=this.$refs.kline;
|
|
kline.style.width=chartWidth+'px';
|
|
kline.style.height=chartHeight+'px';
|
|
|
|
var jsChart=this.GetJSChart();
|
|
if (jsChart) jsChart.OnSize();
|
|
},
|
|
|
|
CreateHQChart()
|
|
{
|
|
if (this.ChartType=="Minute") this.CreateMinuteChart();
|
|
else this.CreateKLineChart();
|
|
},
|
|
|
|
CreateKLineChart_h5() //创建K线图
|
|
{
|
|
this.ClearChart();
|
|
|
|
var blackStyle=HQChart.HQChartStyle.GetStyleConfig(HQChart.STYLE_TYPE_ID.BLACK_ID);
|
|
HQChart.JSChart.SetStyle(blackStyle);
|
|
//this.$refs.kline.style.backgroundColor=blackStyle.BGColor; //div背景色设置黑色
|
|
|
|
var chart=HQChart.JSChart.Init(this.$refs.kline);
|
|
|
|
this.KLine.Option.Symbol=this.Symbol;
|
|
this.KLine.Option.NetworkFilter=this.NetworkFilter;
|
|
|
|
chart.SetOption(this.KLine.Option);
|
|
|
|
this.SetJSChart(chart);
|
|
|
|
return chart;
|
|
},
|
|
|
|
CreateKLineChart_app()
|
|
{
|
|
this.ClearChart();
|
|
|
|
var element = new JSCommon.JSCanvasElement();
|
|
// #ifdef APP-PLUS
|
|
element.IsUniApp=true; //canvas需要指定下 是uniapp的app
|
|
// #endif
|
|
element.ID = this.KLineID;
|
|
element.Height = this.ChartHeight; //高度宽度需要手动绑定!!
|
|
element.Width = this.ChartWidth;
|
|
|
|
var blackStyle=JSCommonHQStyle.GetStyleConfig(JSCommonHQStyle.STYLE_TYPE_ID.BLACK_ID);
|
|
|
|
JSCommon.JSChart.SetStyle(blackStyle);
|
|
|
|
var chart = JSCommon.JSChart.Init(element);
|
|
this.KLine.Option.NetworkFilter=this.NetworkFilter;
|
|
this.KLine.Option.Symbol=this.Symbol;
|
|
this.KLine.Option.IsClickShowCorssCursor=true;
|
|
this.KLine.Option.IsFullDraw=true; //每次手势移动全屏重绘
|
|
chart.SetOption(this.KLine.Option);
|
|
|
|
this.SetJSChart(chart);
|
|
|
|
return chart;
|
|
},
|
|
|
|
CreateKLineChart()
|
|
{
|
|
this.ChartType="KLine";
|
|
|
|
// #ifdef H5
|
|
return this.CreateKLineChart_h5();
|
|
// #endif
|
|
|
|
// #ifndef H5
|
|
return this.CreateKLineChart_app();
|
|
// #endif
|
|
},
|
|
|
|
CreateMinuteChart_h5() //创建日线图
|
|
{
|
|
this.ClearChart();
|
|
|
|
var blackStyle=HQChart.HQChartStyle.GetStyleConfig(HQChart.STYLE_TYPE_ID.BLACK_ID);
|
|
HQChart.JSChart.SetStyle(blackStyle);
|
|
//this.$refs.kline.style.backgroundColor=blackStyle.BGColor; //div背景色设置黑色
|
|
|
|
var chart=HQChart.JSChart.Init(this.$refs.kline);
|
|
this.Minute.Option.Symbol=this.Symbol;
|
|
this.Minute.Option.NetworkFilter=this.NetworkFilter;
|
|
chart.SetOption(this.Minute.Option);
|
|
|
|
this.SetJSChart(chart);
|
|
|
|
return chart;
|
|
},
|
|
|
|
CreateMinuteChart_app()
|
|
{
|
|
this.ClearChart();
|
|
|
|
var element = new JSCommon.JSCanvasElement();
|
|
// #ifdef APP-PLUS
|
|
element.IsUniApp=true; //canvas需要指定下 是uniapp的app
|
|
// #endif
|
|
element.ID = this.KLineID;
|
|
element.Height = this.ChartHeight; //高度宽度需要手动绑定!!
|
|
element.Width = this.ChartWidth;
|
|
|
|
//用黑色风格
|
|
//var blackStyle=JSCommonHQStyle.GetStyleConfig(JSCommonHQStyle.STYLE_TYPE_ID.BLACK_ID);
|
|
//JSCommon.JSChart.SetStyle(blackStyle);
|
|
//var testttt=JSCommon.MARKET_SUFFIX_NAME.GetSHODecimal();
|
|
//JSCommon.MARKET_SUFFIX_NAME.GetSHODecimal=(symbol)=>{ return 4; }; //设置期权代码
|
|
|
|
var chart = JSCommon.JSChart.Init(element);
|
|
|
|
this.Minute.Option.NetworkFilter=this.NetworkFilter;
|
|
this.Minute.Option.Symbol=this.Symbol;
|
|
this.Minute.Option.IsFullDraw=true; //每次手势移动全屏重绘
|
|
chart.SetOption(this.Minute.Option);
|
|
|
|
this.SetJSChart(chart);
|
|
|
|
return chart;
|
|
},
|
|
|
|
CreateMinuteChart()
|
|
{
|
|
this.ChartType="Minute";
|
|
|
|
// #ifdef H5
|
|
return this.CreateMinuteChart_h5();
|
|
// #endif
|
|
|
|
// #ifndef H5
|
|
return this.CreateMinuteChart_app();
|
|
// #endif
|
|
},
|
|
|
|
IsKLineChart()
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
if (!jsChart) return false;
|
|
var className=jsChart.JSChartContainer.ClassName;
|
|
if (className=="KLineChartContainer" || className=="KLineChartHScreenContainer") return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
IsMinuteChart()
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
var className=jsChart.JSChartContainer.ClassName;
|
|
if (className=="MinuteChartContainer" || className=="MinuteChartHScreenContainer") return true;
|
|
|
|
return false;
|
|
},
|
|
|
|
//K线周期切换
|
|
ChangeKLinePeriod(period)
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
this.KLine.Option.KLine.Period=period;
|
|
if (this.IsKLineChart() && jsChart)
|
|
{
|
|
jsChart.ChangePeriod(period);
|
|
}
|
|
else
|
|
{
|
|
this.CreateKLineChart();
|
|
}
|
|
},
|
|
|
|
//走势图多日切换
|
|
ChangeMinutePeriod(dayCount)
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
this.Minute.Option.DayCount=dayCount;
|
|
if (this.IsMinuteChart() && jsChart)
|
|
{
|
|
jsChart.ChangeDayCount(dayCount);
|
|
}
|
|
else
|
|
{
|
|
this.CreateMinuteChart(); //类型不对 删了重建
|
|
}
|
|
},
|
|
|
|
//切换指标 windowId=窗口索引 name=指标名字
|
|
ChangeKLineIndex(windowId,name)
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
if (this.IsKLineChart() && jsChart) jsChart.ChangeIndex(windowId,name);
|
|
},
|
|
|
|
//切换股票
|
|
ChangeSymbol(symbol)
|
|
{
|
|
this.Symbol=symbol;
|
|
var jsChart=this.GetJSChart();
|
|
if (jsChart) jsChart.ChangeSymbol(symbol);
|
|
},
|
|
|
|
///////////////////////////////////////////////
|
|
//手势事件 app/小程序才有
|
|
//KLine事件
|
|
KLineTouchStart(event)
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
if (jsChart) jsChart.OnTouchStart(event);
|
|
},
|
|
|
|
KLineTouchMove (event)
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
if (jsChart) jsChart.OnTouchMove(event);
|
|
},
|
|
|
|
KLineTouchEnd (event)
|
|
{
|
|
var jsChart=this.GetJSChart();
|
|
if (jsChart) jsChart.OnTouchEnd(event);
|
|
},
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
NetworkFilter(data, callback)
|
|
{
|
|
console.log(`[HQChartTemplate:NetworkFilter] Name=${data.Name} Explain=${data.Explain}` );
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
<style>
|
|
</style>
|
|
|