三元运算符 ?: 抛出关于错误参数的错误
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。
我正在尝试在给定的时间框架图表上显示不同的时间框架 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。