📘 还在被挂单卡资金?试试这套 Freqtrade量化 智能挂单系统
在量化交易中,挂单价格和挂单超时是决定交易效率和风险管理的关键因素。
Freqtrade 机器人提供了多种自定义挂单控制的钩子函数,帮助你精细化控制买卖价格和挂单生命周期,避免因挂单吃亏或资金被无效占用导致的机会损失。
本文将围绕三个函数详细展开:
custom_entry_price
:自定义买入挂单价格,避免挂单被瞬间吃掉或成本过高。check_entry_timeout
:判断买入挂单是否超时,及时取消未成交挂单,释放资金。check_exit_timeout
:判断卖出挂单是否超时,防止卖单长时间无效挂单。
1. 自定义买入挂单价格 —— custom_entry_price
在 Freqtrade 中,默认买入价格由交易所市价或策略默认限价决定,但在实际交易中,精准控制挂单价格非常重要。
如果挂单价格设置过于保守,可能导致买单无法快速成交,错失良机;价格过高,则会增加买入成本。
custom_entry_price
函数允许你在限价买入时,自定义挂单价格,实现策略更灵活的买入逻辑。
使用场景举例
- 激进策略:使用市价或接近市价价格,保证挂单迅速成交。
- 保守策略:挂单价格稍微低于当前价格,追求更优买入成本。
- 混合策略:根据市场波动或其他信号动态调整挂单价格。
完整代码示例
python
def custom_entry_price(self, pair, current_time, proposed_rate, entry_tag, **kwargs) -> float:
"""
自定义买入挂单价格
参数:
- pair: 交易对名称,如 'BTC/USDT'
- current_time: 当前时间戳
- proposed_rate: 系统推荐买入价格
- entry_tag: 交易标签,方便多策略区分
- kwargs: 其他参数
返回:
- float: 自定义买入挂单价格
"""
if entry_tag == "aggressive":
# 激进策略,使用推荐价格,尽快成交
return proposed_rate
elif entry_tag == "conservative":
# 保守策略,价格下调0.5%
return proposed_rate * 0.995
else:
# 默认轻微下调0.2%
return proposed_rate * 0.998
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
小结
通过该方法,策略可以根据不同市场环境和资金管理需求灵活调整买入价格,有效避免挂单被瞬间吃掉或成交成本偏高。
2. 挂单超时处理:check_entry_timeout
与 check_exit_timeout
限价单挂单过程中,最怕出现挂单“卡死”导致资金被占用,但订单却长时间无法成交。
这种情况不仅影响资金周转,还会错失更好交易机会。
Freqtrade 通过 check_entry_timeout
和 check_exit_timeout
两个函数,允许策略开发者自定义超时取消挂单的规则。
设计思路
- 高价币种(如 BTC/USDT),对资金占用敏感,挂单超过短时间未成交应及时取消。
- 中价币种(如 BNB、LTC),适度缩短挂单等待时间。
- 低价币种(如 SHIB、DOGE),价格低波动大,可允许更长时间挂单。
具体代码示例
python
from datetime import timedelta
def check_entry_timeout(self, pair: str, trade: Trade, order: Order,
current_time: datetime, **kwargs) -> bool:
"""
判断买入挂单是否超时,决定是否取消。
超时逻辑:
- 价格 > 100 USDT,挂单超5分钟取消
- 价格介于10~100 USDT,挂单超3分钟取消
- 价格 < 1 USDT,挂单超24小时取消
返回:
- True 表示取消挂单
- False 表示继续等待成交
"""
if trade.open_rate > 100 and trade.open_date_utc < current_time - timedelta(minutes=5):
return True
elif trade.open_rate > 10 and trade.open_date_utc < current_time - timedelta(minutes=3):
return True
elif trade.open_rate < 1 and trade.open_date_utc < current_time - timedelta(hours=24):
return True
return False
def check_exit_timeout(self, pair: str, trade: Trade, order: Order,
current_time: datetime, **kwargs) -> bool:
"""
判断卖出挂单是否超时,决定是否取消。
逻辑同买入挂单超时判断,分价位设定不同超时阈值。
"""
if trade.open_rate > 100 and trade.open_date_utc < current_time - timedelta(minutes=5):
return True
elif trade.open_rate > 10 and trade.open_date_utc < current_time - timedelta(minutes=3):
return True
elif trade.open_rate < 1 and trade.open_date_utc < current_time - timedelta(hours=24):
return True
return False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
进一步优化建议
- 可根据市场波动动态调整超时阈值
- 结合订单薄深度、成交量等指标,智能判断是否取消挂单
- 对不同策略或品种设定不同的超时规则
3. 注意事项:限价单配置与执行
需要注意的是,custom_entry_price
和挂单超时判断函数只有在你使用限价单时才会被调用。
如果你使用市价单或其他类型订单,这些函数不会生效。
如何启用限价单
在 config.json
配置文件中设置:
json
"order_types": {
"entry": "limit",
"exit": "limit"
}
1
2
3
4
2
3
4
这样,Freqtrade 会在买卖时使用限价单,确保上述自定义逻辑生效。
总结
挂单价格和挂单时效管理是提高交易执行质量的关键。
- 通过
custom_entry_price
,你可以根据市场状况和策略风格,自定义买入挂单价格,实现更合理的买入成本控制。 - 利用
check_entry_timeout
和check_exit_timeout
,能够防止挂单长时间不成交,避免资金被无效占用,提高资金使用效率。 - 结合限价单配置,这三者形成一个完整的挂单管理体系,为你的策略保驾护航。
实现精细的挂单管理,能有效避免挂单被瞬间吃掉、挂单长时间未成交或错失更优价格的尴尬,让交易更稳健、更高效!