diff --git a/src/charts/chart.js b/src/charts/chart.js index 130b244..991a8ec 100644 --- a/src/charts/chart.js +++ b/src/charts/chart.js @@ -345,7 +345,7 @@ function doHandleCrosshairMovement(point) { const selection = chart.selection().allSources(); if (selection.length) draggingShapeIds = selection - console.log('dragging selected', draggingShapeIds) + // console.log('dragging selected', draggingShapeIds) const initStartPoints = draggingShapeStartPoints === null if (initStartPoints) draggingShapeStartPoints = [] diff --git a/src/charts/ordershapes.js b/src/charts/ordershapes.js index 99012b2..6fc9b02 100644 --- a/src/charts/ordershapes.js +++ b/src/charts/ordershapes.js @@ -87,7 +87,7 @@ class TrancheShapes { price *= scale // console.log('price', price) const channel = buy?'low':'high'; - const text = allocationText(buy, weight, amount, amountSymbol, '\n', amountIsBase?null:this.symbol.base.s) + const text = allocationText(buy, weight, amount, amountSymbol, amountIsBase ? null : this.symbol.base.s, '\n') const s = createShape(buy?'arrow_up':'arrow_down', {time, price}, {channel,text,lock:true}) // console.log('created fill shape at', time, price) this.fills.push(s) diff --git a/src/charts/shape.js b/src/charts/shape.js index abd1be4..c21a7c7 100644 --- a/src/charts/shape.js +++ b/src/charts/shape.js @@ -4,7 +4,7 @@ import {invokeCallback, mixin} from "@/common.js"; import {chart, createShape, deleteShapeId, dragging, draggingShapeIds, drawShape, widget} from "@/charts/chart.js"; import Color from "color"; import {dirtyItems, dirtyPoints, nearestOhlcStart} from "@/charts/chart-misc.js"; -import {defined} from "@/misc.js"; +import {defined, toPrecision} from "@/misc.js"; // @@ -39,8 +39,7 @@ export const ShapeType = { } -export function allocationText(buy, weight, amount, symbol, separator = ' ', inSymbol=null) { - // set breakout=true for a buy breakout and breakout=false for a sell breakout +export function allocationText(buy, weight, amount, baseSymbol, amountSymbol = null, separator = ' ') { const hasAmount = amount !== null && amount !== undefined && amount > 0 if (hasAmount) amount = Number(amount) @@ -52,13 +51,14 @@ export function allocationText(buy, weight, amount, symbol, separator = ' ', inS let text = buy === undefined ? '' : buy ? 'Buy ' : 'Sell ' if (hasWeight) text += `${(weight * 100).toFixed(1)}%` - const hasSymbol = symbol !== null && symbol !== undefined + const hasSymbol = baseSymbol !== null && baseSymbol !== undefined if (hasAmount && hasSymbol) { if (hasWeight) text += separator - if (inSymbol) - text += `${inSymbol} worth ` - text += `${amount.toPrecision(3).toLocaleString('fullwide')} ${symbol}` + if (amountSymbol!==null && amountSymbol!==baseSymbol) + text += `${baseSymbol} worth ${toPrecision(amount,3)} ${amountSymbol}` + else + text += `${toPrecision(amount,3)} ${baseSymbol}` } return text } @@ -112,6 +112,7 @@ export class Shape { this.model.maxAllocation = null // both amount and amountSymbol must be set in order to display amount text this.model.amount = null + this.model.baseSymbol = null this.model.amountSymbol = null this.model.extraText = null this.model.textLocation = null // defaults to 'above' if not set @@ -134,6 +135,8 @@ export class Shape { this.model.amount = model.amount if (defined(model.amountSymbol)) this.model.amountSymbol = model.amountSymbol + if (defined(model.baseSymbol)) + this.model.baseSymbol = model.baseSymbol if (defined(model.extraText)) this.model.extraText = model.extraText if (defined(model.breakout)) @@ -166,7 +169,7 @@ export class Shape { newProps.linecolor = color // text label - let text = allocationText(this.model.buy, this.model.allocation, this.model.amount, this.model.amountSymbol) + let text = allocationText(this.model.buy, this.model.allocation, this.model.amount, this.model.baseSymbol, this.model.amountSymbol) if (this.model.breakout) text += ' ' + (this.model.textLocation==='above' ? '▲Breakout▲' : '▼Breakout▼') if (this.model.extraText) diff --git a/src/components/chart/DCABuilder.vue b/src/components/chart/DCABuilder.vue index 48011db..dad28ed 100644 --- a/src/components/chart/DCABuilder.vue +++ b/src/components/chart/DCABuilder.vue @@ -82,7 +82,7 @@ const times = ref([]) const weights = ref([]) const amountSymbol = computed(()=>props.order.amountIsTokenA ? co.selectedSymbol.base.s : co.selectedSymbol.quote.s ) -const allocationTexts = computed(()=>weights.value.map((w)=>allocationText(props.order.buy, w, w*props.order.amount, amountSymbol.value, ' ', props.order.amountIsTokenA?null:co.selectedSymbol.base.s))) +const allocationTexts = computed(()=>weights.value.map((w)=>allocationText(props.order.buy, w, w * props.order.amount, co.selectedSymbol.base.s, amountSymbol.value))) const endTimes = computed(()=>{ if (props.builder.rungs === 1) diff --git a/src/components/chart/DiagonalBuilder.vue b/src/components/chart/DiagonalBuilder.vue index 22b529b..407ff49 100644 --- a/src/components/chart/DiagonalBuilder.vue +++ b/src/components/chart/DiagonalBuilder.vue @@ -349,7 +349,7 @@ function setWeights(ws) { const amountSymbol = computed(()=>props.order.amountIsTokenA ? co.selectedSymbol.base.s : co.selectedSymbol.quote.s ) -const allocationTexts = computed(()=>weights.value.map((w)=>allocationText(props.order.buy, w, w*props.order.amount, amountSymbol.value))) +const allocationTexts = computed(()=>weights.value.map((w)=>allocationText(props.order.buy, w, w * props.order.amount, co.selectedSymbol.base.s, amountSymbol.value))) const stdWidth = computed(()=>[0, co.meanRange, 0, co.meanRange]) diff --git a/src/components/chart/LimitBuilder.vue b/src/components/chart/LimitBuilder.vue index 9581479..aedeaea 100644 --- a/src/components/chart/LimitBuilder.vue +++ b/src/components/chart/LimitBuilder.vue @@ -196,7 +196,7 @@ function setPrices(ps) {prices.value = ps} function setWeights(ws) { weights.value = ws } const amountSymbol = computed(()=>props.order.amountIsTokenA ? co.selectedSymbol.base.s : co.selectedSymbol.quote.s ) -const allocationTexts = computed(()=>weights.value.map((w)=>allocationText(props.order.buy, w, w*props.order.amount, amountSymbol.value))) +const allocationTexts = computed(()=>weights.value.map((w)=>allocationText(props.order.buy, w, w * props.order.amount, co.selectedSymbol.base.s, amountSymbol.value))) const color = computed(()=>props.builder.color ? props.builder.color : defaultColor) const stdWidth = computed(()=>co.meanRange) const description = computed(()=>{ diff --git a/src/components/chart/RungBuilder.vue b/src/components/chart/RungBuilder.vue index 94ffb85..2c0a5f4 100644 --- a/src/components/chart/RungBuilder.vue +++ b/src/components/chart/RungBuilder.vue @@ -330,6 +330,7 @@ function makeModel(index) { allocation: alloc, maxAllocation: Math.max(...weights.value), amount: props.order.amount * alloc, + baseSymbol: co.selectedSymbol.base.s, amountSymbol: amountSymbol.value, textLocation: above ? 'above' : 'below', breakout: props.builder.breakout, diff --git a/src/misc.js b/src/misc.js index 8312e98..868a4e9 100644 --- a/src/misc.js +++ b/src/misc.js @@ -251,3 +251,11 @@ export function computeInterceptSlope(time0, price0, time1, price1) { export function defined(v) { return v !== undefined && v !== null } + +export function toPrecision(value, significantDigits = 3) { + if (!isFinite(value)) return value.toString(); // Handle Infinity and NaN + if (value === 0) return "0"; // Special case for 0 + const magnitude = Math.floor(Math.log10(Math.abs(value))); + const decimalsNeeded = Math.max(0, significantDigits - 1 - magnitude); + return value.toFixed(decimalsNeeded); // Use toFixed to completely avoid scientific notation +} \ No newline at end of file