找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 10|回复: 0

tradingview指标策略转码有人会吗

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-26 01:54:00 | 显示全部楼层 |阅读模式
我有一个基于tradingview指标的策略想写成量化,但是ai写不出效果,手动回测下来效果是不错的,有大佬会写吗?指标源码是这个,免费的

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//   __    __            __       __  __                  __       __                        __      __    __              __      _______             __    __                                          __
//  /  |  /  |          /  |  _  /  |/  |                /  \     /  |                      /  |    /  \  /  |            /  |    /       \           /  \  /  |                                        /  |
//  $ |  $ |  ______  $ | / \ $ |$ |____    ______  [        DISCUZ_CODE_17        ]nbsp; \   /$ | __    __   _______  _$ |_   [        DISCUZ_CODE_17        ]nbsp; \ $ |  ______   _$ |_   $  |  ______  [        DISCUZ_CODE_17        ]nbsp; \ $ |  ______   _____  ____    ______    ____$ |
//  $ |__$ | /      \ $ |/[        DISCUZ_CODE_17        ]nbsp; \$ |[        DISCUZ_CODE_17        ]nbsp;     \  /      \ $  \ /$ |/  |  /  | /       |/ [        DISCUZ_CODE_17        ]nbsp;  |  $  \$ | /      \ / [        DISCUZ_CODE_17        ]nbsp;  |  $ |__$ | /      \ $  \$ | /      \ /     \/    \  /      \  /    $ |
//  [        DISCUZ_CODE_17        ]nbsp;   $ |/$[        DISCUZ_CODE_17        ]nbsp; |$ /$  $ |$  |/$[        DISCUZ_CODE_17        ]nbsp; |$  /$ |$ |  $ |/$/ $/   $  $ |/$[        DISCUZ_CODE_17        ]nbsp; |$/   [        DISCUZ_CODE_17        ]nbsp;   [        DISCUZ_CODE_17        ]lt; /$[        DISCUZ_CODE_17        ]nbsp; |$  $ | $[        DISCUZ_CODE_17        ]nbsp; |$ $  |/$[        DISCUZ_CODE_17        ]nbsp; |/$ |
//  $ |[        DISCUZ_CODE_17        ]nbsp;   $ |$ $/$ $ |$ |  $ |$ |  $ |$ $ $/$ |$ |  $ |[        DISCUZ_CODE_17        ]nbsp;     \   $ | __ $ $ $ |$ |  $ |  $ | __ $  |[        DISCUZ_CODE_17        ]nbsp;   $ |$ $ $ | /    $ |$ | $ | $ |[        DISCUZ_CODE_17        ]nbsp;   $ |$ |  $ |
//  $ |  $ |$/ $/  $ |$ |  $ |$ \__$ |$ |$/ $ |$ \__$ | $[        DISCUZ_CODE_17        ]nbsp; |  $ |/  |$ |$ |$ \__$ |  $ |/  |$ |__$ |$/ $ |$ |/$ |$ | $ | $ |$/ $ \__$ |
//  $ |  $ |[        DISCUZ_CODE_17        ]nbsp;      |$/    $ |$ |  $ |[        DISCUZ_CODE_17        ]nbsp;   $/ $ | $/  $ |[        DISCUZ_CODE_17        ]nbsp;   $/ /     $/   [        DISCUZ_CODE_17        ]nbsp; $/ $ | $ |[        DISCUZ_CODE_17        ]nbsp;   $/   [        DISCUZ_CODE_17        ]nbsp; $/ [        DISCUZ_CODE_17        ]nbsp;   $/ [        DISCUZ_CODE_17        ]nbsp;      |$ | $ |[        DISCUZ_CODE_17        ]nbsp;   $ |$ | $ | $ |[        DISCUZ_CODE_17        ]nbsp;      |[        DISCUZ_CODE_17        ]nbsp;   $ |
//  $/   $/  $/ $/      $/ $/   $/  $/  $/      $/  $/  $/     $/  $/   $/  $/     $/  $/   $/ $/   $/  $/ $/  $/  $/  $/  $/
//                                                                                                                                                                                                         
//                                                                                                                                                                                                         
//
//@version=4
study("Double Top/Bottom - Ultimate (OS)", shorttitle="W/M - Ultimate(OS)", overlay=true, max_lines_count=500, max_labels_count=500, max_bars_back=1000)
length = input(10, step=5, minval=5)
showZigzag = input(false)
showPivots = input(true)
showStats = input(true)
bullishColor = input(color.green)
bullTrapColor = input(color.orange)
bearishColor = input(color.red)
bearTrapColor = input(color.lime)
textColor = input(color.black)

