dwlf
Interact with DWLF (dwlf.co.uk), a market analysis platform for crypto and stocks. Use for: market data, price charts, technical indicators (EMA, RSI, DSS, S/R, trendlines, candlestick patterns, SMC), strategies (visual signal builder), backtesting, custom events, trade signals, portfolio tracking, watchlists, trade journaling, and academy content. Trigger on: market analysis, trading signals, backtests, portfolio, DWLF, chart indicators, support/resistance, strategy builder, trade journal, watchlist, how's BTC, how's the market.
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install openclaw-skills-dwlf
Repository
Skill path: skills/andywilliams/dwlf
Interact with DWLF (dwlf.co.uk), a market analysis platform for crypto and stocks. Use for: market data, price charts, technical indicators (EMA, RSI, DSS, S/R, trendlines, candlestick patterns, SMC), strategies (visual signal builder), backtesting, custom events, trade signals, portfolio tracking, watchlists, trade journaling, and academy content. Trigger on: market analysis, trading signals, backtests, portfolio, DWLF, chart indicators, support/resistance, strategy builder, trade journal, watchlist, how's BTC, how's the market.
Open repositoryBest for
Primary workflow: Write Technical Docs.
Technical facets: Full Stack, Data / AI, Tech Writer, Designer.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: openclaw.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install dwlf into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/openclaw/skills before adding dwlf to shared team environments
- Use dwlf for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: dwlf
description: >
Interact with DWLF (dwlf.co.uk), a market analysis platform for crypto and stocks.
Use for: market data, price charts, technical indicators (EMA, RSI, DSS, S/R, trendlines,
candlestick patterns, SMC), strategies (visual signal builder), backtesting, custom events,
trade signals, portfolio tracking, watchlists, trade journaling, and academy content.
Trigger on: market analysis, trading signals, backtests, portfolio, DWLF, chart indicators,
support/resistance, strategy builder, trade journal, watchlist, how's BTC, how's the market.
metadata:
clawdbot:
emoji: "π"
requires:
bins: ["curl", "jq"]
---
# DWLF β Market Analysis Platform
API base: `https://api.dwlf.co.uk/v2`
## Auth
Use API key auth. Check `TOOLS.md` for the key. Header:
```
Authorization: ApiKey dwlf_sk_...
```
Helper script: `scripts/dwlf-api.sh`
## Quick Start
```bash
# Generic GET request
./scripts/dwlf-api.sh GET /market-data/BTC-USD
# With query params
./scripts/dwlf-api.sh GET "/events?symbol=BTC-USD&limit=10"
# POST request
./scripts/dwlf-api.sh POST /visual-backtests '{"strategyId":"...","symbol":"BTC-USD"}'
```
## Symbol Format
- Crypto: `BTC-USD`, `ETH-USD`, `SOL-USD` (always with `-USD` suffix)
- Stocks/ETFs: `TSLA`, `NVDA`, `META`, `MARA`, `RIOT`
- Forex: `GBP-USD`, `EUR-USD`
If user says "BTC" β use `BTC-USD`. If "TSLA" β use `TSLA`.
## Core Endpoints
### Market Data
| Method | Path | Description |
|--------|------|-------------|
| GET | `/market-data/{symbol}?interval=1d&limit=50` | OHLCV candles |
| GET | `/market-data/symbols` | List all tracked symbols |
| GET | `/support-resistance/{symbol}` | S/R levels with scores |
| GET | `/chart-indicators/{symbol}?interval=1d` | All indicators (RSI, EMA, MACD, etc.) |
| GET | `/trendlines/{symbol}` | Auto-detected trendlines |
| GET | `/events?symbol={symbol}&limit=20` | System events (breakouts) |
| GET | `/events?type=custom_event&scope=user&symbol={symbol}&days=30` | User's custom events (wcl, dss, reversals etc.) |
### Strategies & Signals
| Method | Path | Description |
|--------|------|-------------|
| GET | `/visual-strategies` | List user's strategies |
| GET | `/visual-strategies/{id}` | Strategy details |
| POST | `/visual-strategies` | Create strategy |
| PUT | `/visual-strategies/{id}` | Update strategy |
| GET | `/user/trade-signals/active` | Active trade signals |
| GET | `/user/trade-signals/recent?limit=20` | Recent signals |
| GET | `/user/trade-signals/stats` | Signal performance stats |
| GET | `/user/trade-signals/symbol/{symbol}` | Signals for a symbol |
### Backtesting
| Method | Path | Description |
|--------|------|-------------|
| POST | `/visual-backtests` | Trigger backtest (async) |
| GET | `/visual-backtests/{id}` | Get backtest results |
Backtests are async β POST triggers, then poll GET until complete.
### Portfolio & Trades
| Method | Path | Description |
|--------|------|-------------|
| GET | `/portfolios` | List portfolios |
| GET | `/portfolios/{id}` | Portfolio details + holdings |
| GET | `/trades?status=open` | List trades |
| POST | `/trades` | Log a new trade |
| PUT | `/trades/{id}` | Update trade |
| GET | `/trade-plans` | List trade plans |
### Watchlist
| Method | Path | Description |
|--------|------|-------------|
| GET | `/watchlist` | Get watchlist |
| POST | `/watchlist` | Add symbol (`{"symbol":"BTC-USD"}`) |
| DELETE | `/watchlist/{symbol}` | Remove symbol |
### Custom Events
| Method | Path | Description |
|--------|------|-------------|
| GET | `/custom-events` | List custom events |
| POST | `/custom-events` | Create custom event |
| GET | `/custom-events/{id}` | Event details |
### Custom Event Symbol Activation
| Method | Path | Description |
|--------|------|-------------|
| POST | `/custom-event-symbols/:eventId/enable-all` | Bulk activate symbols for an event |
| POST | `/custom-event-symbols/:eventId/disable-all` | Bulk deactivate symbols for an event |
| GET | `/custom-event-symbols/event/:eventId` | Get active symbols for an event |
| GET | `/custom-event-symbols` | List all event-symbol associations |
### Strategy Symbol Activation
| Method | Path | Description |
|--------|------|-------------|
| POST | `/strategy-symbols/:strategyId/enable-all` | Bulk activate symbols for a strategy |
| POST | `/strategy-symbols/:strategyId/disable-all` | Bulk deactivate symbols for a strategy |
| GET | `/strategy-symbols/strategy/:strategyId` | Get active symbols for a strategy |
| GET | `/strategy-symbols` | List all strategy-symbol associations |
### Evaluations
| Method | Path | Description |
|--------|------|-------------|
| POST | `/evaluations` | Trigger evaluation run |
| GET | `/evaluations/{id}` | Get evaluation results |
## Symbol Activation (Required After Creation)
> β οΈ **IMPORTANT:** Creating a custom event or strategy does **NOT** automatically activate it for any symbols. After creation, you **MUST** ask the user which symbols to activate it for, then call the enable endpoint. Without this step, the event/strategy will **not fire or generate signals**.
### Workflow: Custom Events
1. Create the event β `POST /custom-events`
2. Compile the event β `POST /custom-events/{id}/compile`
3. **Ask the user** which symbols to activate for
4. **Activate symbols** β `POST /custom-event-symbols/{eventId}/enable-all` with `{ "symbols": ["BTC-USD", "ETH-USD"] }`
### Workflow: Strategies
1. Create the strategy β `POST /visual-strategies`
2. Compile the strategy β `POST /visual-strategies/{id}/compile`
3. **Ask the user** which symbols to activate for
4. **Activate symbols** β `POST /strategy-symbols/{strategyId}/enable-all` with `{ "symbols": ["BTC-USD", "ETH-USD"] }`
### Checking Active Symbols
- Event symbols: `GET /custom-event-symbols/event/{eventId}`
- Strategy symbols: `GET /strategy-symbols/strategy/{strategyId}`
- All activations: `GET /custom-event-symbols` and `GET /strategy-symbols` (query: `?activeOnly=true`)
### Deactivating Symbols
- Event: `POST /custom-event-symbols/{eventId}/disable-all` with `{ "symbols": [...] }`
- Strategy: `POST /strategy-symbols/{strategyId}/disable-all` with `{ "symbols": [...] }`
## Response Formatting
When presenting data to users:
**Market overview:** Show price, % change, key S/R levels, and any recent events.
**Signals:** Show symbol, direction, entry, stop loss, confidence score, strategy name.
**S/R levels:** Sort by score (strongest first), show level and touch count.
**Backtests:** Show trade count, win rate, total return, Sharpe ratio, best/worst trades.
## Available Indicators
EMA (multiple periods), SMA, RSI, MACD, Bollinger Bands, DSS (Double Smoothed Stochastic),
Stochastic RSI, ATR, ADX, OBV, Volume Profile, Ichimoku Cloud, Fibonacci Retracement,
Support/Resistance, Trendlines, Candlestick Patterns, SMC (Order Blocks, FVGs, BOS/ChoCH).
## Academy
DWLF Academy is a CDN-hosted collection of educational content (15 tracks, 60+ lessons) covering indicators, events, strategies, charting, and more. No auth required.
Use academy tools to read lesson content and understand DWLF concepts:
- `dwlf_list_academy_tracks` β browse all tracks and lessons
- `dwlf_search_academy` β search by keyword
- `dwlf_get_academy_lesson` β read a specific lesson (markdown)
When a user asks "how does X work in DWLF?" or "what is DSS?", check the academy first β it likely has a lesson explaining it.
## Detailed Reference
- **API endpoints** (params, response shapes): read `references/api-endpoints.md`
- **Strategy builder** (node types, edge wiring, examples): read `references/strategy-builder.md`
---
## Referenced Files
> The following files are referenced in this skill and included for context.
### scripts/dwlf-api.sh
```bash
#!/usr/bin/env bash
# dwlf-api.sh β Generic DWLF API wrapper
# Usage: dwlf-api.sh METHOD PATH [BODY]
# Examples:
# dwlf-api.sh GET /market-data/BTC-USD
# dwlf-api.sh GET "/events?symbol=BTC-USD&limit=10"
# dwlf-api.sh POST /visual-backtests '{"strategyId":"abc"}'
set -euo pipefail
METHOD="${1:?Usage: dwlf-api.sh METHOD PATH [BODY]}"
PATH_AND_QUERY="${2:?Usage: dwlf-api.sh METHOD PATH [BODY]}"
BODY="${3:-}"
API_BASE="${DWLF_API_URL:-https://api.dwlf.co.uk}/v2"
API_KEY="${DWLF_API_KEY:-}"
# Try reading from TOOLS.md if no env var set
if [ -z "$API_KEY" ]; then
TOOLS_FILE="${TOOLS_MD:-$HOME/clawd/TOOLS.md}"
if [ -f "$TOOLS_FILE" ]; then
# Extract Jenna's API key from TOOLS.md
API_KEY=$(grep -A1 "Jenna's own key" "$TOOLS_FILE" | grep "API Key:" | head -1 | sed 's/.*: //')
fi
fi
if [ -z "$API_KEY" ]; then
echo "Error: No API key found. Set DWLF_API_KEY or add to TOOLS.md" >&2
exit 1
fi
URL="${API_BASE}${PATH_AND_QUERY}"
CURL_ARGS=(
-s
-X "$METHOD"
-H "Content-Type: application/json"
-H "Authorization: ApiKey ${API_KEY}"
)
if [ -n "$BODY" ]; then
CURL_ARGS+=(-d "$BODY")
fi
curl "${CURL_ARGS[@]}" "$URL" | jq .
```
### references/api-endpoints.md
```markdown
# DWLF API Endpoints Reference
Base URL: `https://api.dwlf.co.uk/v2`
## Market Data
### GET /market-data/{symbol}
OHLCV candle data.
- Params: `interval` (1d|4h|1h), `limit` (number)
- Response: `{ candles: [{ date, open, high, low, close, volume, assetId }] }`
### GET /market-data/symbols
List all tracked symbols. Public endpoint.
- Response: `{ symbols: ["NVDA", "TSLA", ...] }`
- Note: Currently only returns stocks/ETFs, not crypto pairs (BUG-006)
### GET /support-resistance/{symbol}
Support and resistance levels with confidence scores.
- Response: `{ support: [{ level, score, count, touches }], resistance: [...], date, startDate, endDate }`
- Note: `endDate` may appear before `startDate` (BUG-005)
### GET /chart-indicators/{symbol}
All computed indicators for a symbol.
- Params: `interval` (1d|4h|1h)
- Response: `{ symbol, indicators: [{ symbol, data: [{ date, value }], startDate, endDate, config }] }`
### GET /trendlines/{symbol}
Auto-detected trendlines.
- Response: `{ trendlines: [{ startDate, endDate, startPrice, endPrice, slope, isActive }] }`
### GET /events
Indicator events (breakouts, crossovers, divergences).
- Params: `symbol`, `type`, `limit`
- Response: `{ events: [{ symbol, eventType, date, confidenceScore, ... }], nextToken }`
## Strategies
### GET /visual-strategies
List user's visual strategies.
- Response: `{ strategies: [{ strategyId, name, description, symbols, createdAt }] }`
### GET /visual-strategies/{strategyId}
Full strategy with signal definitions and graph.
- Response: `{ strategy: { strategyId, name, signals, nodes, edges, ... } }`
### POST /visual-strategies
Create a new visual strategy.
- Body: `{ name, description, symbols, nodes, edges }`
### PUT /visual-strategies/{strategyId}
Update a strategy.
- Body: partial update fields
### GET /visual-strategies/public
List public community strategies. Public endpoint.
## Signals
### GET /user/trade-signals/active
Currently active trade signals.
- Response: `{ signals: [{ symbol, direction, entryPrice, stopLossLevel, strategyDescription, confidenceScore }] }`
### GET /user/trade-signals/recent
Recent signals including completed.
- Params: `limit`
- Response: `{ signals: [...] }`
### GET /user/trade-signals/stats
Signal performance statistics.
- Response: `{ total, active, completed, winRate, avgRR, totalPnL, strategies: {...} }`
### GET /user/trade-signals/symbol/{symbol}
Signals filtered by symbol.
### POST /user/trade-signals/purge
Purge all user signals. Destructive!
## Backtesting
### POST /visual-backtests
Trigger a backtest. Returns immediately, results computed async.
- Body: `{ strategyId, symbol, startDate?, endDate? }`
- Response: `{ backtestId, status: "pending" }`
### GET /visual-backtests/{backtestId}
Get backtest results. Poll until `status: "complete"`.
- Response: `{ backtestId, status, results: { trades, winRate, totalReturn, sharpe, ... } }`
## Portfolio
### GET /portfolios
List user's portfolios.
### GET /portfolios/{portfolioId}
Portfolio with holdings and P&L.
### POST /portfolios
Create a portfolio.
- Body: `{ name, description }`
### GET /portfolios/{portfolioId}/snapshots
Historical portfolio snapshots.
## Trade Journal
### GET /trades
List trades with filters.
- Params: `status` (open|closed), `symbol`, `limit`
### POST /trades
Log a new trade.
- Body: `{ symbol, direction (long|short), entryPrice, stopLoss?, takeProfit?, notes? }`
### PUT /trades/{tradeId}
Update a trade.
### POST /trades/{tradeId}/initial-execution
Record trade execution details.
### GET /trade-plans
List trade plans.
### POST /trade-plans
Create a trade plan.
## Watchlist
### GET /watchlist
User's watchlist symbols.
- Response: `{ watchlist: ["BTC-USD", "NVDA", ...] }`
### POST /watchlist
Add symbol to watchlist.
- Body: `{ symbol: "BTC-USD" }`
### DELETE /watchlist/{symbol}
Remove symbol from watchlist.
## Custom Events
### GET /custom-events
List user's custom events.
### POST /custom-events
Create a custom event definition.
- Body: `{ name, conditions, symbols? }`
### GET /custom-events/{eventId}
Event details and trigger history.
## Custom Event Symbol Activation
Manages which symbols a custom event is active for. Events only fire for activated symbols.
### POST /custom-event-symbols
Activate a single symbol for a custom event.
- Body: `{ eventId: string, symbol: string, config?: object }`
- Response: `{ eventId, symbol, isActive: true, ... }`
### POST /custom-event-symbols/:eventId/enable-all
Bulk activate symbols for a custom event.
- Body: `{ symbols: ["BTC-USD", "ETH-USD", ...] }`
- Response: `{ enabled: number, symbols: [...] }`
### POST /custom-event-symbols/:eventId/disable-all
Bulk deactivate symbols for a custom event.
- Body: `{ symbols: ["BTC-USD", "ETH-USD", ...] }`
- Response: `{ disabled: number, symbols: [...] }`
### GET /custom-event-symbols/event/:eventId
Get active symbols for a specific custom event.
- Response: `{ symbols: [{ symbol, isActive, config?, ... }] }`
### GET /custom-event-symbols
List all user's custom event-symbol associations.
- Params: `activeOnly` (boolean, default false)
- Response: `{ associations: [{ eventId, symbol, isActive, ... }] }`
### PUT /custom-event-symbols/:eventId/:symbol/deactivate
Deactivate a single symbol for an event.
- Response: `{ eventId, symbol, isActive: false }`
### DELETE /custom-event-symbols/:eventId/:symbol
Permanently delete a symbol association for an event.
## Strategy Symbol Activation
Manages which symbols a strategy is active for. Strategies only generate signals for activated symbols.
### POST /strategy-symbols
Activate a single symbol for a strategy.
- Body: `{ strategyId: string, symbol: string, config?: object }`
- Response: `{ strategyId, symbol, isActive: true, ... }`
### POST /strategy-symbols/:strategyId/enable-all
Bulk activate symbols for a strategy.
- Body: `{ symbols: ["BTC-USD", "ETH-USD", ...] }`
- Response: `{ enabled: number, symbols: [...] }`
### POST /strategy-symbols/:strategyId/disable-all
Bulk deactivate symbols for a strategy.
- Body: `{ symbols: ["BTC-USD", "ETH-USD", ...] }`
- Response: `{ disabled: number, symbols: [...] }`
### GET /strategy-symbols/strategy/:strategyId
Get active symbols for a specific strategy.
- Response: `{ symbols: [{ symbol, isActive, config?, ... }] }`
### GET /strategy-symbols
List all user's strategy-symbol associations.
- Params: `activeOnly` (boolean, default false)
- Response: `{ associations: [{ strategyId, symbol, isActive, ... }] }`
### PUT /strategy-symbols/:strategyId/:symbol/deactivate
Deactivate a single symbol for a strategy.
- Response: `{ strategyId, symbol, isActive: false }`
### DELETE /strategy-symbols/:strategyId/:symbol
Permanently delete a symbol association for a strategy.
## Evaluations
### POST /evaluations
Trigger an evaluation run (processes all strategies/events).
- Response: `{ evaluationId }`
### GET /evaluations/{evaluationId}
Get evaluation results.
## Account
### POST /accounts/login
JWT login. Public.
- Body: `{ email, password }`
- Response: `{ token }`
### GET /accounts/api-keys
List API keys (masked).
### POST /accounts/api-keys
Generate a new API key.
- Body: `{ name, scopes: ["read", "write"], expiresAt? }`
- Response: `{ keyId, rawKey, name, scopes }` β rawKey shown ONCE
### DELETE /accounts/api-keys/{keyId}
Revoke an API key.
## Academy (CDN β no auth required)
Base URL: `https://academy.dwlf.co.uk/live`
15 tracks, 60+ lessons covering DWLF concepts β indicators, events, strategies, charting, and more.
| Method | Path | Description |
|--------|------|-------------|
| GET | `https://academy.dwlf.co.uk/live/manifest.json` | List all tracks and lessons |
| GET | `https://academy.dwlf.co.uk/live/lessons/{slug}.md` | Get lesson content (markdown) |
### GET /manifest.json
Full manifest of all tracks and lessons.
- Response: `{ tracks: [{ id, title, description, lessons: [{ slug, title, level, estimatedMinutes }] }] }`
### GET /lessons/{slug}.md
Individual lesson content in markdown format.
- Response: raw markdown text
- Images reference `assets/img/` β prefix with base URL for absolute paths
```
### references/strategy-builder.md
```markdown
# DWLF Strategy Builder β Reference for AI Agents
> This document explains how to create valid visual strategies via the API.
> Strategies are visual graphs (React Flow) that compile into executable trade signals.
## Architecture
```
Visual Graph (nodes + edges) β Compiler β Executable Signal β Evaluator β Trade Signals
```
A strategy is a JSON document with:
- **nodes** β condition checks, logic gates, signals, exits
- **edges** β connections between nodes (directional)
- **pipelines** β entry, exit, cancellation (three separate sub-graphs)
## API
```
POST /v2/visual-strategies β Create strategy
PUT /v2/visual-strategies/:id β Update strategy
GET /v2/visual-strategies β List strategies
GET /v2/visual-strategies/:id β Get strategy
```
## Strategy JSON Structure
```json
{
"name": "My Strategy",
"description": "What it does",
"isPublic": false,
"metadata": {
"timeframe": "1D",
"assets": ["BTC-USD", "NVDA"],
"tags": ["trend-following"]
},
"visual": {
"nodes": [ ...allNodes ],
"edges": [ ...allEdges ],
"visual": {
"entry": { "nodes": [...], "edges": [...] },
"exit": { "nodes": [...], "edges": [...] },
"cancellation": { "nodes": [...], "edges": [...] }
}
}
}
```
The `visual.visual` sub-object partitions nodes/edges by pipeline. The top-level `visual.nodes` and `visual.edges` contain ALL nodes/edges (flat list). Both are needed.
## Pipelines
### Entry Pipeline (required)
Flow: **Start** β Conditions β Logic Gates β **Signal** + **SL** + **TP**
This is the main pipeline. It defines when to enter a trade.
### Exit Pipeline (optional)
Flow: **Exit Start** β Conditions β **Close Position**
Defines when to close an open position.
### Cancellation Pipeline (optional)
Flow: **Cancellation Start** β Conditions β **Cancel**
Defines when to cancel/invalidate a pending setup.
## Node Structure
Every node must have:
```json
{
"id": "node-1",
"type": "<reactFlowType>",
"nodeType": "<logicalType>",
"label": "Human-readable label",
"position": { "x": 100, "y": 200 },
"data": {
"nodeType": "<logicalType>",
"pipeline": "entry",
"label": "Human-readable label",
"timeframe": "daily",
"params": {}
},
"style": {
"backgroundColor": "#4a5568",
"borderColor": "#2d3748",
"borderRadius": "8px",
"borderStyle": "solid",
"borderWidth": "2px",
"boxShadow": "0 2px 8px rgba(0,0,0,0.15)",
"color": "white",
"fontSize": "14px",
"fontWeight": "500",
"minWidth": "140px",
"padding": "12px 16px",
"textAlign": "center"
}
}
```
**Important:** Both `nodeType` (top-level) AND `data.nodeType` should be set to the same value for compatibility.
## Node Type Catalog
### Flow Control Nodes
| nodeType | type | Pipeline | Color | Description |
|----------|------|----------|-------|-------------|
| `start` | startNode | entry | `#4ade80` / `#22c55e` | Entry point for entry pipeline |
| `exit_start` | exitStartNode | exit | `#4a5568` / `#2d3748` | Entry point for exit pipeline |
| `cancellation_start` | cancellationStartNode | cancellation | `#f97316` / `#ea580c` | Entry point for cancellation pipeline |
### Condition Nodes (type: `conditionNode`)
All use `backgroundColor: "#4a5568"`, `borderColor: "#2d3748"`.
#### Cycle Conditions
| nodeType | Label |
|----------|-------|
| `cycle.low.developing.33` | Cycle Low (Live) 33% |
| `cycle.low.developing.66` | Cycle Low (Live) 66% |
| `cycle.low.developing.100` | Cycle Low (Live) 100% |
| `cycle.low.confirmed` | Confirmed Cycle Low |
| `cycle.low.provisional` | Provisional Cycle Low |
| `cycle.low.superseded` | Superseded Cycle Low |
| `cycle.low.higher_low` | Cycle Higher Low |
| `cycle.low.lower_low` | Cycle Lower Low |
| `cycle.low.sweep` | Cycle Low Sweep |
| `cycle.high.developing.33` | Cycle High (Live) 33% |
| `cycle.high.developing.66` | Cycle High (Live) 66% |
| `cycle.high.developing.100` | Cycle High (Live) 100% |
| `cycle.high.confirmed` | Confirmed Cycle High |
| `cycle.high.provisional` | Provisional Cycle High |
| `cycle.high.superseded` | Superseded Cycle High |
| `cycle.high.higher_high` | Cycle Higher High |
| `cycle.high.lower_high` | Cycle Lower High |
| `cycle.high.sweep` | Cycle High Sweep |
#### Swing Conditions
| nodeType | Label |
|----------|-------|
| `swing_high` | Swing High |
| `swing_low` | Swing Low |
| `swing_high_break` | Swing High Break |
| `swing_low_break` | Swing Low Break |
| `swing_high_sweep` | Swing High Sweep |
| `swing_low_sweep` | Swing Low Sweep |
| `higher_low` | Higher Low |
| `higher_high` | Higher High |
| `lower_low` | Lower Low |
| `lower_high` | Lower High |
#### EMA Conditions
| nodeType | Label |
|----------|-------|
| `ema_bullish_alignment` | Bullish EMA Alignment |
| `ema_bearish_alignment` | Bearish EMA Alignment |
| `ema_bullish_alignment_sustained` | Bullish EMA Alignment Sustained |
| `ema_bullish_cloud_hit` | Bullish EMA Cloud Hit |
| `ema.cross.above` | Price Crossed Above EMA |
| `ema.cross.below` | Price Crossed Below EMA |
| `closes_above_ema_5` | Closes Above EMA 5 |
| `closes_above_ema_10` | Closes Above EMA 10 |
| `closes_above_ema_20` | Closes Above EMA 20 |
| `closes_below_ema_5` | Closes Below EMA 5 |
| `closes_below_ema_10` | Closes Below EMA 10 |
| `closes_below_ema_20` | Closes Below EMA 20 |
| `price_above_ema` | Price Above EMA |
| `price_below_ema` | Price Below EMA |
| `price_touches_ema` | Price Touches EMA |
#### DSS (Double Smoothed Stochastic) Conditions
| nodeType | Label | Params |
|----------|-------|--------|
| `dss.cross.bullish` | DSS Crossed Above Signal | β |
| `dss.level.overbought` | DSS Entered Overbought Zone | β |
| `dss.level.oversold` | DSS Entered Oversold Zone | β |
| `dss.overbought` | DSS Overbought | β |
#### RSI Conditions
| nodeType | Label | Params |
|----------|-------|--------|
| `rsi.cross.above` | RSI Crossed Above {level} | `{ level: 30 }` or `{ level: 70 }` |
#### Bollinger Band Conditions
| nodeType | Label |
|----------|-------|
| `bollinger.break.belowLower` | Close Broke Below Lower Band |
#### Price / Trend Conditions
| nodeType | Label |
|----------|-------|
| `break_previous_high` | Break Previous High |
| `break_previous_low` | Break Previous Low |
| `bullish_trend_break` | Bullish Trend Break |
| `bearish_trend_break` | Bearish Trend Break |
| `trendline_breach_bullish` | Trendline Breach (Bullish) |
| `trendline_breach_bearish` | Trendline Breach (Bearish) |
#### Volume Conditions
| nodeType | Label |
|----------|-------|
| `atr_expansion` | ATR Expansion |
| `atr_contraction` | ATR Contraction |
| `volume_spike` | Volume Spike |
#### S/R Conditions
| nodeType | Label |
|----------|-------|
| `price.near.support` | Price Near Support |
#### Custom Event Reference
| nodeType | Label | Params |
|----------|-------|--------|
| `custom_event_reference` | {event name} | `{ customEventId: "..." }` |
### Logic Gate Nodes (type: `logicNode`)
| nodeType | Color (bg/border) | Description |
|----------|-------------------|-------------|
| `and_gate` | `#9c27b0` / `#7b1fa2` | ALL inputs must be true |
| `or_gate` | `#9c27b0` / `#7b1fa2` | ANY input must be true |
| `then_gate` | `#9c27b0` / `#7b1fa2` | Sequential: inputs must fire in order |
| `not_gate` | `#9c27b0` / `#7b1fa2` | Negates the input condition |
| `confidence_filter` | `#9c27b0` / `#7b1fa2` | Requires minimum confidence score |
Logic gates accept `data.maxGapDays` (for AND/THEN) to control the time window.
### Signal / Output Nodes (type: `outputNode`)
| nodeType | Color (bg/border) | Description |
|----------|-------------------|-------------|
| `long_signal` | `#4caf50` / `#388e3c` | Generate long (buy) signal |
| `signal` | `#3b82f6` / `#2563eb` | Generic signal (set `data.signalType`) |
| `sl_atr` | `#ff8a65` / `#ff7043` | Stop loss based on ATR |
| `sl_below_recent_low` | `#ff8a65` / `#ff7043` | Stop loss below recent swing low |
| `tp_2r` | `#388e3c` / `#2e7d32` | Take profit at 2:1 R/R |
| `tp_3r` | `#388e3c` / `#2e7d32` | Take profit at 3:1 R/R |
| `tp_5r` | `#388e3c` / `#2e7d32` | Take profit at 5:1 R/R |
| `tp_10r` | `#388e3c` / `#2e7d32` | Take profit at 10:1 R/R |
| `trailingStop` | `#ef4444` / `#dc2626` | Trailing stop (set `data.params.rMultiple`) |
### Exit Nodes
| nodeType | type | Color (bg/border) | Pipeline |
|----------|------|-------------------|----------|
| `close_position` | closePositionNode | `#4a5568` / `#2d3748` | exit |
| `cancel_exit` | exitNode | `#0ea5e9` / `#0284c7` | cancellation |
| `exit` | exitNode | `#ef4444` / `#dc2626` | exit |
## Edge Structure
```json
{
"id": "edge-{sourceId}-{targetId}",
"source": "node-1",
"target": "node-4",
"sourceHandle": "output",
"targetHandle": "conditions"
}
```
### Handle Types
| Handle | Used On | Meaning |
|--------|---------|---------|
| `"entry"` | Logic gates | Flow/trigger input (from Start or upstream gate) |
| `"conditions"` | Logic gates | Condition input (from condition nodes) |
| `"output"` | Logic gates, signals | Output to downstream nodes |
| `"input"` | Most nodes | General input |
| `null` | Condition β Gate | Default when no explicit handle |
### Wiring Rules
#### Entry Pipeline
1. **Start** β (output β entry) β **Logic Gate**
2. **Condition Nodes** β (null β conditions) β **Logic Gate**
3. **Logic Gate** β (output β input) β **Signal Node**
4. **Logic Gate/Signal** β (output β input) β **SL Node**
5. **Logic Gate/Signal** β (output β input) β **TP Node**
#### Exit Pipeline
1. **Exit Start** β (null β input) β **Condition Node**
2. **Condition Node** β (null β input) β **Close Position**
Or with logic gates:
1. **Exit Start** β (null β entry) β **Logic Gate**
2. **Conditions** β (null β conditions) β **Logic Gate**
3. **Logic Gate** β (output β input) β **Close Position**
#### Cancellation Pipeline
1. **Cancellation Start** β (null β input) β **Condition Node**
2. **Condition Node** β (null β input) β **Cancel Exit**
## Complete Example β Trend Momentum Strategy
```json
{
"name": "Trend Momentum",
"description": "Enter long when EMA crosses bullish AND DSS confirms momentum. Exit on bearish EMA cross. Cancel if DSS overbought.",
"isPublic": false,
"metadata": {
"timeframe": "1D",
"assets": ["BTC-USD", "NVDA", "AAPL"],
"tags": ["trend-following", "momentum"]
},
"visual": {
"nodes": [
{
"id": "node-1", "type": "startNode", "nodeType": "start",
"label": "Start", "position": {"x": 150, "y": 50},
"data": {"nodeType": "start", "pipeline": "entry", "label": "Start"},
"style": {"backgroundColor": "#4ade80", "borderColor": "#22c55e", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-2", "type": "conditionNode", "nodeType": "ema.cross.above",
"label": "Price Crossed Above EMA", "position": {"x": 30, "y": 200},
"data": {"nodeType": "ema.cross.above", "pipeline": "entry", "timeframe": "daily", "label": "Price Crossed Above EMA"},
"style": {"backgroundColor": "#4a5568", "borderColor": "#2d3748", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-3", "type": "conditionNode", "nodeType": "dss.cross.bullish",
"label": "DSS Crossed Above Signal", "position": {"x": 280, "y": 200},
"data": {"nodeType": "dss.cross.bullish", "pipeline": "entry", "timeframe": "daily", "label": "DSS Crossed Above Signal"},
"style": {"backgroundColor": "#4a5568", "borderColor": "#2d3748", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-4", "type": "logicNode", "nodeType": "and_gate",
"label": "AND Gate", "position": {"x": 160, "y": 350},
"data": {"nodeType": "and_gate", "pipeline": "entry", "label": "AND Gate"},
"style": {"backgroundColor": "#9c27b0", "borderColor": "#7b1fa2", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-5", "type": "outputNode", "nodeType": "long_signal",
"label": "Long Signal", "position": {"x": 30, "y": 510},
"data": {"nodeType": "long_signal", "pipeline": "entry", "label": "Long Signal"},
"style": {"backgroundColor": "#4caf50", "borderColor": "#388e3c", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-6", "type": "outputNode", "nodeType": "sl_atr",
"label": "SL ATR Based", "position": {"x": 200, "y": 510},
"data": {"nodeType": "sl_atr", "pipeline": "entry", "label": "SL ATR Based"},
"style": {"backgroundColor": "#ff8a65", "borderColor": "#ff7043", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-7", "type": "outputNode", "nodeType": "tp_3r",
"label": "TP 3:1 Risk Reward", "position": {"x": 370, "y": 510},
"data": {"nodeType": "tp_3r", "pipeline": "entry", "label": "TP 3:1 Risk Reward"},
"style": {"backgroundColor": "#388e3c", "borderColor": "#2e7d32", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-8", "type": "exitStartNode", "nodeType": "exit_start",
"label": "Exit Start", "position": {"x": 600, "y": 50},
"data": {"nodeType": "exit_start", "pipeline": "exit", "label": "Exit Start"},
"style": {"backgroundColor": "#4a5568", "borderColor": "#2d3748", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-9", "type": "conditionNode", "nodeType": "ema.cross.below",
"label": "Price Crossed Below EMA", "position": {"x": 570, "y": 200},
"data": {"nodeType": "ema.cross.below", "pipeline": "exit", "timeframe": "daily", "label": "Price Crossed Below EMA"},
"style": {"backgroundColor": "#4a5568", "borderColor": "#2d3748", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-10", "type": "closePositionNode", "nodeType": "close_position",
"label": "Close Position", "position": {"x": 600, "y": 370},
"data": {"nodeType": "close_position", "pipeline": "exit", "label": "Close Position"},
"style": {"backgroundColor": "#4a5568", "borderColor": "#2d3748", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-11", "type": "cancellationStartNode", "nodeType": "cancellation_start",
"label": "Cancellation", "position": {"x": 870, "y": 50},
"data": {"nodeType": "cancellation_start", "pipeline": "cancellation", "label": "Cancellation"},
"style": {"backgroundColor": "#f97316", "borderColor": "#ea580c", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-12", "type": "conditionNode", "nodeType": "dss.overbought",
"label": "DSS Entered Overbought Zone", "position": {"x": 820, "y": 200},
"data": {"nodeType": "dss.overbought", "pipeline": "cancellation", "timeframe": "daily", "label": "DSS Entered Overbought Zone"},
"style": {"backgroundColor": "#4a5568", "borderColor": "#2d3748", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
},
{
"id": "node-13", "type": "exitNode", "nodeType": "cancel_exit",
"label": "Cancel", "position": {"x": 870, "y": 370},
"data": {"nodeType": "cancel_exit", "pipeline": "cancellation", "label": "Cancel"},
"style": {"backgroundColor": "#0ea5e9", "borderColor": "#0284c7", "borderRadius": "8px", "borderStyle": "solid", "borderWidth": "2px", "boxShadow": "0 2px 8px rgba(0,0,0,0.15)", "color": "white", "fontSize": "14px", "fontWeight": "500", "minWidth": "140px", "padding": "12px 16px", "textAlign": "center"}
}
],
"edges": [
{"id": "edge-1-4", "source": "node-1", "target": "node-4", "sourceHandle": null, "targetHandle": "entry"},
{"id": "edge-2-4", "source": "node-2", "target": "node-4", "sourceHandle": null, "targetHandle": "conditions"},
{"id": "edge-3-4", "source": "node-3", "target": "node-4", "sourceHandle": null, "targetHandle": "conditions"},
{"id": "edge-4-5", "source": "node-4", "target": "node-5", "sourceHandle": "output", "targetHandle": "input"},
{"id": "edge-4-6", "source": "node-4", "target": "node-6", "sourceHandle": "output", "targetHandle": "input"},
{"id": "edge-4-7", "source": "node-4", "target": "node-7", "sourceHandle": "output", "targetHandle": "input"},
{"id": "edge-8-9", "source": "node-8", "target": "node-9", "sourceHandle": null, "targetHandle": "input"},
{"id": "edge-9-10", "source": "node-9", "target": "node-10", "sourceHandle": null, "targetHandle": "input"},
{"id": "edge-11-12", "source": "node-11", "target": "node-12", "sourceHandle": null, "targetHandle": "input"},
{"id": "edge-12-13", "source": "node-12", "target": "node-13", "sourceHandle": null, "targetHandle": "input"}
],
"visual": {
"entry": {
"nodes": ["(nodes 1-7 from above)"],
"edges": ["(edges for entry pipeline)"]
},
"exit": {
"nodes": ["(nodes 8-10)"],
"edges": ["(edges for exit pipeline)"]
},
"cancellation": {
"nodes": ["(nodes 11-13)"],
"edges": ["(edges for cancellation pipeline)"]
}
}
}
}
```
## Common Patterns
### Simple: One Condition β Signal
```
Start β [entry] AND Gate β [conditions] Condition
AND Gate β [outputβinput] Long Signal
AND Gate β [outputβinput] SL Below Recent Low
AND Gate β [outputβinput] TP 5R
```
### Two Conditions AND'd
```
Start β [entry] AND Gate
Condition A β [conditions] AND Gate
Condition B β [conditions] AND Gate
AND Gate β Long Signal + SL + TP
```
### Sequential (THEN Gate) β LINEAR CHAIN PATTERN
```
Start β [input] Condition1
Condition1 β [entry] THEN Gate
THEN Gate β [outputβinput] Condition2
Condition2 β [input] Long Signal
Long Signal β [outputβinput] SL Node
Long Signal β [outputβinput] TP Node
```
**IMPORTANT:** THEN gates use a **linear chain**, NOT the `conditions` handle.
- The first condition feeds into the THEN Gate's `entry` handle
- The THEN Gate's `output` feeds into the second condition's `input`
- `maxGapDays` controls the time window (typical values: 30 for indicators, 60-90 for structural)
- Do NOT use `targetHandle: "conditions"` with THEN gates β that's for AND/OR gates only
- **SL and TP nodes ALWAYS connect from the Signal node, NOT from the last condition node**
### OR Gate with Exit
```
Exit Start β [entry] OR Gate
Bearish Condition A β [conditions] OR Gate
Bearish Condition B β [conditions] OR Gate
OR Gate β [outputβinput] Close Position
```
### WCL-Style (Complex)
```
Start β [entry] AND Gate
Cycle Low 66% β [conditions] AND Gate
OR Gate β [conditions] AND Gate
EMA Bullish β [conditions] OR Gate
Swing High Break β [conditions] OR Gate
Higher Low β [conditions] OR Gate
AND Gate β Long Signal + SL Below Recent Low + TP 10R
Exit Start β THEN Gate
Cycle High 66% β [entry] THEN Gate
THEN Gate β OR Gate
Lower High β [conditions] OR Gate
Swing Low Break β [conditions] OR Gate
Bearish EMA β [conditions] OR Gate
OR Gate β Close Position
```
## Key Rules
1. **Every strategy needs a `start` node** β the compiler starts traversal here
2. **Conditions feed into logic gates** via `targetHandle: "conditions"`
3. **Start/flow feeds into logic gates** via `targetHandle: "entry"`
4. **Logic gate outputs** use `sourceHandle: "output"`
5. **Set both `nodeType` and `data.nodeType`** to the same value
6. **Set `data.pipeline`** on every node (`"entry"`, `"exit"`, or `"cancellation"`)
7. **Include at least one signal output** (long_signal or signal) in entry pipeline
8. **Include SL and TP nodes** connected to the **signal node** (long_signal), NOT to the last condition or gate
9. **Node IDs must be unique** β use `node-1`, `node-2`, etc.
10. **Edge IDs must be unique** β use `edge-{source}-{target}` pattern
11. **Position nodes logically** β top to bottom flow, ~150px vertical spacing
12. **The flat `visual.nodes`/`visual.edges` arrays must contain ALL nodes/edges**
```
---
## Skill Companion Files
> Additional files collected from the skill directory layout.
### README.md
```markdown
# π DWLF Clawdbot Skill
A [Clawdbot](https://github.com/clawdbot/clawdbot) skill that gives your agent native access to [DWLF](https://dwlf.co.uk) β a market analysis platform for crypto and stocks.
Ask your agent things like:
- "How's BTC looking?"
- "What signals fired today?"
- "Show me support/resistance levels for TSLA"
- "Run a backtest on my Golden Cross strategy"
- "Log a long on ETH at 3,200"
- "Create a custom event that fires when DSS exits oversold with a bullish cross"
- "Search the academy for lessons about composability"
## What's DWLF?
DWLF turns market noise into semantic data β support/resistance levels, indicator events, trade signals, backtests, and more. This skill lets your Clawdbot agent tap into all of it conversationally.
The companion [MCP server](https://github.com/dwlf-ai/dwlf-mcp-server) exposes 43 tools across market data, indicators, strategies, backtesting, portfolio, trade journal, custom events, AI summaries, and academy content.
## Setup
### 1. Install the skill
Copy this skill into your Clawdbot workspace:
```bash
cd ~/clawd/skills
git clone https://github.com/andywilliams/dwlf-clawdbot-skill.git dwlf
```
### 2. Get an API key
1. Sign up at [dwlf.co.uk](https://dwlf.co.uk)
2. Go to **Settings β API Keys**
3. Click **Generate Key** β name it something like "Clawdbot"
4. Copy the key (`dwlf_sk_...`)
### 3. Configure auth
Add your API key to `TOOLS.md` in your workspace:
```markdown
## DWLF
- API Key: dwlf_sk_your_key_here
```
Or set the environment variable:
```bash
export DWLF_API_KEY="dwlf_sk_your_key_here"
```
### 4. Use it
Just talk to your agent about markets. The skill triggers automatically on topics like market analysis, trading signals, backtests, portfolio, indicators, support/resistance, etc.
## What's Included
```
dwlf/
βββ SKILL.md # Procedural instructions (loaded by Clawdbot)
βββ scripts/
β βββ dwlf-api.sh # Generic API wrapper (curl + jq)
βββ references/
βββ api-endpoints.md # Full endpoint reference (188+ endpoints)
```
## Capabilities
| Feature | Examples |
|---------|---------|
| **Market Data** | Price, OHLCV candles, volume |
| **Technical Indicators** | RSI, EMA, MACD, Bollinger Bands, DSS, Ichimoku, and more |
| **Support/Resistance** | Auto-detected levels with confidence scores |
| **Trendlines** | Auto-detected with slope and touch points |
| **Events** | Breakouts, crossovers, divergences, candlestick patterns |
| **Strategies** | Create, view, compile, and manage visual signal strategies |
| **Backtesting** | Run backtests with win rate, Sharpe ratio, P&L |
| **Trade Signals** | Active signals, recent history, performance stats |
| **Portfolio** | Track holdings, P&L, snapshots |
| **Trade Journal** | Log trades, add notes, track executions |
| **Watchlist** | Monitor symbols |
| **Custom Events** | Define your own indicator-based events with composable gates |
| **AI Summaries** | Dashboard overview, symbol briefs, strategy performance β optimized for agents |
| **Academy** | Educational content on indicators, events, strategies, and composability |
## Example Prompts
```
# Market analysis
"How's BTC looking?"
"What are the support and resistance levels for TSLA?"
"Show me RSI, MACD, and DSS for NVDA on the 4h chart"
"What events have fired for SOL recently?"
# Signals & strategies
"What signals fired today?"
"How are my strategies performing? Show win rates"
"Browse public strategies for ideas"
# Strategy building & backtesting
"Create a Golden Cross strategy using EMA 50/200"
"Backtest my Trend Momentum strategy on NVDA"
"What's the Sharpe ratio on my last backtest?"
# Portfolio & trades
"Show me my portfolio performance"
"Log a long on ETH at 3,200 with a stop at 3,050"
"Add a note to my BTC trade: held through consolidation"
"Close my TSLA trade at 285"
# Custom events
"Create a custom event that fires when DSS exits oversold with a bullish cross"
"List my custom events and their recent triggers"
# Academy
"What does the academy say about composability?"
"Show me the lesson on custom events"
"Search the academy for lessons about DSS"
```
## Cookbook
Multi-step workflows the agent handles naturally:
### Analyze a Symbol
Ask "Give me a full analysis of BTC" and the agent will:
1. Pull the AI symbol brief (price, indicators, S/R, events)
2. Get 4h indicators for momentum detail
3. Check trendlines and support/resistance
4. Review recent events and active signals
5. Synthesize everything into a market view
### Build and Backtest a Strategy
Ask "Create a trend-following strategy and test it on BTC" and the agent will:
1. Create the strategy with your conditions
2. Compile it into executable form
3. Run a backtest over your chosen period
4. Review results (win rate, Sharpe, P&L)
5. Suggest iterations based on the numbers
### Daily Trading Routine
Ask "What's going on today?" and the agent will:
1. Pull the AI dashboard (watchlist, signals, trades, portfolios)
2. Highlight active signals and their performance
3. Review open positions
4. Help you log new trades or journal existing ones
For detailed worked examples with tool call sequences, see the [MCP server cookbook](https://github.com/dwlf-ai/dwlf-mcp-server/blob/main/docs/cookbook.md).
## Symbol Format
- **Crypto:** `BTC-USD`, `ETH-USD`, `SOL-USD`
- **Stocks/ETFs:** `TSLA`, `NVDA`, `META`, `MARA`
- **Forex:** `GBP-USD`, `EUR-USD`
## Also Available: MCP Server
Want to use DWLF from Claude Desktop, Codex, Cursor, or any MCP client? Check out the companion project:
π [dwlf-mcp-server](https://github.com/dwlf-ai/dwlf-mcp-server) β 43 tools, full read/write access
## License
MIT
```
### _meta.json
```json
{
"owner": "andywilliams",
"slug": "dwlf",
"displayName": "A Clawdbot skill that gives your agent native access to DWLF β a market analysis platform for crypto and stocks. https://www.dwlf.co.uk",
"latest": {
"version": "1.0.0",
"publishedAt": 1769810648067,
"commit": "https://github.com/clawdbot/skills/commit/f3794aa9cd3b09105b7a6e539b4e5640abf2eae4"
},
"history": []
}
```