import * as React from "react";
import { YMDHms } from "@utils/time";
import { toUpper, map as RDmap, clone } from "ramda";
import { OrderSideEnum, OrderTypeEnum, PositionSideEnum } from "@shared/types";
import {
getIncomeTypeLabel,
getMarginTypeLabel,
getOrderStatusLabel,
getOrderTypeLabel,
getSideTypeLabel
} from "@components/OrderList/columnConfigs/mappings";
import { formatFloor, formatMoney, toDefaultNumber } from "@utils/FormatNumber";
import { PositionColumnsDelivery } from "@components/OrderList/columnComps/PositionColumnsDelivery";
import { PositionColumnsLeverage } from "@components/OrderList/columnComps/PositionColumnsLeverage";
import { PositionColumnsPosMargin } from "@components/OrderList/columnComps/PositionColumnsPosMargin";
import Button from "@components/Button";
import { getValueByContr } from "@utils/contractRules";
export const settingMaps: any = {
createTime: {
code: "createTime",
name: "时间",
width: 120,
render(value: any): React.ReactNode {
return
{YMDHms(value)}
;
}
},
positionSymbol: {
code: "symbol",
name: "合约",
width: 100,
render(value: any, row: any): React.ReactNode {
const isLong = row?.positionSide === PositionSideEnum.Long;
return (
{toUpper(value)} {getMarginTypeLabel(row?.marginType)}
);
}
},
symbol: {
code: "symbol",
name: "合约",
width: 70,
render(value: any): React.ReactNode {
return {toUpper(value)}
;
}
},
orderType: {
code: "orderType",
name: "交易类型",
width: 60,
render(value: OrderTypeEnum): React.ReactNode {
return {getOrderTypeLabel(value)}
;
}
},
side: {
code: "side",
name: "方向",
width: 40,
render(value: any, row: any): React.ReactNode {
const isBuy = value === OrderSideEnum.Buy;
return (
{getSideTypeLabel(value, row.positionSide)}
);
}
},
price: {
code: "price",
name: "价格",
width: 80,
render(value: any): React.ReactNode {
return {formatMoney(formatFloor(value, 2))}
;
}
},
orderQty: {
code: "orderQty",
name: "数量",
width: 80,
render(value: any, row: any): React.ReactNode {
return {`${formatFloor(value, 3)} ${toUpper(row?.base || "")}`}
;
}
},
leverage: {
code: "leverage",
name: "杠杆",
width: 60,
render(value: any, row: any): React.ReactNode {
return (
);
}
},
positionAmt: {
code: "positionAmt",
name: `数量`,
width: 80,
render(value: any, row: any): React.ReactNode {
const isLong = row?.positionSide === PositionSideEnum.Long;
return (
{getValueByContr({ value, multiplier: row?.pair?.ctVal, scale: row?.pair?.ctValScale })} {row?.base}
);
}
},
avgEntryPrice: {
code: "avgEntryPrice",
name: "开仓均价",
width: 80,
render(value: any, row: any): React.ReactNode {
return {formatMoney(formatFloor(value, row?.pair?.tickSizeScale))}
;
}
},
markPrice: {
code: "markPrice",
name: "标记价格",
width: 80,
render(value: any, row: any): React.ReactNode {
return {formatMoney(formatFloor(value, row?.pair?.tickSizeScale))}
;
}
},
liquidationPrice: {
code: "liquidationPrice",
name: "强平价格",
width: 80,
render(value: any, row: any): React.ReactNode {
return {formatMoney(formatFloor(value, row?.pair?.tickSizeScale))}
;
}
},
posMargin: {
code: "posMargin",
name: "保证金",
width: 70,
render(value: any, row: any): React.ReactNode {
return ;
}
},
posMarginRate: { code: "posMarginRate", name: "保证金比率", width: 100 },
unrealisedPnl: {
code: "unrealisedPnl",
name: "未实现盈亏(回报率%)",
width: 150,
render(value: any, row: any): React.ReactNode {
const isNegative = toDefaultNumber(value) < 0;
const { quote, earningRate } = row;
return (
{`${formatMoney(formatFloor(value, row?.pair?.costSizeScale))} ${toUpper(quote)}`}
{`(${isNegative ? "" : "+"}${formatFloor(earningRate, 2)}%)`}
);
}
},
positionDelivery: {
code: "positionDelivery",
name: "仓位止盈止损",
width: 100,
render(value: any, row: any): React.ReactNode {
return (
);
}
},
cumQty: {
code: "cumQty",
name: "成交数量",
width: 80,
render(value: any, row: any): React.ReactNode {
return {`${formatFloor(value, 3)} ${toUpper(row?.base || "")}`}
;
}
},
postOnly: {
code: "postOnly",
name: "被动订单",
width: 80,
render(value: any): React.ReactNode {
return {value ? "是" : "否"}
;
}
},
marginType: {
code: "marginType",
name: "仓位模式",
width: 100,
render(value: any): React.ReactNode {
return {value}
;
}
},
avgPrice: {
code: "avgPrice",
name: "成交均价",
width: 80,
render(value: any): React.ReactNode {
return {formatMoney(formatFloor(value, 2))}
;
}
},
filledPrice: {
code: "filledPrice",
name: "成交均价",
width: 80,
render(value: any): React.ReactNode {
return {formatMoney(formatFloor(value, 2))}
;
}
},
commission: {
code: "commission",
name: "手续费",
width: 80,
render(value: any, row: any): React.ReactNode {
return (
{formatFloor(value)} {row?.commissionAsset}
);
}
},
positionQty: {
code: "positionQty",
name: "最大持仓量",
width: 80,
render(value: any): React.ReactNode {
return {formatFloor(value, 3)}
;
}
},
realProfit: {
code: "realProfit",
name: "已实现盈亏",
width: 100,
render(value: any, row: any): React.ReactNode {
return (
{formatMoney(formatFloor(value))} {row.commissionAsset}
);
}
},
closeProfit: {
code: "realProfit",
name: "平仓收益",
width: 100,
render(value: any, row: any): React.ReactNode {
return (
{formatMoney(formatFloor(value))} {row.commissionAsset}
);
}
},
incomeType: {
code: "incomeType",
name: "类型",
width: 60,
render(value: any): React.ReactNode {
return {getIncomeTypeLabel(value)}
;
}
},
conditionalPrice: {
code: "conditionalPrice",
name: "触发条件",
width: 80,
render(): React.ReactNode {
return {"最新价格 ≥ 19,998.00"}
;
}
},
oneKeyClose: {
code: "oneKeyClose",
name: (一键平仓
) as any,
align: "right",
width: 100,
render(): React.ReactNode {
return (
市价全平
);
}
},
killAllOrders: {
code: "killAllOrders",
name: (
{
console.log(`全部撤单`);
}}
>{`全部撤单`}
) as any,
align: "right",
width: 80,
render(): React.ReactNode {
return ;
}
},
closingTime: {
code: "closingTime",
name: "仓位关闭时间",
width: 80,
render(value: any): React.ReactNode {
return {YMDHms(value)}
;
}
},
marginCloseOutAmt: {
code: "marginCloseOutAmt",
name: "强平数量",
width: 80,
render(value: any, row: any): React.ReactNode {
return (
{formatFloor(value, 3)} {row?.quote || ""}
);
}
},
income: {
code: "income",
name: "总额",
align: "right",
width: 60,
render(value: any, row: any): React.ReactNode {
console.log(row);
const positive = Number(value) >= 0;
return (
{positive ? "+" : ""}
{formatMoney(formatFloor(value))} {row?.currency}
);
}
},
orderStatus: {
code: "orderStatus",
name: "状态",
width: 100,
render(value: any): React.ReactNode {
return {getOrderStatusLabel(value)}
;
}
},
filledQty: {
code: "filledQty",
name: "数量",
width: 80,
render(value: any, row: any): React.ReactNode {
return {`${formatFloor(value, 3)} ${toUpper(row?.base || "")}`}
;
}
},
taker: {
code: "taker",
name: "角色",
width: 80,
render(value: any): React.ReactNode {
return {`${value ? "吃单方" : "挂单方"}`}
;
}
}
};
export const getColumn = (code: string) => settingMaps[code];
export const getColumns = (codes: Array) => RDmap(getColumn, codes);
export const getConditionalColumns = (needToBeClone: Array) => {
const _clonedColumns = clone(needToBeClone);
const _len = _clonedColumns.length;
_clonedColumns.splice(_len - 2, 0, getColumn("conditionalPrice"));
return _clonedColumns;
};