MaxRiskPerReward = input(30, step=5, minval=5, maxval=100)
DisplayRiskPerReward = input(true)
var zigzagvalues = array.new_float(0)
var zigzagindexes = array.new_int(0)
var zigzagdir = array.new_int(0)

var doubleTopBottomValues = array.new_float(3)
var doubleTopBottomIndexes = array.new_int(3)
var doubleTopBottomDir = array.new_int(3)

int max_array_size = 10
max_bars_back(high, 1000)
max_bars_back(low, 1000)

var lineArray = array.new_line(0)
var labelArray = array.new_label(0)
pivots(length)=>
    float ph = highestbars(high, length) == 0 ? high : na
    float pl = lowestbars(low, length) == 0 ? low : na
    dir = 0
    dir := iff(ph and na(pl), 1, iff(pl and na(ph), -1, dir[1]))
    [dir, ph, pl]

add_to_array(value, index, dir)=>
    mult = array.size(zigzagvalues) < 2? 1 :
                 (dir*value > dir*array.get(zigzagvalues,1))? 2 : 1
    array.unshift(zigzagindexes, index)
    array.unshift(zigzagvalues, value)
    array.unshift(zigzagdir, dir*mult)
    if array.size(zigzagindexes) > max_array_size
        array.pop(zigzagindexes)
        array.pop(zigzagvalues)
        array.pop(zigzagdir)

add_to_zigzag(dir, dirchanged, ph, pl, index)=>
    value = (dir == 1? ph : pl)
    if array.size(zigzagvalues) == 0 or dirchanged
        add_to_array(value, index, dir)
    else if(dir == 1 and value > array.get(zigzagvalues, 0)) or (dir == -1 and value < array.get(zigzagvalues, 0))
        array.shift(zigzagvalues)
        array.shift(zigzagindexes)
        array.shift(zigzagdir)
        add_to_array(value, index, dir)

zigzag(length)=>
    [dir, ph, pl] = pivots(length)
    dirchanged = change(dir)
    if(ph or pl)
        add_to_zigzag(dir, dirchanged, ph, pl, bar_index)

calculate_double_pattern()=>
    doubleTop = false
    doubleTopConfirmation = 0
    doubleBottom = false
    doubleBottomConfirmation = 0
    if(array.size(zigzagvalues) >= 4)
        index = array.get(zigzagindexes, 1)
        value = array.get(zigzagvalues, 1)
        highLow = array.get(zigzagdir, 1)
        
        lindex = array.get(zigzagindexes, 2)
        lvalue = array.get(zigzagvalues, 2)
        lhighLow = array.get(zigzagdir, 2)
        
        llindex = array.get(zigzagindexes, 3)
        llvalue = array.get(zigzagvalues, 3)
        llhighLow = array.get(zigzagdir, 3)
        risk = abs(value-llvalue)
        reward = abs(value-lvalue)
        riskPerReward = risk*100/(risk+reward)
        
        if(highLow == 1 and llhighLow == 2 and lhighLow < 0  and riskPerReward < MaxRiskPerReward)
            doubleTop := true
        if(highLow == -1 and llhighLow == -2 and lhighLow > 0 and riskPerReward < MaxRiskPerReward)
            doubleBottom := true

        if(doubleTop or doubleBottom)
            array.set(doubleTopBottomValues, 0, value)
            array.set(doubleTopBottomValues, 1, lvalue)
            array.set(doubleTopBottomValues, 2, llvalue)
            
            array.set(doubleTopBottomIndexes, 0, index)
            array.set(doubleTopBottomIndexes, 1, lindex)
            array.set(doubleTopBottomIndexes, 2, llindex)
            
            array.set(doubleTopBottomDir, 0, highLow)
            array.set(doubleTopBottomDir, 1, lhighLow)
            array.set(doubleTopBottomDir, 2, llhighLow)
   
    [doubleTop, doubleBottom]

