Files
auto-trade/lib/autotrade/executable-order-quantity.ts

57 lines
1.6 KiB
TypeScript
Raw Permalink Normal View History

2026-03-12 09:26:27 +09:00
export type ExecutableOrderSide = "buy" | "sell";
export interface ClampExecutableOrderQuantityParams {
side: ExecutableOrderSide;
requestedQuantity: number;
maxBuyQuantity?: number;
holdingQuantity?: number;
sellableQuantity?: number;
}
export interface ClampExecutableOrderQuantityResult {
ok: boolean;
quantity: number;
adjusted: boolean;
}
/**
* []
* (//) .
*
* [ -> -> ]
* // -> clamp ->
*/
export function clampExecutableOrderQuantity(
params: ClampExecutableOrderQuantityParams,
): ClampExecutableOrderQuantityResult {
const requestedQuantity = Math.max(0, Math.floor(params.requestedQuantity));
if (requestedQuantity <= 0) {
return {
ok: false,
quantity: 0,
adjusted: false,
};
}
if (params.side === "buy") {
const maxBuyQuantity = Math.max(0, Math.floor(params.maxBuyQuantity ?? 0));
const quantity = Math.min(requestedQuantity, maxBuyQuantity);
return {
ok: quantity > 0,
quantity,
adjusted: quantity !== requestedQuantity,
};
}
const holdingQuantity = Math.max(0, Math.floor(params.holdingQuantity ?? 0));
const sellableQuantity = Math.max(0, Math.floor(params.sellableQuantity ?? 0));
const maxSellQuantity = Math.min(holdingQuantity, sellableQuantity);
const quantity = Math.min(requestedQuantity, maxSellQuantity);
return {
ok: quantity > 0,
quantity,
adjusted: quantity !== requestedQuantity,
};
}