Sprint 6 — vW6 — Gold, Three Timeframes
This sprint you build something real: your own version of Investing.com's gold technical page. Your code reads gold prices, runs the same moving averages and indicators that page shows, and rates gold on the hourly, daily and weekly charts. On Monday, Prof Tan will open Investing.com on his phone while you show your dashboard, and compare the two line by line. Your numbers should match, and where they don't, you should be able to say why.
The Sprint Goal
What Changed From Sprint 5, and Why
| Change | Why |
|---|---|
| New: a gold technical engine, built by R3 and R6, with a starter file and a self-test | A weekly call gives you one scored result per market. An engine rates gold on three timeframes and can be checked against a professional tool, live. |
| Gold is now a closing price, not a direction | A direction is only right or wrong. A price shows how far off you were, the same as your other three calls. |
| Your engine's gold call sits beside your team's | Your judgment should add something the engine can't. Now you can see whether it does. |
| New: a replay of your engine over recent bars, owned by R4 | It gives you dozens of scored predictions this week instead of waiting months for enough weekly results. |
Levels are numbers. spx_close, ndx_close, gold_close and tnx_close must be numbers | A Nasdaq-100 call was filed as "UP". A word can't be scored against a closing level. |
| Dashboards are never hosted. No GitHub Pages, no Netlify, no deployment workflows | Dashboards were put on public hosting, which exposes your calls to anyone with the link. Your dashboard is opened from your repo. |
| Every team member posts their own Wednesday check-in in Discord, and R1 compiles them | In some teams most members never posted all week. |
| A FigJam card with only a title is not a card | Some boards had title-only cards, and one board hadn't moved since Sprint 3. |
| A late call stays late. It's recorded and labelled, never counted as locked | Calls were committed after the lock and marked as drafts. |
New: Your Gold Technical Engine
Open the Investing.com page above. For each timeframe it shows one rating, from Strong Sell to Strong Buy, worked out from a table of moving averages and a table of indicators, each voting Buy or Sell. It also shows pivot points. You will build the same thing for gold futures, December 2026 (Yahoo symbol GCZ26.CMX), on three timeframes: hourly, daily and weekly. Those are tabs on the Investing.com page too.
engine/ folder in your repo. The download and file handling are written for you. You write the 14 functions marked TODO: the maths and the voting rules, each explained in the file. Then run python engine/test_engine.py. It checks your numbers and votes against the course reference engine on frozen gold data, and tells you exactly which line is wrong. Commit its output to checks/engine-test.txt.The 12 moving-average votes
For each length n = 5, 10, 20, 50, 100 and 200 bars, a simple moving average (SMA, the plain average of the last n closes) and an exponential moving average (EMA, which gives recent closes more weight). Each votes Buy if the latest close is above it and Sell if below. These are the same 12 rows as Investing.com's Moving Averages table.
The 6 indicator votes
| Indicator | What it measures | Buy | Sell | Neutral |
|---|---|---|---|---|
| RSI(14) | Size of up-moves against down-moves over 14 bars, 0 to 100 | above 50 | below 50 | above 70 or below 30 |
| STOCH(9,6) | Where the close sits in its 9-bar range | %K above %D, and %K below 80 | %K below %D, and %K above 20 | otherwise |
| MACD(12,26,9) | Short-term trend against longer-term trend | MACD line above signal line | below | equal |
| CCI(14) | Distance of the typical price from its 14-bar average | above 0 | below 0 | above +200 or below −200 |
| Williams %R(14) | Where the close sits in its 14-bar range, −100 to 0 | above −50 | below −50 | above −20 or below −80 |
| ROC(12) | Percentage change from 12 bars ago | above 0 | below 0 | exactly 0 |
All six appear on Investing.com's Technical Indicators table, so every row you show can be compared. The exact formula for each is in the starter file.
Votes, rating, prediction and pivots
where B is the number of Buy votes, D the number of Sell votes, and 18 the total. S runs from −1 (all Sell) to +1 (all Buy).
Rating: S of 0.5 or more is Strong Buy · 0.1 up to 0.5 is Buy · between −0.1 and 0.1 is Neutral · −0.5 up to −0.1 is Sell · −0.5 or less is Strong Sell.
Predicted next close: P = C + 0.1 × S × ATR
where C is the latest close, S the score, and ATR (average true range) the typical size of one bar's move over the last 14 bars. A Strong Buy predicts a small rise, Neutral predicts no change. The 0.1 was set by testing: a larger step overshoots.
Pivot points: P = (H + L + C) ÷ 3 · R1 = 2P − L · S1 = 2P − H
where H, L and C are the high, low and close of the last completed bar on that timeframe. P is the pivot, R1 the first resistance above it and S1 the first support below it.
Comparing with Investing.com
Your engine writes signals/latest.json, with the time of the bar it used in UTC (the same as GMT, which Investing.com uses). Compare at the same bar time and on the same timeframe tab. Your moving averages should agree with Investing.com's to within about 0.2%. Indicators can differ a little more, because Investing.com's price feed can differ from Yahoo's by a few dollars and fast indicators react to that. The summary rating may differ, because Investing.com counts more indicators than these six. Be ready to explain any difference, row by row.
The Weekly Calls
Deadline: Wednesday 14 Oct, 23:59 Singapore time. Same four markets, same owners, read the same way as in Sprint 5, with one change: gold is now the closing price of GCZ26.CMX on Friday 16 Oct, in US dollars per ounce, from the Close column of Yahoo's daily Historical Data, not Adj Close and not the spot price. Every reason names a catalyst from catalysts/vW6.json.
In predictions/vW6.json, gold_direction becomes gold_close, and a new line holds your engine's weekly-chart gold prediction at the moment you lock:
"team_call": { "spx_close": 0.00, "ndx_close": 0.00, "gold_close": 0.00, "tnx_close": 0.00 },
"engine_call": { "gold_close": 0.00 },
If your team's gold call differs from the engine's, the gold reason says why.
New: The Replay (R4)
Run your engine as if it were running at each of the last 35 hourly bars, the last 20 daily bars and the last 10 weekly bars, using only the bars up to that point. Compare each prediction with the close that actually came next. Save every row in replay/vW6.csv (bar time, timeframe, close, score, rating, predicted, actual, miss, no-change miss) and a summary for each timeframe in replay/vW6.json.
where P is the predicted close, A the actual close, and |…| the size of the miss, whether above or below.
"No change" miss: the same formula with P = C, the last close. This is the simplest possible forecast. Report both: an engine that can't beat "no change" isn't adding anything, and you should say so.
Direction right: the share of Buy and Strong Buy ratings followed by a higher close, plus Sell and Strong Sell ratings followed by a lower close, out of all non-Neutral ratings.
Delta and Prescription: Your Sprint 5 Call
Measure your Sprint 5 call against the Friday 9 Oct closes in actuals/vW5.json, for all four markets. The yield is scored in basis points (one basis point is 0.01 percentage points). Your Sprint 5 gold call was a direction, so its delta is right or wrong. If your Sprint 5 call was committed after the lock, measure it and label it late. If you had none, say so. The prescription is one specific change for next sprint.
Where Every File Goes
your-team-repo/ ├── engine/ │ ├── tech_summary.py R3 + R6 · self-test passing Wed 12:00 │ ├── test_engine.py from the starter kit, unchanged │ └── starter/ from the starter kit, unchanged ├── checks/engine-test.txt R3 · Wed 12:00 ├── signals/latest.json engine · each time you run it ├── catalysts/vW6.json R2 · Tue 23:59 ├── checkin/wednesday.md R1 · Wed 12:00 ├── data/ │ ├── roles.json R1 · Tue 23:59 │ ├── github_activity.json R6 · Tue 23:59, then daily │ └── figjam_status.json R1 · Tue 23:59, then daily ├── predictions/vW6.json R1 · Wed 23:59 ├── llm-synthesis/vW6.json R6 · Wed 23:59 ├── human-score/vW6.json R5 · Wed 23:59 ├── replay/vW6.csv R4 · Sat 23:59 ├── replay/vW6.json R4 · Sat 23:59 ├── actuals/vW6.json R4 · Sat 23:59 ├── delta/vW6.json R4 · Sat 23:59 ├── prescriptions/vW6.json R4 + R1 · Sat 23:59 ├── instruments.json R3 + R6 · keep current ├── ui/index.html R5 · Tue 23:59, then daily └── evidence/ supporting material only
A file anywhere else counts as missing. Fix any Sprint 5 file with the wrong path or name by Tuesday night.
The Backlog — All Six Roles
File predictions/vW6.json with the team's four calls and the engine's gold call, and set r1_confirms to true. By Wednesday 12:00, compile checkin/wednesday.md from every team member's own Discord check-in, with a link to each post. Anyone who hasn't posted by noon is raised in Discord and with Prof Tan the same day. Keep your team's Sprint 6 section of the shared FigJam board current. With R4, write the prescription.
main.Build catalysts/vW6.json by Tuesday 23:59, as in Sprint 5. You own the S&P 500 weekly call.
In the starter file, write sma, ema, ma_votes, score_and_rating, predict and pivots. Get the whole self-test passing with R6 by Wednesday 12:00 and commit its output. Be ready to explain any moving-average vote. You own the Nasdaq-100 weekly call.
checks/engine-test.txt, and a Nasdaq-100 call that names a catalyst.You own the gold weekly call, as a price. Write the replay and commit replay/vW6.csv and replay/vW6.json. Record the Friday 16 Oct closes for all four markets, with sources, in actuals/vW6.json. Produce delta/vW6.json for your Sprint 5 call, and with R1 write prescriptions/vW6.json.
Human Score on all four weekly calls in human-score/vW6.json before the Wednesday lock, including whether you agree with the engine on gold. Add the Gold Technical panel to ui/index.html (see below), keep all ten panels reading committed files, and show "X / 10 files loaded" at the top. Your dashboard is opened from the repo. It is never hosted.
In the starter file, write rsi, macd, stochastic, cci, williams_r, roc, atr and indicator_votes, with R3, by Wednesday 12:00. You own the 10-year yield weekly call. Query ChatGPT, Gemini and DeepSeek with identical prompts on all four markets and commit llm-synthesis/vW6.json before the lock. Refresh data/github_activity.json daily. Cut the vW6 tag once, before Saturday 23:59, and never move it.
vW6 tag cut once, on time.Your Dashboard
The nine Sprint 5 panels, now reading vW6 files, plus one new panel. The line at the top reads "X / 10 files loaded".
| Panel | Attribute | Reads |
|---|---|---|
| New: Gold Technical | data-panel="gold-technical" | signals/latest.json |
Lay it out like Investing.com's page so the two can be compared at a glance: tabs for Hourly, Daily and Weekly; for the selected tab, the rating and score, the bar time in GMT, the Moving Averages table (12 rows, value and Buy/Sell), the Technical Indicators table (6 rows, value and Buy/Sell), and the pivot points. The Replay panel's numbers can go in the same panel or in the Delta panel.
Timeline — One Deadline Per Item
| When (Singapore time) | What |
|---|---|
| Mon 12 Oct | Sprint 6 starts. Download the starter kit |
| Tue 13 Oct 23:59 | Catalyst calendar, roles, GitHub and FigJam files. Dashboard current with the "X / 10" line. Sprint 5 files fixed |
| Wed 14 Oct 12:00 | Engine self-test passing, output in checks/engine-test.txt. Every member's own Discord check-in. checkin/wednesday.md. Blockers raised |
| Wed 14 Oct 23:59 | Prediction locks, with the engine's gold call. LLM synthesis, Human Score |
| Sat 17 Oct 23:59 | Replay, actuals, delta, prescription, vW6 tag. Dashboard at 10 / 10 |
| Sun 18 Oct | Nothing is due. Your work is reviewed ahead of Monday |
| Mon 19 Oct | Presentations |
Monday 19 October
Practical B: Team 4, in the Practical B session.
- Live progress block, 4 minutes, the real thing on screen, not screenshots:
- R5, 2 minutes: run
python engine/tech_summary.py, openui/index.htmlfrom your repo, show "X / 10 files loaded", and walk through the Gold Technical panel while Prof Tan checks the same timeframe on Investing.com. - R6, 1 minute: GitHub: this week's merges into
main, the self-test output, and thevW6tag. - R1, 1 minute: FigJam Done cards, each linked to its file on
main.
- R5, 2 minutes: run
- Slides, R1 to R6, using the Sprint 5 presentation template. R4's slide shows the replay: how often the engine was right, and whether it beat "no change".
- Oral defense of all four calls and of the engine. Any team member can be asked to explain any vote, or why a number differs from Investing.com.