Javascript - Работа с двумерными массивами для расчета выигрыша / проигрыша - PullRequest
0 голосов
/ 30 мая 2018

Я действительно начинающий программист и отслеживаю свой торговый портфель по двум массивам объектов.

Продает и покупает определенную торговую валюту следующим образом:

var sell {
    sold_amount: sold,
    bought_amount: bought,
    price : price
}


var buy {
    sold_amount: sold,
    bought_amount: bought,
    price : price
}

Я пытаюсь добиться следующего:

Рассчитать мой процент проигрышейLIFO образом.Это означает, что я хочу взять последнюю сделанную мною продажу и начать вычитать цену / сумму из последней покупки, а затем двигаться назад.Если бы мои продажи были достаточно большими, это означало бы, что мне нужно будет смотреть не только на предыдущую покупку, но и искать неизвестное количество предыдущих покупок, пока не исчерпается вся моя сумма продажи, чтобы я мог рассчитать свой выигрыш /проиграть.

Моя сложность заключается в том, что, поскольку продажи и покупки осуществляются по разным суммам / ценам, мне очень сложно рассчитать результат.

Это означает, например:

I bought 20 units of  $javascript paying 32 units of $c++ ,
I bought 17 units of  $javascript paying 29 units of $c++ ,
I sold   57 units of  $c++        paying 31 units of $javascript,
I bought 22 units of $javascript  paying 22 units of c++,
I sold   12 units of  c++         paing  11 units of $javascript,

Это означает, что при каждой продаже мне нужно было бы оглядываться назад и видеть рекурсивную цену, которую я купил, и рассчитывать выигрыш / проигрыш по сумме продано / куплено.

Я пытался решить ее самостоятельно в течение нескольких дней, но безрезультатно, поэтому подумал, что попробую здесь, так как начал чувствовать себя немного разочарованным.

Яне ищу решения, просто некоторые рекомендации или советы, спасибо-

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Спасибо за все отзывы, я подготовил быстрый пример, чтобы продемонстрировать, что я имею в виду, может быть, это какая-то ошибка в моем мышлении:

Начальная сумма не важна, я только хочу посчитать, что я получаю или теряюс торгов.

Сначала я купил 8 литров молока и продал 2 коровы.

Затем я купил 1 корову и продал 20 литров молока.

Это означает, что в начале я заплатил (8/2) = 4 литра за 1 корову.

Во второй транзакции они заплатили 20 литров за 1 корову.

Так что для меня, который заинтересован в покупке коров как можно дешевле, сделка, которую я совершил, была намного лучше, чем втораяодин.

Итак, суммируя все эти сделки, как указано выше, в конце я хочу подсчитать, сколько коров у меня осталось ... надеюсь, это немного прояснит

0 голосов
/ 31 мая 2018

Вы можете принять транзакции и вести два индикатора для общей суммы единиц и общей цены.Цена продажи не имеет значения для расчета фактически купленных продуктов.

Пожалуйста, просмотрите FIFO и LIFO с учетом .

Чтобы получить реальную стоимость с некоторымипроданных предметов, проверяется последняя покупка, и если последнее количество единиц меньше или равно проданным единицам, то обновляются как общие, так и фактические единицы, пока все единицы не будут взяты из последней покупки.

Если у некоторой покупки есть оставшиеся единицы, то эта информация передается в массив предметов.

В результате поддерживается динамический массив с последними покупками и продажами.

                                                  ------------------
                                                       t o t a l
 action     units     price     calc      price     units     price   comment
--------  --------  --------  --------  --------  --------  --------  -----------------
  buy         20        32     20 * 32      640       20       640
  buy         17        29     17 * 29      493       37      1133
  sell        22        22    -17 * 29     -493       20       640    take last first
                              - 5 * 32     -160       15       480    take next to last
  buy         31        57     31 * 57     1767       46      2247
  sell        11        12    -11 * 57     -627       35      1620
                                                  ------------------

var transactions = [
        { action: 'buy', product: 'foo', units: 20, price: 32 },
        { action: 'buy', product: 'foo', units: 17, price: 29 },
        { action: 'sell', product: 'foo', units: 22, price: 22 },
        { action: 'buy', product: 'foo', units: 31, price: 57 },
        { action: 'sell', product: 'foo', units: 11, price: 12 }
    ],
    accounts = {};

transactions.forEach(({ action, product, units, price }) => {
    var last;
    accounts[product] = accounts[product] || { items: [], totalUnits: 0, totalPrice: 0 };

    if (action === 'buy') {
        accounts[product].totalUnits += units;
        accounts[product].totalPrice += units * price;
        accounts[product].items.push({ units, price });
    } else {
        while (units) {
            last = accounts[product].items.pop();
            if (last.units <= units) {
                accounts[product].totalUnits -= last.units;
                accounts[product].totalPrice -= last.units * last.price;
                units -= last.units;
                continue;
            }
            accounts[product].totalUnits -= units;
            accounts[product].totalPrice -= units * last.price;
            last.units -= units;
            units = 0;
            accounts[product].items.push(last);
        }
    }
    console.log(accounts);
});
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 30 мая 2018

Если мы думаем о торговле LIFO, мы можем перевести это на идею элементов в структуре данных, называемой стеком, которые имеют операции push / pop:

LIFO Example, curiosity of wikipedia

Каждая сделка имеет 5 переменных: сумма покупки, тип покупки, сумма продажи, тип продажи и дата.

function Trade(buyAmount, buyType, sellAmount, sellType, date) {

    this.buyAmount = buyAmount;
    this.buyType = buyType;
    this.sellAmount = sellType;
    this.date = date;

}

Это конструктор объекта javascript, который можно вызвать, сказав

var trade = new Trade("Bitcoin", 1.0, "Ethereum", 10.0, new Date("5/30/2018"));

Ключевое слово new перед вызовом функции создает объект, и this, используемый в этой функции, становится ссылкой на этот новый объект.Затем объект присваивается переменной trade.(Исследования this это очень мощно.)

В любом случае, затем вам нужно будет создать массив, отсортированный по дате, и создать алгоритм, который мог бы удерживать в торговле валовую прибыль каждой сделки, связанную с типомпункт продан IE словарь, похожий на:

var profit = { Bitcoin: 0, Ethereum: 0 }

Это хорошая отправная точка, я использовал такую ​​же структуру данных для расчета налогов на мои доходы от криптовалюты в 2017 году.

...