Skip to content

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

hooks/lifecycle
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.

See also