Add tech_docs/database/sql_roadmap.md
This commit is contained in:
170
tech_docs/database/sql_roadmap.md
Normal file
170
tech_docs/database/sql_roadmap.md
Normal file
@@ -0,0 +1,170 @@
|
||||
Here's a streamlined 8-week roadmap focused purely on practical SQL skills for forex bid/ask analysis, structured for immediate application in cron jobs:
|
||||
|
||||
### **Week 1-2: Core Foundations for Tick Data**
|
||||
**Goal:** Process raw ticks into usable formats
|
||||
**Key Skills:**
|
||||
1. **Basic filtering**
|
||||
```sql
|
||||
-- Isolate specific currency pairs/time windows
|
||||
SELECT * FROM ticks
|
||||
WHERE symbol = 'EUR/USD'
|
||||
AND timestamp BETWEEN '2024-01-01 00:00' AND '2024-01-01 23:59'
|
||||
```
|
||||
|
||||
2. **Candlestick generation**
|
||||
```sql
|
||||
-- 1-minute OHLC candles
|
||||
SELECT
|
||||
symbol,
|
||||
DATE_TRUNC('minute', timestamp) AS minute,
|
||||
FIRST(bid) AS open,
|
||||
MAX(bid) AS high,
|
||||
MIN(bid) AS low,
|
||||
LAST(bid) AS close
|
||||
FROM ticks
|
||||
GROUP BY symbol, minute
|
||||
```
|
||||
|
||||
3. **Spread metrics**
|
||||
```sql
|
||||
-- Average spread by hour
|
||||
SELECT
|
||||
symbol,
|
||||
EXTRACT(HOUR FROM timestamp) AS hour,
|
||||
AVG(ask - bid) AS avg_spread
|
||||
FROM ticks
|
||||
GROUP BY symbol, hour
|
||||
```
|
||||
|
||||
### **Week 3-4: Session Analysis & Basic Signals**
|
||||
**Goal:** Identify trading opportunities
|
||||
**Key Skills:**
|
||||
1. **Session volatility**
|
||||
```sql
|
||||
-- London vs. NY session comparison
|
||||
SELECT
|
||||
CASE
|
||||
WHEN EXTRACT(HOUR FROM timestamp) BETWEEN 7 AND 15 THEN 'London'
|
||||
WHEN EXTRACT(HOUR FROM timestamp) BETWEEN 13 AND 21 THEN 'NY'
|
||||
ELSE 'Other'
|
||||
END AS session,
|
||||
STDDEV((bid+ask)/2) AS volatility
|
||||
FROM ticks
|
||||
GROUP BY session
|
||||
```
|
||||
|
||||
2. **Rolling spreads**
|
||||
```sql
|
||||
-- 30-minute moving spread
|
||||
SELECT
|
||||
timestamp,
|
||||
AVG(ask - bid) OVER (
|
||||
ORDER BY timestamp
|
||||
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
|
||||
) AS rolling_spread
|
||||
FROM ticks
|
||||
WHERE symbol = 'GBP/USD'
|
||||
```
|
||||
|
||||
3. **Basic alerts**
|
||||
```sql
|
||||
-- Spread widening alert
|
||||
SELECT symbol, timestamp, (ask - bid) AS spread
|
||||
FROM ticks
|
||||
WHERE (ask - bid) > 3 * (
|
||||
SELECT AVG(ask - bid)
|
||||
FROM ticks
|
||||
WHERE timestamp > NOW() - INTERVAL '1 day'
|
||||
)
|
||||
```
|
||||
|
||||
### **Week 5-6: Advanced Pattern Detection**
|
||||
**Goal:** Build automated signal detectors
|
||||
**Key Skills:**
|
||||
1. **Microprice calculation**
|
||||
```sql
|
||||
-- Weighted mid-price
|
||||
SELECT
|
||||
timestamp,
|
||||
(bid*ask_size + ask*bid_size)/(bid_size + ask_size) AS microprice
|
||||
FROM ticks
|
||||
```
|
||||
|
||||
2. **Order flow imbalance**
|
||||
```sql
|
||||
-- Bid/ask size ratio
|
||||
SELECT
|
||||
timestamp,
|
||||
(bid_size - ask_size)/(bid_size + ask_size) AS imbalance
|
||||
FROM ticks
|
||||
WHERE ABS((bid_size - ask_size)/(bid_size + ask_size)) > 0.7
|
||||
```
|
||||
|
||||
3. **Consecutive moves**
|
||||
```sql
|
||||
-- 5+ consecutive bid increases
|
||||
WITH changes AS (
|
||||
SELECT *,
|
||||
CASE WHEN bid > LAG(bid) OVER (ORDER BY timestamp) THEN 1 ELSE 0 END AS is_up
|
||||
FROM ticks
|
||||
)
|
||||
SELECT timestamp, bid
|
||||
FROM changes
|
||||
WHERE is_up = 1
|
||||
ORDER BY timestamp
|
||||
LIMIT 5
|
||||
```
|
||||
|
||||
### **Week 7-8: Optimization & Productionization**
|
||||
**Goal:** Make scripts robust and efficient
|
||||
**Key Skills:**
|
||||
1. **Indexing for time-series**
|
||||
```sql
|
||||
CREATE INDEX idx_symbol_time ON ticks(symbol, timestamp);
|
||||
```
|
||||
|
||||
2. **CTEs for complex logic**
|
||||
```sql
|
||||
WITH
|
||||
london_ticks AS (
|
||||
SELECT * FROM ticks
|
||||
WHERE EXTRACT(HOUR FROM timestamp) BETWEEN 7 AND 15
|
||||
),
|
||||
spreads AS (
|
||||
SELECT symbol, AVG(ask - bid) AS avg_spread
|
||||
FROM london_ticks
|
||||
GROUP BY symbol
|
||||
)
|
||||
SELECT * FROM spreads WHERE avg_spread > 0.0005;
|
||||
```
|
||||
|
||||
3. **Partitioning large tables**
|
||||
```sql
|
||||
CREATE TABLE ticks_partitioned (
|
||||
-- schema
|
||||
) PARTITION BY RANGE (timestamp);
|
||||
```
|
||||
|
||||
### **Daily Practice Structure**
|
||||
1. **Morning (5 min):** Run basic monitoring query
|
||||
```sql
|
||||
-- Current spread status
|
||||
SELECT symbol, AVG(ask - bid) AS spread
|
||||
FROM ticks
|
||||
WHERE timestamp > NOW() - INTERVAL '15 minutes'
|
||||
GROUP BY symbol;
|
||||
```
|
||||
|
||||
2. **Evening (15 min):** Build one new analysis query
|
||||
- Monday: Session comparisons
|
||||
- Tuesday: Rolling metrics
|
||||
- Wednesday: Alert conditions
|
||||
- Thursday: Optimization tweaks
|
||||
- Friday: Backtest old queries
|
||||
|
||||
### **Key Mindset Shifts**
|
||||
1. **Think in ticks, not hours:** Your queries should process milliseconds efficiently
|
||||
2. **Pre-compute everything:** Generate candlesticks/aggregates in SQL, not Python
|
||||
3. **Log everything:** Every cron job should write results to a logging table
|
||||
|
||||
Want the condensed 1-page cheat sheet version of this roadmap? Or should we focus next on building your first complete cron-ready SQL script?
|
||||
Reference in New Issue
Block a user