allocationText fix

This commit is contained in:
tim
2025-03-10 21:12:52 -04:00
parent ebf70dd10c
commit b2ed48492b
8 changed files with 25 additions and 13 deletions

View File

@@ -345,7 +345,7 @@ function doHandleCrosshairMovement(point) {
const selection = chart.selection().allSources(); const selection = chart.selection().allSources();
if (selection.length) if (selection.length)
draggingShapeIds = selection draggingShapeIds = selection
console.log('dragging selected', draggingShapeIds) // console.log('dragging selected', draggingShapeIds)
const initStartPoints = draggingShapeStartPoints === null const initStartPoints = draggingShapeStartPoints === null
if (initStartPoints) if (initStartPoints)
draggingShapeStartPoints = [] draggingShapeStartPoints = []

View File

@@ -87,7 +87,7 @@ class TrancheShapes {
price *= scale price *= scale
// console.log('price', price) // console.log('price', price)
const channel = buy?'low':'high'; 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}) const s = createShape(buy?'arrow_up':'arrow_down', {time, price}, {channel,text,lock:true})
// console.log('created fill shape at', time, price) // console.log('created fill shape at', time, price)
this.fills.push(s) this.fills.push(s)

View File

@@ -4,7 +4,7 @@ import {invokeCallback, mixin} from "@/common.js";
import {chart, createShape, deleteShapeId, dragging, draggingShapeIds, drawShape, widget} from "@/charts/chart.js"; import {chart, createShape, deleteShapeId, dragging, draggingShapeIds, drawShape, widget} from "@/charts/chart.js";
import Color from "color"; import Color from "color";
import {dirtyItems, dirtyPoints, nearestOhlcStart} from "@/charts/chart-misc.js"; 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) { export function allocationText(buy, weight, amount, baseSymbol, amountSymbol = null, separator = ' ') {
// set breakout=true for a buy breakout and breakout=false for a sell breakout
const hasAmount = amount !== null && amount !== undefined && amount > 0 const hasAmount = amount !== null && amount !== undefined && amount > 0
if (hasAmount) if (hasAmount)
amount = Number(amount) amount = Number(amount)
@@ -52,13 +51,14 @@ export function allocationText(buy, weight, amount, symbol, separator = ' ', inS
let text = buy === undefined ? '' : buy ? 'Buy ' : 'Sell ' let text = buy === undefined ? '' : buy ? 'Buy ' : 'Sell '
if (hasWeight) if (hasWeight)
text += `${(weight * 100).toFixed(1)}%` text += `${(weight * 100).toFixed(1)}%`
const hasSymbol = symbol !== null && symbol !== undefined const hasSymbol = baseSymbol !== null && baseSymbol !== undefined
if (hasAmount && hasSymbol) { if (hasAmount && hasSymbol) {
if (hasWeight) if (hasWeight)
text += separator text += separator
if (inSymbol) if (amountSymbol!==null && amountSymbol!==baseSymbol)
text += `${inSymbol} worth ` text += `${baseSymbol} worth ${toPrecision(amount,3)} ${amountSymbol}`
text += `${amount.toPrecision(3).toLocaleString('fullwide')} ${symbol}` else
text += `${toPrecision(amount,3)} ${baseSymbol}`
} }
return text return text
} }
@@ -112,6 +112,7 @@ export class Shape {
this.model.maxAllocation = null this.model.maxAllocation = null
// both amount and amountSymbol must be set in order to display amount text // both amount and amountSymbol must be set in order to display amount text
this.model.amount = null this.model.amount = null
this.model.baseSymbol = null
this.model.amountSymbol = null this.model.amountSymbol = null
this.model.extraText = null this.model.extraText = null
this.model.textLocation = null // defaults to 'above' if not set this.model.textLocation = null // defaults to 'above' if not set
@@ -134,6 +135,8 @@ export class Shape {
this.model.amount = model.amount this.model.amount = model.amount
if (defined(model.amountSymbol)) if (defined(model.amountSymbol))
this.model.amountSymbol = model.amountSymbol this.model.amountSymbol = model.amountSymbol
if (defined(model.baseSymbol))
this.model.baseSymbol = model.baseSymbol
if (defined(model.extraText)) if (defined(model.extraText))
this.model.extraText = model.extraText this.model.extraText = model.extraText
if (defined(model.breakout)) if (defined(model.breakout))
@@ -166,7 +169,7 @@ export class Shape {
newProps.linecolor = color newProps.linecolor = color
// text label // 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) if (this.model.breakout)
text += ' ' + (this.model.textLocation==='above' ? '▲Breakout▲' : '▼Breakout▼') text += ' ' + (this.model.textLocation==='above' ? '▲Breakout▲' : '▼Breakout▼')
if (this.model.extraText) if (this.model.extraText)

View File

@@ -82,7 +82,7 @@ const times = ref([])
const weights = ref([]) const weights = ref([])
const amountSymbol = computed(()=>props.order.amountIsTokenA ? co.selectedSymbol.base.s : co.selectedSymbol.quote.s ) 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(()=>{ const endTimes = computed(()=>{
if (props.builder.rungs === 1) if (props.builder.rungs === 1)

View File

@@ -349,7 +349,7 @@ function setWeights(ws) {
const amountSymbol = computed(()=>props.order.amountIsTokenA ? co.selectedSymbol.base.s : co.selectedSymbol.quote.s ) 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]) const stdWidth = computed(()=>[0, co.meanRange, 0, co.meanRange])

View File

@@ -196,7 +196,7 @@ function setPrices(ps) {prices.value = ps}
function setWeights(ws) { weights.value = ws } function setWeights(ws) { weights.value = ws }
const amountSymbol = computed(()=>props.order.amountIsTokenA ? co.selectedSymbol.base.s : co.selectedSymbol.quote.s ) 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 color = computed(()=>props.builder.color ? props.builder.color : defaultColor)
const stdWidth = computed(()=>co.meanRange) const stdWidth = computed(()=>co.meanRange)
const description = computed(()=>{ const description = computed(()=>{

View File

@@ -330,6 +330,7 @@ function makeModel(index) {
allocation: alloc, allocation: alloc,
maxAllocation: Math.max(...weights.value), maxAllocation: Math.max(...weights.value),
amount: props.order.amount * alloc, amount: props.order.amount * alloc,
baseSymbol: co.selectedSymbol.base.s,
amountSymbol: amountSymbol.value, amountSymbol: amountSymbol.value,
textLocation: above ? 'above' : 'below', textLocation: above ? 'above' : 'below',
breakout: props.builder.breakout, breakout: props.builder.breakout,

View File

@@ -251,3 +251,11 @@ export function computeInterceptSlope(time0, price0, time1, price1) {
export function defined(v) { export function defined(v) {
return v !== undefined && v !== null 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
}