我正在尝试在交易视图上构建一个策略,我想在之后实现自动化,但我坚持这样做 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)
预先感谢您的帮助。
这是计算连续损失数的辅助函数。您可以在脚本中使用它来检测该策略是否可以交易。
//@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)