如何克服“绘图”和“填充”功能限制

时间:2021-05-07 20:17:36

标签: pine-script

我是一名专业的 C 程序员,现在我在 Pinescript 中迈出了第一步:-)
所以我写了一个简单而有效的脚本:

study("test - 1")

var float sum = 0
var float prev_sum = 0
var float per = 0
prev_sum := 0
sum := 0
per := 0

f_print( _text, _color, _y ) =>
    var _label = label.new( x=bar_index-4, y=1, text = _text, xloc = xloc.bar_index, yloc = yloc.price, color = color(na), style = label.style_none, textcolor = _color, size = size.small, textalign = text.align_right )
    label.set_xy( _label, bar_index -20, _y +5 )
    label.set_text( _label, _text )

p0 = plot( 0, title="X axle", color = color.black )

t1 = "CRYPTOCAP:BTC.D"
per := security( t1, timeframe.period, ohlc4 )
sum := sum + per
p1 = plot( sum, title=t1, color = color.red )
fill( p0, p1, color.red )

f_print( "BTC.D  " + tostring( round( per, 3 ) ), color.red, prev_sum )
prev_sum := sum

t2 = "CRYPTOCAP:ETH.D"
per := security( t2, timeframe.period, ohlc4 )
sum := sum + per
p2 = plot( sum, title=t2, color = color.blue )
fill( p1, p2, color.blue )

f_print( "ETH.D  " + tostring( round( per, 3 ) ), color.blue, prev_sum )

而且它工作得很好,
问题是我想再添加十几个用于绘图的代码,
所以我尝试优化我的代码并为重复部分创建一个函数:

study( "test - 2" )

var float sum = 0
sum := 0

f_print( _text, _color, _y ) =>
    var _label = label.new( x=bar_index, y=1, text=_text, xloc=xloc.bar_index, yloc=yloc.price, color=color(na), style=label.style_none, textcolor=_color, size=size.small, textalign=text.align_right )
    label.set_xy( _label, bar_index -20, _y +5 )
    label.set_text( _label, _text )


plot_domin( _ticker, _sum, _pl, _color ) =>
    per = security( _ticker, timeframe.period, ohlc4 )
    loc_sum = _sum + per
    pl_ret = plot( loc_sum, title=_ticker, color = _color )
    fill( _pl, pl_ret, color.red )
    f_print( _ticker + " " + tostring( round( per, 3 ) ), _color, _sum )
    [ loc_sum, pl_ret ]


p0 = plot( 0, title="X axle", color = color.black )
[ sum, p1 ] = plot_domin( "CRYPTOCAP:BTC.D", sum, p0, color.red  )
[ sum, p2 ] = plot_domin( "CRYPTOCAP:ETH.D", sum, p1, color.blue  )

但在这里我遇到了两个限制:

line 23: Cannot use 'plot' in local scope.;
line 24: Cannot call 'fill' with arguments (<plot_domin_arg2_type>, plot, const color); available overloads: fill(hline, hline, series[color], input integer, const string, const bool, const bool, string) => void; fill(plot, plot, series[color], input integer, const string, const bool, input integer, const bool, string) => void;

最奇怪的是它在抱怨

line 31: 'sum' is already defined.

所以我什至不能为“sum”使用一个相同的变量,我必须使用“sum1”、“sum2”、...

任何想法,如何避免代码的重复部分和
避免在函数的每个返回值上使用不同变量的乘法?

先感谢您! :-)

1 个答案:

答案 0 :(得分:0)

这应该会让你开始:

age

注意:

  • 我们仅使用 //@version=4 study("") var string sym01 = "CRYPTOCAP:BTC.D" var string sym02 = "CRYPTOCAP:ETH.D" var color c_sym01 = color.red var color c_sym02 = color.blue var float sum = 0. f_print( _text, _color, _y, _line ) => var _label = label.new( bar_index, na, "", color = color(na), style = label.style_label_lower_left, textcolor = _color, size = size.small, textalign = text.align_right ) if barstate.islast label.set_xy( _label, bar_index, _y) label.set_text( _label, _text) label.set_textcolor( _label, _color ) f_domin( _ticker, _color, _y, _line) => // Use `nz()` to account for cases where there is no data on the tickers. _return = nz(security( _ticker, timeframe.period, ohlc4 )) // Generate label text. _newLines = array.join(array.new_string(max(0, _line - 1), "\n")) _text = _ticker + tostring( _return, " #.000" ) + _newLines // Display label. f_print(_text, _color, _y, _line) _return p_00 = plot( 0, title="X axle", color = color.black ) sum += f_domin(sym01, c_sym01, sum[1], 1) p_01 = plot( sum, sym01, c_sym01 ) sum += f_domin(sym02, c_sym02, sum[1], 2) p_02 = plot( sum, sym02, c_sym02 ) fill( p_00, p_01, c_sym01 ) fill( p_00, p_02, c_sym02 ) 在数据集的第一个条形上初始化字符串和颜色。
  • 我们需要将 varplot() 调用保留在函数之外,因为它们不允许出现在那里。但是,我们可以从 fill() 中创建标签。
相关问题