Скрипт Tradingview pine — это кусок дерьма: нельзя использовать изменяемую переменную в качестве аргумента функции безопасности.

Честно говоря, как сложно реализовать параметры без проблем с серверной частью на языке сценариев. Я получаю следующую ошибку «Невозможно использовать изменяемую переменную в качестве аргумента функции безопасности» только потому, что я продолжаю передавать переменную, которая была установлена ​​в операторе if. Пробовал косвенную переменную, косвенную функцию, всевозможные перестановки, даже некоторые из них, насколько я знаю, преуспели в этом, но проблема все еще сохраняется.

Мне нужен чистый способ закодировать это без использования троичных операций или обходных функций. Тернарные операции и работа с функциями предлагаются в дублирующем вопросе, но не отвечают на то, что я ищу. Любой скриптовый или объектно-ориентированный язык программирования имеет возможность использовать операторы if для обработки параметров, а этот язык - нет.

// @version=4
study("multi_ma_pos", "multi_ma", overlay=true)

get_period(interval_input) =>
    period = ""
    if (timeframe.isintraday)
        interval = interval_input > timeframe.multiplier ? interval_input : timeframe.multiplier
        period := tostring(interval)
    else
        period := timeframe.period
    period

ma_opt = input(title="ma_opt", defval="13/34", options=["23/75/616", "13/34"])
ma_interval = input(title="ma_interval", type=input.integer, defval=240)

// Declare variables
shrt_term = close
midt_term = close
long_term = close
is_opt_selected = false

if (ma_opt == "23/75/616" and not is_opt_selected)
    shrt_term := sma(close, 23)
    midt_term := sma(close, 65)
    long_term := sma(close, 137)
    is_opt_selected := true

if (ma_opt == "13/34" and not is_opt_selected)
    shrt_term := ema(close, 13)
    midt_term := ema(close, 34)
    long_term := sma(close, 34)      
    is_opt_selected := true

shrt_term_out = security(syminfo.tickerid, get_period(ma_interval), shrt_term)
midt_term_out = security(syminfo.tickerid, get_period(ma_interval), midt_term)
long_term_out = security(syminfo.tickerid, get_period(ma_interval), long_term)

