Untitled
unknown
javascript
2 years ago
4.5 kB
3
Indexable
const fs = require("fs"); fs.readFile("data.csv", "utf8", function (err, data) { if (err) throw err; // Dela upp innehållet i filen baserat på radbrytningar och ta bort första raden (som förmodligen är en rubrik). let fileContent = data.split("\n"); fileContent.shift(); // Skapa en array för att lagra de tolkade transaktionsuppgifterna. let parsedData = []; // Loopa igenom varje rad i filen. fileContent.forEach((transaction) => { // Ersätt alla kommatecken med punkter för att kunna tolka decimaltal korrekt. transaction = transaction.replace(/,/g, "."); // Dela upp varje rad i dess komponentdelar baserat på semikolon. const transactionDetails = transaction.split(";"); // Skapa ett objekt med transaktionsuppgifterna. const parsedTransaction = { date: new Date(`${transactionDetails[0]}`), transactionType: transactionDetails[2], stock: transactionDetails[3], amount: +(transactionDetails[4] >= 0 ? transactionDetails[4] : transactionDetails[4] * -1), stockprice: +(transactionDetails[5] !== "-" ? transactionDetails[5] : 0), courtage: +(transactionDetails[7] !== "-" ? transactionDetails[7] : 0), currency: "SEK", isin: transactionDetails[9], }; // Sortera parsedData arrayen baserat på datum. parsedData.sort((a, b) => a.date - b.date); // Kontrollera om det fanns några uppgifter i transaktionsobjektet och lägg till det i arrayen. if (!!parsedTransaction) { parsedData.push(parsedTransaction); } }); // Skapa en Map för att spåra köp som ännu inte har matchats med en försäljning. let pendingBuys = new Map(); // Skapa en array för att lagra information om genomförda affärer. let trades = []; // Loopa igenom varje tolkad transaktion. parsedData.forEach((transaction) => { // Om transaktionen är ett köp... if (transaction.transactionType === "Köp") { // Om det inte finns några väntande köp för den här aktien, skapa en ny lista. if (!pendingBuys.has(transaction.stock)) { pendingBuys.set(transaction.stock, []); } // Lägg till köpet till listan över väntande köp för den här aktien. pendingBuys.get(transaction.stock).push(transaction); } // Om transaktionen är en försäljning... else if (transaction.transactionType === "Sälj") { // Om det finns väntande köp för den här aktien... if (pendingBuys.has(transaction.stock)) { // Ta bort det första väntande köpet för den här aktien från listan. let correspondingBuy = pendingBuys.get(transaction.stock).shift(); // Om det fanns ett väntande köp... if (correspondingBuy) { // Skapa ett objekt med uppgifter om affären och lägg till det i arrayen över genomförda affärer. let trade = { ...correspondingBuy, ...transaction, profit: transaction.amount * transaction.stockprice - correspondingBuy.amount * correspondingBuy.stockprice, buyDate: correspondingBuy.date, }; trades.push(trade); } } // Om det inte fanns några väntande köp för den här aktien, skriv ut ett felmeddelande. else { console.error( `Ingen motsvarande köptransaktion hittades för säljtransaktion: ${transaction}` ); } } }); // Skriv ut arrayen med genomförda affärer. console.log(trades); // Skriv ut antalet genomförda affärer. console.log(`Totalt antal trades: ${trades.length}`); // Konvertera trades-arrayen till en sträng och skriv till en fil. fs.writeFile("trades.txt", JSON.stringify(trades, null, 2), (err) => { if (err) throw err; console.log("Trades data has been saved to trades.txt!"); }); // Initialisera variabler för att spåra antalet vinster och total vinst/förlust. let wins = 0; let totalProfit = 0; trades.forEach((trade) => { // Om trade har en positiv profit, öka vinstantalet. if (trade.profit > 0) { wins++; } totalProfit += trade.profit; }); let winrate = (wins / trades.length) * 100; // Skriv ut winrate och totala vinsten/förlusten. console.log(`Winrate: ${winrate.toFixed(2)}%`); console.log(`Total Profit/Loss: ${totalProfit.toFixed(2)} SEK`); });
Editor is loading...