@quantform/core 0.5.23 → 0.6.4
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/LICENSE.md +21 -0
- package/dist/adapter/adapter-aggregate.d.ts +36 -1
- package/dist/adapter/adapter-aggregate.d.ts.map +1 -0
- package/dist/adapter/adapter-aggregate.js +110 -50
- package/dist/adapter/adapter.d.ts +25 -0
- package/dist/adapter/adapter.d.ts.map +1 -0
- package/dist/adapter/adapter.js +4 -1
- package/dist/adapter/backtester/backtester-adapter.d.ts +1 -0
- package/dist/adapter/backtester/backtester-adapter.d.ts.map +1 -0
- package/dist/adapter/backtester/backtester-adapter.js +26 -13
- package/dist/adapter/backtester/backtester-cursor.d.ts +2 -1
- package/dist/adapter/backtester/backtester-cursor.d.ts.map +1 -0
- package/dist/adapter/backtester/backtester-cursor.js +24 -14
- package/dist/adapter/backtester/backtester-streamer.d.ts +20 -1
- package/dist/adapter/backtester/backtester-streamer.d.ts.map +1 -0
- package/dist/adapter/backtester/backtester-streamer.js +54 -30
- package/dist/adapter/backtester/error.d.ts +3 -0
- package/dist/adapter/backtester/error.d.ts.map +1 -0
- package/dist/adapter/backtester/error.js +11 -0
- package/dist/adapter/backtester/index.d.ts +1 -0
- package/dist/adapter/backtester/index.d.ts.map +1 -0
- package/dist/adapter/backtester/index.js +0 -1
- package/dist/adapter/error.d.ts +2 -0
- package/dist/adapter/error.d.ts.map +1 -0
- package/dist/adapter/error.js +5 -2
- package/dist/adapter/index.d.ts +1 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +0 -1
- package/dist/adapter/paper/engine/paper-engine.d.ts +1 -0
- package/dist/adapter/paper/engine/paper-engine.d.ts.map +1 -0
- package/dist/adapter/paper/engine/paper-engine.js +18 -13
- package/dist/adapter/paper/index.d.ts +1 -0
- package/dist/adapter/paper/index.d.ts.map +1 -0
- package/dist/adapter/paper/index.js +0 -1
- package/dist/adapter/paper/paper-adapter.d.ts +4 -3
- package/dist/adapter/paper/paper-adapter.d.ts.map +1 -0
- package/dist/adapter/paper/paper-adapter.js +44 -21
- package/dist/cli/build.d.ts +1 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +18 -8
- package/dist/cli/dev.d.ts +1 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +52 -12
- package/dist/cli/error.d.ts +2 -0
- package/dist/cli/error.d.ts.map +1 -0
- package/dist/cli/error.js +7 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -10
- package/dist/cli/internal/workspace.d.ts +1 -7
- package/dist/cli/internal/workspace.d.ts.map +1 -0
- package/dist/cli/internal/workspace.js +1 -6
- package/dist/cli/pull.d.ts +1 -0
- package/dist/cli/pull.d.ts.map +1 -0
- package/dist/cli/pull.js +68 -38
- package/dist/cli/run.d.ts +2 -1
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +52 -14
- package/dist/cli/test.d.ts +2 -1
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +59 -34
- package/dist/domain/asset.d.ts +20 -0
- package/dist/domain/asset.d.ts.map +1 -0
- package/dist/domain/asset.js +19 -1
- package/dist/domain/{balance.operator.d.ts → balance-operator.d.ts} +1 -0
- package/dist/domain/balance-operator.d.ts.map +1 -0
- package/dist/domain/{balance.operator.js → balance-operator.js} +0 -1
- package/dist/domain/balance.d.ts +27 -3
- package/dist/domain/balance.d.ts.map +1 -0
- package/dist/domain/balance.js +31 -3
- package/dist/domain/{candle.operator.d.ts → candle-operator.d.ts} +1 -0
- package/dist/domain/candle-operator.d.ts.map +1 -0
- package/dist/domain/{candle.operator.js → candle-operator.js} +11 -5
- package/dist/domain/candle.d.ts +3 -2
- package/dist/domain/candle.d.ts.map +1 -0
- package/dist/domain/candle.js +0 -1
- package/dist/domain/commission.d.ts +2 -0
- package/dist/domain/commission.d.ts.map +1 -0
- package/dist/domain/commission.js +2 -1
- package/dist/domain/component.d.ts +1 -0
- package/dist/domain/component.d.ts.map +1 -0
- package/dist/domain/component.js +0 -1
- package/dist/domain/error.d.ts +4 -3
- package/dist/domain/error.d.ts.map +1 -0
- package/dist/domain/error.js +3 -4
- package/dist/domain/index.d.ts +9 -7
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +8 -8
- package/dist/domain/{instrument.operator.d.ts → instrument-operator.d.ts} +1 -0
- package/dist/domain/instrument-operator.d.ts.map +1 -0
- package/dist/domain/{instrument.operator.js → instrument-operator.js} +0 -1
- package/dist/domain/instrument.d.ts +9 -6
- package/dist/domain/instrument.d.ts.map +1 -0
- package/dist/domain/instrument.js +7 -3
- package/dist/domain/{order.operator.d.ts → order-operator.d.ts} +1 -0
- package/dist/domain/order-operator.d.ts.map +1 -0
- package/dist/domain/order-operator.js +16 -0
- package/dist/domain/order.d.ts +15 -20
- package/dist/domain/order.d.ts.map +1 -0
- package/dist/domain/order.js +16 -28
- package/dist/domain/{orderbook.operator.d.ts → orderbook-operator.d.ts} +1 -0
- package/dist/domain/orderbook-operator.d.ts.map +1 -0
- package/dist/domain/{orderbook.operator.js → orderbook-operator.js} +0 -1
- package/dist/domain/orderbook.d.ts +10 -6
- package/dist/domain/orderbook.d.ts.map +1 -0
- package/dist/domain/orderbook.js +7 -2
- package/dist/domain/{position.operator.d.ts → position-operator.d.ts} +4 -2
- package/dist/domain/position-operator.d.ts.map +1 -0
- package/dist/domain/{position.operator.js → position-operator.js} +10 -3
- package/dist/domain/position.d.ts +5 -4
- package/dist/domain/position.d.ts.map +1 -0
- package/dist/domain/position.js +2 -2
- package/dist/domain/session-builder.d.ts +54 -0
- package/dist/domain/session-builder.d.ts.map +1 -0
- package/dist/domain/session-builder.js +105 -0
- package/dist/domain/session.d.ts +54 -13
- package/dist/domain/session.d.ts.map +1 -0
- package/dist/domain/session.js +103 -39
- package/dist/domain/timeframe.d.ts +1 -0
- package/dist/domain/timeframe.d.ts.map +1 -0
- package/dist/domain/timeframe.js +0 -1
- package/dist/domain/{trade.operator.d.ts → trade-operator.d.ts} +1 -0
- package/dist/domain/trade-operator.d.ts.map +1 -0
- package/dist/domain/{trade.operator.js → trade-operator.js} +0 -1
- package/dist/domain/trade.d.ts +10 -5
- package/dist/domain/trade.d.ts.map +1 -0
- package/dist/domain/trade.js +8 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -3
- package/dist/shared/collections.d.ts +9 -6
- package/dist/shared/collections.d.ts.map +1 -0
- package/dist/shared/collections.js +21 -13
- package/dist/shared/datetime.d.ts +1 -0
- package/dist/shared/datetime.d.ts.map +1 -0
- package/dist/shared/datetime.js +0 -1
- package/dist/shared/decimals.d.ts +13 -0
- package/dist/shared/decimals.d.ts.map +1 -0
- package/dist/shared/decimals.js +12 -1
- package/dist/shared/environment.d.ts +3 -0
- package/dist/shared/environment.d.ts.map +1 -0
- package/dist/shared/environment.js +15 -0
- package/dist/shared/index.d.ts +2 -1
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +1 -2
- package/dist/shared/logger.d.ts +5 -7
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +24 -8
- package/dist/shared/pipe.d.ts +1 -0
- package/dist/shared/pipe.d.ts.map +1 -0
- package/dist/shared/pipe.js +0 -1
- package/dist/shared/policy.d.ts +1 -0
- package/dist/shared/policy.d.ts.map +1 -0
- package/dist/shared/policy.js +0 -1
- package/dist/storage/cache.d.ts +1 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +30 -19
- package/dist/storage/feed.d.ts +25 -0
- package/dist/storage/feed.d.ts.map +1 -0
- package/dist/storage/feed.js +56 -19
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +0 -1
- package/dist/storage/measurement.d.ts +20 -0
- package/dist/storage/measurement.d.ts.map +1 -0
- package/dist/storage/measurement.js +41 -10
- package/dist/storage/storage.d.ts +41 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +69 -33
- package/dist/store/error.d.ts +9 -0
- package/dist/store/error.d.ts.map +1 -0
- package/dist/store/error.js +31 -0
- package/dist/store/index.d.ts +8 -7
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +7 -8
- package/dist/store/{store-balance.event.d.ts → store-balance-event.d.ts} +14 -1
- package/dist/store/store-balance-event.d.ts.map +1 -0
- package/dist/store/{store-balance.event.js → store-balance-event.js} +54 -10
- package/dist/store/{store.event.d.ts → store-event.d.ts} +1 -0
- package/dist/store/store-event.d.ts.map +1 -0
- package/dist/store/{store.event.js → store-event.js} +0 -1
- package/dist/store/{store-instrument.event.d.ts → store-instrument-event.d.ts} +5 -4
- package/dist/store/store-instrument-event.d.ts.map +1 -0
- package/dist/store/{store-instrument.event.js → store-instrument-event.js} +13 -5
- package/dist/store/{store-order.event.d.ts → store-order-event.d.ts} +7 -2
- package/dist/store/store-order-event.d.ts.map +1 -0
- package/dist/store/{store-order.event.js → store-order-event.js} +24 -20
- package/dist/store/{store-orderbook.event.d.ts → store-orderbook-event.d.ts} +2 -1
- package/dist/store/store-orderbook-event.d.ts.map +1 -0
- package/dist/store/{store-orderbook.event.js → store-orderbook-event.js} +6 -5
- package/dist/store/{store-position.event.d.ts → store-position-event.d.ts} +3 -2
- package/dist/store/store-position-event.d.ts.map +1 -0
- package/dist/store/{store-position.event.js → store-position-event.js} +13 -6
- package/dist/store/store-state.d.ts +3 -2
- package/dist/store/store-state.d.ts.map +1 -0
- package/dist/store/store-state.js +1 -1
- package/dist/store/{store-trade.event.d.ts → store-trade-event.d.ts} +6 -1
- package/dist/store/store-trade-event.d.ts.map +1 -0
- package/dist/store/{store-trade.event.js → store-trade-event.js} +12 -3
- package/dist/store/store.d.ts +2 -1
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +0 -1
- package/dist/strategy.d.ts +8 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +44 -0
- package/jest.config.ts +13 -0
- package/package.json +19 -32
- package/src/adapter/adapter-aggregate.ts +41 -18
- package/src/adapter/backtester/backtester-adapter.ts +0 -2
- package/src/adapter/backtester/backtester-cursor.ts +2 -2
- package/src/adapter/backtester/backtester-streamer.spec.ts +5 -3
- package/src/adapter/backtester/backtester-streamer.ts +16 -8
- package/src/adapter/backtester/error.ts +7 -0
- package/src/adapter/error.ts +4 -0
- package/src/adapter/paper/engine/paper-engine.spec.ts +38 -21
- package/src/adapter/paper/engine/paper-engine.ts +44 -35
- package/src/adapter/paper/paper-adapter.ts +13 -4
- package/src/cli/build.ts +1 -1
- package/src/cli/dev.ts +15 -7
- package/src/cli/error.ts +5 -0
- package/src/cli/internal/workspace.ts +0 -11
- package/src/cli/pull.ts +22 -31
- package/src/cli/run.ts +14 -11
- package/src/cli/test.ts +24 -37
- package/src/domain/asset.ts +1 -1
- package/src/domain/{balance.operator.spec.ts → balance-operator.spec.ts} +4 -3
- package/src/domain/{balance.operator.ts → balance-operator.ts} +0 -0
- package/src/domain/balance.spec.ts +15 -12
- package/src/domain/balance.ts +7 -6
- package/src/domain/{candle.operator.spec.ts → candle-operator.spec.ts} +1 -1
- package/src/domain/{candle.operator.ts → candle-operator.ts} +21 -5
- package/src/domain/commission.ts +3 -1
- package/src/domain/error.ts +3 -3
- package/src/domain/index.ts +8 -7
- package/src/domain/{instrument.operator.spec.ts → instrument-operator.spec.ts} +9 -2
- package/src/domain/{instrument.operator.ts → instrument-operator.ts} +0 -0
- package/src/domain/instrument.spec.ts +8 -1
- package/src/domain/instrument.ts +11 -8
- package/src/domain/{order.operator.spec.ts → order-operator.spec.ts} +9 -6
- package/src/domain/{order.operator.ts → order-operator.ts} +2 -2
- package/src/domain/order.spec.ts +8 -9
- package/src/domain/order.ts +22 -52
- package/src/domain/{orderbook.operator.spec.ts → orderbook-operator.spec.ts} +15 -3
- package/src/domain/{orderbook.operator.ts → orderbook-operator.ts} +0 -0
- package/src/domain/orderbook.spec.ts +11 -2
- package/src/domain/orderbook.ts +10 -9
- package/src/domain/{position.operator.spec.ts → position-operator.spec.ts} +11 -6
- package/src/domain/{position.operator.ts → position-operator.ts} +13 -6
- package/src/domain/position.spec.ts +7 -4
- package/src/domain/position.ts +3 -3
- package/src/domain/session-builder.ts +158 -0
- package/src/domain/session.spec.ts +2 -9
- package/src/domain/session.ts +84 -69
- package/src/domain/{trade.operator.spec.ts → trade-operator.spec.ts} +7 -3
- package/src/domain/{trade.operator.ts → trade-operator.ts} +0 -0
- package/src/domain/trade.spec.ts +6 -2
- package/src/domain/trade.ts +9 -7
- package/src/index.ts +1 -2
- package/src/shared/collections.spec.ts +10 -6
- package/src/shared/collections.ts +29 -16
- package/src/shared/environment.ts +13 -0
- package/src/shared/index.ts +1 -1
- package/src/shared/logger.ts +35 -7
- package/src/shared/pipe.ts +1 -1
- package/src/storage/cache.ts +3 -1
- package/src/storage/feed.ts +2 -0
- package/src/storage/storage.ts +10 -8
- package/src/store/error.ts +36 -0
- package/src/store/index.ts +7 -7
- package/src/store/{store-balance.event.spec.ts → store-balance-event.spec.ts} +3 -3
- package/src/store/{store-balance.event.ts → store-balance-event.ts} +54 -11
- package/src/store/{store.event.ts → store-event.ts} +0 -0
- package/src/store/{store-instrument.event.spec.ts → store-instrument-event.spec.ts} +6 -5
- package/src/store/{store-instrument.event.ts → store-instrument-event.ts} +17 -6
- package/src/store/store-order-event.spec.ts +32 -0
- package/src/store/{store-order.event.ts → store-order-event.ts} +25 -20
- package/src/store/{store-orderbook.event.spec.ts → store-orderbook-event.spec.ts} +11 -9
- package/src/store/{store-orderbook.event.ts → store-orderbook-event.ts} +7 -5
- package/src/store/{store-position.event.ts → store-position-event.ts} +14 -7
- package/src/store/store-state.ts +3 -3
- package/src/store/{store-trade.event.spec.ts → store-trade-event.spec.ts} +7 -5
- package/src/store/{store-trade.event.ts → store-trade-event.ts} +10 -4
- package/src/store/store.spec.ts +13 -11
- package/src/store/store.ts +1 -1
- package/src/strategy.ts +47 -0
- package/tsconfig.json +12 -5
- package/dist/adapter/adapter-aggregate.js.map +0 -1
- package/dist/adapter/adapter.js.map +0 -1
- package/dist/adapter/backtester/backtester-adapter.js.map +0 -1
- package/dist/adapter/backtester/backtester-adapter.spec.d.ts +0 -1
- package/dist/adapter/backtester/backtester-adapter.spec.js +0 -83
- package/dist/adapter/backtester/backtester-adapter.spec.js.map +0 -1
- package/dist/adapter/backtester/backtester-cursor.js.map +0 -1
- package/dist/adapter/backtester/backtester-cursor.spec.d.ts +0 -1
- package/dist/adapter/backtester/backtester-cursor.spec.js +0 -39
- package/dist/adapter/backtester/backtester-cursor.spec.js.map +0 -1
- package/dist/adapter/backtester/backtester-streamer.js.map +0 -1
- package/dist/adapter/backtester/backtester-streamer.spec.d.ts +0 -1
- package/dist/adapter/backtester/backtester-streamer.spec.js +0 -45
- package/dist/adapter/backtester/backtester-streamer.spec.js.map +0 -1
- package/dist/adapter/backtester/index.js.map +0 -1
- package/dist/adapter/error.js.map +0 -1
- package/dist/adapter/index.js.map +0 -1
- package/dist/adapter/paper/engine/paper-engine.js.map +0 -1
- package/dist/adapter/paper/engine/paper-engine.spec.d.ts +0 -1
- package/dist/adapter/paper/engine/paper-engine.spec.js +0 -54
- package/dist/adapter/paper/engine/paper-engine.spec.js.map +0 -1
- package/dist/adapter/paper/index.js.map +0 -1
- package/dist/adapter/paper/paper-adapter.js.map +0 -1
- package/dist/adapter/paper/paper-adapter.spec.d.ts +0 -1
- package/dist/adapter/paper/paper-adapter.spec.js +0 -70
- package/dist/adapter/paper/paper-adapter.spec.js.map +0 -1
- package/dist/bootstrap.d.ts +0 -11
- package/dist/bootstrap.js +0 -73
- package/dist/bootstrap.js.map +0 -1
- package/dist/cli/build.js.map +0 -1
- package/dist/cli/dev.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/internal/workspace.js.map +0 -1
- package/dist/cli/pull.js.map +0 -1
- package/dist/cli/run.js.map +0 -1
- package/dist/cli/test.js.map +0 -1
- package/dist/domain/asset.js.map +0 -1
- package/dist/domain/asset.spec.d.ts +0 -1
- package/dist/domain/asset.spec.js +0 -55
- package/dist/domain/asset.spec.js.map +0 -1
- package/dist/domain/balance.js.map +0 -1
- package/dist/domain/balance.operator.js.map +0 -1
- package/dist/domain/balance.operator.spec.d.ts +0 -1
- package/dist/domain/balance.operator.spec.js +0 -23
- package/dist/domain/balance.operator.spec.js.map +0 -1
- package/dist/domain/balance.spec.d.ts +0 -1
- package/dist/domain/balance.spec.js +0 -83
- package/dist/domain/balance.spec.js.map +0 -1
- package/dist/domain/candle.js.map +0 -1
- package/dist/domain/candle.operator.js.map +0 -1
- package/dist/domain/candle.operator.spec.d.ts +0 -1
- package/dist/domain/candle.operator.spec.js +0 -112
- package/dist/domain/candle.operator.spec.js.map +0 -1
- package/dist/domain/candle.spec.d.ts +0 -1
- package/dist/domain/candle.spec.js +0 -26
- package/dist/domain/candle.spec.js.map +0 -1
- package/dist/domain/commission.js.map +0 -1
- package/dist/domain/commission.spec.d.ts +0 -1
- package/dist/domain/commission.spec.js +0 -31
- package/dist/domain/commission.spec.js.map +0 -1
- package/dist/domain/component.js.map +0 -1
- package/dist/domain/error.js.map +0 -1
- package/dist/domain/index.js.map +0 -1
- package/dist/domain/instrument.js.map +0 -1
- package/dist/domain/instrument.operator.js.map +0 -1
- package/dist/domain/instrument.operator.spec.d.ts +0 -1
- package/dist/domain/instrument.operator.spec.js +0 -24
- package/dist/domain/instrument.operator.spec.js.map +0 -1
- package/dist/domain/instrument.spec.d.ts +0 -1
- package/dist/domain/instrument.spec.js +0 -49
- package/dist/domain/instrument.spec.js.map +0 -1
- package/dist/domain/order.js.map +0 -1
- package/dist/domain/order.operator.js +0 -14
- package/dist/domain/order.operator.js.map +0 -1
- package/dist/domain/order.operator.spec.d.ts +0 -1
- package/dist/domain/order.operator.spec.js +0 -65
- package/dist/domain/order.operator.spec.js.map +0 -1
- package/dist/domain/order.spec.d.ts +0 -1
- package/dist/domain/order.spec.js +0 -34
- package/dist/domain/order.spec.js.map +0 -1
- package/dist/domain/orderbook.js.map +0 -1
- package/dist/domain/orderbook.operator.js.map +0 -1
- package/dist/domain/orderbook.operator.spec.d.ts +0 -1
- package/dist/domain/orderbook.operator.spec.js +0 -22
- package/dist/domain/orderbook.operator.spec.js.map +0 -1
- package/dist/domain/orderbook.spec.d.ts +0 -1
- package/dist/domain/orderbook.spec.js +0 -13
- package/dist/domain/orderbook.spec.js.map +0 -1
- package/dist/domain/position.js.map +0 -1
- package/dist/domain/position.operator.js.map +0 -1
- package/dist/domain/position.operator.spec.d.ts +0 -1
- package/dist/domain/position.operator.spec.js +0 -49
- package/dist/domain/position.operator.spec.js.map +0 -1
- package/dist/domain/position.spec.d.ts +0 -1
- package/dist/domain/position.spec.js +0 -31
- package/dist/domain/position.spec.js.map +0 -1
- package/dist/domain/session.js.map +0 -1
- package/dist/domain/session.spec.d.ts +0 -1
- package/dist/domain/session.spec.js +0 -23
- package/dist/domain/session.spec.js.map +0 -1
- package/dist/domain/timeframe.js.map +0 -1
- package/dist/domain/trade.js.map +0 -1
- package/dist/domain/trade.operator.js.map +0 -1
- package/dist/domain/trade.operator.spec.d.ts +0 -1
- package/dist/domain/trade.operator.spec.js +0 -24
- package/dist/domain/trade.operator.spec.js.map +0 -1
- package/dist/domain/trade.spec.d.ts +0 -1
- package/dist/domain/trade.spec.js +0 -13
- package/dist/domain/trade.spec.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/indicator/atr.d.ts +0 -4
- package/dist/indicator/atr.js +0 -16
- package/dist/indicator/atr.js.map +0 -1
- package/dist/indicator/cross.d.ts +0 -4
- package/dist/indicator/cross.js +0 -41
- package/dist/indicator/cross.js.map +0 -1
- package/dist/indicator/cross.spec.d.ts +0 -1
- package/dist/indicator/cross.spec.js +0 -102
- package/dist/indicator/cross.spec.js.map +0 -1
- package/dist/indicator/donchian.d.ts +0 -10
- package/dist/indicator/donchian.js +0 -16
- package/dist/indicator/donchian.js.map +0 -1
- package/dist/indicator/drawdown.d.ts +0 -3
- package/dist/indicator/drawdown.js +0 -28
- package/dist/indicator/drawdown.js.map +0 -1
- package/dist/indicator/ema.d.ts +0 -3
- package/dist/indicator/ema.js +0 -24
- package/dist/indicator/ema.js.map +0 -1
- package/dist/indicator/ema.spec.d.ts +0 -1
- package/dist/indicator/ema.spec.js +0 -24
- package/dist/indicator/ema.spec.js.map +0 -1
- package/dist/indicator/envelope.d.ts +0 -6
- package/dist/indicator/envelope.js +0 -18
- package/dist/indicator/envelope.js.map +0 -1
- package/dist/indicator/index.d.ts +0 -17
- package/dist/indicator/index.js +0 -34
- package/dist/indicator/index.js.map +0 -1
- package/dist/indicator/macd.d.ts +0 -3
- package/dist/indicator/macd.js +0 -13
- package/dist/indicator/macd.js.map +0 -1
- package/dist/indicator/min-max.d.ts +0 -6
- package/dist/indicator/min-max.js +0 -22
- package/dist/indicator/min-max.js.map +0 -1
- package/dist/indicator/ring-buffer.d.ts +0 -16
- package/dist/indicator/ring-buffer.js +0 -56
- package/dist/indicator/ring-buffer.js.map +0 -1
- package/dist/indicator/rma.d.ts +0 -3
- package/dist/indicator/rma.js +0 -24
- package/dist/indicator/rma.js.map +0 -1
- package/dist/indicator/sma.d.ts +0 -3
- package/dist/indicator/sma.js +0 -17
- package/dist/indicator/sma.js.map +0 -1
- package/dist/indicator/sma.spec.d.ts +0 -1
- package/dist/indicator/sma.spec.js +0 -20
- package/dist/indicator/sma.spec.js.map +0 -1
- package/dist/indicator/swma.d.ts +0 -3
- package/dist/indicator/swma.js +0 -24
- package/dist/indicator/swma.js.map +0 -1
- package/dist/indicator/tma.d.ts +0 -3
- package/dist/indicator/tma.js +0 -16
- package/dist/indicator/tma.js.map +0 -1
- package/dist/indicator/tma.spec.d.ts +0 -1
- package/dist/indicator/tma.spec.js +0 -20
- package/dist/indicator/tma.spec.js.map +0 -1
- package/dist/indicator/trailing.d.ts +0 -14
- package/dist/indicator/trailing.js +0 -68
- package/dist/indicator/trailing.js.map +0 -1
- package/dist/indicator/trailing.spec.d.ts +0 -1
- package/dist/indicator/trailing.spec.js +0 -70
- package/dist/indicator/trailing.spec.js.map +0 -1
- package/dist/indicator/true-range.d.ts +0 -4
- package/dist/indicator/true-range.js +0 -20
- package/dist/indicator/true-range.js.map +0 -1
- package/dist/indicator/true-range.spec.d.ts +0 -1
- package/dist/indicator/true-range.spec.js +0 -28
- package/dist/indicator/true-range.spec.js.map +0 -1
- package/dist/indicator/window.d.ts +0 -3
- package/dist/indicator/window.js +0 -22
- package/dist/indicator/window.js.map +0 -1
- package/dist/indicator/wma.d.ts +0 -3
- package/dist/indicator/wma.js +0 -23
- package/dist/indicator/wma.js.map +0 -1
- package/dist/indicator/wma.spec.d.ts +0 -1
- package/dist/indicator/wma.spec.js +0 -20
- package/dist/indicator/wma.spec.js.map +0 -1
- package/dist/shared/collections.js.map +0 -1
- package/dist/shared/collections.spec.d.ts +0 -1
- package/dist/shared/collections.spec.js +0 -28
- package/dist/shared/collections.spec.js.map +0 -1
- package/dist/shared/datetime.js.map +0 -1
- package/dist/shared/decimals.js.map +0 -1
- package/dist/shared/decimals.spec.d.ts +0 -1
- package/dist/shared/decimals.spec.js +0 -29
- package/dist/shared/decimals.spec.js.map +0 -1
- package/dist/shared/index.js.map +0 -1
- package/dist/shared/io.d.ts +0 -1
- package/dist/shared/io.js +0 -8
- package/dist/shared/io.js.map +0 -1
- package/dist/shared/logger.js.map +0 -1
- package/dist/shared/pipe.js.map +0 -1
- package/dist/shared/policy.js.map +0 -1
- package/dist/storage/cache.js.map +0 -1
- package/dist/storage/cache.spec.d.ts +0 -1
- package/dist/storage/cache.spec.js +0 -18
- package/dist/storage/cache.spec.js.map +0 -1
- package/dist/storage/feed.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/measurement.js.map +0 -1
- package/dist/storage/storage.js.map +0 -1
- package/dist/store/index.js.map +0 -1
- package/dist/store/store-balance.event.js.map +0 -1
- package/dist/store/store-balance.event.spec.d.ts +0 -1
- package/dist/store/store-balance.event.spec.js +0 -26
- package/dist/store/store-balance.event.spec.js.map +0 -1
- package/dist/store/store-instrument.event.js.map +0 -1
- package/dist/store/store-instrument.event.spec.d.ts +0 -1
- package/dist/store/store-instrument.event.spec.js +0 -22
- package/dist/store/store-instrument.event.spec.js.map +0 -1
- package/dist/store/store-order.event.js.map +0 -1
- package/dist/store/store-order.event.spec.d.ts +0 -1
- package/dist/store/store-order.event.spec.js +0 -21
- package/dist/store/store-order.event.spec.js.map +0 -1
- package/dist/store/store-orderbook.event.js.map +0 -1
- package/dist/store/store-orderbook.event.spec.d.ts +0 -1
- package/dist/store/store-orderbook.event.spec.js +0 -28
- package/dist/store/store-orderbook.event.spec.js.map +0 -1
- package/dist/store/store-position.event.js.map +0 -1
- package/dist/store/store-state.js.map +0 -1
- package/dist/store/store-trade.event.js.map +0 -1
- package/dist/store/store-trade.event.spec.d.ts +0 -1
- package/dist/store/store-trade.event.spec.js +0 -44
- package/dist/store/store-trade.event.spec.js.map +0 -1
- package/dist/store/store.event.js.map +0 -1
- package/dist/store/store.js.map +0 -1
- package/dist/store/store.spec.d.ts +0 -1
- package/dist/store/store.spec.js +0 -119
- package/dist/store/store.spec.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/jestconfig.json +0 -13
- package/src/adapter/backtester/backtester-adapter.spec.ts +0 -133
- package/src/adapter/paper/paper-adapter.spec.ts +0 -114
- package/src/bootstrap.ts +0 -139
- package/src/indicator/atr.ts +0 -21
- package/src/indicator/cross.spec.ts +0 -136
- package/src/indicator/cross.ts +0 -59
- package/src/indicator/donchian.ts +0 -38
- package/src/indicator/drawdown.ts +0 -29
- package/src/indicator/ema.spec.ts +0 -39
- package/src/indicator/ema.ts +0 -27
- package/src/indicator/envelope.ts +0 -25
- package/src/indicator/index.ts +0 -17
- package/src/indicator/macd.ts +0 -22
- package/src/indicator/min-max.ts +0 -28
- package/src/indicator/ring-buffer.ts +0 -63
- package/src/indicator/rma.ts +0 -26
- package/src/indicator/sma.spec.ts +0 -21
- package/src/indicator/sma.ts +0 -25
- package/src/indicator/swma.ts +0 -28
- package/src/indicator/tma.spec.ts +0 -21
- package/src/indicator/tma.ts +0 -20
- package/src/indicator/trailing.spec.ts +0 -88
- package/src/indicator/trailing.ts +0 -81
- package/src/indicator/true-range.spec.ts +0 -32
- package/src/indicator/true-range.ts +0 -32
- package/src/indicator/window.ts +0 -28
- package/src/indicator/wma.spec.ts +0 -20
- package/src/indicator/wma.ts +0 -29
- package/src/shared/io.ts +0 -3
- package/src/store/store-order.event.spec.ts +0 -28
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { AssetSelector, Balance, InstrumentSelector } from '../domain';
|
|
2
2
|
import { decimal, timestamp } from '../shared';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
assetNotSupportedError,
|
|
5
|
+
balanceNotFoundError,
|
|
6
|
+
instrumentNotSubscribedError,
|
|
7
|
+
orderNotFoundError
|
|
8
|
+
} from './error';
|
|
9
|
+
import { StoreEvent } from './store-event';
|
|
4
10
|
import { State, StateChangeTracker } from './store-state';
|
|
5
11
|
|
|
6
12
|
/**
|
|
@@ -15,13 +21,16 @@ export class BalancePatchEvent implements StoreEvent {
|
|
|
15
21
|
) {}
|
|
16
22
|
|
|
17
23
|
handle(state: State, changes: StateChangeTracker) {
|
|
18
|
-
|
|
24
|
+
/*
|
|
25
|
+
* skip not tradeable assets (for example, you can have an unlisted
|
|
26
|
+
* asset in your wallet).
|
|
27
|
+
*/
|
|
19
28
|
const asset = state.universe.asset.get(this.asset.id);
|
|
20
29
|
if (!asset) {
|
|
21
30
|
return;
|
|
22
31
|
}
|
|
23
32
|
|
|
24
|
-
const balance = state.balance.tryGetOrSet(this.asset.id, () => new Balance(asset));
|
|
33
|
+
const balance = state.balance.tryGetOrSet(this.asset.id, () => new Balance(0, asset));
|
|
25
34
|
|
|
26
35
|
balance.timestamp = this.timestamp;
|
|
27
36
|
balance.set(this.free, this.freezed);
|
|
@@ -31,6 +40,7 @@ export class BalancePatchEvent implements StoreEvent {
|
|
|
31
40
|
changes.commit(balance);
|
|
32
41
|
}
|
|
33
42
|
}
|
|
43
|
+
|
|
34
44
|
/**
|
|
35
45
|
*
|
|
36
46
|
*/
|
|
@@ -42,11 +52,12 @@ export class BalanceTransactEvent implements StoreEvent {
|
|
|
42
52
|
) {}
|
|
43
53
|
|
|
44
54
|
handle(state: State, changes: StateChangeTracker) {
|
|
45
|
-
const
|
|
46
|
-
|
|
55
|
+
const asset = state.universe.asset.get(this.asset.id);
|
|
56
|
+
if (!asset) {
|
|
57
|
+
throw assetNotSupportedError(this.asset);
|
|
58
|
+
}
|
|
47
59
|
|
|
48
|
-
|
|
49
|
-
});
|
|
60
|
+
const balance = state.balance.tryGetOrSet(this.asset.id, () => new Balance(0, asset));
|
|
50
61
|
|
|
51
62
|
balance.timestamp = this.timestamp;
|
|
52
63
|
balance.account(this.amount);
|
|
@@ -68,22 +79,38 @@ export class BalanceLockOrderEvent implements StoreEvent {
|
|
|
68
79
|
) {}
|
|
69
80
|
|
|
70
81
|
handle(state: State, changes: StateChangeTracker) {
|
|
71
|
-
const
|
|
82
|
+
const orders = state.order.get(this.instrument.id);
|
|
83
|
+
if (!orders) {
|
|
84
|
+
throw instrumentNotSubscribedError(this.instrument);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const order = orders.get(this.orderId);
|
|
88
|
+
if (!order) {
|
|
89
|
+
throw orderNotFoundError(this.orderId);
|
|
90
|
+
}
|
|
91
|
+
|
|
72
92
|
const base = state.balance.get(order.instrument.base.id);
|
|
93
|
+
if (!base) {
|
|
94
|
+
throw balanceNotFoundError(order.instrument.base);
|
|
95
|
+
}
|
|
96
|
+
|
|
73
97
|
const quote = state.balance.get(order.instrument.quote.id);
|
|
98
|
+
if (!quote) {
|
|
99
|
+
throw balanceNotFoundError(order.instrument.quote);
|
|
100
|
+
}
|
|
74
101
|
|
|
75
102
|
const balanceToLock = order.calculateBalanceToLock(base, quote);
|
|
76
103
|
|
|
77
104
|
state.timestamp = this.timestamp;
|
|
78
105
|
|
|
79
|
-
if (balanceToLock.base
|
|
106
|
+
if (balanceToLock.base?.greaterThan(0)) {
|
|
80
107
|
base.timestamp = this.timestamp;
|
|
81
108
|
base.lock(this.orderId, balanceToLock.base);
|
|
82
109
|
|
|
83
110
|
changes.commit(base);
|
|
84
111
|
}
|
|
85
112
|
|
|
86
|
-
if (balanceToLock.quote
|
|
113
|
+
if (balanceToLock.quote?.greaterThan(0)) {
|
|
87
114
|
quote.timestamp = this.timestamp;
|
|
88
115
|
quote.lock(this.orderId, balanceToLock.quote);
|
|
89
116
|
|
|
@@ -103,9 +130,25 @@ export class BalanceUnlockOrderEvent implements StoreEvent {
|
|
|
103
130
|
) {}
|
|
104
131
|
|
|
105
132
|
handle(state: State, changes: StateChangeTracker) {
|
|
106
|
-
const
|
|
133
|
+
const orders = state.order.get(this.instrument.id);
|
|
134
|
+
if (!orders) {
|
|
135
|
+
throw instrumentNotSubscribedError(this.instrument);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const order = orders.get(this.orderId);
|
|
139
|
+
if (!order) {
|
|
140
|
+
throw orderNotFoundError(this.orderId);
|
|
141
|
+
}
|
|
142
|
+
|
|
107
143
|
const base = state.balance.get(order.instrument.base.id);
|
|
144
|
+
if (!base) {
|
|
145
|
+
throw balanceNotFoundError(order.instrument.base);
|
|
146
|
+
}
|
|
147
|
+
|
|
108
148
|
const quote = state.balance.get(order.instrument.quote.id);
|
|
149
|
+
if (!quote) {
|
|
150
|
+
throw balanceNotFoundError(order.instrument.quote);
|
|
151
|
+
}
|
|
109
152
|
|
|
110
153
|
state.timestamp = this.timestamp;
|
|
111
154
|
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Store } from '..';
|
|
2
1
|
import { Asset, Commission } from '../domain';
|
|
3
2
|
import { d, now } from '../shared';
|
|
4
|
-
import {
|
|
3
|
+
import { Store } from './store';
|
|
4
|
+
import { InstrumentPatchEvent } from './store-instrument-event';
|
|
5
5
|
|
|
6
6
|
describe('InstrumentPatchEvent', () => {
|
|
7
7
|
test('should patch a store', () => {
|
|
@@ -15,10 +15,11 @@ describe('InstrumentPatchEvent', () => {
|
|
|
15
15
|
);
|
|
16
16
|
|
|
17
17
|
const { universe } = store.snapshot;
|
|
18
|
+
const instrument = universe.instrument.get('cex:de30-usd') ?? fail();
|
|
18
19
|
|
|
19
|
-
expect(
|
|
20
|
-
expect(
|
|
21
|
-
expect(
|
|
20
|
+
expect(instrument.base).toEqual(base);
|
|
21
|
+
expect(instrument.quote).toEqual(quote);
|
|
22
|
+
expect(instrument.timestamp).toEqual(timestamp);
|
|
22
23
|
expect(universe.instrument.asReadonlyArray().length).toEqual(1);
|
|
23
24
|
expect(universe.asset.asReadonlyArray().length).toEqual(2);
|
|
24
25
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Asset, Commission, Instrument, InstrumentSelector } from '../domain';
|
|
2
2
|
import { timestamp } from '../shared';
|
|
3
|
-
import { State, StateChangeTracker } from '
|
|
4
|
-
import {
|
|
3
|
+
import { State, StateChangeTracker } from '.';
|
|
4
|
+
import { assetNotSupportedError, instrumentNotSupportedError } from './error';
|
|
5
|
+
import { StoreEvent } from './store-event';
|
|
5
6
|
import { InnerSet } from './store-state';
|
|
6
7
|
|
|
7
8
|
export class InstrumentPatchEvent implements StoreEvent {
|
|
@@ -34,7 +35,7 @@ export class InstrumentPatchEvent implements StoreEvent {
|
|
|
34
35
|
|
|
35
36
|
state.order.tryGetOrSet(selector.id, () => new InnerSet(selector.id));
|
|
36
37
|
|
|
37
|
-
return new Instrument(this.base, this.quote, this.raw);
|
|
38
|
+
return new Instrument(0, this.base, this.quote, this.raw, Commission.Zero);
|
|
38
39
|
});
|
|
39
40
|
|
|
40
41
|
instrument.timestamp = this.timestamp;
|
|
@@ -58,13 +59,23 @@ export class InstrumentSubscriptionEvent implements StoreEvent {
|
|
|
58
59
|
handle(state: State, changes: StateChangeTracker): void {
|
|
59
60
|
const instrument = state.universe.instrument.get(this.instrument.id);
|
|
60
61
|
if (!instrument) {
|
|
61
|
-
throw
|
|
62
|
+
throw instrumentNotSupportedError(this.instrument);
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
if (this.subscribed) {
|
|
66
|
+
const base = state.universe.asset.get(instrument.base.id);
|
|
67
|
+
if (!base) {
|
|
68
|
+
throw assetNotSupportedError(instrument.base);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const quote = state.universe.asset.get(instrument.quote.id);
|
|
72
|
+
if (!quote) {
|
|
73
|
+
throw assetNotSupportedError(instrument.quote);
|
|
74
|
+
}
|
|
75
|
+
|
|
65
76
|
state.subscription.instrument.upsert(instrument);
|
|
66
|
-
state.subscription.asset.upsert(
|
|
67
|
-
state.subscription.asset.upsert(
|
|
77
|
+
state.subscription.asset.upsert(base);
|
|
78
|
+
state.subscription.asset.upsert(quote);
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
changes.commit(instrument);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Asset, Commission, Instrument, Order } from '../domain';
|
|
2
|
+
import { d, now } from '../shared';
|
|
3
|
+
import { Store } from '.';
|
|
4
|
+
import { OrderLoadEvent } from './store-order-event';
|
|
5
|
+
|
|
6
|
+
describe('OrderLoadEvent', () => {
|
|
7
|
+
const instrument = new Instrument(
|
|
8
|
+
0,
|
|
9
|
+
new Asset('btc', 'binance', 8),
|
|
10
|
+
new Asset('usdt', 'binance', 2),
|
|
11
|
+
'binance:btc-usdt',
|
|
12
|
+
Commission.Zero
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
test('should load order to store', () => {
|
|
16
|
+
const timestamp = now();
|
|
17
|
+
const store = new Store();
|
|
18
|
+
const order = new Order(0, '1', instrument, d(1.0), 0);
|
|
19
|
+
|
|
20
|
+
order.state = 'PENDING';
|
|
21
|
+
|
|
22
|
+
store.snapshot.universe.instrument.upsert(instrument);
|
|
23
|
+
store.snapshot.subscription.instrument.upsert(instrument);
|
|
24
|
+
|
|
25
|
+
store.dispatch(new OrderLoadEvent(order, timestamp));
|
|
26
|
+
|
|
27
|
+
const pendingOrder = store.snapshot.order.get(instrument.id)?.get('1') ?? fail();
|
|
28
|
+
|
|
29
|
+
expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
|
|
30
|
+
expect(pendingOrder).toEqual(order);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { InstrumentSelector, Order } from '../domain';
|
|
2
2
|
import { decimal, timestamp } from '../shared';
|
|
3
|
-
import {
|
|
3
|
+
import { orderInvalidStateError, orderNotFoundError } from './error';
|
|
4
|
+
import { StoreEvent } from './store-event';
|
|
4
5
|
import { InnerSet, State, StateChangeTracker } from './store-state';
|
|
5
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Patches a store with an existing pending order.
|
|
9
|
+
* No store changing events are propagated.
|
|
10
|
+
*/
|
|
6
11
|
export class OrderLoadEvent implements StoreEvent {
|
|
7
12
|
constructor(readonly order: Order, readonly timestamp: timestamp) {}
|
|
8
13
|
|
|
9
|
-
handle(state: State
|
|
14
|
+
handle(state: State): void {
|
|
10
15
|
this.order.timestamp = this.timestamp;
|
|
11
16
|
|
|
12
17
|
const orderByInstrument = state.order.tryGetOrSet(
|
|
@@ -23,7 +28,7 @@ export class OrderNewEvent implements StoreEvent {
|
|
|
23
28
|
|
|
24
29
|
handle(state: State, changes: StateChangeTracker): void {
|
|
25
30
|
if (this.order.state != 'NEW') {
|
|
26
|
-
throw
|
|
31
|
+
throw orderInvalidStateError(this.order.state, ['NEW']);
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
this.order.createdAt = this.timestamp;
|
|
@@ -50,14 +55,14 @@ export class OrderPendingEvent implements StoreEvent {
|
|
|
50
55
|
handle(state: State, changes: StateChangeTracker): void {
|
|
51
56
|
const order = state.order
|
|
52
57
|
.tryGetOrSet(this.instrument.id, () => {
|
|
53
|
-
throw
|
|
58
|
+
throw orderNotFoundError(this.id);
|
|
54
59
|
})
|
|
55
60
|
.tryGetOrSet(this.id, () => {
|
|
56
|
-
throw
|
|
61
|
+
throw orderNotFoundError(this.id);
|
|
57
62
|
});
|
|
58
63
|
|
|
59
64
|
if (order.state != 'NEW') {
|
|
60
|
-
throw
|
|
65
|
+
throw orderInvalidStateError(order.state, ['NEW']);
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
order.state = 'PENDING';
|
|
@@ -78,14 +83,14 @@ export class OrderFilledEvent implements StoreEvent {
|
|
|
78
83
|
handle(state: State, changes: StateChangeTracker): void {
|
|
79
84
|
const order = state.order
|
|
80
85
|
.tryGetOrSet(this.instrument.id, () => {
|
|
81
|
-
throw
|
|
86
|
+
throw orderNotFoundError(this.id);
|
|
82
87
|
})
|
|
83
88
|
.tryGetOrSet(this.id, () => {
|
|
84
|
-
throw
|
|
89
|
+
throw orderNotFoundError(this.id);
|
|
85
90
|
});
|
|
86
91
|
|
|
87
92
|
if (order.state != 'PENDING' && order.state != 'CANCELING') {
|
|
88
|
-
throw
|
|
93
|
+
throw orderInvalidStateError(order.state, ['PENDING', 'CANCELING']);
|
|
89
94
|
}
|
|
90
95
|
|
|
91
96
|
order.state = 'FILLED';
|
|
@@ -107,10 +112,10 @@ export class OrderCancelingEvent implements StoreEvent {
|
|
|
107
112
|
handle(state: State, changes: StateChangeTracker): void {
|
|
108
113
|
const order = state.order
|
|
109
114
|
.tryGetOrSet(this.instrument.id, () => {
|
|
110
|
-
throw
|
|
115
|
+
throw orderNotFoundError(this.id);
|
|
111
116
|
})
|
|
112
117
|
.tryGetOrSet(this.id, () => {
|
|
113
|
-
throw
|
|
118
|
+
throw orderNotFoundError(this.id);
|
|
114
119
|
});
|
|
115
120
|
|
|
116
121
|
if (order.state == 'CANCELING' || order.state == 'CANCELED') {
|
|
@@ -118,7 +123,7 @@ export class OrderCancelingEvent implements StoreEvent {
|
|
|
118
123
|
}
|
|
119
124
|
|
|
120
125
|
if (order.state != 'PENDING') {
|
|
121
|
-
throw
|
|
126
|
+
throw orderInvalidStateError(order.state, ['PENDING']);
|
|
122
127
|
}
|
|
123
128
|
|
|
124
129
|
order.state = 'CANCELING';
|
|
@@ -138,10 +143,10 @@ export class OrderCanceledEvent implements StoreEvent {
|
|
|
138
143
|
handle(state: State, changes: StateChangeTracker): void {
|
|
139
144
|
const order = state.order
|
|
140
145
|
.tryGetOrSet(this.instrument.id, () => {
|
|
141
|
-
throw
|
|
146
|
+
throw orderNotFoundError(this.id);
|
|
142
147
|
})
|
|
143
148
|
.tryGetOrSet(this.id, () => {
|
|
144
|
-
throw
|
|
149
|
+
throw orderNotFoundError(this.id);
|
|
145
150
|
});
|
|
146
151
|
|
|
147
152
|
if (order.state == 'CANCELED') {
|
|
@@ -149,7 +154,7 @@ export class OrderCanceledEvent implements StoreEvent {
|
|
|
149
154
|
}
|
|
150
155
|
|
|
151
156
|
if (order.state != 'CANCELING') {
|
|
152
|
-
throw
|
|
157
|
+
throw orderInvalidStateError(order.state, ['CANCELING']);
|
|
153
158
|
}
|
|
154
159
|
|
|
155
160
|
order.state = 'CANCELED';
|
|
@@ -169,10 +174,10 @@ export class OrderCancelFailedEvent implements StoreEvent {
|
|
|
169
174
|
handle(state: State, changes: StateChangeTracker): void {
|
|
170
175
|
const order = state.order
|
|
171
176
|
.tryGetOrSet(this.instrument.id, () => {
|
|
172
|
-
throw
|
|
177
|
+
throw orderNotFoundError(this.id);
|
|
173
178
|
})
|
|
174
179
|
.tryGetOrSet(this.id, () => {
|
|
175
|
-
throw
|
|
180
|
+
throw orderNotFoundError(this.id);
|
|
176
181
|
});
|
|
177
182
|
|
|
178
183
|
if (order.state != 'CANCELING') {
|
|
@@ -196,14 +201,14 @@ export class OrderRejectedEvent implements StoreEvent {
|
|
|
196
201
|
handle(state: State, changes: StateChangeTracker): void {
|
|
197
202
|
const order = state.order
|
|
198
203
|
.tryGetOrSet(this.instrument.id, () => {
|
|
199
|
-
throw
|
|
204
|
+
throw orderNotFoundError(this.id);
|
|
200
205
|
})
|
|
201
206
|
.tryGetOrSet(this.id, () => {
|
|
202
|
-
throw
|
|
207
|
+
throw orderNotFoundError(this.id);
|
|
203
208
|
});
|
|
204
209
|
|
|
205
210
|
if (order.state != 'NEW') {
|
|
206
|
-
throw
|
|
211
|
+
throw orderInvalidStateError(order.state, ['NEW']);
|
|
207
212
|
}
|
|
208
213
|
|
|
209
214
|
order.state = 'REJECTED';
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Asset, Instrument, Liquidity } from '../domain';
|
|
1
|
+
import { Asset, Commission, Instrument, Liquidity } from '../domain';
|
|
3
2
|
import { d, now } from '../shared';
|
|
4
3
|
import { OrderbookPatchEvent } from '.';
|
|
5
|
-
|
|
6
|
-
const instrument = new Instrument(
|
|
7
|
-
new Asset('btc', 'binance', 8),
|
|
8
|
-
new Asset('usdt', 'binance', 2),
|
|
9
|
-
'binance:btc-usdt'
|
|
10
|
-
);
|
|
4
|
+
import { Store } from './store';
|
|
11
5
|
|
|
12
6
|
describe('OrderbookPatchEvent', () => {
|
|
7
|
+
const instrument = new Instrument(
|
|
8
|
+
0,
|
|
9
|
+
new Asset('btc', 'binance', 8),
|
|
10
|
+
new Asset('usdt', 'binance', 2),
|
|
11
|
+
'binance:btc-usdt',
|
|
12
|
+
Commission.Zero
|
|
13
|
+
);
|
|
14
|
+
|
|
13
15
|
let store: Store;
|
|
14
16
|
|
|
15
17
|
beforeEach(() => {
|
|
@@ -26,7 +28,7 @@ describe('OrderbookPatchEvent', () => {
|
|
|
26
28
|
|
|
27
29
|
store.dispatch(new OrderbookPatchEvent(instrument, ask, bid, timestamp));
|
|
28
30
|
|
|
29
|
-
const orderbook = store.snapshot.orderbook.get(instrument.id);
|
|
31
|
+
const orderbook = store.snapshot.orderbook.get(instrument.id) ?? fail();
|
|
30
32
|
|
|
31
33
|
expect(orderbook.timestamp).toEqual(timestamp);
|
|
32
34
|
expect(orderbook.instrument.id).toEqual(orderbook.instrument.id);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { InstrumentSelector, Liquidity, Orderbook } from '../domain';
|
|
2
2
|
import { timestamp } from '../shared';
|
|
3
|
-
import {
|
|
3
|
+
import { instrumentNotSupportedError, liquidationError } from './error';
|
|
4
|
+
import { StoreEvent } from './store-event';
|
|
4
5
|
import { State, StateChangeTracker } from './store-state';
|
|
5
6
|
|
|
6
7
|
export class OrderbookPatchEvent implements StoreEvent {
|
|
@@ -12,13 +13,14 @@ export class OrderbookPatchEvent implements StoreEvent {
|
|
|
12
13
|
) {}
|
|
13
14
|
|
|
14
15
|
handle(state: State, changes: StateChangeTracker): void {
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
const instrument = state.universe.instrument.get(this.instrument.id);
|
|
17
|
+
if (!instrument) {
|
|
18
|
+
throw instrumentNotSupportedError(this.instrument);
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
const orderbook = state.orderbook.tryGetOrSet(
|
|
20
22
|
this.instrument.id,
|
|
21
|
-
() => new Orderbook(
|
|
23
|
+
() => new Orderbook(0, instrument, this.ask, this.bid)
|
|
22
24
|
);
|
|
23
25
|
|
|
24
26
|
state.timestamp = this.timestamp;
|
|
@@ -45,7 +47,7 @@ export class OrderbookPatchEvent implements StoreEvent {
|
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
if (quote.total.lessThan(0)) {
|
|
48
|
-
throw
|
|
50
|
+
throw liquidationError();
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
import { Instrument, Position, PositionMode } from '../domain';
|
|
2
2
|
import { decimal, timestamp } from '../shared';
|
|
3
|
-
import {
|
|
3
|
+
import { balanceNotFoundError, instrumentNotSubscribedError } from './error';
|
|
4
|
+
import { StoreEvent } from './store-event';
|
|
4
5
|
import { State, StateChangeTracker } from './store-state';
|
|
5
6
|
|
|
6
7
|
export class PositionLoadEvent implements StoreEvent {
|
|
7
8
|
constructor(readonly position: Position, readonly timestamp: timestamp) {}
|
|
8
9
|
|
|
9
|
-
handle(state: State
|
|
10
|
+
handle(state: State): void {
|
|
10
11
|
if (!state.subscription.instrument.get(this.position.instrument.id)) {
|
|
11
|
-
throw
|
|
12
|
-
`Trying to patch unsubscribed instrument: ${this.position.instrument.id}`
|
|
13
|
-
);
|
|
12
|
+
throw instrumentNotSubscribedError(this.position.instrument);
|
|
14
13
|
}
|
|
15
14
|
|
|
16
15
|
this.position.timestamp = this.timestamp;
|
|
17
16
|
|
|
18
17
|
const balance = state.balance.get(this.position.instrument.quote.id);
|
|
19
|
-
|
|
18
|
+
if (!balance) {
|
|
19
|
+
throw balanceNotFoundError(this.position.instrument.quote);
|
|
20
|
+
}
|
|
20
21
|
|
|
21
22
|
balance.position[this.position.id] = this.position;
|
|
22
23
|
|
|
24
|
+
const orderbook = state.orderbook.get(this.position.instrument.id);
|
|
23
25
|
if (orderbook) {
|
|
24
26
|
const rate = this.position.size.greaterThanOrEqualTo(0)
|
|
25
27
|
? orderbook.bids.rate
|
|
@@ -46,10 +48,14 @@ export class PositionPatchEvent implements StoreEvent {
|
|
|
46
48
|
// eslint-disable-next-line complexity
|
|
47
49
|
handle(state: State, changes: StateChangeTracker): void {
|
|
48
50
|
if (!state.subscription.instrument.get(this.instrument.id)) {
|
|
49
|
-
throw
|
|
51
|
+
throw instrumentNotSubscribedError(this.instrument);
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
const balance = state.balance.get(this.instrument.quote.id);
|
|
55
|
+
if (!balance) {
|
|
56
|
+
throw balanceNotFoundError(this.instrument.quote);
|
|
57
|
+
}
|
|
58
|
+
|
|
53
59
|
const orderbook = state.orderbook.get(this.instrument.id);
|
|
54
60
|
|
|
55
61
|
let position = balance.position[this.id];
|
|
@@ -83,6 +89,7 @@ export class PositionPatchEvent implements StoreEvent {
|
|
|
83
89
|
|
|
84
90
|
if (!position) {
|
|
85
91
|
position = new Position(
|
|
92
|
+
this.timestamp,
|
|
86
93
|
this.id,
|
|
87
94
|
this.instrument,
|
|
88
95
|
this.mode,
|
package/src/store/store-state.ts
CHANGED
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
import { Set, timestamp } from '../shared';
|
|
13
13
|
|
|
14
14
|
export interface StateChangeTracker {
|
|
15
|
-
commit(component: Component);
|
|
16
|
-
commitPendingChanges();
|
|
15
|
+
commit(component: Component): void;
|
|
16
|
+
commitPendingChanges(): void;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export class InnerSet<T extends { id: string }> extends Set<T> {
|
|
@@ -23,7 +23,7 @@ export class InnerSet<T extends { id: string }> extends Set<T> {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export class State {
|
|
26
|
-
timestamp: timestamp;
|
|
26
|
+
timestamp: timestamp = 0;
|
|
27
27
|
|
|
28
28
|
universe: {
|
|
29
29
|
asset: Set<Asset>;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Asset, Instrument } from '../domain';
|
|
1
|
+
import { Asset, Commission, Instrument } from '../domain';
|
|
3
2
|
import { d, now } from '../shared';
|
|
4
3
|
import { TradePatchEvent } from '.';
|
|
4
|
+
import { Store } from './store';
|
|
5
5
|
|
|
6
6
|
const instrument = new Instrument(
|
|
7
|
+
0,
|
|
7
8
|
new Asset('btc', 'binance', 8),
|
|
8
9
|
new Asset('usdt', 'binance', 2),
|
|
9
|
-
'binance:btc-usdt'
|
|
10
|
+
'binance:btc-usdt',
|
|
11
|
+
Commission.Zero
|
|
10
12
|
);
|
|
11
13
|
|
|
12
14
|
describe('TradePatchEvent', () => {
|
|
@@ -19,7 +21,7 @@ describe('TradePatchEvent', () => {
|
|
|
19
21
|
|
|
20
22
|
store.dispatch(new TradePatchEvent(instrument, d(1000), d(0.1), timestamp));
|
|
21
23
|
|
|
22
|
-
const trade = store.snapshot.trade.get(instrument.id);
|
|
24
|
+
const trade = store.snapshot.trade.get(instrument.id) ?? fail();
|
|
23
25
|
|
|
24
26
|
expect(trade.timestamp).toEqual(timestamp);
|
|
25
27
|
expect(trade.instrument.id).toEqual(trade.instrument.id);
|
|
@@ -37,7 +39,7 @@ describe('TradePatchEvent', () => {
|
|
|
37
39
|
|
|
38
40
|
store.dispatch(new TradePatchEvent(instrument, d(1000), d(0.1), timestamp));
|
|
39
41
|
|
|
40
|
-
const trade = store.snapshot.trade.get(instrument.id);
|
|
42
|
+
const trade = store.snapshot.trade.get(instrument.id) ?? fail();
|
|
41
43
|
|
|
42
44
|
store.dispatch(new TradePatchEvent(instrument, d(2000), d(0.2), timestamp));
|
|
43
45
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { InstrumentSelector, Trade } from '../domain';
|
|
2
|
-
import { decimal, timestamp } from '../shared';
|
|
3
|
-
import {
|
|
2
|
+
import { d, decimal, timestamp } from '../shared';
|
|
3
|
+
import { instrumentNotSubscribedError, instrumentNotSupportedError } from './error';
|
|
4
|
+
import { StoreEvent } from './store-event';
|
|
4
5
|
import { State, StateChangeTracker } from './store-state';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -17,12 +18,17 @@ export class TradePatchEvent implements StoreEvent {
|
|
|
17
18
|
|
|
18
19
|
handle(state: State, changes: StateChangeTracker): void {
|
|
19
20
|
if (!state.subscription.instrument.get(this.instrument.id)) {
|
|
20
|
-
throw
|
|
21
|
+
throw instrumentNotSubscribedError(this.instrument);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const instrument = state.universe.instrument.get(this.instrument.id);
|
|
25
|
+
if (!instrument) {
|
|
26
|
+
throw instrumentNotSupportedError(this.instrument);
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
const trade = state.trade.tryGetOrSet(
|
|
24
30
|
this.instrument.id,
|
|
25
|
-
() => new Trade(
|
|
31
|
+
() => new Trade(0, instrument, d.Zero, d.Zero)
|
|
26
32
|
);
|
|
27
33
|
|
|
28
34
|
state.timestamp = this.timestamp;
|
package/src/store/store.spec.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { withLatestFrom } from 'rxjs';
|
|
2
2
|
|
|
3
|
-
import { Asset, balance, Instrument, Order, order } from '../domain';
|
|
3
|
+
import { Asset, balance, Commission, Instrument, Order, order } from '../domain';
|
|
4
4
|
import { d, now } from '../shared';
|
|
5
5
|
import { Store } from './store';
|
|
6
|
-
import { BalanceTransactEvent } from './store-balance
|
|
6
|
+
import { BalanceTransactEvent } from './store-balance-event';
|
|
7
7
|
import {
|
|
8
8
|
OrderCanceledEvent,
|
|
9
9
|
OrderCancelingEvent,
|
|
@@ -11,12 +11,14 @@ import {
|
|
|
11
11
|
OrderLoadEvent,
|
|
12
12
|
OrderNewEvent,
|
|
13
13
|
OrderPendingEvent
|
|
14
|
-
} from './store-order
|
|
14
|
+
} from './store-order-event';
|
|
15
15
|
|
|
16
16
|
const instrument = new Instrument(
|
|
17
|
+
0,
|
|
17
18
|
new Asset('abc', 'xyz', 4),
|
|
18
19
|
new Asset('def', 'xyz', 4),
|
|
19
|
-
'abc-def'
|
|
20
|
+
'abc-def',
|
|
21
|
+
Commission.Zero
|
|
20
22
|
);
|
|
21
23
|
|
|
22
24
|
describe('Store', () => {
|
|
@@ -35,7 +37,7 @@ describe('Store', () => {
|
|
|
35
37
|
}
|
|
36
38
|
});
|
|
37
39
|
|
|
38
|
-
store.dispatch(new OrderLoadEvent(Order
|
|
40
|
+
store.dispatch(new OrderLoadEvent(new Order(0, '1', instrument, d(10), 0), now()));
|
|
39
41
|
|
|
40
42
|
expect(hasUpdatedOrder).toBe(false);
|
|
41
43
|
});
|
|
@@ -49,7 +51,7 @@ describe('Store', () => {
|
|
|
49
51
|
}
|
|
50
52
|
});
|
|
51
53
|
|
|
52
|
-
store.dispatch(new OrderNewEvent(Order
|
|
54
|
+
store.dispatch(new OrderNewEvent(new Order(0, '1', instrument, d(10), 0), now()));
|
|
53
55
|
|
|
54
56
|
expect(hasUpdatedOrder).toBe(true);
|
|
55
57
|
});
|
|
@@ -63,7 +65,7 @@ describe('Store', () => {
|
|
|
63
65
|
}
|
|
64
66
|
});
|
|
65
67
|
|
|
66
|
-
const buyOrder = Order
|
|
68
|
+
const buyOrder = new Order(0, '1', instrument, d(10), 0);
|
|
67
69
|
|
|
68
70
|
store.dispatch(new OrderNewEvent(buyOrder, now()));
|
|
69
71
|
store.dispatch(new OrderPendingEvent(buyOrder.id, instrument, now()));
|
|
@@ -81,7 +83,7 @@ describe('Store', () => {
|
|
|
81
83
|
}
|
|
82
84
|
});
|
|
83
85
|
|
|
84
|
-
const buyOrder = Order
|
|
86
|
+
const buyOrder = new Order(0, '1', instrument, d(10), 0);
|
|
85
87
|
|
|
86
88
|
store.dispatch(new OrderNewEvent(buyOrder, now()));
|
|
87
89
|
store.dispatch(new OrderPendingEvent(buyOrder.id, instrument, now()));
|
|
@@ -101,7 +103,7 @@ describe('Store', () => {
|
|
|
101
103
|
}
|
|
102
104
|
});
|
|
103
105
|
|
|
104
|
-
const buyOrder = Order
|
|
106
|
+
const buyOrder = new Order(0, '1', instrument, d(10), 0);
|
|
105
107
|
|
|
106
108
|
store.dispatch(new OrderNewEvent(buyOrder, now()));
|
|
107
109
|
store.dispatch(new OrderPendingEvent(buyOrder.id, instrument, now()));
|
|
@@ -130,7 +132,7 @@ describe('Store', () => {
|
|
|
130
132
|
}
|
|
131
133
|
});
|
|
132
134
|
|
|
133
|
-
const buyOrder = Order
|
|
135
|
+
const buyOrder = new Order(0, '1', instrument, d(10), 0);
|
|
134
136
|
|
|
135
137
|
store.dispatch(
|
|
136
138
|
new OrderNewEvent(buyOrder, now()),
|
|
@@ -169,7 +171,7 @@ describe('Store', () => {
|
|
|
169
171
|
}
|
|
170
172
|
});
|
|
171
173
|
|
|
172
|
-
const buyOrder = Order
|
|
174
|
+
const buyOrder = new Order(0, '1', instrument, d(10), 0);
|
|
173
175
|
|
|
174
176
|
store.dispatch(
|
|
175
177
|
new OrderNewEvent(buyOrder, now()),
|