三元运算符 ?: 抛出关于错误参数的错误

ternary operator ?: is throwing errors about wrong arguments

我正在尝试在给定的时间框架图表上显示不同的时间框架 MACD。因此在 1 分钟图表等上显示 5 分钟 macd

我决定通过将整数 5 乘以整数间隔然后将其转换为字符串并在绘图中使用它来实现。 这很好用,因为我不需要;每次我将图表的时间范围从 1 分钟更改为 10 分钟等时都不必更改它,并且它仍会显示基于倍数的更长时间范围的 macd。

以下代码使用三元运算符可以正常工作 ?:

//@version = 2
study(title="test")

source = close
fastLength = input(12, minval=1)
slowLength=input(26,minval=1)
signalLength=input(9,minval=1)

// res5 mutiplies the current interval which is an integer by a factor 5 and turns it into a string with the value of "interval*5" or "1D" depending on the value of interval*5

res5= interval*5 < 1440 ? tostring(interval*5) : "1D"

src5=security(tickerid, res5, close)

fastMA5 = ema(src5, fastLength)
slowMA5 = ema(src5, slowLength)

macd5 = fastMA5 - slowMA5
signal5 = sma(macd5, signalLength)
outMacD5 = security(tickerid, res5, macd5)

plot( outMacD5 ? outMacD5 : na, color= red)

但是,如果我将其更改为具有如下所示的更多条件,则三元运算符将失败。

//@version = 2
study(title="test")

source = close
fastLength = input(12, minval=1)
slowLength=input(26,minval=1)
signalLength=input(9,minval=1)

// res5 mutiplies the current interval which is an integer by a factor 5 and turns it into a string with the value of "interval*5" or "1D" depending on the value 9of inteval*5

//res5= interval*5 < 1440 ? tostring(interval*5) : "1D"

res5= interval*5 < 1440 ? tostring(interval*5) : interval >= 1440 and interval*5 < 2880 ? "1D":na

src5=security(tickerid, res5, close)

fastMA5 = ema(src5, fastLength)
slowMA5 = ema(src5, slowLength)

macd5 = fastMA5 - slowMA5
signal5 = sma(macd5, signalLength)
outMacD5 = security(tickerid, res5, macd5)

plot( outMacD5 ? outMacD5 : na, color= red)

这带回了错误

Add to Chart operation failed, reason: Error: Cannot call `operator ?:` with arguments (bool, literal__string, na); available overloads ...

使用 iff 会返回关于参数不正确的相同错误。

我真的需要一些帮助。我迷失了使用这些条件运算符。

任何提示都有帮助。

使用这个:

res5= interval*5 < 1440 ? tostring(interval*5) : interval >= 1440 and interval*5 < 2880 ? "1D": ""
plotchar(res5=="5", "res5 test", "", location=location.top)

plotchar() 调用将允许您确认 res5 的值。在这里它被测试为“5”,因此您将能够在数据 Window 中验证它的值是 1 ->当您在 1 分钟图表上时为真。

[编辑 2019.08.19 09:02 — LucF] 您的问题是关于三元组不起作用,上面的代码解决了这个问题。根据您的评论,您还需要一个更完整的函数来计算 v2 中当前时间范围的倍数。使用这个:

f_MultipleOfRes( _mult) => 
    // Convert target timeframe in minutes.
    _TargetResInMin = interval * _mult * (
      isseconds   ? 1. / 60. :
      isminutes   ? 1. :
      isdaily     ? 1440. :
      isweekly    ? 7. * 24. * 60. :
      ismonthly   ? 30.417 * 24. * 60. : na)
      // Find best way to express the TF.
    _TargetResInMin     <= 0.0417       ? "1S"  :
      _TargetResInMin   <= 0.167        ? "5S"  :
      _TargetResInMin   <= 0.376        ? "15S" :
      _TargetResInMin   <= 0.751        ? "30S" :
      _TargetResInMin   <= 1440         ? tostring(round(_TargetResInMin)) :
      tostring(round(min(_TargetResInMin / 1440, 365))) + "D"

请参阅 here 了解用例,但不要使用该功能代码,因为它是 v4。