0

我正在尝试创建一个非常简单的 MA 交叉策略(仅限多头),我想在固定止损水平或满足我的退出条件时退出交易。出于这个原因,我使用 strategy.order 函数退出我的交易。但是,显然有些问题是错误的,因为还发起了一些空头交易......在这里您可以找到代码中最重要的部分:

//strategy conditions & variables

ordersize=floor(strategy.equity/close)

trendfilter = RSI_w > i_RSI_TH ? 1 : 0

longCondition = crossover(shortMA,longMA)
exitCondition = crossover(longMA,shortMA)

stopLoss = float(na)
stopLoss := strategy.position_size[0]>strategy.position_size[1] ? strategy.position_avg_price - (i_atr_mult * atr) : strategy.position_size>0 ?  stopLoss[1] : na

// strategy entry & exits

strategy.entry(id="going long", long=true, qty=ordersize, when=longCondition and TimeWindow and trendfilter>0)

strategy.order(id="stop loss", long=false, stop=stopLoss, oca_name='L', oca_type=strategy.oca.cancel, qty=strategy.position_size, when=strategy.position_size > 0 and TimeWindow)
strategy.order(id="exit long", long=false, oca_name='L', oca_type=strategy.oca.cancel, qty=strategy.position_size, when= exitCondition and strategy.position_size > 0 and TimeWindow)

所以在我的逻辑中,第一个 strategy.order 函数只能在 strategy.position_size > 0 时打开交易。这应该避免做空订单,但显然不是。当价格触及 SL 水平时,即使未进行未平仓交易,也会发起空头交易……有人可以解释一下这是为什么吗???甚至更好的是,我如何调整我的代码以避免这些短条目?这对我有很大帮助!!

回顾一下:负责这些简短条目的代码行是:

strategy.order(id="stop loss", long=false, stop=stopLoss, oca_name='L', oca_type=strategy.oca.cancel, qty=strategy.position_size, when=strategy.position_size > 0 and TimeWindow)
4

1 回答 1

1

第一个订单是停止,第二个订单是市场订单。当 exitCondition 为真且价格满足 stopLoss 条件时,两个订单同时执行,经纪人模拟器无法及时取消其他订单。我建议您在 exitCondition 为真时明确取消止损单。

于 2021-07-07T13:45:29.983 回答