implement market order for spot

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2021-12-06 21:16:01 +01:00
parent 62e7da44cf
commit 3d07818fda
1 changed files with 46 additions and 5 deletions

View File

@ -408,10 +408,11 @@ class MangoSimpleClient {
clientOrderId
);
} else {
if (orderType === "market") {
// todo
throw new Error("Not implemented!");
}
// serum doesn't really support market orders, calculate a pseudo market price
price =
orderType !== "market"
? price
: await this.calculateMarketOrderPrice(market, quantity, side);
const spotMarketConfig = getMarketByBaseSymbolAndKind(
this.mangoGroupConfig,
@ -433,12 +434,51 @@ class MangoSimpleClient {
side,
price,
quantity,
orderType,
orderType === "market" ? "limit" : orderType,
new BN(clientOrderId)
);
}
}
private async calculateMarketOrderPrice(
market: string,
quantity: number,
side: "buy" | "sell"
): Promise<number> {
const bidsAndAsks = await this.fetchAllBidsAndAsks(false, market);
const bids = bidsAndAsks
.flat()
.filter((orderInfo) => orderInfo.order.side === "buy")
.sort((b1, b2) => b2.order.price - b1.order.price);
const asks = bidsAndAsks
.flat()
.filter((orderInfo) => orderInfo.order.side === "sell")
.sort((a1, a2) => a1.order.price - a2.order.price);
const orders: OrderInfo[] = side === "buy" ? asks : bids;
let acc = 0;
let selectedOrder;
for (const order of orders) {
acc += order.order.size;
if (acc >= quantity) {
selectedOrder = order;
break;
}
}
if (!selectedOrder) {
throw new Error("Orderbook empty!");
}
if (side === "buy") {
return selectedOrder.order.price * 1.05;
} else {
return selectedOrder.order.price * 0.95;
}
}
public async cancelAllOrders(): Promise<void> {
const allMarkets = await this.fetchAllMarkets();
const orders = (await this.fetchAllBidsAndAsks(true)).flat();
@ -768,6 +808,7 @@ class MangoSimpleClient {
return transaction;
}
// todo remove
private roundRobinClusterUrl() {
if (process.env.CLUSTER_URL) {
return;