/** * @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 getDefaultIntervalStart = () => new Date("2021-04-15"); const getDefaultIntervalEnd = () => new Date(); const storagePrefix = "save-in-bitcoin"; const settings = { initial: { firstDay: signals.createSignal(/** @type {number | null} */ (1000), { save: { ...utils.serde.number, id: `${storagePrefix}-initial-amount`, param: "initial-amount", }, }), overTime: signals.createSignal(/** @type {number | null} */ (0), { save: { ...utils.serde.number, id: `${storagePrefix}-later-amount`, param: "later-amount", }, }), }, recurrent: { amount: signals.createSignal(/** @type {number | null} */ (100), { save: { ...utils.serde.number, id: `${storagePrefix}-recurrent-amount`, param: "recurrent-amount", }, }), }, interval: { start: signals.createSignal( /** @type {Date | null} */ (getDefaultIntervalStart()), { save: { ...utils.serde.date, id: `${storagePrefix}-interval-start`, param: "interval-start", }, }, ), end: signals.createSignal( /** @type {Date | null} */ (getDefaultIntervalEnd()), { 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", }, }), }, }; const { headerElement } = utils.dom.createHeader({ title: selected.title, description: selected.serializedPath, }); parametersElement.append(headerElement); const initialGroup = createParameterGroup({ title: "Initial", description: "The initial amount of dollars you're willing to eventually save in Bitcoin.", }); parametersElement.append(initialGroup); initialGroup.append( createInputField({ name: "Directly converted", input: createInputDollar({ id: "simulation-dollars-initial", title: "Initial amount of dollars converted", signal: settings.initial.firstDay, }), }), ); initialGroup.append( createInputField({ name: "Converted over time", input: createInputDollar({ id: "simulation-dollars-later", title: "Dollars to spread over time", signal: settings.initial.overTime, }), }), ); const topUpGroup = createParameterGroup({ title: "Top Up", description: "The topUp amount of dollars you're willing to eventually save in Bitcoin.", }); parametersElement.append(topUpGroup); const recurrentGroup = createParameterGroup({ title: "Recurrent", description: "The recurrent amount of dollars you're willing to eventually save in Bitcoin.", }); parametersElement.append(recurrentGroup); recurrentGroup.append( createInputField({ name: "Maximum Amount", input: createInputDollar({ id: "simulation-dollars-recurrent", title: "Recurrent dollar amount", signal: settings.recurrent.amount, }), }), ); const frequencyUL = utils.dom.createUlElement(); recurrentGroup.append(frequencyUL); [ { name: "Daily" }, { name: "Weekly", sub: [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ], }, { name: "Monthly", sub: [ "The 1st", "The 2nd", "The 3rd", "The 4th", "The 5th", "The 6th", "The 7th", "The 8th", "The 9th", "The 10th", "The 11th", "The 12th", "The 13th", "The 14th", "The 15th", "The 16th", "The 17th", "The 18th", "The 19th", "The 20th", "The 21st", "The 22nd", "The 23rd", "The 24th", "The 25th", "The 26th", "The 27th", "The 28th", ], }, ].forEach(({ name, sub }, index) => { const li = utils.dom.createLiElement(); const { label, input } = utils.dom.createLabeledInput({ inputId: `frequency-${name}`, inputName: "frequency", inputValue: name.toLowerCase(), labelTitle: name, inputChecked: !index, onClick: () => {}, }); label.append(name); li.append(label); if (sub) { const parentName = name; const ul = utils.dom.createUlElement(); li.append(ul); sub.forEach((name) => { const li = utils.dom.createLiElement(); const { label, input } = utils.dom.createLabeledInput({ inputId: `frequency-${parentName}-${name}`, inputName: `frequency-${parentName}`, inputValue: name.toLowerCase(), labelTitle: name, inputChecked: !index, onClick: () => {}, }); label.append(name); li.append(label); ul.append(li); }); } frequencyUL.append(li); }); const frequencyChoiceUL = utils.dom.createUlElement(); recurrentGroup.append(frequencyChoiceUL); const intervalGroup = createParameterGroup({ title: "Interval", description: "wkfpweokf", }); parametersElement.append(intervalGroup); console.log("weofpwklfpwkofwepokf"); createInputDateField({ signal: settings.interval.start, getDefault: getDefaultIntervalStart, parent: intervalGroup, signals, utils, }); createInputDateField({ signal: settings.interval.end, getDefault: getDefaultIntervalEnd, parent: intervalGroup, signals, utils, }); const feesGroup = createParameterGroup({ title: "Fees", description: "The amount of fees (in %) from where you'll be exchanging your currency", }); parametersElement.append(feesGroup); const input = utils.dom.createInputNumberElement({ id: "", title: "", signal: settings.fees.percentage, min: 0, max: 50, step: 0.01, signals, }); feesGroup.append(input); // parametersElement.append(utils.dom.createHrElement()); // const strategyGroup = createParameterGroup({ // title: "Strategy", // description: "The strategy used to convert your fiat into Bitcoin", // }); // parametersElement.append(strategyGroup); // const ulStrategies = utils.dom.createUlElement(); // strategyGroup.append(ulStrategies); // ["All in", "Weighted Local", "Weighted Cycle"].forEach((strategy) => { // const li = utils.dom.createLiElement(); // li.append(strategy); // ulStrategies.append(li); // }); const parent = window.document.createElement("div"); parent.classList.add("chart-list"); resultsElement.append(parent); signals.createEffect(settings.interval.start, (start) => { console.log("start", start); }); signals.createEffect(settings.interval.end, (end) => { console.log("end", end); }); const owner = signals.getOwner(); const closes = datasets.getOrCreate("date", "date-to-close"); closes.fetchRange(2009, new Date().getUTCFullYear()).then(() => { signals.runWithOwner(owner, () => { signals.createEffect( () => ({ initialAmount: settings.initial.firstDay() || 0, recurrentAmount: settings.recurrent.amount() || 0, dollarsLeft: settings.initial.overTime() || 0, start: settings.interval.start(), end: settings.interval.end(), fees: settings.fees.percentage(), }), // ({ initialAmount, recurrentAmount, dollarsLeft, start, end }) => { // console.log({ // start, // end, // }); // }, ({ initialAmount, recurrentAmount, dollarsLeft, start, end, fees }) => { console.log({ start, end }); parent.innerHTML = ""; if (!start || !end || start > end) return; const range = utils.date.getRange(start, end); let investedAmount = 0; /** @type {LineData