Skip to content

Perp grid

Status: Live (jurisdiction-gated) | MCP tool: strategy_perp_grid_create

A ladder of perp LONGS accumulated on dips around a rolling center price. Routes through the multi-venue perps venue adapter (hard rule 2) -- Jupiter Perps primary, non-custodial, on-chain.

Params

Param Type Default Meaning
wallet_address string required Agent's managed wallet address.
target_token string required Perp market symbol (only assets with a mapped perp market can open -- see get_venue_status; currently SOL).
usd_per_level float required USD size per grid rung.
interval_seconds int 300 Tick cadence.
center_price float none Explicit grid center; defaults to a rolling SMA.
center_period int 20 SMA period for the rolling center when center_price is unset.
grid_spacing_pct float 0.02 Price move per rung below center.
grid_levels int 5 Number of rungs.
leverage float 1.0 Leverage per rung.
range_tighten float 0.5 Spacing multiplier in a range regime (tighter).
volatile_widen float 2.0 Spacing multiplier in a volatile regime (wider).
venue string none Perps venue (defaults to the configured primary -- Jupiter Perps).
acknowledge_tier_b bool false Required true to write to a Tier B (custodied) venue.
slippage_bps int 50 Max slippage per fill.

risk (optional dict, all percent units, <= 0 disables that single guard; omitted keys keep the model's safe defaults): max_position_pct, max_portfolio_exposure_pct, max_single_loss_pct, max_drawdown_pct, max_daily_loss_pct.

Example create call

result = await client.call_tool("strategy_perp_grid_create", {
    "wallet_address": "<AGENT_PUBLIC_KEY>",
    "target_token": "SOL",
    "usd_per_level": 20,
    "grid_levels": 5,
    "grid_spacing_pct": 0.02,
    "leverage": 2.0,
    "interval_seconds": 300,
})

A successful create returns strategy_id, strategy_type, status, schedule, and managed_signing (whether the wallet has a Turnkey signer -- false means each tick returns an unsigned tx to sign).

Policy interaction

Every create call runs through the same gate stack as a hand-built trade before it persists: rate limiting, identity/capability check, the per-wallet policy_gate (action strategy_create, plus venue on the policy gate's venue check when explicitly named), USD-notional sizing against policy limits (derived as usd_per_level x grid_levels, the grid's total notional), an idempotency check, and the platform kill switch. A wallet without a Turnkey signing key still gets the strategy -- each due tick returns an unsigned transaction for the owner to sign instead of executing autonomously.

Pauses new rungs in a trending (bull/bear) regime and closes the ladder in a bear (stop the bleed); tightens spacing in range, widens when volatile -- read directly, not exposed as direction params. A Tier B (venue-custodied) venue refuses the write unless acknowledge_tier_b=true after reviewing its custody_disclosure (check first via get_venue_status). Full lifecycle -- open, monitor, funding, close, two-phase signing, post-trade verification: Perps playbook.

Lifecycle

Every strategy type shares one lifecycle surface once created:

  • strategy_status(strategy_id, wallet_address) -- config, state, P&L, next tick.
  • strategy_modify(strategy_id, wallet_address, config_updates=..., risk=..., ...) -- retune in place without losing execution history; fields that define WHAT the strategy trades (target_token / source_token / tracked_wallet / venue / a composite definition) are immutable and refused -- cancel and create a new strategy to change those.
  • strategy_pause / strategy_resume -- manual pause and re-enable.
  • strategy_cancel(strategy_id, wallet_address) -- stop for good (terminal).
  • strategy_list(wallet_address, detail="concise"|"full") -- every strategy the wallet owns.

Full param docs for all six lifecycle tools: MCP tool reference.

See also