我如何添加一个函数来在连续“x”次损失后停止我的松树代码策略(martingale sistem)

问题描述 投票:0回答:1

我正在尝试在交易视图上构建一个策略,我想在之后实现自动化,但我坚持这样做 2 个功能...

该策略内部是红烛收盘后的简单买入(接近 50% 的胜率)1:1 的风险比率奖励,问题是回测显示很长一段时间是亏损的,因为它可以抓住 7 或连续 8 笔亏损交易让我的账户爆了...

所以我想在 EX:连续 7 次损失之后停止该策略,然后像往常一样使用乘数 1 和双倍后重新开始,但在连续失去“x”损失后停止。

第二件事是在连续 2 次亏损后进入交易,这样我就可以在一些亏损后开始,在连续“x”次亏损后停止策略并重新启动。

我希望我解释得尽可能清楚......

我找不到关于这两个函数的任何内容,我不得不提一下,我是 pine 代码的新手,但在观看多个 startegys 代码后我仍然设法构建这个策略...有些代码被盗用了。

这是我的完整代码:

//@version=5

strategy(title='Test martingale', overlay=true, slippage=15, initial_capital=1000, currency=currency.USD)

maxWinStreak = input.int(title="Max Winning Streak Length",
     defval=7, minval=1)

newWin = (strategy.wintrades > strategy.wintrades[1]) and
     (strategy.losstrades == strategy.losstrades[1]) and
     (strategy.eventrades == strategy.eventrades[1])

// loss steak

maxLossStreak = input.int(title="Max Losing Streak Length",
     defval=7, minval=1)

newLoss = (strategy.losstrades > strategy.losstrades[1]) and
     (strategy.wintrades == strategy.wintrades[1]) and
     (strategy.eventrades == strategy.eventrades[1])



// Figure out current winning streak length
streakLen = 0

streakLen := if (newWin)
    nz(streakLen[1]) + 1
else
    if (strategy.losstrades > strategy.losstrades[1]) or
         (strategy.eventrades > strategy.eventrades[1])
        0
    else
        nz(streakLen[1])


// Figure out current lossing streak length
streakLen2 = 0

streakLen2 := if (newLoss)
    nz(streakLen2[1]) + 1
else
    if (strategy.wintrades > strategy.wintrades[1]) or
         (strategy.eventrades > strategy.eventrades[1])
        0
    else
        nz(streakLen2[1])
//Max lossing streak        
okToTrade1 = streakLen2 < maxLossStreak
//Max winning streak
okToTrade = streakLen < maxWinStreak 
src = close
long = close  < open  
win_mult = input.float(defval=1.00, step=0.05, title='Multiplier for Winning Streak')
loss_mult = input.float(defval=2, step=0.05, title='Multiplier for Losing Streak')
//Just hedge the last trade 
dir = 0.0

//Count the current streak of winning/losing trades
calcWinMult(mult) =>
    result = 0.0
    change_1 = ta.change(strategy.losstrades)
    change_2 = ta.change(strategy.wintrades)
    change_3 = ta.change(strategy.eventrades)
    result := na(result[1]) ? 1 : change_1 > 0 ? 1 : change_2 > 0 or change_3 > 0 ? nz(result[1]) * mult : nz(result[1])
    result
calcLossMult(mult) =>
    result = 0.0
    change_1 = ta.change(strategy.wintrades)
    change_2 = ta.change(strategy.losstrades)
    change_3 = ta.change(strategy.eventrades)
    result := na(result[1]) ? 1 : change_1 > 0 ? 1 : change_2 > 0 or change_3 > 0 ? nz(result[1]) * mult : nz(result[1])
    result

//Gett the type of trade we need
type = 0.0
change_1 = ta.change(strategy.losstrades)
type := ta.change(strategy.wintrades) > 0 ? 1 : change_1 > 0 ? -1 : nz(type[1], 1)

//Get the martingale multiplier for the nex trade
calcWinMult__1 = calcWinMult(win_mult)
calcLossMult__1 = calcLossMult(loss_mult)
qtyMult = type > 0 ? calcWinMult__1 : calcLossMult__1

//Basic buy/sell signals
buy = long
//Plot
red = color.red
green = color.lime
white = color.white
plotshape(long, text='buy', style=shape.labelup, location=location.belowbar, 
color=color.new(green, 0), textcolor=color.new(white, 0))

lots = input(defval=1)
adjustedLots = 1 * qtyMult


if  strategy.equity > strategy.initial_capital * 0.2 and strategy.closedtrades +  strategy.opentrades < 5000 and okToTrade and okToTrade1
      strategy.entry('LONG', strategy.long, qty=adjustedLots, when=buy)
   
      strategy.exit('L.exit', from_entry='LONG', profit= 200, loss=200)  

预先感谢您的帮助。

algorithm pine-script pine-script-v5
1个回答
0
投票

这是计算连续损失数的辅助函数。您可以在脚本中使用它来检测该策略是否可以交易。

//@version=5
strategy("My strategy", overlay=true, margin_long=100, margin_short=100)

numberOfLossesInRow()=>
    result = 0
    if 0 != strategy.closedtrades        
        for i = strategy.closedtrades - 1 to 0
            if strategy.closedtrades.profit(i) < 0
                result += 1
            else
                break
    result

lossesInRow = numberOfLossesInRow()
plot(lossesInRow)

canTrade = lossesInRow < 5
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition and canTrade)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition and canTrade)
    strategy.entry("My Short Entry Id", strategy.short)
© www.soinside.com 2019 - 2024. All rights reserved.