summaryrefslogtreecommitdiff
path: root/nodejs/automation/trading.ts
diff options
context:
space:
mode:
authorJulien Dessaux2025-02-18 00:18:16 +0100
committerJulien Dessaux2025-02-18 00:18:16 +0100
commitfd06283b8dcb79fff962367ac7a2370370a8a8f8 (patch)
tree8f3f54b9c27def19f9e2aedf7d29cba32ce58d4d /nodejs/automation/trading.ts
parent[golang] implement sending the starting probe to a shipyard that sells other ... (diff)
downloadspacetraders-fd06283b8dcb79fff962367ac7a2370370a8a8f8.tar.gz
spacetraders-fd06283b8dcb79fff962367ac7a2370370a8a8f8.tar.bz2
spacetraders-fd06283b8dcb79fff962367ac7a2370370a8a8f8.zip
[node] dependencies update and commit old files
Diffstat (limited to 'nodejs/automation/trading.ts')
-rw-r--r--nodejs/automation/trading.ts63
1 files changed, 63 insertions, 0 deletions
diff --git a/nodejs/automation/trading.ts b/nodejs/automation/trading.ts
new file mode 100644
index 0000000..897bd46
--- /dev/null
+++ b/nodejs/automation/trading.ts
@@ -0,0 +1,63 @@
+//import events from 'events';
+//
+//const bus = new events.EventEmitter();
+
+import { debugLog } from '../lib/api.ts';
+import { Ship } from '../lib/ships.ts';
+import { market, trait, waypoint } from '../lib/systems.ts';
+import { Waypoint } from '../lib/types.ts';
+import {
+ distance,
+ sortByDistanceFrom,
+ sortByPrice,
+ whatCanBeTradedAt,
+} from '../lib/utils.ts';
+
+async function navigate_to_nearest_exporting_waypoint(ship: Ship): Promise<void> {
+ const shipWaypoint = await waypoint(ship.nav.waypointSymbol);
+ const marketplaceWaypoints = await trait(ship.nav.systemSymbol, 'MARKETPLACE');
+ const candidates: Array<Waypoint> = [];
+ for (const w of marketplaceWaypoints) {
+ const marketplaceData = await market(w);
+ if (!marketplaceData.exports) continue;
+ candidates.push(w);
+ }
+ const next = sortByDistanceFrom(shipWaypoint, candidates)[0].data;
+ await ship.navigate(next);
+}
+
+export async function run(ship: Ship): Promise<void> {
+ while (true) {
+ const shipWaypoint = await waypoint(ship.nav.waypointSymbol);
+ const marketplaceData = await market(shipWaypoint);
+ if (marketplaceData.exports.length === 0) {
+ await navigate_to_nearest_exporting_waypoint(ship);
+ continue;
+ }
+ const marketplaceWaypoints = await trait(ship.nav.systemSymbol, 'MARKETPLACE');
+ const candidates: Array<{price: number, tradeVolume: number, symbol: string, waypoint: Waypoint}> = [];
+ for (const w of marketplaceWaypoints) {
+ const data = await market(w);
+ const trades = marketplaceData.exports.filter(g => data.imports.some(h => g.symbol === h.symbol));
+ if (!trades) continue;
+ const exports = marketplaceData.tradeGoods.filter(g => trades.some(h => g.symbol === h.symbol));
+ const imports = data.tradeGoods.filter(g => trades.some(h => g.symbol === h.symbol));
+ for (const e of exports) {
+ const i = imports.filter(g => g.symbol === e.symbol)[0];
+ const price = i.sellPrice - e.purchasePrice - distance(w, shipWaypoint);
+ candidates.push({price: price, tradeVolume: e.tradeVolume, symbol: e.symbol, waypoint: w});
+ debugLog({distance: distance(w, shipWaypoint), purchasePrice: e.purchasePrice, sellPrice: i.sellPrice, tradeVolume: e.tradeVolume, symbol: e.symbol, waypoint: w});
+ }
+ }
+ sortByPrice(candidates);
+ debugLog(candidates[0]);
+ throw "STOP";
+ while(!ship.isFull()) {
+ await ship.purchase(candidates[0].symbol, Math.min(candidates[0].tradeVolume, ship.cargo.capacity - ship.cargo.units));
+ }
+ await ship.navigate(candidates[0].waypoint);
+ while (!ship.isEmpty()) {
+ await ship.sell(candidates[0].symbol, Math.min(candidates[0].tradeVolume, ship.cargo.inventory.filter(i => i.symbol === candidates[0].symbol)[0].units));
+ }
+ }
+}