本策略将Prime Bands和CPR指标的卓越性能深度结合,构建出一种系统化、规范化且极具条理性的交易方式。一旦正确运用,便能持续稳定地输出良好结果,极大增强您在交易过程中的信心。特别适合那些期望通过一套清晰、有条不紊的方法来精准把握盈利机会的交易者。
1. Prime 波段与 CPR 枢纽简介
Prime 波段和 CPR 枢纽是两种互补的技术分析工具,结合使用可提升交易信号的准确性。Prime 波段捕捉价格的动态波动区间,而 CPR 提供关键的支撑和阻力水平,两者结合适合波段交易和趋势确认。
1.1 Prime 波段指标
Prime 波段(Prime Bands)是一种基于价格移动平均线和波动性的指标,类似于布林带,但更强调价格的动态特性。它由以下部分组成:
- • 中轨(Mid Band):n 周期简单移动平均线(SMA),反映价格趋势。
- • 上轨(Upper Band):中轨 + k × 标准差,指示潜在阻力。
- • 下轨(Lower Band):中轨 - k × 标准差,指示潜在支撑。
计算公式:
- • 中轨 = SMA(close, n)
- • 波动因子 = k × StdDev(close, n)
- • 上轨 = 中轨 + 波动因子
- • 下轨 = 中轨 - 波动因子
默认参数:n=20(周期),k=2(倍数)。
1.2 CPR 枢纽指标
中央枢纽点(CPR)是一种基于前一日价格的指标,广泛用于识别日内的支撑和阻力水平。CPR 包含:
- • 枢纽点(Pivot, P):(前日高点 + 前日低点 + 前日收盘价) / 3
- • 顶部枢纽(Top Central, TC):(P - 前日低点) + 前日高点
- • 底部枢纽(Bottom Central, BC):前日高点 - (前日高点 - P)
CPR 的宽度(TC - BC)反映市场波动性:
- • 窄 CPR:预示大波动,可能出现趋势行情。
- • 宽 CPR:预示低波动,可能进入震荡行情。
1.3 结合 Prime 波段与 CPR 的优势
- • 趋势与关键点结合:Prime 波段识别趋势方向和超买超卖区域,CPR 提供关键价格水平(如支撑、阻力)。
- • 信号过滤:用 CPR 确认 Prime 波段的交易信号,减少假突破。
- • 多时间框架适用:适合 1 小时、日线等多周期分析,尤其在比特币高波动市场中效果显著。
2. 如何使用 Prime 波段与 CPR 确定买入和卖出点
结合 Prime 波段和 CPR,我们可以制定更精准的交易策略,基于价格与波段的关系以及 CPR 的支撑阻力水平,明确买入和卖出信号。
2.1 买入信号
买入信号在价格显示超卖且得到 CPR 支撑确认时触发,具体规则:
- • 价格触碰或跌破 Prime 下轨:表明潜在超卖,价格可能反弹。
- • 价格接近或位于 CPR 的 BC 或 P 附近:BC 或 P 作为支撑,增强买入信号可靠性。
- • Prime 中轨趋势向上:确认多头趋势。
- • 成交量放大:表明买盘活跃,支持反弹。
示例:比特币价格跌至 Prime 下轨(60,000 美元),同时接近 CPR 的 BC(59,800 美元),中轨向上,成交量增加,可考虑买入。
2.2 卖出信号
卖出信号在价格显示超买且受到 CPR 阻力压制时触发,具体规则:
- • 价格触碰或突破 Prime 上轨:表明潜在超买,价格可能回调。
- • 价格接近或位于 CPR 的 TC 或 P 附近:TC 或 P 作为阻力,增强卖出信号可靠性。
- • Prime 中轨趋势向下或持平:警惕趋势反转。
- • 成交量萎缩:表明追高动能不足。
示例:比特币价格突破 Prime 上轨(70,000 美元),接近 CPR 的 TC(70,200 美元),中轨走平,成交量下降,可考虑卖出。
2.3 风险管理
为降低风险,建议:
- • 止损设置:买入后若价格跌破 CPR 的 BC 或 Prime 下轨 2%-3%,设置止损;卖出后若突破 CPR 的 TC 或 Prime 上轨,止损。
- • 仓位控制:单笔交易不超过总资金的 5%-10%。
- • 信号验证:结合 RSI 或 MACD 过滤假信号。
- • CPR 宽度分析:窄 CPR 时关注突破,宽 CPR 时关注震荡。
3. Python 实现:模块化设计与数据可视化
3.1 代码结构说明
我们设计一个 PrimeBandsCPRTrader 类,包含以下功能:
- • 数据获取:通过 CCXT 从 Binance 获取比特币 OHLCV 数据(小时和日线)。
- • 指标计算:计算 Prime 波段(中轨、上轨、下轨)和 CPR(P、TC、BC)。
- • 信号生成:基于 Prime 波段与 CPR 的结合规则,生成买入和卖出信号。
- • 可视化:用 Plotly 绘制 K 线图、Prime 波段、CPR 水平线、交易信号和叠加的成交量柱状图。
3.2 完整代码
import ccxt
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
from datetime import datetime, timedelta
class PrimeBandsCPRTrader:
def __init__(self, exchange='binance', symbol='BTC/USDT', timeframe='1h', period=20, multiplier=2):
"""
初始化 Prime 波段与 CPR 交易类
:param exchange: 交易所名称
:param symbol: 交易对
:param timeframe: K线周期(如 '1h')
:param period: Prime 波段移动平均周期
:param multiplier: Prime 波段波动因子倍数
"""
self.exchange = getattr(ccxt, exchange)()
self.symbol = symbol
self.timeframe = timeframe
self.period = period
self.multiplier = multiplier
self.data = None
self.daily_data = None
def fetch_data(self, limit=500):
"""
获取 OHLCV 数据(小时和日线)
:param limit: 数据条数
:return: DataFrame 格式数据
"""
try:
# 获取小时数据
ohlcv = self.exchange.fetch_ohlcv(self.symbol, self.timeframe, limit=limit)
self.data = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
self.data['timestamp'] = pd.to_datetime(self.data['timestamp'], unit='ms')
# 获取日线数据(用于 CPR 计算)
daily_ohlcv = self.exchange.fetch_ohlcv(self.symbol, '1d', limit=limit//24 + 1)
self.daily_data = pd.DataFrame(daily_ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
self.daily_data['timestamp'] = pd.to_datetime(self.daily_data['timestamp'], unit='ms')
return self.data, self.daily_data
except Exception as e:
print(f"数据获取失败: {e}")
return None, None
def calculate_prime_bands(self):
"""
计算 Prime 波段指标
:return: DataFrame 包含中轨、上轨、下轨
"""
if self.data is None:
return None
# 计算简单移动平均线(中轨)
self.data['mid_band'] = self.data['close'].rolling(window=self.period).mean()
# 计算标准差
self.data['std'] = self.data['close'].rolling(window=self.period).std()
# 计算上轨和下轨
self.data['upper_band'] = self.data['mid_band'] + self.multiplier * self.data['std']
self.data['lower_band'] = self.data['mid_band'] - self.multiplier * self.data['std']
return self.data
def calculate_cpr(self):
"""
计算 CPR 指标
:return: DataFrame 包含枢纽点(P)、顶部枢纽(TC)、底部枢纽(BC)
"""
if self.daily_data is None:
return None
# 计算 CPR
self.daily_data['pivot'] = (self.daily_data['high'] + self.daily_data['low'] + self.daily_data['close']) / 3
self.daily_data['bc'] = (self.daily_data['high'] + self.daily_data['low']) / 2
self.daily_data['tc'] = (self.daily_data['pivot'] - self.daily_data['low']) + self.daily_data['high']
# 将日线 CPR 映射到小时数据
self.data['pivot'] = np.nan
self.data['tc'] = np.nan
self.data['bc'] = np.nan
for i, row in self.daily_data.iterrows():
date = row['timestamp'].date()
mask = self.data['timestamp'].dt.date == date
self.data.loc[mask, 'pivot'] = row['pivot']
self.data.loc[mask, 'tc'] = row['tc']
self.data.loc[mask, 'bc'] = row['bc']
return self.data
def generate_signals(self):
"""
生成买入和卖出信号
:return: DataFrame 包含信号列
"""
if self.data is None:
return None
self.data['signal'] = 0
self.data['mid_trend'] = self.data['mid_band'].diff()
# 买入信号:价格触碰下轨且接近 CPR 的 BC 或 P,中轨向上
buy_condition = (
(self.data['close'] <= self.data['lower_band']) &
(self.data['close'] >= self.data['bc'] - 100) & # 接近 BC 或 P(容忍 100 美元)
(self.data['close'] <= self.data['pivot'] + 100) &
(self.data['mid_trend'] > 0)
)
self.data.loc[buy_condition, 'signal'] = 1
# 卖出信号:价格触碰上轨且接近 CPR 的 TC 或 P,中轨向下或持平
sell_condition = (
(self.data['close'] >= self.data['upper_band']) &
(self.data['close'] <= self.data['tc'] + 100) & # 接近 TC 或 P
(self.data['close'] >= self.data['pivot'] - 100) &
(self.data['mid_trend'] <= 0)
)
self.data.loc[sell_condition, 'signal'] = -1
return self.data
def plot_data(self):
"""
使用 Plotly 绘制 K 线、Prime 波段、CPR、交易信号和叠加的成交量
"""
if self.data is None:
return
# 创建子图,设置双 Y 轴
fig = make_subplots(specs=[[{"secondary_y": True}]])
# 绘制 K 线
fig.add_trace(go.Candlestick(
x=self.data['timestamp'],
open=self.data['open'],
high=self.data['high'],
low=self.data['low'],
close=self.data['close'],
name='OHLC'
), secondary_y=True)
# 绘制 Prime 波段
fig.add_trace(go.Scatter(
x=self.data['timestamp'], y=self.data['mid_band'],
line=dict(color='blue'), name='Mid Band'
), secondary_y=True)
fig.add_trace(go.Scatter(
x=self.data['timestamp'], y=self.data['upper_band'],
line=dict(color='red'), name='Upper Band'
), secondary_y=True)
fig.add_trace(go.Scatter(
x=self.data['timestamp'], y=self.data['lower_band'],
line=dict(color='green'), name='Lower Band'
), secondary_y=True)
# 绘制 CPR
fig.add_trace(go.Scatter(
x=self.data['timestamp'], y=self.data['pivot'],
line=dict(color='purple', dash='dash'), name='Pivot (P)'
), secondary_y=True)
fig.add_trace(go.Scatter(
x=self.data['timestamp'], y=self.data['tc'],
line=dict(color='orange', dash='dash’), name='Top Central (TC)'
), secondary_y=True)
fig.add_trace(go.Scatter(
x=self.data['timestamp'], y=self.data['bc'],
line=dict(color='cyan', dash='dash'), name='Bottom Central (BC)'
), secondary_y=True)
# 绘制买入信号
buy_signals = self.data[self.data['signal'] == 1]
fig.add_trace(go.Scatter(
x=buy_signals['timestamp'], y=buy_signals['close'],
mode='markers', marker=dict(symbol='triangle-up', size=10, color='green'),
name='Buy Signal'
), secondary_y=True)
# 绘制卖出信号
sell_signals = self.data[self.data['signal'] == -1]
fig.add_trace(go.Scatter(
x=sell_signals['timestamp'], y=sell_signals['close'],
mode='markers', marker=dict(symbol='triangle-down', size=10, color='red'),
name='Sell Signal'
), secondary_y=True)
# 绘制成交量(叠加,使用次 Y 轴)
fig.add_trace(go.Bar(
x=self.data['timestamp'], y=self.data['volume'],
marker_color='grey', name='Volume', opacity=0.3
), secondary_y=False)
# 更新布局
fig.update_layout(
title='Bitcoin Prime Bands with CPR Trading Strategy',
xaxis_title='Date',
height=800,
showlegend=True
)
fig.update_yaxes(title_text='Volume', secondary_y=False)
fig.update_yaxes(title_text='Price (USDT)', secondary_y=True)
fig.update_xaxes(rangeslider_visible=False)
fig.show()
def run(self):
"""
执行完整交易分析流程
"""
print("正在获取数据...")
self.fetch_data()
print("正在计算 Prime 波段...")
self.calculate_prime_bands()
print("正在计算 CPR...")
self.calculate_cpr()
print("正在生成交易信号...")
self.generate_signals()
print("正在绘制图表...")
self.plot_data()
# 示例运行
if __name__ == "__main__":
trader = PrimeBandsCPRTrader()
trader.run()
3.3 代码运行说明
3.3.1 依赖安装:
pip install ccxt pandas plotly numpy
3.3.2 参数配置:
- • exchange:默认 Binance,可更换为其他支持的交易所。
- • symbol:默认 BTC/USDT。
- • timeframe:默认5分钟 K 线,可调整为 '1m'、'4h' 等。
- • period:Prime 波段周期,默认 20。
- • multiplier:Prime 波段波动倍数,默认 2。
3.3.3 输出结果:
- • 获取最近 500 条小时 K 线和对应日线数据,计算 Prime 波段和 CPR,生成交易信号,绘制交互式图表。
- • 图表包含:K 线图、Prime 波段(中轨、上轨、下轨)、CPR(P、TC、BC)、买入信号(绿色三角)、卖出信号(红色三角)、叠加的成交量柱状图(灰色,半透明)。
3.4 示例图表分析
运行代码后,Plotly 生成的交互式图表将交易量与 K 线图整合显示:
- • K 线:比特币价格走势,主 Y 轴(右侧)。
- • Prime 波段:蓝色中轨、红色上轨、绿色下轨,指示趋势和波动区间。
- • CPR 水平:紫色虚线(P)、橙色虚线(TC)、青色虚线(BC),显示支撑阻力。
- • 交易信号:绿色三角(买入,价格触碰下轨且接近 BC/P),红色三角(卖出,价格触碰上轨且接近 TC/P)。
- • 成交量:灰色半透明柱状图(opacity=0.3),次 Y 轴(左侧),叠加在 K 线图下方,便于分析价格与成交量关系。
用户可缩放或悬停图表,查看信号对应的价格、成交量和时间。
4. 交易策略优化与注意事项
4.1 参数优化
- • Prime 波段:
-
- • 短周期(10):适合日内交易,信号频繁。
- • 长周期(50):适合波段交易,信号更可靠。
- • 调整倍数(1.5-3):小倍数适合高波动,大倍数减少误信号。
- • CPR:
-
- • 窄 CPR(TC-BC<500 美元):关注突破信号。
- • 宽 CPR(>1000 美元):关注区间震荡。
- • 回测建议:使用 Backtrader 或 Zipline 回测,优化周期和倍数。
4.2 注意事项
- • 市场风险:比特币波动剧烈,需关注宏观事件(如监管政策)。
- • 数据延迟:CCXT 数据可能有延迟,建议接入 WebSocket API。
- • 交易成本:考虑 Binance 0.1% 手续费,确保策略盈利。
- • 多周期确认:结合 4 小时或日线 CPR,验证 1 小时信号。
- • 假信号:窄 CPR 可能引发突破陷阱,需结合成交量和 RSI 过滤。
5. 在TradingView设置
为了大家能简单上手,也可以在TradingView上设置此策略。
5.1 添加Prime波段指标
进入 Tradingview 平台,搜索“Prime Bands”,添加加到图表,使用默认设置即可。
5.2 添加CPR指标
搜索 CPR 并将其添加到图表中,注意作者是“botsbykgs”。
点击指标的设置,在“输入”里面只选择“Show Daily CPR”:
在“样式”里面把所有带R2、R3、R4的选项前面的勾选去掉:
5.3 买入条件
- • 绿色K线需要突破Prime波段的中轨。
- • 价格必须位于CPR区间上方,表明市场倾向于看涨。
- • 一根看涨K线必须突破并收在Prime波段指标的中轨之上。
- • 中轨应显示为绿色。
5.4 卖出条件
- • 红色K线需要跌破Prime波段的中轨。
- • 价格必须位于CPR区间下方,表明市场倾向于看跌。
- • 一根看跌K线必须跌破并收在Prime波段指标的中轨之下。
- • 中轨应显示为红色。
6. 总结
Prime 波段与 CPR 枢纽的结合为比特币交易提供了强大的分析框架:Prime 波段捕捉趋势和超买超卖,CPR 提供关键支撑阻力,联合使用可显著提高信号准确性。本文通过模块化的 Python 代码实现了从数据获取到可视化的完整流程,交易量与 K 线图整合显示,增强了分析直观性。大家可优化参数,结合其他指标和风险管理,提升策略表现。
7. 联系方式
- • 公众号:ScienceStudio
![[公众号二维码 1.png]] - • Github: github.com/KandyYe
- • 知乎:www.zhihu.com/people/Scie…
感谢你看到这里,如果觉得文章对你有所收获,请在文末为我点个【赞】+【推荐】,或者【分享】给身边更多有需要的人看,你的点赞就是对我莫大的支持与动力!