如何基于市值为Pine Script输入字段设置默认值?
问题原因
Pine Script 中input.float()的默认参数要求是常量值,你代码里的acc是随K线周期变化的序列变量。输入框的默认值在脚本初始化阶段就会被确定,只会取acc的第一个历史值,后续acc的变化不会同步到输入框默认值里,这就是你遇到的序列问题。
正确实现方式
根据需求,有两种常见的实现思路:
思路1:根据首次加载的市值设置输入框初始默认值
如果只需要在脚本第一次加载时,根据当前标的市值设置输入框的初始默认值,之后用户可以手动修改输入值,可使用var变量配合barstate.islastconfirmedhistory来仅计算一次初始值:
//@version=5 indicator("Factor", overlay=true, timeframe="", timeframe_gaps=true) // 计算市值 _Outstanding = request.financial(syminfo.tickerid, "TOTAL_SHARES_OUTSTANDING", "FQ") _mv = _Outstanding * close // 仅在脚本首次加载时计算初始默认值 var float default_acc = na if barstate.islastconfirmedhistory if _mv >= 1.0 default_acc := 10.0 else default_acc := 2.0 // 使用计算好的初始默认值创建输入框 atrfactor = input.float(default_acc, "factor", minval = 1.0, step = 0.1) plotchar(_mv, "MV", "", location = location.top) plot(atrfactor, "ATR Factor", color=color.blue)
思路2:动态使用市值对应的因子,同时保留手动修改权限
如果希望用户未修改输入框时,自动根据当前市值动态调整因子;用户修改后则使用手动输入的值,可通过判断输入框是否被修改来实现:
//@version=5 indicator("Factor", overlay=true, timeframe="", timeframe_gaps=true) // 计算市值 _Outstanding = request.financial(syminfo.tickerid, "TOTAL_SHARES_OUTSTANDING", "FQ") _mv = _Outstanding * close // 定义输入框,初始默认值设为基础值 atrfactor_input = input.float(5.0, "factor", minval = 1.0, step = 0.1) // 动态计算市值对应的因子 dynamic_acc = _mv >= 1.0 ? 10.0 : 2.0 // 最终使用的因子:用户修改过输入框则用输入值,否则用动态计算值 final_atrfactor = input.getuserinput(atrfactor_input) ? atrfactor_input : dynamic_acc plotchar(_mv, "MV", "", location = location.top) plot(final_atrfactor, "Final ATR Factor", color=color.red)
关键说明
var变量用于存储仅初始化一次的值,避免每次K线都重新计算。barstate.islastconfirmedhistory确保只在最后一根已确认的K线上计算初始值,避免回测过程中反复修改默认值。input.getuserinput()用于判断用户是否手动修改过输入框的值,以此决定最终使用的值。
内容的提问来源于stack exchange,提问作者AndiAna
相关产品推荐
相关产品推荐

