UNPKG

trading-vue3-js

Version:

Customizable charting lib for traders. Based on https://github.com/C451/trading-vue-js by C451.

129 lines (104 loc) 3.29 kB
// Math/Geometry export default { // Distance from point to line // p1 = point, (p2, p3) = line point2line(p1, p2, p3) { let { area, base } = this.tri(p1, p2, p3) return Math.abs(this.tri_h(area, base)) }, // Distance from point to segment // p1 = point, (p2, p3) = segment point2seg(p1, p2, p3) { let { area, base } = this.tri(p1, p2, p3) // Vector projection let proj = this.dot_prod(p1, p2, p3) / base // Distance from left pin let l1 = Math.max(-proj, 0) // Distance from right pin let l2 = Math.max(proj - base, 0) // Normal let h = Math.abs(this.tri_h(area, base)) return Math.max(h, l1, l2) }, // Distance from point to ray // p1 = point, (p2, p3) = ray point2ray(p1, p2, p3) { let { area, base } = this.tri(p1, p2, p3) // Vector projection let proj = this.dot_prod(p1, p2, p3) / base // Distance from left pin let l1 = Math.max(-proj, 0) // Normal let h = Math.abs(this.tri_h(area, base)) return Math.max(h, l1) }, tri(p1, p2, p3) { let area = this.area(p1, p2, p3) let dx = p3[0] - p2[0] let dy = p3[1] - p2[1] let base = Math.sqrt(dx * dx + dy * dy) return { area, base } }, /* Area of triangle: p1 / \ p2 _ p3 */ area (p1, p2, p3) { return ( p1[0] * (p2[1] - p3[1]) + p2[0] * (p3[1] - p1[1]) + p3[0] * (p1[1] - p2[1]) ) }, // Triangle height tri_h(area, base) { return area / base }, // Dot product of (p2, p3) and (p2, p1) dot_prod(p1, p2, p3) { let v1 = [p3[0] - p2[0], p3[1] - p2[1]] let v2 = [p1[0] - p2[0], p1[1] - p2[1]] return v1[0] * v2[0] + v1[1] * v2[1] }, // Symmetrical log log(x) { // TODO: log for small values return Math.sign(x) * Math.log(Math.abs(x) + 1) }, // Symmetrical exp exp(x) { return Math.sign(x) * (Math.exp(Math.abs(x)) - 1) }, // Middle line on log scale based on range & px height log_mid(r, h) { let log_hi = this.log(r[0]) let log_lo = this.log(r[1]) let px = h / 2 let gx = log_hi - px * (log_hi - log_lo) / h return this.exp(gx) }, // Return new adjusted range, based on the previous // range, new $_hi, target middle line re_range(r1, hi2, mid) { let log_hi1 = this.log(r1[0]) let log_lo1 = this.log(r1[1]) let log_hi2 = this.log(hi2) let log_$ = this.log(mid) let W = (log_hi2 - log_$) * (log_hi1 - log_lo1) / (log_hi1 - log_$) return this.exp(log_hi2 - W) }, // Return new adjusted range, based on the previous // range, new $_hi, target middle line + dy (shift) // WASTE /*range_shift(r1, hi2, mid, dy, h) { let log_hi1 = this.log(r1[0]) let log_lo1 = this.log(r1[1]) let log_hi2 = this.log(hi2) let log_$ = this.log(mid) let W = h * (log_hi2 - log_$) / (h * (log_hi1 - log_$) / (log_hi1 - log_lo1) + dy) return this.exp(log_hi2 - W) }*/ }