| <!DOCTYPE html> |
| <html lang="en" dir="ltr" data-theme="light"> |
|
|
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <meta http-equiv="Permissions-Policy" content="accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"> |
| <meta name="description" content="Professional Technical Analysis - Real-time Market Data & Advanced Indicators"> |
| <title>Technical Analysis | Crypto Intelligence Hub</title> |
|
|
| <link rel="icon" type="image/svg+xml" href="../../assets/icons/favicon.svg"> |
|
|
| |
| <link rel="stylesheet" href="/static/shared/css/design-system.css"> |
| <link rel="stylesheet" href="/static/shared/css/global.css"> |
| <link rel="stylesheet" href="/static/shared/css/components.css"> |
| <link rel="stylesheet" href="/static/shared/css/layout.css"> |
| <link rel="stylesheet" href="/static/shared/css/utilities.css"> |
|
|
| |
| <link rel="stylesheet" href="/static/pages/technical-analysis/technical-analysis.css"> |
| <link rel="stylesheet" href="/static/pages/technical-analysis/technical-analysis-enhanced.css"> |
|
|
| |
| <script src="https://unpkg.com/lightweight-charts@4.1.0/dist/lightweight-charts.standalone.production.js"></script> |
|
|
| <style> |
| .analysis-card { |
| background: linear-gradient(135deg, rgba(45, 212, 191, 0.05), rgba(59, 130, 246, 0.05)); |
| border: 1px solid rgba(45, 212, 191, 0.2); |
| border-radius: 16px; |
| padding: 2rem; |
| margin-top: 2rem; |
| } |
| |
| .analysis-header { |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| margin-bottom: 1.5rem; |
| padding-bottom: 1rem; |
| border-bottom: 1px solid rgba(255, 255, 255, 0.1); |
| } |
| |
| .analysis-header h3 { |
| margin: 0; |
| font-size: 1.25rem; |
| color: var(--text-primary); |
| } |
| |
| .badge { |
| padding: 0.5rem 1rem; |
| border-radius: 8px; |
| font-size: 0.875rem; |
| font-weight: 600; |
| text-transform: uppercase; |
| } |
| |
| .badge-buy { background: rgba(34, 197, 94, 0.2); color: #22c55e; } |
| .badge-sell { background: rgba(239, 68, 68, 0.2); color: #ef4444; } |
| .badge-hold { background: rgba(251, 191, 36, 0.2); color: #fbbf24; } |
| |
| .analysis-section { |
| margin-bottom: 1.5rem; |
| } |
| |
| .analysis-section h4 { |
| font-size: 1rem; |
| color: var(--accent-cyan); |
| margin-bottom: 0.75rem; |
| } |
| |
| .indicator-list { |
| list-style: none; |
| padding: 0; |
| margin: 0; |
| } |
| |
| .indicator-list li { |
| padding: 0.75rem; |
| margin-bottom: 0.5rem; |
| background: rgba(0, 0, 0, 0.2); |
| border-radius: 8px; |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| } |
| |
| .indicator-name { |
| font-weight: 600; |
| color: var(--text-secondary); |
| } |
| |
| .indicator-value { |
| font-weight: 700; |
| font-size: 1.1rem; |
| } |
| |
| .indicator-value.bullish, |
| .indicator-value.oversold { |
| color: #22c55e; |
| } |
| |
| .indicator-value.bearish, |
| .indicator-value.overbought { |
| color: #ef4444; |
| } |
| |
| .indicator-value.neutral { |
| color: #fbbf24; |
| } |
| |
| .indicator-signal { |
| font-size: 0.875rem; |
| color: var(--text-muted); |
| } |
| |
| .recommendation { |
| background: rgba(59, 130, 246, 0.1); |
| border-left: 4px solid #3b82f6; |
| padding: 1rem; |
| border-radius: 8px; |
| color: var(--text-secondary); |
| line-height: 1.6; |
| } |
| |
| .risk-bar { |
| height: 24px; |
| background: rgba(0, 0, 0, 0.3); |
| border-radius: 12px; |
| overflow: hidden; |
| margin-bottom: 0.5rem; |
| } |
| |
| .risk-fill { |
| height: 100%; |
| transition: width 0.5s ease; |
| } |
| |
| .risk-fill.risk-low { |
| background: linear-gradient(90deg, #22c55e, #4ade80); |
| } |
| |
| .risk-fill.risk-medium { |
| background: linear-gradient(90deg, #fbbf24, #fcd34d); |
| } |
| |
| .risk-fill.risk-high { |
| background: linear-gradient(90deg, #ef4444, #f87171); |
| } |
| |
| .risk-text { |
| font-size: 0.875rem; |
| color: var(--text-muted); |
| } |
| |
| .trend-bullish { |
| color: #22c55e; |
| font-weight: 600; |
| } |
| |
| .trend-bearish { |
| color: #ef4444; |
| font-weight: 600; |
| } |
| |
| .trend-neutral { |
| color: #fbbf24; |
| font-weight: 600; |
| } |
| |
| .error-state { |
| text-align: center; |
| padding: 3rem; |
| color: var(--text-muted); |
| } |
| |
| .error-state svg { |
| color: #ef4444; |
| margin-bottom: 1rem; |
| } |
| |
| .error-state h3 { |
| color: var(--text-primary); |
| margin: 1rem 0; |
| } |
| |
| .price-info-grid { |
| display: grid; |
| grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); |
| gap: 1rem; |
| margin-bottom: 1.5rem; |
| } |
| |
| .price-info-card { |
| background: rgba(0, 0, 0, 0.2); |
| border: 1px solid rgba(255, 255, 255, 0.05); |
| border-radius: 12px; |
| padding: 1rem; |
| } |
| |
| .price-info-label { |
| font-size: 0.75rem; |
| text-transform: uppercase; |
| letter-spacing: 0.05em; |
| color: var(--text-muted); |
| margin-bottom: 0.5rem; |
| } |
| |
| .price-info-value { |
| font-size: 1.5rem; |
| font-weight: 700; |
| color: var(--text-primary); |
| } |
| |
| #loading-spinner { |
| display: none; |
| text-align: center; |
| padding: 2rem; |
| } |
| |
| .spinner { |
| border: 3px solid rgba(45, 212, 191, 0.1); |
| border-top: 3px solid #2dd4bf; |
| border-radius: 50%; |
| width: 40px; |
| height: 40px; |
| animation: spin 1s linear infinite; |
| margin: 0 auto; |
| } |
| |
| @keyframes spin { |
| to { transform: rotate(360deg); } |
| } |
| </style> |
| |
| <script src="/static/js/api-config.js"></script> |
| <script> |
| |
| window.apiReady = new Promise((resolve) => { |
| if (window.apiClient) { |
| console.log('✅ API Client ready'); |
| resolve(window.apiClient); |
| } else { |
| console.error('❌ API Client not loaded'); |
| } |
| }); |
| </script> |
|
|
| </head> |
|
|
| <body> |
| <div class="app-container"> |
| <aside id="sidebar-container"></aside> |
|
|
| <main class="main-content"> |
| <header id="header-container"></header> |
|
|
| <div class="page-content"> |
| |
| <div class="page-header"> |
| <div class="page-title"> |
| <h1> |
| <span class="page-icon"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> |
| <path d="M3 3v18h18"></path> |
| <path d="M19 9l-5 5-4-4-3 3"></path> |
| </svg> |
| </span> |
| Professional Technical Analysis |
| </h1> |
| <p class="page-subtitle">Real-time market data, advanced indicators, and professional trading tools</p> |
| </div> |
| <div class="page-actions"> |
| <button id="refresh-data" class="btn btn-secondary"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| <polyline points="23 4 23 10 17 10"></polyline> |
| <path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"></path> |
| </svg> |
| Refresh |
| </button> |
| <button id="export-analysis" class="btn btn-secondary"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path> |
| <polyline points="7 10 12 15 17 10"></polyline> |
| <line x1="12" y1="15" x2="12" y2="3"></line> |
| </svg> |
| Export |
| </button> |
| </div> |
| </div> |
|
|
| |
| <div class="controls-panel" style="background: rgba(0,0,0,0.2); border-radius: 16px; padding: 1.5rem; margin-bottom: 1.5rem;"> |
| <div style="display: flex; gap: 1.5rem; flex-wrap: wrap; align-items: center;"> |
| <div style="flex: 1; min-width: 200px;"> |
| <label style="display: block; font-size: 0.875rem; color: var(--text-muted); margin-bottom: 0.5rem;">Symbol</label> |
| <select id="symbol-select" class="form-select" style="width: 100%;"> |
| <option value="BTC">Bitcoin (BTC)</option> |
| <option value="ETH">Ethereum (ETH)</option> |
| <option value="BNB">Binance Coin (BNB)</option> |
| <option value="SOL">Solana (SOL)</option> |
| <option value="ADA">Cardano (ADA)</option> |
| <option value="XRP">Ripple (XRP)</option> |
| <option value="DOT">Polkadot (DOT)</option> |
| <option value="DOGE">Dogecoin (DOGE)</option> |
| <option value="AVAX">Avalanche (AVAX)</option> |
| <option value="MATIC">Polygon (MATIC)</option> |
| </select> |
| </div> |
| <div style="flex: 2; min-width: 300px;"> |
| <label style="display: block; font-size: 0.875rem; color: var(--text-muted); margin-bottom: 0.5rem;">Timeframe</label> |
| <div style="display: flex; gap: 0.5rem; flex-wrap: wrap;"> |
| <button class="btn btn-sm btn-secondary" data-timeframe="1m">1m</button> |
| <button class="btn btn-sm btn-secondary" data-timeframe="5m">5m</button> |
| <button class="btn btn-sm btn-secondary" data-timeframe="15m">15m</button> |
| <button class="btn btn-sm btn-secondary" data-timeframe="1h">1h</button> |
| <button class="btn btn-sm btn-secondary active" data-timeframe="4h">4h</button> |
| <button class="btn btn-sm btn-secondary" data-timeframe="1d">1D</button> |
| <button class="btn btn-sm btn-secondary" data-timeframe="1w">1W</button> |
| </div> |
| </div> |
| <div style="flex: 0 0 auto;"> |
| <label style="display: block; font-size: 0.875rem; color: transparent; margin-bottom: 0.5rem;">Action</label> |
| <button id="analyze-btn" class="btn btn-primary"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| <polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline> |
| </svg> |
| Analyze |
| </button> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="price-info-grid"> |
| <div class="price-info-card"> |
| <div class="price-info-label">Current Price</div> |
| <div class="price-info-value" id="current-price">--</div> |
| </div> |
| <div class="price-info-card"> |
| <div class="price-info-label">24h Change</div> |
| <div class="price-info-value" id="price-change">--</div> |
| </div> |
| <div class="price-info-card"> |
| <div class="price-info-label">24h High</div> |
| <div class="price-info-value" id="24h-high">--</div> |
| </div> |
| <div class="price-info-card"> |
| <div class="price-info-label">24h Low</div> |
| <div class="price-info-value" id="24h-low">--</div> |
| </div> |
| <div class="price-info-card"> |
| <div class="price-info-label">24h Volume</div> |
| <div class="price-info-value" id="24h-volume">--</div> |
| </div> |
| </div> |
|
|
| |
| <div style="background: rgba(0,0,0,0.2); border-radius: 16px; padding: 1rem; margin-bottom: 1.5rem;"> |
| <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem;"> |
| <h3 style="margin: 0; font-size: 1.125rem;">Price Chart</h3> |
| <div style="display: flex; gap: 1rem; font-size: 0.875rem; color: var(--text-muted);"> |
| <span id="last-update">--</span> |
| <span id="data-source">--</span> |
| </div> |
| </div> |
| <div id="tradingview-chart" style="width: 100%; height: 500px;"></div> |
| </div> |
|
|
| |
| <div style="background: rgba(0,0,0,0.2); border-radius: 16px; padding: 1.5rem; margin-bottom: 1.5rem;"> |
| <h3 style="margin: 0 0 1rem 0; font-size: 1.125rem;">Key Indicators</h3> |
| <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem;"> |
| <div style="background: rgba(0,0,0,0.2); border-radius: 8px; padding: 1rem;"> |
| <div style="font-size: 0.75rem; text-transform: uppercase; color: var(--text-muted); margin-bottom: 0.5rem;">RSI (14)</div> |
| <div id="rsi-value" style="font-size: 1.5rem; font-weight: 700;">--</div> |
| </div> |
| <div style="background: rgba(0,0,0,0.2); border-radius: 8px; padding: 1rem;"> |
| <div style="font-size: 0.75rem; text-transform: uppercase; color: var(--text-muted); margin-bottom: 0.5rem;">MACD</div> |
| <div id="macd-value" style="font-size: 1.5rem; font-weight: 700;">--</div> |
| </div> |
| <div style="background: rgba(0,0,0,0.2); border-radius: 8px; padding: 1rem;"> |
| <div style="font-size: 0.75rem; text-transform: uppercase; color: var(--text-muted); margin-bottom: 0.5rem;">EMA (20)</div> |
| <div id="ema-value" style="font-size: 1.5rem; font-weight: 700;">--</div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div id="loading-spinner"> |
| <div class="spinner"></div> |
| <p style="margin-top: 1rem; color: var(--text-muted);">Loading market data...</p> |
| </div> |
|
|
| |
| <div id="analysis-results"></div> |
| </div> |
| </main> |
| </div> |
|
|
| |
| <div id="toast-container"></div> |
|
|
| |
| <script type="module" src="../../shared/js/layouts/sidebar.js"></script> |
| <script type="module" src="../../shared/js/layouts/header.js"></script> |
| <script type="module" src="../../shared/js/components/toast.js"></script> |
| <script type="module" src="../../shared/js/utils/sanitizer.js"></script> |
|
|
| |
| <script type="module" src="/static/pages/technical-analysis/technical-analysis-professional.js"></script> |
| </body> |
|
|
| </html> |
|
|