plot(shrt_term_out, title="shrt_term", color=#ffa726, linewidth=2)
plot(midt_term_out, title="midt_term", color=#ffa726, linewidth=4)
plot(long_term_out, title="long_term", color=#e65100, linewidth=4)

person LeanMan    schedule 29.12.2019    source источник
comment
comment
Не совсем. Это решение, которого я пытался избежать, код выглядит более беспорядочным с такими встроенными условиями и не масштабируется, если я добавляю более двух параметров. Честно говоря, этот пост был больше направлен на то, чтобы привлечь внимание к тому, что pinescript в tradeview отсутствует как язык, и разработчики языка должны чувствовать давление со стороны сообщества, которое считает эти ограничения нелепыми. devrant.com/ разглагольствования/1982830/   -  person LeanMan    schedule 30.12.2019
comment
Запрет на изменяемые переменные в ценной бумаге имеет некоторые фундаментальные корни. Если бы это было разрешено, пользователь мог бы получить до 8 байт * 10000 баров * 10000 различных значений = 800 МБ ОЗУ. А учитывая, что в скрипте может быть 40 ценных бумаг, пользователь может запросить 32 ГБ оперативной памяти. Я полагаю, он не обращает внимания на то, что никто этого не допустит, поэтому есть ограничение. Я посмотрел ссылку, которую вы предоставили, и это мусор. Большая часть проблем заключается в том, что люди берут простой инструмент, предназначенный только для соединения нескольких индикаторов и получения результата, и используют этот инструмент для расчета посадки на Луну.   -  person Michel_T.    schedule 30.12.2019
comment
такие ограничения все еще могут соблюдаться. Я не понимаю вашей точки зрения, поскольку компилятор сценариев pine без проблем выдает ошибку, связанную с ограничением ресурсов памяти. Я не могу использовать операторы if и не могу передать функцию ema() разной длины, потому что это вызывает проблему в этом скрипте. У меня есть еще один сценарий, в котором я могу передать изменяемую длину ema функции безопасности, и я считаю, что его версия 3 и версия 4 сосредоточены на проблеме. Дело не в том, что люди пытаются рассчитать посадку на Луну, а в том, что люди не могут отобразить 2+2 без использования сюжетной команды.   -  person LeanMan    schedule 30.12.2019
comment
Забавно, что вы упоминаете о высадке на Луну, поскольку она уже была решена почти 50 лет назад, и в то время она была новаторской. Эти языковые проблемы также были решены 10 лет назад. Возвращение назад — неразумный аргумент.   -  person LeanMan    schedule 30.12.2019
comment
Вот еще одна ерунда - когда вы пытаетесь сравнить текст между двумя строками, скрипт pine не может проверить символы, такие как &.   -  person LeanMan    schedule 30.12.2019
comment
Да, я рад, что вы поняли мою мысль - эти проблемы были решены в соответствующих инструментах, и хотя 50 лет назад в Фортране было матричное умножение из коробки, это не значит, что оно должно быть и в каждом калькуляторе - это просто глупо. Я не понял вашей проблемы с char '&' - только что проверил, все работает отлично.   -  person Michel_T.    schedule 30.12.2019
comment
В самом деле? Когда один из моих вариантов в моем примере кода имел скрипт '&', он явно работал над ним и не проверялся. Изменение его на «n» сработало. Что касается вашего другого комментария, я просто соглашусь не согласиться - это явно тупик. Я никоим образом не принимаю вашу точку зрения, я на самом деле возражаю против примечания о том, что я не могу запускать определенные фрагменты кода в операторах if и циклах for. Я прошу техподдержку ТВ скорректировать мой код, посмотрим, что скажет их команда. Я уверен, что это будет в том же духе ... о, есть ошибка, но вот ее обходной путь.   -  person LeanMan    schedule 31.12.2019


Ответы (1)


Вот ответ, основанный на предложении этой опубликовать. Это далеко не идеально, но, возможно, для тех, у кого есть эта проблема, они могут извлечь выгоду из полного круга от проблемы, предложения, а затем до решения этой некомпетентной проблемы. Надеемся, что следующее решение имеет стиль кодирования, который некоторые считают легко читаемым.

// @version=4
study("multi_ma_pos", "multi_ma", overlay=true)

get_period(interval_input) =>
    period = ""
    if (timeframe.isintraday)
        interval = interval_input > timeframe.multiplier ? interval_input : timeframe.multiplier
        period := tostring(interval)
    else
        period := timeframe.period
    period

ma_opt = input(title="ma_opt", defval="13/34", options=["23/75/616", "13/34"])
ma_interval = input(title="ma_interval", type=input.integer, defval=240)

get_multi_ma(ma_opt, ma_interval) =>
    // delcare output variables
    shrt_term_out = float(na)
    midt_term_out = float(na)
    long_term_out = float(na)

    period = get_period(ma_interval)

    shrt_term_out := (ma_opt == "23/75/616")  ? security(syminfo.tickerid, period, ema(close, 23)) 
       : security(syminfo.tickerid, period, sma(close, 13))

    midt_term_out := (ma_opt == "23/75/616")  ? security(syminfo.tickerid, period, ema(close, 75)) 
       : security(syminfo.tickerid, period, sma(close, 34))

    long_term_out := (ma_opt == "23/75/616")  ? security(syminfo.tickerid, period, ema(close, 616)) : security(syminfo.tickerid, period, ema(close, 34))

    // out the output variables
    [shrt_term_out, midt_term_out, long_term_out]

[shrt_term_out, midt_term_out, long_term_out] = get_multi_ma(ma_opt, ma_interval)

plot(shrt_term_out, title="shrt_term", color=#ffa726, linewidth=2)
plot(midt_term_out, title="midt_term", color=#ffa726, linewidth=4)
plot(long_term_out, title="long_term", color=#e65100, linewidth=4)
person LeanMan    schedule 30.12.2019