From ec3ac4e0778d15004d6288c4e36aa2a7a963c423 Mon Sep 17 00:00:00 2001 From: c9s Date: Mon, 27 Jun 2022 16:17:06 +0800 Subject: [PATCH] backtest: pull out OrderListTable --- .../components/OrderListTable.tsx | 64 ++++++++++++++++ .../components/TradingViewChart.tsx | 75 +------------------ apps/backtest-report/types/index.ts | 2 + apps/backtest-report/types/order.ts | 14 ++++ 4 files changed, 84 insertions(+), 71 deletions(-) create mode 100644 apps/backtest-report/components/OrderListTable.tsx create mode 100644 apps/backtest-report/types/order.ts diff --git a/apps/backtest-report/components/OrderListTable.tsx b/apps/backtest-report/components/OrderListTable.tsx new file mode 100644 index 000000000..efaa0d721 --- /dev/null +++ b/apps/backtest-report/components/OrderListTable.tsx @@ -0,0 +1,64 @@ +import {Checkbox, Group, Table} from "@mantine/core"; +import React, {useState} from "react"; +import {Order} from "../types"; + +interface OrderListTableProps { + orders: Order[]; + onClick?: (order: Order) => void; +} + +const OrderListTable = (props: OrderListTableProps) => { + let orders = props.orders; + const [showCanceledOrders, setShowCanceledOrders] = useState(false); + + if (!showCanceledOrders) { + orders = orders.filter((order: Order) => { + return order.status != "CANCELED" + }) + } + + const rows = orders.map((order: Order) => ( + { + props.onClick ? props.onClick(order) : null; + const nodes = e.currentTarget?.parentNode?.querySelectorAll(".selected") + nodes?.forEach((node, i) => { + node.classList.remove("selected") + }) + e.currentTarget.classList.add("selected") + }}> + {order.order_id} + {order.symbol} + {order.side} + {order.order_type} + {order.price} + {order.quantity} + {order.status} + {order.creation_time.toString()} + + )); + + return
+ + setShowCanceledOrders(event.currentTarget.checked)}/> + + + + + + + + + + + + + + + + {rows} +
Order IDSymbolSideOrder TypePriceQuantityStatusCreation Time
+
+} + +export default OrderListTable; diff --git a/apps/backtest-report/components/TradingViewChart.tsx b/apps/backtest-report/components/TradingViewChart.tsx index f3193781e..5884e7d0d 100644 --- a/apps/backtest-report/components/TradingViewChart.tsx +++ b/apps/backtest-report/components/TradingViewChart.tsx @@ -5,10 +5,12 @@ import {Checkbox, Group, SegmentedControl, Table} from '@mantine/core'; // https://github.com/tradingview/lightweight-charts/issues/543 // const createChart = dynamic(() => import('lightweight-charts')); import {createChart, CrosshairMode, MouseEventParams, TimeRange} from 'lightweight-charts'; -import {ReportSummary} from "../types"; +import {ReportSummary, Order} from "../types"; import moment from "moment"; import {format} from 'date-fns'; +import OrderListTable from './OrderListTable'; + // See https://codesandbox.io/s/ve7w2?file=/src/App.js import TimeRangeSlider from './TimeRangeSlider'; @@ -147,19 +149,6 @@ const parseInterval = (s: string) => { return 60; }; -interface Order { - order_id: number; - order_type: string; - side: string; - symbol: string; - price: number; - quantity: number; - executed_quantity: number; - status: string; - update_time: Date; - creation_time: Date; - time?: Date; -} interface Marker { time: number; @@ -602,12 +591,7 @@ const TradingViewChart = (props: TradingViewChartProps) => { }} /> - - setShowCanceledOrders(event.currentTarget.checked)}/> - - - { + { console.log("selected order", order); const visibleRange = chart.current.timeScale().getVisibleRange() const seconds = parseInterval(currentInterval) @@ -626,57 +610,6 @@ const TradingViewChart = (props: TradingViewChartProps) => { ); }; -interface OrderListTableProps { - orders: Order[]; - showCanceled: boolean; - onClick?: (order: Order) => void; -} - -const OrderListTable = (props: OrderListTableProps) => { - let orders = props.orders; - - if (!props.showCanceled) { - orders = orders.filter((order: Order) => { - return order.status != "CANCELED" - }) - } - - const rows = orders.map((order: Order) => ( - { - props.onClick ? props.onClick(order) : null; - const nodes = e.currentTarget?.parentNode?.querySelectorAll(".selected") - nodes?.forEach((node, i) => { - node.classList.remove("selected") - }) - e.currentTarget.classList.add("selected") - }}> - {order.order_id} - {order.symbol} - {order.side} - {order.order_type} - {order.price} - {order.quantity} - {order.status} - {order.creation_time.toString()} - - )); - return - - - - - - - - - - - - - {rows} -
Order IDSymbolSideOrder TypePriceQuantityStatusCreation Time
-} - const calculateEMA = (a: KLine[], r: number) => { return a.map((k) => { return {time: k.time, value: k.close} diff --git a/apps/backtest-report/types/index.ts b/apps/backtest-report/types/index.ts index ee9c9f754..6fb98d13a 100644 --- a/apps/backtest-report/types/index.ts +++ b/apps/backtest-report/types/index.ts @@ -1 +1,3 @@ export * from './report'; +export * from './order'; +export * from './market'; diff --git a/apps/backtest-report/types/order.ts b/apps/backtest-report/types/order.ts new file mode 100644 index 000000000..b9045ccd4 --- /dev/null +++ b/apps/backtest-report/types/order.ts @@ -0,0 +1,14 @@ + +export interface Order { + order_id: number; + order_type: string; + side: string; + symbol: string; + price: number; + quantity: number; + executed_quantity: number; + status: string; + update_time: Date; + creation_time: Date; + time?: Date; +}