网友基于唐奇安通道和macd均线考虑的一个策略

batman
batman IT老炮

0 人点赞了该文章 · 232 浏览

昨天有网友发了一个基于PTrade交易的策略来看问题,问题描述是该策略只有买进,没有卖出。下面是原始策略代码:

import talib

def initialize(context):
# 初始化策略
g.security = "603580.SS"

# 设定每次开仓使用资金的比率
g.capital_usage_ratio = 0.3

g.position = 0 # 是否开仓

set_universe(g.security) # 股票池
set_slippage(slippage=0.002) # 设定滑点


def handle_data(context, data):
# 获取历史数据
df = get_history(100, '1d', ['open', 'high', 'low', 'close'], g.security, fq=None, include=True)

# 计算唐千安通道指标
df["DonHi_n1"] = df["high"].rolling(20).max()
df["DonLo_n1"] = df["low"].rolling(20).min()

# 计算MACD指标
close_prices = df["close"].values
diff, dea, macd = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9)
df["diff"] = diff
df["dea"] = dea
df["macd"] = macd

# 判断MACD日线底部结构钝化形成,买入30%仓位
if df["macd"].iloc[-1] < df["macd"].iloc[-2] < df["macd"].iloc[-3]:
cash = context.portfolio.cash
order_value(g.security, cash * 0.3)
log.info("买入30%仓位")

# 判断顶部MACD日线级别钝化形成,卖出70%仓位
if df["macd"].iloc[-1] > df["macd"].iloc[-2] > df["macd"].iloc[-3]:
if g.position == 1:
order_target(g.security, 0)
log.info("卖出70%仓位")
g.position = 0
# 判断是否突破唐千安通道上轨,买入剩余70%仓位
if data[g.security]["close"] > df["DonHi_n1"].iloc[-1]:
if g.position == 0:
cash = context.portfolio.cash
target_value = cash * 0.7
order_value(g.security, target_value)
log.info("买入剩余70%仓位")
g.position = 1



# 判断是否跌破唐千安通道下轨,清仓
if data[g.security]["low"] < df["DonLo_n1"].iloc[-1]:
order_target(g.security, 0)
log.info("清仓")
g.position = 0

================================(这里是分割线)

首先这个策略有一定想法,其策略意图是这样的:

- 如果股票MACD指标的日线底部结构钝化形成,则买入30%仓位。

- 如果股票MACD指标的日线顶部结构钝化形成,且已经满仓持入,则卖出70%仓位。

- 如果股价突破唐奇安通道的上轨,且当前只有底仓,则买入剩余70%仓位。

- 如果当前价跌破唐奇安通道的下轨,则清仓。

但是在代码实现中,逻辑并不完备,造成策略永远只有买入,没有卖出。于是操刀在原代码上做了手术,实现上述策略意图。此策略适合在上升趋势中把握行情,具有一定风险把控和盈利锁定考虑,适合初接触PTrade量化交易者学习。修改后的代码在附件中,感兴趣者可自行下载学习。

附件列表

macdturtle.txt

3KB

8.80

线上付款

发布于 2024-04-25 11:24

免责声明:

本文由 batman 原创发布于 百果量化交流平台 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论