通过两点的半对数刻度直线方程

The equation of a straight line on semi - logarithmic scale passing through two points

我要的是半对数刻度上通过两点的直线方程。我将在指标中使用它。 基本方程如下:

y = k * 10 ^ mx
m = slope of line = ∆(log y) / ∆x
k = y-intercept: value of y where line crosses the x = 0 axis

例如:

x0 = 69
x1 = 174
y0 = 0.0000296
y1 = 0.0001652
m = (log10(y1) - log10(y0)) / (x1 - x0)
k = y0 / pow(10, m * x0)
y = k * pow(10, m * bar_index)
plot(y)

虽然这个方程是绝对正确的,但在对数刻度上绘制它的结果是一条曲线: https://www.tradingview.com/x/5Tl0lDK0/

然后我意识到,显然在价格 < 0.001 范围内,Tradingview 的对数图表不是对数工作的!

查看这张图片:https://www.tradingview.com/i/3vWZsxND/

我很困惑。

有谁知道原因吗?

图表刻度对应的方程式是什么?

如果可以请帮忙

您可以使用以下代码片段来近似所需的曲线。

x0 = 69
x1 = 174
y0 = 0.0000296
y1 = 0.0001652
m = (log(y1) - log(y0)) / (log(x1) - log(x0))
y = y1* pow(bar_index/x1, m)
plot(y)

虽然这不提供精确匹配,但曲线彼此非常接近,您可以使用此表格进行计算。

关于小值的比例,这是预期的行为。 TradingView 上的一些图表可能会进入负区域。这在真正的对数刻度上是不可能完成的,这就是为什么实际刻度在一个点之前只是对数,然后变成线性的。这是一个必要的折衷,以适应边缘情况,例如具有负值的图表、坐标低于 0 的绘图等。

[编辑 2021.06.07 10:08 — LucF]

计算公式如下:

//@version=4
study("My Script", overlay=true)
x1 = bar_index[10]
y1 = input(0)
x2 = bar_index
y2 = input(1000)
xi = bar_index[4]
isLog = input(true)
LOGICAL_OFFSET = 4
COORD_OFFSET = 0.0001
f_toLog(_price) =>
    _m = abs(_price)
    _res = log10(_m + COORD_OFFSET) + LOGICAL_OFFSET
    _m < 1e-8 ? 0 : _price < 0 ? - _res : _res
f_fromLog(_logical) =>
    _m = abs(_logical)
    _res = pow(10, _m - LOGICAL_OFFSET) - COORD_OFFSET
    _m < 1e-8 ? 0 : _logical < 0 ? - _res : _res
f_lineGetPrice(_x1, _y1, _x2, _y2, _xi) =>
    _y1 + (_y2 - _y1) / (_x2 - _x1) * (_xi - _x1)
f_lineGetPriceLog(_x1, _y1, _x2, _y2, _xi) =>
    _y1Log = f_toLog(_y1)
    _y2Log = f_toLog(_y2)
    _target = f_lineGetPrice(_x1, _y1Log, _x2, _y2Log, _xi)
    f_fromLog(_target)
if barstate.islast
    l1 = line.new(x1, y1, x2, y2)
    labelHeightxiBarsBack = isLog ? f_lineGetPriceLog(x1, y1, x2, y2, xi) : f_lineGetPrice(x1, y1, x2, y2, xi)
    label.new(xi, labelHeightxiBarsBack, text = tostring(labelHeightxiBarsBack))