get_crossover_info(doubleTop, doubleBottom)=>
    index = array.get(doubleTopBottomIndexes, 0)
    value = array.get(doubleTopBottomValues, 0)
    highLow = array.get(doubleTopBottomDir, 0)
   
    lindex = array.get(doubleTopBottomIndexes, 1)
    lvalue = array.get(doubleTopBottomValues, 1)
    lhighLow = array.get(doubleTopBottomDir, 1)
   
    llindex = array.get(doubleTopBottomIndexes, 2)
    llvalue = array.get(doubleTopBottomValues, 2)
    llhighLow = array.get(doubleTopBottomDir, 2)
   
    latestDoubleTop = false
    latestDoubleBottom = false
    latestDoubleTop := doubleTop ? true : doubleBottom? false : latestDoubleTop[1]
    latestDoubleBottom := doubleBottom? true : doubleTop? false : latestDoubleBottom[1]
   
    doubleTopConfirmation = 0
    doubleBottomConfirmation = 0
    doubleTopConfirmation := latestDoubleTop? (crossunder(low, lvalue) ? 1 : crossover(high, llvalue) ? -1 : 0) : 0
    doubleBottomConfirmation := latestDoubleBottom? (crossover(high, lvalue) ? 1 : crossunder(low, llvalue) ? -1 : 0) : 0
    [doubleTopConfirmation, doubleBottomConfirmation]

draw_double_pattern(doubleTop,doubleBottom,doubleTopConfirmation,doubleBottomConfirmation)=>
    index = array.get(doubleTopBottomIndexes, 0)
    value = array.get(doubleTopBottomValues, 0)
    highLow = array.get(doubleTopBottomDir, 0)
   
    lindex = array.get(doubleTopBottomIndexes, 1)
    lvalue = array.get(doubleTopBottomValues, 1)
    lhighLow = array.get(doubleTopBottomDir, 1)
   
    llindex = array.get(doubleTopBottomIndexes, 2)
    llvalue = array.get(doubleTopBottomValues, 2)
    llhighLow = array.get(doubleTopBottomDir, 2)
   
    isBullish = true
    isBullish := (doubleTop or doubleBottom)? doubleTop : isBullish[1]
   
    risk = abs(value-llvalue)
    reward = abs(value-lvalue)
    riskPerReward = risk*100/(risk+reward)
   
    base = line.new(x1=index, y1=value,
                 x2 = llindex, y2=llvalue,
                 color=doubleTop? bearishColor : bullishColor, width=2, style=line.style_solid)
    l1 = line.new(x1=index, y1=value,
                 x2 = lindex, y2=lvalue,
                 color=doubleTop? bearishColor : bullishColor, width=2, style=line.style_dotted)
    l2 = line.new(x1=lindex, y1=lvalue,
                 x2 = llindex, y2=llvalue,
                 color=doubleTop? bearishColor : bullishColor, width=2, style=line.style_dotted)
    labelText = (doubleTop? "Double Top" : "Double Bottom") + (DisplayRiskPerReward ? " RR - "+tostring(riskPerReward) : "")
   
    baseLabel = label.new(x=index, y=value, text=labelText, yloc=doubleTop?yloc.abovebar:yloc.belowbar,
                             color=doubleTop?bearishColor:bullishColor,
                             style=doubleTop?label.style_label_down:label.style_label_up,
                             textcolor=textColor, size=size.normal)
   
    if not (doubleTop or doubleBottom)
        line.delete(base)
        line.delete(l1)
        line.delete(l2)
        label.delete(baseLabel)
        
    var doubleTopCount = 0
    var doubleBottomCount = 0
    doubleTopCount := doubleTop? nz(doubleTopCount[1],0) + 1 : nz(doubleTopCount[1],0)
    doubleBottomCount := doubleBottom? nz(doubleBottomCount[1],0) + 1 : nz(doubleBottomCount[1],0)
        
    if(line.get_x2(base) == line.get_x2(base[1]))
        line.delete(base[1])
        line.delete(l1[1])
        line.delete(l2[1])
        label.delete(baseLabel[1])
        doubleTopCount := doubleTop? doubleTopCount -1 : doubleTopCount
        doubleBottomCount := doubleBottom? doubleBottomCount -1 : doubleBottomCount
   
   
    if(barstate.islast)
        lres = line.new(x1=bar_index, y1=lvalue,
                     x2 = lindex, y2=lvalue,
                     color=isBullish? bearishColor : bullishColor, width=2, style=line.style_dashed, extend=extend.left)
        lsup = line.new(x1=bar_index, y1=llvalue,
                     x2 = llindex, y2=llvalue,
                     color=isBullish? bullishColor : bearishColor , width=2, style=line.style_dashed, extend=extend.left)

   
    doubleTopConfirmationCount = doubleTopConfirmation>0? 1 : 0
    doubleBottomConfirmationCount = doubleBottomConfirmation>0? 1:0
    doubleTopInvalidationCount = doubleTopConfirmation<0? 1 : 0
    doubleBottomInvalidationCount = doubleBottomConfirmation<0? 1:0
   
    if(doubleTopConfirmation != 0 or doubleBottomConfirmation !=0)
        if(doubleTopConfirmation>0 or doubleBottomConfirmation > 0)
            lresbreak = line.new(x1=lindex, y1=lvalue,
                     x2 = bar_index, y2=lvalue,
                     color=isBullish? bearishColor : bullishColor, width=2, style=line.style_dashed)
            if(line.get_x1(lresbreak[1]) == line.get_x1(lresbreak))
                doubleTopConfirmationCount := 0
                doubleBottomConfirmationCount := 0
                doubleTopInvalidationCount := 0
                doubleBottomInvalidationCount := 0
                line.delete(lresbreak)
                lresbreak := lresbreak[1]
        else if(doubleTopConfirmation<0 or doubleBottomConfirmation < 0)
            lsupbreak = line.new(x1=llindex, y1=llvalue,
                     x2 = bar_index, y2=llvalue,
                     color=isBullish? bullishColor : bearishColor , width=2, style=line.style_dashed)
            if(line.get_x1(lsupbreak[1]) == line.get_x1(lsupbreak))
                doubleTopInvalidationCount := 0
                doubleBottomInvalidationCount := 0
                doubleTopConfirmationCount := 0
                doubleBottomConfirmationCount := 0
                line.delete(lsupbreak)
                lsupbreak := lsupbreak[1]
    doubleTopConfirmationCount := nz(doubleTopConfirmationCount[1],0)+doubleTopConfirmationCount
    doubleBottomConfirmationCount := nz(doubleBottomConfirmationCount[1],0)+doubleBottomConfirmationCount
    doubleTopInvalidationCount := nz(doubleTopInvalidationCount[1],0)+doubleTopInvalidationCount
    doubleBottomInvalidationCount := nz(doubleBottomInvalidationCount[1],0)+doubleBottomInvalidationCount
    [doubleTopCount, doubleBottomCount, doubleTopConfirmationCount, doubleBottomConfirmationCount, doubleTopInvalidationCount, doubleBottomInvalidationCount]

