获取API接口数据,显示股票K线图

Mr_MAO 6天前 275

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();


最新回复 (4)
  • shzhbook 6天前
    0 2
    支持并感谢分享,顶一下。
  • Xmzzz 6天前
    0 3

    牛!超实用的

  • xuyuanjun 5天前
    0 4
    这个工具很实用,但是,不能用文字搜索股票,然后进行接口数据显示有点鸡肋了
  • Mr_MAO 5天前
    0 5
    😄😄,仅仅是一个示例,不是工具哈!感觉有些人看门道,有些人看热闹!
返回