@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
package/src/domain/session.ts
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defer,
|
|
3
|
-
distinctUntilChanged,
|
|
4
3
|
filter,
|
|
5
4
|
finalize,
|
|
6
5
|
from,
|
|
7
6
|
map,
|
|
8
|
-
merge,
|
|
9
7
|
mergeMap,
|
|
10
8
|
Observable,
|
|
11
9
|
shareReplay,
|
|
12
10
|
startWith,
|
|
13
|
-
Subject,
|
|
14
11
|
Subscription,
|
|
15
12
|
switchMap,
|
|
16
13
|
take
|
|
17
14
|
} from 'rxjs';
|
|
18
15
|
|
|
19
|
-
import {
|
|
16
|
+
import { AdapterFactory, BacktesterOptions, PaperOptions } from '../adapter';
|
|
20
17
|
import { AdapterAggregate } from '../adapter/adapter-aggregate';
|
|
21
18
|
import {
|
|
22
19
|
AssetSelector,
|
|
@@ -26,26 +23,21 @@ import {
|
|
|
26
23
|
InstrumentSelector,
|
|
27
24
|
Order,
|
|
28
25
|
Orderbook,
|
|
29
|
-
OrderState,
|
|
30
26
|
Position,
|
|
31
27
|
Trade
|
|
32
28
|
} from '../domain';
|
|
33
29
|
import { now } from '../shared';
|
|
34
30
|
import { StorageFactory } from '../storage';
|
|
35
31
|
import { Store } from '../store';
|
|
32
|
+
import { balance } from './balance.operator';
|
|
33
|
+
import { instrument, instruments } from './instrument.operator';
|
|
34
|
+
import { order, orders } from './order.operator';
|
|
35
|
+
import { orderbook } from './orderbook.operator';
|
|
36
|
+
import { position, positions } from './position.operator';
|
|
37
|
+
import { trade } from './trade.operator';
|
|
36
38
|
|
|
37
39
|
/**
|
|
38
40
|
* Describes a single session.
|
|
39
|
-
* You can use @run function to start a new session managed by CLI.
|
|
40
|
-
* To start managed session you should install @quantform/cli package and run
|
|
41
|
-
* specific command:
|
|
42
|
-
* - qf paper (to paper trade strategy)
|
|
43
|
-
* - qf backtest (to backtest strategy based on provided feed)
|
|
44
|
-
* - qf live (to live trade strategy)
|
|
45
|
-
* or run on your own in code:
|
|
46
|
-
* - paper(descriptor, options)
|
|
47
|
-
* - backtest(descriptor, options)
|
|
48
|
-
* - live(descriptor)
|
|
49
41
|
*/
|
|
50
42
|
export interface SessionDescriptor {
|
|
51
43
|
/**
|
|
@@ -59,7 +51,7 @@ export interface SessionDescriptor {
|
|
|
59
51
|
/**
|
|
60
52
|
* Collection of adapters used to connect to the exchanges.
|
|
61
53
|
*/
|
|
62
|
-
adapter:
|
|
54
|
+
adapter: AdapterFactory[];
|
|
63
55
|
|
|
64
56
|
/**
|
|
65
57
|
* Provides historical data for backtest, it's not required for live and paper
|
|
@@ -82,8 +74,6 @@ export class Session {
|
|
|
82
74
|
return this.store.snapshot.timestamp;
|
|
83
75
|
}
|
|
84
76
|
|
|
85
|
-
readonly statement: Record<string, Record<string, any>> = {};
|
|
86
|
-
|
|
87
77
|
constructor(
|
|
88
78
|
readonly store: Store,
|
|
89
79
|
readonly aggregate: AdapterAggregate,
|
|
@@ -129,19 +119,6 @@ export class Session {
|
|
|
129
119
|
this.initialized = false;
|
|
130
120
|
}
|
|
131
121
|
|
|
132
|
-
useStatement(section: string): Record<string, any> {
|
|
133
|
-
return this.statement[section] ?? (this.statement[section] = {});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Return values for patch provided in optimization file.
|
|
138
|
-
* Example usage:
|
|
139
|
-
* const orderSize = session.useOptimizer('order.size');
|
|
140
|
-
*/
|
|
141
|
-
useOptimizer(path: string): any {
|
|
142
|
-
return undefined;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
122
|
/**
|
|
146
123
|
* Subscribes to specific instrument. Usually forces adapter to subscribe
|
|
147
124
|
* for orderbook and ticker streams.
|
|
@@ -152,26 +129,21 @@ export class Session {
|
|
|
152
129
|
|
|
153
130
|
/**
|
|
154
131
|
* Opens a new order.
|
|
155
|
-
* Example:
|
|
156
|
-
* session.open(Order.
|
|
132
|
+
* Example of buy order:
|
|
133
|
+
* session.open(Order.market(instrument, 100));
|
|
157
134
|
*/
|
|
158
|
-
open(order: Order): Observable<Order
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.aggregate.open(order).catch(subject.error);
|
|
162
|
-
|
|
163
|
-
return merge(
|
|
164
|
-
subject.asObservable(),
|
|
165
|
-
this.order(order.instrument).pipe(filter(it => it.id == order.id))
|
|
135
|
+
open(order: Order): Observable<Readonly<Order>> {
|
|
136
|
+
return from(this.aggregate.open(order)).pipe(
|
|
137
|
+
switchMap(() => this.order(order.instrument).pipe(filter(it => it.id == order.id)))
|
|
166
138
|
);
|
|
167
139
|
}
|
|
168
140
|
|
|
169
141
|
/**
|
|
170
142
|
* Cancels specific order.
|
|
171
143
|
*/
|
|
172
|
-
cancel(order: Order): Observable<Order
|
|
144
|
+
cancel(order: Order): Observable<Readonly<Order>> {
|
|
173
145
|
return defer(() => from(this.aggregate.cancel(order))).pipe(
|
|
174
|
-
switchMap(
|
|
146
|
+
switchMap(() =>
|
|
175
147
|
this.store.changes$.pipe(filter(it => it instanceof Order && order.id == it.id))
|
|
176
148
|
),
|
|
177
149
|
map(it => it as Order)
|
|
@@ -182,146 +154,84 @@ export class Session {
|
|
|
182
154
|
* Subscribes to specific instrument changes.
|
|
183
155
|
* When adapter awake then it will fetch collection of all available instruments.
|
|
184
156
|
*/
|
|
185
|
-
instrument(selector: InstrumentSelector): Observable<Instrument
|
|
157
|
+
instrument(selector: InstrumentSelector): Observable<Readonly<Instrument>> {
|
|
186
158
|
this.subscribe([selector]);
|
|
187
159
|
|
|
188
|
-
return this.store.changes$.pipe(
|
|
189
|
-
filter(it => it instanceof Instrument && it.toString() == selector.toString()),
|
|
190
|
-
map(it => it as Instrument)
|
|
191
|
-
);
|
|
160
|
+
return this.store.changes$.pipe(instrument(selector, this.store.snapshot));
|
|
192
161
|
}
|
|
193
162
|
|
|
194
163
|
/**
|
|
195
164
|
* Subscribes to instruments changes.
|
|
196
165
|
* When adapter awake then it will fetch collection of all available instruments.
|
|
197
166
|
*/
|
|
198
|
-
instruments(): Observable<Instrument[]
|
|
199
|
-
return this.store.changes$.pipe(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
167
|
+
instruments(): Observable<Readonly<Instrument[]>> {
|
|
168
|
+
return this.store.changes$.pipe(instruments(this.store.snapshot));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Subscribes to balance changes.
|
|
173
|
+
*/
|
|
174
|
+
balance(selector: AssetSelector): Observable<Readonly<Balance>> {
|
|
175
|
+
return this.store.changes$.pipe(balance(selector, this.store.snapshot));
|
|
206
176
|
}
|
|
207
177
|
|
|
208
178
|
/**
|
|
209
179
|
* Subscribes to trade/ticker changes.
|
|
210
180
|
*/
|
|
211
|
-
trade(selector: InstrumentSelector): Observable<Trade
|
|
181
|
+
trade(selector: InstrumentSelector): Observable<Readonly<Trade>> {
|
|
212
182
|
this.subscribe([selector]);
|
|
213
183
|
|
|
214
|
-
return this.store.changes$.pipe(
|
|
215
|
-
filter(
|
|
216
|
-
it => it instanceof Trade && it.instrument.toString() == selector.toString()
|
|
217
|
-
),
|
|
218
|
-
map(it => it as Trade)
|
|
219
|
-
);
|
|
184
|
+
return this.store.changes$.pipe(trade(selector, this.store.snapshot));
|
|
220
185
|
}
|
|
221
186
|
|
|
222
187
|
/**
|
|
223
188
|
* Subscribes to orderbook changes.
|
|
224
189
|
* Right now you can access only best bid and best ask.
|
|
225
190
|
*/
|
|
226
|
-
orderbook(selector: InstrumentSelector): Observable<Orderbook
|
|
191
|
+
orderbook(selector: InstrumentSelector): Observable<Readonly<Orderbook>> {
|
|
227
192
|
this.subscribe([selector]);
|
|
228
193
|
|
|
229
|
-
return this.store.changes$.pipe(
|
|
230
|
-
filter(
|
|
231
|
-
it => it instanceof Orderbook && it.instrument.toString() == selector.toString()
|
|
232
|
-
),
|
|
233
|
-
map(it => it as Orderbook)
|
|
234
|
-
);
|
|
194
|
+
return this.store.changes$.pipe(orderbook(selector, this.store.snapshot));
|
|
235
195
|
}
|
|
236
196
|
|
|
237
197
|
/**
|
|
238
198
|
* Subscribes to position on leveraged market.
|
|
239
199
|
*/
|
|
240
|
-
position(selector: InstrumentSelector): Observable<Position
|
|
200
|
+
position(selector: InstrumentSelector): Observable<Readonly<Position>> {
|
|
241
201
|
this.subscribe([selector]);
|
|
242
202
|
|
|
243
|
-
return this.store.changes$.pipe(
|
|
244
|
-
filter(
|
|
245
|
-
it => it instanceof Position && it.instrument.toString() == selector.toString()
|
|
246
|
-
),
|
|
247
|
-
map(it => it as Position)
|
|
248
|
-
);
|
|
203
|
+
return this.store.changes$.pipe(position(selector));
|
|
249
204
|
}
|
|
250
205
|
|
|
251
206
|
/**
|
|
252
207
|
* Subscribes to positions on leveraged markets.
|
|
253
208
|
*/
|
|
254
|
-
positions(selector: InstrumentSelector): Observable<Position[]
|
|
209
|
+
positions(selector: InstrumentSelector): Observable<Readonly<Position[]>> {
|
|
255
210
|
this.subscribe([selector]);
|
|
256
211
|
|
|
257
|
-
return this.store.changes$.pipe(
|
|
258
|
-
filter(
|
|
259
|
-
it => it instanceof Position && it.instrument.toString() == selector.toString()
|
|
260
|
-
),
|
|
261
|
-
map(() =>
|
|
262
|
-
Object.values(
|
|
263
|
-
this.store.snapshot.balance[selector.quote.toString()].position
|
|
264
|
-
).filter(it => it.instrument.toString() == selector.toString())
|
|
265
|
-
),
|
|
266
|
-
startWith([])
|
|
267
|
-
);
|
|
212
|
+
return this.store.changes$.pipe(positions(selector, this.store.snapshot));
|
|
268
213
|
}
|
|
269
214
|
|
|
270
|
-
order(selector: InstrumentSelector): Observable<Order
|
|
215
|
+
order(selector: InstrumentSelector): Observable<Readonly<Order>> {
|
|
271
216
|
this.subscribe([selector]);
|
|
272
217
|
|
|
273
|
-
return this.store.changes$.pipe(
|
|
274
|
-
filter(
|
|
275
|
-
it => it instanceof Order && it.instrument.toString() == selector.toString()
|
|
276
|
-
),
|
|
277
|
-
map(it => it as Order)
|
|
278
|
-
);
|
|
218
|
+
return this.store.changes$.pipe(order(selector));
|
|
279
219
|
}
|
|
280
220
|
|
|
281
|
-
orders(selector: InstrumentSelector
|
|
221
|
+
orders(selector: InstrumentSelector): Observable<Readonly<Order[]>> {
|
|
282
222
|
this.subscribe([selector]);
|
|
283
223
|
|
|
284
|
-
return this.store.changes$.pipe(
|
|
285
|
-
filter(
|
|
286
|
-
it =>
|
|
287
|
-
it instanceof Order &&
|
|
288
|
-
it.instrument.toString() == selector.toString() &&
|
|
289
|
-
(!states || states.includes(it.state))
|
|
290
|
-
),
|
|
291
|
-
map(() => this.store.snapshot.order),
|
|
292
|
-
startWith(this.store.snapshot.order),
|
|
293
|
-
map(it =>
|
|
294
|
-
Object.values(it)
|
|
295
|
-
.filter(
|
|
296
|
-
it =>
|
|
297
|
-
it.instrument.toString() == selector.toString() &&
|
|
298
|
-
(states ? states.includes(it.state) : true)
|
|
299
|
-
)
|
|
300
|
-
.sort((lhs, rhs) => rhs.createdAt - lhs.createdAt)
|
|
301
|
-
)
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
balance(selector: AssetSelector): Observable<Balance> {
|
|
306
|
-
return this.store.changes$.pipe(
|
|
307
|
-
startWith(this.store.snapshot.balance[selector.toString()]),
|
|
308
|
-
filter(
|
|
309
|
-
it =>
|
|
310
|
-
it instanceof Balance &&
|
|
311
|
-
(!selector || it.asset.toString() == selector.toString())
|
|
312
|
-
),
|
|
313
|
-
map(it => it as Balance)
|
|
314
|
-
);
|
|
224
|
+
return this.store.changes$.pipe(orders(selector, this.store.snapshot));
|
|
315
225
|
}
|
|
316
226
|
|
|
317
227
|
history(
|
|
318
228
|
selector: InstrumentSelector,
|
|
319
229
|
timeframe: number,
|
|
320
230
|
length: number
|
|
321
|
-
): Observable<Candle
|
|
231
|
+
): Observable<Readonly<Candle>> {
|
|
322
232
|
return this.store.changes$.pipe(
|
|
323
|
-
startWith(this.store.snapshot.universe.instrument
|
|
324
|
-
filter(it => it instanceof Instrument && it.
|
|
233
|
+
startWith(this.store.snapshot.universe.instrument.get(selector.id)),
|
|
234
|
+
filter(it => it instanceof Instrument && it.id == selector.id),
|
|
325
235
|
switchMap(() =>
|
|
326
236
|
from(this.aggregate.history({ instrument: selector, timeframe, length }))
|
|
327
237
|
),
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
import { State } from '../store';
|
|
4
|
+
import { Asset } from './asset';
|
|
5
|
+
import { Component } from './component';
|
|
6
|
+
import { Instrument } from './instrument';
|
|
7
|
+
import { Trade } from './trade';
|
|
8
|
+
import { trade } from './trade.operator';
|
|
9
|
+
|
|
10
|
+
describe('trade', () => {
|
|
11
|
+
const instrument = new Instrument(
|
|
12
|
+
new Asset('abc', 'xyz', 4),
|
|
13
|
+
new Asset('def', 'xyz', 4),
|
|
14
|
+
'abc-def'
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const state = new State();
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
state.trade.upsert(new Trade(instrument));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('should pipe an orderbook on subscription', done => {
|
|
24
|
+
new Subject<Component>().pipe(trade(instrument, state)).subscribe({
|
|
25
|
+
next: it => {
|
|
26
|
+
expect(it.id).toEqual(instrument.id);
|
|
27
|
+
done();
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { filter, map, Observable, startWith } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
import { State } from '../store';
|
|
4
|
+
import { Component } from './component';
|
|
5
|
+
import { InstrumentSelector } from './instrument';
|
|
6
|
+
import { Trade } from './trade';
|
|
7
|
+
|
|
8
|
+
export function trade(selector: InstrumentSelector, state: State) {
|
|
9
|
+
return (source$: Observable<Component>) =>
|
|
10
|
+
source$.pipe(
|
|
11
|
+
startWith(state.trade.get(selector.id)),
|
|
12
|
+
filter(it => it instanceof Trade && it.instrument.id == selector.id),
|
|
13
|
+
map(it => it as Trade)
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Asset } from './asset';
|
|
2
|
+
import { Instrument } from './instrument';
|
|
3
|
+
import { Trade } from './trade';
|
|
4
|
+
|
|
5
|
+
describe('Trade', () => {
|
|
6
|
+
const instrument = new Instrument(
|
|
7
|
+
new Asset('abc', 'xyz', 4),
|
|
8
|
+
new Asset('def', 'xyz', 4),
|
|
9
|
+
'abc-def'
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
test('should construct an empty trade', () => {
|
|
13
|
+
const sut = new Trade(instrument);
|
|
14
|
+
|
|
15
|
+
expect(sut.id).toEqual(instrument.id);
|
|
16
|
+
});
|
|
17
|
+
});
|
package/src/domain/trade.ts
CHANGED
|
@@ -7,12 +7,15 @@ import { Component } from './component';
|
|
|
7
7
|
* and seller of the same asset.
|
|
8
8
|
*/
|
|
9
9
|
export class Trade implements Component {
|
|
10
|
+
id: string;
|
|
10
11
|
kind = 'trade';
|
|
11
12
|
timestamp: timestamp;
|
|
12
13
|
rate: number;
|
|
13
14
|
quantity: number;
|
|
14
15
|
|
|
15
|
-
constructor(public readonly instrument: Instrument) {
|
|
16
|
+
constructor(public readonly instrument: Instrument) {
|
|
17
|
+
this.id = instrument.id;
|
|
18
|
+
}
|
|
16
19
|
|
|
17
20
|
toString() {
|
|
18
21
|
return this.instrument.toString();
|
|
@@ -2,7 +2,7 @@ import { from } from 'rxjs';
|
|
|
2
2
|
|
|
3
3
|
import { crossover, crossunder } from './cross';
|
|
4
4
|
|
|
5
|
-
describe('crossunder
|
|
5
|
+
describe('crossunder', () => {
|
|
6
6
|
test('should crossunder uptrend once', done => {
|
|
7
7
|
from([1, 2, 3, 4, 5])
|
|
8
8
|
.pipe(
|
|
@@ -76,7 +76,7 @@ describe('crossunder tests', () => {
|
|
|
76
76
|
});
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
describe('crossover
|
|
79
|
+
describe('crossover', () => {
|
|
80
80
|
test('should crossover downtrend once', done => {
|
|
81
81
|
from([5, 4, 3, 2, 1])
|
|
82
82
|
.pipe(
|
|
@@ -2,7 +2,7 @@ import { from } from 'rxjs';
|
|
|
2
2
|
|
|
3
3
|
import { trailingdown, trailingup } from './trailing';
|
|
4
4
|
|
|
5
|
-
describe('
|
|
5
|
+
describe('trailingup', () => {
|
|
6
6
|
test('should trigger uptrend once', done => {
|
|
7
7
|
let triggered = false;
|
|
8
8
|
|
|
@@ -38,7 +38,7 @@ describe('trailing up tests', () => {
|
|
|
38
38
|
});
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
describe('trailingdown
|
|
41
|
+
describe('trailingdown', () => {
|
|
42
42
|
test('should trigger downtrend once', done => {
|
|
43
43
|
let triggered = false;
|
|
44
44
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class Set<T extends { id: string }> {
|
|
2
|
+
private readonly array: Array<T> = [];
|
|
3
|
+
|
|
4
|
+
constructor(values?: ReadonlyArray<T>) {
|
|
5
|
+
if (values) {
|
|
6
|
+
values.forEach(it => this.upsert(it));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
get(id: string) {
|
|
11
|
+
return this.array.find(it => it.id == id);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
tryGetOrSet(id: string, setter: () => T): T {
|
|
15
|
+
return this.get(id) ?? this.upsert(setter());
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
upsert(value: T) {
|
|
19
|
+
this.array.forEach((it, idx) => {
|
|
20
|
+
if (it.id == value.id) {
|
|
21
|
+
this.array[idx] = value;
|
|
22
|
+
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
this.array.push(value);
|
|
28
|
+
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
asReadonlyArray(): ReadonlyArray<T> {
|
|
33
|
+
return this.array;
|
|
34
|
+
}
|
|
35
|
+
}
|
package/src/shared/datetime.ts
CHANGED
|
@@ -3,15 +3,3 @@ export type timestamp = number;
|
|
|
3
3
|
export function now(): timestamp {
|
|
4
4
|
return new Date().getTime();
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
export function toString(timestamp: timestamp): string {
|
|
8
|
-
const date = new Date(timestamp);
|
|
9
|
-
const day = ('0' + date.getDate()).slice(-2);
|
|
10
|
-
const month = ('0' + (date.getMonth() + 1)).slice(-2);
|
|
11
|
-
const year = date.getFullYear();
|
|
12
|
-
const hours = ('0' + date.getHours()).slice(-2);
|
|
13
|
-
const minutes = ('0' + date.getMinutes()).slice(-2);
|
|
14
|
-
const seconds = ('0' + date.getSeconds()).slice(-2);
|
|
15
|
-
|
|
16
|
-
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
17
|
-
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ceil, fixed, floor, precision } from './decimals';
|
|
2
2
|
|
|
3
|
-
describe('decimals
|
|
3
|
+
describe('decimals', () => {
|
|
4
4
|
test('get precision tests', () => {
|
|
5
5
|
expect(precision(0.01)).toEqual(2);
|
|
6
6
|
expect(precision(0.0054)).toEqual(4);
|
|
@@ -14,6 +14,7 @@ describe('decimals tests', () => {
|
|
|
14
14
|
expect(fixed(0.011, 2)).toEqual(0.01);
|
|
15
15
|
expect(fixed(0.019, 2)).toEqual(0.01);
|
|
16
16
|
expect(fixed(0.019, 0)).toEqual(0);
|
|
17
|
+
expect(fixed(0.00000058, 8)).toEqual(0.00000058);
|
|
17
18
|
});
|
|
18
19
|
|
|
19
20
|
test('floor tests', () => {
|
package/src/shared/decimals.ts
CHANGED
|
@@ -50,7 +50,10 @@ export function ceil(number: number, precision: number): number {
|
|
|
50
50
|
* @returns rounded number
|
|
51
51
|
*/
|
|
52
52
|
export function fixed(number: number, precision: number): number {
|
|
53
|
-
return
|
|
53
|
+
return (
|
|
54
|
+
Math.floor((number + Number.EPSILON) * Math.pow(10, precision)) /
|
|
55
|
+
Math.pow(10, precision)
|
|
56
|
+
);
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
export function weightedMean(values: number[], weights: number[]) {
|
|
@@ -69,11 +72,8 @@ export function weightedMean(values: number[], weights: number[]) {
|
|
|
69
72
|
return result[0] / result[1];
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
export function pnl(entryRate: number, exitRate: number,
|
|
73
|
-
|
|
74
|
-
const unrealized = size * exitRate;
|
|
75
|
-
|
|
76
|
-
return unrealized - cost;
|
|
75
|
+
export function pnl(entryRate: number, exitRate: number, amount: number) {
|
|
76
|
+
return (exitRate / entryRate - 1) * amount;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
/**
|
package/src/shared/index.ts
CHANGED
package/src/shared/io.ts
CHANGED
package/src/shared/policy.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import * as hash from 'object-hash';
|
|
2
1
|
import { retryAsync } from 'ts-retry';
|
|
3
2
|
|
|
4
3
|
export function retry<T>(fn: () => Promise<T>): Promise<T> {
|
|
5
4
|
return retryAsync(fn, { delay: 1000, maxTry: 3 });
|
|
6
5
|
}
|
|
7
|
-
|
|
8
|
-
const inMemoryCache: Record<string, any> = {};
|
|
9
|
-
|
|
10
|
-
export async function cache<T>(key: any, fn: () => Promise<T>): Promise<T> {
|
|
11
|
-
const hashed = hash(key);
|
|
12
|
-
|
|
13
|
-
if (inMemoryCache[hashed]) {
|
|
14
|
-
return inMemoryCache[hashed];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return (inMemoryCache[hashed] = await fn());
|
|
18
|
-
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Cache } from './cache';
|
|
2
|
+
import { InMemoryStorage } from './storage';
|
|
3
|
+
|
|
4
|
+
describe('Cache', () => {
|
|
5
|
+
test('should return cached value', async () => {
|
|
6
|
+
const cache = new Cache(new InMemoryStorage());
|
|
7
|
+
|
|
8
|
+
const value1 = await cache.tryGet(() => Promise.resolve('quantform-1'), {
|
|
9
|
+
key: 'test'
|
|
10
|
+
});
|
|
11
|
+
const value2 = await cache.tryGet(() => Promise.resolve('quantform-2'), {
|
|
12
|
+
key: 'test'
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
expect(value1).toEqual('quantform-1');
|
|
16
|
+
expect(value2).toEqual('quantform-1');
|
|
17
|
+
});
|
|
18
|
+
});
|
package/src/storage/cache.ts
CHANGED