Run Pine Script indicators from the command line using pinets-cli. Use when asked to execute, test, or analyze Pine Script indicators, calculate technical analysis values (RSI, SMA, EMA, MACD, etc.), or fetch market data for crypto trading pairs. This tool can run PineScript indicators from .pine files or stdin and output the resulting plots and variables data.
pinets is a CLI tool that executes TradingView Pine Script indicators via the PineTS runtime. It outputs structured JSON with calculated indicator values.
# Global install
npm install -g pinets-cli
# Or run directly with npx (no install needed)
npx pinets-cli run indicator.pine --symbol BTCUSDT -q
Verify (if installed globally):
pinets --version
When using npx, replace pinets with npx pinets-cli in all examples below.
pinets run [file] [options]
The indicator can be a file argument or piped from stdin.
| Flag | Description |
|---|---|
-s, --symbol <ticker> | Symbol from Binance (e.g., BTCUSDT, ETHUSDT, SOLUSDT.P for futures) |
-t, --timeframe <tf> | Candle timeframe: 1, 5, 15, 30, 60, 120, 240, 1D, 1W, 1M (default: 60) |
-d, --data <path> | JSON file with candle data (alternative to --symbol) |
| Flag | Description |
|---|---|
-o, --output <path> | Write to file instead of stdout |
-f, --format <type> | default (plots only) or full (plots + result + marketData) |
--pretty | Pretty-print JSON |
--clean | Filter out null, false, and empty values from plot data |
--plots <names> | Comma-separated list of plot names to include (default: all) |
-q, --quiet | Suppress info messages (essential when parsing stdout) |
| Flag | Description |
|---|---|
-n, --candles <N> | Number of output candles (default: 500) |
-w, --warmup <N> | Extra warmup candles excluded from output (default: 0) |
| Flag | Description |
|---|---|
--debug | Show transpiled JavaScript code (to stderr) |
pinets run indicator.pine --symbol BTCUSDT --timeframe 60 --candles 100 -q
# EMA 200 needs at least 200 bars to initialize
pinets run ema200.pine -s BTCUSDT -t 1D -n 100 -w 200 -q
echo '//@version=5
indicator("RSI")
plot(ta.rsi(close, 14), "RSI")' | pinets run -s BTCUSDT -t 60 -n 20 -q
pinets run indicator.pine --data candles.json --candles 50 -q
pinets run rsi.pine -s BTCUSDT -t 60 -o results.json -q
pinets run indicator.pine -s BTCUSDT -f full -q --pretty
# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 -q
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean -q
# Get only RSI, ignore bands
pinets run rsi_bands.pine -s BTCUSDT --plots "RSI" -q
# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" -q
# Combine both: only signals, only true values
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q
default format{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 58.23 },
{ "time": 1704070800000, "value": 61.45 }
]
}
}
}
full formatAdds result (raw return values per bar) and marketData (OHLCV candles) to the default output.
[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]
Required fields: open, high, low, close, volume. Recommended: openTime, closeTime.
pinets-cli accepts standard TradingView Pine Script v5+:
//@version=5
indicator("My Indicator", overlay=false)
// Technical analysis functions
rsi = ta.rsi(close, 14)
[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)
sma = ta.sma(close, 20)
ema = ta.ema(close, 9)
bb_upper = ta.sma(close, 20) + 2 * ta.stdev(close, 20)
// Output — each plot() creates a named entry in the JSON output
plot(rsi, "RSI", color=color.purple)
-q when parsing JSON output programmatically.NaN for the first N bars. Use --warmup to pre-feed the indicator.time values are Unix timestamps in milliseconds.| Indicator | Minimum warmup |
|---|---|
| SMA(N) / EMA(N) | N |
| RSI(14) | 30 |
| MACD(12,26,9) | 50 |
| Bollinger Bands(20) | 30 |
| SMA(200) | 200+ |
Rule of thumb: set warmup to 1.5x-2x the longest lookback period.