算法交易:单Timeframe满足条件仅触发一次订单,周期重复至闭市
算法交易脚本单时间帧单次平仓逻辑实现
需求明确
- 单个时间帧内,触发条件满足时仅执行一次平仓下单操作
- 需等待当前时间帧完全结束后,下一个时间帧才可再次触发平仓操作
- 循环执行该逻辑直至市场闭市
原代码问题分析
- 原代码中
self.timeframe_check +=1的逻辑无法准确跟踪时间帧切换,可能导致同一时间帧内重复触发操作 - 若
order_exit_1st和order_exit_2nd同时满足,会执行两次平仓,违反"单帧单次"的核心要求
修正后的实现代码
# 初始化类级变量,用于跟踪当前时间帧和订单执行状态 self.current_timeframe = None self.order_executed_in_frame = False # 平仓触发条件判断 order_exit_1st = (neg_first_diff == True and brickk_roc <= -1 and first_trend < 0 and scattered == "SELL") order_exit_2nd = (voll_roc >= 30 and brickk_roc <= -1 and seccond_trend < 0 and scattered == "SELL") # 合并触发条件,任一满足即触发平仓 trigger_exit = order_exit_1st or order_exit_2nd for i in range(len(bricks)): if bricks[i] == -7 and red_neg == True: # 获取当前时间帧(需根据你的数据源实现正确的时间帧取值逻辑) latest_time = self.get_current_timeframe() # 时间帧切换时重置执行标记 if latest_time != self.current_timeframe: self.current_timeframe = latest_time self.order_executed_in_frame = False # 满足触发条件且当前帧未执行过订单时,执行平仓 if trigger_exit and not self.order_executed_in_frame: self.ExitCancelBuy(order_id, parent_order_id) self.ExitOrderBuy(tickers, "sell", quantity) print(f"buy order exited {tickers}") # 标记当前帧已执行操作,避免重复触发 self.order_executed_in_frame = True
核心逻辑说明
- 时间帧跟踪:通过
self.current_timeframe记录当前所在时间帧,当时间帧切换时,自动重置order_executed_in_frame标记 - 单帧单次控制:只有触发条件满足且当前帧未执行过订单时,才执行平仓操作,执行后立即标记为已执行,确保同一时间帧内不会重复操作
- 条件合并:将两个平仓条件合并为
trigger_exit,避免多条件同时满足时重复执行平仓
示例场景
假设当前时间帧为01:
- 当
trigger_exit条件满足时,执行一次平仓操作,order_executed_in_frame设为True - 后续即使条件再次满足,只要仍处于
01时间帧,不会重复执行 - 当
01时间帧结束,进入02时间帧时,self.current_timeframe更新为02,order_executed_in_frame重置为False,此时若条件满足,可再次执行平仓操作
内容的提问来源于stack exchange,提问作者subash patel
相关产品推荐
相关产品推荐

