tradepulse.ai / infrastructure
A Bitcoin trading system with no server to keep alive. Four Lambdas wake on a schedule, write to one table and go back to sleep. The interesting part is not that it is cheap — it is what has to be in place before a system this quiet can be trusted to still be working.
EventBridge Scheduler
Wakes the bot after the daily candle closes
cron(10 0 * * ? *) — 00:10 UTC, once
Paper bot Lambda
Computes the target position, then reconciles the virtual portfolio
Runs for seconds a day — billed for nothing in between
Market data
Pulls the closed daily bars it needs, nothing more
Public endpoint — no key, no account
DynamoDB
Portfolio state, plus an append-only record of every decision
Keyed by bar — a repeat run cannot trade twice
SQS dead-letter queue
Catches an invocation the scheduler could not deliver
A message landing here raises its own alarm
CloudWatch alarms
Errors, dead letters — and a run that never happened
The no-invocation alarm is the one that matters most
A scheduled function that stops being scheduled fails silently — no error, no log, no page. That is why absence of invocation is alarmed as loudly as failure of one.
Anyone
The ledger is public — this page read it a moment ago
HTML for people, ?format=json for machines
Route 53
bot.tradepulseai.co.uk resolves to the edge
Zone rebuilt after a teardown, registrar repointed in Terraform
CloudFront
Caches the ledger briefly so traffic cannot drive up cost
30-second TTL — fresh enough, cheap enough
Status Lambda
A second function whose only job is to render what the bot recorded
Its own role, read-only on the table — it cannot trade
DynamoDB
The same table the bot writes to, read from the other side
Nothing is recomputed — the page cannot disagree with the bot
Fetching the live ledger to time the real path…
EventBridge Scheduler
A second schedule, deliberately offset from the trading one
cron(25 0 * * ? *) — 00:25 UTC, daily
Shadow bot Lambda
Places and closes a real order on a demo venue, every day
Own role, own zip — deploying it cannot touch the live bot
Demo matching engine
A full round trip against the venue's real order API
Proves keys, permissions and filters are all still valid
Separate alarms and DLQ
Nothing shared with the trading stack except the table and the topic
A broken heartbeat cannot break the thing it watches
A path used twice a year rots between uses — keys expire, permissions get revoked, exchange filters change. The first real order would otherwise be the test. This runs that test daily instead.
EventBridge Scheduler
Fires after each four-hour candle closes
cron(10 0,4,8,12,16,20 * * ? *)
4h venue Lambda
A second paper book, sized to a fixed ceiling per order
Own zip so a deploy cannot disturb the measurement window
Real matching engine
Fills come from the venue rather than from an assumption
About twelve signed fills a year, not a modelled estimate
DynamoDB
Same table as the daily bot, different partition
Written under BTCUSDT_4h — the measured book stays untouched
Everything else is its own — function, role, schedule, queue, alarms, even its deployment artefact. Sharing the zip would have redeployed the live bot mid-measurement.
no-invocation. A schedule that quietly stops firing produces no error to catch, which makes absence the failure mode worth watching.