更新:重构股票和指数趋势页面,增加流通市值图表,优化数据获取逻辑,修复代码中的小错误
This commit is contained in:
Binary file not shown.
+111
-15
@@ -1,20 +1,24 @@
|
|||||||
<?php
|
<?php
|
||||||
$_REQUEST['code']=$_REQUEST['code']?$_REQUEST['code']:'sh'; #code:sh sz zx cy
|
$_REQUEST['code']=$_REQUEST['code']?$_REQUEST['code']:'000001.SH';
|
||||||
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-01-01';
|
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-01-01';
|
||||||
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:'';
|
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:'';
|
||||||
$title="指数VS两市总市值趋势";
|
$title="指数VS两市总市值趋势";
|
||||||
include_once "html/head.php";
|
include_once "html/head.php";
|
||||||
?>
|
?>
|
||||||
|
<script src="js/renderCharts.js"></script>
|
||||||
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
|
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
|
||||||
指数代码:
|
指数代码:
|
||||||
<select name='code' id='code'>
|
<select name='code' id='code'>
|
||||||
<option value='sh'>上证指数</option>
|
<option value='000001.SH'>上证指数</option>
|
||||||
<option value='sz'>深圳成指</option>
|
<option value='399001.SZ'>深圳成指</option>
|
||||||
<option value='zx'>中小板指</option>
|
<option value='399005.SZ'>中小板指</option>
|
||||||
<option value='cy'>创业板指</option>
|
<option value='399006.SZ'>创业板指</option>
|
||||||
|
<option value='000016.SH'>上证50</option>
|
||||||
|
<option value='399300.SZ'>沪深300</option>
|
||||||
|
<option value='399905.SZ'>中证500</option>
|
||||||
</select>
|
</select>
|
||||||
<script>
|
<script>
|
||||||
document.getElementById('code').value='<?=$_REQUEST['code']?>';
|
$('#code').val('<?=$_REQUEST['code']?>');
|
||||||
</script>
|
</script>
|
||||||
开始时间: <input type='date' name='t_start' id='t_start' width='30px' value='<?=$_REQUEST['t_start']?>' >
|
开始时间: <input type='date' name='t_start' id='t_start' width='30px' value='<?=$_REQUEST['t_start']?>' >
|
||||||
结束时间: <input type='date' name='t_end' id='t_end' width='30px' value='<?=$_REQUEST['t_end']?>' >
|
结束时间: <input type='date' name='t_end' id='t_end' width='30px' value='<?=$_REQUEST['t_end']?>' >
|
||||||
@@ -25,14 +29,106 @@ include_once "html/head.php";
|
|||||||
</div> </form>
|
</div> </form>
|
||||||
<div > </div>
|
<div > </div>
|
||||||
|
|
||||||
<div style="width:100%; text-align:center; " id='total_mv'>
|
<!-- 图表容器 -->
|
||||||
<iframe src="https://echart.doorcome.cn/chartFive.php?s=<?=$_REQUEST['t_start']?>&item=total_mv_all&code=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>"
|
<div id="total_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
||||||
height="400px" width="1000px"></iframe>
|
|
||||||
</div>
|
<div id="float_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
||||||
<div > </div>
|
|
||||||
<div style="width:100%; text-align:center; " id='circ_mv'>
|
<script>
|
||||||
<iframe src="https://echart.doorcome.cn/chartFive.php?s=<?=$_REQUEST['t_start']?>&item=circ_mv_all&code=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>"
|
let t_start = $('#t_start').val();
|
||||||
height="400px" width="1000px"></iframe>
|
let t_end = $('#t_end').val();
|
||||||
</div>
|
let code = $("#code").val();
|
||||||
|
let codeName=convertIndexCode(code);
|
||||||
|
url = "https://api.doorcome.cn/api/indexDatas/?tscode="+code;
|
||||||
|
url += "&start_date="+t_start+"&end_date="+t_end;
|
||||||
|
url1 = "https://api.doorcome.cn/api/indexDatas/?tscode=000001.SH";
|
||||||
|
url1 += "&start_date="+t_start+"&end_date="+t_end;
|
||||||
|
url2 = "https://api.doorcome.cn/api/indexDatas/?tscode=399001.SZ";
|
||||||
|
url2 += "&start_date="+t_start+"&end_date="+t_end;
|
||||||
|
Promise.all([
|
||||||
|
fetch(url),
|
||||||
|
fetch(url1),
|
||||||
|
fetch(url2)
|
||||||
|
])
|
||||||
|
.then(responses => Promise.all(responses.map(r => r.json())))
|
||||||
|
.then(([searchData,SHData,SZData]) => {
|
||||||
|
let dataMain=pickData(searchData, 'trade_date', 'close');
|
||||||
|
let totalMVSH=pickData(SHData, 'trade_date', 'total_mv');
|
||||||
|
let floatMVSH=pickData(SHData, 'trade_date', 'float_mv');
|
||||||
|
let totalMVSZ=pickData(SZData, 'trade_date', 'total_mv');
|
||||||
|
let floatMVSZ=pickData(SZData, 'trade_date', 'float_mv');
|
||||||
|
let data_TotalMV=mergeAndSumArrays(totalMVSH,totalMVSZ);
|
||||||
|
let data_folatMV=mergeAndSumArrays(floatMVSH,floatMVSZ);
|
||||||
|
|
||||||
|
// 图表配置:total_mv
|
||||||
|
params = {};
|
||||||
|
params.chartid='total_mv';
|
||||||
|
params.legend = [codeName,'总市值-万亿'];
|
||||||
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
||||||
|
params.data1 = dataMain;
|
||||||
|
params.data2 = data_TotalMV;
|
||||||
|
params.data2 = params.data2.map(item => {
|
||||||
|
return {
|
||||||
|
value: [
|
||||||
|
item.value[0],
|
||||||
|
parseFloat((parseFloat(item.value[1]) / 10000 / 10000 / 10000).toFixed(2))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
dataCal = calculateStats(params.data2);
|
||||||
|
params.sub_text = "总市值 Max:"+dataCal['max'];
|
||||||
|
params.sub_text += ", Min:"+dataCal['min'];
|
||||||
|
params.sub_text += ", Average:"+dataCal['avg'];
|
||||||
|
params.sub_text += ", Recent:"+dataCal['last'];
|
||||||
|
doubleLineChart(params);
|
||||||
|
|
||||||
|
// 图表配置:float_mv
|
||||||
|
params = {};
|
||||||
|
params.chartid='float_mv';
|
||||||
|
params.legend = [codeName,'流通市值-万亿'];
|
||||||
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
||||||
|
params.data1 = dataMain;
|
||||||
|
params.data2 = data_folatMV;
|
||||||
|
params.data2 = params.data2.map(item => {
|
||||||
|
return {
|
||||||
|
value: [
|
||||||
|
item.value[0],
|
||||||
|
parseFloat((parseFloat(item.value[1]) / 10000 / 10000 / 10000).toFixed(2))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
dataCal = calculateStats(params.data2);
|
||||||
|
params.sub_text = "流通市值 Max:"+dataCal['max'];
|
||||||
|
params.sub_text += ", Min:"+dataCal['min'];
|
||||||
|
params.sub_text += ", Average:"+dataCal['avg'];
|
||||||
|
params.sub_text += ", Recent:"+dataCal['last'];
|
||||||
|
doubleLineChart(params);
|
||||||
|
})
|
||||||
|
.catch(error => console.error('数据加载失败:', error));
|
||||||
|
// 函数:合并两个数组,日期相同则数字相加
|
||||||
|
function mergeAndSumArrays(arr1, arr2) {
|
||||||
|
// 创建一个 Map 来存储日期和对应的数字总和
|
||||||
|
const resultMap = new Map();
|
||||||
|
|
||||||
|
// 处理第一个数组
|
||||||
|
arr1.forEach(item => {
|
||||||
|
const [date, value] = item.value;
|
||||||
|
resultMap.set(date, (resultMap.get(date) || 0) + parseFloat(value));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 处理第二个数组
|
||||||
|
arr2.forEach(item => {
|
||||||
|
const [date, value] = item.value;
|
||||||
|
resultMap.set(date, (resultMap.get(date) || 0) + parseFloat(value));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 将 Map 转换为数组格式
|
||||||
|
const resultArray = Array.from(resultMap, ([date, totalValue]) => ({
|
||||||
|
value: [date, totalValue]
|
||||||
|
}));
|
||||||
|
|
||||||
|
return resultArray;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<?php include_once("html/footer.php"); ?>
|
<?php include_once("html/footer.php"); ?>
|
||||||
|
|
||||||
|
|||||||
+37
-6
@@ -1,4 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
|
/*
|
||||||
|
* @Author: 杨水淼 yangshuimiao@jsjd.cc
|
||||||
|
* @Date: 2025-07-08 08:16:01
|
||||||
|
* @LastEditors: 杨水淼 yangshuimiao@jsjd.cc
|
||||||
|
* @LastEditTime: 2025-07-09 16:02:10
|
||||||
|
* @FilePath: \echarts\index_trend.php
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
$title="指数VS PE/PB/PS/市值 趋势";
|
$title="指数VS PE/PB/PS/市值 趋势";
|
||||||
include_once "html/head.php";
|
include_once "html/head.php";
|
||||||
|
|
||||||
@@ -29,6 +37,7 @@ $ts_code = $_REQUEST['code'];
|
|||||||
<input type='checkbox' id='cb_pe' onclick="hideSwitch(this.id,'pe_ttm')" checked> PE_TTM 市盈率
|
<input type='checkbox' id='cb_pe' onclick="hideSwitch(this.id,'pe_ttm')" checked> PE_TTM 市盈率
|
||||||
<input type='checkbox' id='cb_pb' onclick="hideSwitch(this.id,'pb')" checked> PB 市净率
|
<input type='checkbox' id='cb_pb' onclick="hideSwitch(this.id,'pb')" checked> PB 市净率
|
||||||
<input type='checkbox' id='cb_total_mv' onclick="hideSwitch(this.id,'total_mv')" checked> 总市值
|
<input type='checkbox' id='cb_total_mv' onclick="hideSwitch(this.id,'total_mv')" checked> 总市值
|
||||||
|
<input type='checkbox' id='cb_float_mv' onclick="hideSwitch(this.id,'float_mv')" checked> 流通市值
|
||||||
</div> </form>
|
</div> </form>
|
||||||
<div > </div>
|
<div > </div>
|
||||||
<!-- 图表容器 -->
|
<!-- 图表容器 -->
|
||||||
@@ -36,13 +45,13 @@ $ts_code = $_REQUEST['code'];
|
|||||||
<div id="pb" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
<div id="pb" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
||||||
<div id="total_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
<div id="total_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
||||||
|
|
||||||
|
<div id="float_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
let t_start = $('#t_start').val();
|
let t_start = $('#t_start').val();
|
||||||
let t_end = $('#t_end').val();
|
let t_end = $('#t_end').val();
|
||||||
let code = $("#code").val();
|
let code = $("#code").val();
|
||||||
let codeName=convertIndexCode("<?=$_REQUEST['code'] ?>");
|
let codeName=convertIndexCode(code);
|
||||||
//let start_date=formatDateToYYYYMMDD("<?=$_REQUEST['t_start'] ?>");
|
|
||||||
//let end_date=formatDateToYYYYMMDD("<?=$_REQUEST['t_end'] ?>");
|
|
||||||
url = "https://api.doorcome.cn/api/indexDatas/?tscode="+code;
|
url = "https://api.doorcome.cn/api/indexDatas/?tscode="+code;
|
||||||
url += "&start_date="+t_start+"&end_date="+t_end;
|
url += "&start_date="+t_start+"&end_date="+t_end;
|
||||||
fetch(url)
|
fetch(url)
|
||||||
@@ -54,7 +63,7 @@ $ts_code = $_REQUEST['code'];
|
|||||||
params.legend = [codeName,'pe_ttm'];
|
params.legend = [codeName,'pe_ttm'];
|
||||||
params.text = params.legend[0]+' V.S '+params.legend[1];
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
||||||
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
||||||
params.data2 = pickData(parsedData, 'trade_date', 'pe_ttm')
|
params.data2 = pickData(parsedData, 'trade_date', 'pe_ttm');
|
||||||
dataCal = calculateStats(params.data2);
|
dataCal = calculateStats(params.data2);
|
||||||
params.sub_text = "TTM PE Max:"+dataCal['max'];
|
params.sub_text = "TTM PE Max:"+dataCal['max'];
|
||||||
params.sub_text += ", Min:"+dataCal['min'];
|
params.sub_text += ", Min:"+dataCal['min'];
|
||||||
@@ -67,7 +76,7 @@ $ts_code = $_REQUEST['code'];
|
|||||||
params.legend = [codeName,'pb'];
|
params.legend = [codeName,'pb'];
|
||||||
params.text = params.legend[0]+' V.S '+params.legend[1];
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
||||||
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
||||||
params.data2 = pickData(parsedData, 'trade_date', 'pb')
|
params.data2 = pickData(parsedData, 'trade_date', 'pb');
|
||||||
dataCal = calculateStats(params.data2);
|
dataCal = calculateStats(params.data2);
|
||||||
params.sub_text = "PB Max:"+dataCal['max'];
|
params.sub_text = "PB Max:"+dataCal['max'];
|
||||||
params.sub_text += ", Min:"+dataCal['min'];
|
params.sub_text += ", Min:"+dataCal['min'];
|
||||||
@@ -81,7 +90,7 @@ $ts_code = $_REQUEST['code'];
|
|||||||
params.legend = [codeName,'总市值-万亿'];
|
params.legend = [codeName,'总市值-万亿'];
|
||||||
params.text = params.legend[0]+' V.S '+params.legend[1];
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
||||||
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
||||||
params.data2 = pickData(parsedData, 'trade_date', 'total_mv')
|
params.data2 = pickData(parsedData, 'trade_date', 'total_mv');
|
||||||
params.data2 = params.data2.map(item => {
|
params.data2 = params.data2.map(item => {
|
||||||
return {
|
return {
|
||||||
value: [
|
value: [
|
||||||
@@ -96,6 +105,28 @@ $ts_code = $_REQUEST['code'];
|
|||||||
params.sub_text += ", Average:"+dataCal['avg'];
|
params.sub_text += ", Average:"+dataCal['avg'];
|
||||||
params.sub_text += ", Recent:"+dataCal['last'];
|
params.sub_text += ", Recent:"+dataCal['last'];
|
||||||
doubleLineChart(params);
|
doubleLineChart(params);
|
||||||
|
|
||||||
|
// 图表配置:float_mv
|
||||||
|
params = {};
|
||||||
|
params.chartid='float_mv';
|
||||||
|
params.legend = [codeName,'流通市值-万亿'];
|
||||||
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
||||||
|
params.data1 = pickData(parsedData, 'trade_date', 'close');
|
||||||
|
params.data2 = pickData(parsedData, 'trade_date', 'float_mv');
|
||||||
|
params.data2 = params.data2.map(item => {
|
||||||
|
return {
|
||||||
|
value: [
|
||||||
|
item.value[0],
|
||||||
|
parseFloat((parseFloat(item.value[1]) / 10000 / 10000 / 10000).toFixed(2))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
dataCal = calculateStats(params.data2);
|
||||||
|
params.sub_text = "流通市值 Max:"+dataCal['max'];
|
||||||
|
params.sub_text += ", Min:"+dataCal['min'];
|
||||||
|
params.sub_text += ", Average:"+dataCal['avg'];
|
||||||
|
params.sub_text += ", Recent:"+dataCal['last'];
|
||||||
|
doubleLineChart(params);
|
||||||
})
|
})
|
||||||
.catch(error => console.error('数据加载失败:', error));
|
.catch(error => console.error('数据加载失败:', error));
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -1,9 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
include_once "inc/getBasic.inc.php";
|
|
||||||
$_REQUEST['ts_code']=$_REQUEST['ts_code']?$_REQUEST['ts_code']:'000001';
|
$_REQUEST['ts_code']=$_REQUEST['ts_code']?$_REQUEST['ts_code']:'000001';
|
||||||
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-01-01';
|
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-01-01';
|
||||||
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:'';
|
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:'';
|
||||||
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
|
|
||||||
$title="股价VS PE/PB/PS 趋势:".$ts_name.'('.$_REQUEST['ts_code'].')';
|
$title="股价VS PE/PB/PS 趋势:".$ts_name.'('.$_REQUEST['ts_code'].')';
|
||||||
include_once "html/head.php";
|
include_once "html/head.php";
|
||||||
?>
|
?>
|
||||||
@@ -33,14 +31,20 @@ include_once "html/head.php";
|
|||||||
let t_start = $('#t_start').val();
|
let t_start = $('#t_start').val();
|
||||||
let t_end = $('#t_end').val();
|
let t_end = $('#t_end').val();
|
||||||
let ts_code = $("#ts_code").val();
|
let ts_code = $("#ts_code").val();
|
||||||
let codeName ="<?=$ts_name?>";
|
|
||||||
|
|
||||||
url = "https://api.doorcome.cn/api/stockparam/?tscode="+ts_code;
|
url = "https://api.doorcome.cn/api/stockparam/?tscode="+ts_code;
|
||||||
url += "&start_date="+t_start+"&end_date="+t_end;
|
url += "&start_date="+t_start+"&end_date="+t_end;
|
||||||
fetch(url)
|
url2 = "https://api.doorcome.cn/api/stockinfo/?tscode="+ts_code;
|
||||||
.then(httpresponse => httpresponse.json())
|
Promise.all([
|
||||||
.then(parsedData => {
|
fetch(url),
|
||||||
|
fetch(url2)
|
||||||
|
])
|
||||||
|
.then(responses => Promise.all(responses.map(r => r.json())))
|
||||||
|
//.then(httpresponse => httpresponse.json())
|
||||||
|
//.then(parsedData => {
|
||||||
|
.then(([parsedData,stockInfo]) => {
|
||||||
// 图表配置:pe_ttm
|
// 图表配置:pe_ttm
|
||||||
|
let codeName = stockInfo[0].name;
|
||||||
var params = {};
|
var params = {};
|
||||||
params.chartid='pe_ttm';
|
params.chartid='pe_ttm';
|
||||||
params.legend = [codeName,'pe_ttm'];
|
params.legend = [codeName,'pe_ttm'];
|
||||||
|
|||||||
Reference in New Issue
Block a user