Welcome to my Website!

This is a paragraph! Here's how you make a link: Neocities.

Here's how you can make bold and italic text.

Here's how you can add an image:

Site hosted by Neocities

Here's how to make a list:

To learn more HTML/CSS, check out these tutorials!

import React, { useState, useEffect } from 'react'; import { LineChart, Line, XAxis, YAxis, Tooltip, CartesianGrid, ResponsiveContainer, } from 'recharts'; // Simple React component: Indtast et ticker (fx AAPL, MSFT), din FINNHUB API‑KEY og tryk Hent // Kræver: React, Tailwind CSS, recharts (npm i recharts) export default function StockDashboard() { const [ticker, setTicker] = useState('AAPL'); const [apiKey, setApiKey] = useState('DIN_FINNHUB_API_KEY_HER'); const [days, setDays] = useState(60); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [data, setData] = useState([]); // [{date, close}] const [current, setCurrent] = useState(null); const [forecast, setForecast] = useState(null); useEffect(() => { // nothing on mount }, []); function unixTimestampDaysAgo(d) { const now = Math.floor(Date.now() / 1000); return now - d * 24 * 60 * 60; } async function fetchPrices() { setError(null); setLoading(true); setData([]); setCurrent(null); setForecast(null); try { const from = unixTimestampDaysAgo(days + 5); // lidt buffer const to = Math.floor(Date.now() / 1000); // Finnhub candle endpoint const candleUrl = `https://finnhub.io/api/v1/stock/candle?symbol=${encodeURIComponent( ticker )}&resolution=D&from=${from}&to=${to}&token=${apiKey}`; const quoteUrl = `https://finnhub.io/api/v1/quote?symbol=${encodeURIComponent( ticker )}&token=${apiKey}`; const [candleRes, quoteRes] = await Promise.all([ fetch(candleUrl), fetch(quoteUrl), ]); if (!candleRes.ok) throw new Error('Kunne ikke hente historiske priser'); if (!quoteRes.ok) throw new Error('Kunne ikke hente aktuel pris'); const candleJson = await candleRes.json(); const quoteJson = await quoteRes.json(); if (candleJson.s !== 'ok') throw new Error('Ingen candle‑data tilgængelig'); const arr = candleJson.t.map((ts, i) => ({ date: new Date(ts * 1000).toISOString().slice(0, 10), close: +candleJson.c[i], })); setData(arr); setCurrent({ price: quoteJson.c, open: quoteJson.o, high: quoteJson.h, low: quoteJson.l, prevClose: quoteJson.pc, }); // compute forecasts const lin = linearRegressionForecast(arr.map((d) => d.close)); const sma = simpleMAForecast(arr.map((d) => d.close), Math.min(10, arr.length)); setForecast({ linear: lin, sma }); } catch (err) { setError(err.message || String(err)); } finally { setLoading(false); } } function simpleMAForecast(values, window) { if (!values || values.length === 0) return null; const n = values.length; const w = Math.min(window, n); const slice = values.slice(n - w, n); const sum = slice.reduce((s, v) => s + v, 0); return sum / w; } // linear regression (ordinary least squares) on y values with x = 0..n-1 function linearRegressionForecast(values) { const n = values.length; if (n < 2) return null; let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0; for (let i = 0; i < n; i++) { const x = i; const y = values[i]; sumX += x; sumY += y; sumXY += x * y; sumXX += x * x; } const denom = n * sumXX - sumX * sumX; if (denom === 0) return null; const slope = (n * sumXY - sumX * sumY) / denom; const intercept = (sumY - slope * sumX) / n; const nextX = n; // predict next day const pred = intercept + slope * nextX; return pred; } const chartData = data.map((d, i) => ({ ...d, idx: i })); return (

Aktie‑dashboard

Skriv en ticker, indsæt din Finnhub API‑nøgle og hent historiske priser + simple prognoser.

setTicker(e.target.value.toUpperCase())} /> setApiKey(e.target.value)} />
setDays(Number(e.target.value))} className="p-2 border rounded w-28" />
{error &&
Fejl: {error}
} {current && (
Aktuel pris
{current.price?.toFixed(2)} USD
Dagens åbning
{current.open?.toFixed(2)}
Dagens lav / høj
{current.low?.toFixed(2)} / {current.high?.toFixed(2)}
Forrige luk
{current.prevClose?.toFixed(2)}
)} {data.length > 0 ? (
Linear regression (næste dag)
{forecast?.linear ? forecast.linear.toFixed(2) : '—'}
Simple MA (10 dage)
{forecast?.sma ? forecast.sma.toFixed(2) : '—'}
Kommentar
Prognoserne er simple statistiske metoder — ikke investeringsrådgivning.

Historiske priser (sidste {data.length} dage)

{data.slice().reverse().map((r) => ( ))}
Dato Luk
{r.date} {r.close.toFixed(2)}
) : (
Ingen data vist endnu — tryk 'Hent priser'.
)}
Bemærk: Dette er en demo. For produktion: tilføj fejlhåndtering, rate‑limit håndtering, caching og en back‑end til at holde API‑nøgler sikre.
); }