3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
**CCI 指标(Commodity Channel Index,顺势指标)**是一种超买超卖型指标,专门用于测量股价是否已超出常态分布范围。在量化交易中,CCI 能够敏锐地捕捉趋势的启动与反转。
**动态追踪止损(Trailing Stop Loss)**是一种高级风控保护机制。与固定止损不同,追踪止损点会随着股价的上涨而不断上移。一旦股价从最高点回撤达到设定比例,策略将立即触发止损,从而在保护利润的同时限制最大回撤。
在 PTrade 平台中,我们可以结合内置的 get_CCI 函数与持仓管理 API,轻松实现这一动态风控算法。
get_CCI(high, low, close, n=14):
high(最高价序列)、low(最低价序列)、close(收盘价序列)均为 numpy.ndarray 类型;n 为计算周期(默认 14)。get_history(count, frequency, field, security_list):用于获取历史 K 线数据,为指标计算提供输入。get_position(security):获取指定标的持仓信息,用于判断当前是否持有仓位及持仓数量。# -*- coding: utf-8 -*-
def initialize(context):
# 设置操作的股票(以恒生电子为例)
g.security = '600570.SS'
set_universe(g.security)
# 初始化风控变量
g.highest_price = 0.0 # 记录持仓期间的最高价
g.stop_loss_pct = 0.05 # 追踪止损比例(5%)
def handle_data(context, data):
sid = g.security
# 1. 获取历史行情数据(计算CCI需要high, low, close)
h = get_history(50, '1d', ['close', 'high', 'low'], security_list=sid)
if h is None or len(h) < 14:
return
high_data = h['high'].values
low_data = h['low'].values
close_data = h['close'].values
# 2. 计算 CCI 指标
cci_array = get_CCI(high_data, low_data, close_data, 14)
if cci_array is None or len(cci_array) < 2:
return
current_cci = cci_array[-1]
prev_cci = cci_array[-2]
# 获取当前持仓与最新价格
pos = get_position(sid)
current_price = data[sid]['close']
# 3. 交易与风控逻辑
if pos.amount == 0:
# 无持仓:等待买入机会
# CCI 从下往上突破 -100
if prev_cci <= -100 and current_cci > -100:
cash = context.portfolio.cash
if cash > 0:
order_value(sid, cash)
g.highest_price = current_price # 初始化最高价
log.info(f"【买入提示】CCI突破-100,买入 {sid},当前价: {current_price}")
else:
# 已持仓:执行动态追踪止损与指标止盈
# 更新持仓期间的最高价
if current_price > g.highest_price:
g.highest_price = current_price
log.info(f"【更新最高价】当前最高价更新为: {g.highest_price}")
# 计算当前动态止损价格
stop_loss_price = g.highest_price * (1 - g.stop_loss_pct)
# 触发追踪止损
if current_price < stop_loss_price:
order_target(sid, 0)
log.info(f"【风控止损】股价跌破追踪止损线!最高价: {g.highest_price},止损价: {stop_loss_price},当前价: {current_price},执行清仓。")
# 触发指标止盈:CCI 从上往下跌破 100
elif prev_cci >= 100 and current_cci < 100:
order_target(sid, 0)
log.info(f"【指标止盈】CCI跌破100超买区,趋势转弱,当前价: {current_price},执行清仓。")
limit_price 进行 round(price, 2) 处理,避免因精度问题导致柜台废单。