Platform
Platform Limitations
Last updated April 20, 2026
Every quantitative platform has constraints, assumptions, and gaps between simulation and reality. This page documents them honestly. Understanding these limitations makes you a better user of the platform and a more careful strategy developer.
Why This Page Exists
It is easy to look at good backtest numbers and feel confident. It is harder to remember that those numbers were produced under assumptions that do not fully hold in live markets. Documenting the gaps is not a weakness — it is the only honest way to communicate what the platform can and cannot do.
Backtest Limitations
Fill price assumption
The backtest engine fills all orders at the bar close price. In reality, if your condition triggers mid-bar (e.g. an RSI threshold crossed during a 1h candle), you might fill at a significantly different price. Bar-close fills produce optimistic results for volatile markets.
No fees in paper-equivalent simulation
The backtest engine does not deduct exchange fees. Binance charges 0.1% per trade (or less with BNB discount). For strategies that trade frequently, the cumulative fee impact can be significant. Adjust your return expectations accordingly.
No slippage
MARKET orders in live trading fill at the best available price, which may differ from the bar close. For large orders on low-liquidity pairs, slippage can exceed the strategy's expected edge. The backtest has no slippage model.
Data range limits
Binance's public API limits how much historical data can be fetched per request. Norena enforces per-timeframe data caps to keep backtests manageable:
| Timeframe | Maximum range |
|---|---|
1m | 7 days |
5m | 30 days |
15m | 90 days |
30m | 180 days |
1h | ~1 year |
2h – 12h | ~2 years |
1d | ~5 years |
Longer backtests require switching to a slower timeframe. A 1h backtest covers one year; a 4h backtest covers four years. Short-timeframe strategies cannot be tested over multi-year periods.
Survivorship and look-ahead bias
All backtests use the actual historical data for the symbol — there is no survivorship bias (delisted coins cannot be tested because their data is unavailable on Binance). However, users who design a strategy after looking at the same data they backtest on are introducing look-ahead bias manually. Always use a portion of unseen data for final evaluation.
Single-symbol, single-position model
The backtest engine simulates one symbol at a time with one position at a time. It does not model portfolio-level allocation, correlation between symbols, or the capital constraints that arise from running multiple strategies simultaneously.
Paper Trading Limitations
Paper mode simulates trading against real live market data but with these important differences from live execution:
| Paper mode | Live mode |
|---|---|
| Fills at current mark price (last close) | Fills at Binance MARKET order price |
| Zero fees | Binance fees apply (0.1% or lower) |
| Zero slippage | Real market slippage applies |
| Infinite liquidity (any size) | Large orders may move the market |
| Instant fills | Subject to network latency and exchange processing |
Paper mode is valuable for verifying strategy logic but will overstate returns compared to live execution, especially for high-frequency strategies and large position sizes.
Live Trading Constraints
MARKET orders only
All live orders are Binance MARKET orders. There are no LIMIT orders, stop orders, or trailing stops at the exchange level. Take profit and stop loss logic runs in strategy code on the next scheduled tick — there is a delay between when the price crosses the threshold and when the order is placed.
Tick delay on exits
If the price gaps through your stop loss between ticks, the exit will fill at the next available mark price — not the stop level. For a project running every 5 minutes, a flash crash could move 10% between ticks with no exit triggered until the next tick. This is inherent to any scheduled execution model.
Binance API rate limits
Binance imposes rate limits on API calls. The runner performs a connectivity check before placing each live order, which consumes API weight. Heavy multi-symbol strategies running at high frequency may approach Binance's per-IP rate limits.
Exchange downtime
Binance maintenance windows and unexpected outages will prevent live orders from executing. The runner logs connectivity errors and falls back to paper mode for affected ticks. Missed exits during exchange downtime are possible.
Data Limitations
Binance-only data
All market data comes from Binance's public kline API. Strategies can only be run on symbols that are actively traded on Binance spot markets. Futures, options, and other exchanges are not supported.
Candle resolution
The minimum candle resolution is 1 minute. Tick-level or second-level data is not available. Strategies with logic that would benefit from sub-minute granularity cannot be implemented on this platform.
Live cache window
The live runner maintains 30 days of kline history by default (configurable). Very long-period indicators (e.g. a 200-day EMA) may be computed from incomplete data in live mode if the cache doesn't have enough history. This particularly affects slow timeframes like 1d after a symbol is first activated.
No fundamental or order book data
Only OHLCV (Open, High, Low, Close, Volume) candle data is available. There is no access to order book depth, funding rates, open interest, news feeds, or any non-price data sources.
Execution Constraints
5-second strategy timeout
Strategy code has a 5-second execution limit per tick, per symbol. Strategies that perform heavy computation (deeply nested loops, very large lookback periods) may time out. Keep strategy code simple and indicator lookbacks reasonable.
One position per symbol
Each project can hold at most one open position per symbol at a time. There is no pyramiding (adding to an existing position) or simultaneous long/short capability. If a BUY fires while already in a position, it is silently rejected.
2-second minimum tick resolution
The runner polls for due projects every 2 seconds. Even if a project has a 1-second interval configured, it will not execute more than once per 2-second cycle. The minimum effective execution frequency is approximately every 2 seconds.
Strategy Constraints
Blockly-only strategy authoring
Strategies are built visually in the Blockly editor. There is no raw code editor, no Python support, no SQL-based backtesting, and no way to import external libraries. The strategy API surface is fixed to the blocks and indicators available in the toolbox.
No persistent state between ticks
Each tick creates a fresh indicator context. The only cross-tick state available to strategies is the PREV() block (which maintains a rolling buffer of up to 50 values per call site) and the position state read from the database. Custom variables defined with Blockly's Variables blocks do not persist between ticks.
No custom indicator code
You cannot define custom indicator formulas. Strategies are limited to the indicators built into the platform: SMA, EMA, WMA, RSI, ATR, MACD, Bollinger Bands, VWAP, and the pattern/ event detection blocks. Custom math can be approximated using the Math blocks and Variables, but complex multi-step indicator calculations are not possible.