Pine script 为sma()和ema()声明变量

Pine script 为sma()和ema()声明变量,pine-script,Pine Script,我想根据选项中选择的内容绘制SMA线或EMA线 sma_or_ema = input(group = "MA", title = "Type of MA", options = ["SMA", "EMA"], defval = "SMA") ma_source = input(group = "MA", title = "Source", type = in

我想根据选项中选择的内容绘制SMA线或EMA线

sma_or_ema = input(group = "MA", title = "Type of MA", options = ["SMA", "EMA"], defval = "SMA")
ma_source = input(group = "MA", title = "Source", type = input.source, defval = close)
ma1_period = input(group = "MA", title = "SMA #1 period", type = input.integer, minval=3, maxval=200, defval = 20)
ma2_period = input(group = "MA", title = "SMA #2 period", type = input.integer, minval=3, maxval=200, defval = 50)
ma3_period = input(group = "MA", title = "SMA #3 period", type = input.integer, minval=3, maxval=200, defval = 100)
ma4_period = input(group = "MA", title = "SMA #4 period", type = input.integer, minval=3, maxval=200, defval = 200)

string ma_title = "SMA"

ma1_series = na
ma2_series = na
ma3_series = na
ma4_series = na

if sma_or_ema == "SMA"
    ma1_series := sma(ma_source, ma1_period)
    ma2_series := sma(ma_source, ma2_period)
    ma3_series := sma(ma_source, ma3_period)
    ma4_series := sma(ma_source, ma4_period)
else
    ma_title := "EMA"
    ma1_series := ema(ma_source, ma1_period)
    ma2_series := ema(ma_source, ma2_period)
    ma3_series := ema(ma_source, ma3_period)
    ma4_series := ema(ma_source, ma4_period)
    
plot(ma1_series, title = "MA #1", color = #5a0e41, linewidth = 1, trackprice = true)
plot(ma2_series, title = "MA #2", color = #752b59, linewidth = 1, trackprice = true)
plot(ma3_series, title = "MA #3", color = #8f4471, linewidth = 1, trackprice = true)
plot(ma4_series, title = "MA #4", color = #ab5d8b, linewidth = 1, trackprice = true)

不能在if语句内调用plot。不能在if语句中声明变量。使用sma()调用初始化ma_系列变量会起作用,但如果选择了EMA,则会导致不必要的处理。如何声明这些变量?

您可以将ma开关隐藏在函数中,并将输入作为参数传递:

//@version=4
study("ma-ema", overlay = true)

sma_or_ema = input(group = "MA", title = "Type of MA", options = ["SMA", "EMA"], defval = "SMA")
ma_source  = input(group = "MA", title = "Source", type = input.source, defval = close)
ma1_period = input(group = "MA", title = "SMA #1 period", type = input.integer, minval=3, maxval=200, defval = 20)
ma2_period = input(group = "MA", title = "SMA #2 period", type = input.integer, minval=3, maxval=200, defval = 50)
ma3_period = input(group = "MA", title = "SMA #3 period", type = input.integer, minval=3, maxval=200, defval = 100)
ma4_period = input(group = "MA", title = "SMA #4 period", type = input.integer, minval=3, maxval=200, defval = 200)

f_ma(_type, _source, _length) =>
    if _type == "SMA"
        sma(_source, _length)
    else
        ema(_source, _length)

ma1_series = f_ma(sma_or_ema, ma_source, ma1_period)
ma2_series = f_ma(sma_or_ema, ma_source, ma2_period)
ma3_series = f_ma(sma_or_ema, ma_source, ma3_period)
ma4_series = f_ma(sma_or_ema, ma_source, ma4_period)

plot(ma1_series)
plot(ma2_series)
plot(ma3_series)
plot(ma4_series)