Py学习  »  Python

Python编程学习:RSI三重峰值【通达信】动量结构同步指标

量化对冲套利 • 3 周前 • 86 次点击  

互爱利他分享技术

通达信指标安装步骤:

电脑端 打开通达信软件;点击“功能”-“公式系统”-“公式管理器”;选择“技术指标公式”-“新建”;测试通过的话,一定要记得去点击右上角的”确定“按钮,这样就完成了。

友情提示(指标只是辅助,不作建议) 

图一:指标全局分析图

一、指标核心用法

指标名称:RSI三重峰值【通达信】动量结构同步指标
指标类型画线方法:附图指标
风险提示:Python编程学习指标仅仅就是提供技术研究和学习交流使用。市场一致有很强的不确定性,所有基于指标的决策判断都要小心谨慎,且需要自行承担风险,不构成任何投资建议。本文所述模型算法仅限学术探讨,指标公式作为知识免费分享,"基于开源数据集的理论推演",仅用于学习交流。

二、指标图谱展示

图二:指标指数示范图

三、指标Python代码

Python安装依赖 pip install pandas numpy
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerfrom matplotlib.pylab import mpl# 设置中文字体和负号显示mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falseclass LJIndicator:    def __init__(self, data):        """        Python编程学习        """        self.data = data.copy()        self.calculate_indicators()    def wma(self, series, period):        """加权移动平均"""        weights = np.arange(1, period + 1)        wma_values = np.zeros(len(series))        for i in range(period - 1len(series)):            window = series[i - period + 1:i + 1]            wma_values[i] = np.sum(window * weights) / np.sum(weights)        # 前period-1个值用NaN填充        wma_values[:period - 1] = np.nan        return wma_values    def hhv(self, series, period):        """周期内最值"""        hhv_values = np.zeros(len(series))        for i in range(len(series)):            if i < period - 1:                hhv_values[i] = np.max(series[:i + 1]) if i >= 0 else series[i]            else:                hhv_values[i] = np.max(series[i - period + 1:i + 1])        return hhv_values    def sma(self, series, period):        """简单移动平均"""        return series.rolling(window=period, min_periods=1).mean()    def calculate_indicators(self):        """计算所有"""        df = self.data        # 原始变量计算        lijin1 = 6        lijin2 = df['close'].shift(1)  # REF(CLOSE,1)        # 计算RSI类型的指标        close_diff = df['close'] - lijin2        positive_diff = np.maximum(close_diff, 0)        abs_diff = np.abs(close_diff)        # SMA计算        sma_pos = self.sma(positive_diff, lijin1)        sma_abs = self.sma(abs_diff, lijin1)        # 避免除零        lijin3 = np.where(sma_abs != 0, sma_pos / sma_abs, 0)        # 计算周期长度        bars_count = np.arange(1len(df) + 1)        period_length = np.where(bars_count 20, bars_count, 20)        # 计算lijin4        lijin3_ceil = np.ceil(lijin3 * 100)  # 乘以100以便ceiling函数更准确


    
        lijin4_values = np.zeros(len(df))        for i in range(len(df)):            period = int(period_length[i])            start_idx = max(0, i - period + 1)            window_values = lijin3_ceil[start_idx:i + 1] * df['high'].values[start_idx:i + 1]            lijin4_values[i] = np.max(window_values) if len(window_values) > 0 else 0        df['lijin4'] = lijin4_values        # 计算lijin5 (WMA 20)        df['lijin5'] = self.wma(df['lijin4'], 20)        # 计算lijin6        df['lijin6'] = 2 * (df['lijin4'] - df['lijin5'])        # 计算HHV指标        diff_4_5 = df['lijin4'] - df['lijin5']        df['lijin7'] = self.hhv(diff_4_5, 2)        df['lijin8'] = self.hhv(diff_4_5, 4)  # 2*2        df['lijin9'] = self.hhv(diff_4_5, 8)  # 2*4        # 计算趋势信号        df['lijin10'] = df['lijin7']        df['lijin11'] = df['lijin7']        df['lijin12'] = df['lijin10'].shift(1)        self.results = df        return df

四、指标公式源代码

LIJIN1:=6;

LIJIN2:=REF(CLOSE,1);

LIJIN3:=SMA(MAX(CLOSE-LIJIN2,0),LIJIN1,1)/SMA(ABS(CLOSE-LIJIN2),LIJIN1,1);

LIJIN4:=HHV(CEILING(LIJIN3)*HIGH,IF(BARSCOUNT(CLOSE)<20,BARSCOUNT(CLOSE),20)),COLORFFFF00;

LIJIN5:=WMA(LIJIN4,20);

LIJIN6:2*(LIJIN4-LIJIN5),COLORSTICK;

LIJIN7:HHV((LIJIN4-LIJIN5),2),COLORFFFFFF;

LIJIN8:HHV((LIJIN4-LIJIN5),2*2),COLOR00FFFF;

LIJIN9:HHV((LIJIN4-LIJIN5),2*4),COLOR00FF00;

IF(LIJIN7=LIJIN8&&LIJIN8=LIJIN9&&LIJIN6>0,LIJIN7,DRAWNULL),COLOR0000FF,LINETHICK3;

IF(LIJIN7=LIJIN8&&LIJIN8=LIJIN9&&LIJIN6>0&&LIJIN8>0,LIJIN7,DRAWNULL),COLOR00FFFF;

LIJIN10:=LIJIN7;

LIJIN11:=LIJIN7,COLORYELLOW;

LIJIN12:=REF(LIJIN10,1);

IF(LIJIN11>LIJIN12,LIJIN10,DRAWNULL),LINETHICK1,COLORRED;

IF(LIJIN11>LIJIN12,LIJIN10,DRAWNULL)CIRCLEDOT,LINETHICK3,COLORRED;

IF(LIJIN11<=LIJIN12,LIJIN10,DRAWNULL),LINETHICK1,COLORBLUE;

IF(LIJIN11<=LIJIN12,LIJIN10,DRAWNULL)CIRCLEDOT,LINETHICK3,COLORBLUE;

分享知识:与人为善,分享快乐!爱人如己,我为人人!


自用指标







Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/191163