Bläddra i källkod

market making data

raylu 1 månad sedan
förälder
incheckning
4d916c2be3
10 ändrade filer med 127 tillägg och 8 borttagningar
  1. 34 0
      dist/market.js
  2. 10 0
      dist/market.js.map
  3. 2 4
      dist/recipes.js
  4. 0 0
      dist/recipes.js.map
  5. 1 0
      index.html
  6. 27 0
      market.html
  7. 1 1
      package.json
  8. 50 0
      src/market.ts
  9. 1 3
      src/recipes.ts
  10. 1 0
      tsconfig.json

+ 34 - 0
dist/market.js

@@ -0,0 +1,34 @@
+// src/market.ts
+async function fetchData() {
+  const exchanges = await fetch("https://api.prunplanner.org/data/exchanges");
+  return await exchanges.json();
+}
+function render(prices) {
+  const markets = [];
+  for (const price of prices) {
+    if (price.ExchangeCode !== "IC1" || price.Traded < 100)
+      continue;
+    const spread = (price.Ask - price.Bid) / price.Ask;
+    if (spread < 0.15)
+      continue;
+    markets.push({ material: price.MaterialTicker, bid: price.Bid, ask: price.Ask, spread, traded: price.Traded });
+  }
+  markets.sort((a, b) => b.spread - a.spread);
+  const fmt = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
+  const tbody = document.querySelector("tbody");
+  tbody.innerHTML = "";
+  for (const market of markets) {
+    const row = document.createElement("tr");
+    row.innerHTML = `
+			<td>${market.material}</td>
+			<td>${fmt.format(market.bid)}</td>
+			<td>${fmt.format(market.ask)}</td>
+			<td>${fmt.format(market.spread)}</td>
+			<td>${fmt.format(market.traded)}</td>
+		`;
+    tbody.appendChild(row);
+  }
+}
+fetchData().then(render);
+
+//# debugId=BED9426CD318F82764756E2164756E21

+ 10 - 0
dist/market.js.map

@@ -0,0 +1,10 @@
+{
+  "version": 3,
+  "sources": ["../src/market.ts"],
+  "sourcesContent": [
+    "interface Price {\n\tMaterialTicker: string;\n\tExchangeCode: string;\n\tBid: number;\n\tAsk: number;\n\tTraded: number;\n}\n\ninterface Market {\n\tmaterial: string;\n\tbid: number;\n\task: number;\n\tspread: number;\n\ttraded: number;\n}\n\nasync function fetchData(): Promise<Price[]> {\n\tconst exchanges = await fetch('https://api.prunplanner.org/data/exchanges');\n\treturn await exchanges.json();\n}\n\nfunction render(prices: Price[]) {\n\tconst markets: Market[] = [];\n\tfor (const price of prices) {\n\t\tif (price.ExchangeCode !== 'IC1' || price.Traded < 100)\n\t\t\tcontinue;\n\t\tconst spread = (price.Ask - price.Bid) / price.Ask;\n\t\tif (spread < 0.15)\n\t\t\tcontinue;\n\t\tmarkets.push({material: price.MaterialTicker, bid: price.Bid, ask: price.Ask, spread, traded: price.Traded});\n\t}\n\tmarkets.sort((a, b) => b.spread - a.spread);\n\n\tconst fmt = new Intl.NumberFormat(undefined, {maximumFractionDigits: 2});\n\tconst tbody = document.querySelector('tbody') as HTMLTableSectionElement;\n\ttbody.innerHTML = '';\n\tfor (const market of markets) {\n\t\tconst row = document.createElement('tr');\n\t\trow.innerHTML = `\n\t\t\t<td>${market.material}</td>\n\t\t\t<td>${fmt.format(market.bid)}</td>\n\t\t\t<td>${fmt.format(market.ask)}</td>\n\t\t\t<td>${fmt.format(market.spread)}</td>\n\t\t\t<td>${fmt.format(market.traded)}</td>\n\t\t`;\n\t\ttbody.appendChild(row);\n\t}\n}\n\nfetchData().then(render);\n"
+  ],
+  "mappings": ";AAgBA,eAAe,SAAS,GAAqB;AAAA,EAC5C,MAAM,YAAY,MAAM,MAAM,4CAA4C;AAAA,EAC1E,OAAO,MAAM,UAAU,KAAK;AAAA;AAG7B,SAAS,MAAM,CAAC,QAAiB;AAAA,EAChC,MAAM,UAAoB,CAAC;AAAA,EAC3B,WAAW,SAAS,QAAQ;AAAA,IAC3B,IAAI,MAAM,iBAAiB,SAAS,MAAM,SAAS;AAAA,MAClD;AAAA,IACD,MAAM,UAAU,MAAM,MAAM,MAAM,OAAO,MAAM;AAAA,IAC/C,IAAI,SAAS;AAAA,MACZ;AAAA,IACD,QAAQ,KAAK,EAAC,UAAU,MAAM,gBAAgB,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,QAAQ,QAAQ,MAAM,OAAM,CAAC;AAAA,EAC5G;AAAA,EACA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAAA,EAE1C,MAAM,MAAM,IAAI,KAAK,aAAa,WAAW,EAAC,uBAAuB,EAAC,CAAC;AAAA,EACvE,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,EAC5C,MAAM,YAAY;AAAA,EAClB,WAAW,UAAU,SAAS;AAAA,IAC7B,MAAM,MAAM,SAAS,cAAc,IAAI;AAAA,IACvC,IAAI,YAAY;AAAA,SACT,OAAO;AAAA,SACP,IAAI,OAAO,OAAO,GAAG;AAAA,SACrB,IAAI,OAAO,OAAO,GAAG;AAAA,SACrB,IAAI,OAAO,OAAO,MAAM;AAAA,SACxB,IAAI,OAAO,OAAO,MAAM;AAAA;AAAA,IAE/B,MAAM,YAAY,GAAG;AAAA,EACtB;AAAA;AAGD,UAAU,EAAE,KAAK,MAAM;",
+  "debugId": "BED9426CD318F82764756E2164756E21",
+  "names": []
+}

