Help us improve
Share bugs, ideas, or general feedback.
From vulcan
Places and manages grid trading strategies on Phoenix DEX perpetuals. Automates limit order grids to profit from ranging markets.
npx claudepluginhub ellipsis-labs/vulcan-cliHow this skill is triggered — by the user, by Claude, or both
Slash command
/vulcan:vulcan-grid-tradingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill for:
Places and cancels perpetual futures orders on Phoenix DEX with pre-trade checks, TP/SL attachments, and paper/live mode support.
Deploys grid trading on Kraken with layered buy/sell limit orders across a price range for sideways markets. Covers paper testing, live batch placement, and maintenance loop for filled orders.
Backtests, optimizes parameters, and deploys grid trading bots on Revolut X crypto pairs like BTC-USD via revx CLI. Handles auth fixes automatically.
Share bugs, ideas, or general feedback.
Use this skill for:
Grid trading places buy limit orders below the current price and sell limit orders above it at fixed intervals. When a buy fills, a corresponding sell is placed one grid level higher. When a sell fills, a corresponding buy is placed one grid level lower. Profit comes from capturing the spread at each level.
On perpetual futures (Phoenix DEX), this means opening and closing positions at grid levels. Funding rate costs/income also factor into profitability.
Grid maintenance is a long-running loop. Prefer Vulcan's native grid runner (vulcan strategy grid start or vulcan_strategy_grid_start) when available. It owns the loop, checks live margin feasibility before launch, persists tick logs and level ledgers, supports Paper mode, Plan mode with dry run, Live mode with confirmation required, and Live mode with automatic execution, and records per-level TP/SL intent. Do not write a custom bot or scheduler script if the native runner, MCP tools, or app loop can run the maintenance cycle directly.
Before placing or maintaining a grid, pick a mode via the vulcan-execution-modes skill (canonical mode list, question format, per-mode follow-ups). Additionally ask whether the user wants cross-margin or isolated-margin execution: cross-margin live grids use batched multi-limit placement; isolated live grids submit individual isolated limit orders and can transfer optional collateral on the first order. Collect per-mode follow-ups plus safety guardrails before launch.
Define with the user before starting:
PRICE:SIZE_LOTS[:TP][:SL]Grid spacing = (upper - lower) / total_levels
Mode-agnostic — run first (no wallet required):
1. vulcan_market_info → { symbol: "SOL" } # base_lots_decimals, tick_size, fees
2. vulcan_market_ticker → { symbol: "SOL" } # current price (center the grid)
3. vulcan_market_orderbook → { symbol: "SOL" } # spread, depth
Then pick the execution mode (per vulcan-execution-modes) before any wallet-bound call.
Paper / Dry-Run:
vulcan_paper_status → {} # if PAPER_NOT_INITIALIZED, propose `vulcan paper init --balance <N>`
vulcan_paper_positions → {} # existing simulated exposure
Confirm-Each / Auto-Execute:
vulcan_strategy_preflight → { wallet } # must report READY
vulcan_margin_status → {} # enough collateral for worst case?
vulcan_position_list → {} # existing positions in this market
Never call vulcan_margin_status / vulcan_position_list / vulcan_portfolio_* in paper or dry-run — they resolve a wallet and provide no signal for simulated runs.
spacing = (upper_bound - lower_bound) / total_levels
Example: Range 140–160, 10 levels, current price 150:
spacing = (160 - 140) / 10 = 2.0
Buy levels: 148, 146, 144, 142, 140
Sell levels: 152, 154, 156, 158, 160
Ensure all prices are valid multiples of tick_size from vulcan_market_info.
size_per_level_lots = desired_tokens_per_level * 10^base_lots_decimals
Worst case: all buy orders fill (max long position) or all sell orders fill (max short position). Calculate margin required:
max_position_lots = size_per_level_lots * levels_per_side
Check this against leverage tiers and available collateral.
Present the full grid before placing:
Prefer the native runner:
vulcan_strategy_grid_start → {
symbol: "SOL",
lower_price: 140,
upper_price: 160,
levels_per_side: 5,
tokens_per_level: 0.5,
take_profit_spacing: 2,
stop_loss_spacing: 4,
mode: "paper",
margin_mode: "cross",
run_until_stopped: true,
detached: true
}
When the user describes the grid relative to the current price (e.g. "±1% around mark"), prefer center_on_mark: true with width_pct instead of absolute bounds. The runner re-anchors the grid to the mark at submission time, so price drift between approval and launch doesn't invalidate the run:
vulcan_strategy_grid_start → {
symbol: "SOL",
center_on_mark: true,
width_pct: 1.0,
levels_per_side: 5,
tokens_per_level: 0.5,
mode: "paper",
margin_mode: "cross"
}
For raw agent-managed fallback, use vulcan_trade_multi_limit to place all grid orders in a single transaction. This is much faster than placing orders individually.
vulcan_trade_multi_limit → {
symbol: "SOL",
bids: [
{ price: 148.00, size: 50 },
{ price: 146.00, size: 50 },
{ price: 144.00, size: 50 },
{ price: 142.00, size: 50 },
{ price: 140.00, size: 50 }
],
asks: [
{ price: 152.00, size: 50 },
{ price: 154.00, size: 50 },
{ price: 156.00, size: 50 },
{ price: 158.00, size: 50 },
{ price: 160.00, size: 50 }
],
slide: false,
acknowledged: true
}
vulcan_trade_orders → { symbol: "SOL" }
Periodically check for fills and replace completed orders:
Display every maintenance tick with the shared tick contract: strategy, symbol, tick number, mode, timestamp, market snapshot, account or paper state, missing/filled grid levels, planned replacements, guardrail checks or trigger outcomes, execution result, and next tick timing. Live grid maintenance treats missing resting levels as filled and submits flipped replacement orders on later ticks; TP/SL activation remains pending until fills can be mapped authoritatively.
Launch and monitoring contract for multi-tick MCP runs: see CONTEXT.md § Strategy Monitoring (Detached Runs). For long-lived grids, that means run_until_stopped: true plus detached: true. Grid-specific tick narration:
Vulcan's grid runner is a local process, not an always-on daemon. If the machine sleeps, the process exits, or networking is unavailable, resting orders remain live but monitoring/replacements stop. vulcan_strategy_monitor exposes lifecycle staleness and runner-lock state; if lifecycle.stale is true, stop and tell the user to resume/reconcile instead of claiming the grid is maintained.
In live native grid mode, per-level TP/SL is persisted as intent until the runner submits and records an actual TP/SL/bracket action. Never tell the user TP/SL is active just because it was specified in the grid plan.
vulcan_trade_orders → { symbol: "SOL" }
Compare against the expected grid. Missing orders = filled.
vulcan_position_show → { symbol: "SOL" }
Batch all replacement orders into a single vulcan_trade_multi_limit call:
vulcan_trade_multi_limit → {
symbol: "SOL",
bids: [{ price: <P - spacing>, size: 50 }, ...],
asks: [{ price: <P + spacing>, size: 50 }, ...],
slide: false,
acknowledged: true
}
vulcan_margin_status → {}
If risk_state is not Healthy, pause grid maintenance and alert user.
Suggested check interval: 60 seconds for cron-style agent loops. Use shorter intervals only when the active agent client explicitly supports sub-minute wakeups. If the user asks for a cadence below the scheduler minimum, stop and ask for explicit approval before rounding or changing the cadence.
Prefer the native finalize flow for strategy-owned shutdown:
vulcan_strategy_finalize → { run_id: "<RUN_ID>", cancel_orders: true, close_position: true, wait: true, acknowledged: true }
Fallback manual cleanup cancels all grid orders:
vulcan_trade_cancel → { symbol: "SOL", scope: "all", acknowledged: true }
Then optionally close any remaining position:
vulcan_position_close → { symbol: "SOL", acknowledged: true }
vulcan_market_ticker for the funding rate — a high funding rate can erode grid profits.isolated_collateral transfer amount.