Smart Limit Orders¶
SMART_LIMIT orders are midpoint-chasing limit orders that walk the bid/ask spread using a timed ladder (Option Alpha “SmartPricing” parity). They are meant to model realistic execution without forcing market orders through wide option spreads.
Overview¶
Uses bid/ask to compute a midpoint and final price bound.
Walks from mid toward the bid/ask using preset step timing.
Cancels after the final hold window if unfilled.
If bid/ask is missing, SMART_LIMIT downgrades to a market order and emits a warning.
Presets (Option Alpha parity)¶
FAST: 3 price levels, 5 seconds per step
NORMAL: 4 price levels, 10 seconds per step
PATIENT: 5 price levels, 20 seconds per step
Final hold: 120 seconds
Backtesting behavior¶
SMART_LIMIT fills at mid + slippage for buys and mid - slippage for sells. This matches the standard midpoint fill approximation used by platforms like Option Alpha when only bar data is available.
If the SMART_LIMIT config does not specify slippage, backtests will fall back
to strategy-level defaults (buy_trading_slippages / sell_trading_slippages),
which accept TradingSlippage objects and default to zero when unset.
If bid/ask quotes are missing in a backtest, SMART_LIMIT downgrades to a market order fill (next-bar open).
Trade logs for backtests include a trade_slippage column (CSV) and show slippage
in trade marker tooltips (HTML).
Usage¶
from lumibot.entities import SmartLimitConfig, SmartLimitPreset
config = SmartLimitConfig(
preset=SmartLimitPreset.NORMAL,
slippage=0.05, # $0.05 from mid
)
order = self.create_order("SPY", 100, "buy", smart_limit=config)
self.submit_order(order)
Multi-leg orders¶
SMART_LIMIT supports multi-leg orders as a package (net bid/ask/mid). In backtests,
the package fills atomically at the net midpoint plus slippage. For multi-leg SMART_LIMIT
orders, build a parent Order with order_class=Order.OrderClass.MULTILEG and provide
the child leg orders on child_orders.