Untitled

mail@pastecode.io avatar
unknown
javascript
a year ago
4.5 kB
1
Indexable
Never
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`);
});