easyquant/strategy.py
2025-07-05 17:31:46 +08:00

95 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from config.strategy_state import state
from jq_channel import exchange
from kit.logger import Logger
from config.strategy_config import strategy_config
class trade_strategy:
def __init__(self, strategy_name, strategy_template_id, config_save, log, channel: exchange):
# -------必要参数-------
self.log = Logger(log) # 日志记录器
self.strategy_config = strategy_config(strategy_name,
strategy_template_id,
config_save,
self.log)
self.state = state() # 策略状态管理器,跟踪策略运行状态
self.channel = channel
# 添加持仓监控和管理器
def init_strategy(self) -> None:
"""
策略初始化函数
配置交易环境参数,包括防未来数据、基准、滑点、订单成本以及日志输出等级。
参数:
context: 聚宽平台传入的交易上下文对象
"""
# 启用防未来数据以确保历史回测的严谨性
self.log.info("初始化策略TradingStrategy配置...")
set_option('avoid_future_data', True)
# 设置策略基准为上证指数
#set_benchmark(self.strategy_config.config["benchmark_stock"])
set_benchmark("000001.XSHG")
# 使用真实市场价格,模拟实际交易
set_option('use_real_price', True)
# 设置固定滑点,确保价格偏差不大
set_slippage(FixedSlippage(3 / 10000))
# 设置订单成本,包括印花税和佣金
set_order_cost(OrderCost(
open_tax=0,
close_tax=0.001, # 卖出时0.1%的印花税
open_commission=2.5 / 10000,
close_commission=2.5 / 10000,
close_today_commission=0,
min_commission=5 # 最低佣金为5元
), type='stock')
# 设置日志输出等级(中文日志输出)
self.log.logger.set_level('order', 'error')
self.log.logger.set_level('system', 'error')
self.log.logger.set_level('strategy', 'debug')
def set_target_list(self, target_list):
self.target_list = target_list.copy()
def get_target_list(self):
"""获取本次调仓候选股票列表"""
return self.target_list
def get_configs(self) -> dict:
"""
获取策略配置
:return: strategy_config 对象
"""
return self.strategy_config.get_all_configs()
def get_strategy_config(self) -> strategy_config:
"""
获取策略配置字典
:return: 包含所有配置参数的字典
"""
return self.strategy_config
def close_position(self, context, stock: str):
"""
平仓操作:尽可能将指定股票仓位全部卖出
参数:
position: 持仓对象
返回:
若下单后订单全部成交返回 True否则返回 False
"""
self.channel.close_positions(context, stock)
def open_position(self, security: str, value: float) -> bool:
"""
开仓操作:尝试买入指定股票
参数:
security: 股票代码
value: 分配给该股票的资金
返回:
若下单成功(部分或全部成交)返回 True否则返回 False
"""
return self.channel.open_position(security, value)