pinets-cli
Run Pine Script indicators from the command line
Quick Start • Usage • Options • Examples • Full Docs
pinets-cli is a command-line interface for PineTS, the open-source Pine Script transpiler and runtime. It lets you execute TradingView Pine Script indicators directly from your terminal, with live market data or custom JSON datasets.
pinets run rsi.pine --symbol BTCUSDT --timeframe 60No code to write. No project to set up. Just point it at a .pine file and go.
npm install -g pinets-cliOr run directly without installing:
npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60Create a file called sma_cross.pine:
//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)
Run it:
pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.
pinets run [options] [file]
The run command executes a Pine Script indicator and outputs the results as JSON.
Provide the indicator as a file argument or via piped stdin:
# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDTChoose between live market data or a local JSON file:
# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json| Option | Short | Description | Default |
|---|---|---|---|
--symbol <ticker> |
-s |
Symbol to query (e.g., BTCUSDT, ETHUSDT.P) |
— |
--timeframe <tf> |
-t |
Timeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M |
60 |
--data <path> |
-d |
Path to a JSON data file (alternative to --symbol) |
— |
| Option | Short | Description | Default |
|---|---|---|---|
--output <path> |
-o |
Write output to a file instead of stdout | stdout |
--format <type> |
-f |
Output format: default or full |
default |
--pretty |
— | Force pretty-printed JSON | auto |
--clean |
— | Filter out null, false, and empty values from plots | — |
--plots <names> |
— | Comma-separated list of plot names to include | all plots |
| Option | Short | Description | Default |
|---|---|---|---|
--candles <count> |
-n |
Number of candles in the output | 500 |
--warmup <count> |
-w |
Extra candles for indicator warmup (not included in output) | 0 |
| Option | Short | Description |
|---|---|---|
--debug |
— | Show the transpiled code (for debugging) |
--quiet |
-q |
Suppress all informational messages |
--version |
-v |
Show version number |
--help |
-h |
Show help |
pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:
# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'
# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --prettycat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60pinets run rsi.pine --symbol BTCUSDT --format full --prettypinets run my_indicator.pine --symbol BTCUSDT --debugFor indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:
# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --cleanWhen you only need specific plots from an indicator:
# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"
# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'Contains the indicator metadata and all plot data:
{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}Everything in default, plus the raw execution result and market data:
{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}When using --data, provide a JSON file with an array of candle objects:
[
{
"openTime": 1704067200000,
"open": 42000.50,
"high": 42500.00,
"low": 41800.00,
"close": 42300.00,
"volume": 1234.56,
"closeTime": 1704070799999
}
]Required fields: open, high, low, close, volume
Recommended fields: openTime, closeTime (millisecond timestamps)
pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:
- The Pine Script file is read and passed to the PineTS transpiler
- Market data is fetched from Binance (or loaded from your JSON file)
- The indicator is executed bar-by-bar with full time-series semantics
- Plot data is collected and output as structured JSON
There are no runtime dependencies. The single bundled file includes everything needed.
| Value | Description |
|---|---|
1 |
1 minute |
3 |
3 minutes |
5 |
5 minutes |
15 |
15 minutes |
30 |
30 minutes |
60 |
1 hour |
120 |
2 hours |
240 |
4 hours |
1D or D |
1 day |
1W or W |
1 week |
1M or M |
1 month |
- PineTS : The underlying transpiler and runtime engine
- QFChart : Charting library optimized for PineTS visualization
Contributions are welcome! Please feel free to open issues or submit pull requests.
AGPL-3.0 - See LICENSE for details.
Built with PineTS by QuantForge