Skip to content

Commit 0cf6ef5

Browse files
author
Karl Ranna
committed
feat: dynamic minimum quantity
1 parent 6f14f0a commit 0cf6ef5

14 files changed

+218
-298
lines changed

src/arby.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export const startArby = ({
102102
loggers.global.info('Starting. Hello, Arby.');
103103
logConfig(config, loggers.global);
104104
verifyMarkets(config, CEXmarkets);
105+
store.setMarkets(CEXmarkets);
105106
const tradeComplete$ = trade$({
106107
config,
107108
loggers,

src/centralized/__snapshots__/minimum-order-quantity-filter.spec.ts.snap

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/centralized/ccxt/create-order.spec.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ describe('CCXT', () => {
2727
},
2828
};
2929
const expectedSymbol = `${config.CEX_BASEASSET}/${config.CEX_QUOTEASSET}`;
30-
const sellOrder$ = createOrder$({
30+
const sellOrder$ = createOrder$(
3131
config,
3232
exchange,
33-
side: OrderSide.SELL,
34-
quantity: orderQuantity,
35-
});
33+
OrderSide.SELL,
34+
orderQuantity
35+
);
3636
sellOrder$.subscribe({
3737
next: actualOrderResponse => {
3838
expect(actualOrderResponse).toEqual(orderResponse);
@@ -68,12 +68,12 @@ describe('CCXT', () => {
6868
};
6969
orderQuantity = new BigNumber('0.12345678');
7070
const expectedSymbol = `${config.CEX_BASEASSET}/${config.CEX_QUOTEASSET}`;
71-
const buyOrder$ = createOrder$({
71+
const buyOrder$ = createOrder$(
7272
config,
7373
exchange,
74-
side: OrderSide.BUY,
75-
quantity: orderQuantity,
76-
});
74+
OrderSide.BUY,
75+
orderQuantity
76+
);
7777
buyOrder$.subscribe({
7878
next: actualOrderResponse => {
7979
expect(actualOrderResponse).toEqual(orderResponse);
@@ -108,12 +108,12 @@ describe('CCXT', () => {
108108
},
109109
};
110110
const expectedSymbol = `${config.CEX_BASEASSET}/${config.CEX_QUOTEASSET}`;
111-
const buyOrder$ = createOrder$({
111+
const buyOrder$ = createOrder$(
112112
config,
113113
exchange,
114-
side: OrderSide.BUY,
115-
quantity: orderQuantity,
116-
});
114+
OrderSide.BUY,
115+
orderQuantity
116+
);
117117
buyOrder$.subscribe({
118118
next: actualOrderResponse => {
119119
expect(actualOrderResponse).toEqual(orderResponse);
@@ -150,12 +150,12 @@ describe('CCXT', () => {
150150
},
151151
};
152152
const expectedSymbol = `${config.CEX_BASEASSET}/${config.CEX_QUOTEASSET}`;
153-
const sellOrder$ = createOrder$({
153+
const sellOrder$ = createOrder$(
154154
config,
155155
exchange,
156-
side: OrderSide.SELL,
157-
quantity: orderQuantity,
158-
});
156+
OrderSide.SELL,
157+
orderQuantity
158+
);
159159
sellOrder$.subscribe({
160160
next: actualOrderResponse => {
161161
expect(actualOrderResponse).toEqual(orderResponse);

src/centralized/ccxt/create-order.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,12 @@ import BigNumber from 'bignumber.js';
44
import { Observable, from, defer } from 'rxjs';
55
import { Config } from '../../config';
66

7-
type CreateOrderParams = {
8-
config: Config;
9-
exchange: Exchange;
10-
side: OrderSide;
11-
quantity: BigNumber;
12-
};
13-
14-
const createOrder$ = ({
15-
config,
16-
exchange,
17-
side,
18-
quantity,
19-
}: CreateOrderParams): Observable<Order> => {
7+
const createOrder$ = (
8+
config: Config,
9+
exchange: Exchange,
10+
side: OrderSide,
11+
quantity: BigNumber
12+
): Observable<Order> => {
2013
return defer(() => {
2114
const price = undefined;
2215
const params =
@@ -33,4 +26,6 @@ const createOrder$ = ({
3326
});
3427
};
3528

29+
type CreateOrderParams = Parameters<typeof createOrder$>;
30+
3631
export { createOrder$, CreateOrderParams };

src/centralized/execute-order.spec.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ const assertExecuteCEXorder = (
2626
return (cold(inputEvents.createOrder$) as unknown) as Observable<Order>;
2727
};
2828
const CEX = (null as unknown) as Exchange;
29-
const CEXorder$ = executeCEXorder$({
29+
const CEXorder$ = executeCEXorder$(
3030
CEX,
31-
config: inputEvents.config,
32-
logger: getLoggers().centralized,
33-
price: inputEvents.price,
34-
order: inputEvents.order,
35-
createOrder$,
36-
});
31+
inputEvents.config,
32+
getLoggers().centralized,
33+
inputEvents.price,
34+
inputEvents.order,
35+
createOrder$
36+
);
3737
expectObservable(CEXorder$, inputEvents.unsubscribe).toBe(expected, {
3838
a: null,
3939
});

src/centralized/execute-order.ts

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,19 @@ import { Logger } from '../logger';
1414
import { CreateOrderParams } from './ccxt/create-order';
1515
import { CEXorder } from './order-builder';
1616

17-
type ExecuteCEXorderParams = {
18-
CEX: Exchange;
19-
config: Config;
20-
logger: Logger;
21-
price: BigNumber;
22-
order: CEXorder;
23-
createOrder$: ({
24-
config,
25-
exchange,
26-
side,
27-
quantity,
28-
}: CreateOrderParams) => Observable<Order>;
29-
};
30-
31-
const executeCEXorder$ = ({
32-
CEX,
33-
config,
34-
logger,
35-
price,
36-
order,
37-
createOrder$,
38-
}: ExecuteCEXorderParams): Observable<null> => {
17+
const executeCEXorder$ = (
18+
CEX: Exchange,
19+
config: Config,
20+
logger: Logger,
21+
price: BigNumber,
22+
order: CEXorder,
23+
createOrder$: (...args: CreateOrderParams) => Observable<Order>
24+
): Observable<null> => {
3925
if (!config.TEST_MODE) {
4026
logger.info(
4127
`Starting centralized exchange ${config.CEX_BASEASSET}/${config.CEX_QUOTEASSET} market ${order.side} order (quantity: ${order.quantity})`
4228
);
43-
return createOrder$({
44-
exchange: CEX,
45-
config,
46-
side: order.side,
47-
quantity: order.quantity,
48-
}).pipe(
29+
return createOrder$(config, CEX, order.side, order.quantity).pipe(
4930
tap(order =>
5031
logger.info(
5132
`Centralized exchange order finished: ${JSON.stringify(order)}`
@@ -77,4 +58,6 @@ const executeCEXorder$ = ({
7758
}
7859
};
7960

61+
type ExecuteCEXorderParams = Parameters<typeof executeCEXorder$>;
62+
8063
export { executeCEXorder$, ExecuteCEXorderParams };

src/centralized/minimum-order-quantity-filter.spec.ts

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
1-
import BigNumber from 'bignumber.js';
2-
import { errors } from '../opendex/errors';
1+
import { BigNumber } from 'bignumber.js';
2+
import { curry } from 'ramda';
3+
import { EMPTY, Observable, of } from 'rxjs';
4+
import { mergeMap, take } from 'rxjs/operators';
5+
import { Logger } from '../logger';
6+
import { ArbyStore } from '../store';
37

4-
type MinimumCEXquantities = {
5-
[key: string]: BigNumber;
6-
};
7-
8-
const MINIMUM_ORDER_SIZE: MinimumCEXquantities = {
9-
BTC: new BigNumber('0.001'),
10-
ETH: new BigNumber('0.05'),
11-
DAI: new BigNumber('15'),
12-
USDT: new BigNumber('15'),
13-
};
14-
15-
const getMinimumOrderSize = (asset: string): BigNumber => {
16-
const minimumOrderSize = MINIMUM_ORDER_SIZE[asset];
17-
if (!minimumOrderSize) {
18-
throw errors.CEX_INVALID_MINIMUM_ORDER_QUANTITY(asset);
8+
const quantityAboveMinimum = curry(
9+
(
10+
store: ArbyStore,
11+
logger: Logger,
12+
assetToTradeOnCEX: string,
13+
minimumQuantity$: Observable<BigNumber>,
14+
quantity: BigNumber
15+
) => {
16+
logger.info(
17+
`Swap success. Accumulated ${assetToTradeOnCEX} quantity: ${quantity.toFixed()}`
18+
);
19+
store.resetLastOrderUpdatePrice();
20+
return minimumQuantity$.pipe(
21+
take(1),
22+
mergeMap(minimumQuantity => {
23+
if (quantity.isGreaterThanOrEqualTo(minimumQuantity)) {
24+
return of(quantity);
25+
}
26+
logger.info(
27+
`Will not execute CEX order because ${quantity.toFixed()} is below the minimum allowed CEX quantity ${minimumQuantity.toFixed()}`
28+
);
29+
return EMPTY;
30+
})
31+
);
1932
}
20-
return minimumOrderSize;
21-
};
22-
23-
const quantityAboveMinimum = (asset: string) => {
24-
return (quantity: BigNumber): boolean => {
25-
return quantity.isGreaterThanOrEqualTo(getMinimumOrderSize(asset));
26-
};
27-
};
33+
);
2834

29-
export { quantityAboveMinimum, MINIMUM_ORDER_SIZE };
35+
export { quantityAboveMinimum };

0 commit comments

Comments
 (0)