Skip to content

Strategy Examples

This page gives copy-pasteable examples for project strategies.

Example 1: Scaffolded Momentum Strategy

This is the pattern generated by neleus new:

from neleus import OrderSide, Strategy, StrategyContext, Bar


class MomentumStrategy(Strategy):
    def __init__(self, lookback: int = 20):
        super().__init__("momentum")
        self.lookback = lookback
        self.prices: list[float] = []

    def on_bar(self, ctx: StrategyContext, bar: Bar) -> None:
        self.prices.append(float(bar.close))
        if len(self.prices) < self.lookback:
            return

        window = self.prices[-self.lookback:]
        baseline = sum(window[:-1]) / max(len(window) - 1, 1)
        if bar.close > baseline * 1.01:
            ctx.market_order(bar.instrument_id, OrderSide.Buy, 0.01)

Use it with:

neleus backtest --strategy momentum
neleus run --mode once --strategy momentum

Example 2: Long-Only Pullback Strategy

from neleus import Bar, OrderSide, Strategy, StrategyContext


class PullbackLongStrategy(Strategy):
    def __init__(self, lookback: int = 25, pullback_pct: float = 0.015):
        super().__init__("pullback_long")
        self.lookback = lookback
        self.pullback_pct = pullback_pct
        self.prices: list[float] = []
        self.in_position = False

    def on_bar(self, ctx: StrategyContext, bar: Bar) -> None:
        close = float(bar.close)
        self.prices.append(close)

        if len(self.prices) < self.lookback:
            return

        moving_average = sum(self.prices[-self.lookback:]) / self.lookback
        drawdown_from_average = (close / moving_average) - 1.0

        if not self.in_position and drawdown_from_average <= -self.pullback_pct:
            ctx.market_order(bar.instrument_id, OrderSide.Buy, 0.01)
            self.in_position = True
            return

        if self.in_position and close >= moving_average:
            ctx.market_order(bar.instrument_id, OrderSide.Sell, 0.01, reduce_only=True)
            self.in_position = False

Example 3: Parameterized Strategy With Backtest Config

Strategy file:

from neleus import Bar, OrderSide, Strategy, StrategyContext


class SlowMomentumStrategy(Strategy):
    def __init__(self, lookback: int = 40, trigger_pct: float = 0.01):
        super().__init__("slow_momentum")
        self.lookback = lookback
        self.trigger_pct = trigger_pct
        self.prices: list[float] = []

    def on_bar(self, ctx: StrategyContext, bar: Bar) -> None:
        close = float(bar.close)
        self.prices.append(close)
        if len(self.prices) < self.lookback:
            return

        average = sum(self.prices[-self.lookback:]) / self.lookback
        if close >= average * (1.0 + self.trigger_pct):
            ctx.market_order(bar.instrument_id, OrderSide.Buy, 0.01)

Config file at configs/slow_momentum.yaml:

strategy:
  enabled: true
  class: SlowMomentumStrategy
  parameters:
    lookback: 50
    trigger_pct: 0.008

Run:

neleus backtest --strategy slow_momentum

Example 4: Add A New Strategy With The CLI

neleus strategy new breakout

Then edit strategies/breakout.py, inspect it:

neleus strategy show breakout

And run it:

neleus backtest --strategy breakout
neleus run --mode once --strategy breakout

Suggested Development Loop

  1. Start from the scaffolded momentum.py
  2. Rename or create a new strategy with neleus strategy new
  3. Keep constructor parameters optional
  4. Backtest repeatedly
  5. Run once against recent data
  6. Move to daemon mode only after the bar-driven logic looks correct