/** * @import {Options} from './options'; */ /** * @param {Object} args * @param {Colors} args.colors * @param {Consts} args.consts * @param {LightweightCharts} args.lightweightCharts * @param {SimulationOption} args.selected * @param {Signals} args.signals * @param {Utilities} args.utils * @param {Options} args.options * @param {Datasets} args.datasets * @param {WebSockets} args.webSockets * @param {Elements} args.elements * @param {Ids} args.ids * @param {Accessor} args.dark */ export function init({ colors, consts, dark, datasets, elements, ids, lightweightCharts, options, selected, signals, utils, webSockets, }) { const simulationElement = elements.simulation; const parametersElement = window.document.createElement("div"); simulationElement.append(parametersElement); const resultsElement = window.document.createElement("div"); simulationElement.append(resultsElement); const frequencies = computeFrequencies(); const storagePrefix = "save-in-bitcoin"; const settings = { dollars: { initial: { amount: signals.createSignal(/** @type {number | null} */ (1000), { save: { ...utils.serde.number, id: `${storagePrefix}-initial-amount`, param: "initial-amount", }, }), }, topUp: { amount: signals.createSignal(/** @type {number | null} */ (10), { save: { ...utils.serde.number, id: `${storagePrefix}-top-up-amount`, param: "top-up-amount", }, }), frenquency: signals.createSignal( /** @type {Frequency} */ (frequencies.list[0]), { save: { ...frequencies.serde, id: `${storagePrefix}-top-up-freq`, param: "top-up-freq", }, }, ), }, }, swap: { amount: { initial: signals.createSignal(/** @type {number | null} */ (1000), { save: { ...utils.serde.number, id: `${storagePrefix}-initial-swap`, param: "initial-swap", }, }), recurrent: signals.createSignal(/** @type {number | null} */ (10), { save: { ...utils.serde.number, id: `${storagePrefix}-recurrent-swap`, param: "recurrent-swap", }, }), }, frequency: signals.createSignal( /** @type {Frequency} */ (frequencies.list[0]), { save: { ...frequencies.serde, id: `${storagePrefix}-swap-freq`, param: "swap-freq", }, }, ), }, interval: { start: signals.createSignal( /** @type {Date | null} */ (new Date("2021-04-15")), { save: { ...utils.serde.date, id: `${storagePrefix}-interval-start`, param: "interval-start", }, }, ), end: signals.createSignal(/** @type {Date | null} */ (new Date()), { save: { ...utils.serde.date, id: `${storagePrefix}-interval-end`, param: "interval-end", }, }), }, fees: { percentage: signals.createSignal(/** @type {number | null} */ (0.25), { save: { ...utils.serde.number, id: `${storagePrefix}-percentage`, param: "percentage", }, }), }, }; parametersElement.append( utils.dom.createHeader({ title: "Save in Bitcoin", description: "What if you bought Bitcoin in the past ?", }).headerElement, ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "green", type: "Dollars", text: "Initial Amount", }), description: "The amount of dollars you have ready to swap on day one.", input: createInputDollar({ id: "simulation-dollars-initial", title: "Initial Dollar Amount", signal: settings.dollars.initial.amount, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "green", type: "Dollars", text: "Top Up Amount", }), description: "The recurrent amount of dollars you'll be putting aside to swap.", input: createInputDollar({ id: "simulation-dollars-later", title: "Top Up Dollar Amount", signal: settings.dollars.topUp.amount, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "green", type: "Dollars", text: "Top Up Frequency", }), description: "The frequency at which you'll be putting aside the preceding amount of dollars.", input: utils.dom.createSelect({ id: "top-up-frequency", list: frequencies.list, signal: settings.dollars.topUp.frenquency, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "orange", type: "Swap", text: "Initial Amount", }), description: "The maximum initial amount of dollars you'll exchange on day one.", input: createInputDollar({ id: "simulation-dollars-later", title: "Initial Swap Amount", signal: settings.swap.amount.initial, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "orange", type: "Swap", text: "Recurrent Amount", }), description: "The maximum recurrent amount of dollars you'll be exchanging.", input: createInputDollar({ id: "simulation-dollars-later", title: "Recurrent Swap Amount", signal: settings.swap.amount.recurrent, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "orange", type: "Swap", text: "Frequency", }), description: "The frequency at which you'll be exchanging the preceding amount.", input: utils.dom.createSelect({ id: "top-up-frequency", list: frequencies.list, signal: settings.swap.frequency, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "sky", type: "Interval", text: "Start", }), description: "The first day of the simulation.", input: createInputDateField({ signal: settings.interval.start, signals, utils, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "sky", type: "Interval", text: "End", }), description: "The last day of the simulation.", input: createInputDateField({ signal: settings.interval.end, signals, utils, }), }), ); parametersElement.append( createFieldElement({ title: createColoredTypeHTML({ color: "red", type: "Fees", text: "Percentage", }), description: "The amount of fees (in %) from where you'll be exchanging your dollars.", input: utils.dom.createInputNumberElement({ id: "", title: "", signal: settings.fees.percentage, min: 0, max: 50, step: 0.01, signals, }), }), ); const firstParagraph = window.document.createElement("p"); resultsElement.append(firstParagraph); const secondParagraph = window.document.createElement("p"); resultsElement.append(secondParagraph); const parent = window.document.createElement("div"); parent.classList.add("chart-list"); resultsElement.append(parent); const owner = signals.getOwner(); const closes = datasets.getOrCreate("date", "date-to-close"); closes.fetchRange(2009, new Date().getUTCFullYear()).then(() => { signals.runWithOwner(owner, () => { signals.createEffect( () => ({ initialDollarAmount: settings.dollars.initial.amount() || 0, topUpAmount: settings.dollars.topUp.amount() || 0, topUpFrequency: settings.dollars.topUp.frenquency(), initialSwap: settings.swap.amount.initial() || 0, recurrentSwap: settings.swap.amount.recurrent() || 0, swapFrequency: settings.swap.frequency(), start: settings.interval.start(), end: settings.interval.end(), fees: settings.fees.percentage(), }), ({ initialDollarAmount, topUpAmount, topUpFrequency, initialSwap, recurrentSwap, swapFrequency, start, end, fees, }) => { console.log({ start, end }); parent.innerHTML = ""; if (!start || !end || start > end) return; const range = utils.date.getRange(start, end); /** @type {LineData