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;
}
}
?>
Stock Analysis
ALL-TIME LOW
$
Since inception
🟢 PEAKS (Resistance) ±10%
$
↓$
↑$
🔴 VALLEYS (Support) ±10%
$
↓$
↑$
📅 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];
}
?>