繁体   English   中英

PineScript:将“for loop”索引传递给 function 不起作用

[英]PineScript: passing 'for loop" index to a function does not work

为了检查 security() 功能,我编写了非常简单的代码:

get_val( _idx ) => 
    security( syminfo.tickerid, "30", low[ _idx ] ) 

if barstate.islast
    for i = 1 to 10 
        curr_val = get_val( i ) 
        // curr_val = low[i] 
        label2 = label.new( bar_index-i, low[i]-300, text = tostring( curr_val, "0" ), 
             style = label.style_label_center, color = color.green, size = size.small)

我希望它会在每根蜡烛上正确打印“低”值,但由于未知原因,它没有正确地将“i”的值传递给 get_val() function。

Q1。 当它是'for循环'索引时,'i'有什么问题

Q2。 我的目标是当我到达图表中的最后一根蜡烛时,在最后 9 个 30 分钟期间获得特定股票代码的高/低/ohlc4 值,并基于此计算这 9 个期间的平均价格差异——通过 security() 执行此操作的正确/有效/有效方法是什么,因为我希望在一个图表中为几个不同的代码计算它。

我阅读了https://www.tradingview.com/script/90mqACUV-MTF-Selection-Framework-PineCoders-FAQ/https://www.tradingview.com/pine-script-docs/en/v4/中的信息essential/Context_switching_the_security_function.htmlhttps://www.tradingview.com/script/00jFIl5w-security-revisited-PineCoders/ ,但我仍然找不到有效的解决方案

先感谢您!

您不能在循环内部使用这样的security() 无论您需要在security()的 HTF 上下文中完成什么,都必须在发送给它的 function 中完成。 这显示了几个例子。

不确定f_htf5()是否符合您的想法,但它会给您一个想法。 当发送到security()的 function 返回一个元组时,处理重绘/不重绘会更加棘手:

//@version=4
study("", "", true)
var string ON  = "On"
var string OFF = "Off"
bool i_repaint = input(OFF, "Repaint", options = [ON, OFF]) == ON

f_htf1(_src, _p) =>
    // #1 Avg of last `_p` values of `_src`
    float _return = sma(_src, _p)
    
f_htf2(_src, _p) =>
    // #2 Sum of last `_p` values of `_src`
    float _return = sum(_src, _p)
    
f_htf3(_src, _p) =>
    // #3 Last value is lower than all `_p` past values
    int _return = _src < lowest(_src, _p)[1] ? 1 : 0
    
f_htf4(_src, _p) =>
    // #4 Find the closest value to `_src` in `_p` past values
    float _delta = 10e15
    float _closestVal = na
    for _i = 1 to _p
        float _diff = abs(_src - _src[_i])
        if _diff < _delta
            _delta := _diff
            _closestVal := _src[_i]
    float _return = _closestVal

f_htf5(_p, _offset) =>
    // #4 Return the avg of past `_p` `high`, `low`, `ohlc4` values
    float _hi = sma(high, _p)
    float _lo = sma(low, _p)
    float _ohlc4 = sma(ohlc4, _p)
    [_hi[_offset], _lo[_offset], _ohlc4[_offset]]

// Function from: https://www.tradingview.com/script/00jFIl5w-security-revisited-PineCoders/
f_security(_sym, _res, _src, _rep) => security(_sym, _res, _src[not _rep and barstate.isrealtime ? 1 : 0])[_rep or barstate.isrealtime ? 0 : 1]

// For functions returning one value (f_htf1 - f_htf4), execute the function in `security()`'s HTF context.
htfValue = f_security(syminfo.tickerid, "30", f_htf3(low, 10), i_repaint)

// For functions returning a tuple.
int ofst1 = not i_repaint and barstate.isrealtime ? 1 : 0
int ofst2 = i_repaint or barstate.isrealtime ? 0 : 1
[hi01_, lo01_, ohlc01_] = security(syminfo.tickerid, "30", f_htf5(9, ofst1))
float hi01   = hi01_[ofst2]
float lo01   = lo01_[ofst2]
float ohlc01 = ohlc01_[ofst2]

plot(hi01, "hi01", color.fuchsia)
plot(lo01, "lo01", color.aqua)
plot(ohlc01, "ohlc01", color.green)

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM