add changes

This commit is contained in:
jackyu66git
2025-04-24 17:49:36 +08:00
parent 48d5647ebf
commit b849ce8ec8
14 changed files with 242 additions and 408 deletions
+91 -315
View File
@@ -196,16 +196,6 @@
font-weight: bold;
}
.main-bi-zs {
color: #FF9800;
font-weight: bold;
}
.element-bi-zs {
color: #9C27B0;
font-weight: bold;
}
/* 加载指示器旋转动画 */
@keyframes spin {
0% { transform: rotate(0deg); }
@@ -308,14 +298,6 @@
<input class="form-check-input" type="checkbox" id="showMainUncompletedZs" checked>
<label class="form-check-label" for="showMainUncompletedZs">未完成中枢</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="showMainBiZs" checked>
<label class="form-check-label" for="showMainBiZs">笔中枢</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="showMainUncompletedBiZs" checked>
<label class="form-check-label" for="showMainUncompletedBiZs">未完成笔中枢</label>
</div>
</div>
<div class="d-flex align-items-center mt-2">
<label class="form-label me-3 mb-0">次周期:</label>
@@ -335,14 +317,6 @@
<input class="form-check-input" type="checkbox" id="showElementUncompletedZs" checked>
<label class="form-check-label" for="showElementUncompletedZs">未完成中枢</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="showElementBiZs" checked>
<label class="form-check-label" for="showElementBiZs">笔中枢</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="showElementUncompletedBiZs" checked>
<label class="form-check-label" for="showElementUncompletedBiZs">未完成笔中枢</label>
</div>
</div>
</div>
<div class="col-md-6">
@@ -542,14 +516,10 @@
mainSegSeries: [],
mainZsSeries: [],
mainUncompletedZsSeries: [],
mainBiZsSeries: [], // 添加主周期笔中枢系列
mainUncompletedBiZsSeries: [], // 添加未完成主周期笔中枢系列
elementBiSeries: [],
elementSegSeries: [],
elementZsSeries: [],
elementUncompletedZsSeries: [],
elementBiZsSeries: [], // 添加元素周期笔中枢系列
elementUncompletedBiZsSeries: [], // 添加未完成元素周期笔中枢系列
tradePointSeries: []
},
state: {
@@ -735,16 +705,6 @@
updateChartDisplay();
});
// 添加笔中枢复选框变更事件
$('#showMainBiZs').change(function() {
updateChartDisplay();
});
// 添加未完成笔中枢复选框变更事件
$('#showMainUncompletedBiZs').change(function() {
updateChartDisplay();
});
// 添加买卖点复选框变更事件
$('#showElementBi').change(function() {
updateChartDisplay();
@@ -765,16 +725,6 @@
updateChartDisplay();
});
// 添加笔中枢复选框变更事件
$('#showElementBiZs').change(function() {
updateChartDisplay();
});
// 添加未完成笔中枢复选框变更事件
$('#showElementUncompletedBiZs').change(function() {
updateChartDisplay();
});
// 添加买卖点复选框变更事件
$('#showTradePoints').change(function() {
updateChartDisplay();
@@ -946,39 +896,51 @@
});
function updateChartDisplay() {
// 获取复选框状态
var showMainBi = $('#showMainBi').prop('checked');
var showMainSeg = $('#showMainSeg').prop('checked');
var showMainZs = $('#showMainZs').prop('checked');
var showMainUncompletedZs = $('#showMainUncompletedZs').prop('checked');
var showMainBiZs = $('#showMainBiZs').prop('checked');
var showMainUncompletedBiZs = $('#showMainUncompletedBiZs').prop('checked');
var showElementBi = $('#showElementBi').prop('checked');
var showElementSeg = $('#showElementSeg').prop('checked');
var showElementZs = $('#showElementZs').prop('checked');
var showElementUncompletedZs = $('#showElementUncompletedZs').prop('checked');
var showElementBiZs = $('#showElementBiZs').prop('checked');
var showElementUncompletedBiZs = $('#showElementUncompletedBiZs').prop('checked');
var showTradePoints = $('#showTradePoints').prop('checked');
// 调用显示/隐藏函数
if (showMainBi) { drawBi(main_bi_list); } else { removeBi(); }
if (showMainSeg) { drawSeg(main_seg_list); } else { removeSeg(); }
if (showMainZs) { drawZones(main_zs_list); } else { removeZones(); }
if (showMainUncompletedZs) { drawUncompletedZones(main_uncompleted_zs_list); } else { removeUncompletedZones(); }
if (showMainBiZs) { drawBiZones(main_bi_zs_list); } else { removeBiZones(); }
if (showMainUncompletedBiZs) { drawUncompletedBiZones(main_uncompleted_bi_zs_list); } else { removeUncompletedBiZones(); }
// 元素显示
if (showElementBi) { drawBiOnElement(element_bi_list); } else { removeBiOnElement(); }
if (showElementSeg) { drawSegOnElement(element_seg_list); } else { removeSegOnElement(); }
if (showElementZs) { drawZonesOnElement(element_zs_list); } else { removeZonesOnElement(); }
if (showElementUncompletedZs) { drawUncompletedZonesOnElement(element_uncompleted_zs_list); } else { removeUncompletedZonesOnElement(); }
if (showElementBiZs) { drawBiZonesOnElement(element_bi_zs_list); } else { removeBiZonesOnElement(); }
if (showElementUncompletedBiZs) { drawUncompletedBiZonesOnElement(element_uncompleted_bi_zs_list); } else { removeUncompletedBiZonesOnElement(); }
// 买卖点
if (showTradePoints) { drawTradePoints(trade_points_list); } else { removeTradePoints(); }
if (currentData) {
// 保存当前的可见逻辑范围
let logicalRange = null;
let visibleRange = null;
if (tvWidget && tvWidget.mainChart) {
// 优先使用逻辑范围,这样在缩放级别上更准确
logicalRange = tvWidget.mainChart.timeScale().getVisibleLogicalRange();
// 备用方案,获取实际时间戳范围
visibleRange = tvWidget.mainChart.timeScale().getVisibleRange();
}
console.log('更新图表显示');
console.log('- 显示K线:', $('#showOriginalKline').is(':checked'));
console.log('- 显示笔:', $('#showMainBi').is(':checked'));
console.log('- 显示线段:', $('#showMainSeg').is(':checked'));
console.log('- 显示中枢:', $('#showMainZs').is(':checked'));
console.log('- 显示未完成中枢:', $('#showMainUncompletedZs').is(':checked'));
console.log('- 显示MACD:', $('#showMacd').is(':checked'));
console.log('- 显示买卖点:', $('#showTradePoints').is(':checked'));
// 重新初始化图表,这将清除旧图形并重新绘制
initTradingView($('#symbol').val(), $('#timeframe').val());
// 如果有保存的范围,恢复它
setTimeout(() => {
if (tvWidget) {
if (logicalRange) {
// 应用保存的逻辑范围到所有图表
tvWidget.mainChart.timeScale().setVisibleLogicalRange(logicalRange);
tvWidget.volumeChart.timeScale().setVisibleLogicalRange(logicalRange);
if (tvWidget.macdChart) {
tvWidget.macdChart.timeScale().setVisibleLogicalRange(logicalRange);
}
} else if (visibleRange) {
// 如果没有逻辑范围,使用时间戳范围
tvWidget.mainChart.timeScale().setVisibleRange(visibleRange);
tvWidget.volumeChart.timeScale().setVisibleRange(visibleRange);
if (tvWidget.macdChart) {
tvWidget.macdChart.timeScale().setVisibleRange(visibleRange);
}
}
}
}, 100);
}
}
// 确保所有时间处理都使用UTC时间,包括表格数据显示
@@ -1076,8 +1038,8 @@
$('#refreshLoadingSpinner').hide();
// 保存当前数据
currentData = data;
currentData = data;
// 刷新图表
refreshChart(data);
},
@@ -1116,14 +1078,10 @@
mainSegSeries: [],
mainZsSeries: [],
mainUncompletedZsSeries: [],
mainBiZsSeries: [], // 添加主周期笔中枢系列
mainUncompletedBiZsSeries: [], // 添加未完成主周期笔中枢系列
elementBiSeries: [],
elementSegSeries: [],
elementZsSeries: [],
elementUncompletedZsSeries: [],
elementBiZsSeries: [], // 添加元素周期笔中枢系列
elementUncompletedBiZsSeries: [], // 添加未完成元素周期笔中枢系列
tradePointSeries: []
},
state: {
@@ -1348,22 +1306,22 @@
if (currentData.macd && currentData.macd.macd && currentData.macd.macd[i] !== undefined) {
macdData.push({
time: timestamp,
time: timestamp,
value: currentData.macd.macd[i]
});
});
signalData.push({
time: timestamp,
time: timestamp,
value: currentData.macd.signal[i]
});
// 设置直方图颜色
const histValue = currentData.macd.histogram[i];
histogramData.push({
time: timestamp,
time: timestamp,
value: histValue,
color: histValue >= 0 ? 'rgba(220, 53, 69, 0.5)' : 'rgba(40, 167, 69, 0.5)'
});
});
}
}
@@ -2624,7 +2582,7 @@
// 添加事件监听
addChartSyncEvents(mainChartContainer, mainChart);
addChartSyncEvents(volumeChartContainer, volumeChart);
if (showMacd && macdChart) {
if (showMacd && macdChart) {
addChartSyncEvents(macdChartContainer, macdChart);
}
@@ -2714,7 +2672,7 @@
if (isNaN(timeValue.getTime())) {
console.error(`买卖点 #${i} 时间格式无效:`, tradePointsData[i].time);
}
} catch (e) {
} catch (e) {
console.error(`买卖点 #${i} 时间格式异常:`, e);
}
} else {
@@ -3366,14 +3324,48 @@
}
console.log('重绘分形元素 - 开始');
console.log('- 显示笔:', $('#showMainBi').is(':checked'));
console.log('- 显示线段:', $('#showMainSeg').is(':checked'));
console.log('- 显示中枢:', $('#showMainZs').is(':checked'));
// 保存当前的图表可见范围
const mainChart = tvWidget.mainChart;
const visibleRange = mainChart.timeScale().getVisibleRange();
const logicalRange = mainChart.timeScale().getVisibleLogicalRange();
// 调用显示所有元素函数
displayAllElements();
// 获取当前图表设置
const showMacd = $('#showMacd').is(':checked');
const showOriginalKline = $('#showOriginalKline').is(':checked');
const showBi = $('#showMainBi').is(':checked');
const showSeg = $('#showMainSeg').is(':checked');
const showZs = $('#showMainZs').is(':checked');
// 保存原始K线和MACD数据,确保即使使用小级别,我们依然使用主周期的K线和MACD数据
const originalKlineData = currentData.kline_data;
const originalMacdData = currentData.macd;
// 重新初始化图表 - 这将清除所有系列并重新创建
console.log('重新初始化图表...');
// 临时存储currentData中可能被修改的字段
const tempCurrentData = {
kline_data: originalKlineData,
macd: originalMacdData
};
// 在重绘前确保K线和MACD数据不变
if (currentData.original_kline_data && currentData.original_macd) {
// 如果已经保存了原始数据,恢复它们
currentData.kline_data = currentData.original_kline_data;
currentData.macd = currentData.original_macd;
} else {
// 首次运行 - 保存原始数据
currentData.original_kline_data = originalKlineData;
currentData.original_macd = originalMacdData;
}
// 调用初始化函数
initTradingView($('#symbol').val(), $('#timeframe').val());
// 恢复原始可见范围
setTimeout(() => {
@@ -3486,14 +3478,12 @@
console.log('API返回数据:', data);
console.log('K线数据点数:', data.kline_data ? data.kline_data.length : 0);
console.log('笔中枢数据点数:', data.bi_zs_list ? data.bi_zs_list.length : 0);
// 检查是否包含小周期数据
if (data.element_timeframe) {
console.log('小周期笔数据点数:', data.element_bi_list ? data.element_bi_list.length : 0);
console.log('小周期线段数据点数:', data.element_seg_list ? data.element_seg_list.length : 0);
console.log('小周期中枢数据点数:', data.element_zs_list ? data.element_zs_list.length : 0);
console.log('小周期笔中枢数据点数:', data.element_bi_zs_list ? data.element_bi_zs_list.length : 0);
// 更新小周期选择器
$('#elementTimeframe').val(data.element_timeframe);
@@ -3517,220 +3507,6 @@
// 更新表格数据
updateTables(data);
}
// 显示中枢
function displayZones() {
// 主周期或元素周期中枢
if ($('#showMainZs').is(':checked') || $('#showElementZs').is(':checked') ||
$('#showMainUncompletedZs').is(':checked') || $('#showElementUncompletedZs').is(':checked') ||
$('#showMainBiZs').is(':checked') || $('#showElementBiZs').is(':checked') ||
$('#showMainUncompletedBiZs').is(':checked') || $('#showElementUncompletedBiZs').is(':checked')) {
console.log('绘制中枢 - 已启用');
// 绘制主周期线段中枢
if ($('#showMainZs').is(':checked') && currentData.zs_list && currentData.zs_list.length > 0) {
console.log(`绘制主周期线段中枢数据,共${currentData.zs_list.length}`);
drawZoneList(currentData.zs_list, '#F1C40F', 'SEG_ZS');
}
// 绘制主周期笔中枢
if ($('#showMainBiZs').is(':checked') && currentData.bi_zs_list && currentData.bi_zs_list.length > 0) {
console.log(`绘制主周期笔中枢数据,共${currentData.bi_zs_list.length}`);
// 添加检查笔中枢数据的详细日志
if (currentData.bi_zs_list.length > 0) {
console.log('笔中枢数据示例:', currentData.bi_zs_list[0]);
}
drawZoneList(currentData.bi_zs_list, '#FF9800', 'BI_ZS');
} else {
console.log('笔中枢数据不存在或勾选框未选中:',
'勾选状态=', $('#showMainBiZs').is(':checked'),
'数据存在=', !!(currentData.bi_zs_list),
'数据长度=', currentData.bi_zs_list ? currentData.bi_zs_list.length : 0);
}
// 元素周期线段中枢
if ($('#showElementZs').is(':checked') && currentData.element_zs_list && currentData.element_zs_list.length > 0) {
console.log(`绘制元素周期线段中枢数据,共${currentData.element_zs_list.length}`);
drawZoneList(currentData.element_zs_list, '#3f51b5', 'SEG_ZS');
}
// 元素周期笔中枢
if ($('#showElementBiZs').is(':checked') && currentData.element_bi_zs_list && currentData.element_bi_zs_list.length > 0) {
console.log(`绘制元素周期笔中枢数据,共${currentData.element_bi_zs_list.length}`);
if (currentData.element_bi_zs_list.length > 0) {
console.log('元素笔中枢数据示例:', currentData.element_bi_zs_list[0]);
}
drawZoneList(currentData.element_bi_zs_list, '#9C27B0', 'BI_ZS');
} else {
console.log('元素笔中枢数据不存在或勾选框未选中:',
'勾选状态=', $('#showElementBiZs').is(':checked'),
'数据存在=', !!(currentData.element_bi_zs_list),
'数据长度=', currentData.element_bi_zs_list ? currentData.element_bi_zs_list.length : 0);
}
// 主周期未完成线段中枢
if ($('#showMainUncompletedZs').is(':checked') && currentData.uncompleted_zs_list && currentData.uncompleted_zs_list.length > 0) {
console.log(`绘制主周期未完成线段中枢数据,共${currentData.uncompleted_zs_list.length}`);
drawZoneList(currentData.uncompleted_zs_list, '#F1C40F', 'SEG_ZS', true);
}
// 主周期未完成笔中枢
if ($('#showMainUncompletedBiZs').is(':checked') && currentData.uncompleted_bi_zs_list && currentData.uncompleted_bi_zs_list.length > 0) {
console.log(`绘制主周期未完成笔中枢数据,共${currentData.uncompleted_bi_zs_list.length}`);
drawZoneList(currentData.uncompleted_bi_zs_list, '#FF9800', 'BI_ZS', true);
}
// 元素周期未完成线段中枢
if ($('#showElementUncompletedZs').is(':checked') && currentData.element_uncompleted_zs_list && currentData.element_uncompleted_zs_list.length > 0) {
console.log(`绘制元素周期未完成线段中枢数据,共${currentData.element_uncompleted_zs_list.length}`);
drawZoneList(currentData.element_uncompleted_zs_list, '#3f51b5', 'SEG_ZS', true);
}
// 元素周期未完成笔中枢
if ($('#showElementUncompletedBiZs').is(':checked') && currentData.element_uncompleted_bi_zs_list && currentData.element_uncompleted_bi_zs_list.length > 0) {
console.log(`绘制元素周期未完成笔中枢数据,共${currentData.element_uncompleted_bi_zs_list.length}`);
drawZoneList(currentData.element_uncompleted_bi_zs_list, '#9C27B0', 'BI_ZS', true);
}
} else {
console.log('绘制中枢 - 已禁用');
}
}
// 绘制中枢列表函数
function drawZoneList(zoneList, color, type, isUncompleted = false) {
zoneList.forEach(function(zs) {
try {
// 直接使用UTC时间戳(秒)
const startTime = Math.floor(new Date(zs.start_time).getTime() / 1000);
// 未完成中枢的结束时间设为当前K线的最后时间
let endTime;
if (isUncompleted) {
endTime = Math.floor(new Date(currentData.kline_data[currentData.kline_data.length-1].date).getTime() / 1000);
} else {
endTime = Math.floor(new Date(zs.end_time).getTime() / 1000);
}
if (isNaN(startTime) || isNaN(endTime)) {
console.error(`${type}中枢时间转换错误:`, zs.start_time, zs.end_time);
return;
}
const zg = parseFloat(zs.zg); // 中枢上沿
const zd = parseFloat(zs.zd); // 中枢下沿
if (isNaN(zg) || isNaN(zd)) {
console.error(`${type}中枢价格转换错误:`, zs.zg, zs.zd);
return;
}
// 创建中枢上边界
const topSeries = mainChart.addLineSeries({
color: color,
lineWidth: 1,
lineStyle: isUncompleted ? 2 : 0, // 未完成中枢用虚线
lastValueVisible: false,
priceLineVisible: false,
});
topSeries.setData([
{ time: startTime, value: zg },
{ time: endTime, value: zg }
]);
// 为下边界创建另一条线
const bottomSeries = mainChart.addLineSeries({
color: color,
lineWidth: 1,
lineStyle: isUncompleted ? 2 : 0, // 未完成中枢用虚线
lastValueVisible: false,
priceLineVisible: false,
});
bottomSeries.setData([
{ time: startTime, value: zd },
{ time: endTime, value: zd }
]);
// 添加左边界
const leftSeries = mainChart.addLineSeries({
color: color,
lineWidth: 1,
lineStyle: isUncompleted ? 2 : 0, // 未完成中枢用虚线
lastValueVisible: false,
priceLineVisible: false,
});
leftSeries.setData([
{ time: startTime, value: zd },
{ time: startTime, value: zg }
]);
// 添加右边界
const rightSeries = mainChart.addLineSeries({
color: color,
lineWidth: 1,
lineStyle: isUncompleted ? 2 : 0, // 未完成中枢用虚线
lastValueVisible: false,
priceLineVisible: false,
});
rightSeries.setData([
{ time: endTime, value: zd },
{ time: endTime, value: zg }
]);
// 储存到相应的系列集合中
if (type === 'BI_ZS') {
if (color === '#FF9800') { // 主周期笔中枢
tvWidget.series.mainBiZsSeries.push({
time: startTime,
value: zg,
color: color,
lineWidth: 1,
lineStyle: isUncompleted ? 2 : 0
});
} else { // 元素周期笔中枢
tvWidget.series.elementBiZsSeries.push({
time: startTime,
value: zg,
color: color,
lineWidth: 1,
lineStyle: isUncompleted ? 2 : 0
});
}
}
} catch (e) {
console.error(`${type}中枢处理出错:`, e);
}
});
}
// 辅助函数,在updateTradingViewData或redrawFractalElements中调用
function displayAllElements() {
console.log('调用displayAllElements,开始绘制所有图形元素...');
// 显示笔
if ($('#showMainBi').is(':checked') || $('#showElementBi').is(':checked')) {
displayBi();
}
// 显示线段
if ($('#showMainSeg').is(':checked') || $('#showElementSeg').is(':checked')) {
displaySeg();
}
// 显示中枢(包含线段中枢和笔中枢)
displayZones();
// 显示买卖点
if ($('#showTradePoints').is(':checked')) {
displayTradePoints();
}
console.log('displayAllElements执行完成');
}
</script>
</body>
</html>