forked from vagabond-systems/jpmc-task-3
-
Notifications
You must be signed in to change notification settings - Fork 8.3k
/
Copy path0001-Create-Patch-File.patch
135 lines (125 loc) · 4.08 KB
/
0001-Create-Patch-File.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
From c406bc684434e353f7eae0f34dc2e4bfb085f197 Mon Sep 17 00:00:00 2001
From: vismaywalde <[email protected]>
Date: Sat, 24 Aug 2024 00:20:12 +0530
Subject: [PATCH] Create Patch File
---
src/DataManipulator.ts | 30 ++++++++++++++++++++++--------
src/Graph.tsx | 41 +++++++++++++++++++++++++----------------
2 files changed, 47 insertions(+), 24 deletions(-)
diff --git a/src/DataManipulator.ts b/src/DataManipulator.ts
index 7f62295..5532460 100644
--- a/src/DataManipulator.ts
+++ b/src/DataManipulator.ts
@@ -1,20 +1,34 @@
import { ServerRespond } from './DataStreamer';
export interface Row {
- stock: string,
- top_ask_price: number,
+ price_abc: number,
+ price_def: number,
+ ratio: number,
timestamp: Date,
+ upper_bound: number,
+ lower_bound: number,
+ trigger_alert: number | undefined,
}
export class DataManipulator {
- static generateRow(serverResponds: ServerRespond[]) {
- return serverResponds.map((el: any) => {
+ static generateRow(serverRespond: ServerRespond[]): Row {
+ const priceABC = (serverRespond[0].top_ask.price + serverRespond[0].top_bid.price) / 2;
+ const priceDEF = (serverRespond[1].top_ask.price + serverRespond[1].top_bid.price) / 2;
+ const ratio = priceABC / priceDEF;
+ const upperBound = 1 + 0.05;
+ const lowerBound = 1 - 0.05;
+
return {
- stock: el.stock,
- top_ask_price: el.top_ask && el.top_ask.price || 0,
- timestamp: el.timestamp,
+ price_abc: priceABC,
+ price_def: priceDEF,
+ ratio,
+ timestamp: serverRespond[0].timestamp > serverRespond[1].timestamp ?
+ serverRespond[0].timestamp : serverRespond[1].timestamp,
+ upper_bound: upperBound,
+ lower_bound: lowerBound,
+ trigger_alert: (ratio > upperBound || ratio < lowerBound) ? ratio : undefined,
};
- })
+
}
}
diff --git a/src/Graph.tsx b/src/Graph.tsx
index 277797d..ab84a62 100644
--- a/src/Graph.tsx
+++ b/src/Graph.tsx
@@ -1,5 +1,5 @@
import React, { Component } from 'react';
-import { Table } from '@finos/perspective';
+import { Table, TableData } from '@finos/perspective';
import { ServerRespond } from './DataStreamer';
import { DataManipulator } from './DataManipulator';
import './Graph.css';
@@ -22,39 +22,48 @@ class Graph extends Component<IProps, {}> {
// Get element from the DOM.
const elem = document.getElementsByTagName('perspective-viewer')[0] as unknown as PerspectiveViewerElement;
- const schema = {
- stock: 'string',
- top_ask_price: 'float',
- top_bid_price: 'float',
- timestamp: 'date',
- };
+
+ const schema = {
+ price_abc: 'float',
+ price_def: 'float',
+ ratio: 'float',
+ timestamp: 'date',
+ upper_bound: 'float',
+ lower_bound: 'float',
+ trigger_alert: 'float',
+ };
+
- if (window.perspective && window.perspective.worker()) {
+ if (window.perspective) {
this.table = window.perspective.worker().table(schema);
}
if (this.table) {
// Load the `table` in the `<perspective-viewer>` DOM reference.
elem.load(this.table);
elem.setAttribute('view', 'y_line');
- elem.setAttribute('column-pivots', '["stock"]');
elem.setAttribute('row-pivots', '["timestamp"]');
- elem.setAttribute('columns', '["top_ask_price"]');
+ elem.setAttribute('columns', '["ratio", "lower_bound", "upper_bound", "trigger_alert]');
elem.setAttribute('aggregates', JSON.stringify({
- stock: 'distinctcount',
- top_ask_price: 'avg',
- top_bid_price: 'avg',
- timestamp: 'distinct count',
+ price_abc: 'avg',
+ price_def: 'avg',
+ ratio: 'avg',
+
+ upper_bound: 'avg',
+ lower_bound: 'avg',
+ trigger_alert: 'avg',
+ timestamp: 'distinct count',
}));
}
}
componentDidUpdate() {
if (this.table) {
- this.table.update(
+ this.table.update([
DataManipulator.generateRow(this.props.data),
- );
+ ] as unknown as TableData);
}
}
}
export default Graph;
+
--
2.45.2.windows.1