Untitled
unknown
javascript
2 years ago
4.5 kB
4
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...