Guest User

Untitled

a guest
Nov 5th, 2023
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. import type { AppRouter } from '@server/routers';
  2. import type { Backtest } from '@server/routers/backtest';
  3. import type { Execution } from '@server/routers/execution';
  4. import type { TRPCClientErrorLike } from '@trpc/client';
  5. import type { UseTRPCQueryResult } from '@trpc/react-query/shared';
  6. import { subDays } from 'date-fns';
  7. import type Decimal from 'decimal.js';
  8. import { useTheme } from 'next-themes';
  9. import { useEffect, useMemo, useRef, useState } from 'react';
  10. import { Line, LineChart, ReferenceLine, ResponsiveContainer, YAxis } from 'recharts';
  11.  
  12. import { BacktestStatus, ExecutionStatus, ExecutionType } from '@cybotrade/core';
  13.  
  14. import { calculatePerformance } from '@/lib/calculation';
  15. import { Skeleton } from '@/ui';
  16. import { trpcVanilla } from '@/utils/trpc';
  17.  
  18. type EquityCurveRendererProps = {
  19. backtests: UseTRPCQueryResult<Backtest[], TRPCClientErrorLike<AppRouter>>;
  20. executions: UseTRPCQueryResult<Execution[], TRPCClientErrorLike<AppRouter>>;
  21. };
  22.  
  23. export const EquityCurveRenderer = ({ backtests, executions }: EquityCurveRendererProps) => {
  24. const { theme } = useTheme();
  25. const isDarkTheme = theme === 'dark';
  26.  
  27. const [backtestHistories, setBacktestHistories] = useState<
  28. {
  29. id: string;
  30. equity: { name: number; equity: Decimal }[];
  31. createdAt: Date;
  32. }[]
  33. >([]);
  34. const [executionHistories, setExecutionHistories] = useState<
  35. {
  36. id: string;
  37. equity: { name: number; equity: Decimal }[];
  38. createdAt: Date;
  39. }[]
  40. >([]);
  41. // const [chartData, setChartData] = useState<
  42. // {
  43. // name: number;
  44. // equity: Decimal;
  45. // }[]
  46. // >([]);
  47. const [isLoading, setLoading] = useState(true);
  48. const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
  49.  
  50. useEffect(() => {
  51. // heavy calculation
  52. }, [backtests.data]);
  53.  
  54. useEffect(() => {
  55. // heavy calculation
  56. }, [executions.data]);
  57.  
  58. const chartData = useMemo(
  59. () =>
  60. [...backtestHistories, ...executionHistories]
  61. .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
  62. .flatMap(({ equity }) => equity),
  63. [backtestHistories, executionHistories],
  64. );
  65.  
  66. return (
  67. <div className="flex mx-auto max-w-[150px] h-[80px]">
  68. <ResponsiveContainer width="100%" height="100%">
  69. <LineChart data={chartData}>
  70. <ReferenceLine y={chartData?.[0]?.equity.toNumber() || 0} stroke="black" />
  71.  
  72. <YAxis domain={['dataMin', 'dataMax']} hide={true} />
  73. <Line
  74. type="monotone"
  75. dataKey="equity"
  76. dot={false}
  77. stroke={isDarkTheme ? '#00FC65' : '#FC9E26'}
  78. // stroke="#FC9E26"
  79. />
  80. </LineChart>
  81. </ResponsiveContainer>
  82. </div>
  83. );
  84. };
  85.  
Advertisement
Add Comment
Please, Sign In to add comment