
import win.ui;
import web.json;
import inet.http;
import web.view;
/*DSG{{*/
var winform = win.form(text="aardio 显示股票K线(By: Mr_MAO)";right=815;bottom=583)
winform.add(
combobox={cls="combobox";left=144;top=16;right=344;bottom=40;dl=1;dt=1;edge=1;items={};mode="dropdownlist";z=5};
custom={cls="custom";text="自定义控件";left=16;top=48;right=800;bottom=336;bgcolor=0xFFFFFF;border=1;dl=1;dr=1;dt=1;edge=1;z=2};
listview={cls="listview";left=16;top=344;right=800;bottom=568;db=1;dl=1;dr=1;edge=1;fullRow=1;gridLines=1;z=1};
splitter={cls="splitter";left=16;top=336;right=800;bottom=341;dl=1;dr=1;horz=1;z=3};
static={cls="static";text="选择要查看的股票:";left=16;top=19;right=136;bottom=43;dl=1;dt=1;transparent=1;z=4}
)
/*}}*/
winform.splitter.split( winform.listview, winform.custom );
//初始化web.view
var wb = web.view(winform.custom);
var html = /**
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.2.0/echarts.min.js"></script>
<style>html,body,#main{width:100%;height:100%;margin:0;padding:0;overflow:hidden;}</style>
</head>
<body>
<div id="main"></div>
<script>
var myChart = echarts.init(document.getElementById('main'));
window.renderChart = function(stockName, dates, dataValues) {
var option = {
title: { text: stockName },
tooltip: {
trigger: 'axis',
axisPointer: { type: 'cross' }
},
grid: { left: '10%', right: '5%', bottom: '15%' },
xAxis: {
type: 'category',
data: dates,
scale: true,
boundaryGap: false,
axisLine: { onZero: false },
splitLine: { show: false },
},
yAxis: {
scale: true,
splitArea: { show: true }
},
dataZoom: [{ type: 'inside', start: 0, end: 100 }],
series: [
{
name: '日K',
type: 'candlestick',
data: dataValues,
itemStyle: {
color: '#ec0000',
color0: '#00da3c',
borderColor: '#8A0000',
borderColor0: '#008F28'
}
}
]
};
myChart.setOption(option, true);
}
window.onresize = function(){ myChart.resize(); }
</script>
</body>
</html>
**/
wb.html = html;
//初始化combo
var stockData = {
{ name="贵州茅台"; code="600519" };
{ name="隆基绿能"; code="601012" };
{ name="招商银行"; code="600036" };
{ name="宁德时代"; code="300750" };
{ name="金力永磁"; code="300748" };
{ name="比亚迪"; code="002594" };
{ name="五粮液"; code="000858" };
}
var items = {};
for(i=1;#stockData;1){
table.push(items, stockData[i].name);
}
winform.combobox.items = items;
winform.combobox.dataList = stockData;
// 初始化 ListView
winform.listview.insertColumn("日期", 90);
winform.listview.insertColumn("开盘价", 100,,2/*_LVCFMT_CENTER*/);
winform.listview.insertColumn("收盘价", 100,,2/*_LVCFMT_CENTER*/);
winform.listview.insertColumn("最高价", 100,,2/*_LVCFMT_CENTER*/);
winform.listview.insertColumn("最低价", 100,,2/*_LVCFMT_CENTER*/);
winform.listview.insertColumn("成交量(万元)", 150,,2/*_LVCFMT_CENTER*/);
winform.listview.setColumn({fmt=2/*_LVCFMT_CENTER*/}, 1)
// 核心功能:获取腾讯股票数据(**仅供学习和实验用,调用频繁会被封IP)
var getStockHistory = function(stockCode){
var tmNow = time.now();
var tmStart = time.now();
tmStart.addmonth(-1);
var queryEndDate = tostring(tmNow, "%Y-%m-%d");
var queryStartDate = tostring(tmStart, "%Y-%m-%d");
var prefix = "";
if( !string.startWith(stockCode, "sh") && !string.startWith(stockCode, "sz") ){
prefix = string.startWith(stockCode, "6") ? "sh" : "sz";
}
var fullCode = prefix + stockCode;
var paramStr = string.format("%s,day,%s,%s,1000,qfq", fullCode, queryStartDate, queryEndDate);
var apiUrl = "http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param=" + paramStr;
var http = inet.http();
http.flags = 0x80000000;
http.addHeaders = {
"Referer": "https://gu.qq.com/";
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";
};
var jsonStr = http.get(apiUrl);
http.close();
if(!jsonStr) return null;
var result = web.json.parse(jsonStr);
if(!result || result.code != 0) return null;
var stockObj = null;
if(result.data){
for(k,v in result.data){
if(type(v) == "table"){
stockObj = v;
break;
}
}
}
var klineList = stockObj["qfqday"] : stockObj["day"];
return klineList;
}
var showInListview = function(stockData){
if(!stockData) return;
winform.listview.clear();
for(i=#stockData; 1; -1){
var item = stockData[i];
winform.listview.insertItem({
item[1];item[2]; item[3]; item[4]; item[5]; item[6]
}, 1);
}
}
var showInEchart = function(stockName, stockData){
if(!stockData) return;
var chartDates = {};
var chartValues = {};
for(i=1;#stockData;1){
var item = stockData[i];
var d = item[1];
var o = tonumber(item[2]);
var c = tonumber(item[3]);
var h = tonumber(item[4]);
var l = tonumber(item[5]);
var v = item[6];
table.push(chartDates, d);
table.push(chartValues, { o; c; l; h });
}
wb.xcall("renderChart", stockName, chartDates, chartValues);
}
winform.combobox.onSelChange = function(){
var idx = owner.selIndex;
if(!idx) return;
var stockInfo = winform.combobox.dataList[idx];
var code = stockInfo.code;
var name = stockInfo.name;
winform.text = "正在获取数据: " + name + " (" + code + ")...";
var klines = getStockHistory(code);
if(!klines || !#klines){
winform.text = "暂无数据或网络错误 - " + name;
return;
}
winform.text = "腾讯财经数据 - " + name + "(By: Mr_MAO)";
showInListview(klines);
showInEchart(name, klines);
}
winform.show();
win.ui.waitCursor(true);
winform.text = "正在初始化图表... "
wb.wait("");
winform.combobox.selIndex = 1;
winform.combobox.onSelChange();
win.ui.waitCursor(false);
win.loopMessage();