Keywords: Crypto, Stock
(() => {
const fee = 0.01;
const transactions = [
{ quantity: 100, price: 0.688 },
{ quantity: 50, price: 0.82 },
{ quantity: 100, price: 0.72 },
{ quantity: -50, price: 0.89 },
{ quantity: 100, price: 0.92 },
{ quantity: 750, price: 0.86 },
];
function getAveragePrice(transactions, fee) {
const x = {
quantity: 0,
qtyBought: 0,
totalPrice: 0,
avgPrice: 0,
};
for (const t of transactions) {
x.quantity += t.quantity;
if (t.quantity > 0) {
x.qtyBought += t.quantity;
const price = t.quantity * t.price;
const priceWithFee = price + Math.abs(price * fee);
x.totalPrice += priceWithFee;
}
}
x.avgPrice = x.totalPrice / x.qtyBought;
return x;
}
// begin: Calculate with a single price/quantity value
let addedQty = 0;
let addedAvg = 0;
function addTransaction(qty, price) {
if (qty <= 0) return;
addedAvg = ((addedAvg * addedQty) + (price * qty)) / (addedQty + qty);
addedQty += qty;
console.log("add", addedQty, addedAvg);
}
for (const t of transactions) {
const priceWithFee = t.price + Math.abs(t.price * fee);
addTransaction(t.quantity, priceWithFee);
}
console.log("added avg: ", addedAvg);
// end: Calculate with a single price/quantity value
const avg = getAveragePrice(transactions, fee);
const rjust = (s, width, c = " ") =>
s.length < width ? c.slice(0, 1).repeat(width - s.length) + s : s;
const display = (n) => rjust(Number(n).toFixed(3), 12);
console.log(`own: ${display(avg.quantity)}`);
console.log(`price: $ ${display(avg.avgPrice * avg.quantity)}`);
console.log(`price/share: $ ${display(avg.avgPrice)}`);
})();
/* RESULT:
own: 1050.000
price: $ 885.807
price/share: $ 0.844
*/544500cookie-checkJavascript: Average cost per share