diff --git a/src/pages/visualizer/ConversionObservationsTable.tsx b/src/pages/visualizer/ConversionObservationsTable.tsx
new file mode 100644
index 0000000..03b92f9
--- /dev/null
+++ b/src/pages/visualizer/ConversionObservationsTable.tsx
@@ -0,0 +1,44 @@
+import { Table } from '@mantine/core';
+import { ReactNode } from 'react';
+import { TradingState } from '../../models.ts';
+import { formatNumber } from '../../utils/format.ts';
+import { SimpleTable } from './SimpleTable.tsx';
+
+export interface ConversionObservationsTableProps {
+ conversionObservations: TradingState['observations']['conversionObservations'];
+}
+
+export function ConversionObservationsTable({ conversionObservations }: ConversionObservationsTableProps): ReactNode {
+ const rows: ReactNode[] = [];
+ for (const [product, observation] of Object.entries(conversionObservations)) {
+ rows.push(
+
+ {product}
+ {formatNumber(observation.bidPrice)}
+ {formatNumber(observation.askPrice)}
+ {formatNumber(observation.transportFees)}
+ {formatNumber(observation.exportTariff)}
+ {formatNumber(observation.importTariff)}
+ {formatNumber(observation.sunlight)}
+ {formatNumber(observation.humidity)}
+ ,
+ );
+ }
+
+ return (
+
+ );
+}
diff --git a/src/pages/visualizer/PlainValueObservationsTable.tsx b/src/pages/visualizer/PlainValueObservationsTable.tsx
new file mode 100644
index 0000000..3fb1fba
--- /dev/null
+++ b/src/pages/visualizer/PlainValueObservationsTable.tsx
@@ -0,0 +1,23 @@
+import { Table } from '@mantine/core';
+import { ReactNode } from 'react';
+import { TradingState } from '../../models.ts';
+import { formatNumber } from '../../utils/format.ts';
+import { SimpleTable } from './SimpleTable.tsx';
+
+export interface PlainValueObservationsTableProps {
+ plainValueObservations: TradingState['observations']['plainValueObservations'];
+}
+
+export function PlainValueObservationsTable({ plainValueObservations }: PlainValueObservationsTableProps): ReactNode {
+ const rows: ReactNode[] = [];
+ for (const product of Object.keys(plainValueObservations)) {
+ rows.push(
+
+ {product}
+ {formatNumber(plainValueObservations[product])}
+ ,
+ );
+ }
+
+ return ;
+}
diff --git a/src/pages/visualizer/TimestampDetail.tsx b/src/pages/visualizer/TimestampDetail.tsx
index a8b2c19..fe6b1ac 100644
--- a/src/pages/visualizer/TimestampDetail.tsx
+++ b/src/pages/visualizer/TimestampDetail.tsx
@@ -4,9 +4,11 @@ import { ScrollableCodeHighlight } from '../../components/ScrollableCodeHighligh
import { AlgorithmDataRow } from '../../models.ts';
import { useStore } from '../../store.ts';
import { formatNumber } from '../../utils/format.ts';
+import { ConversionObservationsTable } from './ConversionObservationsTable.tsx';
import { ListingsTable } from './ListingsTable.tsx';
import { OrderDepthTable } from './OrderDepthTable.tsx';
import { OrdersTable } from './OrdersTable.tsx';
+import { PlainValueObservationsTable } from './PlainValueObservationsTable.tsx';
import { PositionTable } from './PositionTable.tsx';
import { ProfitLossTable } from './ProfitLossTable.tsx';
import { TradesTable } from './TradesTable.tsx';
@@ -63,6 +65,14 @@ export function TimestampDetail({
Orders
{}
+
+ Plain value observations
+
+
+
+ Conversion observations
+
+
Sandbox logs
{sandboxLogs ? (