@senpi/trading-recipe 1.0.40 → 1.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/position-tracker/position-tracker.action.d.ts +14 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -0
- package/dist/actions/position-tracker/position-tracker.action.js +199 -0
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -0
- package/dist/runtime/action-registry.d.ts.map +1 -1
- package/dist/runtime/action-registry.js +2 -0
- package/dist/runtime/action-registry.js.map +1 -1
- package/dist/types/hooks.d.ts +2 -0
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Action, ActionConfig, ActionFactory, ActionManifest, ActionResult, HookEvent } from '../types.js';
|
|
2
|
+
import type { RuntimeContext } from '../../types/runtime.js';
|
|
3
|
+
export declare class PositionTrackerAction implements Action {
|
|
4
|
+
private context;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly actionType: "POSITION_TRACKER";
|
|
7
|
+
constructor(config: ActionConfig, context: RuntimeContext);
|
|
8
|
+
handle(event: HookEvent): Promise<ActionResult>;
|
|
9
|
+
private extractSignals;
|
|
10
|
+
private skip;
|
|
11
|
+
}
|
|
12
|
+
export declare const positionTrackerFactory: ActionFactory;
|
|
13
|
+
export declare const positionTrackerManifest: ActionManifest;
|
|
14
|
+
//# sourceMappingURL=position-tracker.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-tracker.action.d.ts","sourceRoot":"","sources":["../../../src/actions/position-tracker/position-tracker.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EAGV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAsJ7D,qBAAa,qBAAsB,YAAW,MAAM;IAMhD,OAAO,CAAC,OAAO;IALjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAG,kBAAkB,CAAU;gBAGhD,MAAM,EAAE,YAAY,EACZ,OAAO,EAAE,cAAc;IAK3B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IA+DrD,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,IAAI;CAGb;AAID,eAAO,MAAM,sBAAsB,EAAE,aACO,CAAC;AAE7C,eAAO,MAAM,uBAAuB,EAAE,cAYrC,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { HOOK_EVENT } from '../../types/hooks.js';
|
|
2
|
+
import { createLogger } from '../../utils/logger.js';
|
|
3
|
+
const logger = createLogger('[actions][position-tracker]');
|
|
4
|
+
// ─── Pure helpers ────────────────────────────────────────────────────────────
|
|
5
|
+
/** Normalize dex: "main" → undefined (DSL convention). */
|
|
6
|
+
function normalizeDex(dex) {
|
|
7
|
+
if (!dex || dex === 'main')
|
|
8
|
+
return undefined;
|
|
9
|
+
return dex;
|
|
10
|
+
}
|
|
11
|
+
/** Signed size string: positive for LONG, negative for SHORT. */
|
|
12
|
+
function signedSize(snapshot) {
|
|
13
|
+
return String(snapshot.direction === 'SHORT' ? -snapshot.size : snapshot.size);
|
|
14
|
+
}
|
|
15
|
+
/** Optionally include dex in event data only when present. */
|
|
16
|
+
function dexField(dex) {
|
|
17
|
+
const normalized = normalizeDex(dex);
|
|
18
|
+
return normalized != null ? { dex: normalized } : {};
|
|
19
|
+
}
|
|
20
|
+
function mapPositionOpened(meta, address) {
|
|
21
|
+
const { current } = meta;
|
|
22
|
+
if (!current)
|
|
23
|
+
return null;
|
|
24
|
+
return {
|
|
25
|
+
type: HOOK_EVENT.ON_POSITION_OPENED,
|
|
26
|
+
data: {
|
|
27
|
+
asset: current.asset,
|
|
28
|
+
direction: current.direction,
|
|
29
|
+
entryPrice: current.entryPrice,
|
|
30
|
+
size: current.size,
|
|
31
|
+
leverage: current.leverage,
|
|
32
|
+
wallet: address,
|
|
33
|
+
...dexField(current.dex),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function mapPositionClosed(meta, address) {
|
|
38
|
+
const { previous } = meta;
|
|
39
|
+
if (!previous)
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
type: HOOK_EVENT.ON_POSITION_CLOSED,
|
|
43
|
+
data: {
|
|
44
|
+
asset: previous.asset,
|
|
45
|
+
wallet: address,
|
|
46
|
+
reason: 'position_tracker',
|
|
47
|
+
closeReason: 'POSITION_CLOSED',
|
|
48
|
+
...dexField(previous.dex),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function mapPositionFlipped(meta, address) {
|
|
53
|
+
const { previous, current } = meta;
|
|
54
|
+
if (!previous || !current)
|
|
55
|
+
return null;
|
|
56
|
+
return {
|
|
57
|
+
type: HOOK_EVENT.ON_POSITION_FLIPPED,
|
|
58
|
+
data: {
|
|
59
|
+
asset: previous.asset,
|
|
60
|
+
coin: current.asset,
|
|
61
|
+
szi: signedSize(current),
|
|
62
|
+
entryPx: String(current.entryPrice),
|
|
63
|
+
wallet: address,
|
|
64
|
+
leverage: current.leverage,
|
|
65
|
+
...dexField(current.dex),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Map a size-change delta (increased or decreased) to a hook event.
|
|
71
|
+
*
|
|
72
|
+
* Both snapshots are required so the DSL handler can compare previous vs
|
|
73
|
+
* current values and decide how to recalculate floors. The data shape is
|
|
74
|
+
* intentionally explicit about what changed: `previousEntryPrice`,
|
|
75
|
+
* `previousSize`, and `sizeDelta` let the handler avoid re-diffing.
|
|
76
|
+
*/
|
|
77
|
+
function mapPositionSizeChanged(hookType, meta, address) {
|
|
78
|
+
const { previous, current } = meta;
|
|
79
|
+
if (!previous || !current)
|
|
80
|
+
return null;
|
|
81
|
+
return {
|
|
82
|
+
type: hookType,
|
|
83
|
+
data: {
|
|
84
|
+
asset: current.asset,
|
|
85
|
+
direction: current.direction,
|
|
86
|
+
entryPrice: current.entryPrice,
|
|
87
|
+
size: current.size,
|
|
88
|
+
leverage: current.leverage,
|
|
89
|
+
wallet: address,
|
|
90
|
+
...dexField(current.dex),
|
|
91
|
+
previousEntryPrice: previous.entryPrice,
|
|
92
|
+
previousSize: previous.size,
|
|
93
|
+
sizeDelta: current.size - previous.size,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function mapPositionIncreased(meta, address) {
|
|
98
|
+
return mapPositionSizeChanged(HOOK_EVENT.ON_POSITION_INCREASED, meta, address);
|
|
99
|
+
}
|
|
100
|
+
function mapPositionDecreased(meta, address) {
|
|
101
|
+
return mapPositionSizeChanged(HOOK_EVENT.ON_POSITION_DECREASED, meta, address);
|
|
102
|
+
}
|
|
103
|
+
/** Delta type → mapper lookup. Unsupported types are simply absent. */
|
|
104
|
+
const deltaMappers = {
|
|
105
|
+
POSITION_OPENED: mapPositionOpened,
|
|
106
|
+
POSITION_CLOSED: mapPositionClosed,
|
|
107
|
+
POSITION_FLIPPED: mapPositionFlipped,
|
|
108
|
+
POSITION_INCREASED: mapPositionIncreased,
|
|
109
|
+
POSITION_DECREASED: mapPositionDecreased,
|
|
110
|
+
};
|
|
111
|
+
// ─── Position Tracker Action ────────────────────────────────────────────────
|
|
112
|
+
export class PositionTrackerAction {
|
|
113
|
+
context;
|
|
114
|
+
name;
|
|
115
|
+
actionType = 'POSITION_TRACKER';
|
|
116
|
+
constructor(config, context) {
|
|
117
|
+
this.context = context;
|
|
118
|
+
this.name = config.name;
|
|
119
|
+
}
|
|
120
|
+
async handle(event) {
|
|
121
|
+
if (event.type !== HOOK_EVENT.ON_SIGNAL_DETECTED) {
|
|
122
|
+
return this.skip('invalid_event_type', 'Ignored: wrong event type');
|
|
123
|
+
}
|
|
124
|
+
const signals = this.extractSignals(event);
|
|
125
|
+
if (signals.length === 0) {
|
|
126
|
+
return this.skip('no_signals', 'No signals to process');
|
|
127
|
+
}
|
|
128
|
+
let firedCount = 0;
|
|
129
|
+
let skippedCount = 0;
|
|
130
|
+
let failedCount = 0;
|
|
131
|
+
for (const signal of signals) {
|
|
132
|
+
const mapper = deltaMappers[signal.signalType];
|
|
133
|
+
if (!mapper) {
|
|
134
|
+
logger.info('skipping unsupported delta type', { signalType: signal.signalType, asset: signal.asset });
|
|
135
|
+
skippedCount++;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const meta = signal.meta;
|
|
139
|
+
if (!meta) {
|
|
140
|
+
logger.warn('signal missing meta', { signalType: signal.signalType, asset: signal.asset });
|
|
141
|
+
skippedCount++;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const mapped = mapper(meta, event.address);
|
|
145
|
+
if (!mapped) {
|
|
146
|
+
logger.warn('signal missing required snapshot', { signalType: signal.signalType, asset: signal.asset });
|
|
147
|
+
skippedCount++;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
logger.info(`firing ${mapped.type}`, { asset: signal.asset });
|
|
152
|
+
await this.context.hookSystem.fire({
|
|
153
|
+
type: mapped.type,
|
|
154
|
+
tradingRecipeName: event.tradingRecipeName,
|
|
155
|
+
address: event.address,
|
|
156
|
+
data: mapped.data,
|
|
157
|
+
timestamp: new Date().toISOString(),
|
|
158
|
+
});
|
|
159
|
+
firedCount++;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
failedCount++;
|
|
163
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
164
|
+
logger.error('failed to fire hook event', { signalType: signal.signalType, asset: signal.asset, err: message });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const success = failedCount === 0;
|
|
168
|
+
return {
|
|
169
|
+
success,
|
|
170
|
+
action_type: this.actionType,
|
|
171
|
+
summary: `Tracked: ${firedCount} fired, ${skippedCount} skipped, ${failedCount} failed`,
|
|
172
|
+
data: { firedCount, skippedCount, failedCount },
|
|
173
|
+
...(failedCount > 0 ? { error: `${failedCount} hook event(s) failed to fire` } : {}),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
extractSignals(event) {
|
|
177
|
+
const scanResult = event.data?.scanResult;
|
|
178
|
+
return scanResult?.signals ?? [];
|
|
179
|
+
}
|
|
180
|
+
skip(reason, summary) {
|
|
181
|
+
return { success: true, action_type: this.actionType, summary, skipped: true, skipReason: reason };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ─── Factory & Manifest ─────────────────────────────────────────────────────
|
|
185
|
+
export const positionTrackerFactory = (config, context) => new PositionTrackerAction(config, context);
|
|
186
|
+
export const positionTrackerManifest = {
|
|
187
|
+
type: 'action/POSITION_TRACKER',
|
|
188
|
+
name: 'Position Tracker',
|
|
189
|
+
description: 'Translates strategy-monitor position deltas into DSL hook events',
|
|
190
|
+
eventsConsumed: [HOOK_EVENT.ON_SIGNAL_DETECTED],
|
|
191
|
+
eventsEmitted: [
|
|
192
|
+
HOOK_EVENT.ON_POSITION_OPENED,
|
|
193
|
+
HOOK_EVENT.ON_POSITION_CLOSED,
|
|
194
|
+
HOOK_EVENT.ON_POSITION_FLIPPED,
|
|
195
|
+
HOOK_EVENT.ON_POSITION_INCREASED,
|
|
196
|
+
HOOK_EVENT.ON_POSITION_DECREASED,
|
|
197
|
+
],
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=position-tracker.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-tracker.action.js","sourceRoot":"","sources":["../../../src/actions/position-tracker/position-tracker.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/action-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/action-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAOrE,iBAAS,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAEtE;AAED,iBAAS,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAE9D;AAOD,eAAO,MAAM,cAAc;;;CAG1B,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { openPositionFactory } from "../actions/open-position/open-position.action.js";
|
|
5
5
|
import { closePositionFactory } from "../actions/close-position/close-position.action.js";
|
|
6
|
+
import { positionTrackerFactory } from "../actions/position-tracker/position-tracker.action.js";
|
|
6
7
|
const registry = new Map();
|
|
7
8
|
function register(actionType, factory) {
|
|
8
9
|
registry.set(actionType, factory);
|
|
@@ -13,6 +14,7 @@ function get(actionType) {
|
|
|
13
14
|
// Built-in registration
|
|
14
15
|
register("OPEN_POSITION", openPositionFactory);
|
|
15
16
|
register("CLOSE_POSITION", closePositionFactory);
|
|
17
|
+
register("POSITION_TRACKER", positionTrackerFactory);
|
|
16
18
|
export const ActionRegistry = {
|
|
17
19
|
register,
|
|
18
20
|
get,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/runtime/action-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/runtime/action-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAEhG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,SAAS,QAAQ,CAAC,UAAsB,EAAE,OAAsB;IAC9D,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,GAAG,CAAC,UAAsB;IACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,wBAAwB;AACxB,QAAQ,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;AAC/C,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;AACjD,QAAQ,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ;IACR,GAAG;CACJ,CAAC"}
|
package/dist/types/hooks.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export declare const HOOK_EVENT: {
|
|
|
4
4
|
readonly ON_POSITION_OPENED: "on_position_opened";
|
|
5
5
|
readonly ON_POSITION_CLOSED: "on_position_closed";
|
|
6
6
|
readonly ON_POSITION_FLIPPED: "on_position_flipped";
|
|
7
|
+
readonly ON_POSITION_INCREASED: "on_position_increased";
|
|
8
|
+
readonly ON_POSITION_DECREASED: "on_position_decreased";
|
|
7
9
|
readonly ON_TIER_CHANGED: "on_tier_changed";
|
|
8
10
|
readonly ON_DAILY_LIMIT_HIT: "on_daily_limit_hit";
|
|
9
11
|
readonly ON_DRAWDOWN_CAP_HIT: "on_drawdown_cap_hit";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,eAAO,MAAM,UAAU;;;;;;;;;;;;;CAab,CAAC;AAEX,MAAM,MAAM,aAAa,GACrB,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,GAC5C,MAAM,CAAC;AAEX,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClF"}
|
package/dist/types/hooks.js
CHANGED
|
@@ -5,6 +5,8 @@ export const HOOK_EVENT = {
|
|
|
5
5
|
ON_POSITION_OPENED: "on_position_opened",
|
|
6
6
|
ON_POSITION_CLOSED: "on_position_closed",
|
|
7
7
|
ON_POSITION_FLIPPED: "on_position_flipped",
|
|
8
|
+
ON_POSITION_INCREASED: "on_position_increased",
|
|
9
|
+
ON_POSITION_DECREASED: "on_position_decreased",
|
|
8
10
|
ON_TIER_CHANGED: "on_tier_changed",
|
|
9
11
|
ON_DAILY_LIMIT_HIT: "on_daily_limit_hit",
|
|
10
12
|
ON_DRAWDOWN_CAP_HIT: "on_drawdown_cap_hit",
|
package/dist/types/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,iFAAiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,qBAAqB,EAAE,uBAAuB;IAC9C,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;CAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,iFAAiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,qBAAqB,EAAE,uBAAuB;IAC9C,qBAAqB,EAAE,uBAAuB;IAC9C,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,qBAAqB,EAAE,uBAAuB;IAC9C,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;CAClB,CAAC"}
|
package/openclaw.plugin.json
CHANGED