zigzag(length)

[doubleTop, doubleBottom] = calculate_double_pattern()
[doubleTopConfirmation, doubleBottomConfirmation] = get_crossover_info(doubleTop, doubleBottom)
[doubleTopCount, doubleBottomCount,
                 doubleTopConfirmationCount, doubleBottomConfirmationCount,
                 doubleTopInvalidationCount, doubleBottomInvalidationCount] = draw_double_pattern(doubleTop,doubleBottom,doubleTopConfirmation,doubleBottomConfirmation)

var stats = table.new(position = position.top_right, columns = 5, rows = 5, border_width = 1)
if(barstate.islast and showStats)
    colorWorst = color.rgb(255, 153, 51)
    colorBest = color.rgb(51, 204, 51)
    colorBad = color.rgb(255, 204, 153)
    colorGood = color.rgb(204, 255, 204)
    colorNeutral = color.rgb(255, 255, 204)
   
    dtConfirmationPercent = doubleTopConfirmationCount+doubleTopInvalidationCount == 0? 0.5 : doubleTopConfirmationCount/(doubleTopConfirmationCount+doubleTopInvalidationCount)
    dbConfirmationPercent = (doubleBottomConfirmationCount+doubleBottomInvalidationCount) == 0? 0.5 : doubleBottomConfirmationCount/(doubleBottomConfirmationCount+doubleBottomInvalidationCount)
   
    dtColor = dtConfirmationPercent >= 0.8? colorBest :
                 dtConfirmationPercent >= 0.6? colorGood :
                 dtConfirmationPercent >= 0.4? colorNeutral :
                 dtConfirmationPercent >= 0.2? colorBad : colorWorst
    dbColor = dbConfirmationPercent >= 0.8? colorBest :
                 dbConfirmationPercent >= 0.6? colorGood :
                 dbConfirmationPercent >= 0.4? colorNeutral :
                 dbConfirmationPercent >= 0.2? colorBad : colorWorst
    table.cell(table_id = stats, column = 0, row = 0 , text = "", bgcolor=color.black, text_color=color.white)
    table.cell(table_id = stats, column = 0, row = 1 , text = "Double Top", bgcolor=color.black, text_color=color.white)
    table.cell(table_id = stats, column = 0, row = 2 , text = "Double Bottom", bgcolor=color.black, text_color=color.white)
   
    table.cell(table_id = stats, column = 1, row = 0 , text = "Count", bgcolor=color.black, text_color=color.white)
    table.cell(table_id = stats, column = 2, row = 0 , text = "Confirmation", bgcolor=color.black, text_color=color.white)
    table.cell(table_id = stats, column = 3, row = 0 , text = "Invalidation", bgcolor=color.black, text_color=color.white)
   
    table.cell(table_id = stats, column = 1, row = 1, text = tostring(doubleTopCount), bgcolor=dtColor)
    table.cell(table_id = stats, column = 1, row = 2, text = tostring(doubleBottomCount), bgcolor=dbColor)
   
    table.cell(table_id = stats, column = 2, row = 1, text = tostring(doubleTopConfirmationCount), bgcolor=dtColor)
    table.cell(table_id = stats, column = 3, row = 1, text = tostring(doubleTopInvalidationCount), bgcolor=dtColor)
   
    table.cell(table_id = stats, column = 2, row = 2, text = tostring(doubleBottomConfirmationCount), bgcolor=dbColor)
    table.cell(table_id = stats, column = 3, row = 2, text = tostring(doubleBottomInvalidationCount), bgcolor=dbColor)

