← Terug naar projecten

Currency Monitor met notificaties voor de EUR/CZK koers

Een lichtgewicht self-hosted currency monitor die EUR/CZK koersen volgt, historische data opslaat en praktische notificaties geeft voor verschillende deadlines.

Currency Monitor met notificaties voor de EUR/CZK koers

Achtergrond

Ik heb een eigen currency monitor gebouwd voor de EUR/CZK wisselkoers. Het systeem volgt automatisch de actuele koers, bewaart lokale historie en geeft praktische notificaties wanneer een wisselmoment interessant wordt.

Het project begon met een eenvoudige vraag:

Is de koers nu goed genoeg om euro’s naar Tsjechische kronen te wisselen, of kan ik beter nog even wachten?

Alleen naar de actuele koers kijken is daarvoor niet genoeg. Een koers kan vandaag hoger staan dan gisteren, maar nog steeds laag zijn vergeleken met de afgelopen weken. Tegelijk kan er op korte termijn al een gunstig moment ontstaan, ook zonder dat er meteen een nieuw langetermijnrecord wordt bereikt.

Daarom heb ik een kleine, self-hosted tool gebouwd die ruwe koersdata vertaalt naar praktische notificaties.


Introductie

De Currency Monitor haalt periodiek de EUR/CZK koers op, slaat metingen lokaal op en toont de actuele situatie in een dashboard. De eerste versie gaf vooral een notificatie wanneer de koers een nieuw hoogtepunt binnen een configureerbare periode bereikte, bijvoorbeeld 45 dagen.

Later heb ik dit uitgebreid met een slimmer notificatiemodel. Niet iedere wisselbeslissing heeft namelijk dezelfde deadline. Soms wil je vandaag of morgen wisselen, soms binnen een week, en soms kun je rustig wachten op een beter moment.

Daarom werkt het systeem met drie praktische modi:

  • urgent: vandaag of morgen converteren
  • week: binnen ongeveer 3 tot 10 dagen converteren
  • patient: je kunt 30 tot 60 dagen wachten

De gekozen modus bepaalt niet alleen hoe het dashboard rekent, maar ook welke live notificaties actief zijn.


Wat het systeem doet

De monitor combineert koersdata, historische vergelijking, momentum en eenvoudige backtesting tot praktische notificaties.

Belangrijke functies:

  • actuele EUR/CZK koers ophalen via de Twelve Data API
  • iedere 5 minuten nieuwe metingen verwerken
  • lokale opslag in SQLite
  • historische context via intraday, hourly en daily candles
  • detectie van nieuwe highs binnen een configureerbare periode
  • scoremodel voor urgent, week en patient notificaties
  • Telegram- en e-mailnotificaties
  • React-dashboard met grafieken en statuskaarten
  • backtest-sectie om historisch gedrag van de strategie te beoordelen
  • deployment als Linux service met systemd

Het systeem is bewust lightweight gehouden. Het draait lokaal, gebruikt eenvoudige componenten en is bedoeld als praktische tool, niet als complex financieel platform.


Van koersdata naar bruikbaar advies

Een belangrijk doel van dit project was om de interface niet alleen data te laten tonen, maar ook betekenis te geven aan die data.

Het dashboard vertaalt de actuele marktsituatie daarom naar gewone taal. In plaats van alleen een grafiek met getallen te tonen, geeft het systeem een conclusie zoals:

  • Nog wachten
  • Redelijk moment
  • Goed moment
  • Sterk moment

Onder het advies staan redenen en waarschuwingen. Groene chips ondersteunen de notificatie, rode chips laten zien waarom het systeem terughoudend is. Zo blijft de notificatie uitlegbaar.

Voorbeelden van factoren die meespelen:

  • hoe hoog de huidige koers staat binnen vandaag
  • hoe de koers zich verhoudt tot de afgelopen 7, 45 en 90 dagen
  • hoe ver de koers onder de dagtop ligt
  • of de koers stijgt, afvlakt of terugvalt
  • momentum over 15 minuten, 1 uur en 4 uur
  • of er recent al een notificatie is verstuurd
  • of wachten historisch gezien vaak nog een betere koers gaf

Dit maakt het systeem praktischer dan een simpele price alert. Het probeert niet alleen te zeggen dat een koers hoog is, maar ook of dat moment past bij de gekozen deadline.

Koersgrafiek en notificatiescore in de Currency Monitor


Dashboard

De frontend is gebouwd als een overzichtelijk React-dashboard. De bovenste kaarten tonen de laatste koers, de hoogste koers binnen de beschikbare periode en het moment van de laatste update.

Daaronder staat het belangrijkste blok: de koersnotificatie. Hier zie je in gewone taal of de huidige koers interessant genoeg is voor de gekozen modus.

Het dashboard bevat onder andere:

  • een actuele koersgrafiek
  • rank-balken voor vandaag, 7 dagen, 45 dagen, 90 dagen en 1 jaar
  • een dagrange-balk met huidige positie binnen daglaag en daghoog
  • momentum-indicatoren voor korte termijn trends
  • een scoregrafiek voor het gekozen notificatiemodel
  • een inklapbare backtest-sectie

Jaarcontext van de EUR/CZK koers in de Currency Monitor

De grafieken zijn niet bedoeld als trading terminal, maar als snelle visuele ondersteuning. Je ziet direct of de koers net piekt, wegzakt, stabiel blijft of langzaam oploopt.


Urgent, week en patient

Een interessant onderdeel van dit project is dat dezelfde data anders wordt geïnterpreteerd afhankelijk van de deadline.

