@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
|
@@ -2,7 +2,9 @@ import { Candle, InstrumentSelector, Order } from '../domain';
|
|
|
2
2
|
import { Logger } from '../shared';
|
|
3
3
|
import { Cache } from '../storage';
|
|
4
4
|
import { Store } from '../store';
|
|
5
|
-
import { Adapter,
|
|
5
|
+
import { Adapter, FeedQuery, HistoryQuery } from '.';
|
|
6
|
+
import { AdapterFactory, AdapterTimeProvider } from './adapter';
|
|
7
|
+
import { adapterNotFoundError } from './error';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Manages instances of all adapters provided in session descriptor.
|
|
@@ -12,12 +14,11 @@ export class AdapterAggregate {
|
|
|
12
14
|
private readonly adapter: Record<string, Adapter> = {};
|
|
13
15
|
|
|
14
16
|
constructor(
|
|
15
|
-
|
|
17
|
+
private readonly factories: AdapterFactory[],
|
|
18
|
+
private readonly timeProvider: AdapterTimeProvider,
|
|
16
19
|
private readonly store: Store,
|
|
17
20
|
private readonly cache: Cache
|
|
18
|
-
) {
|
|
19
|
-
adapters.forEach(it => (this.adapter[it.name] = it));
|
|
20
|
-
}
|
|
21
|
+
) {}
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Returns adapter by name.
|
|
@@ -28,9 +29,7 @@ export class AdapterAggregate {
|
|
|
28
29
|
const adapter = this.adapter[adapterName];
|
|
29
30
|
|
|
30
31
|
if (!adapter) {
|
|
31
|
-
throw
|
|
32
|
-
`Unknown adapter: ${adapterName}. You should provide adapter in session descriptor.`
|
|
33
|
-
);
|
|
32
|
+
throw adapterNotFoundError(adapterName);
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
return adapter;
|
|
@@ -40,13 +39,17 @@ export class AdapterAggregate {
|
|
|
40
39
|
* Sets up all adapters.
|
|
41
40
|
*/
|
|
42
41
|
async awake(): Promise<void> {
|
|
43
|
-
for (const
|
|
42
|
+
for (const factory of this.factories) {
|
|
43
|
+
const adapter = factory(this.timeProvider, this.store, this.cache);
|
|
44
|
+
|
|
44
45
|
try {
|
|
45
|
-
await adapter.awake(
|
|
46
|
+
await adapter.awake();
|
|
46
47
|
await adapter.account();
|
|
47
48
|
} catch (e) {
|
|
48
49
|
Logger.error(e);
|
|
49
50
|
}
|
|
51
|
+
|
|
52
|
+
this.adapter[adapter.name] = adapter;
|
|
50
53
|
}
|
|
51
54
|
}
|
|
52
55
|
|
|
@@ -68,19 +71,17 @@ export class AdapterAggregate {
|
|
|
68
71
|
* @param selectors
|
|
69
72
|
*/
|
|
70
73
|
async subscribe(selectors: InstrumentSelector[]): Promise<void> {
|
|
71
|
-
const grouped = selectors
|
|
72
|
-
|
|
73
|
-
.reduce((aggregate, it) => {
|
|
74
|
-
const adapter = it.base.adapter;
|
|
74
|
+
const grouped = selectors.reduce((aggregate, it) => {
|
|
75
|
+
const adapter = it.base.adapterName;
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
if (aggregate[adapter]) {
|
|
78
|
+
aggregate[adapter].push(it);
|
|
79
|
+
} else {
|
|
80
|
+
aggregate[adapter] = [it];
|
|
81
|
+
}
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
return aggregate;
|
|
84
|
+
}, {});
|
|
84
85
|
|
|
85
86
|
for (const adapterName in grouped) {
|
|
86
87
|
try {
|
|
@@ -95,9 +96,9 @@ export class AdapterAggregate {
|
|
|
95
96
|
* Opens new order.
|
|
96
97
|
* @param order an order to open.
|
|
97
98
|
*/
|
|
98
|
-
open(order: Order): Promise<void> {
|
|
99
|
+
async open(order: Order): Promise<void> {
|
|
99
100
|
try {
|
|
100
|
-
|
|
101
|
+
await this.get(order.instrument.base.adapterName).open(order);
|
|
101
102
|
} catch (e) {
|
|
102
103
|
Logger.error(e);
|
|
103
104
|
}
|
|
@@ -108,7 +109,7 @@ export class AdapterAggregate {
|
|
|
108
109
|
*/
|
|
109
110
|
cancel(order: Order): Promise<void> {
|
|
110
111
|
try {
|
|
111
|
-
return this.get(order.instrument.base.
|
|
112
|
+
return this.get(order.instrument.base.adapterName).cancel(order);
|
|
112
113
|
} catch (e) {
|
|
113
114
|
Logger.error(e);
|
|
114
115
|
}
|
|
@@ -120,7 +121,7 @@ export class AdapterAggregate {
|
|
|
120
121
|
*/
|
|
121
122
|
history(query: HistoryQuery): Promise<Candle[]> {
|
|
122
123
|
try {
|
|
123
|
-
return this.get(query.instrument.base.
|
|
124
|
+
return this.get(query.instrument.base.adapterName).history(query);
|
|
124
125
|
} catch (e) {
|
|
125
126
|
Logger.error(e);
|
|
126
127
|
}
|
|
@@ -132,18 +133,9 @@ export class AdapterAggregate {
|
|
|
132
133
|
*/
|
|
133
134
|
feed(query: FeedQuery): Promise<void> {
|
|
134
135
|
try {
|
|
135
|
-
return this.get(query.instrument.base.
|
|
136
|
+
return this.get(query.instrument.base.adapterName).feed(query);
|
|
136
137
|
} catch (e) {
|
|
137
138
|
Logger.error(e);
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
*
|
|
143
|
-
* @param adapter
|
|
144
|
-
* @returns
|
|
145
|
-
*/
|
|
146
|
-
private createContext(adapter: Adapter) {
|
|
147
|
-
return new AdapterContext(adapter, this.store, this.cache);
|
|
148
|
-
}
|
|
149
141
|
}
|
package/src/adapter/adapter.ts
CHANGED
|
@@ -1,35 +1,23 @@
|
|
|
1
1
|
import { Candle, InstrumentSelector, Order } from '../domain';
|
|
2
2
|
import { now, timestamp } from '../shared';
|
|
3
3
|
import { Cache, Feed } from '../storage';
|
|
4
|
-
import {
|
|
4
|
+
import { Store } from '../store';
|
|
5
5
|
import { PaperAdapter } from './paper';
|
|
6
|
-
import {
|
|
6
|
+
import { PaperEngine } from './paper/engine/paper-engine';
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export class AdapterContext {
|
|
12
|
-
/**
|
|
13
|
-
* Returns the current unix timestamp (points to historical date in case of backtest).
|
|
14
|
-
*/
|
|
15
|
-
get timestamp(): timestamp {
|
|
16
|
-
return this.adapter.timestamp();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
get snapshot(): State {
|
|
20
|
-
return this.store.snapshot;
|
|
21
|
-
}
|
|
8
|
+
export type AdapterTimeProvider = {
|
|
9
|
+
timestamp: () => number;
|
|
10
|
+
};
|
|
22
11
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
readonly cache: Cache
|
|
27
|
-
) {}
|
|
12
|
+
export const DefaultTimeProvider = {
|
|
13
|
+
timestamp: () => now()
|
|
14
|
+
};
|
|
28
15
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
export type AdapterFactory = (
|
|
17
|
+
timeProvider: AdapterTimeProvider,
|
|
18
|
+
store: Store,
|
|
19
|
+
cache: Cache
|
|
20
|
+
) => Adapter;
|
|
33
21
|
|
|
34
22
|
export type HistoryQuery = {
|
|
35
23
|
instrument: InstrumentSelector;
|
|
@@ -50,66 +38,49 @@ export type FeedQuery = {
|
|
|
50
38
|
* @abstract
|
|
51
39
|
*/
|
|
52
40
|
export abstract class Adapter {
|
|
53
|
-
context: AdapterContext;
|
|
54
|
-
|
|
55
41
|
abstract name: string;
|
|
56
42
|
|
|
57
43
|
timestamp(): timestamp {
|
|
58
|
-
return
|
|
44
|
+
return this.timeProvider.timestamp();
|
|
59
45
|
}
|
|
60
46
|
|
|
47
|
+
constructor(private readonly timeProvider: AdapterTimeProvider) {}
|
|
48
|
+
|
|
61
49
|
/**
|
|
62
50
|
* Setup an adapter.
|
|
63
|
-
* @param context
|
|
64
51
|
*/
|
|
65
|
-
|
|
66
|
-
this.context = context;
|
|
67
|
-
}
|
|
52
|
+
abstract awake(): Promise<void>;
|
|
68
53
|
|
|
69
54
|
/**
|
|
70
55
|
* Dispose an adapter.
|
|
71
56
|
*/
|
|
72
|
-
|
|
73
|
-
throw new Error('method not implemented');
|
|
74
|
-
}
|
|
57
|
+
abstract dispose(): Promise<void>;
|
|
75
58
|
|
|
76
59
|
/**
|
|
77
60
|
* Subscribe to collection of instruments.
|
|
78
61
|
* @param instruments
|
|
79
62
|
*/
|
|
80
|
-
subscribe(instruments: InstrumentSelector[]): Promise<void
|
|
81
|
-
throw new Error('method not implemented');
|
|
82
|
-
}
|
|
63
|
+
abstract subscribe(instruments: InstrumentSelector[]): Promise<void>;
|
|
83
64
|
|
|
84
65
|
/**
|
|
85
66
|
*
|
|
86
67
|
*/
|
|
87
|
-
account(): Promise<void
|
|
88
|
-
throw new Error('method not implemented');
|
|
89
|
-
}
|
|
68
|
+
abstract account(): Promise<void>;
|
|
90
69
|
|
|
91
70
|
/**
|
|
92
71
|
* Opens new order.
|
|
93
72
|
* @param order an order to open.
|
|
94
73
|
*/
|
|
95
|
-
open(order: Order): Promise<void
|
|
96
|
-
throw new Error('method not implemented');
|
|
97
|
-
}
|
|
74
|
+
abstract open(order: Order): Promise<void>;
|
|
98
75
|
|
|
99
76
|
/**
|
|
100
77
|
* Cancels specific order.
|
|
101
78
|
*/
|
|
102
|
-
cancel(order: Order): Promise<void
|
|
103
|
-
throw new Error('method not implemented');
|
|
104
|
-
}
|
|
79
|
+
abstract cancel(order: Order): Promise<void>;
|
|
105
80
|
|
|
106
|
-
history(query: HistoryQuery): Promise<Candle[]
|
|
107
|
-
throw new Error('method not implemented');
|
|
108
|
-
}
|
|
81
|
+
abstract history(query: HistoryQuery): Promise<Candle[]>;
|
|
109
82
|
|
|
110
|
-
feed(query: FeedQuery): Promise<void
|
|
111
|
-
throw new Error('method not implemented');
|
|
112
|
-
}
|
|
83
|
+
abstract feed(query: FeedQuery): Promise<void>;
|
|
113
84
|
|
|
114
|
-
abstract
|
|
85
|
+
abstract createPaperEngine(adapter: PaperAdapter): PaperEngine;
|
|
115
86
|
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Asset,
|
|
3
|
+
Candle,
|
|
4
|
+
Commission,
|
|
5
|
+
instrumentOf,
|
|
6
|
+
InstrumentSelector,
|
|
7
|
+
Order
|
|
8
|
+
} from '../../domain';
|
|
9
|
+
import { Cache, Feed, InMemoryStorage } from '../../storage';
|
|
10
|
+
import { InstrumentPatchEvent, Store } from '../../store';
|
|
11
|
+
import {
|
|
12
|
+
Adapter,
|
|
13
|
+
AdapterTimeProvider,
|
|
14
|
+
DefaultTimeProvider,
|
|
15
|
+
FeedQuery,
|
|
16
|
+
HistoryQuery
|
|
17
|
+
} from '../adapter';
|
|
18
|
+
import { PaperEngine } from '../paper/engine/paper-engine';
|
|
19
|
+
import { PaperAdapter } from '../paper/paper-adapter';
|
|
20
|
+
import { BacktesterAdapter } from './backtester-adapter';
|
|
21
|
+
import { BacktesterStreamer } from './backtester-streamer';
|
|
22
|
+
|
|
23
|
+
const base = new Asset('btc', 'binance', 8);
|
|
24
|
+
const quote = new Asset('usdt', 'binance', 4);
|
|
25
|
+
|
|
26
|
+
class DefaultAdapter extends Adapter {
|
|
27
|
+
dispose(): Promise<void> {
|
|
28
|
+
throw new Error('Method not implemented.');
|
|
29
|
+
}
|
|
30
|
+
subscribe(instruments: InstrumentSelector[]): Promise<void> {
|
|
31
|
+
throw new Error('Method not implemented.');
|
|
32
|
+
}
|
|
33
|
+
account(): Promise<void> {
|
|
34
|
+
throw new Error('Method not implemented.');
|
|
35
|
+
}
|
|
36
|
+
open(order: Order): Promise<void> {
|
|
37
|
+
throw new Error('Method not implemented.');
|
|
38
|
+
}
|
|
39
|
+
cancel(order: Order): Promise<void> {
|
|
40
|
+
throw new Error('Method not implemented.');
|
|
41
|
+
}
|
|
42
|
+
history(query: HistoryQuery): Promise<Candle[]> {
|
|
43
|
+
throw new Error('Method not implemented.');
|
|
44
|
+
}
|
|
45
|
+
feed(query: FeedQuery): Promise<void> {
|
|
46
|
+
throw new Error('Method not implemented.');
|
|
47
|
+
}
|
|
48
|
+
name = 'default';
|
|
49
|
+
|
|
50
|
+
constructor(timeProvider: AdapterTimeProvider, private readonly store: Store) {
|
|
51
|
+
super(timeProvider);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
timestamp() {
|
|
55
|
+
return 123;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
createPaperEngine(adapter: PaperAdapter): PaperEngine {
|
|
59
|
+
return new PaperEngine(adapter.store);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async awake(): Promise<void> {
|
|
63
|
+
this.store.dispatch(
|
|
64
|
+
new InstrumentPatchEvent(
|
|
65
|
+
this.timestamp(),
|
|
66
|
+
base,
|
|
67
|
+
quote,
|
|
68
|
+
new Commission(0.1, 0.1),
|
|
69
|
+
'btc-usdt'
|
|
70
|
+
)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const instrument = instrumentOf('binance:btc-usdt');
|
|
76
|
+
const store = new Store();
|
|
77
|
+
const adapter = new DefaultAdapter(DefaultTimeProvider, store);
|
|
78
|
+
const feed = new Feed(new InMemoryStorage());
|
|
79
|
+
const cache = new Cache(new InMemoryStorage());
|
|
80
|
+
|
|
81
|
+
describe('BacktesterAdapter', () => {
|
|
82
|
+
test('should return proper adapter name and timestamp', () => {
|
|
83
|
+
const sut = new BacktesterAdapter(
|
|
84
|
+
adapter,
|
|
85
|
+
new BacktesterStreamer(store, feed, {
|
|
86
|
+
from: 1,
|
|
87
|
+
to: 100
|
|
88
|
+
}),
|
|
89
|
+
store
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
expect(sut.name).toEqual('default');
|
|
93
|
+
expect(sut.timestamp()).toEqual(1);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('should stream data from input array', done => {
|
|
97
|
+
const streamer = new BacktesterStreamer(
|
|
98
|
+
store,
|
|
99
|
+
feed,
|
|
100
|
+
{
|
|
101
|
+
from: 0,
|
|
102
|
+
to: 100
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
onBacktestCompleted: () => {
|
|
106
|
+
expect(store.snapshot.timestamp).toEqual(1);
|
|
107
|
+
expect(store.snapshot.trade.get(instrument.id).rate).toEqual(100);
|
|
108
|
+
expect(store.snapshot.trade.get(instrument.id).quantity).toEqual(10);
|
|
109
|
+
|
|
110
|
+
done();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
feed.save(instrument, [new Candle(1, 100, 100, 100, 100, 10)]);
|
|
116
|
+
|
|
117
|
+
const sut = new BacktesterAdapter(adapter, streamer, store);
|
|
118
|
+
|
|
119
|
+
sut.awake();
|
|
120
|
+
sut.subscribe([instrument]);
|
|
121
|
+
|
|
122
|
+
expect(sut.name).toEqual('default');
|
|
123
|
+
});
|
|
124
|
+
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Candle, InstrumentSelector, Order } from '../../domain';
|
|
2
2
|
import { timestamp } from '../../shared';
|
|
3
|
-
import { InstrumentSubscriptionEvent } from '../../store';
|
|
4
|
-
import { Adapter
|
|
5
|
-
import { FeedQuery, HistoryQuery } from '../adapter';
|
|
3
|
+
import { InstrumentSubscriptionEvent, Store } from '../../store';
|
|
4
|
+
import { Adapter } from '..';
|
|
5
|
+
import { AdapterFactory, FeedQuery, HistoryQuery } from '../adapter';
|
|
6
6
|
import { PaperAdapter, PaperOptions } from '../paper';
|
|
7
|
-
import {
|
|
7
|
+
import { PaperEngine } from '../paper/engine/paper-engine';
|
|
8
8
|
import { BacktesterStreamer } from './backtester-streamer';
|
|
9
9
|
|
|
10
10
|
export interface BacktesterOptions extends PaperOptions {
|
|
@@ -12,20 +12,31 @@ export interface BacktesterOptions extends PaperOptions {
|
|
|
12
12
|
to: timestamp;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export function createBacktesterAdapterFactory(
|
|
16
|
+
decoratedAdapterFactory: AdapterFactory,
|
|
17
|
+
streamer: BacktesterStreamer
|
|
18
|
+
): AdapterFactory {
|
|
19
|
+
return (timeProvider, store, cache) =>
|
|
20
|
+
new BacktesterAdapter(
|
|
21
|
+
decoratedAdapterFactory(timeProvider, store, cache),
|
|
22
|
+
streamer,
|
|
23
|
+
store
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
15
27
|
export class BacktesterAdapter extends Adapter {
|
|
16
28
|
readonly name = this.decoratedAdapter.name;
|
|
17
29
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
super();
|
|
30
|
+
constructor(
|
|
31
|
+
readonly decoratedAdapter: Adapter,
|
|
32
|
+
readonly streamer: BacktesterStreamer,
|
|
33
|
+
readonly store: Store
|
|
34
|
+
) {
|
|
35
|
+
super(streamer.getTimeProvider());
|
|
24
36
|
}
|
|
25
37
|
|
|
26
|
-
async awake(
|
|
27
|
-
await
|
|
28
|
-
await this.decoratedAdapter.awake(context);
|
|
38
|
+
async awake(): Promise<void> {
|
|
39
|
+
await this.decoratedAdapter.awake();
|
|
29
40
|
}
|
|
30
41
|
|
|
31
42
|
dispose(): Promise<void> {
|
|
@@ -37,9 +48,9 @@ export class BacktesterAdapter extends Adapter {
|
|
|
37
48
|
this.streamer.subscribe(it);
|
|
38
49
|
});
|
|
39
50
|
|
|
40
|
-
this.
|
|
51
|
+
this.store.dispatch(
|
|
41
52
|
...instruments.map(
|
|
42
|
-
it => new InstrumentSubscriptionEvent(this.
|
|
53
|
+
it => new InstrumentSubscriptionEvent(this.timestamp(), it, true)
|
|
43
54
|
)
|
|
44
55
|
);
|
|
45
56
|
|
|
@@ -72,7 +83,7 @@ export class BacktesterAdapter extends Adapter {
|
|
|
72
83
|
return this.decoratedAdapter.feed(query);
|
|
73
84
|
}
|
|
74
85
|
|
|
75
|
-
|
|
76
|
-
return this.decoratedAdapter.
|
|
86
|
+
createPaperEngine(adapter: PaperAdapter): PaperEngine {
|
|
87
|
+
return this.decoratedAdapter.createPaperEngine(adapter);
|
|
77
88
|
}
|
|
78
89
|
}
|
|
@@ -1,43 +1,42 @@
|
|
|
1
|
-
import { instrumentOf } from '../../domain';
|
|
1
|
+
import { Candle, instrumentOf } from '../../domain';
|
|
2
2
|
import { Feed, InMemoryStorage } from '../../storage';
|
|
3
|
-
import { TradePatchEvent } from '../../store';
|
|
4
3
|
import { BacktesterCursor } from './backtester-cursor';
|
|
5
4
|
|
|
6
|
-
describe('
|
|
5
|
+
describe('BacktesterCursor', () => {
|
|
7
6
|
test('should repeat specific events', async () => {
|
|
8
7
|
const instrument = instrumentOf('binance:btc-usdt');
|
|
9
8
|
const feed = new Feed(new InMemoryStorage());
|
|
10
9
|
const cursor = new BacktesterCursor(instrument, feed);
|
|
11
10
|
|
|
12
11
|
feed.save(instrument, [
|
|
13
|
-
new
|
|
14
|
-
new
|
|
15
|
-
new
|
|
16
|
-
new
|
|
17
|
-
new
|
|
18
|
-
new
|
|
19
|
-
new
|
|
20
|
-
new
|
|
12
|
+
new Candle(1, 1, 1, 1, 1),
|
|
13
|
+
new Candle(2, 2, 2, 2, 2),
|
|
14
|
+
new Candle(3, 3, 3, 3, 3),
|
|
15
|
+
new Candle(4, 4, 4, 4, 4),
|
|
16
|
+
new Candle(5, 5, 5, 5, 5),
|
|
17
|
+
new Candle(6, 6, 6, 6, 6),
|
|
18
|
+
new Candle(7, 7, 7, 7, 7),
|
|
19
|
+
new Candle(8, 8, 8, 8, 8)
|
|
21
20
|
]);
|
|
22
21
|
|
|
23
22
|
await cursor.fetchNextPage(0, 4);
|
|
24
23
|
|
|
25
|
-
expect(cursor.dequeue
|
|
26
|
-
expect(cursor.dequeue
|
|
27
|
-
expect(cursor.dequeue
|
|
24
|
+
expect(cursor.dequeue().open).toEqual(1);
|
|
25
|
+
expect(cursor.dequeue().open).toEqual(2);
|
|
26
|
+
expect(cursor.dequeue().open).toEqual(3);
|
|
28
27
|
expect(cursor.peek()).toEqual(undefined);
|
|
29
28
|
|
|
30
29
|
await cursor.fetchNextPage(3, 7);
|
|
31
30
|
|
|
32
|
-
expect(cursor.dequeue
|
|
33
|
-
expect(cursor.dequeue
|
|
34
|
-
expect(cursor.dequeue
|
|
31
|
+
expect(cursor.dequeue().open).toEqual(4);
|
|
32
|
+
expect(cursor.dequeue().open).toEqual(5);
|
|
33
|
+
expect(cursor.dequeue().open).toEqual(6);
|
|
35
34
|
expect(cursor.peek()).toEqual(undefined);
|
|
36
35
|
|
|
37
36
|
await cursor.fetchNextPage(6, 10);
|
|
38
37
|
|
|
39
|
-
expect(cursor.dequeue
|
|
40
|
-
expect(cursor.dequeue
|
|
38
|
+
expect(cursor.dequeue().open).toEqual(7);
|
|
39
|
+
expect(cursor.dequeue().open).toEqual(8);
|
|
41
40
|
expect(cursor.peek()).toEqual(undefined);
|
|
42
41
|
});
|
|
43
42
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { InstrumentSelector } from '../../domain';
|
|
1
|
+
import { Candle, InstrumentSelector } from '../../domain';
|
|
2
2
|
import { timestamp } from '../../shared';
|
|
3
3
|
import { Feed } from '../../storage';
|
|
4
|
-
import {
|
|
4
|
+
import { backtestPageNotEmpty } from '../error';
|
|
5
5
|
|
|
6
6
|
export class BacktesterCursor {
|
|
7
|
-
private page = new Array<
|
|
7
|
+
private page = new Array<Candle>();
|
|
8
8
|
private pageIndex = 0;
|
|
9
9
|
completed = false;
|
|
10
10
|
|
|
@@ -14,7 +14,7 @@ export class BacktesterCursor {
|
|
|
14
14
|
|
|
15
15
|
constructor(readonly instrument: InstrumentSelector, private readonly feed: Feed) {}
|
|
16
16
|
|
|
17
|
-
peek():
|
|
17
|
+
peek(): Candle {
|
|
18
18
|
if (!this.page) {
|
|
19
19
|
return undefined;
|
|
20
20
|
}
|
|
@@ -22,8 +22,8 @@ export class BacktesterCursor {
|
|
|
22
22
|
return this.page[this.pageIndex];
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
dequeue
|
|
26
|
-
return this.page[this.pageIndex++]
|
|
25
|
+
dequeue(): Candle {
|
|
26
|
+
return this.page[this.pageIndex++];
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
async fetchNextPage(from: timestamp, to: number): Promise<void> {
|
|
@@ -32,7 +32,7 @@ export class BacktesterCursor {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
if (this.size > 0) {
|
|
35
|
-
throw
|
|
35
|
+
throw backtestPageNotEmpty();
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
this.pageIndex = 0;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { Asset,
|
|
1
|
+
import { Asset, Candle, Instrument } from '../../domain';
|
|
2
2
|
import { Feed, InMemoryStorage } from '../../storage';
|
|
3
|
-
import {
|
|
3
|
+
import { Store } from '../../store';
|
|
4
4
|
import { BacktesterStreamer } from './backtester-streamer';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
new
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
describe('BacktesterStreamer', () => {
|
|
7
|
+
const instrument = new Instrument(
|
|
8
|
+
new Asset('btc', 'binance', 8),
|
|
9
|
+
new Asset('usdt', 'binance', 2),
|
|
10
|
+
'binance:btc-usdt'
|
|
11
|
+
);
|
|
11
12
|
|
|
12
|
-
describe('backtester streamer tests', () => {
|
|
13
13
|
test('should repeat specific events', done => {
|
|
14
14
|
const feed = new Feed(new InMemoryStorage());
|
|
15
15
|
const store = new Store();
|
|
16
16
|
|
|
17
|
-
store.snapshot.universe.instrument
|
|
18
|
-
store.snapshot.subscription.instrument
|
|
17
|
+
store.snapshot.universe.instrument.upsert(instrument);
|
|
18
|
+
store.snapshot.subscription.instrument.upsert(instrument);
|
|
19
19
|
|
|
20
20
|
const streamer = new BacktesterStreamer(
|
|
21
21
|
store,
|
|
@@ -26,7 +26,7 @@ describe('backtester streamer tests', () => {
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
onBacktestCompleted: () => {
|
|
29
|
-
const trade = store.snapshot.trade
|
|
29
|
+
const trade = store.snapshot.trade.get(instrument.id);
|
|
30
30
|
|
|
31
31
|
expect(trade.timestamp).toEqual(8);
|
|
32
32
|
expect(trade.rate).toEqual(8);
|
|
@@ -40,14 +40,14 @@ describe('backtester streamer tests', () => {
|
|
|
40
40
|
|
|
41
41
|
feed
|
|
42
42
|
.save(instrument, [
|
|
43
|
-
new
|
|
44
|
-
new
|
|
45
|
-
new
|
|
46
|
-
new
|
|
47
|
-
new
|
|
48
|
-
new
|
|
49
|
-
new
|
|
50
|
-
new
|
|
43
|
+
new Candle(1, 1, 1, 1, 1, 1),
|
|
44
|
+
new Candle(2, 2, 2, 2, 2, 2),
|
|
45
|
+
new Candle(3, 3, 3, 3, 3, 3),
|
|
46
|
+
new Candle(4, 4, 4, 4, 4, 4),
|
|
47
|
+
new Candle(5, 5, 5, 5, 5, 5),
|
|
48
|
+
new Candle(6, 6, 6, 6, 6, 6),
|
|
49
|
+
new Candle(7, 7, 7, 7, 7, 7),
|
|
50
|
+
new Candle(8, 8, 8, 8, 8, 8)
|
|
51
51
|
])
|
|
52
52
|
.then(() => {
|
|
53
53
|
streamer.subscribe(instrument);
|