StrategyDefinition
StrategyDefinition
The configuration object you pass to defineStrategy(). It pins your strategy to a symbol and timeframe, declares its risk policy, optionally requests a window of marketHistory bars to warm up indicators, and supplies a setup function that registers indicators and inputs and returns the StrategyHooks that drive execution.
Signature
export interface StrategyDefinition { symbol: string; timeframe: Timeframe; risk: RiskConfig; marketHistory?: number; setup: (api: SetupApi) => StrategyHooks;}Example
import { defineStrategy } from '@nexpips/sdk-trading';
/** * Cycle de vie complet : tous les hooks optionnels et les contextes qu'ils * reçoivent — `InitContext` (init), `BarContext` (onBar), `TickContext` * (onTick), `EventContext` + `Fill` / `Rejection` / `ClosedPosition` (events). */export default defineStrategy({ symbol: 'EURUSD', timeframe: 'M5', risk: { maxRiskPercentPerTrade: 0.5, maxOpenPositions: 1, maxDailyLossPercent: 3, maxConsecutiveRejects: 5, }, setup: () => ({ init(ctx) { ctx.log.info('strategy started', { balance: ctx.account.balance, at: ctx.clock.now }); },
onBar(ctx) { if (ctx.position.isFlat && !ctx.position.hasPendingOrder) { ctx.order.marketBuy({ riskPercent: 0.5, stopLoss: { type: 'pips', value: 20 }, takeProfit: { type: 'rr', value: 2 }, }); } },
onTick(ctx) { const spread = ctx.ask - ctx.bid; if (spread > 0.0005) ctx.log.debug('wide spread', { spread }); },
onOrderFilled(ctx, fill) { ctx.log.info('filled', { side: fill.side, price: fill.price, size: fill.size }); },
onOrderRejected(ctx, rejection) { // rejection.reason est un RejectReason (union fermée). ctx.log.warn('order rejected', { reason: rejection.reason, message: rejection.message }); },
onPositionClosed(ctx, closed) { ctx.log.info('position closed', { pnl: closed.realizedPnl }); }, }),});A full strategy definition with every lifecycle hook.