@quantform/core 0.5.14 → 0.5.15
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/adapter/adapter-aggregate.d.ts +4 -2
- package/dist/adapter/adapter-aggregate.js +16 -18
- package/dist/adapter/adapter-aggregate.js.map +1 -1
- package/dist/adapter/adapter.d.ts +20 -21
- package/dist/adapter/adapter.js +8 -43
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/backtester/backtester-adapter.d.ts +9 -7
- package/dist/adapter/backtester/backtester-adapter.js +13 -12
- package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
- package/dist/{tests → adapter/backtester}/backtester-adapter.spec.d.ts +0 -0
- package/dist/adapter/backtester/backtester-adapter.spec.js +82 -0
- package/dist/adapter/backtester/backtester-adapter.spec.js.map +1 -0
- package/dist/adapter/backtester/backtester-cursor.d.ts +3 -4
- package/dist/adapter/backtester/backtester-cursor.js +2 -1
- package/dist/adapter/backtester/backtester-cursor.js.map +1 -1
- package/dist/adapter/backtester/backtester-cursor.spec.js +17 -18
- package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.d.ts +4 -1
- package/dist/adapter/backtester/backtester-streamer.js +39 -18
- package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.spec.js +13 -13
- package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
- package/dist/adapter/error.d.ts +2 -0
- package/dist/adapter/error.js +12 -0
- package/dist/adapter/error.js.map +1 -0
- package/dist/adapter/paper/engine/paper-engine.d.ts +11 -0
- package/dist/adapter/paper/engine/paper-engine.js +103 -0
- package/dist/adapter/paper/engine/paper-engine.js.map +1 -0
- package/dist/adapter/paper/{simulator/paper-spot-simulator.spec.d.ts → engine/paper-engine.spec.d.ts} +0 -0
- package/dist/adapter/paper/engine/paper-engine.spec.js +54 -0
- package/dist/adapter/paper/engine/paper-engine.spec.js.map +1 -0
- package/dist/adapter/paper/index.d.ts +1 -2
- package/dist/adapter/paper/index.js +1 -2
- package/dist/adapter/paper/index.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.d.ts +7 -7
- package/dist/adapter/paper/paper-adapter.js +20 -18
- package/dist/adapter/paper/paper-adapter.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.spec.js +35 -17
- package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
- package/dist/bootstrap.js +11 -10
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/pull.js +3 -1
- package/dist/cli/pull.js.map +1 -1
- package/dist/cli/test.js +5 -1
- package/dist/cli/test.js.map +1 -1
- package/dist/domain/asset.d.ts +6 -5
- package/dist/domain/asset.js +22 -16
- package/dist/domain/asset.js.map +1 -1
- package/dist/domain/asset.spec.js +32 -32
- package/dist/domain/asset.spec.js.map +1 -1
- package/dist/domain/balance.d.ts +7 -7
- package/dist/domain/balance.js +26 -21
- package/dist/domain/balance.js.map +1 -1
- package/dist/domain/balance.operator.d.ts +6 -0
- package/dist/domain/balance.operator.js +10 -0
- package/dist/domain/balance.operator.js.map +1 -0
- package/dist/{shared/policy.spec.d.ts → domain/balance.operator.spec.d.ts} +0 -0
- package/dist/domain/balance.operator.spec.js +23 -0
- package/dist/domain/balance.operator.spec.js.map +1 -0
- package/dist/domain/balance.spec.js +67 -7
- package/dist/domain/balance.spec.js.map +1 -1
- package/dist/domain/candle.d.ts +2 -17
- package/dist/domain/candle.js +3 -70
- package/dist/domain/candle.js.map +1 -1
- package/dist/domain/candle.operator.d.ts +9 -0
- package/dist/domain/candle.operator.js +64 -0
- package/dist/domain/candle.operator.js.map +1 -0
- package/dist/{shared/topic.spec.d.ts → domain/candle.operator.spec.d.ts} +0 -0
- package/dist/domain/candle.operator.spec.js +111 -0
- package/dist/domain/candle.operator.spec.js.map +1 -0
- package/dist/domain/candle.spec.js +11 -53
- package/dist/domain/candle.spec.js.map +1 -1
- package/dist/domain/commission.d.ts +4 -1
- package/dist/domain/commission.js +2 -2
- package/dist/domain/commission.js.map +1 -1
- package/dist/{store/event/store-balance.event.spec.d.ts → domain/commission.spec.d.ts} +0 -0
- package/dist/domain/commission.spec.js +30 -0
- package/dist/domain/commission.spec.js.map +1 -0
- package/dist/domain/component.d.ts +1 -0
- package/dist/domain/error.d.ts +5 -0
- package/dist/domain/error.js +24 -0
- package/dist/domain/error.js.map +1 -0
- package/dist/domain/index.d.ts +8 -1
- package/dist/domain/index.js +8 -1
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/instrument.d.ts +3 -2
- package/dist/domain/instrument.js +17 -9
- package/dist/domain/instrument.js.map +1 -1
- package/dist/domain/instrument.operator.d.ts +6 -0
- package/dist/domain/instrument.operator.js +14 -0
- package/dist/domain/instrument.operator.js.map +1 -0
- package/dist/{store/event/store-candle.event.spec.d.ts → domain/instrument.operator.spec.d.ts} +0 -0
- package/dist/domain/instrument.operator.spec.js +24 -0
- package/dist/domain/instrument.operator.spec.js.map +1 -0
- package/dist/domain/instrument.spec.js +22 -30
- package/dist/domain/instrument.spec.js.map +1 -1
- package/dist/domain/order.d.ts +12 -14
- package/dist/domain/order.js +37 -26
- package/dist/domain/order.js.map +1 -1
- package/dist/domain/order.operator.d.ts +7 -0
- package/dist/domain/order.operator.js +14 -0
- package/dist/domain/order.operator.js.map +1 -0
- package/dist/{store/event/store-instrument.event.spec.d.ts → domain/order.operator.spec.d.ts} +0 -0
- package/dist/domain/order.operator.spec.js +64 -0
- package/dist/domain/order.operator.spec.js.map +1 -0
- package/dist/{store/event/store-order.event.spec.d.ts → domain/order.spec.d.ts} +0 -0
- package/dist/domain/order.spec.js +33 -0
- package/dist/domain/order.spec.js.map +1 -0
- package/dist/domain/orderbook.d.ts +1 -0
- package/dist/domain/orderbook.js +1 -0
- package/dist/domain/orderbook.js.map +1 -1
- package/dist/domain/orderbook.operator.d.ts +6 -0
- package/dist/domain/orderbook.operator.js +10 -0
- package/dist/domain/orderbook.operator.js.map +1 -0
- package/dist/{store/event/store-trade.event.spec.d.ts → domain/orderbook.operator.spec.d.ts} +0 -0
- package/dist/domain/orderbook.operator.spec.js +22 -0
- package/dist/domain/orderbook.operator.spec.js.map +1 -0
- package/dist/domain/orderbook.spec.d.ts +1 -0
- package/dist/domain/orderbook.spec.js +13 -0
- package/dist/domain/orderbook.spec.js.map +1 -0
- package/dist/domain/position.d.ts +6 -11
- package/dist/domain/position.js +9 -31
- package/dist/domain/position.js.map +1 -1
- package/dist/domain/position.operator.d.ts +10 -0
- package/dist/domain/position.operator.js +38 -0
- package/dist/domain/position.operator.js.map +1 -0
- package/dist/domain/position.operator.spec.d.ts +1 -0
- package/dist/domain/position.operator.spec.js +48 -0
- package/dist/domain/position.operator.spec.js.map +1 -0
- package/dist/domain/position.spec.js +21 -17
- package/dist/domain/position.spec.js.map +1 -1
- package/dist/domain/session.d.ts +15 -18
- package/dist/domain/session.js +21 -31
- package/dist/domain/session.js.map +1 -1
- package/dist/domain/session.spec.js +1 -1
- package/dist/domain/session.spec.js.map +1 -1
- package/dist/domain/trade.d.ts +1 -0
- package/dist/domain/trade.js +1 -0
- package/dist/domain/trade.js.map +1 -1
- package/dist/domain/trade.operator.d.ts +6 -0
- package/dist/domain/trade.operator.js +10 -0
- package/dist/domain/trade.operator.js.map +1 -0
- package/dist/domain/trade.operator.spec.d.ts +1 -0
- package/dist/domain/trade.operator.spec.js +24 -0
- package/dist/domain/trade.operator.spec.js.map +1 -0
- package/dist/domain/trade.spec.d.ts +1 -0
- package/dist/domain/trade.spec.js +13 -0
- package/dist/domain/trade.spec.js.map +1 -0
- package/dist/indicator/cross.spec.js +2 -2
- package/dist/indicator/cross.spec.js.map +1 -1
- package/dist/indicator/ema.spec.js +1 -1
- package/dist/indicator/ema.spec.js.map +1 -1
- package/dist/indicator/sma.spec.js +1 -1
- package/dist/indicator/sma.spec.js.map +1 -1
- package/dist/indicator/tma.spec.js +1 -1
- package/dist/indicator/tma.spec.js.map +1 -1
- package/dist/indicator/trailing.spec.js +2 -2
- package/dist/indicator/trailing.spec.js.map +1 -1
- package/dist/indicator/truerange.spec.js +1 -1
- package/dist/indicator/truerange.spec.js.map +1 -1
- package/dist/indicator/wma.spec.js +1 -1
- package/dist/indicator/wma.spec.js.map +1 -1
- package/dist/shared/collections.d.ts +10 -0
- package/dist/shared/collections.js +33 -0
- package/dist/shared/collections.js.map +1 -0
- package/dist/shared/datetime.d.ts +0 -1
- package/dist/shared/datetime.js +1 -12
- package/dist/shared/datetime.js.map +1 -1
- package/dist/shared/decimals.d.ts +1 -1
- package/dist/shared/decimals.js +4 -5
- package/dist/shared/decimals.js.map +1 -1
- package/dist/shared/decimals.spec.js +2 -1
- package/dist/shared/decimals.spec.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/io.js.map +1 -1
- package/dist/shared/policy.d.ts +0 -1
- package/dist/shared/policy.js +1 -11
- package/dist/shared/policy.js.map +1 -1
- package/dist/storage/cache.js +1 -1
- package/dist/storage/cache.js.map +1 -1
- package/dist/storage/cache.spec.d.ts +1 -0
- package/dist/storage/cache.spec.js +18 -0
- package/dist/storage/cache.spec.js.map +1 -0
- package/dist/storage/feed.d.ts +3 -4
- package/dist/storage/feed.js +16 -6
- package/dist/storage/feed.js.map +1 -1
- package/dist/storage/storage.d.ts +2 -7
- package/dist/storage/storage.js +6 -11
- package/dist/storage/storage.js.map +1 -1
- package/dist/store/index.d.ts +8 -2
- package/dist/store/index.js +8 -2
- package/dist/store/index.js.map +1 -1
- package/dist/store/store-balance.event.d.ts +33 -0
- package/dist/store/store-balance.event.js +90 -0
- package/dist/store/store-balance.event.js.map +1 -0
- package/dist/store/store-balance.event.spec.d.ts +1 -0
- package/dist/store/{event/store-balance.event.spec.js → store-balance.event.spec.js} +7 -7
- package/dist/store/store-balance.event.spec.js.map +1 -0
- package/dist/store/{event/store-instrument.event.d.ts → store-instrument.event.d.ts} +5 -8
- package/dist/store/store-instrument.event.js +52 -0
- package/dist/store/store-instrument.event.js.map +1 -0
- package/dist/store/store-instrument.event.spec.d.ts +1 -0
- package/dist/store/store-instrument.event.spec.js +22 -0
- package/dist/store/store-instrument.event.spec.js.map +1 -0
- package/dist/store/store-order.event.d.ts +59 -0
- package/dist/store/store-order.event.js +181 -0
- package/dist/store/store-order.event.js.map +1 -0
- package/dist/store/store-order.event.spec.d.ts +1 -0
- package/dist/store/{event/store-order.event.spec.js → store-order.event.spec.js} +8 -8
- package/dist/store/store-order.event.spec.js.map +1 -0
- package/dist/store/{event/store-orderbook.event.d.ts → store-orderbook.event.d.ts} +4 -5
- package/dist/store/store-orderbook.event.js +42 -0
- package/dist/store/store-orderbook.event.js.map +1 -0
- package/dist/store/{event/store-position.event.d.ts → store-position.event.d.ts} +5 -7
- package/dist/store/store-position.event.js +77 -0
- package/dist/store/store-position.event.js.map +1 -0
- package/dist/store/store-state.d.ts +27 -0
- package/dist/store/store-state.js +29 -0
- package/dist/store/store-state.js.map +1 -0
- package/dist/store/{event/store-trade.event.d.ts → store-trade.event.d.ts} +4 -5
- package/dist/store/store-trade.event.js +25 -0
- package/dist/store/store-trade.event.js.map +1 -0
- package/dist/store/store-trade.event.spec.d.ts +1 -0
- package/dist/store/{event/store-trade.event.spec.js → store-trade.event.spec.js} +13 -13
- package/dist/store/store-trade.event.spec.js.map +1 -0
- package/dist/store/store.d.ts +4 -25
- package/dist/store/store.event.d.ts +6 -0
- package/dist/store/{event/store.event.js → store.event.js} +0 -0
- package/dist/store/store.event.js.map +1 -0
- package/dist/store/store.js +7 -195
- package/dist/store/store.js.map +1 -1
- package/dist/store/store.spec.d.ts +1 -0
- package/dist/store/store.spec.js +119 -0
- package/dist/store/store.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/{jestconfig.unit.json → jestconfig.json} +1 -2
- package/package.json +2 -6
- package/src/adapter/adapter-aggregate.ts +27 -35
- package/src/adapter/adapter.ts +25 -54
- package/src/adapter/backtester/backtester-adapter.spec.ts +124 -0
- package/src/adapter/backtester/backtester-adapter.ts +28 -17
- package/src/adapter/backtester/backtester-cursor.spec.ts +18 -19
- package/src/adapter/backtester/backtester-cursor.ts +7 -7
- package/src/adapter/backtester/backtester-streamer.spec.ts +19 -19
- package/src/adapter/backtester/backtester-streamer.ts +50 -20
- package/src/adapter/error.ts +9 -0
- package/src/adapter/paper/engine/paper-engine.spec.ts +92 -0
- package/src/adapter/paper/engine/paper-engine.ts +135 -0
- package/src/adapter/paper/index.ts +1 -2
- package/src/adapter/paper/paper-adapter.spec.ts +55 -19
- package/src/adapter/paper/paper-adapter.ts +27 -24
- package/src/bootstrap.ts +26 -19
- package/src/cli/pull.ts +5 -1
- package/src/cli/test.ts +5 -2
- package/src/domain/asset.spec.ts +33 -29
- package/src/domain/asset.ts +27 -21
- package/src/domain/balance.operator.spec.ts +25 -0
- package/src/domain/balance.operator.ts +15 -0
- package/src/domain/balance.spec.ts +95 -7
- package/src/domain/balance.ts +35 -29
- package/src/domain/candle.operator.spec.ts +125 -0
- package/src/domain/candle.operator.ts +106 -0
- package/src/domain/candle.spec.ts +12 -68
- package/src/domain/candle.ts +2 -114
- package/src/domain/commission.spec.ts +33 -0
- package/src/domain/commission.ts +2 -2
- package/src/domain/component.ts +1 -0
- package/src/domain/error.ts +25 -0
- package/src/domain/index.ts +8 -1
- package/src/domain/instrument.operator.spec.ts +28 -0
- package/src/domain/instrument.operator.ts +25 -0
- package/src/domain/instrument.spec.ts +22 -30
- package/src/domain/instrument.ts +20 -11
- package/src/domain/order.operator.spec.ts +81 -0
- package/src/domain/order.operator.ts +23 -0
- package/src/domain/order.spec.ts +43 -0
- package/src/domain/order.ts +43 -46
- package/src/domain/orderbook.operator.spec.ts +28 -0
- package/src/domain/orderbook.operator.ts +15 -0
- package/src/domain/orderbook.spec.ts +17 -0
- package/src/domain/orderbook.ts +4 -1
- package/src/domain/position.operator.spec.ts +58 -0
- package/src/domain/position.operator.ts +61 -0
- package/src/domain/position.spec.ts +28 -24
- package/src/domain/position.ts +16 -48
- package/src/domain/session.spec.ts +1 -1
- package/src/domain/session.ts +41 -131
- package/src/domain/trade.operator.spec.ts +31 -0
- package/src/domain/trade.operator.ts +15 -0
- package/src/domain/trade.spec.ts +17 -0
- package/src/domain/trade.ts +4 -1
- package/src/indicator/cross.spec.ts +2 -2
- package/src/indicator/ema.spec.ts +1 -1
- package/src/indicator/sma.spec.ts +1 -1
- package/src/indicator/tma.spec.ts +1 -1
- package/src/indicator/trailing.spec.ts +2 -2
- package/src/indicator/truerange.spec.ts +1 -1
- package/src/indicator/wma.spec.ts +1 -1
- package/src/shared/collections.ts +35 -0
- package/src/shared/datetime.ts +0 -12
- package/src/shared/decimals.spec.ts +2 -1
- package/src/shared/decimals.ts +6 -6
- package/src/shared/index.ts +1 -1
- package/src/shared/io.ts +0 -2
- package/src/shared/policy.ts +0 -13
- package/src/storage/cache.spec.ts +18 -0
- package/src/storage/cache.ts +1 -1
- package/src/storage/feed.ts +26 -16
- package/src/storage/storage.ts +9 -13
- package/src/store/index.ts +8 -2
- package/src/store/{event/store-balance.event.spec.ts → store-balance.event.spec.ts} +6 -6
- package/src/store/store-balance.event.ts +124 -0
- package/src/store/store-instrument.event.spec.ts +25 -0
- package/src/store/store-instrument.event.ts +72 -0
- package/src/store/store-order.event.spec.ts +28 -0
- package/src/store/store-order.event.ts +214 -0
- package/src/store/store-orderbook.event.ts +54 -0
- package/src/store/store-position.event.ts +102 -0
- package/src/store/store-state.ts +48 -0
- package/src/store/{event/store-trade.event.spec.ts → store-trade.event.spec.ts} +14 -14
- package/src/store/store-trade.event.ts +36 -0
- package/src/store/store.event.ts +8 -0
- package/src/store/store.spec.ts +180 -0
- package/src/store/store.ts +10 -208
- package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +0 -10
- package/dist/adapter/paper/simulator/paper-margin-simulator.js +0 -69
- package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +0 -1
- package/dist/adapter/paper/simulator/paper-simulator.d.ts +0 -16
- package/dist/adapter/paper/simulator/paper-simulator.js +0 -93
- package/dist/adapter/paper/simulator/paper-simulator.js.map +0 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +0 -13
- package/dist/adapter/paper/simulator/paper-spot-simulator.js +0 -81
- package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +0 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +0 -49
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +0 -1
- package/dist/domain/statement.d.ts +0 -4
- package/dist/domain/statement.js +0 -87
- package/dist/domain/statement.js.map +0 -1
- package/dist/shared/policy.spec.js +0 -22
- package/dist/shared/policy.spec.js.map +0 -1
- package/dist/shared/topic.d.ts +0 -14
- package/dist/shared/topic.js +0 -40
- package/dist/shared/topic.js.map +0 -1
- package/dist/shared/topic.spec.js +0 -43
- package/dist/shared/topic.spec.js.map +0 -1
- package/dist/store/event/index.d.ts +0 -8
- package/dist/store/event/index.js +0 -25
- package/dist/store/event/index.js.map +0 -1
- package/dist/store/event/store-balance.event.d.ts +0 -37
- package/dist/store/event/store-balance.event.js +0 -119
- package/dist/store/event/store-balance.event.js.map +0 -1
- package/dist/store/event/store-balance.event.spec.js.map +0 -1
- package/dist/store/event/store-candle.event.d.ts +0 -18
- package/dist/store/event/store-candle.event.js +0 -63
- package/dist/store/event/store-candle.event.js.map +0 -1
- package/dist/store/event/store-candle.event.spec.js +0 -23
- package/dist/store/event/store-candle.event.spec.js.map +0 -1
- package/dist/store/event/store-instrument.event.js +0 -78
- package/dist/store/event/store-instrument.event.js.map +0 -1
- package/dist/store/event/store-instrument.event.spec.js +0 -21
- package/dist/store/event/store-instrument.event.spec.js.map +0 -1
- package/dist/store/event/store-order.event.d.ts +0 -61
- package/dist/store/event/store-order.event.js +0 -205
- package/dist/store/event/store-order.event.js.map +0 -1
- package/dist/store/event/store-order.event.spec.js.map +0 -1
- package/dist/store/event/store-orderbook.event.js +0 -65
- package/dist/store/event/store-orderbook.event.js.map +0 -1
- package/dist/store/event/store-position.event.js +0 -97
- package/dist/store/event/store-position.event.js.map +0 -1
- package/dist/store/event/store-trade.event.js +0 -47
- package/dist/store/event/store-trade.event.js.map +0 -1
- package/dist/store/event/store-trade.event.spec.js.map +0 -1
- package/dist/store/event/store.event.d.ts +0 -5
- package/dist/store/event/store.event.js.map +0 -1
- package/dist/store/store.state.d.ts +0 -21
- package/dist/store/store.state.js +0 -21
- package/dist/store/store.state.js.map +0 -1
- package/dist/tests/backtester-adapter.spec.js +0 -61
- package/dist/tests/backtester-adapter.spec.js.map +0 -1
- package/dist/tests/session.spec.d.ts +0 -0
- package/dist/tests/session.spec.js +0 -1
- package/dist/tests/session.spec.js.map +0 -1
- package/jestconfig.integration.json +0 -12
- package/src/adapter/paper/simulator/paper-margin-simulator.ts +0 -108
- package/src/adapter/paper/simulator/paper-simulator.ts +0 -121
- package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +0 -87
- package/src/adapter/paper/simulator/paper-spot-simulator.ts +0 -134
- package/src/domain/statement.ts +0 -119
- package/src/shared/policy.spec.ts +0 -25
- package/src/shared/topic.spec.ts +0 -34
- package/src/shared/topic.ts +0 -43
- package/src/store/event/index.ts +0 -8
- package/src/store/event/store-balance.event.ts +0 -161
- package/src/store/event/store-candle.event.spec.ts +0 -30
- package/src/store/event/store-candle.event.ts +0 -71
- package/src/store/event/store-instrument.event.spec.ts +0 -25
- package/src/store/event/store-instrument.event.ts +0 -84
- package/src/store/event/store-order.event.spec.ts +0 -28
- package/src/store/event/store-order.event.ts +0 -218
- package/src/store/event/store-orderbook.event.ts +0 -70
- package/src/store/event/store-position.event.ts +0 -109
- package/src/store/event/store-trade.event.ts +0 -52
- package/src/store/event/store.event.ts +0 -6
- package/src/store/store.state.ts +0 -43
- package/src/tests/backtester-adapter.spec.ts +0 -88
- package/src/tests/session.spec.ts +0 -121
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { AssetSelector } from '../../domain/asset';
|
|
2
|
-
import { Balance } from '../../domain/balance';
|
|
3
|
-
import { timestamp } from '../../shared';
|
|
4
|
-
import { event } from '../../shared/topic';
|
|
5
|
-
import { State, StateChangeTracker } from '../store.state';
|
|
6
|
-
import { StoreEvent } from './store.event';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Updates the free and freezed balance of the given asset.
|
|
10
|
-
*/
|
|
11
|
-
@event
|
|
12
|
-
export class BalancePatchEvent implements StoreEvent {
|
|
13
|
-
type = 'balance-patch';
|
|
14
|
-
|
|
15
|
-
constructor(
|
|
16
|
-
readonly asset: AssetSelector,
|
|
17
|
-
readonly free: number,
|
|
18
|
-
readonly freezed: number,
|
|
19
|
-
readonly timestamp: timestamp
|
|
20
|
-
) {}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @see BalancePatchEvent
|
|
25
|
-
*/
|
|
26
|
-
export function BalancePatchEventHandler(
|
|
27
|
-
event: BalancePatchEvent,
|
|
28
|
-
state: State,
|
|
29
|
-
changes: StateChangeTracker
|
|
30
|
-
) {
|
|
31
|
-
let balance = state.balance[event.asset.toString()];
|
|
32
|
-
|
|
33
|
-
if (!balance) {
|
|
34
|
-
const asset = state.universe.asset[event.asset.toString()];
|
|
35
|
-
|
|
36
|
-
if (!asset) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
balance = state.balance[asset.toString()] = new Balance(asset);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
balance.timestamp = event.timestamp;
|
|
44
|
-
balance.set(event.free, event.freezed);
|
|
45
|
-
|
|
46
|
-
state.timestamp = event.timestamp;
|
|
47
|
-
|
|
48
|
-
changes.commit(balance);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
*/
|
|
54
|
-
@event
|
|
55
|
-
export class BalanceTransactEvent implements StoreEvent {
|
|
56
|
-
type = 'balance-transact';
|
|
57
|
-
|
|
58
|
-
constructor(
|
|
59
|
-
readonly asset: AssetSelector,
|
|
60
|
-
readonly amount: number,
|
|
61
|
-
readonly timestamp: timestamp
|
|
62
|
-
) {}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* @see BalanceTransactEvent
|
|
67
|
-
*/
|
|
68
|
-
export function BalanceTransactEventHandler(
|
|
69
|
-
event: BalanceTransactEvent,
|
|
70
|
-
state: State,
|
|
71
|
-
changes: StateChangeTracker
|
|
72
|
-
) {
|
|
73
|
-
let balance = state.balance[event.asset.toString()];
|
|
74
|
-
|
|
75
|
-
if (!balance) {
|
|
76
|
-
const asset = state.universe.asset[event.asset.toString()];
|
|
77
|
-
|
|
78
|
-
balance = new Balance(asset);
|
|
79
|
-
|
|
80
|
-
state.balance[asset.toString()] = balance;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
balance.timestamp = event.timestamp;
|
|
84
|
-
balance.transact(event.amount);
|
|
85
|
-
|
|
86
|
-
state.timestamp = event.timestamp;
|
|
87
|
-
|
|
88
|
-
changes.commit(balance);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
*
|
|
93
|
-
*/
|
|
94
|
-
@event
|
|
95
|
-
export class BalanceFreezEvent implements StoreEvent {
|
|
96
|
-
type = 'balance-freez';
|
|
97
|
-
|
|
98
|
-
constructor(
|
|
99
|
-
readonly asset: AssetSelector,
|
|
100
|
-
readonly amount: number,
|
|
101
|
-
readonly timestamp: timestamp
|
|
102
|
-
) {}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @see BalanceFreezEvent
|
|
107
|
-
*/
|
|
108
|
-
export function BalanceFreezEventHandler(
|
|
109
|
-
event: BalanceFreezEvent,
|
|
110
|
-
state: State,
|
|
111
|
-
changes: StateChangeTracker
|
|
112
|
-
) {
|
|
113
|
-
const balance = state.balance[event.asset.toString()];
|
|
114
|
-
|
|
115
|
-
if (!balance) {
|
|
116
|
-
throw new Error('invalid balance');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
balance.timestamp = event.timestamp;
|
|
120
|
-
balance.freez(event.amount);
|
|
121
|
-
|
|
122
|
-
state.timestamp = event.timestamp;
|
|
123
|
-
|
|
124
|
-
changes.commit(balance);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
*
|
|
129
|
-
*/
|
|
130
|
-
@event
|
|
131
|
-
export class BalanceUnfreezEvent implements StoreEvent {
|
|
132
|
-
type = 'balance-unfreez';
|
|
133
|
-
|
|
134
|
-
constructor(
|
|
135
|
-
readonly asset: AssetSelector,
|
|
136
|
-
readonly amount: number,
|
|
137
|
-
readonly timestamp: timestamp
|
|
138
|
-
) {}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* @see BalanceUnfreezEvent
|
|
143
|
-
*/
|
|
144
|
-
export function BalanceUnfreezEventHandler(
|
|
145
|
-
event: BalanceUnfreezEvent,
|
|
146
|
-
state: State,
|
|
147
|
-
changes: StateChangeTracker
|
|
148
|
-
) {
|
|
149
|
-
const balance = state.balance[event.asset.toString()];
|
|
150
|
-
|
|
151
|
-
if (!balance) {
|
|
152
|
-
throw new Error('invalid balance');
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
balance.timestamp = event.timestamp;
|
|
156
|
-
balance.unfreez(event.amount);
|
|
157
|
-
|
|
158
|
-
state.timestamp = event.timestamp;
|
|
159
|
-
|
|
160
|
-
changes.commit(balance);
|
|
161
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Asset, Instrument } from '../../domain';
|
|
2
|
-
import { now } from '../../shared';
|
|
3
|
-
import { Store } from '../store';
|
|
4
|
-
import { CandleEvent } from '.';
|
|
5
|
-
|
|
6
|
-
const instrument = new Instrument(
|
|
7
|
-
new Asset('btc', 'binance', 8),
|
|
8
|
-
new Asset('usdt', 'binance', 2),
|
|
9
|
-
'binance:btc-usdt'
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
describe('candle patch event tests', () => {
|
|
13
|
-
test('should patch trade object', () => {
|
|
14
|
-
const timestamp = now();
|
|
15
|
-
const store = new Store();
|
|
16
|
-
|
|
17
|
-
store.snapshot.universe.instrument[instrument.toString()] = instrument;
|
|
18
|
-
store.snapshot.subscription.instrument[instrument.toString()] = instrument;
|
|
19
|
-
|
|
20
|
-
store.dispatch(new CandleEvent(instrument, 1, 1, 1, 1, 1, 1, timestamp));
|
|
21
|
-
|
|
22
|
-
const trade = store.snapshot.trade[instrument.toString()];
|
|
23
|
-
|
|
24
|
-
expect(trade.timestamp).toEqual(timestamp);
|
|
25
|
-
expect(trade.instrument.toString()).toEqual(instrument.toString());
|
|
26
|
-
expect(trade.rate).toEqual(1);
|
|
27
|
-
expect(trade.quantity).toEqual(1);
|
|
28
|
-
expect(store.snapshot.timestamp).toEqual(timestamp);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { InstrumentSelector } from '../../domain';
|
|
2
|
-
import { timestamp } from '../../shared/datetime';
|
|
3
|
-
import { event } from '../../shared/topic';
|
|
4
|
-
import { StateChangeTracker } from '..';
|
|
5
|
-
import { State } from '../store.state';
|
|
6
|
-
import { StoreEvent } from './store.event';
|
|
7
|
-
import { OrderbookPatchEventHandler } from './store-orderbook.event';
|
|
8
|
-
import { TradePatchEventHandler } from './store-trade.event';
|
|
9
|
-
|
|
10
|
-
@event
|
|
11
|
-
export class CandleEvent implements StoreEvent {
|
|
12
|
-
type = 'candle';
|
|
13
|
-
|
|
14
|
-
constructor(
|
|
15
|
-
readonly instrument: InstrumentSelector,
|
|
16
|
-
readonly timeframe: number,
|
|
17
|
-
readonly open: number,
|
|
18
|
-
readonly high: number,
|
|
19
|
-
readonly low: number,
|
|
20
|
-
readonly close: number,
|
|
21
|
-
readonly volume: number,
|
|
22
|
-
readonly timestamp: timestamp
|
|
23
|
-
) {}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function CandleEventHandler(
|
|
27
|
-
event: CandleEvent,
|
|
28
|
-
state: State,
|
|
29
|
-
changes: StateChangeTracker
|
|
30
|
-
) {
|
|
31
|
-
const instrument = state.universe.instrument[event.instrument.toString()];
|
|
32
|
-
|
|
33
|
-
const patch = (timestamp: number, rate: number) => {
|
|
34
|
-
// patch trade object
|
|
35
|
-
TradePatchEventHandler(
|
|
36
|
-
{
|
|
37
|
-
type: 'trade-patch',
|
|
38
|
-
instrument: event.instrument,
|
|
39
|
-
quantity: event.volume,
|
|
40
|
-
rate,
|
|
41
|
-
timestamp
|
|
42
|
-
},
|
|
43
|
-
state,
|
|
44
|
-
changes
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
// patch orderbook by assuming candle close price is mid orderbook price
|
|
48
|
-
OrderbookPatchEventHandler(
|
|
49
|
-
{
|
|
50
|
-
type: 'orderbook-patch',
|
|
51
|
-
instrument: event.instrument,
|
|
52
|
-
bestAskQuantity: instrument.base.fixed(event.volume * 0.5),
|
|
53
|
-
bestAskRate: rate,
|
|
54
|
-
bestBidQuantity: instrument.base.fixed(event.volume * 0.5),
|
|
55
|
-
bestBidRate: rate,
|
|
56
|
-
timestamp
|
|
57
|
-
},
|
|
58
|
-
state,
|
|
59
|
-
changes
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
state.timestamp = event.timestamp;
|
|
63
|
-
|
|
64
|
-
changes.commitPendingChanges();
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
patch(event.timestamp, instrument.quote.fixed(event.open));
|
|
68
|
-
patch(event.timestamp, instrument.quote.fixed(event.high));
|
|
69
|
-
patch(event.timestamp, instrument.quote.fixed(event.low));
|
|
70
|
-
patch(event.timestamp, instrument.quote.fixed(event.close));
|
|
71
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Asset, Commission } from '../../domain';
|
|
2
|
-
import { now } from '../../shared';
|
|
3
|
-
import { Store } from '..';
|
|
4
|
-
import { InstrumentPatchEvent } from './store-instrument.event';
|
|
5
|
-
|
|
6
|
-
describe('instrument patch event tests', () => {
|
|
7
|
-
test('should patch a store', () => {
|
|
8
|
-
const timestamp = now();
|
|
9
|
-
const store = new Store();
|
|
10
|
-
const base = new Asset('de30', 'cex', 2);
|
|
11
|
-
const quote = new Asset('usd', 'cex', 2);
|
|
12
|
-
|
|
13
|
-
store.dispatch(
|
|
14
|
-
new InstrumentPatchEvent(timestamp, base, quote, new Commission(0, 0), '')
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
expect(store.snapshot.universe.instrument['cex:de30-usd'].base).toEqual(base);
|
|
18
|
-
expect(store.snapshot.universe.instrument['cex:de30-usd'].quote).toEqual(quote);
|
|
19
|
-
expect(store.snapshot.universe.instrument['cex:de30-usd'].timestamp).toEqual(
|
|
20
|
-
timestamp
|
|
21
|
-
);
|
|
22
|
-
expect(Object.keys(store.snapshot.universe.instrument).length).toEqual(1);
|
|
23
|
-
expect(Object.keys(store.snapshot.universe.asset).length).toEqual(2);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { Asset, Commission } from '../../domain';
|
|
2
|
-
import { Instrument, InstrumentSelector } from '../../domain/instrument';
|
|
3
|
-
import { timestamp } from '../../shared';
|
|
4
|
-
import { event } from '../../shared/topic';
|
|
5
|
-
import { State, StateChangeTracker } from '../../store';
|
|
6
|
-
import { StoreEvent } from './store.event';
|
|
7
|
-
|
|
8
|
-
@event
|
|
9
|
-
export class InstrumentPatchEvent implements StoreEvent {
|
|
10
|
-
type = 'instrument-patch';
|
|
11
|
-
|
|
12
|
-
constructor(
|
|
13
|
-
readonly timestamp: timestamp,
|
|
14
|
-
readonly base: Asset,
|
|
15
|
-
readonly quote: Asset,
|
|
16
|
-
readonly commission: Commission,
|
|
17
|
-
readonly raw: string,
|
|
18
|
-
readonly leverage?: number
|
|
19
|
-
) {}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function InstrumentPatchEventHandler(
|
|
23
|
-
event: InstrumentPatchEvent,
|
|
24
|
-
state: State,
|
|
25
|
-
changes: StateChangeTracker
|
|
26
|
-
) {
|
|
27
|
-
const selector = new InstrumentSelector(
|
|
28
|
-
event.base.name,
|
|
29
|
-
event.quote.name,
|
|
30
|
-
event.base.adapter
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
let instrument = state.universe.instrument[selector.toString()];
|
|
34
|
-
if (!instrument) {
|
|
35
|
-
instrument = new Instrument(event.base, event.quote, event.raw);
|
|
36
|
-
|
|
37
|
-
//TODO: add asset before
|
|
38
|
-
state.universe.asset[event.base.toString()] = event.base;
|
|
39
|
-
state.universe.asset[event.quote.toString()] = event.quote;
|
|
40
|
-
state.universe.instrument[selector.toString()] = instrument;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
instrument.timestamp = event.timestamp;
|
|
44
|
-
instrument.commission = event.commission;
|
|
45
|
-
|
|
46
|
-
if (event.leverage) {
|
|
47
|
-
instrument.leverage = event.leverage;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
changes.commit(instrument);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
@event
|
|
54
|
-
export class InstrumentSubscriptionEvent implements StoreEvent {
|
|
55
|
-
type = 'instrument-subscription';
|
|
56
|
-
|
|
57
|
-
constructor(
|
|
58
|
-
readonly timestamp: timestamp,
|
|
59
|
-
readonly instrument: InstrumentSelector,
|
|
60
|
-
readonly subscribed: boolean
|
|
61
|
-
) {}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function InstrumentSubscriptionEventHandler(
|
|
65
|
-
event: InstrumentSubscriptionEvent,
|
|
66
|
-
state: State,
|
|
67
|
-
changes: StateChangeTracker
|
|
68
|
-
) {
|
|
69
|
-
const instrumentKey = event.instrument.toString();
|
|
70
|
-
|
|
71
|
-
if (!(instrumentKey in state.universe.instrument)) {
|
|
72
|
-
throw new Error(`Trying to patch not existing instrument: ${instrumentKey}`);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const instrument = state.universe.instrument[instrumentKey];
|
|
76
|
-
|
|
77
|
-
if (event.subscribed) {
|
|
78
|
-
state.subscription.instrument[instrument.toString()] = instrument;
|
|
79
|
-
state.subscription.asset[instrument.base.toString()] = instrument.base;
|
|
80
|
-
state.subscription.asset[instrument.quote.toString()] = instrument.quote;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
changes.commit(instrument);
|
|
84
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Asset, Instrument, Order } from '../../domain';
|
|
2
|
-
import { now } from '../../shared';
|
|
3
|
-
import { Store } from '../store';
|
|
4
|
-
import { OrderLoadEvent } from './store-order.event';
|
|
5
|
-
|
|
6
|
-
const instrument = new Instrument(
|
|
7
|
-
new Asset('btc', 'binance', 8),
|
|
8
|
-
new Asset('usdt', 'binance', 2),
|
|
9
|
-
'binance:btc-usdt'
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
describe('order load event tests', () => {
|
|
13
|
-
test('should load order to store', () => {
|
|
14
|
-
const timestamp = now();
|
|
15
|
-
const store = new Store();
|
|
16
|
-
const order = Order.buyMarket(instrument, 1.0);
|
|
17
|
-
|
|
18
|
-
order.state = 'PENDING';
|
|
19
|
-
|
|
20
|
-
store.snapshot.universe.instrument[instrument.toString()] = instrument;
|
|
21
|
-
store.snapshot.subscription.instrument[instrument.toString()] = instrument;
|
|
22
|
-
|
|
23
|
-
store.dispatch(new OrderLoadEvent(order, timestamp));
|
|
24
|
-
|
|
25
|
-
expect(Object.keys(store.snapshot.order).length).toEqual(1);
|
|
26
|
-
expect(store.snapshot.order[order.id]).toEqual(order);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { Order } from '../../domain';
|
|
2
|
-
import { timestamp } from '../../shared';
|
|
3
|
-
import { event } from '../../shared/topic';
|
|
4
|
-
import { State, StateChangeTracker } from '../store.state';
|
|
5
|
-
import { StoreEvent } from './store.event';
|
|
6
|
-
|
|
7
|
-
@event
|
|
8
|
-
export class OrderLoadEvent implements StoreEvent {
|
|
9
|
-
type = 'order-load';
|
|
10
|
-
|
|
11
|
-
constructor(readonly order: Order, readonly timestamp: timestamp) {}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function OrderLoadEventHandler(
|
|
15
|
-
event: OrderLoadEvent,
|
|
16
|
-
state: State,
|
|
17
|
-
changes: StateChangeTracker
|
|
18
|
-
) {
|
|
19
|
-
event.order.timestamp = event.timestamp;
|
|
20
|
-
|
|
21
|
-
state.order[event.order.id] = event.order;
|
|
22
|
-
|
|
23
|
-
changes.commit(event.order);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@event
|
|
27
|
-
export class OrderNewEvent implements StoreEvent {
|
|
28
|
-
type = 'order-new';
|
|
29
|
-
|
|
30
|
-
constructor(readonly order: Order, readonly timestamp: timestamp) {}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function OrderNewEventHandler(
|
|
34
|
-
event: OrderNewEvent,
|
|
35
|
-
state: State,
|
|
36
|
-
changes: StateChangeTracker
|
|
37
|
-
) {
|
|
38
|
-
if (event.order.state != 'NEW') {
|
|
39
|
-
throw new Error(`Order is not new`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
event.order.createdAt = event.timestamp;
|
|
43
|
-
event.order.timestamp = event.timestamp;
|
|
44
|
-
|
|
45
|
-
state.order[event.order.id] = event.order;
|
|
46
|
-
|
|
47
|
-
changes.commit(event.order);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
@event
|
|
51
|
-
export class OrderPendingEvent implements StoreEvent {
|
|
52
|
-
type = 'order-pending';
|
|
53
|
-
|
|
54
|
-
constructor(readonly id: string, readonly timestamp: timestamp) {}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function OrderPendingEventHandler(
|
|
58
|
-
event: OrderPendingEvent,
|
|
59
|
-
state: State,
|
|
60
|
-
changes: StateChangeTracker
|
|
61
|
-
) {
|
|
62
|
-
if (!(event.id in state.order)) {
|
|
63
|
-
throw new Error(`Trying to patch unknown order: ${event.id}`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const order = state.order[event.id];
|
|
67
|
-
|
|
68
|
-
if (order.state != 'NEW') {
|
|
69
|
-
throw new Error(`Order is not NEW: ${order.state}`);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
order.state = 'PENDING';
|
|
73
|
-
order.timestamp = event.timestamp;
|
|
74
|
-
|
|
75
|
-
changes.commit(order);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
@event
|
|
79
|
-
export class OrderFilledEvent implements StoreEvent {
|
|
80
|
-
type = 'order-filled';
|
|
81
|
-
|
|
82
|
-
constructor(
|
|
83
|
-
readonly id: string,
|
|
84
|
-
readonly averageExecutionRate: number,
|
|
85
|
-
readonly timestamp: timestamp
|
|
86
|
-
) {}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function OrderFilledEventHandler(
|
|
90
|
-
event: OrderFilledEvent,
|
|
91
|
-
state: State,
|
|
92
|
-
changes: StateChangeTracker
|
|
93
|
-
) {
|
|
94
|
-
if (!(event.id in state.order)) {
|
|
95
|
-
throw new Error(`Trying to patch unknown order: ${event.id}`);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const order = state.order[event.id];
|
|
99
|
-
|
|
100
|
-
if (order.state != 'PENDING' && order.state != 'CANCELING') {
|
|
101
|
-
throw new Error(`Order is not PENDING or CANCELING: ${order.state}`);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
order.state = 'FILLED';
|
|
105
|
-
order.timestamp = event.timestamp;
|
|
106
|
-
order.quantityExecuted = order.quantity;
|
|
107
|
-
order.averageExecutionRate = event.averageExecutionRate;
|
|
108
|
-
|
|
109
|
-
changes.commit(order);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
@event
|
|
113
|
-
export class OrderCancelingEvent implements StoreEvent {
|
|
114
|
-
type = 'order-canceling';
|
|
115
|
-
|
|
116
|
-
constructor(readonly id: string, readonly timestamp: timestamp) {}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export function OrderCancelingEventHandler(
|
|
120
|
-
event: OrderCancelingEvent,
|
|
121
|
-
state: State,
|
|
122
|
-
changes: StateChangeTracker
|
|
123
|
-
) {
|
|
124
|
-
if (!(event.id in state.order)) {
|
|
125
|
-
throw new Error(`Trying to patch unknown order: ${event.id}`);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const order = state.order[event.id];
|
|
129
|
-
|
|
130
|
-
if (order.state == 'CANCELING' || order.state == 'CANCELED') {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (order.state != 'PENDING') {
|
|
135
|
-
throw new Error(`Order is not PENDING: ${order.state}`);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
order.state = 'CANCELING';
|
|
139
|
-
order.timestamp = event.timestamp;
|
|
140
|
-
|
|
141
|
-
changes.commit(order);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
@event
|
|
145
|
-
export class OrderCanceledEvent implements StoreEvent {
|
|
146
|
-
type = 'order-canceled';
|
|
147
|
-
|
|
148
|
-
constructor(readonly id: string, readonly timestamp: timestamp) {}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export function OrderCanceledEventHandler(
|
|
152
|
-
event: OrderCanceledEvent,
|
|
153
|
-
state: State,
|
|
154
|
-
changes: StateChangeTracker
|
|
155
|
-
) {
|
|
156
|
-
const order = state.order[event.id];
|
|
157
|
-
|
|
158
|
-
if (order.state == 'CANCELED') {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (order.state != 'CANCELING') {
|
|
163
|
-
throw new Error(`Order is not CANCELING: ${order.state}`);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
order.state = 'CANCELED';
|
|
167
|
-
order.timestamp = event.timestamp;
|
|
168
|
-
|
|
169
|
-
changes.commit(order);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
@event
|
|
173
|
-
export class OrderCancelFailedEvent implements StoreEvent {
|
|
174
|
-
type = 'order-cancel-failed';
|
|
175
|
-
|
|
176
|
-
constructor(readonly id: string, readonly timestamp: timestamp) {}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export function OrderCancelFailedEventHandler(
|
|
180
|
-
event: OrderCancelFailedEvent,
|
|
181
|
-
state: State,
|
|
182
|
-
changes: StateChangeTracker
|
|
183
|
-
) {
|
|
184
|
-
const order = state.order[event.id];
|
|
185
|
-
|
|
186
|
-
if (order.state != 'CANCELING') {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
order.state = 'PENDING';
|
|
191
|
-
order.timestamp = event.timestamp;
|
|
192
|
-
|
|
193
|
-
changes.commit(order);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
@event
|
|
197
|
-
export class OrderRejectedEvent implements StoreEvent {
|
|
198
|
-
type = 'order-canceled';
|
|
199
|
-
|
|
200
|
-
constructor(readonly id: string, readonly timestamp: timestamp) {}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
export function OrderRejectedEventHandler(
|
|
204
|
-
event: OrderRejectedEvent,
|
|
205
|
-
state: State,
|
|
206
|
-
changes: StateChangeTracker
|
|
207
|
-
) {
|
|
208
|
-
const order = state.order[event.id];
|
|
209
|
-
|
|
210
|
-
if (order.state != 'NEW') {
|
|
211
|
-
throw new Error(`Order is not NEW: ${order.state}`);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
order.state = 'REJECTED';
|
|
215
|
-
order.timestamp = event.timestamp;
|
|
216
|
-
|
|
217
|
-
changes.commit(order);
|
|
218
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { InstrumentSelector } from '../../domain/instrument';
|
|
2
|
-
import { Orderbook } from '../../domain/orderbook';
|
|
3
|
-
import { timestamp } from '../../shared';
|
|
4
|
-
import { event } from '../../shared/topic';
|
|
5
|
-
import { State, StateChangeTracker } from '../store.state';
|
|
6
|
-
import { StoreEvent } from './store.event';
|
|
7
|
-
|
|
8
|
-
@event
|
|
9
|
-
export class OrderbookPatchEvent implements StoreEvent {
|
|
10
|
-
type = 'orderbook-patch';
|
|
11
|
-
|
|
12
|
-
constructor(
|
|
13
|
-
readonly instrument: InstrumentSelector,
|
|
14
|
-
readonly bestAskRate: number,
|
|
15
|
-
readonly bestAskQuantity: number,
|
|
16
|
-
readonly bestBidRate: number,
|
|
17
|
-
readonly bestBidQuantity: number,
|
|
18
|
-
readonly timestamp: timestamp
|
|
19
|
-
) {}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function OrderbookPatchEventHandler(
|
|
23
|
-
event: OrderbookPatchEvent,
|
|
24
|
-
state: State,
|
|
25
|
-
changes: StateChangeTracker
|
|
26
|
-
) {
|
|
27
|
-
const instrumentKey = event.instrument.toString();
|
|
28
|
-
|
|
29
|
-
if (!(instrumentKey in state.subscription.instrument)) {
|
|
30
|
-
throw new Error(`Trying to patch unsubscribed instrument: ${instrumentKey}`);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
let orderbook = state.orderbook[instrumentKey];
|
|
34
|
-
|
|
35
|
-
if (!orderbook) {
|
|
36
|
-
const instrument = state.universe.instrument[instrumentKey];
|
|
37
|
-
|
|
38
|
-
orderbook = new Orderbook(instrument);
|
|
39
|
-
|
|
40
|
-
state.orderbook[instrumentKey] = orderbook;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
state.timestamp = event.timestamp;
|
|
44
|
-
|
|
45
|
-
orderbook.timestamp = event.timestamp;
|
|
46
|
-
orderbook.bestAskRate = orderbook.instrument.quote.fixed(event.bestAskRate);
|
|
47
|
-
orderbook.bestAskQuantity = orderbook.instrument.base.fixed(event.bestAskQuantity);
|
|
48
|
-
orderbook.bestBidRate = orderbook.instrument.quote.fixed(event.bestBidRate);
|
|
49
|
-
orderbook.bestBidQuantity = orderbook.instrument.base.fixed(event.bestBidQuantity);
|
|
50
|
-
|
|
51
|
-
const quote = state.balance[orderbook.instrument.quote.toString()];
|
|
52
|
-
|
|
53
|
-
if (quote) {
|
|
54
|
-
for (const position of Object.values(quote.position)) {
|
|
55
|
-
if (position.instrument.toString() != orderbook.toString()) {
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const rate = position.size >= 0 ? orderbook.bestBidRate : orderbook.bestAskRate;
|
|
60
|
-
|
|
61
|
-
position.calculatePnL(rate);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (quote.total < 0) {
|
|
65
|
-
throw new Error('liquidated');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
changes.commit(orderbook);
|
|
70
|
-
}
|