【问题标题】:Tradingview Pinescript to Python ConversionTradingview Pinescript 到 Python 的转换
【发布时间】:2022-06-20 18:07:27
【问题描述】:

我一直在尝试将以下 Pinescript 转换为 Python,但没有取得多大成功。我已经能够转换其中的大部分,但我卡住的地方是被下面的“***”包围的 sn-p。我试过逐行挑选它,我在 Python 中尝试了不同的排列,但我无法让它完全工作。有没有人尝试过类似的事情?这是原链接

https://www.tradingview.com/script/n8AGnIZd-Divergence-for-Many-Indicators-v4/

Pinescript 代码

positive_regular_positive_hidden_divergence(src, cond)=>
    divlen = 0
    prsc = source == "Close" ? close : low
    // if indicators higher than last value and close price is higher than las close 
    if dontconfirm or src > src[1] or close > close[1]
        startpoint = dontconfirm ? 0 : 1 // don't check last candle
        // we search last 15 PPs
        for x = 0 to maxpp - 1
            len = bar_index - array.get(pl_positions, x) + prd
            // if we reach non valued array element or arrived 101. or previous bars then we don't search more
            if array.get(pl_positions, x) == 0 or len > maxbars
                break
            if len > 5 and 
               ((cond == 1 and src[startpoint] > src[len] and prsc[startpoint] < nz(array.get(pl_vals, x))) or
               (cond == 2 and src[startpoint] < src[len] and prsc[startpoint] > nz(array.get(pl_vals, x))))
                slope1 = (src[startpoint] - src[len]) / (len - startpoint)
                virtual_line1 = src[startpoint] - slope1
                slope2 = (close[startpoint] - close[len]) / (len - startpoint)
                virtual_line2 = close[startpoint] - slope2
                arrived = true
                ***for y = 1 + startpoint to len - 1
                    if src[y] < virtual_line1 or nz(close[y]) < virtual_line2
                        arrived := false
                        break
                    virtual_line1 := virtual_line1 - slope1
                    virtual_line2 := virtual_line2 - slope2
                
                if arrived
                    divlen := len
                    break***
    divlen

【问题讨论】:

    标签: python pine-script


    【解决方案1】:

    这很痛苦,但我想通了。循环结构正是它的样子。问题在我的原始代码中。以下工作正常,但速度很慢。谁能建议一个更快的循环机制?

        for idx in df.index:
            try:
                for y in range(2,int(df['len'][idx])):
                    if df['calcinner'][idx] == 1:
                        if ((df[metric][idx - y] < df['vline1'][idx]) | (df['ha_close'][idx - y] < df['vline2'][idx]))==True:
                            df['arrived'][idx] = 0
                            break
                            
                        df['vline1'][idx] = df['vline1'][idx] - df['slope1'][idx]
                        df['vline2'][idx] = df['vline2'][idx] - df['slope2'][idx]
    
                if df['calcinner'][idx] == 1 & df['arrived'][idx] == 1:
                    df['diverge'][idx] = df['diverge'][idx] + df['len'][idx] 
    
            except:
                print('skip this line')
    

    【讨论】:

      【解决方案2】:

      正如您之前在 pine 脚本上工作的那样,您能否帮我将其中一个 pine 脚本转换为 python

      // This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
      // © LuxAlgo
      //@version=5
      
      indicator("Nadaraya-Watson Envelope [LUX]",overlay=true,max_bars_back=1000,max_lines_count=500,max_labels_count=500)
      length = input.float(500,'Window Size',maxval=500,minval=0)
      h      = input.float(8.,'Bandwidth')
      mult   = input.float(3.) 
      src    = input.source(close,'Source')
      
      up_col = input.color(#39ff14,'Colors',inline='col')
      dn_col = input.color(#ff1100,'',inline='col')
      //----
      n = bar_index
      var k = 2
      var upper = array.new_line(0) 
      var lower = array.new_line(0) 
      
      lset(l,x1,y1,x2,y2,col)=>
          line.set_xy1(l,x1,y1)
          line.set_xy2(l,x2,y2)
          line.set_color(l,col)
          line.set_width(l,2)
      
      if barstate.isfirst
          for i = 0 to length/k-1
              array.push(upper,line.new(na,na,na,na))
              array.push(lower,line.new(na,na,na,na))
      //----
      line up = na
      line dn = na
      //----
      cross_up = 0.
      cross_dn = 0.
      if barstate.islast
          y = array.new_float(0)
          
          sum_e = 0.
          for i = 0 to length-1
              sum = 0.
              sumw = 0.
              
              for j = 0 to length-1
                  w = math.exp(-(math.pow(i-j,2)/(h*h*2)))
                  sum += src[j]*w
                  sumw += w
              
              y2 = sum/sumw
              sum_e += math.abs(src[i] - y2)
              array.push(y,y2)
      
          mae = sum_e/length*mult
          
          for i = 1 to length-1
              y2 = array.get(y,i)
              y1 = array.get(y,i-1)
              
              up := array.get(upper,i/k)
              dn := array.get(lower,i/k)
              
              lset(up,n-i+1,y1 + mae,n-i,y2 + mae,up_col)
              lset(dn,n-i+1,y1 - mae,n-i,y2 - mae,dn_col)
              
              if src[i] > y1 + mae and src[i+1] < y1 + mae
                  label.new(n-i,src[i],'▼',color=#00000000,style=label.style_label_down,textcolor=dn_col,textalign=text.align_center)
              if src[i] < y1 - mae and src[i+1] > y1 - mae
                  label.new(n-i,src[i],'▲',color=#00000000,style=label.style_label_up,textcolor=up_col,textalign=text.align_center)
          
          cross_up := array.get(y,0) + mae
          cross_dn := array.get(y,0) - mae
      
      alertcondition(ta.crossover(src,cross_up),'Down','Down')
      alertcondition(ta.crossunder(src,cross_dn),'Up','Up')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 2021-08-15
        • 2020-09-10
        相关资源
        最近更新 更多