Build and manage custom trading strategies with natural language
40
40%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Medium
Suggest reviewing before use
Fix and improve this skill with Tessl
tessl review fix ./src/skills/bundled/strategy/SKILL.mdCreate custom trading strategies using natural language or templates, then deploy to live trading.
/strategy create "Buy when price drops 5% in 1 hour"
/strategy create momentum --lookback 14 --threshold 2%
/strategy from-template mean-reversion/strategies List all strategies
/strategy <name> View strategy details
/strategy edit <name> Modify strategy
/strategy delete <name> Remove strategy/strategy activate <name> Start running strategy
/strategy deactivate <name> Stop strategy
/strategy pause <name> Pause temporarily
/strategy resume <name> Resume paused strategy/strategy test <name> --dry-run Test without real trades
/strategy backtest <name> Run backtest
/strategy validate <name> Check for errorsimport { createStrategyBuilder } from 'clodds/strategy';
const builder = createStrategyBuilder({
// Validation
requireDryRun: true,
validateParameters: true,
// Storage
storage: 'sqlite',
dbPath: './strategies.db',
});// Create from natural language
const strategy = await builder.fromNaturalLanguage({
description: `
Buy YES on any market when:
- Price drops more than 5% in the last hour
- Volume is above average
- Spread is less than 2%
Sell when:
- Price recovers 3% from entry
- Or after 24 hours (timeout)
Risk: Max 5% of portfolio per trade
`,
name: 'dip-buyer',
});
console.log(`Created: ${strategy.name}`);
console.log(`Conditions: ${strategy.conditions.length}`);// Momentum strategy
const momentum = await builder.fromTemplate('momentum', {
lookbackPeriod: 14,
entryThreshold: 0.02,
exitThreshold: 0.01,
stopLoss: 0.05,
takeProfit: 0.10,
maxPositionPct: 10,
});
// Mean reversion strategy
const meanReversion = await builder.fromTemplate('mean-reversion', {
lookbackPeriod: 20,
deviationThreshold: 2, // Standard deviations
exitOnMean: true,
stopLoss: 0.08,
});
// Arbitrage strategy
const arbitrage = await builder.fromTemplate('arbitrage', {
minSpread: 0.02,
platforms: ['polymarket', 'kalshi'],
maxSlippage: 0.01,
});
// Breakout strategy
const breakout = await builder.fromTemplate('breakout', {
rangePeriod: '7d',
breakoutThreshold: 0.05,
confirmationVolume: 1.5, // 1.5x average volume
});// Full custom strategy
const custom = await builder.create({
name: 'my-custom-strategy',
description: 'Buy low-priced markets with high volume',
// Entry conditions (all must be true)
entryConditions: [
{ type: 'price', operator: '<', value: 0.30 },
{ type: 'volume24h', operator: '>', value: 50000 },
{ type: 'spread', operator: '<', value: 0.02 },
],
// Exit conditions (any triggers exit)
exitConditions: [
{ type: 'profit', operator: '>=', value: 0.15 },
{ type: 'loss', operator: '>=', value: 0.10 },
{ type: 'holdTime', operator: '>=', value: '48h' },
],
// Risk management
risk: {
maxPositionPct: 5,
stopLoss: 0.10,
takeProfit: 0.20,
maxConcurrentPositions: 5,
},
// Execution
execution: {
orderType: 'limit',
limitBuffer: 0.005,
retries: 3,
},
});const validation = await builder.validate(strategy);
if (validation.valid) {
console.log('✅ Strategy is valid');
} else {
console.log('❌ Validation errors:');
for (const error of validation.errors) {
console.log(` - ${error}`);
}
}
// Warnings (not blocking)
for (const warning of validation.warnings) {
console.log(`⚠️ ${warning}`);
}// Start with dry-run first (required)
await builder.activate(strategy.name, {
dryRun: true,
notifyOnTrade: true,
});
// After validation, go live
await builder.activate(strategy.name, {
dryRun: false,
capital: 5000, // Allocate $5000
});const status = await builder.getStatus(strategy.name);
console.log(`Status: ${status.status}`); // 'active' | 'paused' | 'stopped'
console.log(`Trades: ${status.trades}`);
console.log(`P&L: $${status.pnl}`);
console.log(`Win Rate: ${status.winRate}%`);
console.log(`Active Positions: ${status.activePositions}`);
console.log(`Last Signal: ${status.lastSignal}`);const strategies = await builder.list();
for (const s of strategies) {
console.log(`${s.name}: ${s.status}`);
console.log(` Type: ${s.template || 'custom'}`);
console.log(` P&L: $${s.pnl}`);
console.log(` Trades: ${s.trades}`);
}| Template | Description |
|---|---|
momentum | Follow price trends |
mean-reversion | Buy dips, sell rallies |
arbitrage | Cross-platform spreads |
breakout | Range breakout entries |
pairs | Correlated market pairs |
news-reactive | React to news events |
volume-spike | Trade on volume surges |
| Type | Description | Example |
|---|---|---|
price | Current price | < 0.30 |
volume24h | 24h volume | > 50000 |
spread | Bid-ask spread | < 0.02 |
profit | Unrealized profit | >= 0.15 |
loss | Unrealized loss | >= 0.10 |
holdTime | Time in position | >= 48h |
priceChange | Price change % | < -0.05 (5% drop) |
e71a5f6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.