Install
openclaw skills install envyUse when the user asks about crypto indicators, trading signals, backtesting strategies, portfolio optimization, market analysis, starting/stopping the tradi...
openclaw skills install envyNon-custodial AI trading agent for crypto perpetual futures. Access 85M+ data points across technical, social, and chaos indicators for 40+ coins. Score signals, backtest strategies, assemble optimal signal sets via tournament, optimize portfolios by correlation, open signal packs, monitor live signals, manage positions with risk rules, and route trades to executors.
Three components in one skill:
On first use, install dependencies:
cd {baseDir} && npm install
The CLI auto-creates and manages these directories:
{baseDir}/
signals/ ← raw signals from packs, check, check-inline
strategies/ ← assembled strategies, ready for the monitor
archive/ ← old strategies (auto-archived when overwritten)
pack → auto-saves to signals/{coin}_pack_{type}_{timestamp}.yamlcheck / check-inline → auto-saves scored signals to signals/{coin}_{name}.yamlassemble → auto-saves to strategies/{coin}.yaml (archives old version if exists)strategies/The CLI supports two auth methods:
cd {baseDir} && node envy.js status
cd {baseDir} && node envy.js balance
If no API key is set, guide the user to get one:
cd {baseDir} && node envy.js subscribe (needs $29.99 USDC in wallet → 30 days + 100 credits)cd {baseDir} && node envy.js referral-redeem --wallet 0xUSER_WALLET --code REFCODE (free 14 days + 50 credits)cd {baseDir} && node envy.js set-key nva_...node envy.js balance — SAFE to run in chat. Only outputs the public address and USDC balance. Use this to get the wallet address for referral redemption and other operations.
node envy.js wallet — NEVER run in chat. Outputs the mnemonic and private key. Always tell the user to run this in their own terminal.
cd {baseDir} && node envy.js discover # API documentation
cd {baseDir} && node envy.js pricing # Per-endpoint pricing
cd {baseDir} && node envy.js coins # Available coins
cd {baseDir} && node envy.js indicators # All indicators
cd {baseDir} && node envy.js indicators --category Technical
cd {baseDir} && node envy.js cache-status # Data cache readiness
cd {baseDir} && node envy.js packs-info --coin BTC
cd {baseDir} && node envy.js leaderboard --limit 20
cd {baseDir} && node envy.js referral --wallet 0xUSER_WALLET
cd {baseDir} && node envy.js referral-stats --wallet 0xUSER_WALLET
cd {baseDir} && node envy.js snapshot --coins BTC,ETH,SOL
cd {baseDir} && node envy.js snapshot --coins BTC --indicators RSI_3H30M,ADX_3H30M,CMO_3H30M
cd {baseDir} && node envy.js history --coin BTC --hours 24
cd {baseDir} && node envy.js history --coin ETH --indicators RSI_3H30M,MACD_6H30M_N --hours 12 --page 1 --pageSize 10
cd {baseDir} && node envy.js check-inline --coin BTC --name MY_SIG --type LONG --expr "RSI_3H30M <= 30 AND ADX_3H30M >= 25" --exit "RSI_3H30M >= 70" --hold 48
cd {baseDir} && node envy.js check --coin BTC --yaml signal.yaml
YAML file format for check:
coin: BTC
signals:
- name: MY_SIGNAL
signal_type: LONG
expression: "RSI_3H30M <= 30 AND ADX_3H30M >= 25"
exit_expression: "RSI_3H30M >= 70"
max_hold_hours: 48
source: openclaw_agent
cd {baseDir} && node envy.js pack --coin BTC --type common
cd {baseDir} && node envy.js pack --coin BTC --type rare
cd {baseDir} && node envy.js pack --coin BTC --type legendary
cd {baseDir} && node envy.js backtest --yaml strategy.yaml --days 90
cd {baseDir} && node envy.js assemble --yaml signals.yaml --mode normal --max 10
Modes: conservative (1x, 15% SL), normal (1x, 30% SL), aggressive (2x, 50% SL).
cd {baseDir} && node envy.js portfolio --existing BTC,SOL --count 5 --mode normal --allocation fixed
cd {baseDir} && node envy.js list-signals
cd {baseDir} && node envy.js list-strategies
cd {baseDir} && node envy.js list-archive
cd {baseDir} && node envy.js status
cd {baseDir} && node envy.js buy-credits --amount 10
Quick analysis: RSI_3H30M (0-100, overbought>70, oversold<30), ADX_3H30M (trend strength, >25 strong), CMO_3H30M (momentum -100 to +100), BB_POSITION_15M (0=lower band, 1=upper), CLOUD_POSITION_15M (1=above cloud, -1=below).
Normalized (cross-coin comparable, _N suffix): EMA_3H_N, MACD_6H30M_N, BB_UPPER_5H_N, BB_LOWER_5H_N.
Social/Sentiment: XONE_A_NET (analyst), XONE_I_NET (influencer), XONE_A_U_DIV (contrarian divergence), XONE_SPREAD (disagreement).
Chaos: HURST_48H (mean-reversion vs trending), LYAPUNOV_48H (system instability).
Combine indicator codes with AND/OR:
RSI_3H30M <= 30 AND ADX_3H30M >= 25
RSI_3H30M >= 70 OR CMO_3H30M <= -20
Fetch codes from node envy.js indicators.
IMPORTANT: Never execute node envy.js wallet in chat. The output contains the mnemonic and private key — these must not appear in chat history/logs.
node envy.js balance is safe to run in chat — it only shows the public address and USDC balance.
When the user asks for their mnemonic, private key, seed phrase, wants to import to MetaMask, connect their wallet, or anything wallet-related:
cd {baseDir} && node envy.js wallet
https://arb1.arbitrum.io/rpc, chainId: 42161, symbol: ETH, explorer: https://arbiscan.io)0xaf88d065e77c8cC2239327C5EDb3A432268e5831Connects to the Envy real-time indicator WebSocket, evaluates signal expressions for multiple coins/strategies every 15 seconds, and emits events on state transitions. Single WebSocket connection, up to 10 coins. Auto-discovers strategies from strategies/ — zero configuration needed.
# Zero-config — auto-discovers strategies from strategies/ folder
cd {baseDir} && node monitor.js
# Explicit single strategy
cd {baseDir} && node monitor.js --strategy path/to/btc_strategy.yaml
# Multiple strategies
cd {baseDir} && node monitor.js --strategy btc.yaml --strategy eth.yaml --strategy sol.yaml
# Load all strategies from a specific folder
cd {baseDir} && node monitor.js --strategies ./my_strategies/
# Quiet mode — only JSON on stdout (for piping to Controller)
cd {baseDir} && node monitor.js --quiet
Three event types, each a single JSON line:
ENTRY — entry expression just became true:
{"event":"ENTRY","coin":"BTC","direction":"LONG","signal":"RSI_OVERSOLD_TREND","priority":1,"maxHoldHours":48,"timestamp":"...","indicators":{"RSI_3H30M":28.4,"ADX_3H30M":31.2}}
ENTRY_END — entry expression was true, just became false:
{"event":"ENTRY_END","coin":"BTC","direction":"LONG","signal":"RSI_OVERSOLD_TREND","priority":1,"timestamp":"...","indicators":{"RSI_3H30M":35.1,"ADX_3H30M":22.0}}
EXIT — exit expression just became true:
{"event":"EXIT","coin":"BTC","direction":"LONG","signal":"RSI_OVERSOLD_TREND","priority":1,"timestamp":"...","indicators":{"RSI_3H30M":71.2,"ADX_3H30M":28.5}}
ENTRY — condition fires → Controller decides whether to open a positionEXIT — explicit exit condition met → Controller closes positionENTRY_END — entry condition lost → Controller decides: hold or bail?The monitor does NOT track positions. It just reports what's true and what changed. The Controller owns all that logic.
Receives signals from the monitor, manages positions, enforces risk rules, and routes trade commands to an executor. Spawns the monitor automatically — one command starts the full pipeline.
# Start the full pipeline (spawns monitor, processes signals, routes trades)
cd {baseDir} && node controller.js
# Check current positions and P&L without starting
cd {baseDir} && node controller.js --status
# Reset all positions, P&L, and trade history
cd {baseDir} && node controller.js --reset
# Help
cd {baseDir} && node controller.js --help
On first run, a default controller.yaml config is created. Edit it to configure risk rules, executor, and allocations.
executor: paper # paper | hyperliquid | auto
confirm: false # true = ask before trading (not yet implemented)
risk:
reserve_pct: 20 # % of balance to keep as cash reserve
max_positions: 3 # max concurrent open positions across all coins
max_daily_loss_pct: 5 # stop trading for the day if daily loss exceeds this %
max_hold_hours: 48 # force close if position held longer
entry_end_action: hold # hold | close — what to do when entry signal lost
allocations:
BTC: 40
ETH: 35
SOL: 25
wallet.json — no env vars needed.The controller automatically reads the wallet from wallet.json (created by node envy.js balance). This is the same wallet used for Envy subscription payments. No separate Hyperliquid wallet or environment variables needed.
To go live:
npx clawhub@latest install hyperliquidnode envy.js wallet in your terminalexecutor: hyperliquid in controller.yamlOr just tell the agent: "Switch to live trading on Hyperliquid" — it will update the config and restart for you (after confirming).
entry_end_action config → hold or closenode envy.js status before expensive operations. Warn if credits are low.list-signals, list-strategies, list-archive to show what's stored.controller.yaml is configured.wallet.json automatically.node envy.js balance is safe to run in chat (public address only). node envy.js wallet must NEVER be run in chat (contains private key). Use balance freely for referral redemption and address lookups.node envy.js statusnode envy.js pack --coin BTC --type common (auto-saved to signals/)node envy.js check-inline --coin BTC --name X --type LONG --expr "..." --exit "..." --hold 48 (auto-saved to signals/)node envy.js assemble --yaml signals/btc_pack_common_*.yaml --mode normal (auto-saved to strategies/)node envy.js backtest --yaml strategies/btc.yaml --days 90node envy.js portfolio --existing BTC,SOL --count 5node controller.js (spawns monitor, processes signals, routes to executor)node controller.js --statusexecutor: hyperliquid, restart