Как добавить выбор опций для этого кода для скрипта pine?
вместо этого кода:
distance = input.int(250, 'Time range', minval=5, step=10)
к :
distance = input.string(defval = '100', title = 'distance', options = ['100', '200', '300' , '500'], group = 'Settings')
Чтобы сделать поддержки и сопротивления, выбрав «Временной диапазон» «Чувствительность»
как вы видите это на картинке:
Я думаю, что индикатор уже есть на Tradingview, но я его не нахожу.
//@version=5
indicator('Classic_Levels', overlay=true)
// number of candles used
distance = input.int(250, 'Time range', minval=5, step=10)
// sensitivity when searching levels
sensitivity = input.float(1, 'Sensitivity', minval=0.1, step=0.1)
// weight coefficients
float wOpenClose = 1
float wHighLow = 0.5
float wCross = 0.5
// number of intervals
int n_intervals = 300
// block size (in intervals)
int block_size = 11
// minimum and maximum values
float min_value = barstate.islast ? low[-ta.lowestbars(distance)] : 0
float max_value = barstate.islast ? high[-ta.highestbars(distance)] : 0
// recalculate sensitivity according to the weights
float sens = barstate.islast ? 2 / (sensitivity * (wOpenClose + wHighLow + wCross)) : 0
// calculate everything on the last bar
if barstate.islast
// number of "key points" falling into each interval
// last element is stored but not used
m = array.new_int(n_intervals + 1, 0)
// sum of the "scores" of the points falling into each interval
// last element is stored but not used
r = array.new_float(n_intervals + 1, 0)
// sums of the interval forming the block
a = array.new_float(block_size, 0)
// declaring variables
int i_close = na
int i_open = na
int i_high = na
int i_low = na
int mn = na
int mx = na
float interval_size = (max_value - min_value) / float(n_intervals)
// populate arrays r, m
for k = 1 to distance - 1 by 1
i_close := math.floor((close[k] - min_value) / interval_size)
i_open := math.floor((open[k] - min_value) / interval_size)
i_high := math.floor((high[k] - min_value) / interval_size)
i_low := math.floor((low[k] - min_value) / interval_size)
array.set(r, i_close, array.get(r, i_close) + wOpenClose)
array.set(r, i_open, array.get(r, i_open) + wOpenClose)
array.set(r, i_high, array.get(r, i_high) + wHighLow)
array.set(r, i_low, array.get(r, i_low) + wHighLow)
array.set(m, i_close, array.get(m, i_close) + 1)
array.set(m, i_open, array.get(m, i_open) + 1)
array.set(m, i_high, array.get(m, i_high) + 1)
array.set(m, i_low, array.get(m, i_low) + 1)
// if current candle crosses the interval
if math.abs(i_open - i_close) >= 2
mn := math.min(i_open, i_close)
mx := math.max(i_open, i_close)
for i = mn + 1 to mx - 1 by 1
array.set(r, i, array.get(r, i) - wCross)
array.set(m, i, array.get(m, i) + 1)
// current block sum
float cur_block = 0
// last extremum
float extr_block = 0
// number of the first interval of extremum block
int extr_val = 0
// level value
float level_val = 0
// initial state: level search
bool state = false
// current interval sum
float cur_sum = 0
// iterate intervals
for i = 0 to n_intervals + block_size - 2 by 1
// shift all the interval sums
array.shift(a)
if i < n_intervals
array.push(a, array.get(r, i) / array.get(m, i))
else
array.push(a, 0)
// current block sum
cur_block := array.sum(a)
// check state
if not state
// searching level: <extr_block> keeps the last maximum
if i == 0 or cur_block > extr_block
extr_block := cur_block
extr_val := i - block_size + 1
extr_val
else
// if we've gone far enough from the maximum downwards
if extr_block - cur_block >= sens or i == n_intervals - 1
// draw level
level_val := min_value + interval_size * (extr_val + float(block_size) / 2)
line.new(bar_index - 1, level_val, bar_index, level_val, style=line.style_solid, extend=extend.both, color=color.blue, width=1)
extr_block := cur_block
extr_val := i - block_size + 1
state := true
state
else
// level is found: <extr_block> keeps the last minimum
if cur_block < extr_block
extr_block := cur_block
extr_val := i - block_size + 1
extr_val
else
// if we've gone far enough from the minimum upwards
if cur_block - extr_block >= sens
extr_block := cur_block
extr_val := i - block_size + 1
state := false
state
plotshape(barstate.islast, style=shape.circle, color=color.new(color.navy, 0), size=size.tiny, offset=-distance)
если вы попытаетесь запустить этот скрипт, придет неправильный месседж 16:59:11 — Ошибка компиляции. Строка 5: невозможно вызвать input.float с аргументом defval = 100. Был использован аргумент типа «литеральная строка», но ожидается «const float» в строке 5: невозможно вызвать «input.float» с аргументом «options» = «100,150,200,250,450,750,1000». Был использован аргумент типа «[строка-литерал, строка-литерал, строка-литерал, строка-литерал, строка-литерал, строка-литерал, строка-литерал]», но ожидается «[const float...]», строка 55: конечное значение цикл for должен быть числом.
input.string
вернет string
, даже если вы используете только числа.
Итак, вам нужно преобразовать строку в числовой тип. Вы можете использовать str.tonumber()
для этого. Он вернет float
. Если вам нужен int
, вам нужно преобразовать возвращаемое значение str.tonumber()
в int
.
in_distance = input.string(defval = '100', title = 'distance', options = ['100', '200', '300' , '500'], group = 'Settings')
distance_float = str.tonumber(in_distance) // This will return a float
distance_int = int(distance_float) // This will return an int
Просто удалите минвал и шаг.
Например
distance = input.int(250, 'Time range', options=[250,500,1000])
Объяснение: Не нужно паас minval, maxval и step, если вы используете опции
Вы можете сделать то же самое с input.float()
спасибо, вы можете помочь мне добавить цену для поддержки и сопротивления
Я не уверен, что вы спрашиваете. Похоже, вы уже знаете, как использовать
input.string
с аргументомoptions
. Где именно вам нужна помощь?