- Introduced a new boundary utilization score to measure price proximity to triangle boundaries, improving the accuracy of strength assessments. - Updated scoring weights to incorporate boundary utilization, adjusting the contributions of convergence, volume, and fitting scores. - Added detailed chart mode in the stock viewer, allowing users to toggle between standard and detailed views with additional metrics displayed. - Enhanced documentation to reflect new features, including usage instructions for the boundary utilization score and detailed chart mode. - Improved error handling in the stock viewer for better user experience.
3316 lines
100 KiB
HTML
3316 lines
100 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>收敛三角形强度分选股系统</title>
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||
<style>
|
||
:root {
|
||
--bg-primary: #0a0e27;
|
||
--bg-secondary: #111830;
|
||
--bg-card: #1a2238;
|
||
--bg-card-hover: #242d48;
|
||
--accent-primary: #00d4aa;
|
||
--accent-secondary: #7b68ee;
|
||
--accent-warm: #ff6b6b;
|
||
--accent-cool: #4ecdc4;
|
||
--accent-gold: #ffd93d;
|
||
--text-primary: #e8eaf0;
|
||
--text-secondary: #8b92a8;
|
||
--text-muted: #5a6178;
|
||
--border-subtle: rgba(255, 255, 255, 0.06);
|
||
--border-accent: rgba(0, 212, 170, 0.3);
|
||
--shadow-glow: 0 0 40px rgba(0, 212, 170, 0.15);
|
||
--shadow-card: 0 8px 32px rgba(0, 0, 0, 0.4);
|
||
--transition-fast: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
||
--transition-smooth: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||
}
|
||
|
||
* {
|
||
margin: 0;
|
||
padding: 0;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
body {
|
||
font-family: 'Noto Sans SC', sans-serif;
|
||
background: var(--bg-primary);
|
||
color: var(--text-primary);
|
||
min-height: 100vh;
|
||
line-height: 1.6;
|
||
overflow-x: hidden;
|
||
}
|
||
|
||
/* Animated Background */
|
||
body::before {
|
||
content: '';
|
||
position: fixed;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background:
|
||
radial-gradient(ellipse at 20% 20%, rgba(123, 104, 238, 0.08) 0%, transparent 50%),
|
||
radial-gradient(ellipse at 80% 80%, rgba(0, 212, 170, 0.06) 0%, transparent 50%),
|
||
radial-gradient(ellipse at 50% 50%, rgba(255, 107, 107, 0.04) 0%, transparent 70%);
|
||
pointer-events: none;
|
||
z-index: 0;
|
||
}
|
||
|
||
/* Noise Texture Overlay */
|
||
body::after {
|
||
content: '';
|
||
position: fixed;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
|
||
opacity: 0.03;
|
||
pointer-events: none;
|
||
z-index: 1;
|
||
}
|
||
|
||
.app-container {
|
||
position: relative;
|
||
z-index: 2;
|
||
max-width: 1680px;
|
||
margin: 0 auto;
|
||
padding: 24px;
|
||
}
|
||
|
||
/* Header Section */
|
||
.header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
padding: 28px 32px;
|
||
margin-bottom: 24px;
|
||
background: linear-gradient(135deg, rgba(26, 34, 56, 0.9) 0%, rgba(17, 24, 48, 0.95) 100%);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 16px;
|
||
backdrop-filter: blur(20px);
|
||
box-shadow: var(--shadow-card);
|
||
}
|
||
|
||
.header-title {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 6px;
|
||
}
|
||
|
||
.header-title h1 {
|
||
font-size: 26px;
|
||
font-weight: 700;
|
||
background: linear-gradient(135deg, var(--accent-primary) 0%, var(--accent-cool) 100%);
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
letter-spacing: -0.3px;
|
||
}
|
||
|
||
.header-meta {
|
||
display: flex;
|
||
gap: 20px;
|
||
font-size: 13px;
|
||
color: var(--text-secondary);
|
||
font-family: 'JetBrains Mono', monospace;
|
||
}
|
||
|
||
.header-meta span {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
}
|
||
|
||
.header-meta span::before {
|
||
content: '';
|
||
width: 6px;
|
||
height: 6px;
|
||
border-radius: 50%;
|
||
background: var(--accent-primary);
|
||
box-shadow: 0 0 10px var(--accent-primary);
|
||
animation: pulse 2s infinite;
|
||
}
|
||
|
||
@keyframes pulse {
|
||
0%, 100% { opacity: 1; transform: scale(1); }
|
||
50% { opacity: 0.6; transform: scale(1.2); }
|
||
}
|
||
|
||
/* Control Panel */
|
||
.control-panel {
|
||
background: var(--bg-secondary);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 16px;
|
||
padding: 24px 32px;
|
||
margin-bottom: 24px;
|
||
box-shadow: var(--shadow-card);
|
||
}
|
||
|
||
.filter-section {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 32px;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.filter-label {
|
||
font-size: 14px;
|
||
font-weight: 600;
|
||
color: var(--text-secondary);
|
||
min-width: 100px;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.5px;
|
||
}
|
||
|
||
.slider-wrapper {
|
||
flex: 1;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 20px;
|
||
}
|
||
|
||
.slider-track {
|
||
flex: 1;
|
||
height: 6px;
|
||
background: var(--bg-card);
|
||
border-radius: 3px;
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.slider-track::before {
|
||
content: '';
|
||
position: absolute;
|
||
left: 0;
|
||
top: 0;
|
||
height: 100%;
|
||
width: var(--slider-value, 0%);
|
||
background: linear-gradient(90deg, var(--accent-secondary) 0%, var(--accent-primary) 100%);
|
||
border-radius: 3px;
|
||
transition: width 0.1s linear;
|
||
}
|
||
|
||
input[type="range"] {
|
||
-webkit-appearance: none;
|
||
appearance: none;
|
||
width: 100%;
|
||
height: 6px;
|
||
background: transparent;
|
||
cursor: pointer;
|
||
position: relative;
|
||
z-index: 2;
|
||
}
|
||
|
||
input[type="range"]::-webkit-slider-thumb {
|
||
-webkit-appearance: none;
|
||
width: 18px;
|
||
height: 18px;
|
||
border-radius: 50%;
|
||
background: var(--accent-primary);
|
||
cursor: pointer;
|
||
box-shadow: 0 0 20px rgba(0, 212, 170, 0.5);
|
||
border: 3px solid var(--bg-primary);
|
||
transition: transform 0.2s;
|
||
}
|
||
|
||
input[type="range"]::-webkit-slider-thumb:hover {
|
||
transform: scale(1.15);
|
||
}
|
||
|
||
input[type="range"]::-moz-range-thumb {
|
||
width: 18px;
|
||
height: 18px;
|
||
border-radius: 50%;
|
||
background: var(--accent-primary);
|
||
cursor: pointer;
|
||
box-shadow: 0 0 20px rgba(0, 212, 170, 0.5);
|
||
border: 3px solid var(--bg-primary);
|
||
transition: transform 0.2s;
|
||
}
|
||
|
||
input[type="range"]::-moz-range-thumb:hover {
|
||
transform: scale(1.15);
|
||
}
|
||
|
||
.slider-value {
|
||
font-family: 'JetBrains Mono', monospace;
|
||
font-size: 22px;
|
||
font-weight: 700;
|
||
color: var(--accent-primary);
|
||
min-width: 80px;
|
||
text-align: right;
|
||
}
|
||
|
||
/* Stats Grid */
|
||
.stats-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: 16px;
|
||
padding-top: 20px;
|
||
border-top: 1px solid var(--border-subtle);
|
||
}
|
||
|
||
.stat-card {
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 12px;
|
||
padding: 16px 20px;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 16px;
|
||
transition: all var(--transition-fast);
|
||
}
|
||
|
||
.stat-card:hover {
|
||
border-color: var(--border-accent);
|
||
background: var(--bg-card-hover);
|
||
}
|
||
|
||
.stat-icon {
|
||
width: 44px;
|
||
height: 44px;
|
||
border-radius: 10px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 20px;
|
||
background: rgba(0, 212, 170, 0.1);
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
.stat-info {
|
||
flex: 1;
|
||
}
|
||
|
||
.stat-label {
|
||
font-size: 12px;
|
||
color: var(--text-secondary);
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.5px;
|
||
margin-bottom: 2px;
|
||
}
|
||
|
||
.stat-value {
|
||
font-family: 'JetBrains Mono', monospace;
|
||
font-size: 24px;
|
||
font-weight: 700;
|
||
color: var(--text-primary);
|
||
}
|
||
|
||
/* Stocks Grid */
|
||
.stocks-section {
|
||
min-height: 400px;
|
||
}
|
||
|
||
.stocks-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
|
||
gap: 20px;
|
||
}
|
||
|
||
.stock-card {
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 16px;
|
||
overflow: hidden;
|
||
transition: all var(--transition-smooth);
|
||
cursor: pointer;
|
||
position: relative;
|
||
}
|
||
|
||
.stock-card::before {
|
||
content: '';
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
width: 3px;
|
||
height: 100%;
|
||
background: linear-gradient(180deg, var(--accent-primary) 0%, var(--accent-secondary) 100%);
|
||
opacity: 0;
|
||
transition: opacity var(--transition-fast);
|
||
}
|
||
|
||
.stock-card:hover {
|
||
transform: translateY(-4px);
|
||
border-color: var(--border-accent);
|
||
box-shadow: var(--shadow-glow), var(--shadow-card);
|
||
}
|
||
|
||
.stock-card:hover::before {
|
||
opacity: 1;
|
||
}
|
||
|
||
.card-header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
padding: 18px 20px;
|
||
background: linear-gradient(135deg, rgba(0, 212, 170, 0.08) 0%, rgba(123, 104, 238, 0.05) 100%);
|
||
border-bottom: 1px solid var(--border-subtle);
|
||
}
|
||
|
||
.stock-identity {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 2px;
|
||
}
|
||
|
||
.stock-name {
|
||
font-size: 18px;
|
||
font-weight: 700;
|
||
color: var(--text-primary);
|
||
}
|
||
|
||
.stock-code {
|
||
font-family: 'JetBrains Mono', monospace;
|
||
font-size: 12px;
|
||
color: var(--text-secondary);
|
||
background: rgba(0, 212, 170, 0.15);
|
||
padding: 2px 8px;
|
||
border-radius: 4px;
|
||
display: inline-block;
|
||
margin-top: 4px;
|
||
}
|
||
|
||
.strength-badge {
|
||
text-align: right;
|
||
}
|
||
|
||
.strength-value {
|
||
font-family: 'JetBrains Mono', monospace;
|
||
font-size: 28px;
|
||
font-weight: 700;
|
||
background: linear-gradient(135deg, var(--accent-primary) 0%, var(--accent-cool) 100%);
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
}
|
||
|
||
.strength-label {
|
||
font-size: 11px;
|
||
color: var(--text-secondary);
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.5px;
|
||
}
|
||
|
||
.card-body {
|
||
padding: 16px 20px;
|
||
}
|
||
|
||
.metrics-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 12px;
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.metric-item {
|
||
background: var(--bg-secondary);
|
||
border-radius: 10px;
|
||
padding: 10px 14px;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
}
|
||
|
||
.metric-label {
|
||
font-size: 12px;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
.metric-value {
|
||
font-family: 'JetBrains Mono', monospace;
|
||
font-size: 14px;
|
||
font-weight: 600;
|
||
color: var(--text-primary);
|
||
}
|
||
|
||
.metric-value.direction-up {
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
.metric-value.direction-down {
|
||
color: var(--accent-warm);
|
||
}
|
||
|
||
.chart-container {
|
||
position: relative;
|
||
border-radius: 12px;
|
||
overflow: hidden;
|
||
background: var(--bg-secondary);
|
||
border: 1px solid var(--border-subtle);
|
||
}
|
||
|
||
.stock-chart {
|
||
width: 100%;
|
||
height: auto;
|
||
display: block;
|
||
transition: transform var(--transition-smooth);
|
||
}
|
||
|
||
.stock-card:hover .stock-chart {
|
||
transform: scale(1.02);
|
||
}
|
||
|
||
.chart-overlay {
|
||
position: absolute;
|
||
bottom: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
padding: 8px 12px;
|
||
background: linear-gradient(transparent, rgba(10, 14, 39, 0.9));
|
||
font-size: 11px;
|
||
color: var(--text-secondary);
|
||
display: flex;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
/* Empty State */
|
||
.empty-state {
|
||
text-align: center;
|
||
padding: 80px 20px;
|
||
color: var(--text-secondary);
|
||
}
|
||
|
||
.empty-state-icon {
|
||
font-size: 64px;
|
||
margin-bottom: 16px;
|
||
opacity: 0.5;
|
||
}
|
||
|
||
.empty-state h3 {
|
||
font-size: 20px;
|
||
color: var(--text-primary);
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
/* Modal */
|
||
.modal {
|
||
display: none;
|
||
position: fixed;
|
||
z-index: 1000;
|
||
left: 0;
|
||
top: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background: rgba(10, 14, 39, 0.95);
|
||
backdrop-filter: blur(10px);
|
||
align-items: center;
|
||
justify-content: center;
|
||
padding: 40px;
|
||
}
|
||
|
||
.modal.show {
|
||
display: flex;
|
||
animation: fadeIn 0.2s ease-out;
|
||
}
|
||
|
||
@keyframes fadeIn {
|
||
from { opacity: 0; }
|
||
to { opacity: 1; }
|
||
}
|
||
|
||
.modal-content {
|
||
max-width: 90%;
|
||
max-height: 90%;
|
||
position: relative;
|
||
}
|
||
|
||
.modal-content img {
|
||
max-width: 100%;
|
||
max-height: 85vh;
|
||
border-radius: 16px;
|
||
box-shadow: var(--shadow-glow), var(--shadow-card);
|
||
border: 1px solid var(--border-subtle);
|
||
}
|
||
|
||
.close-modal {
|
||
position: absolute;
|
||
top: -48px;
|
||
right: 0;
|
||
color: var(--text-secondary);
|
||
font-size: 36px;
|
||
font-weight: 300;
|
||
cursor: pointer;
|
||
background: none;
|
||
border: none;
|
||
transition: color var(--transition-fast);
|
||
line-height: 1;
|
||
}
|
||
|
||
.close-modal:hover {
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
/* Animations */
|
||
@keyframes slideIn {
|
||
from {
|
||
opacity: 0;
|
||
transform: translateY(20px);
|
||
}
|
||
to {
|
||
opacity: 1;
|
||
transform: translateY(0);
|
||
}
|
||
}
|
||
|
||
.stock-card {
|
||
animation: slideIn 0.4s ease-out backwards;
|
||
}
|
||
|
||
.stock-card:nth-child(1) { animation-delay: 0.05s; }
|
||
.stock-card:nth-child(2) { animation-delay: 0.1s; }
|
||
.stock-card:nth-child(3) { animation-delay: 0.15s; }
|
||
.stock-card:nth-child(4) { animation-delay: 0.2s; }
|
||
.stock-card:nth-child(5) { animation-delay: 0.25s; }
|
||
.stock-card:nth-child(6) { animation-delay: 0.3s; }
|
||
|
||
/* Responsive */
|
||
@media (max-width: 768px) {
|
||
.app-container {
|
||
padding: 16px;
|
||
}
|
||
|
||
.header {
|
||
flex-direction: column;
|
||
align-items: flex-start;
|
||
gap: 16px;
|
||
padding: 20px;
|
||
}
|
||
|
||
.filter-section {
|
||
flex-direction: column;
|
||
align-items: stretch;
|
||
gap: 16px;
|
||
}
|
||
|
||
.filter-label {
|
||
min-width: auto;
|
||
}
|
||
|
||
.stats-grid {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.stocks-grid {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
}
|
||
|
||
/* Filter Row - Top bar with search and sort */
|
||
.filter-row {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 16px;
|
||
margin-bottom: 20px;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
/* Search Box */
|
||
.search-box {
|
||
position: relative;
|
||
flex: 1;
|
||
min-width: 200px;
|
||
}
|
||
|
||
.search-box input {
|
||
width: 100%;
|
||
padding: 12px 16px 12px 44px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 10px;
|
||
color: var(--text-primary);
|
||
font-size: 14px;
|
||
font-family: 'Noto Sans SC', sans-serif;
|
||
transition: all var(--transition-fast);
|
||
}
|
||
|
||
.search-box input:focus {
|
||
outline: none;
|
||
border-color: var(--accent-primary);
|
||
box-shadow: 0 0 0 3px rgba(0, 212, 170, 0.1);
|
||
}
|
||
|
||
.search-box::before {
|
||
content: '🔍';
|
||
position: absolute;
|
||
left: 14px;
|
||
top: 50%;
|
||
transform: translateY(-50%);
|
||
font-size: 16px;
|
||
opacity: 0.5;
|
||
}
|
||
|
||
.search-box .clear-search {
|
||
position: absolute;
|
||
right: 12px;
|
||
top: 50%;
|
||
transform: translateY(-50%);
|
||
width: 20px;
|
||
height: 20px;
|
||
background: var(--bg-card-hover);
|
||
border: none;
|
||
border-radius: 50%;
|
||
color: var(--text-secondary);
|
||
font-size: 14px;
|
||
cursor: pointer;
|
||
display: none;
|
||
align-items: center;
|
||
justify-content: center;
|
||
transition: all var(--transition-fast);
|
||
}
|
||
|
||
.search-box .clear-search:hover {
|
||
background: var(--accent-warm);
|
||
color: white;
|
||
}
|
||
|
||
.search-box.has-value .clear-search {
|
||
display: flex;
|
||
}
|
||
|
||
/* Sort Select */
|
||
.sort-wrapper {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 12px;
|
||
}
|
||
|
||
.sort-label {
|
||
font-size: 13px;
|
||
color: var(--text-secondary);
|
||
font-weight: 500;
|
||
}
|
||
|
||
.sort-select {
|
||
padding: 10px 16px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 10px;
|
||
color: var(--text-primary);
|
||
font-size: 14px;
|
||
font-family: 'Noto Sans SC', sans-serif;
|
||
cursor: pointer;
|
||
transition: all var(--transition-fast);
|
||
}
|
||
|
||
.sort-select:hover {
|
||
border-color: var(--border-accent);
|
||
}
|
||
|
||
.sort-select:focus {
|
||
outline: none;
|
||
border-color: var(--accent-primary);
|
||
box-shadow: 0 0 0 3px rgba(0, 212, 170, 0.1);
|
||
}
|
||
|
||
.sort-toggle {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
padding: 10px 14px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 10px;
|
||
color: var(--text-secondary);
|
||
font-size: 20px;
|
||
cursor: pointer;
|
||
transition: all var(--transition-fast);
|
||
}
|
||
|
||
.sort-toggle:hover {
|
||
border-color: var(--border-accent);
|
||
color: var(--text-primary);
|
||
}
|
||
|
||
.sort-toggle.active {
|
||
background: rgba(0, 212, 170, 0.1);
|
||
border-color: var(--accent-primary);
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
/* Reset Button */
|
||
.reset-btn {
|
||
padding: 10px 20px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 10px;
|
||
color: var(--text-secondary);
|
||
font-size: 14px;
|
||
font-family: 'Noto Sans SC', sans-serif;
|
||
cursor: pointer;
|
||
transition: all var(--transition-fast);
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
}
|
||
|
||
.reset-btn:hover {
|
||
border-color: var(--accent-warm);
|
||
color: var(--accent-warm);
|
||
}
|
||
|
||
/* Detail Toggle */
|
||
.detail-toggle {
|
||
padding: 10px 18px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 10px;
|
||
color: var(--text-secondary);
|
||
font-size: 14px;
|
||
font-family: 'Noto Sans SC', sans-serif;
|
||
cursor: pointer;
|
||
transition: all var(--transition-fast);
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
}
|
||
|
||
.detail-toggle:hover {
|
||
border-color: var(--accent-primary);
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
.detail-toggle.active {
|
||
background: rgba(0, 212, 170, 0.1);
|
||
border-color: var(--accent-primary);
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
/* Filter Chips */
|
||
.filter-chips {
|
||
display: flex;
|
||
gap: 10px;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
.filter-chip {
|
||
padding: 8px 16px;
|
||
background: var(--bg-card);
|
||
border: 1px solid var(--border-subtle);
|
||
border-radius: 20px;
|
||
color: var(--text-secondary);
|
||
font-size: 13px;
|
||
font-weight: 500;
|
||
cursor: pointer;
|
||
transition: all var(--transition-fast);
|
||
user-select: none;
|
||
}
|
||
|
||
.filter-chip:hover {
|
||
border-color: var(--border-accent);
|
||
color: var(--text-primary);
|
||
}
|
||
|
||
.filter-chip.active {
|
||
background: rgba(0, 212, 170, 0.15);
|
||
border-color: var(--accent-primary);
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
.filter-chip[data-value="up"].active {
|
||
background: rgba(0, 212, 170, 0.15);
|
||
border-color: var(--accent-primary);
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
.filter-chip[data-value="down"].active {
|
||
background: rgba(255, 107, 107, 0.15);
|
||
border-color: var(--accent-warm);
|
||
color: var(--accent-warm);
|
||
}
|
||
|
||
/* Dual Slider for Width Ratio */
|
||
.dual-slider-section {
|
||
margin-top: 16px;
|
||
padding-top: 16px;
|
||
border-top: 1px solid var(--border-subtle);
|
||
}
|
||
|
||
.dual-slider-header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-bottom: 12px;
|
||
}
|
||
|
||
.dual-slider-label {
|
||
font-size: 13px;
|
||
color: var(--text-secondary);
|
||
font-weight: 500;
|
||
}
|
||
|
||
.dual-slider-values {
|
||
font-family: 'JetBrains Mono', monospace;
|
||
font-size: 14px;
|
||
color: var(--accent-primary);
|
||
}
|
||
|
||
.dual-slider {
|
||
position: relative;
|
||
height: 30px;
|
||
}
|
||
|
||
.dual-slider-track {
|
||
position: absolute;
|
||
top: 50%;
|
||
left: 0;
|
||
right: 0;
|
||
height: 6px;
|
||
transform: translateY(-50%);
|
||
background: var(--bg-card);
|
||
border-radius: 3px;
|
||
}
|
||
|
||
.dual-slider-range {
|
||
position: absolute;
|
||
top: 50%;
|
||
height: 6px;
|
||
transform: translateY(-50%);
|
||
background: linear-gradient(90deg, var(--accent-secondary) 0%, var(--accent-primary) 100%);
|
||
border-radius: 3px;
|
||
}
|
||
|
||
.dual-slider input[type="range"] {
|
||
position: absolute;
|
||
pointer-events: none;
|
||
-webkit-appearance: none;
|
||
appearance: none;
|
||
width: 100%;
|
||
height: 6px;
|
||
background: transparent;
|
||
top: 50%;
|
||
transform: translateY(-50%);
|
||
z-index: 2;
|
||
}
|
||
|
||
.dual-slider input[type="range"]::-webkit-slider-thumb {
|
||
-webkit-appearance: none;
|
||
pointer-events: auto;
|
||
width: 18px;
|
||
height: 18px;
|
||
border-radius: 50%;
|
||
background: var(--accent-primary);
|
||
cursor: pointer;
|
||
box-shadow: 0 0 20px rgba(0, 212, 170, 0.5);
|
||
border: 3px solid var(--bg-primary);
|
||
transition: transform 0.2s;
|
||
}
|
||
|
||
.dual-slider input[type="range"]::-webkit-slider-thumb:hover {
|
||
transform: scale(1.15);
|
||
}
|
||
|
||
.dual-slider input[type="range"]::-moz-range-thumb {
|
||
width: 18px;
|
||
height: 18px;
|
||
border-radius: 50%;
|
||
background: var(--accent-primary);
|
||
cursor: pointer;
|
||
box-shadow: 0 0 20px rgba(0, 212, 170, 0.5);
|
||
border: 3px solid var(--bg-primary);
|
||
transition: transform 0.2s;
|
||
pointer-events: auto;
|
||
}
|
||
|
||
.dual-slider input[type="range"]::-moz-range-thumb:hover {
|
||
transform: scale(1.15);
|
||
}
|
||
|
||
/* Scrollbar */
|
||
::-webkit-scrollbar {
|
||
width: 10px;
|
||
height: 10px;
|
||
}
|
||
|
||
::-webkit-scrollbar-track {
|
||
background: var(--bg-secondary);
|
||
border-radius: 5px;
|
||
}
|
||
|
||
::-webkit-scrollbar-thumb {
|
||
background: var(--accent-primary);
|
||
border-radius: 5px;
|
||
}
|
||
|
||
::-webkit-scrollbar-thumb:hover {
|
||
background: var(--accent-cool);
|
||
}
|
||
</style>
|
||
<script>
|
||
// 工具函数(需要在页面加载前定义,因为HTML元素的onerror会直接调用)
|
||
function handleModalImageError(img) {
|
||
const fallbackSrc = img.dataset.fallbackSrc;
|
||
if (fallbackSrc && img.src !== fallbackSrc && img.dataset.fallbackTried !== 'true') {
|
||
img.dataset.fallbackTried = 'true';
|
||
img.src = fallbackSrc;
|
||
}
|
||
}
|
||
</script>
|
||
</head>
|
||
<body>
|
||
<div class="app-container">
|
||
<header class="header">
|
||
<div class="header-title">
|
||
<h1>收敛三角形选股系统</h1>
|
||
<div class="header-meta">
|
||
<span>数据日期: 20260120</span>
|
||
<span>监控股票: 108</span>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<section class="control-panel">
|
||
<!-- Top Filter Row: Search, Sort, Reset -->
|
||
<div class="filter-row">
|
||
<div class="search-box">
|
||
<input type="text" id="searchInput" placeholder="搜索股票代码或名称...">
|
||
<button class="clear-search" id="clearSearch">×</button>
|
||
</div>
|
||
<div class="sort-wrapper">
|
||
<span class="sort-label">排序</span>
|
||
<select class="sort-select" id="sortSelect">
|
||
<option value="strength">按强度分</option>
|
||
<option value="widthRatio">按宽度比</option>
|
||
<option value="touches">按触碰次数</option>
|
||
</select>
|
||
<button class="sort-toggle active" id="sortOrder" title="切换排序顺序">↓</button>
|
||
</div>
|
||
<button class="detail-toggle" id="detailToggle" title="切换详细图">
|
||
详细图: 关
|
||
</button>
|
||
<button class="reset-btn" id="resetBtn">
|
||
<span>↺</span> 重置筛选
|
||
</button>
|
||
</div>
|
||
|
||
<!-- Direction Filter -->
|
||
<div class="filter-section">
|
||
<label class="filter-label">突破方向</label>
|
||
<div class="filter-chips" id="directionFilter">
|
||
<div class="filter-chip active" data-value="all">全部</div>
|
||
<div class="filter-chip" data-value="up">↑ 向上</div>
|
||
<div class="filter-chip" data-value="down">↓ 向下</div>
|
||
<div class="filter-chip" data-value="none">— 无</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Volume Filter -->
|
||
<div class="filter-section">
|
||
<label class="filter-label">放量确认</label>
|
||
<div class="filter-chips" id="volumeFilter">
|
||
<div class="filter-chip active" data-value="all">全部</div>
|
||
<div class="filter-chip" data-value="true">✓ 已确认</div>
|
||
<div class="filter-chip" data-value="false">✗ 未确认</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Strength Slider -->
|
||
<div class="filter-section">
|
||
<label class="filter-label">强度阈值</label>
|
||
<div class="slider-wrapper">
|
||
<div class="slider-track" id="sliderTrack"></div>
|
||
<input type="range" id="strengthSlider" min="0" max="1" step="0.01" value="0">
|
||
<div class="slider-value" id="strengthValue">0.00</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="stats-grid">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">📊</div>
|
||
<div class="stat-info">
|
||
<div class="stat-label">Total</div>
|
||
<div class="stat-value" id="totalStocks">0</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">✨</div>
|
||
<div class="stat-info">
|
||
<div class="stat-label">Showing</div>
|
||
<div class="stat-value" id="displayedStocks">0</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">⚡</div>
|
||
<div class="stat-info">
|
||
<div class="stat-label">Average</div>
|
||
<div class="stat-value" id="avgStrength">0.00</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="stocks-section">
|
||
<div id="stocksGrid" class="stocks-grid"></div>
|
||
<div id="emptyState" class="empty-state" style="display: none;">
|
||
<div class="empty-state-icon">📭</div>
|
||
<h3>没有符合条件的股票</h3>
|
||
<p>请降低强度分阈值以查看更多股票</p>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div id="imageModal" class="modal">
|
||
<div class="modal-content">
|
||
<button class="close-modal" onclick="closeModal()">×</button>
|
||
<img id="modalImage" src="" alt="股票图表" onerror="handleModalImageError(this)">
|
||
</div>
|
||
</div>
|
||
<script>
|
||
// 内嵌数据
|
||
const allStocks = [
|
||
{
|
||
"idx": 28,
|
||
"code": "SH603379",
|
||
"name": "三美股份",
|
||
"strengthUp": 0.2718794483272821,
|
||
"strengthDown": 0.09070852657198746,
|
||
"direction": "up",
|
||
"widthRatio": 0.08922158280365546,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "False",
|
||
"boundaryUtilization": 0.0918991906342708,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.2718794483272821,
|
||
"chartPath": "charts/20260120_SH603379_三美股份.png",
|
||
"chartPathDetail": "charts/20260120_SH603379_三美股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 13,
|
||
"code": "SH600744",
|
||
"name": "华银电力",
|
||
"strengthUp": 0.15706248130235445,
|
||
"strengthDown": 0.05487856283191771,
|
||
"direction": "up",
|
||
"widthRatio": 0.2867596230842454,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "True",
|
||
"boundaryUtilization": 0.043431555801019366,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.15706248130235445,
|
||
"chartPath": "charts/20260120_SH600744_华银电力.png",
|
||
"chartPathDetail": "charts/20260120_SH600744_华银电力_detail.png"
|
||
},
|
||
{
|
||
"idx": 20,
|
||
"code": "SH601609",
|
||
"name": "金田股份",
|
||
"strengthUp": 0.12491668196385437,
|
||
"strengthDown": 0.08566223307080872,
|
||
"direction": "up",
|
||
"widthRatio": 0.03896315672868362,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 6,
|
||
"volumeConfirmed": "True",
|
||
"boundaryUtilization": 0.06788056841717838,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.12491668196385437,
|
||
"chartPath": "charts/20260120_SH601609_金田股份.png",
|
||
"chartPathDetail": "charts/20260120_SH601609_金田股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 95,
|
||
"code": "SZ300737",
|
||
"name": "科顺股份",
|
||
"strengthUp": 0.12060013192131139,
|
||
"strengthDown": 0.12060013192131139,
|
||
"direction": "none",
|
||
"widthRatio": 0.21325532904558048,
|
||
"touchesUpper": 6,
|
||
"touchesLower": 7,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.10726164130830072,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.12060013192131139,
|
||
"chartPath": "charts/20260120_SZ300737_科顺股份.png",
|
||
"chartPathDetail": "charts/20260120_SZ300737_科顺股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 91,
|
||
"code": "SZ300530",
|
||
"name": "领湃科技",
|
||
"strengthUp": 0.11111761818295247,
|
||
"strengthDown": 0.11111761818295247,
|
||
"direction": "none",
|
||
"widthRatio": 0.12780633375372022,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0779332041056322,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.11111761818295247,
|
||
"chartPath": "charts/20260120_SZ300530_领湃科技.png",
|
||
"chartPathDetail": "charts/20260120_SZ300530_领湃科技_detail.png"
|
||
},
|
||
{
|
||
"idx": 26,
|
||
"code": "SH603237",
|
||
"name": "五芳斋",
|
||
"strengthUp": 0.1024610736254772,
|
||
"strengthDown": 0.1024610736254772,
|
||
"direction": "none",
|
||
"widthRatio": 0.1737453100820701,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.11576413387880975,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.1024610736254772,
|
||
"chartPath": "charts/20260120_SH603237_五芳斋.png",
|
||
"chartPathDetail": "charts/20260120_SH603237_五芳斋_detail.png"
|
||
},
|
||
{
|
||
"idx": 76,
|
||
"code": "SZ002802",
|
||
"name": "洪汇新材",
|
||
"strengthUp": 0.10100693556969877,
|
||
"strengthDown": 0.10100693556969877,
|
||
"direction": "none",
|
||
"widthRatio": 0.23884176697328596,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.11825336342954114,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.10100693556969877,
|
||
"chartPath": "charts/20260120_SZ002802_洪汇新材.png",
|
||
"chartPathDetail": "charts/20260120_SZ002802_洪汇新材_detail.png"
|
||
},
|
||
{
|
||
"idx": 54,
|
||
"code": "SZ000722",
|
||
"name": "湖南发展",
|
||
"strengthUp": 0.10089807923588778,
|
||
"strengthDown": 0.10089807923588778,
|
||
"direction": "none",
|
||
"widthRatio": 0.16117444007433868,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08798114509673645,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.10089807923588778,
|
||
"chartPath": "charts/20260120_SZ000722_湖南发展.png",
|
||
"chartPathDetail": "charts/20260120_SZ000722_湖南发展_detail.png"
|
||
},
|
||
{
|
||
"idx": 22,
|
||
"code": "SH603005",
|
||
"name": "晶方科技",
|
||
"strengthUp": 0.1004173045532496,
|
||
"strengthDown": 0.1004173045532496,
|
||
"direction": "none",
|
||
"widthRatio": 0.34612788685827206,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 6,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.09423792705949945,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.1004173045532496,
|
||
"chartPath": "charts/20260120_SH603005_晶方科技.png",
|
||
"chartPathDetail": "charts/20260120_SH603005_晶方科技_detail.png"
|
||
},
|
||
{
|
||
"idx": 79,
|
||
"code": "SZ002966",
|
||
"name": "苏州银行",
|
||
"strengthUp": 0.09178123721898465,
|
||
"strengthDown": 0.09178123721898465,
|
||
"direction": "none",
|
||
"widthRatio": 0.15024073729732276,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.1047780210216016,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.09178123721898465,
|
||
"chartPath": "charts/20260120_SZ002966_苏州银行.png",
|
||
"chartPathDetail": "charts/20260120_SZ002966_苏州银行_detail.png"
|
||
},
|
||
{
|
||
"idx": 63,
|
||
"code": "SZ002142",
|
||
"name": "宁波银行",
|
||
"strengthUp": 0.09042608326894579,
|
||
"strengthDown": 0.09042608326894579,
|
||
"direction": "none",
|
||
"widthRatio": 0.13991351758720233,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 6,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.11480839114261941,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.09042608326894579,
|
||
"chartPath": "charts/20260120_SZ002142_宁波银行.png",
|
||
"chartPathDetail": "charts/20260120_SZ002142_宁波银行_detail.png"
|
||
},
|
||
{
|
||
"idx": 98,
|
||
"code": "SZ300892",
|
||
"name": "品渥食品",
|
||
"strengthUp": 0.08334022107272326,
|
||
"strengthDown": 0.08334022107272326,
|
||
"direction": "none",
|
||
"widthRatio": 0.2865112467693385,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.11654210122156917,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.08334022107272326,
|
||
"chartPath": "charts/20260120_SZ300892_品渥食品.png",
|
||
"chartPathDetail": "charts/20260120_SZ300892_品渥食品_detail.png"
|
||
},
|
||
{
|
||
"idx": 72,
|
||
"code": "SZ002594",
|
||
"name": "比亚迪",
|
||
"strengthUp": 0.0808193394980936,
|
||
"strengthDown": 0.0808193394980936,
|
||
"direction": "none",
|
||
"widthRatio": 0.08603808634243997,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0920929694726742,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.0808193394980936,
|
||
"chartPath": "charts/20260120_SZ002594_比亚迪.png",
|
||
"chartPathDetail": "charts/20260120_SZ002594_比亚迪_detail.png"
|
||
},
|
||
{
|
||
"idx": 97,
|
||
"code": "SZ300841",
|
||
"name": "康华生物",
|
||
"strengthUp": 0.07511559116446827,
|
||
"strengthDown": 0.07511559116446827,
|
||
"direction": "none",
|
||
"widthRatio": 0.13074436892117244,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08992690461040005,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.07511559116446827,
|
||
"chartPath": "charts/20260120_SZ300841_康华生物.png",
|
||
"chartPathDetail": "charts/20260120_SZ300841_康华生物_detail.png"
|
||
},
|
||
{
|
||
"idx": 21,
|
||
"code": "SH601868",
|
||
"name": "中国能建",
|
||
"strengthUp": 0.07285097771913748,
|
||
"strengthDown": 0.07285097771913748,
|
||
"direction": "none",
|
||
"widthRatio": 0.18980028469994004,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 10,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.060127412133448764,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.07285097771913748,
|
||
"chartPath": "charts/20260120_SH601868_中国能建.png",
|
||
"chartPathDetail": "charts/20260120_SH601868_中国能建_detail.png"
|
||
},
|
||
{
|
||
"idx": 34,
|
||
"code": "SH603990",
|
||
"name": "麦迪科技",
|
||
"strengthUp": 0.07122406340255104,
|
||
"strengthDown": 0.07122406340255104,
|
||
"direction": "none",
|
||
"widthRatio": 0.22196961351919475,
|
||
"touchesUpper": 6,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.10717686255472789,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.07122406340255104,
|
||
"chartPath": "charts/20260120_SH603990_麦迪科技.png",
|
||
"chartPathDetail": "charts/20260120_SH603990_麦迪科技_detail.png"
|
||
},
|
||
{
|
||
"idx": 60,
|
||
"code": "SZ001391",
|
||
"name": "国货航",
|
||
"strengthUp": 0.0693249791454885,
|
||
"strengthDown": 0.0693249791454885,
|
||
"direction": "none",
|
||
"widthRatio": 0.23528860034807667,
|
||
"touchesUpper": 6,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06875238312611007,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.0693249791454885,
|
||
"chartPath": "charts/20260120_SZ001391_国货航.png",
|
||
"chartPathDetail": "charts/20260120_SZ001391_国货航_detail.png"
|
||
},
|
||
{
|
||
"idx": 25,
|
||
"code": "SH603183",
|
||
"name": "建研院",
|
||
"strengthUp": 0.06877168132898767,
|
||
"strengthDown": 0.06877168132898767,
|
||
"direction": "none",
|
||
"widthRatio": 0.08924582407848107,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08633813680920435,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06877168132898767,
|
||
"chartPath": "charts/20260120_SH603183_建研院.png",
|
||
"chartPathDetail": "charts/20260120_SH603183_建研院_detail.png"
|
||
},
|
||
{
|
||
"idx": 29,
|
||
"code": "SH603527",
|
||
"name": "众源新材",
|
||
"strengthUp": 0.06822445969741203,
|
||
"strengthDown": 0.06822445969741203,
|
||
"direction": "none",
|
||
"widthRatio": 0.0950555464327197,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.09129518771035168,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06822445969741203,
|
||
"chartPath": "charts/20260120_SH603527_众源新材.png",
|
||
"chartPathDetail": "charts/20260120_SH603527_众源新材_detail.png"
|
||
},
|
||
{
|
||
"idx": 27,
|
||
"code": "SH603315",
|
||
"name": "福鞍股份",
|
||
"strengthUp": 0.06614875251036849,
|
||
"strengthDown": 0.06614875251036849,
|
||
"direction": "none",
|
||
"widthRatio": 0.22510872342227875,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.09940247290262211,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06614875251036849,
|
||
"chartPath": "charts/20260120_SH603315_福鞍股份.png",
|
||
"chartPathDetail": "charts/20260120_SH603315_福鞍股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 5,
|
||
"code": "SH600281",
|
||
"name": "华阳新材",
|
||
"strengthUp": 0.06527286407926562,
|
||
"strengthDown": 0.06527286407926562,
|
||
"direction": "none",
|
||
"widthRatio": 0.07438652259509536,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08602691428598316,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06527286407926562,
|
||
"chartPath": "charts/20260120_SH600281_华阳新材.png",
|
||
"chartPathDetail": "charts/20260120_SH600281_华阳新材_detail.png"
|
||
},
|
||
{
|
||
"idx": 19,
|
||
"code": "SH601236",
|
||
"name": "红塔证券",
|
||
"strengthUp": 0.06457139044520376,
|
||
"strengthDown": 0.06457139044520376,
|
||
"direction": "none",
|
||
"widthRatio": 0.05887454623774115,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08339839370383481,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06457139044520376,
|
||
"chartPath": "charts/20260120_SH601236_红塔证券.png",
|
||
"chartPathDetail": "charts/20260120_SH601236_红塔证券_detail.png"
|
||
},
|
||
{
|
||
"idx": 87,
|
||
"code": "SZ300328",
|
||
"name": "宜安科技",
|
||
"strengthUp": 0.06316736600444743,
|
||
"strengthDown": 0.06316736600444743,
|
||
"direction": "none",
|
||
"widthRatio": 0.13703331095825805,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 6,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08584252992085407,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06316736600444743,
|
||
"chartPath": "charts/20260120_SZ300328_宜安科技.png",
|
||
"chartPathDetail": "charts/20260120_SZ300328_宜安科技_detail.png"
|
||
},
|
||
{
|
||
"idx": 24,
|
||
"code": "SH603118",
|
||
"name": "共进股份",
|
||
"strengthUp": 0.06283308319739513,
|
||
"strengthDown": 0.06283308319739513,
|
||
"direction": "none",
|
||
"widthRatio": 0.2105774382355951,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0901561123152923,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06283308319739513,
|
||
"chartPath": "charts/20260120_SH603118_共进股份.png",
|
||
"chartPathDetail": "charts/20260120_SH603118_共进股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 57,
|
||
"code": "SZ000931",
|
||
"name": "中关村",
|
||
"strengthUp": 0.06058140475842155,
|
||
"strengthDown": 0.06058140475842155,
|
||
"direction": "none",
|
||
"widthRatio": 0.2691795834744121,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.09683245337124678,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.06058140475842155,
|
||
"chartPath": "charts/20260120_SZ000931_中关村.png",
|
||
"chartPathDetail": "charts/20260120_SZ000931_中关村_detail.png"
|
||
},
|
||
{
|
||
"idx": 38,
|
||
"code": "SH688089",
|
||
"name": "嘉必优",
|
||
"strengthUp": 0.05992176218369937,
|
||
"strengthDown": 0.05992176218369937,
|
||
"direction": "none",
|
||
"widthRatio": 0.15997473554088507,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06899678345140317,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.05992176218369937,
|
||
"chartPath": "charts/20260120_SH688089_嘉必优.png",
|
||
"chartPathDetail": "charts/20260120_SH688089_嘉必优_detail.png"
|
||
},
|
||
{
|
||
"idx": 100,
|
||
"code": "SZ300998",
|
||
"name": "宁波方正",
|
||
"strengthUp": 0.05892778600698566,
|
||
"strengthDown": 0.05892778600698566,
|
||
"direction": "none",
|
||
"widthRatio": 0.20127021221897767,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0845378018842857,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.05892778600698566,
|
||
"chartPath": "charts/20260120_SZ300998_宁波方正.png",
|
||
"chartPathDetail": "charts/20260120_SZ300998_宁波方正_detail.png"
|
||
},
|
||
{
|
||
"idx": 59,
|
||
"code": "SZ001287",
|
||
"name": "中电港",
|
||
"strengthUp": 0.05492696430715849,
|
||
"strengthDown": 0.05492696430715849,
|
||
"direction": "none",
|
||
"widthRatio": 0.12706716054053835,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06085899816450469,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.05492696430715849,
|
||
"chartPath": "charts/20260120_SZ001287_中电港.png",
|
||
"chartPathDetail": "charts/20260120_SZ001287_中电港_detail.png"
|
||
},
|
||
{
|
||
"idx": 94,
|
||
"code": "SZ300683",
|
||
"name": "海特生物",
|
||
"strengthUp": 0.04511755232687821,
|
||
"strengthDown": 0.053844470846544146,
|
||
"direction": "none",
|
||
"widthRatio": 0.0440222754787381,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.059218473592453844,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.053844470846544146,
|
||
"chartPath": "charts/20260120_SZ300683_海特生物.png",
|
||
"chartPathDetail": "charts/20260120_SZ300683_海特生物_detail.png"
|
||
},
|
||
{
|
||
"idx": 67,
|
||
"code": "SZ002343",
|
||
"name": "慈文传媒",
|
||
"strengthUp": 0.053350355288705936,
|
||
"strengthDown": 0.053350355288705936,
|
||
"direction": "none",
|
||
"widthRatio": 0.2873372553832457,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08862613248315838,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.053350355288705936,
|
||
"chartPath": "charts/20260120_SZ002343_慈文传媒.png",
|
||
"chartPathDetail": "charts/20260120_SZ002343_慈文传媒_detail.png"
|
||
},
|
||
{
|
||
"idx": 77,
|
||
"code": "SZ002857",
|
||
"name": "三晖电气",
|
||
"strengthUp": 0.05233292182558794,
|
||
"strengthDown": 0.05233292182558794,
|
||
"direction": "none",
|
||
"widthRatio": 0.1347956582800327,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.07424551036438445,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.05233292182558794,
|
||
"chartPath": "charts/20260120_SZ002857_三晖电气.png",
|
||
"chartPathDetail": "charts/20260120_SZ002857_三晖电气_detail.png"
|
||
},
|
||
{
|
||
"idx": 33,
|
||
"code": "SH603900",
|
||
"name": "莱绅通灵",
|
||
"strengthUp": 0.049120854458999996,
|
||
"strengthDown": 0.049120854458999996,
|
||
"direction": "none",
|
||
"widthRatio": 0.13682392471321897,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.07009287703046332,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.049120854458999996,
|
||
"chartPath": "charts/20260120_SH603900_莱绅通灵.png",
|
||
"chartPathDetail": "charts/20260120_SH603900_莱绅通灵_detail.png"
|
||
},
|
||
{
|
||
"idx": 31,
|
||
"code": "SH603707",
|
||
"name": "健友股份",
|
||
"strengthUp": 0.04872350052593199,
|
||
"strengthDown": 0.04872350052593199,
|
||
"direction": "none",
|
||
"widthRatio": 0.00781033600291944,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06061780789665496,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04872350052593199,
|
||
"chartPath": "charts/20260120_SH603707_健友股份.png",
|
||
"chartPathDetail": "charts/20260120_SH603707_健友股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 7,
|
||
"code": "SH600395",
|
||
"name": "盘江股份",
|
||
"strengthUp": 0.04829618142276936,
|
||
"strengthDown": 0.04829618142276936,
|
||
"direction": "none",
|
||
"widthRatio": 0.06674904774137999,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06312683295612573,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04829618142276936,
|
||
"chartPath": "charts/20260120_SH600395_盘江股份.png",
|
||
"chartPathDetail": "charts/20260120_SH600395_盘江股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 93,
|
||
"code": "SZ300632",
|
||
"name": "光莆股份",
|
||
"strengthUp": 0.04818691391738742,
|
||
"strengthDown": 0.042191281646060855,
|
||
"direction": "none",
|
||
"widthRatio": 0.02846616403214607,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.054809356716155194,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04818691391738742,
|
||
"chartPath": "charts/20260120_SZ300632_光莆股份.png",
|
||
"chartPathDetail": "charts/20260120_SZ300632_光莆股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 40,
|
||
"code": "SH688202",
|
||
"name": "美迪西",
|
||
"strengthUp": 0.04758849421328544,
|
||
"strengthDown": 0.04758849421328544,
|
||
"direction": "none",
|
||
"widthRatio": 0.31351008126626717,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06468849967464027,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04758849421328544,
|
||
"chartPath": "charts/20260120_SH688202_美迪西.png",
|
||
"chartPathDetail": "charts/20260120_SH688202_美迪西_detail.png"
|
||
},
|
||
{
|
||
"idx": 107,
|
||
"code": "SZ301458",
|
||
"name": "钧崴电子",
|
||
"strengthUp": 0.04739175614905136,
|
||
"strengthDown": 0.04739175614905136,
|
||
"direction": "none",
|
||
"widthRatio": 0.4366678022030362,
|
||
"touchesUpper": 5,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08774351971765405,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04739175614905136,
|
||
"chartPath": "charts/20260120_SZ301458_钧崴电子.png",
|
||
"chartPathDetail": "charts/20260120_SZ301458_钧崴电子_detail.png"
|
||
},
|
||
{
|
||
"idx": 105,
|
||
"code": "SZ301290",
|
||
"name": "东星医疗",
|
||
"strengthUp": 0.047309647800758865,
|
||
"strengthDown": 0.047309647800758865,
|
||
"direction": "none",
|
||
"widthRatio": 0.23779614697305917,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.07509605911987326,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.047309647800758865,
|
||
"chartPath": "charts/20260120_SZ301290_东星医疗.png",
|
||
"chartPathDetail": "charts/20260120_SZ301290_东星医疗_detail.png"
|
||
},
|
||
{
|
||
"idx": 35,
|
||
"code": "SH605138",
|
||
"name": "盛泰集团",
|
||
"strengthUp": 0.04723792082752581,
|
||
"strengthDown": 0.04723792082752581,
|
||
"direction": "none",
|
||
"widthRatio": 0.29759336000089764,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06901825106543649,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04723792082752581,
|
||
"chartPath": "charts/20260120_SH605138_盛泰集团.png",
|
||
"chartPathDetail": "charts/20260120_SH605138_盛泰集团_detail.png"
|
||
},
|
||
{
|
||
"idx": 42,
|
||
"code": "SH688318",
|
||
"name": "财富趋势",
|
||
"strengthUp": 0.045923049325178864,
|
||
"strengthDown": 0.045923049325178864,
|
||
"direction": "none",
|
||
"widthRatio": 0.27505993688351926,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.07640386590199624,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.045923049325178864,
|
||
"chartPath": "charts/20260120_SH688318_财富趋势.png",
|
||
"chartPathDetail": "charts/20260120_SH688318_财富趋势_detail.png"
|
||
},
|
||
{
|
||
"idx": 99,
|
||
"code": "SZ300946",
|
||
"name": "恒而达",
|
||
"strengthUp": 0.04570070738192357,
|
||
"strengthDown": 0.04570070738192357,
|
||
"direction": "none",
|
||
"widthRatio": 0.22719307281507875,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.07211795708975773,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04570070738192357,
|
||
"chartPath": "charts/20260120_SZ300946_恒而达.png",
|
||
"chartPathDetail": "charts/20260120_SZ300946_恒而达_detail.png"
|
||
},
|
||
{
|
||
"idx": 61,
|
||
"code": "SZ002042",
|
||
"name": "华孚时尚",
|
||
"strengthUp": 0.045680217648273125,
|
||
"strengthDown": 0.045680217648273125,
|
||
"direction": "none",
|
||
"widthRatio": 0.1301004225125526,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0651213418039477,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.045680217648273125,
|
||
"chartPath": "charts/20260120_SZ002042_华孚时尚.png",
|
||
"chartPathDetail": "charts/20260120_SZ002042_华孚时尚_detail.png"
|
||
},
|
||
{
|
||
"idx": 86,
|
||
"code": "SZ300278",
|
||
"name": "华昌达",
|
||
"strengthUp": 0.04538430276199708,
|
||
"strengthDown": 0.04538430276199708,
|
||
"direction": "none",
|
||
"widthRatio": 0.36793662378306974,
|
||
"touchesUpper": 4,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.08411646140089421,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04538430276199708,
|
||
"chartPath": "charts/20260120_SZ300278_华昌达.png",
|
||
"chartPathDetail": "charts/20260120_SZ300278_华昌达_detail.png"
|
||
},
|
||
{
|
||
"idx": 30,
|
||
"code": "SH603618",
|
||
"name": "杭电股份",
|
||
"strengthUp": 0.04444160124729136,
|
||
"strengthDown": 0.04444160124729136,
|
||
"direction": "none",
|
||
"widthRatio": 0.15144818048774875,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.048952579398915515,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04444160124729136,
|
||
"chartPath": "charts/20260120_SH603618_杭电股份.png",
|
||
"chartPathDetail": "charts/20260120_SH603618_杭电股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 96,
|
||
"code": "SZ300790",
|
||
"name": "宇瞳光学",
|
||
"strengthUp": 0.043513037557854975,
|
||
"strengthDown": 0.043513037557854975,
|
||
"direction": "none",
|
||
"widthRatio": 0.3018970777007482,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0724700244252632,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.043513037557854975,
|
||
"chartPath": "charts/20260120_SZ300790_宇瞳光学.png",
|
||
"chartPathDetail": "charts/20260120_SZ300790_宇瞳光学_detail.png"
|
||
},
|
||
{
|
||
"idx": 83,
|
||
"code": "SZ300128",
|
||
"name": "锦富技术",
|
||
"strengthUp": 0.04167849536810688,
|
||
"strengthDown": 0.04167849536810688,
|
||
"direction": "none",
|
||
"widthRatio": 0.3612532098770752,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.07755680398152726,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04167849536810688,
|
||
"chartPath": "charts/20260120_SZ300128_锦富技术.png",
|
||
"chartPathDetail": "charts/20260120_SZ300128_锦富技术_detail.png"
|
||
},
|
||
{
|
||
"idx": 17,
|
||
"code": "SH600984",
|
||
"name": "建设机械",
|
||
"strengthUp": 0.04124324183514141,
|
||
"strengthDown": 0.04124324183514141,
|
||
"direction": "none",
|
||
"widthRatio": 0.06214193787665361,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 5,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.051936635225559434,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04124324183514141,
|
||
"chartPath": "charts/20260120_SH600984_建设机械.png",
|
||
"chartPathDetail": "charts/20260120_SH600984_建设机械_detail.png"
|
||
},
|
||
{
|
||
"idx": 9,
|
||
"code": "SH600531",
|
||
"name": "豫光金铅",
|
||
"strengthUp": 0.04121635294344127,
|
||
"strengthDown": 0.04121635294344127,
|
||
"direction": "none",
|
||
"widthRatio": 0.22872671560227054,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.053857924216099126,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04121635294344127,
|
||
"chartPath": "charts/20260120_SH600531_豫光金铅.png",
|
||
"chartPathDetail": "charts/20260120_SH600531_豫光金铅_detail.png"
|
||
},
|
||
{
|
||
"idx": 75,
|
||
"code": "SZ002748",
|
||
"name": "世龙实业",
|
||
"strengthUp": 0.040859083087833745,
|
||
"strengthDown": 0.040859083087833745,
|
||
"direction": "none",
|
||
"widthRatio": 0.1157279750374011,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.057814545135324975,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.040859083087833745,
|
||
"chartPath": "charts/20260120_SZ002748_世龙实业.png",
|
||
"chartPathDetail": "charts/20260120_SZ002748_世龙实业_detail.png"
|
||
},
|
||
{
|
||
"idx": 55,
|
||
"code": "SZ000796",
|
||
"name": "凯撒旅业",
|
||
"strengthUp": 0.04002292068141737,
|
||
"strengthDown": 0.04002292068141737,
|
||
"direction": "none",
|
||
"widthRatio": 0.2257372064001412,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 2,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.06351402000113422,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.04002292068141737,
|
||
"chartPath": "charts/20260120_SZ000796_凯撒旅业.png",
|
||
"chartPathDetail": "charts/20260120_SZ000796_凯撒旅业_detail.png"
|
||
},
|
||
{
|
||
"idx": 14,
|
||
"code": "SH600795",
|
||
"name": "国电电力",
|
||
"strengthUp": 0.0381352739657863,
|
||
"strengthDown": 0.018200466054414978,
|
||
"direction": "up",
|
||
"widthRatio": 0.032561936783290356,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "False",
|
||
"boundaryUtilization": 0.020274915613298243,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.0381352739657863,
|
||
"chartPath": "charts/20260120_SH600795_国电电力.png",
|
||
"chartPathDetail": "charts/20260120_SH600795_国电电力_detail.png"
|
||
},
|
||
{
|
||
"idx": 73,
|
||
"code": "SZ002644",
|
||
"name": "佛慈制药",
|
||
"strengthUp": 0.03617763751854338,
|
||
"strengthDown": 0.03617763751854338,
|
||
"direction": "none",
|
||
"widthRatio": 0.22414110145582697,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.05765117738174981,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.03617763751854338,
|
||
"chartPath": "charts/20260120_SZ002644_佛慈制药.png",
|
||
"chartPathDetail": "charts/20260120_SZ002644_佛慈制药_detail.png"
|
||
},
|
||
{
|
||
"idx": 65,
|
||
"code": "SZ002242",
|
||
"name": "九阳股份",
|
||
"strengthUp": 0.03241479917766246,
|
||
"strengthDown": 0.03241479917766246,
|
||
"direction": "none",
|
||
"widthRatio": 0.10849554328152096,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.045248660897291,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.03241479917766246,
|
||
"chartPath": "charts/20260120_SZ002242_九阳股份.png",
|
||
"chartPathDetail": "charts/20260120_SZ002242_九阳股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 15,
|
||
"code": "SH600846",
|
||
"name": "同济科技",
|
||
"strengthUp": 0.03030281745352293,
|
||
"strengthDown": 0.03030281745352293,
|
||
"direction": "none",
|
||
"widthRatio": 0.04230672506104188,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.037934929758741257,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.03030281745352293,
|
||
"chartPath": "charts/20260120_SH600846_同济科技.png",
|
||
"chartPathDetail": "charts/20260120_SH600846_同济科技_detail.png"
|
||
},
|
||
{
|
||
"idx": 49,
|
||
"code": "SZ000039",
|
||
"name": "中集集团",
|
||
"strengthUp": 0.027762834661772765,
|
||
"strengthDown": 0.027762834661772765,
|
||
"direction": "none",
|
||
"widthRatio": 0.14102846289352128,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.040469628970140684,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.027762834661772765,
|
||
"chartPath": "charts/20260120_SZ000039_中集集团.png",
|
||
"chartPathDetail": "charts/20260120_SZ000039_中集集团_detail.png"
|
||
},
|
||
{
|
||
"idx": 78,
|
||
"code": "SZ002910",
|
||
"name": "庄园牧场",
|
||
"strengthUp": 0.02595109833198887,
|
||
"strengthDown": 0.02595109833198887,
|
||
"direction": "none",
|
||
"widthRatio": 0.057656261422220724,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.028093910864048357,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.02595109833198887,
|
||
"chartPath": "charts/20260120_SZ002910_庄园牧场.png",
|
||
"chartPathDetail": "charts/20260120_SZ002910_庄园牧场_detail.png"
|
||
},
|
||
{
|
||
"idx": 64,
|
||
"code": "SZ002192",
|
||
"name": "融捷股份",
|
||
"strengthUp": 0.02338013665457102,
|
||
"strengthDown": 0.02338013665457102,
|
||
"direction": "none",
|
||
"widthRatio": 0.23256546452034127,
|
||
"touchesUpper": 2,
|
||
"touchesLower": 4,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.03866972407311103,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.02338013665457102,
|
||
"chartPath": "charts/20260120_SZ002192_融捷股份.png",
|
||
"chartPathDetail": "charts/20260120_SZ002192_融捷股份_detail.png"
|
||
},
|
||
{
|
||
"idx": 44,
|
||
"code": "SH688472",
|
||
"name": "阿特斯",
|
||
"strengthUp": 0.022000344046398605,
|
||
"strengthDown": 0.022000344046398605,
|
||
"direction": "none",
|
||
"widthRatio": 0.22726004705445743,
|
||
"touchesUpper": 3,
|
||
"touchesLower": 3,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.03170337474083884,
|
||
"date": 20260120,
|
||
"hasTriangle": true,
|
||
"strength": 0.022000344046398605,
|
||
"chartPath": "charts/20260120_SH688472_阿特斯.png",
|
||
"chartPathDetail": "charts/20260120_SH688472_阿特斯_detail.png"
|
||
},
|
||
{
|
||
"idx": 0,
|
||
"code": "SH600000",
|
||
"name": "浦发银行",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600000_浦发银行.png",
|
||
"chartPathDetail": "charts/20260120_SH600000_浦发银行_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 1,
|
||
"code": "SH600063",
|
||
"name": "皖维高新",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600063_皖维高新.png",
|
||
"chartPathDetail": "charts/20260120_SH600063_皖维高新_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 2,
|
||
"code": "SH600113",
|
||
"name": "浙江东日",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600113_浙江东日.png",
|
||
"chartPathDetail": "charts/20260120_SH600113_浙江东日_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 3,
|
||
"code": "SH600171",
|
||
"name": "上海贝岭",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600171_上海贝岭.png",
|
||
"chartPathDetail": "charts/20260120_SH600171_上海贝岭_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 4,
|
||
"code": "SH600226",
|
||
"name": "亨通股份",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600226_亨通股份.png",
|
||
"chartPathDetail": "charts/20260120_SH600226_亨通股份_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 6,
|
||
"code": "SH600336",
|
||
"name": "澳柯玛",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600336_澳柯玛.png",
|
||
"chartPathDetail": "charts/20260120_SH600336_澳柯玛_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 8,
|
||
"code": "SH600475",
|
||
"name": "华光环能",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600475_华光环能.png",
|
||
"chartPathDetail": "charts/20260120_SH600475_华光环能_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 10,
|
||
"code": "SH600588",
|
||
"name": "用友网络",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600588_用友网络.png",
|
||
"chartPathDetail": "charts/20260120_SH600588_用友网络_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 11,
|
||
"code": "SH600640",
|
||
"name": "国脉文化",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600640_国脉文化.png",
|
||
"chartPathDetail": "charts/20260120_SH600640_国脉文化_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 12,
|
||
"code": "SH600693",
|
||
"name": "东百集团",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600693_东百集团.png",
|
||
"chartPathDetail": "charts/20260120_SH600693_东百集团_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 16,
|
||
"code": "SH600898",
|
||
"name": "*ST美讯",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH600898_ST美讯.png",
|
||
"chartPathDetail": "charts/20260120_SH600898_ST美讯_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 18,
|
||
"code": "SH601096",
|
||
"name": "宏盛华源",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH601096_宏盛华源.png",
|
||
"chartPathDetail": "charts/20260120_SH601096_宏盛华源_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 23,
|
||
"code": "SH603061",
|
||
"name": "金海通",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH603061_金海通.png",
|
||
"chartPathDetail": "charts/20260120_SH603061_金海通_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 32,
|
||
"code": "SH603813",
|
||
"name": "*ST原尚",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH603813_ST原尚.png",
|
||
"chartPathDetail": "charts/20260120_SH603813_ST原尚_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 36,
|
||
"code": "SH605368",
|
||
"name": "蓝天燃气",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH605368_蓝天燃气.png",
|
||
"chartPathDetail": "charts/20260120_SH605368_蓝天燃气_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 37,
|
||
"code": "SH688031",
|
||
"name": "星环科技",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688031_星环科技.png",
|
||
"chartPathDetail": "charts/20260120_SH688031_星环科技_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 39,
|
||
"code": "SH688147",
|
||
"name": "微导纳米",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688147_微导纳米.png",
|
||
"chartPathDetail": "charts/20260120_SH688147_微导纳米_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 41,
|
||
"code": "SH688262",
|
||
"name": "国芯科技",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688262_国芯科技.png",
|
||
"chartPathDetail": "charts/20260120_SH688262_国芯科技_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 43,
|
||
"code": "SH688377",
|
||
"name": "迪威尔",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688377_迪威尔.png",
|
||
"chartPathDetail": "charts/20260120_SH688377_迪威尔_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 45,
|
||
"code": "SH688550",
|
||
"name": "瑞联新材",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688550_瑞联新材.png",
|
||
"chartPathDetail": "charts/20260120_SH688550_瑞联新材_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 46,
|
||
"code": "SH688607",
|
||
"name": "康众医疗",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688607_康众医疗.png",
|
||
"chartPathDetail": "charts/20260120_SH688607_康众医疗_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 47,
|
||
"code": "SH688679",
|
||
"name": "通源环境",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688679_通源环境.png",
|
||
"chartPathDetail": "charts/20260120_SH688679_通源环境_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 48,
|
||
"code": "SH688776",
|
||
"name": "国光电气",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SH688776_国光电气.png",
|
||
"chartPathDetail": "charts/20260120_SH688776_国光电气_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 50,
|
||
"code": "SZ000411",
|
||
"name": "英特集团",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ000411_英特集团.png",
|
||
"chartPathDetail": "charts/20260120_SZ000411_英特集团_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 51,
|
||
"code": "SZ000535",
|
||
"name": "*ST 猴王",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ000535_ST 猴王.png",
|
||
"chartPathDetail": "charts/20260120_SZ000535_ST 猴王_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 52,
|
||
"code": "SZ000593",
|
||
"name": "德龙汇能",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ000593_德龙汇能.png",
|
||
"chartPathDetail": "charts/20260120_SZ000593_德龙汇能_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 53,
|
||
"code": "SZ000662",
|
||
"name": "天夏退",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ000662_天夏退.png",
|
||
"chartPathDetail": "charts/20260120_SZ000662_天夏退_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 56,
|
||
"code": "SZ000866",
|
||
"name": "扬子石化",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ000866_扬子石化.png",
|
||
"chartPathDetail": "charts/20260120_SZ000866_扬子石化_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 58,
|
||
"code": "SZ000998",
|
||
"name": "隆平高科",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ000998_隆平高科.png",
|
||
"chartPathDetail": "charts/20260120_SZ000998_隆平高科_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 62,
|
||
"code": "SZ002092",
|
||
"name": "中泰化学",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002092_中泰化学.png",
|
||
"chartPathDetail": "charts/20260120_SZ002092_中泰化学_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 66,
|
||
"code": "SZ002293",
|
||
"name": "罗莱生活",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002293_罗莱生活.png",
|
||
"chartPathDetail": "charts/20260120_SZ002293_罗莱生活_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 68,
|
||
"code": "SZ002393",
|
||
"name": "力生制药",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002393_力生制药.png",
|
||
"chartPathDetail": "charts/20260120_SZ002393_力生制药_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 69,
|
||
"code": "SZ002443",
|
||
"name": "金洲管道",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002443_金洲管道.png",
|
||
"chartPathDetail": "charts/20260120_SZ002443_金洲管道_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 70,
|
||
"code": "SZ002493",
|
||
"name": "荣盛石化",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002493_荣盛石化.png",
|
||
"chartPathDetail": "charts/20260120_SZ002493_荣盛石化_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 71,
|
||
"code": "SZ002544",
|
||
"name": "普天科技",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002544_普天科技.png",
|
||
"chartPathDetail": "charts/20260120_SZ002544_普天科技_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 74,
|
||
"code": "SZ002694",
|
||
"name": "顾地科技",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ002694_顾地科技.png",
|
||
"chartPathDetail": "charts/20260120_SZ002694_顾地科技_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 80,
|
||
"code": "SZ003019",
|
||
"name": "宸展光电",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ003019_宸展光电.png",
|
||
"chartPathDetail": "charts/20260120_SZ003019_宸展光电_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 81,
|
||
"code": "SZ300027",
|
||
"name": "华谊兄弟",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300027_华谊兄弟.png",
|
||
"chartPathDetail": "charts/20260120_SZ300027_华谊兄弟_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 82,
|
||
"code": "SZ300078",
|
||
"name": "思创医惠",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300078_思创医惠.png",
|
||
"chartPathDetail": "charts/20260120_SZ300078_思创医惠_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 84,
|
||
"code": "SZ300178",
|
||
"name": "腾邦退(退市)",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300178_腾邦退(退市).png",
|
||
"chartPathDetail": "charts/20260120_SZ300178_腾邦退(退市)_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 85,
|
||
"code": "SZ300228",
|
||
"name": "富瑞特装",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300228_富瑞特装.png",
|
||
"chartPathDetail": "charts/20260120_SZ300228_富瑞特装_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 88,
|
||
"code": "SZ300379",
|
||
"name": "*ST东通",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300379_ST东通.png",
|
||
"chartPathDetail": "charts/20260120_SZ300379_ST东通_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 89,
|
||
"code": "SZ300429",
|
||
"name": "强力新材",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300429_强力新材.png",
|
||
"chartPathDetail": "charts/20260120_SZ300429_强力新材_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 90,
|
||
"code": "SZ300479",
|
||
"name": "神思电子",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300479_神思电子.png",
|
||
"chartPathDetail": "charts/20260120_SZ300479_神思电子_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 92,
|
||
"code": "SZ300582",
|
||
"name": "英飞特",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ300582_英飞特.png",
|
||
"chartPathDetail": "charts/20260120_SZ300582_英飞特_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 101,
|
||
"code": "SZ301051",
|
||
"name": "信濠光电",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ301051_信濠光电.png",
|
||
"chartPathDetail": "charts/20260120_SZ301051_信濠光电_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 102,
|
||
"code": "SZ301107",
|
||
"name": "瑜欣电子",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ301107_瑜欣电子.png",
|
||
"chartPathDetail": "charts/20260120_SZ301107_瑜欣电子_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 103,
|
||
"code": "SZ301169",
|
||
"name": "零点有数",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ301169_零点有数.png",
|
||
"chartPathDetail": "charts/20260120_SZ301169_零点有数_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 104,
|
||
"code": "SZ301225",
|
||
"name": "恒勃股份",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ301225_恒勃股份.png",
|
||
"chartPathDetail": "charts/20260120_SZ301225_恒勃股份_detail.png",
|
||
"hasTriangle": false
|
||
},
|
||
{
|
||
"idx": 106,
|
||
"code": "SZ301355",
|
||
"name": "南王科技",
|
||
"strengthUp": 0.0,
|
||
"strengthDown": 0.0,
|
||
"strength": 0.0,
|
||
"direction": "none",
|
||
"widthRatio": 0.0,
|
||
"touchesUpper": 0,
|
||
"touchesLower": 0,
|
||
"volumeConfirmed": "",
|
||
"boundaryUtilization": 0.0,
|
||
"date": 20260120,
|
||
"chartPath": "charts/20260120_SZ301355_南王科技.png",
|
||
"chartPathDetail": "charts/20260120_SZ301355_南王科技_detail.png",
|
||
"hasTriangle": false
|
||
}
|
||
];
|
||
let currentThreshold = 0;
|
||
let showDetailCharts = false;
|
||
|
||
// 筛选和排序状态
|
||
let filters = {
|
||
direction: 'all', // 'all', 'up', 'down', 'none'
|
||
volume: 'all' // 'all', 'true', 'false'
|
||
};
|
||
let sortBy = 'strength'; // 'strength', 'widthRatio', 'touches'
|
||
let sortOrder = 'desc'; // 'desc', 'asc'
|
||
let searchQuery = '';
|
||
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
setupEventListeners();
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
function setupEventListeners() {
|
||
// 强度滑块
|
||
const slider = document.getElementById('strengthSlider');
|
||
const sliderTrack = document.getElementById('sliderTrack');
|
||
const valueDisplay = document.getElementById('strengthValue');
|
||
|
||
slider.addEventListener('input', function() {
|
||
currentThreshold = parseFloat(this.value);
|
||
valueDisplay.textContent = currentThreshold.toFixed(2);
|
||
sliderTrack.style.setProperty('--slider-value', (currentThreshold * 100) + '%');
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
// 搜索框
|
||
const searchInput = document.getElementById('searchInput');
|
||
const searchBox = document.querySelector('.search-box');
|
||
const clearSearch = document.getElementById('clearSearch');
|
||
|
||
searchInput.addEventListener('input', function() {
|
||
searchQuery = this.value;
|
||
if (searchQuery) {
|
||
searchBox.classList.add('has-value');
|
||
} else {
|
||
searchBox.classList.remove('has-value');
|
||
}
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
clearSearch.addEventListener('click', function() {
|
||
searchInput.value = '';
|
||
searchQuery = '';
|
||
searchBox.classList.remove('has-value');
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
// 排序选择
|
||
const sortSelect = document.getElementById('sortSelect');
|
||
sortSelect.addEventListener('change', function() {
|
||
sortBy = this.value;
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
// 排序顺序切换
|
||
const sortOrderBtn = document.getElementById('sortOrder');
|
||
sortOrderBtn.addEventListener('click', function() {
|
||
sortOrder = sortOrder === 'desc' ? 'asc' : 'desc';
|
||
this.textContent = sortOrder === 'desc' ? '↓' : '↑';
|
||
this.classList.toggle('active', sortOrder === 'desc');
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
// 详细图切换
|
||
const detailToggle = document.getElementById('detailToggle');
|
||
detailToggle.addEventListener('click', function() {
|
||
showDetailCharts = !showDetailCharts;
|
||
this.textContent = showDetailCharts ? '详细图: 开' : '详细图: 关';
|
||
this.classList.toggle('active', showDetailCharts);
|
||
filterAndDisplayStocks();
|
||
});
|
||
|
||
// 方向筛选芯片
|
||
const directionFilter = document.getElementById('directionFilter');
|
||
directionFilter.addEventListener('click', function(e) {
|
||
if (e.target.classList.contains('filter-chip')) {
|
||
directionFilter.querySelectorAll('.filter-chip').forEach(chip => chip.classList.remove('active'));
|
||
e.target.classList.add('active');
|
||
filters.direction = e.target.dataset.value;
|
||
filterAndDisplayStocks();
|
||
}
|
||
});
|
||
|
||
// 放量筛选芯片
|
||
const volumeFilter = document.getElementById('volumeFilter');
|
||
volumeFilter.addEventListener('click', function(e) {
|
||
if (e.target.classList.contains('filter-chip')) {
|
||
volumeFilter.querySelectorAll('.filter-chip').forEach(chip => chip.classList.remove('active'));
|
||
e.target.classList.add('active');
|
||
filters.volume = e.target.dataset.value;
|
||
filterAndDisplayStocks();
|
||
}
|
||
});
|
||
|
||
// 重置按钮
|
||
document.getElementById('resetBtn').addEventListener('click', resetFilters);
|
||
|
||
// 模态框
|
||
document.getElementById('imageModal').addEventListener('click', function(e) {
|
||
if (e.target === this) closeModal();
|
||
});
|
||
}
|
||
|
||
function resetFilters() {
|
||
// 重置所有筛选和排序状态
|
||
currentThreshold = 0;
|
||
filters = { direction: 'all', volume: 'all' };
|
||
sortBy = 'strength';
|
||
sortOrder = 'desc';
|
||
searchQuery = '';
|
||
|
||
// 重置UI
|
||
document.getElementById('strengthSlider').value = 0;
|
||
document.getElementById('strengthValue').textContent = '0.00';
|
||
document.getElementById('sliderTrack').style.setProperty('--slider-value', '0%');
|
||
|
||
document.getElementById('searchInput').value = '';
|
||
document.querySelector('.search-box').classList.remove('has-value');
|
||
|
||
document.getElementById('sortSelect').value = 'strength';
|
||
const sortOrderBtn = document.getElementById('sortOrder');
|
||
sortOrderBtn.textContent = '↓';
|
||
sortOrderBtn.classList.add('active');
|
||
|
||
document.querySelectorAll('#directionFilter .filter-chip').forEach((chip, i) => {
|
||
chip.classList.toggle('active', i === 0);
|
||
});
|
||
filters.direction = 'all';
|
||
|
||
document.querySelectorAll('#volumeFilter .filter-chip').forEach((chip, i) => {
|
||
chip.classList.toggle('active', i === 0);
|
||
});
|
||
filters.volume = 'all';
|
||
|
||
filterAndDisplayStocks();
|
||
}
|
||
|
||
function filterAndDisplayStocks() {
|
||
let result = [...allStocks];
|
||
|
||
// 强度阈值筛选
|
||
result = result.filter(stock => stock.strength >= currentThreshold);
|
||
|
||
// 方向筛选
|
||
if (filters.direction !== 'all') {
|
||
result = result.filter(stock => stock.direction === filters.direction);
|
||
}
|
||
|
||
// 放量确认筛选
|
||
if (filters.volume !== 'all') {
|
||
const value = filters.volume === 'true';
|
||
result = result.filter(stock => stock.volumeConfirmed === (value ? 'True' : 'False'));
|
||
}
|
||
|
||
// 搜索
|
||
if (searchQuery) {
|
||
const q = searchQuery.toLowerCase();
|
||
result = result.filter(stock =>
|
||
stock.code.toLowerCase().includes(q) ||
|
||
stock.name.toLowerCase().includes(q)
|
||
);
|
||
}
|
||
|
||
// 排序
|
||
result.sort((a, b) => {
|
||
let aVal, bVal;
|
||
if (sortBy === 'strength') {
|
||
aVal = a.strength;
|
||
bVal = b.strength;
|
||
} else if (sortBy === 'widthRatio') {
|
||
aVal = a.widthRatio;
|
||
bVal = b.widthRatio;
|
||
} else if (sortBy === 'touches') {
|
||
aVal = a.touchesUpper + a.touchesLower;
|
||
bVal = b.touchesUpper + b.touchesLower;
|
||
}
|
||
return sortOrder === 'desc' ? bVal - aVal : aVal - bVal;
|
||
});
|
||
|
||
renderGrid(result);
|
||
updateStats(result);
|
||
}
|
||
|
||
function renderGrid(stocks) {
|
||
const grid = document.getElementById('stocksGrid');
|
||
const emptyState = document.getElementById('emptyState');
|
||
|
||
if (stocks.length === 0) {
|
||
grid.style.display = 'none';
|
||
emptyState.style.display = 'block';
|
||
} else {
|
||
grid.style.display = 'grid';
|
||
emptyState.style.display = 'none';
|
||
grid.innerHTML = stocks.map(stock => createStockCard(stock)).join('');
|
||
}
|
||
}
|
||
|
||
function updateStats(filteredStocks) {
|
||
document.getElementById('totalStocks').textContent = allStocks.length;
|
||
document.getElementById('displayedStocks').textContent = filteredStocks.length;
|
||
const avgStrength = filteredStocks.length > 0
|
||
? filteredStocks.reduce((sum, s) => sum + s.strength, 0) / filteredStocks.length
|
||
: 0;
|
||
document.getElementById('avgStrength').textContent = avgStrength.toFixed(3);
|
||
}
|
||
|
||
function createStockCard(stock) {
|
||
const directionText = stock.direction === 'up' ? '↑ 向上' :
|
||
stock.direction === 'down' ? '↓ 向下' : '— 无';
|
||
const directionClass = stock.direction === 'up' ? 'direction-up' :
|
||
stock.direction === 'down' ? 'direction-down' : '';
|
||
const volumeText = stock.volumeConfirmed === 'True' ? '✓' :
|
||
stock.volumeConfirmed === 'False' ? '✗' : '—';
|
||
const chartPath = showDetailCharts ? stock.chartPathDetail : stock.chartPath;
|
||
const fallbackPath = showDetailCharts ? stock.chartPath : stock.chartPathDetail;
|
||
|
||
return `
|
||
<div class="stock-card" onclick="openModal('${stock.chartPath}', '${stock.chartPathDetail}')">
|
||
<div class="card-header">
|
||
<div class="stock-identity">
|
||
<div class="stock-name">${stock.name}</div>
|
||
<span class="stock-code">${stock.code}</span>
|
||
</div>
|
||
<div class="strength-badge">
|
||
<div class="strength-value">${stock.strength.toFixed(3)}</div>
|
||
<div class="strength-label">强度分</div>
|
||
</div>
|
||
</div>
|
||
<div class="card-body">
|
||
<div class="metrics-grid">
|
||
<div class="metric-item">
|
||
<span class="metric-label">突破方向</span>
|
||
<span class="metric-value ${directionClass}">${directionText}</span>
|
||
</div>
|
||
<div class="metric-item">
|
||
<span class="metric-label">宽度比</span>
|
||
<span class="metric-value">${stock.widthRatio.toFixed(2)}</span>
|
||
</div>
|
||
<div class="metric-item">
|
||
<span class="metric-label">触碰次数</span>
|
||
<span class="metric-value">${stock.touchesUpper}/${stock.touchesLower}</span>
|
||
</div>
|
||
<div class="metric-item">
|
||
<span class="metric-label">放量确认</span>
|
||
<span class="metric-value">${volumeText}</span>
|
||
</div>
|
||
<div class="metric-item">
|
||
<span class="metric-label">边界利用率</span>
|
||
<span class="metric-value">${(stock.boundaryUtilization || 0).toFixed(2)}</span>
|
||
</div>
|
||
</div>
|
||
<div class="chart-container">
|
||
<img src="${chartPath}"
|
||
alt="${stock.name}"
|
||
class="stock-chart"
|
||
data-fallback-src="${fallbackPath}"
|
||
onerror="handleImageError(this)">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;
|
||
}
|
||
|
||
function handleImageError(img) {
|
||
const fallbackSrc = img.dataset.fallbackSrc;
|
||
if (fallbackSrc && img.src !== fallbackSrc && img.dataset.fallbackTried !== 'true') {
|
||
img.dataset.fallbackTried = 'true';
|
||
img.src = fallbackSrc;
|
||
return;
|
||
}
|
||
if (img.dataset.errorHandled) return;
|
||
img.dataset.errorHandled = 'true';
|
||
img.style.display = 'none';
|
||
const noChart = document.createElement('div');
|
||
noChart.className = 'no-chart';
|
||
noChart.textContent = '图表不可用';
|
||
img.parentElement.appendChild(noChart);
|
||
}
|
||
|
||
function openModal(defaultPath, detailPath) {
|
||
event.stopPropagation();
|
||
const modalImage = document.getElementById('modalImage');
|
||
const targetPath = showDetailCharts ? detailPath : defaultPath;
|
||
const fallbackPath = showDetailCharts ? defaultPath : detailPath;
|
||
modalImage.dataset.fallbackTried = 'false';
|
||
modalImage.dataset.fallbackSrc = fallbackPath;
|
||
modalImage.src = targetPath;
|
||
document.getElementById('imageModal').classList.add('show');
|
||
}
|
||
|
||
function closeModal() {
|
||
document.getElementById('imageModal').classList.remove('show');
|
||
}
|
||
|
||
document.addEventListener('keydown', function(e) {
|
||
if (e.key === 'Escape') closeModal();
|
||
});
|
||
</script>
|
||
</body>
|
||
</html> |