谢谢你的帮助。
我和松树的剧本学得很开心。我编写了一个简单的策略,它是基于2 MA或EMA与TP的杂交进行日内/剥皮。我用的是0.9或1%的小茶多酚而不是更多
除了反测试的结果之外,一切都能正常工作,这些测试结果在任何情况下都是错误的。
如果我不启动“重新计算后,我填写的订单”,战略似乎是正确计算我的获利。但是,由于这一策略只是在关键时刻才算出来的,它创造了超过1%的获利交易(你告诉我,这样做会更好)。但是,如果TP在当前的蜡烛上被击中,并且价格没有回到以下蜡烛的1%的水平,它就不计算利润。当然,这完全扭曲了结果。

如果我激活“重新计算后,我填写了”我的tp是正确的计算每次除了当MA交叉在2支蜡烛(假信号)。因此,这在同一个蜡烛上创造了2个订单,这进一步扭曲了结果。

所以我真的不知道如何得到正确的回测试结果。
是否有可能禁止每支蜡烛的信号超过一个,或者将允许正确计算TP的变量合并,而不激活“重新计算我填写的命令”?
也许我错了但我没有正确触发?
以下是代码:
//@version=5
strategy("My Strategy", overlay=true)
// Date
startDate = input.int(title="Start Date",
defval=1, minval=1, maxval=31)
startMonth = input.int(title="Start Month",
defval=1, minval=1, maxval=12)
startYear = input.int(title="Start Year",
defval=2019, minval=2018, maxval=2100)
endDate = input.int(title="End Date",
defval=1, minval=1, maxval=31)
endMonth = input.int(title="End Month",
defval=7, minval=1, maxval=12)
endYear = input.int(title="End Year",
defval=2022, minval=2020, maxval=2100)
inDateRange = (time >= timestamp(syminfo.timezone, startYear,
startMonth, startDate, 0, 0)) and
(time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
//EMA
lenema = input.int(13, minval=1, title="Length")
srcema = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
ema = ta.ema(srcema, lenema)
plot(ema, title="EMA", color=color.red, offset=offsetema)
lenma = input.int(30, minval=1, title="Length")
srcma = input(close, title="Source")
offsetma = input.int(title="Offset", defval=0, minval=-500, maxval=500)
ma = ta.sma(srcma, lenma)
plot(ma, color=color.blue, title="MA", offset=offsetma)
//Trades conditions
longCondition = ta.crossover(ema, ma)
shortCondition = ta.crossunder(ema, ma)
if (inDateRange and longCondition)
strategy.entry("Long", strategy.long)
if (inDateRange and shortCondition)
strategy.entry("Short", strategy.short)
if (not inDateRange)
strategy.close_all()
// TP
longProfitPerc = input.float(title="--> Long TP (%)", minval=0.0, step=0.1, defval=1) / 100
shortProfitPerc = input.float(title="--> Short TP (%)", minval=0.0, step=0.1, defval=1) / 100
//TP declanchement
longExitPrice = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
if (strategy.position_size > 0)
strategy.exit(id="L TP", limit=longExitPrice)
if (strategy.position_size < 0)
strategy.exit(id="S TP", limit=shortExitPrice)谢谢你的帮助,祝你今天愉快:)
发布于 2022-01-14 18:34:38
策略计算每条只进行一次,但当您使用“订单执行后”复选框时,每个执行订单后的策略计算引擎将重新计算策略,并在有合适的条件时执行订单。这种情况发生在你的情况下

因此,在第3栏结束时,策略计算引擎执行计算,并确定进入空头头寸的条件得到满足,创建一个市场订单,在下一个勾号上执行,因为当前的条形图关闭了(这是进行计算的最后一个勾号),那么下一个勾号将打开第4栏。在第4栏打开时,执行该命令,该策略进入空头位置,因为您在订单填写后使用重新计算,策略被重新计算,而且由于有一个反向交点(从第3栏到第4栏),进入多头仓位的条件已经满足,因此策略在第一个滴答中就会立即做多。如果禁用了订单执行后的重新计算,则只有在第4栏结束时才会重新计算策略,而命令只能在下一个勾号(第5栏的开始)执行。
-为了防止重新执行命令,你需要在进入条件上加上一张支票,因为目前的酒吧上还没有进入或退出的位置。您可以通过检查与前一个条形图相比的位置大小更改来实现这一点,例如,在重新计算之后,在执行输入顺序之后,位置大小的值将发生变化,如果它不等于0,则不会出现该项。下面是一个示例(如果要输入的长期和短期合同的数量总是相等的话,则工作正常):
//@version=5
strategy("My Strategy", overlay=true, calc_on_order_fills=true)
// Date
startDate = input.int(title="Start Date",
defval=1, minval=1, maxval=31)
startMonth = input.int(title="Start Month",
defval=1, minval=1, maxval=12)
startYear = input.int(title="Start Year",
defval=2019, minval=2018, maxval=2100)
endDate = input.int(title="End Date",
defval=1, minval=1, maxval=31)
endMonth = input.int(title="End Month",
defval=7, minval=1, maxval=12)
endYear = input.int(title="End Year",
defval=2022, minval=2020, maxval=2100)
inDateRange = (time >= timestamp(syminfo.timezone, startYear,
startMonth, startDate, 0, 0)) and
(time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
//EMA
lenema = input.int(13, minval=1, title="Length")
srcema = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
ema = ta.ema(srcema, lenema)
plot(ema, title="EMA", color=color.red, offset=offsetema)
lenma = input.int(30, minval=1, title="Length")
srcma = input(close, title="Source")
offsetma = input.int(title="Offset", defval=0, minval=-500, maxval=500)
ma = ta.sma(srcma, lenma)
plot(ma, color=color.blue, title="MA", offset=offsetma)
//Trades conditions
longCondition = ta.crossover(ema, ma)
shortCondition = ta.crossunder(ema, ma)
position_unchanged = ta.change(strategy.position_size) == 0
if (inDateRange and longCondition and position_unchanged)
strategy.entry("Long", strategy.long)
if (inDateRange and shortCondition and position_unchanged)
strategy.entry("Short", strategy.short)
if (not inDateRange)
strategy.close_all()
// TP
longProfitPerc = input.float(title="--> Long TP (%)", minval=0.0, step=0.1, defval=1) / 100
shortProfitPerc = input.float(title="--> Short TP (%)", minval=0.0, step=0.1, defval=1) / 100
//TP declanchement
longExitPrice = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
if (strategy.position_size > 0)
strategy.exit(id="L TP", limit=longExitPrice)
if (strategy.position_size < 0)
strategy.exit(id="S TP", limit=shortExitPrice)https://stackoverflow.com/questions/70712117
复制相似问题