【问题标题】:How to get the Bar Index of the Max Drawdown?如何获得最大跌幅的柱线指数?
【发布时间】:2023-01-21 21:17:10
【问题描述】:

我正在尝试获取每笔交易的最大回撤的柱线指数,但无法弄清楚。

下面是我的代码的 sn-p

maxArr = array.new_float()
entArr = array.new_int()
exArr = array.new_int()
diffArr = array.new_int()
biArr = array.new_int()

for i = 0 to strategy.closedtrades -1

// calculate the absolute drawdown percentage
    drawdown = strategy.closedtrades.max_drawdown(i)
    costBasis = strategy.closedtrades.entry_price(i)
    runup = strategy.closedtrades.max_runup(i)
    entindex = strategy.closedtrades.entry_bar_index(i)
    exindex = strategy.closedtrades.exit_bar_index(i)
    diff = exindex - entindex
    array.push(entArr,entindex)
    array.push(exArr,exindex)
    array.push(diffArr,diff)

    end = if math.max(drawdown,runup) == drawdown
        costBasis - drawdown
    else
        costBasis + runup

    array.push(maxArr,end)

//var float aa = 0 //used for another version
var int bb = 0
var int cc = 0
var int dd = 0

for j = 0 to array.size(maxArr) - 1
    //a = array.get(maxArr,j) //used for another version
    //aa := a //used for another version
    //b = array.get(entArr,j) //used for another version
    //bb := b //used for another version
    c = array.get(exArr,j)
    cc := c
    d = array.get(diffArr,j)
    dd := d

//var int sbi = bb //used for another version
//var int ebi = cc //used for another version
//var float hb = na //used for another version

//var int lb = cc - bb //used for another version

jj = (cc + ta.lowestbars(dd))
hh = bar_index==cc?jj:na

array.push(biArr,hh)

//plot(hh) //used for another version

biArr_string = str.tostring(biArr)
debug = label.new(x = bar_index, y = close, style = label.style_label_left, text = biArr_string)
label.delete(debug[1])

我只添加了上面的部分,因为我有 18 个不同的版本试图弄清楚,但没有一个成功。我已经注释掉了一些额外的变量,因为它们来自不同的版本,所以请忽略它们。

任何有关如何进行的帮助或指导将不胜感激。

编辑

在基于@G.Lebret 答案的更新代码下方添加。我得到的输出只显示一个空数组。

biArr = array.new_int()

for i = 0 to strategy.closedtrades -1

// calculate the absolute drawdown percentage
    drawdown = strategy.closedtrades.max_drawdown(i)

    var max_drawdown = 0.0
    var bar_index_max_drawdown = 0
    if strategy.closedtrades > 0
        if drawdown > max_drawdown
            max_drawdown := drawdown
            bar_index_max_drawdown := bar_index
    if strategy.opentrades == 0
        if max_drawdown != 0
        // Push to array
            array.push(biArr,bar_index_max_drawdown)
        // Reset values
        max_drawdown := 0.0

biArr_string = str.tostring(biArr)
debug = label.new(x = bar_index, y = close, style = label.style_label_left, text = biArr_string)
label.delete(debug[1])

【问题讨论】:

    标签: pine-script pine-script-v5


    【解决方案1】:

    您的 for 循环在每个柱上执行。
    我认为在每个循环中,您都会删除以前的数据。
    您应该只测试最后一笔交易的回撤。
    最好的方法是在每次开仓时以及开仓交易的回撤较大时记录 bar_index。

    var max_drawdown = 0.0
    var bar_index_max_drawdown = 0
    if strategy.opentrades > 0 // a trade is open
        if strategy.opentrades.max_drawdown(strategy.opentrades - 1) > max_drawdown
            max_drawdown := strategy.opentrades.max_drawdown(strategy.opentrades - 1)
            bar_index_max_drawdown := bar_index
    if strategy.opentrades == 0 // no trades open
        if max_drawdown <> 0
            // Print the bar_index on the chart
            label.new(bar_index_max_drawdown, max_drawdown, str.tostring(bar_index_max_drawdown) )
            // Reset values
            max_drawdown := 0.0
    

    [编辑 21-01-2023]
    完整代码(例如包括愚蠢的策略)

    //@version=5
    strategy("My strategy", overlay=true, margin_long=100, margin_short=100)
    
    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    
    var number_of_trades = 0
    var max_drawdown = 0.0
    var bar_index_max_drawdown = 0
    if strategy.opentrades > 0 // a trade is open
        if strategy.opentrades.max_drawdown(strategy.opentrades - 1) > max_drawdown
            max_drawdown := strategy.opentrades.max_drawdown(strategy.opentrades - 1)
            bar_index_max_drawdown := bar_index
    if strategy.closedtrades > number_of_trades // a trade just closed
        number_of_trades := number_of_trades + 1
        if max_drawdown != 0
            // Print the bar_index on the chart
            label.new(bar_index_max_drawdown, close*1.001, str.tostring(bar_index_max_drawdown) )
            // Reset values
            max_drawdown := 0.0
         
    

    结果示例:

    该代码在出现最大跌幅的柱上打印一个标签,该标签包含该柱的索引。

    【讨论】:

    • 谢谢你的回答。但我的想法是,我想计算出所有已平仓交易的最大回撤的柱线指数,而不仅仅是最后一笔交易。我想要获得所有已平仓交易的最大回撤的条柱指数的原因是最终了解在最大回撤之前的条柱数,这反过来将帮助我更量化地估计策略的风险。如果您需要我进一步详细说明,请告诉我。
    • @DanielDsouza 是的,我明白了。我的回答向您展示了如何检测最后一次回撤。您只需要在数组中记录代码查找(而不是打印标签)的每次回撤,以获取所有最大回撤的列表。
    • 好吧,现在我明白你说的了。我将测试您的解决方案并在我的代码中实现它。如果有效,我会尽快回复您。谢谢你的时间,我很感激。
    • 你好@G.Lebret,我在我的代码中实现并测试了你的解决方案,我得到的输出只是一个空数组。编辑我的原始帖子以添加重新编写的代码供您阅读。如果我做错了什么,请告诉我。谢谢你
    • 只需尝试在 biArr = array.new_int() 之前添加“var”
    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2021-01-31
    • 2022-10-20
    • 2019-10-11
    • 2023-04-02
    相关资源
    最近更新 更多