diff --git "a/classes/types.ActionBase.html" "b/classes/types.ActionBase.html" --- "a/classes/types.ActionBase.html" +++ "b/classes/types.ActionBase.html" @@ -40,7 +40,7 @@ Extend this class to implement custom action handlers for:

// Redux state management example
class ReduxAction extends ActionBase {
constructor(
strategyName: StrategyName,
frameName: FrameName,
actionName: ActionName,
private store: Store
) {
super(strategyName, frameName, actionName);
}

signal(event: IStrategyTickResult) {
this.store.dispatch({
type: 'STRATEGY_SIGNAL',
payload: { event, strategyName: this.strategyName, frameName: this.frameName }
});
}

partialProfit(event: PartialProfitContract) {
this.store.dispatch({
type: 'PARTIAL_PROFIT',
payload: { event, strategyName: this.strategyName }
});
}
}
-

Implements

Constructors

Implements

Constructors

Properties

actionName backtest frameName @@ -62,7 +62,7 @@ Extend this class to implement custom action handlers for:

  • frameName: string

    Timeframe identifier this action is attached to

  • actionName: string

    Action identifier

  • backtest: boolean

    If running in backtest

    -
  • Returns ActionBase

    Properties

    actionName: string
    backtest: boolean
    frameName: string
    strategyName: string

    Methods

    • Handles breakeven events when stop-loss is moved to entry price.

      +

    Returns ActionBase

    Properties

    actionName: string
    backtest: boolean
    frameName: string
    strategyName: string

    Methods

    • Handles breakeven events when stop-loss is moved to entry price.

      Called once per signal when price moves far enough to cover fees and slippage. Breakeven threshold: (CC_PERCENT_SLIPPAGE + CC_PERCENT_FEE) * 2 + CC_BREAKEVEN_THRESHOLD

      Triggered by: ActionCoreService.breakevenAvailable() via BreakevenConnectionService @@ -73,7 +73,7 @@ Frequency: Once per signal when threshold reached

    • Optionalsource: string

    Returns void | Promise<void>

    async breakevenAvailable(event: BreakevenContract) {
    await this.telegram.send(
    `[${event.strategyName}] Breakeven reached! ` +
    `Signal: ${event.data.side} @ ${event.currentPrice}`
    );
    }
    -
    • Cleans up resources and subscriptions when action handler is disposed.

      +
    • Cleans up resources and subscriptions when action handler is disposed.

      Called once when strategy execution ends. Guaranteed to run exactly once via singleshot pattern.

      Override to:

      @@ -88,7 +88,7 @@ Guaranteed to run exactly once via singleshot pattern.

      Parameters

      • Optionalsource: string

      Returns void | Promise<void>

      async dispose() {
      super.dispose(); // Keep parent logging
      await this.db?.disconnect();
      await this.telegram?.close();
      await this.cache?.quit();
      console.log('Action disposed successfully');
      }
      -
    • Initializes the action handler.

      +
    • Initializes the action handler.

      Called once after construction. Override to perform async initialization:

      • Establish database connections
      • @@ -100,7 +100,7 @@ Guaranteed to run exactly once via singleshot pattern.

      Parameters

      • Optionalsource: string

      Returns void | Promise<void>

      async init() {
      super.init(); // Keep parent logging
      this.db = await connectToDatabase();
      this.telegram = new TelegramBot(process.env.TOKEN);
      }
      -
    • Handles partial loss level events (-10%, -20%, -30%, etc).

      +
    • Handles partial loss level events (-10%, -20%, -30%, etc).

      Called once per loss level per signal (deduplicated). Use to track loss milestones and implement risk management actions.

      Triggered by: ActionCoreService.partialLossAvailable() via PartialConnectionService @@ -111,7 +111,7 @@ Frequency: Once per loss level per signal

    • Optionalsource: string

    Returns void | Promise<void>

    async partialLossAvailable(event: PartialLossContract) {
    await this.telegram.send(
    `[${event.strategyName}] Loss ${event.level}% reached! ` +
    `Current price: ${event.currentPrice}`
    );
    // Optionally adjust risk management
    }
    -
    • Handles partial profit level events (10%, 20%, 30%, etc).

      +
    • Handles partial profit level events (10%, 20%, 30%, etc).

      Called once per profit level per signal (deduplicated). Use to track profit milestones and adjust position management.

      Triggered by: ActionCoreService.partialProfitAvailable() via PartialConnectionService @@ -122,7 +122,7 @@ Frequency: Once per profit level per signal

    • Optionalsource: string

    Returns void | Promise<void>

    async partialProfitAvailable(event: PartialProfitContract) {
    await this.telegram.send(
    `[${event.strategyName}] Profit ${event.level}% reached! ` +
    `Current price: ${event.currentPrice}`
    );
    // Optionally tighten stop-loss or take partial profit
    }
    -
    • Handles active ping events during active pending signal monitoring.

      +
    • Handles active ping events during active pending signal monitoring.

      Called every minute while a pending signal is active (position open). Use to monitor active positions and track lifecycle.

      Triggered by: ActionCoreService.pingActive() via StrategyConnectionService @@ -133,7 +133,7 @@ Frequency: Every minute while pending signal is active

    • Optionalsource: string

    Returns void | Promise<void>

    pingActive(event: ActivePingContract) {
    const holdTime = getTimestamp() - event.data.pendingAt;
    const holdMinutes = Math.floor(holdTime / 60000);
    console.log(`Active signal holding ${holdMinutes} minutes`);
    }
    -
    • Handles idle ping events when no signal is active.

      +
    • Handles idle ping events when no signal is active.

      Called every tick while no signal is pending or scheduled. Use to monitor idle strategy state and implement entry condition logic.

      Triggered by: ActionCoreService.pingIdle() via StrategyConnectionService @@ -141,7 +141,7 @@ Source: idlePingSubject.next() in CREATE_COMMIT_IDLE_PING_FN callback Frequency: Every tick while no signal is pending or scheduled

      Default implementation: Logs idle ping event.

      Parameters

      • event: IdlePingContract

        Idle ping data with symbol, strategy info, current price, timestamp

        -
      • Optionalsource: string

      Returns void | Promise<void>

    • Handles scheduled ping events during scheduled signal monitoring.

      +
    • Optionalsource: string

    Returns void | Promise<void>

    • Handles scheduled ping events during scheduled signal monitoring.

      Called every minute while a scheduled signal is waiting for activation. Use to monitor pending signals and track wait time.

      Triggered by: ActionCoreService.pingScheduled() via StrategyConnectionService @@ -152,7 +152,7 @@ Frequency: Every minute while scheduled signal is waiting

    • Optionalsource: string

    Returns void | Promise<void>

    pingScheduled(event: SchedulePingContract) {
    const waitTime = getTimestamp() - event.data.timestampScheduled;
    const waitMinutes = Math.floor(waitTime / 60000);
    console.log(`Scheduled signal waiting ${waitMinutes} minutes`);
    }
    -
    • Handles risk rejection events when signals fail risk validation.

      +
    • Handles risk rejection events when signals fail risk validation.

      Called only when signal is rejected (not emitted for allowed signals). Use to track rejected signals and analyze risk management effectiveness.

      Triggered by: ActionCoreService.riskRejection() via RiskConnectionService @@ -163,7 +163,7 @@ Frequency: Only when signal fails risk validation

    • Optionalsource: string

    Returns void | Promise<void>

    async riskRejection(event: RiskContract) {
    await this.telegram.send(
    `[${event.strategyName}] Signal rejected!\n` +
    `Reason: ${event.rejectionNote}\n` +
    `Active positions: ${event.activePositionCount}`
    );
    this.metrics.recordRejection(event.rejectionId);
    }
    -
    • Handles signal events from all modes (live + backtest).

      +
    • Handles signal events from all modes (live + backtest).

      Called every tick/candle when strategy is evaluated. Receives all signal states: idle, scheduled, opened, active, closed, cancelled.

      Triggered by: ActionCoreService.signal() via StrategyConnectionService @@ -174,7 +174,7 @@ Frequency: Every tick/candle

    • Optionalsource: string

    Returns void | Promise<void>

    signal(event: IStrategyTickResult) {
    if (event.action === 'opened') {
    console.log(`Signal opened: ${event.signal.side} at ${event.signal.priceOpen}`);
    }
    if (event.action === 'closed') {
    console.log(`Signal closed: PNL ${event.signal.revenue}%`);
    }
    }
    -
    • Handles signal events from backtest only.

      +
    • Handles signal events from backtest only.

      Called every candle in backtest mode. Use for actions specific to backtesting (e.g., collecting test metrics).

      Triggered by: ActionCoreService.signalBacktest() via StrategyConnectionService @@ -185,7 +185,7 @@ Frequency: Every candle in backtest mode

    • Optionalsource: string

    Returns void | Promise<void>

    signalBacktest(event: IStrategyTickResult) {
    if (event.action === 'closed') {
    this.backtestMetrics.recordTrade(event.signal);
    }
    }
    -
    • Handles signal events from live trading only.

      +
    • Handles signal events from live trading only.

      Called every tick in live mode. Use for actions that should only run in production (e.g., sending real notifications).

      Triggered by: ActionCoreService.signalLive() via StrategyConnectionService @@ -196,7 +196,7 @@ Frequency: Every tick in live mode

    • Optionalsource: string

    Returns void | Promise<void>

    async signalLive(event: IStrategyTickResult) {
    if (event.action === 'opened') {
    await this.telegram.send('Real trade opened!');
    await this.placeRealOrder(event.signal);
    }
    }
    -
    +