+ 2 - 4
dist/recipes.js

@@ -75,8 +75,6 @@ function render({ buildings, recipes, prices }) {
     tbody.appendChild(row);
   }
 }
-if (document.querySelector("tbody")) {
-  fetchData().then(render);
-}
+fetchData().then(render);
 
-//# debugId=AA0BA8B70839899464756E2164756E21
+//# debugId=1CA72A12BC1F1FDE64756E2164756E21

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
dist/recipes.js.map


+ 1 - 0
index.html

@@ -10,6 +10,7 @@
 	<main>
 		<h1>PrUn Calculator</h1>
 		<a href="recipes.html">recipes</a>
+		<a href="market.html">market</a>
 	</main>
 </body>
 </html>

+ 27 - 0
market.html

@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<title>PrUn calc — market</title>
+	<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+	<main>
+		<a href="index.html">back</a>
+		<table>
+			<thead>
+				<tr>
+					<th>material</th>
+					<th>bid</th>
+					<th>ask</th>
+					<th>spread</th>
+					<th>traded</th>
+				</tr>
+			</thead>
+			<tbody></tbody>
+		</table>
+	</main>
+	<script type="module" src="./dist/market.js"></script>
+</body>
+</html>

+ 1 - 1
package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "description": "GitHub Pages site with TypeScript",
   "scripts": {
-    "build": "bun build src/recipes.ts --outdir dist --target browser --sourcemap=external",
+    "build": "bun build src/market.ts src/recipes.ts --outdir dist --target browser --sourcemap=external",
     "typecheck": "tsc --noEmit",
     "serve": "python3 -m http.server 8000"
   },

+ 50 - 0
src/market.ts

@@ -0,0 +1,50 @@
+interface Price {
+	MaterialTicker: string;
+	ExchangeCode: string;
+	Bid: number;
+	Ask: number;
+	Traded: number;
+}
+
+interface Market {
+	material: string;
+	bid: number;
+	ask: number;
+	spread: number;
+	traded: number;
+}
+
+async function fetchData(): Promise<Price[]> {
+	const exchanges = await fetch('https://api.prunplanner.org/data/exchanges');
+	return await exchanges.json();
+}
+
+function render(prices: Price[]) {
+	const markets: Market[] = [];
+	for (const price of prices) {
+		if (price.ExchangeCode !== 'IC1' || price.Traded < 100)
+			continue;
+		const spread = (price.Ask - price.Bid) / price.Ask;
+		if (spread < 0.15)
+			continue;
+		markets.push({material: price.MaterialTicker, bid: price.Bid, ask: price.Ask, spread, traded: price.Traded});
+	}
+	markets.sort((a, b) => b.spread - a.spread);
+
+	const fmt = new Intl.NumberFormat(undefined, {maximumFractionDigits: 2});
+	const tbody = document.querySelector('tbody') as HTMLTableSectionElement;
+	tbody.innerHTML = '';
+	for (const market of markets) {
+		const row = document.createElement('tr');
+		row.innerHTML = `
+			<td>${market.material}</td>
+			<td>${fmt.format(market.bid)}</td>
+			<td>${fmt.format(market.ask)}</td>
+			<td>${fmt.format(market.spread)}</td>
+			<td>${fmt.format(market.traded)}</td>
+		`;
+		tbody.appendChild(row);
+	}
+}
+
+fetchData().then(render);

+ 1 - 3
src/recipes.ts

@@ -109,6 +109,4 @@ function render({buildings, recipes, prices}: {buildings: Building[], recipes: R
 	}
 }
 
-if (document.querySelector('tbody')) {
-	fetchData().then(render);
-}
+fetchData().then(render);

+ 1 - 0
tsconfig.json

@@ -10,6 +10,7 @@
     "skipLibCheck": true,
     "forceConsistentCasingInFileNames": true,
     "moduleResolution": "bundler",
+    "isolatedModules": true,
     "sourceMap": true,
   },
   "include": ["src/**/*"],

Vissa filer visades inte eftersom för många filer har ändrats