if(barstate.islast and array.size(zigzagindexes) > 1)
    lastHigh = 0.0
    lastLow = 0.0
    for x = 0 to array.size(zigzagindexes)-1
        i = array.size(zigzagindexes)-1-x
        index = array.get(zigzagindexes, i)
        value = array.get(zigzagvalues, i)
        highLow = array.get(zigzagdir, i)
        index_offset = bar_index-index
        
        labelText = highLow ==2 ? "HH" : highLow == 1? "LH" : highLow == -1? "HL" : "LL"
        labelColor = highLow ==2 ? bullishColor : highLow == 1? bullTrapColor : highLow == -1? bearTrapColor : bearishColor
        labelStyle = highLow > 0? label.style_label_down : label.style_label_up
        // labelLocation = highLow > 0? yloc.abovebar : yloc.belowbar
        labelLocation = yloc.price
        if(showPivots)
            l = label.new(x=index, y = value, text=labelText, xloc=xloc.bar_index, yloc=labelLocation, style=labelStyle, size=size.tiny,
                                 color=labelColor, textcolor=textColor)
            array.unshift(labelArray, l)
            if(array.size(labelArray) > 100)
                label.delete(array.pop(labelArray))
        if(i < array.size(zigzagindexes)-1 and showZigzag)
            indexLast = array.get(zigzagindexes, i+1)
            valueLast = array.get(zigzagvalues, i+1)
            l = line.new(x1=index, y1=value,
                         x2 = indexLast, y2=valueLast,
                         color=labelColor, width=2, style=line.style_solid)
                        
            array.unshift(lineArray, l)
            if(array.size(lineArray) > 100)
                line.delete(array.pop(lineArray))
alertcondition(doubleBottom, "Double Bottom", "robable double bottom observed for {{ticker}} on {{interval}} timeframe")
alertcondition(doubleBottomConfirmation > 0, "Double Bottom Confirmation", "Double bottom confirmation observed for {{ticker}} on {{interval}} timeframe")
alertcondition(doubleBottomConfirmation < 0, "Double Bottom Invalidation", "Double bottom invalidation observed for {{ticker}} on {{interval}} timeframe")
alertcondition(doubleTop, "Double Top", "robable double top observed for {{ticker}} on {{interval}} timeframe")
alertcondition(doubleTopConfirmation > 0, "Double Top Confirmation", "Double top confirmation observed for {{ticker}} on {{interval}} timeframe")
alertcondition(doubleTopConfirmation < 0, "Double Top Invalidation", "Double top invalidation observed for {{ticker}} on {{interval}} timeframe")复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-11 14:01 , Processed in 0.098419 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表