0) { if ($isCompact) { displayCompactWidget($symbol, $stockData); } else { displayFullChartWithList($symbol, $stockData); } } else { echo "Error: {$symbol}"; } } else { echo "?symbol=REQUIRED"; } /** * COMPACT WIDGET - Clickable, opens full view in new tab */ function displayCompactWidget($symbol, $stockData) { $data = $stockData['data']; if (empty($data)) { echo "NO DATA"; return; } $prices = array_filter(array_column($data, 'close'), function($p) { return $p > 1; }); $highest = max($prices); $lowest = min($prices); $current = end($data)['close']; $percentFromHigh = (($highest - $current) / $highest) * 100; $fullUrl = $_SERVER['SCRIPT_NAME'] . '?symbol=' . urlencode($symbol); ?>
$ H:$ L:$ %
= $twoYearsAgo; }); $chartData = array_values($chartData); // Prepare data for Chart.js $dates = array_column($chartData, 'date'); $prices = array_column($chartData, 'close'); // Find peaks and valleys for chart $peaks = []; $valleys = []; $window = 10; for ($i = $window; $i < count($chartData) - $window; $i++) { $isPeak = true; $isValley = true; for ($j = 1; $j <= $window; $j++) { if ($chartData[$i]['close'] <= $chartData[$i - $j]['close']) $isPeak = false; if ($chartData[$i]['close'] >= $chartData[$i - $j]['close']) $isValley = false; if ($chartData[$i]['close'] <= $chartData[$i + $j]['close']) $isPeak = false; if ($chartData[$i]['close'] >= $chartData[$i + $j]['close']) $isValley = false; } if ($isPeak) { $peaks[] = ['x' => $i, 'y' => $chartData[$i]['close']]; } if ($isValley) { $valleys[] = ['x' => $i, 'y' => $chartData[$i]['close']]; } } // Create overlay areas $peakZones = []; foreach ($peaks as $peak) { $peakZones[] = ['from' => $peak['y'] * 0.95, 'to' => $peak['y'] * 1.05, 'peak' => $peak['y']]; } $valleyZones = []; foreach ($valleys as $valley) { $valleyZones[] = ['from' => $valley['y'] * 0.95, 'to' => $valley['y'] * 1.05, 'valley' => $valley['y']]; } // Find ALL peaks and valleys for the list (last 5 years) $fiveYearsAgo = strtotime('-5 years'); $listData = array_filter($data, function($point) use ($fiveYearsAgo) { return strtotime($point['date']) >= $fiveYearsAgo; }); $listData = array_values($listData); $listPeaks = []; $listValleys = []; for ($i = $window; $i < count($listData) - $window; $i++) { $isPeak = true; $isValley = true; for ($j = 1; $j <= $window; $j++) { if ($listData[$i]['close'] <= $listData[$i - $j]['close']) $isPeak = false; if ($listData[$i]['close'] >= $listData[$i - $j]['close']) $isValley = false; if ($listData[$i]['close'] <= $listData[$i + $j]['close']) $isPeak = false; if ($listData[$i]['close'] >= $listData[$i + $j]['close']) $isValley = false; } if ($isPeak) { $listPeaks[] = [ 'price' => round($listData[$i]['close'], 0), 'year' => date('Y', strtotime($listData[$i]['date'])) ]; } if ($isValley) { $listValleys[] = [ 'price' => round($listData[$i]['close'], 0), 'year' => date('Y', strtotime($listData[$i]['date'])) ]; } } // Deduplicate list $uniquePeaks = []; foreach ($listPeaks as $p) { if (!isset($uniquePeaks[$p['price']])) { $uniquePeaks[$p['price']] = $p; } } $uniqueValleys = []; foreach ($listValleys as $v) { if (!isset($uniqueValleys[$v['price']])) { $uniqueValleys[$v['price']] = $v; } } $listPeaks = array_values($uniquePeaks); $listValleys = array_values($uniqueValleys); rsort($listPeaks); sort($listValleys); $listPeaks = array_slice($listPeaks, 0, 8); $listValleys = array_slice($listValleys, 0, 8); // Get all-time stats $allPrices = array_filter(array_column($data, 'close'), function($p) { return $p > 1; }); $allTimeHigh = max($allPrices); $allTimeLow = min($allPrices); $athDate = ''; foreach ($data as $point) { if ($point['close'] == $allTimeHigh) { $athDate = $point['date']; break; } } ?> <?php echo $symbol; ?> Stock Analysis
📊
$
ALL-TIME HIGH
$
ALL-TIME LOW
$
Since inception
DRAWDOWN FROM ATH
%
🟢 PEAKS (Resistance) ±10%
$ ↓$ ↑$
🔴 VALLEYS (Support) ±10%
$ ↓$ ↑$
Price Line
🟢 Peaks (Resistance)
🔴 Valleys (Support)
🟢 Peak Zone (±5%)
🔴 Valley Zone (±5%)
📅 Chart: Last 2 years | List: Last 5 years | 🟢 Green = Peaks (Resistance) with translucent zone | 🔴 Red = Valleys (Support) with translucent zone | Hover chart for details
$url, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_TIMEOUT => 30 ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200) { return ['error' => "HTTP Error"]; } $data = json_decode($response, true); if (!$data || !isset($data['chart']['result'][0])) { return ['error' => "Invalid response"]; } $result = $data['chart']['result'][0]; $timestamp = $result['timestamp'] ?? []; $quote = $result['indicators']['quote'][0] ?? []; $stockData = []; for ($i = 0; $i < count($timestamp); $i++) { if (isset($quote['close'][$i]) && $quote['close'][$i] !== null && $quote['close'][$i] > 1) { $stockData[] = [ 'date' => date('Y-m-d', $timestamp[$i]), 'close' => round($quote['close'][$i], 2) ]; } } return ['data' => $stockData]; } ?>