š Your Learning Path
š¦ Prerequisites
Before You Start
- OpenClaw installed and running (
openclaw --version) - Telegram connected (or your preferred messaging channel)
- Basic comfort with terminal commands
- ~1 hour of uninterrupted time for Level 1-3
1Level 1: Morning Market Briefing (15 minutes)
What it does: Every morning at 7am SGT, delivers overnight US market summary, pre-market movers, SGX open preview, and earnings today.
Risk Level: ā Zero Risk (Information only)
Time to complete: 15 minutes
Step 1: Create the Skill
cd ~/.openclaw/workspace/skills
mkdir market-briefing
cd market-briefing
Step 2: Create SKILL.md
# Market Briefing Skill
## Purpose
Generate daily morning market briefing for Singapore timezone.
## Data Sources
- Yahoo Finance (yfinance Python library)
- Investing.com (web scraping)
## Output Format
Deliver to Telegram every weekday at 7:00 AM SGT:
1. US Market Summary (Dow, S&P, Nasdaq overnight performance)
2. Pre-market movers (top 5 gainers/losers)
3. SGX Preview (STI futures, key stocks to watch)
4. Earnings Today (US + SGX)
5. Economic Calendar (today's key data releases)
## Risk Controls
- Information only, no recommendations
- Cite sources for all data
- Flag any data that is delayed or estimated
Step 3: Create the Python Script
#!/usr/bin/env python3
# save as: market_briefing.py
import yfinance as yf
from datetime import datetime
import requests
def get_us_market_summary():
"""Get overnight US market performance"""
indices = {
'Dow': '^DJI',
'S&P 500': '^GSPC',
'Nasdaq': '^IXIC'
}
summary = []
for name, ticker in indices.items():
data = yf.Ticker(ticker)
hist = data.history(period='2d')
if len(hist) >= 2:
change = ((hist['Close'].iloc[-1] - hist['Close'].iloc[-2]) / hist['Close'].iloc[-2]) * 100
summary.append(f"{name}: {hist['Close'].iloc[-1]:,.0f} ({change:+.2f}%)")
return '\n'.join(summary)
def get_earnings_today():
"""Get today's earnings (simplified - use API in production)"""
# In production, use Earnings Whispers API or similar
return "Check earnings calendar API"
if __name__ == '__main__':
print("š
Morning Market Briefing")
print("=" * 40)
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M')} SGT\n")
print("š US Market Overnight:")
print(get_us_market_summary())
print("\nš° Earnings Today:")
print(get_earnings_today())
Step 4: Set Up Cron Job
# Edit crontab
crontab -e
# Add this line (weekday mornings at 7am SGT):
0 7 * * 1-5 cd ~/.openclaw/workspace/skills/market-briefing && python3 market_briefing.py | openclaw send --to telegram --message "stdin"
2Level 2: Watchlist Price Alerts (30 minutes)
What it does: Monitors your watchlist every 15 minutes during trading hours. Sends Telegram alerts when price moves ±3% or volume spikes 2x average.
Risk Level: ā Zero Risk (Alerts only, no execution)
Time to complete: 30 minutes
Step 1: Create Your Watchlist
# Create watchlist.txt in your skills directory
# Example:
DBS.SI
UOB.SI
OCBC.SI
AAPL
MSFT
NVDA
TSLA
Step 2: Create Alert Script
#!/usr/bin/env python3
# save as: price_alerts.py
import yfinance as yf
import json
from datetime import datetime
WATCHLIST_FILE = 'watchlist.txt'
STATE_FILE = 'price_state.json'
ALERT_THRESHOLD = 3.0 # percent
def load_watchlist():
with open(WATCHLIST_FILE) as f:
return [line.strip() for line in f if line.strip()]
def load_state():
try:
with open(STATE_FILE) as f:
return json.load(f)
except FileNotFoundError:
return {}
def save_state(state):
with open(STATE_FILE, 'w') as f:
json.dump(state, f)
def check_alerts():
watchlist = load_watchlist()
state = load_state()
alerts = []
for ticker in watchlist:
try:
data = yf.Ticker(ticker)
hist = data.history(period='1d', interval='15m')
if len(hist) < 2:
continue
current = hist['Close'].iloc[-1]
previous = state.get(ticker, {}).get('price', current)
avg_volume = hist['Volume'].mean()
current_volume = hist['Volume'].iloc[-1]
# Price change alert
pct_change = ((current - previous) / previous) * 100
if abs(pct_change) >= ALERT_THRESHOLD:
direction = "š" if pct_change > 0 else "š"
alerts.append(f"{direction} {ticker}: {current:.2f} ({pct_change:+.2f}%)")
# Volume spike alert
if current_volume > 2 * avg_volume:
alerts.append(f"š {ticker}: Volume spike! {current_volume/1e6:.1f}M (2x avg)")
# Update state
state[ticker] = {'price': current, 'time': datetime.now().isoformat()}
except Exception as e:
print(f"Error checking {ticker}: {e}")
save_state(state)
return alerts
if __name__ == '__main__':
alerts = check_alerts()
if alerts:
message = "šØ Price Alerts\n\n" + "\n".join(alerts)
print(message)
# Pipe to openclaw send or use API
else:
print("No alerts")
Step 3: Set Up Cron (Trading Hours Only)
# SGX: 9am-5pm SGT, US: 9:30pm-4am SGT
# Run every 15 minutes during SGX hours:
*/15 9-16 * * 1-5 cd ~/.openclaw/workspace/skills/price-alerts && python3 price_alerts.py | grep -v "No alerts" | openclaw send --to telegram --message "stdin"
# US market hours (9:30pm-4am SGT = 13:30-20:00 UTC):
*/15 13-20 * * 1-5 cd ~/.openclaw/workspace/skills/price-alerts && python3 price_alerts.py | grep -v "No alerts" | openclaw send --to telegram --message "stdin"
3Level 3: Earnings Calendar Tracker (45 minutes)
What it does: Tracks earnings dates for your watchlist. Sends pre-earnings research summaries and post-earnings results.
Risk Level: ā Zero Risk (Research only)
Time to complete: 45 minutes
Implementation Overview
- Use Earnings Whispers API or scrape earnings calendar sites
- Filter for your watchlist stocks
- Send pre-earnings briefing (analyst estimates, recent performance)
- Send post-earnings results (beat/miss, guidance changes)
- ā Morning briefing (7am daily)
- ā Price alerts (every 15 min during market hours)
- ā Earnings tracking (as needed)
Ready to move to Level 4? You'll start working with technical indicators.
4Level 4: Technical Indicator Scanner (Coming Next)
What it does: Scans watchlist for RSI oversold/overbought conditions, MACD crossovers, and moving average signals.
Risk Level: ā” Low-Medium Risk (Signals only, but may influence trading decisions)
Time to complete: 2-3 hours
Prerequisites: Complete Levels 1-3, comfortable with Python and technical analysis basics
5Level 5: Paper Trading Bot (Final Level)
What it does: Executes real trades on Alpaca paper trading account. Tests your strategy with zero financial risk.
Risk Level: ā Zero Financial Risk (Paper trading only)
Time to complete: 4-8 hours (including strategy development and backtesting)
Prerequisites: Complete Levels 1-4, have a tested trading strategy, understand risk management
- ā Paper trade for at least 3 months before considering live trading
- ā Backtest your strategy against historical data
- ā Implement position limits and daily loss limits
- ā Set up kill switch (Telegram command to halt all trading)
- ā Never skip the paper trading phase