Bij urgent kijkt het systeem veel sterker naar intraday gedrag. Als je vandaag of morgen moet wisselen, zijn dagtop, korte momentumveranderingen en snelle terugval belangrijk. Deze modus mag ook iets vaker melden, omdat de beslissing tijdgevoeliger is.

Bij week telt de context van de afgelopen dagen zwaarder. Het systeem kijkt dan vooral of de koers sterk staat binnen de recente periode, zonder meteen op iedere kleine intraday beweging te reageren.

Bij patient ligt de nadruk op langere historische context. Deze modus is rustiger en kijkt vooral of de koers echt interessant is binnen een langere periode.

De UI-keuze is ook het notificatieprofiel:

  • patient: alleen patient-notificaties
  • week: week- en patient-notificaties
  • urgent: urgent-, week- en patient-notificaties

Een 45-dagen high blijft altijd actief als aparte notificatie.


Notificaties zonder onnodige ruis

Een monitor is pas nuttig als notificaties betrouwbaar en rustig blijven. Daarom stuurt het systeem niet bij ieder klein koersverschil een bericht.

Er zijn drempels, cooldowns en minimale verbeteringen ingebouwd. Een notificatie kan dus inhoudelijk interessant zijn, maar toch geen pushnotificatie geven als die te snel na een vorige notificatie komt of onvoldoende verbetering laat zien.

Hierdoor blijft het systeem bruikbaar in de praktijk. Het dashboard mag veel context tonen, maar de notificaties moeten alleen komen wanneer er echt iets te melden is.


Backtesting

Om meer gevoel te krijgen bij de kwaliteit van het notificatiemodel heb ik een backtest-sectie toegevoegd. Die laat zien hoe de huidige strategie historisch zou hebben gewerkt op de lokaal opgeslagen data.

Backtesting van notificaties in de Currency Monitor

De backtest toont onder andere:

  • hoeveel gesimuleerde notificaties er zouden zijn verstuurd
  • hoeveel kandidaten door cooldown of anti-spam zijn geblokkeerd
  • de gemiddelde en maximale score van notificaties
  • of wachten na een notificatie binnen 1, 4 of 24 uur gemiddeld nog een betere koers opleverde
  • hoeveel notificaties achteraf te vroeg waren

Dit maakt de notificatie niet voorspellend. Je kunt de toekomst niet kennen. Maar het helpt wel om te beoordelen of het model historisch redelijk gedrag vertoonde.


Technische opbouw

Het project bestaat uit een kleine full-stack applicatie.

Backend

De backend is gebouwd met FastAPI en haalt de koersdata op via een externe API. De data wordt opgeslagen in SQLite, zodat het systeem volledig lokaal en zelfstandig kan draaien.

De backend verzorgt onder andere:

  • ophalen van actuele koersdata
  • opslaan van ruwe metingen
  • aggregeren naar candles
  • berekenen van ranks en momentum
  • bepalen van notificatiescores
  • versturen van Telegram- en e-mailnotificaties
  • API endpoints voor de frontend
  • health-informatie over opslag, laatste update en candle coverage

Frontend

De frontend is gebouwd met React en Vite. Voor de grafieken wordt gebruikgemaakt van Recharts. De UI is bedoeld om snel inzicht te geven zonder dat je zelf alle ruwe data hoeft te interpreteren.

Deployment

De applicatie is service-ready gemaakt voor Linux. Backend en frontend kunnen via systemd automatisch starten en opnieuw opstarten bij fouten.

Voor langdurige context ondersteunt het project ook historische backfill van daily candles. Daarmee kan het systeem sneller bruikbare langetermijninformatie tonen zonder eerst maanden aan live data te hoeven verzamelen.


Veiligheid en scope

Dit project is bedoeld voor gebruik binnen een privé netwerk. De applicatie bevat geen loginlaag en is niet bedoeld om direct publiek op internet te zetten.

Voor publieke deployment zouden extra stappen nodig zijn, zoals authenticatie, HTTPS, reverse proxy configuratie, productie-workers en verdere security hardening.

Ook belangrijk: dit systeem is geen financieel advies. Het is beslisondersteuning op basis van eigen regels, historische data en praktische notificaties.


Wat dit project laat zien

Dit project is een goed voorbeeld van software die een klein dagelijks probleem praktisch oplost.

Het laat zien hoe ik graag werk:

  • een concreet probleem vertalen naar een werkend systeem
  • externe API’s betrouwbaar integreren
  • data lokaal opslaan en bruikbaar maken
  • backend, frontend en notificaties combineren
  • notificaties uitlegbaar houden
  • eenvoudige tooling bouwen die echt gebruikt wordt

De waarde zit niet alleen in het ophalen van een koers. De waarde zit vooral in het vertalen van ruwe data naar een duidelijke vraag:

Is dit, gegeven mijn deadline, een goed moment om te wisselen?


Conclusie

De Currency Monitor begon als een simpele koersmelder, maar groeide uit tot een kleine beslisondersteunende applicatie met historische context, notificaties en backtesting.

Het project is bewust overzichtelijk gebleven, maar bevat toch veel onderdelen die ook in grotere systemen belangrijk zijn: API-integratie, datamodel, scheduling, frontend visualisatie, betrouwbaarheid, configuratie en deployment.

Voor mij is dit vooral een praktische tool: klein genoeg om overzichtelijk te blijven, maar compleet genoeg om in het dagelijks gebruik echt te helpen.