# xg_tdx_func **Repository Path**: AZong/xg_tdx_func ## Basic Information - **Project Name**: xg_tdx_func - **Description**: 通达信函数转化器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-10-13 - **Last Updated**: 2024-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xg_tdx_func #### 介绍 xg_tdx_func是一个用于将通达信公式转换为Python代码的库,来自网络的整合,自己的二次开发,学习使用,不做商业用途。通达信是一款流行的股票分析软件,其内置了丰富的公式语言,用于编写股票分析和策略。然而,有时候用户可能需要将这些公式应用到其他平台或环境中,例如Python数据分析和机器学习项目。这时,xg_tdx_func库就派上了用场。 xg_tdx_func库的主要功能是将通达信公式转换为Python代码,以便在Python环境中执行。它支持多种通达信公式函数,包括技术指标、条件判断、数学运算等。通过使用xg_tdx_func库,用户可以方便地将通达信公式移植到Python项目中,实现更灵活的数据分析和策略开发。 #### 软件架构 模型来自实盘交易系统综合交易模型 ``` print('操作方式,登录qmt,选择行情加交易选,择极简模式') print('作者:小果') print('作者微信:15117320079,开实盘qmt可以联系我,开户也可以') print('作者微信公众号:数据分析与运用') print('公众号链接:https://mp.weixin.qq.com/s/rxGJpZYxdUIHitjvI-US1A') print("作者知识星球:金融量化交易研究院 https://t.zsxq.com/19VzjjXNi") ``` 如果感觉设置太麻烦可以找我直接获取文件,直接联系我 xtquant文件太大上传不了,可以加我微信直接获取qmt_trader 微信 下载链接https://mp.weixin.qq.com/s/_AZh7PNclMgW4iHXa6uHIQ ![输入图片说明](imagewx.png) 公众号 https://mp.weixin.qq.com/s/_SYpBLNr4dtZtvj8ydtBrw ![输入图片说明](imagegzh.png) 知识星球,更多的内容在知识星球,链接 https://t.zsxq.com/19VzjjXNi ![输入图片说明](imagezsxq.png) #### 安装教程 python 建议使用3.9 下载xg_tdx)func当作第三方库使用就可以 可能需要这个安装vscode++2022,如果不行我后面我剔除一下不需要的内容 ![输入图片说明](image.png) ![输入图片说明](image2image.png) #### 使用说明 ### **一使用例子** ### 例子1通达信波段BS买卖指标 ``` from xg_tdx_func.xg_tdx_func import * import pandas as pd import akshare as ak class band_bs_trading: def __init__(self,df): ''' 波段BS买卖 ''' self.df=df def band_bs_trading(self): ''' 输出MA5:收盘价的5日简单移动平均 输出MA10:收盘价的10日简单移动平均,画黄色 输出MA20:收盘价的20日简单移动平均 输出MA30:收盘价的30日简单移动平均,画白色 输出MA120:收盘价的120日简单移动平均,画绿色,POINTDOT 输出MA240:收盘价的240日简单移动平均,画红色,POINTDOT A1赋值:如果收盘价>=MA5,返回1,否则返回-1 A2赋值:如果收盘价>=MA10,返回1,否则返回-1 A3赋值:如果收盘价>=MA20,返回1,否则返回-1 A4赋值:如果MA5>=1日前的MA5,返回1,否则返回-1 A5赋值:如果MA10>=1日前的MA10,返回1,否则返回-1 A6赋值:如果MA20>=1日前的MA20,返回1,否则返回-1 QUSHIX赋值:(A1+A2+A3+A4+A5+A6)/6*100,画青色,线宽为3 X1赋值:(收盘价+最低价+最高价)/3 X2赋值:X1的6日指数移动平均 X3赋值:X2的5日指数移动平均 当满足条件X2上穿X3时,在最低价*0.98位置书写文字 当满足条件X3上穿X2时,在最高价*1.02位置书写文字 当满足条件X2>=X3时,在最低价和最高价位置之间画柱状线,宽度为0,0不为0则画空心柱.,画红色 当满足条件X2>=X3时,在收盘价和开盘价位置之间画柱状线,宽度为3,1不为0则画空心柱.,画红色 当满足条件X2=100ANDMA5>1日前的MA5AND(收盘价-开盘价)/开盘价*100>5ANDCLOSE>MA5时,在最低价*0.99位置书写文字,画洋红色 ''' data=pd.DataFrame() data['date']=self.df['date'] C=self.df['close'] CLOSE=self.df['close'] L=self.df['low'] LOW=self.df['low'] H=self.df['high'] HIGH=self.df['high'] OPEN=self.df['open'] MA5=MA(C,5) MA10=MA(C,10) MA20=MA(C,20) MA30=MA(C,30) MA120=MA(C,120) MA240=MA(C,240) A1=IF(C>=MA5,1,-1) A2=IF(C>=MA10,1,-1) A3=IF(C>=MA20,1,-1) A4=IF(MA5>=REF(MA5,1),1,-1) A5=IF(MA10>=REF(MA10,1),1,-1) A6=IF(MA20>=REF(MA20,1),1,-1) QUSHIX=(A1+A2+A3+A4+A5+A6)/6*100#,COLORCYAN,LINETHICK3 X1=(C+L+H)/3 X2=EMA(X1,6) X3=EMA(X2,5) #DRAWTEXT(CROSS(X2,X3),L*0.98,'B'); data['B']=IF(CROSS(X2,X3),'B',None) #DRAWTEXT(CROSS(X3,X2),H*1.02,'S'); data['S']=IF(CROSS(X3,X2),'S',None) ''' STICKLINE(X2>=X3,LOW,HIGH,0,0),COLORRED; STICKLINE(X2>=X3,CLOSE,OPEN,3,1),COLORRED; ''' data['多头持续']=IF(X2>=X3,'多头持续',None) ''' STICKLINE(X2=100,MA5>REF(MA5,1)) ,(CLOSE-OPEN)/OPEN*100>5),CLOSE>MA5) return data if __name__=='__main__': df=ak.stock_zh_a_daily(symbol='sz002600',start_date='20230101',end_date='20500101') models=band_bs_trading(df=df) df=models.band_bs_trading() print(df) ``` ### 例子2蛟龙出海 ``` from trader_tool.tdx_indicator import * import akshare as ak def get_user_def_func(df): ''' 自定义通达信函数 DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); DEA:=EMA(DIFF,9); MACD:=2*(DIFF-DEA);{微信公众号:尊重市场} 尊重市场:=BARSLAST(DEA<0); 股民指标:=IF(REF(DIFF,1)>0 AND REF(DEA,1)>0,CROSS(DIFF,DEA),0); 指标营地:=SUM(股民指标,尊重市场)=2 AND 股民指标=1; 操作线:EMA(CLOSE,21),DOTLINE,LINETHICK1; 主力线:EMA(CLOSE,55),LINETHICK2;{微信公众号:尊重市场} 尊重市场1:=CROSS(CLOSE,主力线) AND VOL>REF(SUM(VOL,3)/3*1.5,1); STICKINE(尊重市场1=1,CLOSE,OPEN,3.1,0),COLORFF40FF; STICKLINE(尊重市场1=1,HIGH,LOW,0.0000000001,0),COLORFF40FF; DRAWTEXT(尊重市场1=1,LOW,{微信公众号:尊重市场}' ★蛟龙出海'),COLORFF40FF; DRAWICON(尊重市场1=1,L,9); ''' OPEN=df['open'] CLOSE=df['close'] C=df['close'] LOW=df['low'] L=df['low'] HIGH=df['high'] H=df['high'] VOL=df['volume'] DIFF=EMA(CLOSE,12)-EMA(CLOSE,26) DEA=EMA(DIFF,9) MACD=2*(DIFF-DEA) 尊重市场=BARSLAST(DEA<0) 股民指标=IF(AND(REF(DIFF,1)>0, REF(DEA,1)>0),CROSS(DIFF,DEA),0) #指标营地=AND(SUM(股民指标,尊重市场)==2, 股民指标==1) 操作线=EMA(CLOSE,21) 主力线=EMA(CLOSE,55) 尊重市场1=AND(CROSS(CLOSE,主力线)[1:], VOL>REF(SUM(VOL,3)/3*1.5,1)) data=pd.DataFrame() data['date']=df['date'] data['操作线']=操作线 data['主力线']=主力线 data['蛟龙出海']=尊重市场1 return data df=ak.stock_zh_a_daily(symbol='sh600171',start_date='20210101',end_date='20500101') result=get_user_def_func(df=df) print(result) ``` ### 例子3 波段bs交易系统 ``` from xg_tdx_func.xg_tdx_func import * import pandas as pd import akshare as ak class band_bs_trading: def __init__(self,df): ''' 波段BS买卖 ''' self.df=df def band_bs_trading(self): ''' 输出MA5:收盘价的5日简单移动平均 输出MA10:收盘价的10日简单移动平均,画黄色 输出MA20:收盘价的20日简单移动平均 输出MA30:收盘价的30日简单移动平均,画白色 输出MA120:收盘价的120日简单移动平均,画绿色,POINTDOT 输出MA240:收盘价的240日简单移动平均,画红色,POINTDOT A1赋值:如果收盘价>=MA5,返回1,否则返回-1 A2赋值:如果收盘价>=MA10,返回1,否则返回-1 A3赋值:如果收盘价>=MA20,返回1,否则返回-1 A4赋值:如果MA5>=1日前的MA5,返回1,否则返回-1 A5赋值:如果MA10>=1日前的MA10,返回1,否则返回-1 A6赋值:如果MA20>=1日前的MA20,返回1,否则返回-1 QUSHIX赋值:(A1+A2+A3+A4+A5+A6)/6*100,画青色,线宽为3 X1赋值:(收盘价+最低价+最高价)/3 X2赋值:X1的6日指数移动平均 X3赋值:X2的5日指数移动平均 当满足条件X2上穿X3时,在最低价*0.98位置书写文字 当满足条件X3上穿X2时,在最高价*1.02位置书写文字 当满足条件X2>=X3时,在最低价和最高价位置之间画柱状线,宽度为0,0不为0则画空心柱.,画红色 当满足条件X2>=X3时,在收盘价和开盘价位置之间画柱状线,宽度为3,1不为0则画空心柱.,画红色 当满足条件X2=100ANDMA5>1日前的MA5AND(收盘价-开盘价)/开盘价*100>5ANDCLOSE>MA5时,在最低价*0.99位置书写文字,画洋红色 ''' data=pd.DataFrame() data['date']=self.df['date'] C=self.df['close'] CLOSE=self.df['close'] L=self.df['low'] LOW=self.df['low'] H=self.df['high'] HIGH=self.df['high'] OPEN=self.df['open'] MA5=MA(C,5) MA10=MA(C,10) MA20=MA(C,20) MA30=MA(C,30) MA120=MA(C,120) MA240=MA(C,240) A1=IF(C>=MA5,1,-1) A2=IF(C>=MA10,1,-1) A3=IF(C>=MA20,1,-1) A4=IF(MA5>=REF(MA5,1),1,-1) A5=IF(MA10>=REF(MA10,1),1,-1) A6=IF(MA20>=REF(MA20,1),1,-1) QUSHIX=(A1+A2+A3+A4+A5+A6)/6*100#,COLORCYAN,LINETHICK3 X1=(C+L+H)/3 X2=EMA(X1,6) X3=EMA(X2,5) #DRAWTEXT(CROSS(X2,X3),L*0.98,'B'); data['B']=IF(CROSS(X2,X3),'B',None) #DRAWTEXT(CROSS(X3,X2),H*1.02,'S'); data['S']=IF(CROSS(X3,X2),'S',None) ''' STICKLINE(X2>=X3,LOW,HIGH,0,0),COLORRED; STICKLINE(X2>=X3,CLOSE,OPEN,3,1),COLORRED; ''' data['多头持续']=IF(X2>=X3,'多头持续',None) ''' STICKLINE(X2=100,MA5>REF(MA5,1)) ,(CLOSE-OPEN)/OPEN*100>5),CLOSE>MA5) return data if __name__=='__main__': df=ak.stock_zh_a_daily(symbol='sz002600',start_date='20230101',end_date='20500101') models=band_bs_trading(df=df) df=models.band_bs_trading() print(df) ``` ### 例子4 波段超级买卖 ``` from xg_tdx_func.xg_tdx_func import * from qmt_trader.unification_data_qmt import unification_data_qmt class band_supe_buy_sell: def __init__(self,df) -> None: self.df=df def band_supe_buy_sell(self): ''' 波段超级买卖 尊重市场1赋值:收盘价的6.5日[1日权重]移动平均 尊重市场2赋值:收盘价的13.5日[1日权重]移动平均 尊重市场11赋值:收盘价的3日[1日权重]移动平均 尊重市场21赋值:收盘价的8日[1日权重]移动平均 当满足条件尊重市场1>尊重市场2时,在尊重市场1和尊重市场2位置之间画柱状线,宽度为2.5,0不为0则画空心柱.,画红色,线宽为2 当满足条件尊重市场2>尊重市场1时,在尊重市场1和尊重市场2位置之间画柱状线,宽度为2.5,0不为0则画空心柱.,画蓝色,线宽为2 当满足条件尊重市场1上穿尊重市场2时,在最低价*0.98位置画5号图标 当满足条件尊重市场21上穿尊重市场11时,在最高价*1.02位置书写文字,画黄色 BBI赋值:(收盘价的3日简单移动平均+收盘价的6日简单移动平均+收盘价的12日简单移动平均+收盘价的24日简单移动平均)/4 UPR赋值:BBI+3*BBI的13日估算标准差,线宽为2 DWN赋值:BBI-3*BBI的13日估算标准差 安全赋值:收盘价的60日简单移动平均,线宽为2 LC赋值:1日前的收盘价 RSI赋值:收盘价-LC和0的较大值的6日[1日权重]移动平均/收盘价-LC的绝对值的6日[1日权重]移动平均*100 A7赋值:(2*收盘价+最高价+最低价)/4 输出操作线:A7的5日简单移动平均,线宽为1 操作线1赋值:A7的5日简单移动平均*1.03,线宽为2 操作线2赋值:A7的5日简单移动平均*0.97,线宽为2 输出ABC1:21日内A7的最低值 输出ABC2:21日内A7的最高值 SK赋值:(A7-ABC1)/(ABC2-ABC1)*100的7日指数移动平均 SD赋值:0.667*1日前的SK+0.333*SK的5日指数移动平均 当满足条件如果统计8日中满足收盘价<1日前的收盘价的天数/8>6/10ANDVOL>=1.5*成交量(手)的5日简单移动平均ANDCOUNT(SK>=SD,3)ANDREF(最低价,1)=120日内最低价的最低值,返回1,否则返回0时,在最低价*0.98位置画9号图标 当满足条件如果统计13日中满足收盘价<1日前的收盘价的天数/13>6/10ANDCOUNT(SK>SD,6)ANDREF(最低价,5)=120日内最低价的最低值ANDREF(收盘价>=开盘价,4)ANDREF(收阳线,3)ANDREF(收阳线,2)ANDREF(开盘价>CLOS,返回?,否则返回?时,在,1)ANDOPEN>1日前的收盘价,1,0)位置书写文字 ,画黄色 当满足条件如果统计13日中满足收盘价<1日前的收盘价的天数/13>6/10ANDCOUNT(SK>SD,6)ANDREF(最低价,5)=120日内最低价的最低值ANDREF(收盘价>=开盘价,4)ANDREF(收阳线,3)ANDREF(收阳线,2)ANDREF(开盘价>CLOS,返回?,否则返回?时,在,1)ANDOPEN>1日前的收盘价,1,0)位置画最低价*0.98号图标 ''' df=self.df CLOSE=df['close'] C=df['close'] LOW=df['low'] L=df['low'] HIGH=df['high'] H=df['high'] OPEN=df['open'] O=df['open'] volume=df['volume'] V=df['volume'] 尊重市场1=SMA(C,6.5,1) 尊重市场2=SMA(C,13.5,1) 尊重市场11=SMA(C,3,1) 尊重市场21=SMA(C,8,1) ''' STICKLINE(尊重市场1>尊重市场2 , 尊重市场1,尊重市场2 ,2.5, 0),COLORRED,LINETHICK2; STICKLINE(尊重市场2>尊重市场1,尊重市场1,尊重市场2,2.5,0),COLORBLUE,LINETHICK2; ''' df['柱子']=IF(尊重市场1>尊重市场2,'红色','蓝色') #DRAWICON( CROSS(尊重市场1,尊重市场2),L*0.98,5); df['笑脸']=CROSS(尊重市场1,尊重市场2) #DRAWTEXT(CROSS(尊重市场21,尊重市场11),H*1.02,''),COLORYELLOW; df['标记文字']=CROSS(尊重市场21,尊重市场11) BBI=(MA(CLOSE,3)+MA(CLOSE,6)+MA(CLOSE,12)+MA(CLOSE,24))/4 UPR=BBI+3*STD(BBI,13) DWN=BBI-3*STD(BBI,13) 安全=MA(CLOSE,60) LC=REF(CLOSE,1) RSI=SMA(MAX(CLOSE-LC,0),6,1)/SMA(ABS(CLOSE-LC),6,1)*100 A7=(2*C+H+L)/4 操作线=MA(A7,5) df['操作线']=操作线 操作线1=MA(A7,5)*1.03 df['操作线1']=操作线1 操作线2=MA(A7,5)*0.97 df['操作线2']=操作线2 ABC1=LLV(A7,21) ABC2=HHV(A7,21) SK=EMA((A7-ABC1)/(ABC2-ABC1)*100,7) SD=EMA(0.667*REF(SK,1)+0.333*SK,5) ''' DRAWICON(IF(COUNT(CLOSE6/10 AND VOL>=1.5*MA(VOL,5) AND COUNT(SK>=SD,3) AND REF(LOW,1)=LLV(LOW,120),1,0),L*0.98,9); {DRAWTEXT(IF(COUNT(CLOSE6/10 AND VOL>=1.5*MA(VOL,5) AND COUNT(SK>=SD,3) AND REF(LOW,1)=LLV(LOW,120),1,0),LOW*0.98,'底买') ,COLOR0099FF;} DRAWTEXT(IF(COUNT(CLOSE6/10 AND COUNT(SK>SD,6) AND REF(LOW,5)=LLV(LOW,120) AND REF(CLOSE>=OPEN,4) AND REF(CLOSE>OPEN,3) AND REF(CLOSE>OPEN,2) AND REF(OPEN>CLOSE,1) AND OPEN>REF(CLOSE,1),1,0),LOW*0.98,'底买') ,COLORYELLOW; DRAWICON(IF(COUNT(CLOSE6/10 AND COUNT(SK>SD,6) AND REF(LOW,5)=LLV(LOW,120) AND REF(CLOSE>=OPEN,4) AND REF(CLOSE>OPEN,3) AND REF(CLOSE>OPEN,2) AND REF(OPEN>CLOSE,1) AND OPEN>REF(CLOSE,1),1,0),L*0.98,9); ''' 趋势=CLOSE>=操作线 df['趋势']=CLOSE>=操作线 df['stats']=IF(AND(趋势,尊重市场1>尊重市场2),"B","S") return df if __name__=='__main__': data=unification_data_qmt() df=data.get_hist_data_em(stock='513100') modes=band_supe_buy_sell(df=df) result=modes.band_supe_buy_sell() print(result) result.to_excel(r'数据.xlsx') ``` ### 例子5 鼎牛周期共振主图 ``` from xg_tdx_func.xg_tdx_func import * from trader_tool.unification_data import unification_data class dingniu_periodic_resonance_master_diagram: def __init__(self,df) : ''' 鼎牛周期共振主图 ''' self.df=df def dingniu_periodic_resonance_master_diagram(self): ''' ACB1赋值:收盘价的12日指数移动平均-收盘价的26日指数移动平均 ACB2赋值:ACB1的9日指数移动平均 ACB3赋值:ACB1>ACB2 ACB4赋值:(收盘价-12日内最低价的最低值)/(12日内最高价的最高值-12日内最低价的最低值)*100 ACB5赋值:ACB4的3日[1日权重]移动平均 ACB6赋值:ACB5的3日[1日权重]移动平均 ACB7赋值:ACB5>ACB6 ACB8赋值:1日前的收盘价 ACB9赋值:收盘价-ACB8和0的较大值的9日[1日权重]移动平均/收盘价-ACB8的绝对值的9日[1日权重]移动平均*100 ACB10赋值:收盘价-ACB8和0的较大值的26日[1日权重]移动平均/收盘价-ACB8的绝对值的26日[1日权重]移动平均*100 ACB11赋值:ACB9>ACB10 ACB12赋值:ACB4的3日[1日权重]移动平均 ACB13赋值:ACB12的3日[1日权重]移动平均 ACB14赋值:ACB12>ACB13 ACB15赋值:(收盘价的3日简单移动平均+收盘价的9日简单移动平均+收盘价的12日简单移动平均+收盘价的26日简单移动平均)/4 ACB16赋值:收盘价>ACB15 ACB17赋值:收盘价-1日前的收盘价 ACB18赋值:100*ACB17的9日指数移动平均的9日指数移动平均/ACB17的绝对值的9日指数移动平均的3日指数移动平均 ACB19赋值:100*ACB17的26日指数移动平均的12日指数移动平均/ACB17的绝对值的26日指数移动平均的12日指数移动平均 ACB20赋值:ACB18>ACB19 ACB21赋值:以0.9为权重(最高价+最低价+收盘价*2)/4的动态移动平均 ACB22赋值:1日前的ACB21的3日指数移动平均 ACB23赋值:成交量(手)/((最高价-最低价)*2-收盘价-开盘价的绝对值) ACB24赋值:如果收阳线,返回ACB23*(最高价-最低价),否则返回如果收阴线,返回ACB23*(最高价-开盘价+收盘价-最低价),否则返回成交量(手)/2+如果收阳线,返回0-ACB23*(最高价-收盘价+开盘价-最低价),否则返回如果收阴线,返回0-ACB23*(最高价-最低价),否则返回0-成交量(手)/2 ACB25赋值:ACB24/20/1.15 ACB26赋值:ACB25*0.55+1日前的ACB25*0.33+2日前的ACB25*0.22 ACB27赋值:ACB26的8日指数移动平均 ACB28赋值:ACB26的3日指数移动平均 ACB29赋值:ACB28 ACB30赋值:成交量(手) ACB31赋值:ACB30的5日简单移动平均 ACB32赋值:ACB30的10日简单移动平均 ACB33赋值:ACB31>=ACB32 ACB34赋值:ACB29>=0 ACB35赋值:ACB34 AND ACB33 当满足条件ACB35时,在最低价位置画1号图标 ACB36赋值:KDJ的K(9,3,3)的5日简单移动平均 ACB37赋值:收盘价的12/2日指数移动平均-收盘价的26/2日指数移动平均 ACB38赋值:ACB37的9/2日指数移动平均 ACB39赋值:ACB36>=1日前的ACB36 AND ACB37>=ACB38 ABC51赋值:(最高价+最低价+收盘价*2)/4 ABC52赋值:ABC51的17日指数移动平均 ABC53赋值:ABC51的17日估算标准差 ABC54赋值:((ABC51-ABC52)/ABC53*100+200)/4 ABC55赋值:(ABC54的5日指数移动平均-25)*1.56 ABC56赋值:ABC55的2日指数移动平均*1.22 ABC57赋值:ABC56的2日指数移动平均 当满足条件ABC56-ABC57>0时,在开盘价和收盘价位置之间画柱状线,宽度为3,1不为0则画空心柱.,画红色 当满足条件ABC56-ABC57<0时,在开盘价和收盘价位置之间画柱状线,宽度为3,0不为0则画空心柱.,画绿色 当满足条件ABC56-ABC57>0ANDREF(ABC56-ABC57<0,1)时,在开盘价和收盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画黄色 当满足条件ABC56-ABC57>0ANDABC56-ABC57<1日前的ABC56-ABC57ANDABC57>110时,在开盘价和收盘价位置之间画柱状线,宽度为3,0不为0则画空心柱.,画淡红色 涨停赋值:如果(收盘价-1日前的收盘价)*100/1日前的收盘价>=9.80,返回1,否则返回0 涨停牛赋值:最近2日一直存在涨停 当满足条件涨停牛时,在最低价*1.02位置书写文字,画黄色 输出操作线:收盘价的5日简单移动平均,COLORFFFFFF,线宽为1 输出趋势线:收盘价的10日简单移动平均,画红色,线宽为1 画带状线 AA赋值:收盘价>收盘价的10日简单移动平均 MA5赋值:收盘价的5日简单移动平均 MA10赋值:收盘价的10日简单移动平均 多头排列赋值:MA5>MA10 当满足条件ACB35时,在开盘价和收盘价位置之间画柱状线,宽度为2,0不为0则画空心柱.,画洋红色 当满足条件涨停牛时,在开盘价和收盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画黄色 共振赋值:条件连续成立次数=1 当满足条件共振时,在最低价位置书写文字,画黄色 当满足条件共振时,在最低价位置画9号图标 ''' df=self.df CLOSE=df['close'] C=df['close'] LOW=df['low'] L=df['low'] HIGH=df['high'] H=df['high'] OPEN=df['open'] O=df['open'] volume=df['volume'] VOL=df['volume'] V=df['volume'] ACB1=EMA(CLOSE,12)-EMA(CLOSE,26) ACB2=EMA(ACB1,9) ACB3=ACB1>ACB2 ACB4=(CLOSE-LLV(LOW,12))/(HHV(HIGH,12)-LLV(LOW,12))*100 ACB5=SMA(ACB4,3,1) ACB6=SMA(ACB5,3,1) ACB7=ACB5>ACB6 ACB8=REF(CLOSE,1) ACB9=SMA(MAX(CLOSE-ACB8,0),9,1)/SMA(ABS(CLOSE-ACB8),9,1)*100 ACB10=SMA(MAX(CLOSE-ACB8,0),26,1)/SMA(ABS(CLOSE-ACB8),26,1)*100 ACB11=ACB9>ACB10 ACB12=SMA(ACB4,3,1) ACB13=SMA(ACB12,3,1) ACB14=ACB12>ACB13 ACB15=(MA(CLOSE,3)+MA(CLOSE,9)+MA(CLOSE,12)+MA(CLOSE,26))/4 ACB16=CLOSE>ACB15 ACB17=CLOSE-REF(CLOSE,1) ACB18=100*EMA(EMA(ACB17,9),9)/EMA(EMA(ABS(ACB17),9),3) ACB19=100*EMA(EMA(ACB17,26),12)/EMA(EMA(ABS(ACB17),26),12) ACB20=ACB18>ACB19 ACB21=DMA((HIGH+LOW+CLOSE*2)/4,0.9) ACB22=REF(EMA(ACB21,3),1) ACB23=VOL/((HIGH-LOW)*2-ABS(CLOSE-OPEN)) ACB24=IF(CLOSE>OPEN,ACB23*(HIGH-LOW),IF(CLOSE< OPEN,ACB23*(HIGH-OPEN+CLOSE-LOW),VOL/2))+IF(CLOSE>OPEN,0-ACB23*(HIGH-CLOSE+OPEN-LOW),IF(CLOSE< OPEN,0-ACB23*(HIGH-LOW),0-VOL/2)) ACB25=ACB24/20/1.15 ACB26=ACB25*0.55+REF(ACB25,1)*0.33+REF(ACB25,2)*0.22 ACB27=EMA(ACB26,8) ACB28=EMA(ACB26,3) ACB29=ACB28 ACB30=VOL ACB31=MA(ACB30,5) ACB32=MA(ACB30,10) ACB33=ACB31>=ACB32 ACB34=ACB29>=0 ACB35=AND(ACB34,ACB33) #标记箭头 #DRAWICON(ACB35,L,1) ACB36=MA(KDJ(CLOSE=CLOSE,LOW=LOW,HIGH=HIGH)[0],5) ACB37=EMA(CLOSE,12/2)-EMA(CLOSE,26/2) ACB38=EMA(ACB37,9/2) ACB39=AND(ACB36>=REF(ACB36,1),ACB37>=ACB38) ABC51=(HIGH+LOW+CLOSE*2)/4 ABC52=EMA(ABC51,17) ABC53=STD(ABC51,17) ABC54=((ABC51-ABC52)/ABC53*100+200)/4 ABC55=(EMA(ABC54,5)-25)*1.56 ABC56=EMA(ABC55,2)*1.22 ABC57=EMA(ABC56,2) #STICKLINE(ABC56-ABC57>0,O,C,3,1),COLORRED df['红色柱子']=ABC56-ABC57>0 #STICKLINE(ABC56-ABC57<0,O,C,3,0),COLORGREEN; df['绿色柱子']=ABC56-ABC57<0 #STICKLINE(ABC56-ABC57>0 AND REF(ABC56-ABC57< 0,1),O,C,1,0),COLORYELLOW; df['黄色柱子']=AND(ABC56-ABC57>0,REF(ABC56-ABC57< 0,1)) #STICKLINE(ABC56-ABC57>0 AND ABC56-ABC57< REF(ABC56-ABC57,1) AND ABC57>110,O,C,3,0),COLORLIRED; df['淡红色柱子']=AND(ABC56-ABC57>0,AND(ABC56-ABC57< REF(ABC56-ABC57,1),ABC57>110)) 涨停=IF((C-REF(C,1))*100/REF(C,1)>=9.80,1,0) df['涨停']=涨停 涨停牛=EVERY(涨停,2) #DRAWTEXT(涨停牛,L*1.02,'↙牛'),COLORYELLOW; df['涨停牛']=涨停牛 操作线=MA(CLOSE,5) 趋势线=MA(CLOSE,10) #DRAWBAND(操作线,RGB(255,50,50),趋势线,RGB(10,204,60)); df['条形线']=IF(操作线>=趋势线,'红色','绿色') AA=C>MA(C,10); MA5=MA(C,5) MA10=MA(C,10) 多头排列=MA5>MA10 #STICKLINE(ACB35,O,C,2,0),COLORMAGENTA; #STICKLINE(涨停牛,OPEN,CLOSE,1,0),COLORYELLOW; 共振=BARSLASTCOUNT(AND(ABC56-ABC57>0,AND(多头排列,AA)))==1 df['共振']=共振 #DRAWTEXT(共振,L,'★共振'),COLORYELLOW; #DRAWICON(共振,L,9); return df if __name__=='__main__': data=unification_data(trader_tool='ths') data=data.get_unification_data() df=data.get_hist_data_em(stock='159632',start_date='19990101') print(df) modes=dingniu_periodic_resonance_master_diagram(df=df) result=modes.dingniu_periodic_resonance_master_diagram() print(result) result.to_excel(r'数据.xlsx') ``` ### 例子6鼎牛共振副图 ``` from xg_tdx_func.xg_tdx_func import * from trader_tool.unification_data import unification_data class dingniu_periodic_resonance_subdiagram: def __init__(self,df) : ''' 鼎牛共振副图 ''' self.df=df def dingniu_periodic_resonance_subdiagram(self): ''' ABC51赋值:(最高价+最低价+收盘价*2)/4 ABC52赋值:ABC51的17日指数移动平均 ABC53赋值:ABC51的17日估算标准差 ABC54赋值:((ABC51-ABC52)/ABC53*100+200)/4 ABC55赋值:(ABC54的5日指数移动平均-25)*1.56 ABC56赋值:ABC55的2日指数移动平均*1.22 ABC57赋值:ABC56的2日指数移动平均 当满足条件ABC56-ABC57>0时,在0.2和0.4位置之间画柱状线,宽度为3,0不为0则画空心柱.,画红色 当满足条件ABC56-ABC57<0时,在0.2和0.4位置之间画柱状线,宽度为3,0不为0则画空心柱.,画绿色 当满足条件ABC56-ABC57>0ANDREF(ABC56-ABC57<0,1)时,在0.2和0.4位置之间画柱状线,宽度为3.05,0不为0则画空心柱.,COLOR000099 当满足条件ABC56-ABC57>0ANDREF(ABC56-ABC57<0,1)时,在0.2和0.4位置之间画柱状线,宽度为2.2,0不为0则画空心柱.,COLOR0000CC 当满足条件ABC56-ABC57>0ANDREF(ABC56-ABC57<0,1)时,在0.2和0.4位置之间画柱状线,宽度为1.5,0不为0则画空心柱.,画红色 当满足条件ABC56-ABC57>0ANDREF(ABC56-ABC57<0,1)时,在0.2和0.4位置之间画柱状线,宽度为0.5,0不为0则画空心柱.,画黄色 当满足条件ABC56-ABC57>0ANDABC56-ABC57<1日前的ABC56-ABC57ANDABC57>110时,在0.2和0.4位置之间画柱状线,宽度为3,0不为0则画空心柱.,画淡红色 ''' df=self.df CLOSE=df['close'] C=df['close'] LOW=df['low'] L=df['low'] HIGH=df['high'] H=df['high'] OPEN=df['open'] O=df['open'] volume=df['volume'] VOL=df['volume'] V=df['volume'] ABC51=(HIGH+LOW+CLOSE*2)/4 ABC52=EMA(ABC51,17) ABC53=STD(ABC51,17) ABC54=((ABC51-ABC52)/ABC53*100+200)/4 ABC55=(EMA(ABC54,5)-25)*1.56 ABC56=EMA(ABC55,2)*1.22 ABC57=EMA(ABC56,2) ''' STICKLINE(ABC56-ABC57>0,0.2,0.4,3,0),COLORRED STICKLINE(ABC56-ABC57< 0,0.2,0.4,3,0),COLORGREEN ''' df['柱子']=IF(ABC56-ABC57>0,"红色",'绿色') #STICKLINE(ABC56-ABC57>0 AND REF(ABC56-ABC57< 0,1),0.2,0.4,3.05,0),COLOR000099 #STICKLINE(ABC56-ABC57>0 AND REF(ABC56-ABC57< 0,1),0.2,0.4,2.2,0),COLOR0000CC ''' STICKLINE(ABC56-ABC57>0 AND REF(ABC56-ABC57< 0,1),0.2,0.4,1.5,0),COLORRED STICKLINE(ABC56-ABC57>0 AND REF(ABC56-ABC57< 0,1),0.2,0.4,0.5,0),COLORYELLOW ''' df['起点']=AND(ABC56-ABC57>0,REF(ABC56-ABC57< 0,1)) #STICKLINE(ABC56-ABC57>0 AND ABC56-ABC57< REF(ABC56-ABC57,1) AND ABC57>110,0.2,0.4,3,0),COLORLIRED df['淡红色']=AND(ABC56-ABC57>0,AND(ABC56-ABC57< REF(ABC56-ABC57,1),ABC57>110)) return df if __name__=='__main__': data=unification_data(trader_tool='ths') data=data.get_unification_data() df=data.get_hist_data_em(stock='159619',start_date='19990101') print(df) modes=dingniu_periodic_resonance_subdiagram(df=df) result=modes.dingniu_periodic_resonance_subdiagram() print(result) result.to_excel(r'数据.xlsx') ``` ### 例子7主力进场擒黑马主图 ``` from xg_tdx_func.xg_tdx_func import * from trader_tool.unification_data import unification_data class main_approach_to_capture_dark_horse_main_figure: def __init__(self,df): self.df=df def main_approach_to_capture_dark_horse_main_figure(self): ''' 一、主图: 1、灰色K线,底部保持关注; 2、黄色K线,底部酌情买入; 3、红色K线,强势持仓阶段; 4、粉红K线,阶段开始减仓; 5、青色K线,准备清仓卖出; 6、绿色K线,要大跌,卖出; 7、“红色圆球”黑马启动信号; 8、白虚线上持有,线下休息。 二、副图: 1、红柱子,主力吸筹; 2、紫色柱,主力入场; 3、绿色柱,主力离场; 4、先吸筹,后入场买; 5、保留了“买、卖、追涨”等信号参考; 输出MA5:收盘价的5日简单移动平均DOTLINE 画白色 N赋值:30 M赋值:13 赋值: 1日前的收盘价 RSI1赋值:收盘价-LC和0的较大值的13日[1日权重]移动平均/收盘价-LC的绝对值的13日[1日权重]移动平均*100 RSIF赋值:90-RSI1,COLOR33DD33 A4赋值:((收盘价-33日内最低价的最低值)/(33日内最高价的最高值-33日内最低价的最低值))*67 AAC22赋值:10日内最低价的最低值 AAC33赋值:25日内最高价的最高值 动力线赋值:(收盘价-AAC22)/(AAC33-AAC22)*4的4日指数移动平均 RSV赋值:(收盘价-9日内最低价的最低值)/(9日内最高价的最高值-9日内最低价的最低值)*100 ABB1赋值:RSV的3日[1日权重]移动平均 ABB2赋值:ABB1的3日[1日权重]移动平均 ABB3赋值:3*ABB1-2*ABB2 ABC1赋值:(最低价+最高价+收盘价*2)/4 ABC2赋值: ABC1的4日简单移动平均 ABC3赋值:10日内ABC2的最高值 ABC4赋值:ABC3的3日简单移动平均 ABC5赋值:1.25*ABC4-0.25*ABC3 XKKJ赋值:如果ABC5>ABC3,返回ABC3,否则返回ABC5 ACB1赋值:10日内ABC2的最低值 ACB2赋值:ACB1的3日简单移动平均 ACB3赋值:1.25*ACB2-0.25*ACB1 DKKJ赋值:如果ACB30AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画深灰色 当满足条件动力线>=0.2AND动力线<0.5AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画深灰色 当满足条件动力线>=0.5AND动力线<1.75AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画黄色 当满足条件动力线>=1.75AND动力线<3.2AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画红色 当满足条件动力线>=3.2AND动力线<3.45AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画淡红色 当满足条件动力线>=3.45时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱. AND ABB3ABC3,ABC3,ABC5) ACB1=LLV(ABC2,10) ACB2=MA(ACB1,3) ACB3=1.25*ACB2-0.25*ACB1 DKKJ=IF(ACB30AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画深灰色 #STICKLINE(动力线>0 AND ((ABB3>ABB1 AND ABB3ABB1),C,O,1,0),COLORGRAY; df['深灰色']=OR(AND(动力线>0,AND(ABB3>ABB1,ABB3ABB1) #当满足条件动力线>=0.2AND动力线<0.5AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画深灰色 #STICKLINE(动力线>=0.2 AND 动力线<0.5 AND ((ABB3>ABB1 AND ABB3ABB1),C,O,1,0),COLORGRAY; df['深灰色']=OR(AND(AND(动力线>=0.2,动力线<0.5),AND(ABB3>ABB1 , ABB3ABB1) #当满足条件动力线>=0.5AND动力线<1.75AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画黄色 #STICKLINE(动力线>=0.5 AND 动力线<1.75 AND ((ABB3>ABB1 AND ABB3ABB1),C,O,1,0),COLORYELLOW; df['黄色']=OR(AND(AND(动力线>=0.5,动力线<1.75),AND(ABB3>ABB1,ABB3ABB1) #当满足条件动力线>=1.75AND动力线<3.2AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画红色 #STICKLINE(动力线>=1.75 AND 动力线<3.2 AND ((ABB3>ABB1 AND ABB3ABB1),C,O,1,0),COLORRED; df['红色']=OR(AND(AND(动力线>=1.75 ,动力线<3.2) ,AND(ABB3>ABB1,ABB3ABB1) #当满足条件动力线>=3.2AND动力线<3.45AND((ABB3>ABB1ANDABB3<1日前的ABB3)ORABB3>ABB1)时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱.,画淡红色 #STICKLINE(动力线>=3.2 AND 动力线<3.45 AND ((ABB3>ABB1 AND ABB3ABB1),C,O,1,0),COLORLIRED; df['淡红色']=OR(AND(AND(动力线>=3.2,动力线<3.45),AND(ABB3>ABB1,ABB3ABB1) #当满足条件动力线>=3.45时,在收盘价和开盘价位置之间画柱状线,宽度为1,0不为0则画空心柱. AND ABB3=3.45,C,O,1,0) AND ABB3=3.45,ABB345,返回ABC6-45,否则返回0 当满足条件1日前的趋势<趋势时,在趋势和1日前的趋势位置之间画柱状线,宽度为2,0不为0则画空心柱.,画洋红色 当满足条件1日前的趋势>趋势时,在趋势和1日前的趋势位置之间画柱状线,宽度为2,0不为0则画空心柱.,画绿色 强弱分界赋值:50,COLORFFFFCC 底部赋值:0,COLOR00FFFF 安全赋值:20,COLORFFFF66,线宽为1 预警赋值:80,COLORFFFF66,线宽为1 顶部赋值:100,COLORFFFF33 V1赋值:10日内最低价的最低值 V2赋值:25日内最高价的最高值 价位线赋值:(收盘价-V1)/(V2-V1)*4的4日指数移动平均 当满足条件价位线上穿0.3时,在20+4位置书写文字,画红色 当满足条件3.5上穿价位线时,在趋势位置书写文字,画白色 ABC2Q赋值:1日前的最低价 ABC3Q赋值:最低价-ABC2Q的绝对值的3日[1日权重]移动平均/最低价-ABC2Q和0的较大值的3日[1日权重]移动平均*100 ABC4Q赋值:如果收盘价*1.3,返回ABC3Q*10,否则返回ABC3Q/10的3日指数移动平均 ABC5Q赋值:30日内最低价的最低值 ABC6Q赋值:30日内ABC4Q的最高值 ABC7Q赋值:如果收盘价的58日简单移动平均,返回1,否则返回0 ABC8Q赋值:如果最低价<=ABC5Q,返回(ABC4Q+ABC6Q*2)/2,否则返回0的3日指数移动平均/618*ABC7Q ABC9Q赋值:如果ABC8Q>100,返回100,否则返回ABC8Q ACB3赋值:(21日内最高价的最高值-收盘价)/(21日内最高价的最高值-21日内最低价的最低值)*100-10 ACB4赋值:(收盘价-21日内最低价的最低值)/(21日内最高价的最高值-21日内最低价的最低值)*100 ACB5赋值:ACB4的13日[8日权重]移动平均 走势赋值:ACB5的13日[8日权重]移动平均的向上舍入 ACB6赋值:ACB3的21日[8日权重]移动平均 卖临界赋值:当满足条件走势-ACB6>85时,在103和100位置之间画柱状线,宽度为15,1不为0则画空心柱.,画红色,线宽为2 主力线赋值:3*(收盘价-27日内最低价的最低值)/(27日内最高价的最高值-27日内最低价的最低值)*100的5日[1日权重]移动平均-2*(收盘价-27日内最低价的最低值)/(27日内最高价的最高值-27日内最低价的最低值)*100的5日[1日权重]移动平均的3日[1日权重]移动平均,线宽为2,画蓝色 超短线赋值:(((主力线-21日内主力线的最低值)/(21日内主力线的最高值-21日内主力线的最低值))*(4))*(25),线宽为2,画蓝色 ABC11赋值:1日前的(最低价+开盘价+收盘价+最高价)/4 ABC21赋值:最低价-ABC11的绝对值的13日[1日权重]移动平均/最低价-ABC11和0的较大值的10日[1日权重]移动平均 ABC31赋值:ABC21的10日指数移动平均 ABC41赋值:33日内最低价的最低值 ABC51赋值:如果最低价<=ABC41,返回ABC31,否则返回0的3日指数移动平均 输出主力吸筹:如果ABC51>1日前的ABC51,返回ABC51,否则返回0,画红色,NODRAW 当满足条件ABC51>1日前的ABC51时,在0和ABC51位置之间画柱状线,宽度为3,0不为0则画空心柱.,COLOR000055 当满足条件ABC51>1日前的ABC51时,在0和ABC51位置之间画柱状线,宽度为2.6,0不为0则画空心柱.,COLOR000077 当满足条件ABC51>1日前的ABC51时,在0和ABC51位置之间画柱状线,宽度为2.1,0不为0则画空心柱.,COLOR000099 当满足条件ABC51>1日前的ABC51时,在0和ABC51位置之间画柱状线,宽度为1.5,0不为0则画空心柱.,COLOR0000BB 当满足条件ABC51>1日前的ABC51时,在0和ABC51位置之间画柱状线,宽度为0.9,0不为0则画空心柱.,COLOR0000DD 当满足条件ABC51>1日前的ABC51时,在0和ABC51位置之间画柱状线,宽度为0.3,0不为0则画空心柱.,COLOR0000FF ABC12赋值:3 ABC28赋值:(3)*(((收盘价-27日内最低价的最低值)/(27日内最高价的最高值-27日内最低价的最低值))*(100)的5日[1日权重]移动平均) - (2)*(((收盘价-27日内最低价的最低值)/(27日内最高价的最高值-27日内最低价的最低值))*(100)的5日[1日权重]移动平均的3日[1日权重]移动平均) 动态底部赋值:如果最低价<=30日内最低价的最低值,返回最低价-1日前的最低价的绝对值的30日[1日权重]移动平均/最低价-1日前的最低价和0的较大值的99日[1日权重]移动平均,否则返回0*5的3日指数移动平均 准备买入赋值:收盘价上穿(收盘价,N,1)*1.02 输出低点:如果动态底部AND准备买入,返回50,否则返回0,画白色,线宽为3 RSV11赋值:(收盘价-19日内最低价的最低值)/(19日内最高价的最高值-19日内最低价的最低值)*100 K赋值:RSV11的3日[1日权重]移动平均 D赋值:K的3日[1日权重]移动平均 J赋值:3*K-2*D 短线赋值:J的6日指数移动平均,画红色 浮筹赋值:短线的28日简单移动平均*1,线宽为2,画绿色 空方赋值:100*(35日内最高价的最高值-收盘价)/(35日内最高价的最高值-35日内最低价的最低值)的3日简单移动平均,画黄色 当满足条件短线上穿浮筹AND短线<36时,在20+4位置画9号图标,画蓝色, 线宽为1 当满足条件浮筹上穿空方时,在浮筹位置书写文字,画白色 """ df=self.df CLOSE=df['close'] C=df['close'] LOW=df['low'] L=df['low'] low=df['low'] HIGH=df['high'] H=df['high'] OPEN=df['open'] O=df['open'] volume=df['volume'] V=df['volume'] N=30 M=13 LC=REF(CLOSE,1) RSI1=SMA(MAX(CLOSE-LC,0),13,1)/SMA(ABS(CLOSE-LC),13,1)*100 RSIF=90-RSI1#,COLOR33DD33; A4=((C-LLV(L,33))/(HHV(H,33)-LLV(L,33)))*67 ABC1=(HHV(HIGH,9)-CLOSE)/(HHV(HIGH,9)-LLV(LOW,9))*100-70 ABC2=SMA(ABC1,9,1)+100 ABC3=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100 ABC4=SMA(ABC3,3,1) ABC5=SMA(ABC4,3,1)+100 ABC6=ABC5-ABC2 趋势=IF(ABC6>45,ABC6-45,0) ''' STICKLINE(REF(趋势,1)< 趋势, 趋势,REF(趋势,1),2,0),COLORMAGENTA; STICKLINE(REF(趋势,1)> 趋势, 趋势,REF(趋势,1),2,0),COLORGREEN; ''' df['趋势']=IF(REF(趋势,1),"洋红色","绿色") 强弱分界=50,#COLORFFFFCC; 底部=0,#COLOR00FFFF; 安全=20#COLORFFFF66,LINETHICK1; 预警=80#COLORFFFF66,LINETHICK1; 顶部=100#,COLORFFFF33; V1=LLV(LOW,10) V2=HHV(H,25) 价位线=EMA((C-V1)/(V2-V1)*4,4) #DRAWTEXT(CROSS(价位线,0.3),20+4,'●买'),COLORRED; df['买']=IF(CROSS(价位线,0.3),"买",None) #DRAWTEXT(CROSS(3.5,价位线),趋势,'●卖'),COLORWHITE; df['卖']=IF(CROSS(3.5,价位线),"卖",None) ABC2Q=REF(LOW,1) ABC3Q=SMA(ABS(LOW-ABC2Q),3,1)/SMA(MAX(LOW-ABC2Q,0),3,1)*100 ABC4Q=EMA(IF(CLOSE*1.3,ABC3Q*10,ABC3Q/10),3) ABC5Q=LLV(LOW,30) ABC6Q=HHV(ABC4Q,30) ABC7Q=IF(MA(CLOSE,58),1,0) ABC8Q=EMA(IF(LOW<=ABC5Q,(ABC4Q+ABC6Q*2)/2,0),3)/618*ABC7Q ABC9Q=IF(ABC8Q>100,100,ABC8Q) ACB3=(HHV(HIGH,21)-CLOSE)/(HHV(HIGH,21)-LLV(LOW,21))*100-10 ACB4=(CLOSE-LLV(LOW,21))/(HHV(HIGH,21)-LLV(LOW,21))*100 ACB5=SMA(ACB4,13,8) 走势=SMA(ACB5,13,8) ACB6=SMA(ACB3,21,8) df['卖临界']=IF(走势-ACB6>85,'红色柱状',None) 主力线=3*SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1)-2*SMA(SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1),3,1) 超短线=(((主力线-LLV(主力线,21))/(HHV(主力线,21)-LLV(主力线,21)))*(4))*(25) ABC11=REF((LOW+OPEN+CLOSE+HIGH)/4,1) ABC21=SMA(ABS(LOW-ABC11),13,1)/SMA(MAX(LOW-ABC11,0),10,1) ABC31=EMA(ABC21,10) ABC41=LLV(LOW,33) ABC51=EMA(IF(LOW<=ABC41,ABC31,0),3) df['主力吸筹']=IF(ABC51>REF(ABC51,1),ABC51,0) ''' STICKLINE(ABC51>REF(ABC51,1),0,ABC51,3,0 ),COLOR000055; STICKLINE(ABC51>REF(ABC51,1),0,ABC51,2.6,0 ),COLOR000077; STICKLINE(ABC51>REF(ABC51,1),0,ABC51,2.1,0 ),COLOR000099; STICKLINE(ABC51>REF(ABC51,1),0,ABC51,1.5,0 ),COLOR0000BB; STICKLINE(ABC51>REF(ABC51,1),0,ABC51,0.9,0 ),COLOR0000DD; STICKLINE(ABC51>REF(ABC51,1),0,ABC51,0.3,0 ),COLOR0000FF; ''' ABC12=3 ABC28=(3)*(SMA(((CLOSE - LLV(LOW,27))/(HHV(HIGH,27) - LLV(LOW,27)))*(100),5,1)) - (2)*(SMA(SMA(((CLOSE - LLV(LOW,27))/(HHV(HIGH,27) - LLV(LOW,27)))*(100),5,1),3,1)) 动态底部=EMA(IF(L<= LLV(L,30),SMA(ABS(L-REF(L,1)),30,1)/SMA(MAX(L-REF(L,1),0),99,1),0)*5,3) 准备买入=CROSS(C,CLOSE*1.02) df['低点']=IF(AND(动态底部, 准备买入[1:]),50,0) RSV11=(CLOSE-LLV(LOW,19))/(HHV(HIGH,19)-LLV(LOW,19))*100 K=SMA(RSV11,3,1) D=SMA(K,3,1) J=3*K-2*D 短线=EMA(J,6) 浮筹=MA(短线,28)*1 空方=MA(100*(HHV(HIGH,35)-CLOSE)/(HHV(HIGH,35)-LLV(LOW,35)),3) #DRAWICON(CROSS(短线,浮筹) AND 短线<36,20+4,9),COLORBLUE, LINETHICK1; #DRAWTEXT(CROSS(浮筹,空方),浮筹,' 追') df['追']=IF(CROSS(浮筹,空方),"追",None) return df if __name__=='__main__': data=unification_data(trader_tool='ths') data=data.get_unification_data() df=data.get_hist_data_em(stock='513100') modes=main_approach_to_capture_the_dark_horse_deputy_map(df=df) result=modes.main_approach_to_capture_the_dark_horse_deputy_map() print(result) result.to_excel(r'数据.xlsx') ``` ### 例子10 九指共振 ``` from xg_tdx_func.xg_tdx_func import * from trader_tool.unification_data import unification_data class nine_finger_resonance: def __init__(self,df) : ''' 九指共振 ''' self.df=df def nine_finger_resonance(self): ''' 输出DD11:0.95,COLORFF33FF 输出DD22:2,画绿色 日K赋值:"KDJ的K"(9,3,3) 日D赋值:"KDJ的D"(9,3,3) 当满足条件日K>日D时,在1位置画1号图标 当满足条件日K<日D时,在1位置画2号图标 当满足条件是否最后一个周期=1时,在1位置书写文字,COLORFFFFFF 日DIF赋值:"平滑异同平均线的DIF"(12,26,9) 日DEA赋值:"平滑异同平均线的DEA"(12,26,9) 当满足条件日DIF>日DEA时,在1.1位置画1号图标 当满足条件日DIF<日DEA时,在1.1位置画2号图标 当满足条件是否最后一个周期=1时,在1.1位置书写文字,COLORFFFFFF 日RSI赋值:"RSI的RSI1"(9) 当满足条件日RSI>50时,在1.2位置画1号图标 当满足条件日RSI<50时,在1.2位置画2号图标 当满足条件是否最后一个周期=1时,在1.2位置书写文字,COLORFFFFFF 周K赋值:"KDJ的K"(9,3,3) 周D赋值:"KDJ的D"(9,3,3) 当满足条件周K>周D时,在1.3位置画1号图标 当满足条件周K<周D时,在1.3位置画2号图标 当满足条件是否最后一个周期=1时,在1.3位置书写文字,COLORFFFFFF 周DIF赋值:"平滑异同平均线的DIF"(12,26,9) 周DEA赋值:"平滑异同平均线的DEA"(12,26,9) 当满足条件周DIF>周DEA时,在1.4位置画1号图标 当满足条件周DIF<周DEA时,在1.4位置画2号图标 当满足条件是否最后一个周期=1时,在1.4位置书写文字,COLORFFFFFF 周RSI赋值:"RSI的RSI1"(9) 当满足条件周RSI>50时,在1.5位置画1号图标 当满足条件周RSI<50时,在1.5位置画2号图标 当满足条件是否最后一个周期=1时,在1.5位置书写文字,COLORFFFFFF 月K赋值:"KDJ的K"(9,3,3) 月D赋值:"KDJ的D"(9,3,3) 当满足条件月K>月D时,在1.6位置画1号图标 当满足条件月K<月D时,在1.6位置画2号图标 当满足条件是否最后一个周期=1时,在1.6位置书写文字,COLORFFFFFF 月DIF赋值:"平滑异同平均线的DIF"(12,26,9) 月DEA赋值:"平滑异同平均线的DEA"(12,26,9) 当满足条件月DIF>月DEA时,在1.7位置画1号图标 当满足条件月DIF<月DEA时,在1.7位置画2号图标 当满足条件是否最后一个周期=1时,在1.7位置书写文字,COLORFFFFFF 月RSI赋值:"RSI的RSI1"(9) 当满足条件月RSI>50时,在1.8位置画1号图标 当满足条件月RSI<50时,在1.8位置画2号图标 当满足条件是否最后一个周期=1时,在1.8位置书写文字,COLORFFFFFF ABC1赋值:日K>日D ABC2赋值:日DIF>日DEA ABC3赋值:日RSI>50 ABC4赋值:周K>周D ABC5赋值:周DIF>周DEA ABC6赋值:周RSI>50 ABC7赋值:月K>月D ABC8赋值:月DIF>月DEA ABC9赋值:月RSI>50 尊重市场赋值:ABC1 AND ABC2 AND ABC3 AND ABC4 AND ABC5 AND ABC6 AND ABC7 AND ABC8 AND ABC9 共振赋值:条件连续成立次数=1 当满足条件共振时,在0.95和1.85位置之间画柱状线,宽度为2,0不为0则画空心柱.,画洋红色 当满足条件共振时,在1.9位置画9号图标 当满足条件共振时,在1.90位置书写文字,画红色 ''' df=self.df df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) weekly_data = df.resample('W').agg({ 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last' }) weekly_data.dropna(inplace=True) monthly_data=df.resample('M').agg({ 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last' }) amount=0 DD11=0.95 DD22=2 日K = KDJ(CLOSE=df['close'],HIGH=df['high'],LOW=df['low'])[0].tolist()[-1] #"KDJ.K"(9,3,3) 日D= KDJ(CLOSE=df['close'],HIGH=df['high'],LOW=df['low'])[1].tolist()[-1]#"KDJ.D"(9,3,3); '''' DRAWICON(日K>日D,1,1); DRAWICON(日K<日D,1,2); ''' #DRAWTEXT(ISLASTBAR=1,1,'日K'),COLORFFFFFF; 日DIF=MACD(CLOSE=df['close'])[0].tolist()[-1] #"MACD.DIF"(12,26,9); 日DEA=MACD(CLOSE=df['close'])[1].tolist()[-1] #"MACD.DEA"(12,26,9); ''' DRAWICON(日DIF>日DEA,1.1,1); DRAWICON(日DIF<日DEA,1.1,2); DRAWTEXT(ISLASTBAR=1,1.1,'日M'),COLORFFFFFF; ''' 日RSI = RSI(CLOSE=df['close'],N1=9)[0].tolist()[-1]#"RSI.RSI1"(9) ''' DRAWICON(日RSI>50,1.2,1); DRAWICON(日RSI<50,1.2,2); DRAWTEXT(ISLASTBAR=1,1.2,'日R'),COLORFFFFFF; ''' 周K = KDJ(CLOSE=weekly_data['close'],HIGH=weekly_data['high'],LOW=weekly_data['low'])[0].tolist()[-1]#"KDJ.K"(9,3,3); 周D= KDJ(CLOSE=weekly_data['close'],HIGH=weekly_data['high'],LOW=weekly_data['low'])[1].tolist()[-1]#"KDJ.D"(9,3,3); ''' DRAWICON(周K>周D,1.3,1); DRAWICON(周K<周D,1.3,2); DRAWTEXT(ISLASTBAR=1,1.3,'周K'),COLORFFFFFF; ''' 周DIF=MACD(CLOSE=weekly_data['close'])[0].tolist()[-1] #"MACD.DIF"(12,26,9); 周DEA=MACD(CLOSE=weekly_data['close'])[1].tolist()[-1]#"MACD.DEA"(12,26,9); ''' DRAWICON(周DIF>周DEA,1.4,1); DRAWICON(周DIF<周DEA,1.4,2); DRAWTEXT(ISLASTBAR=1,1.4,'周M'),COLORFFFFFF; ''' 周RSI=RSI(CLOSE=weekly_data['close'])[0].tolist()[-1]#"RSI.RSI1"(9); ''' DRAWICON(周RSI>50,1.5,1); DRAWICON(周RSI<50,1.5,2); DRAWTEXT(ISLASTBAR=1,1.5,'周R'),COLORFFFFFF; ''' 月K=KDJ(CLOSE=monthly_data['close'],HIGH=monthly_data['high'],LOW=monthly_data['low'])[0].tolist()[-1]#"KDJ.K"(9,3,3); 月D= KDJ(CLOSE=monthly_data['close'],HIGH=monthly_data['high'],LOW=monthly_data['low'])[1].tolist()[-1]# "KDJ.D"(9,3,3); ''' DRAWICON(月K>月D,1.6,1); DRAWICON(月K<月D,1.6,2); DRAWTEXT(ISLASTBAR=1,1.6,'月K'),COLORFFFFFF; ''' 月DIF=MACD(CLOSE=monthly_data['close'])[0].tolist()[-1]#"MACD.DIF"(12,26,9); 月DEA=MACD(CLOSE=monthly_data['close'])[1].tolist()[-1]#"MACD.DEA"(12,26,9); ''' DRAWICON(月DIF>月DEA,1.7,1); DRAWICON(月DIF<月DEA,1.7,2); DRAWTEXT(ISLASTBAR=1,1.7,'月M'),COLORFFFFFF; ''' 月RSI=RSI(CLOSE=monthly_data['close'])[0].tolist()[-1] #"RSI.RSI1"(9); ''' DRAWICON(月RSI>50,1.8,1); DRAWICON(月RSI<50,1.8,2); DRAWTEXT(ISLASTBAR=1,1.8,'月R'),COLORFFFFFF; ''' ABC1=日K>日D amount+=IF(ABC1,1,0) ABC2=日DIF>日DEA amount+=IF(ABC2,1,0) ABC3=日RSI>50 amount+=IF(ABC3,1,0) ABC4=周K>周D amount+=IF(ABC4,1,0) ABC5=周DIF>周DEA amount+=IF(ABC5,1,0) ABC6=周RSI>50 amount+=IF(ABC6,1,0) ABC7=月K>月D amount+=IF(ABC7,1,0) ABC8=月DIF>月DEA amount+=IF(ABC8,1,0) ABC9=月RSI>50 amount+=IF(ABC9,1,0) 尊重市场=AND(AND(AND(AND(AND(AND(AND(AND(ABC1,ABC2),ABC3) ,ABC4),ABC5) ,ABC6),ABC7) ,ABC8) ,ABC9) ''' STICKLINE(共振,0.95,1.85,2,0),COLORMAGENTA; DRAWICON(共振,1.9,9); DRAWTEXT(共振,1.90,'★共振'),COLORRED; ''' return amount if __name__=='__main__': data=unification_data(trader_tool='ths') data=data.get_unification_data() df=data.get_hist_data_em(stock='159920') print(df) modes=nine_finger_resonance(df=df) result=modes.nine_finger_resonance() print(result) ``` ### 例子11六脉神剑 ``` from xg_tdx_func.xg_tdx_func import * from trader_tool.unification_data import unification_data class six_pulse_excalibur_hist: def __init__(self,df): ''' 六脉神剑 ''' self.df=df def six_pulse_excalibur_hist(self): ''' 六脉神剑 DIFF赋值:收盘价的8日指数移动平均-收盘价的13日指数移动平均 DEA赋值:DIFF的5日指数移动平均 当满足条件DIFF>DEA时,在1位置画1号图标 当满足条件DIFFDEA 尊重市场1赋值:(收盘价-8日内最低价的最低值)/(8日内最高价的最高值-8日内最低价的最低值)*100 K赋值:尊重市场1的3日[1日权重]移动平均 D赋值:K的3日[1日权重]移动平均 当满足条件K>D时,在2位置画1号图标 当满足条件KD 指标营地赋值:1日前的收盘价 RSI1赋值:(收盘价-指标营地和0的较大值的5日[1日权重]移动平均)/(收盘价-指标营地的绝对值的5日[1日权重]移动平均)*100 RSI2赋值:(收盘价-指标营地和0的较大值的13日[1日权重]移动平均)/(收盘价-指标营地的绝对值的13日[1日权重]移动平均)*100 当满足条件RSI1>RSI2时,在3位置画1号图标 当满足条件RSI1RSI2 尊重市场赋值:-(13日内最高价的最高值-收盘价)/(13日内最高价的最高值-13日内最低价的最低值)*100 LWR1赋值:尊重市场的3日[1日权重]移动平均 LWR2赋值:LWR1的3日[1日权重]移动平均 当满足条件LWR1>LWR2时,在4位置画1号图标 当满足条件LWR1LWR2 BBI赋值:(收盘价的3日简单移动平均+收盘价的5日简单移动平均+收盘价的8日简单移动平均+收盘价的13日简单移动平均)/4 当满足条件收盘价>BBI时,在5位置画1号图标 当满足条件收盘价BBI MTM赋值:收盘价-1日前的收盘价 MMS赋值:100*MTM的5日指数移动平均的3日指数移动平均/MTM的绝对值的5日指数移动平均的3日指数移动平均 MMM赋值:100*MTM的13日指数移动平均的8日指数移动平均/MTM的绝对值的13日指数移动平均的8日指数移动平均 当满足条件MMS>MMM时,在6位置画1号图标 当满足条件MMSMMM 输出买入:如果ABC1ANDABC2ANDABC3ANDABC4ANDABC5ANDABC6=1ANDREF(ABC1ANDABC2ANDABC3ANDABC4ANDABC5ANDABC6,1)=0,返回6,否则返回0,画黄色,线宽为2 输出持有:如果ABC1ANDABC2ANDABC3ANDABC4ANDABC5ANDABC6,返回6,否则返回0,画洋红色,线宽为2 共振赋值:ABC1 AND ABC2 AND ABC3 AND ABC4 AND ABC5 AND ABC6 当满足条件共振时,在0和6位置之间画柱状线,宽度为0.6,1不为0则画空心柱.,画洋红色 当满足条件买入时,在0和6位置之间画柱状线,宽度为0.6,0不为0则画空心柱.,画黄色 当满足条件DIFF>DEA时,在1位置画1号图标 当满足条件DIFFD时,在2位置画1号图标 当满足条件KRSI2时,在3位置画1号图标 当满足条件RSI1LWR2时,在4位置画1号图标 当满足条件LWR1BBI时,在5位置画1号图标 当满足条件收盘价MMM时,在6位置画1号图标 当满足条件MMSDEA 在1的位置标记1的图标 #DRAWICON(DIFF>DEA,1,1); markers+=IF(DIFF>DEA,1,0) #如果满足DIFFDEA signal+=IF(ABC1,1,0) 尊重市场1=(CLOSE-LLV(LOW,8))/(HHV(HIGH,8)-LLV(LOW,8))*100 K=SMA(尊重市场1,3,1) D=SMA(K,3,1) #如果满足k>d 在2的位置标记1的图标 markers+=IF(K>D,1,0) #DRAWICON(K>D,2,1); markers+=IF(KD signal+=IF(ABC2,1,0) 指标营地=REF(CLOSE,1) RSI1=(SMA(MAX(CLOSE-指标营地,0),5,1))/(SMA(ABS(CLOSE-指标营地),5,1))*100 RSI2=(SMA(MAX(CLOSE-指标营地,0),13,1))/(SMA(ABS(CLOSE-指标营地),13,1))*100 markers+=IF(RSI1>RSI2,1,0) #DRAWICON(RSI1>RSI2,3,1); markers+=IF(RSI1RSI2 signal+=IF(ABC3,1,0) 尊重市场=-(HHV(HIGH,13)-CLOSE)/(HHV(HIGH,13)-LLV(LOW,13))*100 LWR1=SMA(尊重市场,3,1) LWR2=SMA(LWR1,3,1) #DRAWICON(LWR1>LWR2,4,1); markers+=IF(LWR1>LWR2,1,0) #DRAWICON(LWR1LWR2 signal+=IF(ABC4,1,0) BBI=(MA(CLOSE,3)+MA(CLOSE,5)+MA(CLOSE,8)+MA(CLOSE,13))/4 #DRAWICON(CLOSE>BBI,5,1); markers+=IF(CLOSE>BBI,1,0) #DRAWICON(CLOSEBBI signal+=IF(ABC5,1,0) MTM=CLOSE-REF(CLOSE,1) MMS=100*EMA(EMA(MTM,5),3)/EMA(EMA(ABS(MTM),5),3) MMM=100*EMA(EMA(MTM,13),8)/EMA(EMA(ABS(MTM),13),8) markers+=IF(MMS>MMM,1,0) #DRAWICON(MMS>MMM,6,1); markers+=IF(MMSMMM signal+=IF(ABC6,1,0) ''' 买入:IF(ABC1 AND ABC2 AND ABC3 AND ABC4 AND ABC5 AND ABC6=1 AND REF(ABC1 AND ABC2 AND ABC3 AND ABC4 AND ABC5 AND ABC6,1)=0,6,0),COLORYELLOW,LINETHICK2; 持有:IF(ABC1 AND ABC2 AND ABC3 AND ABC4 AND ABC5 AND ABC6,6,0),COLORMAGENTA,LINETHICK2; 共振:=ABC1 AND ABC2 AND ABC3 AND ABC4 AND ABC5 AND ABC6 ; STICKLINE(共振,0,6,0.6,1),COLORMAGENTA; STICKLINE(买入,0,6,0.6,0),COLORYELLOW; DRAWICON(DIFF>DEA,1,1); DRAWICON(DIFFD,2,1); DRAWICON(KRSI2,3,1); DRAWICON(RSI1LWR2,4,1); DRAWICON(LWR1BBI,5,1); DRAWICON(CLOSEMMM,6,1);{微信公众号:尊重市场} DRAWICON(MMS=MA3,返回1,否则返回-1 A2赋值:如果收盘价>=MA5,返回1,否则返回-1 A3赋值:如果收盘价>=MA10,返回1,否则返回-1 A4赋值:如果MA3>=1日前的MA3,返回1,否则返回-1 A5赋值:如果MA5>=1日前的MA5,返回1,否则返回-1 A6赋值:如果MA10>=1日前的MA10,返回1,否则返回-1 QUSHIX赋值:(A1+A2+A3+A4+A5+A6)/6*100,画青色,线宽为3 X1赋值:(收盘价+最低价+最高价)/3 X2赋值:X1的3日指数移动平均 X3赋值:X2的5日指数移动平均 当满足条件X2上穿X3时,在最低价*0.98位置书写文字 当满足条件X3上穿X2时,在最高价*1.02位置书写文字 当满足条件X2>=X3时,在最低价和最高价位置之间画柱状线,宽度为0,0不为0则画空心柱.,画红色 当满足条件X2=100ANDMA3>1日前的MA3AND(收盘价-开盘价)/开盘价*100>5ANDCLOSE>MA3时,在最低价*0.99位置书写文字,画洋红色 ''' df=self.df CLOSE=df['close'] C=df['close'] LOW=df['low'] L=df['low'] HIGH=df['high'] H=df['high'] OPEN=df['open'] O=df['open'] volume=df['volume'] V=df['volume'] MA3=MA(C,3) MA5=MA(C,5) MA10=MA(C,10) MA15=MA(C,15) MA20=MA(C,20) MA30=MA(C,30) A1=IF(C>=MA3,1,-1) A2=IF(C>=MA5,1,-1) A3=IF(C>=MA10,1,-1) A4=IF(MA3>=REF(MA3,1),1,-1) A5=IF(MA5>=REF(MA5,1),1,-1) A6=IF(MA10>=REF(MA10,1),1,-1) QUSHIX=(A1+A2+A3+A4+A5+A6)/6*100 X1=(C+L+H)/3 X2=EMA(X1,3) X3=EMA(X2,5) #DRAWTEXT(CROSS(X2,X3),L*0.98,'B'); df['B']=CROSS(X2,X3) #DRAWTEXT(CROSS(X3,X2),H*1.02,'S'); df['S']=CROSS(X3,X2) #STICKLINE(X2>=X3,LOW,HIGH,0,0),COLORRED; #STICKLINE(X2>=X3,CLOSE,OPEN,3,1),COLORRED; df['红色']=X2>=X3 #STICKLINE(X2=100 AND MA3>REF(MA3,1) AND (CLOSE-OPEN)/OPEN*100>5 AND CLOSE>MA3,L*0.99,'★'),COLORMAGENTA df['星']=AND(AND(AND(QUSHIX>=100,MA3>REF(MA3,1)),(CLOSE-OPEN)/OPEN*100>5),CLOSE>MA3) return df if __name__=='__main__': data=unification_data(trader_tool='ths') data=data.get_unification_data() df=data.get_hist_data_em(stock='513100') modes=small_fruit_band_gold_mining(df=df) result=modes.small_fruit_band_gold_mining() print(result) result.to_excel(r'数据.xlsx') ``` ### 例子13【顺势黑马】套装指标简介 ``` from xg_tdx_func.xg_tdx_func import * import pandas as pd class take_advantage_of_the_trend: def __init__(self,df) : self.df=df def take_advantage_of_the_trend(self): ''' 【顺势黑马】套装指标简介: 这是一个依托EXPMA基础上添加五线通道,并实时显示五线通道的价格,来判断K线所在位置的参考。 1、“黄金金叉“显示阳线为黄,红色做多线持有; 2、“死叉阴线”为蓝;绿线做空线休息; 3、出信号放量突破时,均线多头排列可取,空排不取。 ABC7:=EMA(C,7),COLORYELLOW,LINETHICK2; ABC14:=EMA(C,14),COLOR7FF00F,LINETHICK1 DOTLINE; ABC25:=EMA(C,25),COLORFF7F00,LINETHICK1 DOTLINE; ABCMA45:=EMA(C,45),COLORF00FFF,LINETHICK1 DOTLINE; MA5:=MA(C,5);{微信公众号:尊重市场} MA10:=MA(C,10); MA20:=MA(C,20); ABC:=ABC7>ABC14; STICKLINE(C/REF(C,1)>1.095,C,O,2,0),COLORYELLOW; DRAWTEXT(C/REF(C,1)>1.095,L*0.96,' ★强'),COLORLIRED; STICKLINE(HIGHREF(HIGH,0) ,LOW,REF(HIGH,0),10,0); STICKLINE(C=O,H,L,0,0); STICKLINE((C=O)AND(C>REF(C,0)),C,O,8,0); STICKLINE((C=O)AND(C=REF(上轨,1),上轨,DRAWNULL),DOTLINE,COLORGREEN,LINETHICK1; 上轨红:IF(上轨>=REF(上轨,1),上轨,DRAWNULL),DOTLINE COLORRED,LINETHICK1; 中轨绿:IF(中轨>=REF(中轨,1), 中轨,DRAWNULL),DOTLINE,COLORGREEN,LINETHICK1; 中轨红:IF(中轨>=REF(中轨,1), 中轨,DRAWNULL),DOTLINE COLORRED, LINETHICK1; 下轨绿:IF(下轨>=REF(下轨,1), 下轨,DRAWNULL),DOTLINE,COLORGREEN,LINETHICK1; 下轨红:IF(下轨>=REF(下轨,1), 下轨,DRAWNULL),DOTLINE COLORRED,LINETHICK1; IF(ABC7>REF(ABC7,1),ABC7,DRAWNULL),COLORRED,LINETHICK2; IF(ABC7ABC14 #当满足条件收盘价/1日前的收盘价>1.095时,在收盘价和开盘价位置之间画柱状线,宽度为2,0不为0则画空心柱.,画黄色 #STICKLINE(C/REF(C,1)>1.095,C,O,2,0),COLORYELLOW; #当满足条件收盘价/1日前的收盘价>1.095时,在最低价*0.96位置书写文字,画淡红色 data['强']=C/REF(C,1)>1.09 #DRAWTEXT(C/REF(C,1)>1.095,L*0.96,' ★强'),COLORLIRED; #当满足条件最高价<0日前的最低价时,在最高价和0日前的最低价位置之间画柱状线,宽度为10,0不为0则画空心柱. #STICKLINE(HIGHREF(HIGH,0) ,LOW,REF(HIGH,0),10,0); '''' STICKLINE(C=O,H,L,0,0); STICKLINE((C=O)AND(C>REF(C,0)),C,O,8,0); STICKLINE((C=O)AND(C=REF(上轨,1),上轨,DRAWNULL),DOTLINE,COLORGREEN,LINETHICK1; 上轨红:IF(上轨>=REF(上轨,1),上轨,DRAWNULL),DOTLINE COLORRED,LINETHICK1; 中轨绿:IF(中轨>=REF(中轨,1), 中轨,DRAWNULL),DOTLINE,COLORGREEN,LINETHICK1; 中轨红:IF(中轨>=REF(中轨,1), 中轨,DRAWNULL),DOTLINE COLORRED, LINETHICK1; 下轨绿:IF(下轨>=REF(下轨,1), 下轨,DRAWNULL),DOTLINE,COLORGREEN,LINETHICK1; 下轨红:IF(下轨>=REF(下轨,1), 下轨,DRAWNULL),DOTLINE COLORRED,LINETHICK1; ''' data['红色']=IF(ABC7>REF(ABC7,1),ABC7,None) data['绿色']=IF(ABC70 else pd.Series(S).cumsum().values ``` ### 10CONST 返回序列S最后的值组成常量序列 ``` def CONST(S): ''' 返回序列S最后的值组成常量序列 ''' return np.full(len(S),S[-1]) ``` ### 11AND and函数 ``` def AND(S1,S2): #and return np.logical_and(S1,S2) ``` ### 12 OR or选择函数 ``` def OR(S1,S2): #or return np.logical_or(S1,S2) ``` ### 13 NOT not函数 ``` def NOT(S1,S2): ''' not ''' return np.logical_not(S1,S2) ``` ### 14 RANGE 期间函数 B<=A<=C ``` def RANGE(A,B,C): ''' 期间函数 B<=A<=C ''' df=pd.DataFrame() df['select']=A.tolist() df['select']=df['select'].apply(lambda x: True if (x>=B and x<=C) else False) return df['select'] ``` ### 15 HHV HHV(C, 5) 最近5天收盘最高价 ``` def HHV(S,N): ''' HHV(C, 5) 最近5天收盘最高价 ''' return pd.Series(S).rolling(N).max().values ``` ### 16LLV LLV(C, 5) 最近5天收盘最低价 ``` def LLV(S,N): ''' LLV(C, 5) 最近5天收盘最低价 ''' return pd.Series(S).rolling(N).min().values ``` ### 17HHVBARS 求N周期内S最高值到当前周期数, 返回序列 ``` def HHVBARS(S,N): ''' 求N周期内S最高值到当前周期数, 返回序列 ''' return pd.Series(S).rolling(N).apply(lambda x: np.argmax(x[::-1]),raw=True).values ``` ### 18LLVBARS 求N周期内S最低值到当前周期数, 返回序列 ``` def LLVBARS(S,N): ''' 求N周期内S最低值到当前周期数, 返回序列 ''' return pd.Series(S).rolling(N).apply(lambda x: np.argmin(x[::-1]),raw=True).values ``` ### 19MA 求序列的N日简单移动平均值,返回序 ``` def MA(S,N): ''' 求序列的N日简单移动平均值,返回序列 ''' return pd.Series(S).rolling(N).mean().values ``` ### 20EMA 指数移动平均,为了精度 S>4*N EMA至少需要120周期 alpha=2/(span+1) ``` def EMA(S,N): ''' 指数移动平均,为了精度 S>4*N EMA至少需要120周期 alpha=2/(span+1) ''' retur ``` ### 21 SMA SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) ``` def SMA(S, N, M=1): ''' SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) ''' return pd.Series(S).ewm(alpha=M/N,adjust=False).mean().values #com=N-M/M ``` ### 22DMA 求S的动态移动平均,A作平滑因子,必须 0B & A>0 & B>=0 ``` def LAST(S, A, B): ''' 从前A日到前B日一直满足S_BOOL条件, 要求A>B & A>0 & B>=0 ''' return np.array(pd.Series(S).rolling(A+1).apply(lambda x:np.all(x[::-1][B:]),raw=True),dtype=bool) ``` ### 28COUNT COUNT(CLOSE>O, N): 最近N天满足S_BOO的天数 True的天数 ``` def COUNT(S, N): ''' # COUNT(CLOSE>O, N): 最近N天满足S_BOO的天数 True的天数 ''' return SUM(S,N) ``` ### 29EVERY EVERY(CLOSE>O, 5) 最近N天是否都是True ``` def EVERY(S, N): ''' EVERY(CLOSE>O, 5) 最近N天是否都是True ''' return IF(SUM(S,N)==N,True,False) ``` ### 30EXIST EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点 ``` def EXIST(S, N): ''' EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点 ''' return IF(SUM(S,N)>0,True,False) ``` ### 31FILTER FILTER函数,S满足条件后,将其后N周期内的数据置为0, FILTER(C==H,5) ``` def FILTER(S, N): ''' FILTER函数,S满足条件后,将其后N周期内的数据置为0, FILTER(C==H,5) ''' for i in range(len(S)): S[i+1:i+1+N]=0 if S[i] else S[i+1:i+1+N] return S ``` ### 32BARSLAST 上一次条件成立到当前的周期, BARSLAST(C/REF(C,1)>=1.1) 上一次涨停到今天的天数 ``` def BARSLAST(S): ''' 上一次条件成立到当前的周期, BARSLAST(C/REF(C,1)>=1.1) 上一次涨停到今天的天数 ''' M=np.concatenate(([0],np.where(S,1,0))) for i in range(1, len(M)): M[i]=0 if M[i] else M[i-1]+1 return M[1:] ``` ### 33BARSLASTCOUNT 统计连续满足S条件的周期数 BARSLASTCOUNT(CLOSE>OPEN)表示统计连续收阳的周期数 ``` def BARSLASTCOUNT(S): ''' 统计连续满足S条件的周期数 ''' rt = np.zeros(len(S)+1) for i in range(len(S)): rt[i+1]=rt[i]+1 if S[i] else rt[i+1] return rt[1:] ``` ### 34 BARSSINCEN N周期内第一次S条件成立到现在的周期数,N为常量 ``` def BARSSINCEN(S, N): ''' ''' return pd.Series(S).rolling(N).apply(lambda x:N-1-np.argmax(x) if np.argmax(x) or x[0] else 0,raw=True).fillna(0).values.astype(int) ``` ### 35 CROSS 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ``` def CROSS(S1, S2): ''' 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ''' return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) ``` ### 36CROSS_UP 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ``` def CROSS_UP(S1, S2): ''' #判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ''' return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) ``` ### 37 CROSS_DOWN 判断向上死叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,5),MA(C,10)) ``` def CROSS_DOWN(S1, S2): ''' 判断向上死叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,5),MA(C,10)) ''' return np.concatenate(([False], np.logical_not((S1S2)),dtype=bool) # ``` ### 39 VALUEWHEN 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 ``` def VALUEWHEN(S, X): ''' 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 ''' return pd.Series(np.where(S,X,np.nan)).ffill().values ``` ### 40BACKSET 属于未来函数,将当前位置到若干周期前的数据设为1. 用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0 ``` def BACKSET(X, N): ''' 属于未来函数,将当前位置到若干周期前的数据设为1. 用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0 ''' # 创建一个与X相同形状的全零数组 result = np.zeros_like(X) # 遍历X的元素,根据条件设置result的值 for i in range(len(X)): if X[i] != 0: start_index = max(0, i - N + 1) result[start_index:i+1] = 1 return result ``` ### 41 ALIGNRIGHT 有效数据右对齐. 用法: ALIGNRIGHT(X)有效数据向右移动,左边空出来的周期填充无效值 例如:TC:=IF(CURRBARSCOUNT=2 || CURRBARSCOUNT=5,DRAWNULL,C);XC:ALIGNRIGHT(TC);删除了两天的收盘价,并将剩余数据右移 ``` def ALIGNRIGHT(X): ''' 有效数据右对齐. 用法: ALIGNRIGHT(X)有效数据向右移动,左边空出来的周期填充无效值 例如:TC:=IF(CURRBARSCOUNT=2 || CURRBARSCOUNT=5,DRAWNULL,C);XC:ALIGNRIGHT(TC);删除了两天的收盘价,并将剩余数据右移 ''' # 获取有效数据的索引 valid_indices = np.where(X != np.nan)[0] # 计算需要填充的无效数据的数量 invalid_count = len(X) - len(valid_indices) # 创建一个新的数组,将有效数据向右移动,左边填充无效值 result = np.empty_like(X) result[:] = np.nan result[invalid_count:len(valid_indices)+invalid_count] = X[valid_indices] return result ``` ### 42BARSCOUNT 有效数据周期数. 用法: BARSCOUNT(X)第一个有效数据到当前的间隔周期数 注意:判断范围为指标或条件选股计算时公式使用的数据, 如果给画线指标的数据少(比如没有按下箭头取更多K线)或给条件选股给的数据少,这个有效值也可能少 ``` def BARSCOUNT(X): ''' 有效数据周期数. 用法: BARSCOUNT(X)第一个有效数据到当前的间隔周期数 注意:判断范围为指标或条件选股计算时公式使用的数据, 如果给画线指标的数据少(比如没有按下箭头取更多K线)或给条件选股给的数据少,这个有效值也可能少 ''' # 获取有效数据的索引 valid_indices = np.where(~np.isnan(X))[0] # 如果数组中没有有效数据,返回0 if len(valid_indices) == 0: return 0 # 计算第一个有效数据到当前位置的间隔周期数 first_valid_index = valid_indices[0] current_index = len(X) - 1 bars_count = current_index - first_valid_index + 1 return bars_count ``` ### 43BARSLASTS 倒数第N次成立时距今的周期数. 用法: BARSLASTS(X,N):X倒数第N满足到现在的周期数,N支持变量 ``` def BARSLASTS(X, N): ''' 倒数第N次成立时距今的周期数. 用法: BARSLASTS(X,N):X倒数第N满足到现在的周期数,N支持变量 ''' # 获取有效数据的索引 valid_indices = np.where(~np.isnan(X))[0] # 如果数组中没有有效数据,返回-1 if len(valid_indices) == 0: return -1 # 计算倒数第N次满足条件到现在的周期数 last_n_indices = valid_indices[-N:] if len(last_n_indices) < N: return -1 current_index = len(X) - 1 bars_since_last_n = current_index - last_n_indices[-1] + 1 return bars_since_last_n ``` 44 zig ``` def cacal_zig_data(self,x=0.05): ''' 计算之字转向 x=5%之子转向 :return: ''' ZIG_STATE_START = 0 ZIG_STATE_RISE = 1 ZIG_STATE_FALL = 2 df=self.df # print(list(df["close"])) df = df[::-1] df = df.reset_index(drop=True) # df = df.iloc[-100:] x = x k = df["close"] d = df["date"] peer_i = 0 candidate_i = None scan_i = 0 peers = [0] z = np.zeros(len(k)) state = ZIG_STATE_START while True: scan_i += 1 if scan_i == len(k) - 1: # 扫描到尾部 if candidate_i is None: peer_i = scan_i peers.append(peer_i) else: if state == ZIG_STATE_RISE: if k[scan_i] >= k[candidate_i]: peer_i = scan_i peers.append(peer_i) else: peer_i = candidate_i peers.append(peer_i) peer_i = scan_i peers.append(peer_i) elif state == ZIG_STATE_FALL: if k[scan_i] <= k[candidate_i]: peer_i = scan_i peers.append(peer_i) else: peer_i = candidate_i peers.append(peer_i) peer_i = scan_i peers.append(peer_i) break if state == ZIG_STATE_START: if k[scan_i] >= k[peer_i] * (1 + x): candidate_i = scan_i state = ZIG_STATE_RISE elif k[scan_i] <= k[peer_i] * (1 - x): candidate_i = scan_i state = ZIG_STATE_FALL elif state == ZIG_STATE_RISE: if k[scan_i] >= k[candidate_i]: candidate_i = scan_i elif k[scan_i] <= k[candidate_i] * (1 - x): peer_i = candidate_i peers.append(peer_i) state = ZIG_STATE_FALL candidate_i = scan_i elif state == ZIG_STATE_FALL: if k[scan_i] <= k[candidate_i]: candidate_i = scan_i elif k[scan_i] >= k[candidate_i] * (1 + x): peer_i = candidate_i peers.append(peer_i) state = ZIG_STATE_RISE candidate_i = scan_i for i in range(len(peers) - 1): peer_start_i = peers[i] peer_end_i = peers[i + 1] start_value = k[peer_start_i] end_value = k[peer_end_i] a = (end_value - start_value) / (peer_end_i - peer_start_i) # 斜率 for j in range(peer_end_i - peer_start_i + 1): z[j + peer_start_i] = start_value + a * j df['结果']=z return df ``` ### 45WINNER 计算某价位的盈利盘比例 ``` def WINNER(HIGH:Iterable,LOW:Iterable,VOL:Iterable,Turnrate:Iterable,price,avg:Union[Iterable,str]='hlavg')->Optional[np.ndarray]: '''计算某价位的盈利盘比例 :HIGH-最高价[序列值] :LOW-最低价[序列值] :VOL-成交量[序列值],单位是手,万股等不重要,只要统一就行 :Turnrate[换手率]:取值范围0-1,注意50%的换手应写作0.5 *换手率由于流通股变动问题,故不能简单使用“成交量/流通股”的方式计算,这也是本函数保留输入换手率的原因 :price-某价格的盈利比例中的价格,可以是具体数值(如:99.98),也可以是序列(如收盘价、开盘价等) :avg-三角分部顶点:默认取每日最高价和最低价的平均值,某些算法中使用“成交额/成交量”的计算方法 *使用“成交额/成交量”的计算方法的话,注意这个平均位置也要复权,否则会出现平均位置出现在当日最高价和最低价之外的情况 返回一组获利比例的序列值,范围0-1,如0.1即当前股价的盈利比例为10% *此函数专用于T+1交易,不适用于可转债或者非日线周期等换手率超过100的情况 ''' return pyML.WINNER(HIGH,LOW,VOL,Turnrate,price,avg) ``` ### 46COST 计算某盈利比例对应的股价 ``` def COST(HIGH:Iterable,LOW:Iterable,VOL:Iterable,Turnrate:Iterable,winpercent:Iterable,radio:float=0.01,avg:Union[Iterable,str]='hlavg')->Optional[np.ndarray]: '''计算某盈利比例对应的股价 :HIGH-最高价[序列值] :LOW-最低价[序列值] :VOL-成交量[序列值],单位是手,万股等不重要,只要统一就行 :Turnrate[换手率]:取值范围0-1,注意50%的换手应写作0.5 *换手率由于流通股变动问题,故不能简单使用“成交量/流通股”的方式计算,这也是本函数保留输入换手率的原因 :winpercent-指定获利比例,应为0-100之间的数值(如winpercent=90,即返回盈利90%的股价) :avg-三角分部顶点:默认取每日最高价和最低价的平均值,某些算法中使用“成交额/成交量”的计算方法 *使用“成交额/成交量”的计算方法的话,注意这个平均位置也要复权,否则会出现平均位置出现在当日最高价和最低价之外的情况 :radio-精确度:如股票等使用0.01,ETF,Reits等使用0.001 返回一组指定获利比例的股价。 *此函数专用于T+1交易,不适用于可转债或者非日线周期等换手率超过100的情况''' return pyML.COST(HIGH,LOW,VOL,Turnrate,winpercent,radio,avg) ``` ### 47LLVBARS 求上一低点到当前的周期数. ``` def LLVBARS(S:Iterable,N:int)->Optional[np.ndarray]: '''求上一低点到当前的周期数. 用法: LLVBARS(S,N):求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计''' return pyML.LLVBARS(S,N) ``` ### 49 HHVBARS 求上一高点到当前的周期数. ``` def HHVBARS(S:Iterable,N:int)->Optional[np.ndarray]: '''求上一高点到当前的周期数. 用法: HHVBARS(S,N):求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计''' return pyML.HHVBARS(S,N) ``` ### 50 SAR ``` def SAR(cls, ohlc: DataFrame, af: int = 0.02, amax: int = 0.2) -> Series: """SAR stands for “stop and reverse,” which is the actual indicator used in the system. SAR trails price as the trend extends over time. The indicator is below prices when prices are rising and above prices when prices are falling. In this regard, the indicator stops and reverses when the price trend reverses and breaks above or below the indicator.""" high, low = ohlc.high, ohlc.low # Starting values sig0, xpt0, af0 = True, high[0], af _sar = [low[0] - (high - low).std()] for i in range(1, len(ohlc)): sig1, xpt1, af1 = sig0, xpt0, af0 lmin = min(low[i - 1], low[i]) lmax = max(high[i - 1], high[i]) if sig1: sig0 = low[i] > _sar[-1] xpt0 = max(lmax, xpt1) else: sig0 = high[i] >= _sar[-1] xpt0 = min(lmin, xpt1) if sig0 == sig1: sari = _sar[-1] + (xpt1 - _sar[-1]) * af1 af0 = min(amax, af1 + af) if sig0: af0 = af0 if xpt0 > xpt1 else af1 sari = min(sari, lmin) else: af0 = af0 if xpt0 < xpt1 else af1 sari = max(sari, lmax) else: af0 = af sari = xpt0 _sar.append(sari) return pd.Series(_sar, index=ohlc.index) ``` ### **二通达信函数** ### 一超卖超买类 ### 1CCI商品路劲指标 ``` def CCI(CLOSE,HIGH,LOW,N=14): ''' 超卖超买类 CCI商品路劲指标 TYP赋值:(最高价+最低价+收盘价)/3 输出CCI:(TYP-TYP的N日简单移动平均)*1000/(15*TYP的N日平均绝对偏差) ''' TYP=(HIGH+LOW+CLOSE)/3 result=(TYP-MA(TYP,N))*1000/(15*AVEDEV(TYP,N)) return result ``` ### 2KDJ ``` def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3): ''' 超卖超买类 RSV赋值:(收盘价-N日内最低价的最低值)/(N日内最高价的最高值-N日内最低价的最低值)*100 输出K:RSV的M1日[1日权重]移动平均 输出D:K的M2日[1日权重]移动平均 输出J:3*K-2*D ''' RSV=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100 K=SMA(RSV,M1,1) D=SMA(K,M2,1) J=3*K-2*D return K,D,J ``` ### 3MFI最近流量指标 ``` def MFI(CLOSE,HIGH,LOW,VOL,N=14): ''' 最近流量指标 超卖超买类 赋值: (最高价 + 最低价 + 收盘价)/3 V1赋值:如果TYP>1日前的TYP,返回TYP*成交量(手),否则返回0的N日累和/如果TYP<1日前的TYP,返回TYP*成交量(手),否则返回0的N日累和 输出资金流量指标:100-(100/(1+V1)) ''' TYP = (HIGH + LOW + CLOSE)/3 V1=SUM(IF(TYP>REF(TYP,1),TYP*VOL,0),N)/SUM(IF(TYP=0,返回DIF,否则返回0 VD赋值:如果DIF<0,返回-DIF,否则返回0 MAU1赋值:VU的M1日平滑移动平均 MAD1赋值:VD的M1日平滑移动平均 MAU2赋值:VU的M2日平滑移动平均 ''' DIF=CLOSE-REF(CLOSE,1) VU=IF(DIF>=0,DIF,0) VD=IF(DIF<0,-DIF,0) MAU1=MEMA(VU,M1) MAD1=MEMA(VD,M1) MAU2=MEMA(VU,M2) MAD2=MEMA(VD,M2) RSI1=MA(100*MAU1/(MAU1+MAD1),M1) RSI2=MA(100*MAU2/(MAU2+MAD2),M2) return RSI1,RSI2 ``` ### 16BIAS_QL乖离率-传统版 ``` def BIAS_QL(CLOSE,N=6,M=6): ''' 乖离率-传统版 输出乖离率 :(收盘价-收盘价的N日简单移动平均)/收盘价的N日简单移动平均*100 输出BIASMA :乖离率的M日简单移动平均 ''' BIAS=(CLOSE-MA(CLOSE,N))/MA(CLOSE,N)*100 BIASMA=MA(BIAS,M) return BIAS,BIASMA ``` ### BIAS乖离率 ``` def BIAS(CLOSE,N1=6,N2=12,N3=24): ''' 乖离率 输出BIAS1 :(收盘价-收盘价的N1日简单移动平均)/收盘价的N1日简单移动平均*100 输出BIAS2 :(收盘价-收盘价的N2日简单移动平均)/收盘价的N2日简单移动平均*100 输出BIAS3 :(收盘价-收盘价的N3日简单移动平均)/收盘价的N3日简单移动平均*100 ''' BIAS1=(CLOSE-MA(CLOSE,N1))/MA(CLOSE,N1)*100 BIAS2=(CLOSE-MA(CLOSE,N2))/MA(CLOSE,N2)*100 BIAS3=(CLOSE-MA(CLOSE,N3))/MA(CLOSE,N3)*100 return BIAS1,BIAS2,BIAS3 ``` ### 三六乖离BIAS36 ``` def BIAS36(CLOSE,M=6): ''' 三六乖离 输出三六乖离:收盘价的3日简单移动平均-收盘价的6日简单移动平均 输出BIAS612:收盘价的6日简单移动平均-收盘价的12日简单移动平均 输出MABIAS:BIAS36的M日简单移动平均 ''' BIAS36=MA(CLOSE,3)-MA(CLOSE,6) BIAS612=MA(CLOSE,6)-MA(CLOSE,12) MABIAS=MA(BIAS36,M) return BIAS36,BIAS612,MABIAS ``` ### 幅度涨速ACCER ``` def ACCER(CLOSE,N=8): ''' 幅度涨速 输出幅度涨速:收盘价的N日线性回归斜率/收盘价 ''' ACCER=SLOPE(CLOSE,N)/CLOSE return ACCER ``` ### CYD承接因子 ``` def CYD(CLOSE,CAPITAL,N=21): ''' 承接因子 输出CYDS:以收盘价计算的获利盘比例/(成交量(手)/当前流通股本(手)) 输出CYDN:以收盘价计算的获利盘比例/成交量(手)/当前流通股本(手)的N日简单移动平均 ''' CYDS=WINNER(CLOSE)/(VOL/CAPITAL) CYDN=WINNER(CLOSE)/MA(VOL/CAPITAL,N); return CYDS,CYDN ``` ### CYF市场能量 ``` def CYF(HSL,N=21): ''' 市场能量 输出市场能量:100-100/(1+换手线的N日指数移动平均) ''' CYF=100-100/(1+EMA(HSL,N)) return CYF ``` ### SFL分水岭 ``` def SFL(CLOSE): ''' 分水岭 输出SWL:(收盘价的5日指数移动平均*7+收盘价的10日指数移动平均*3)/10 输出SWS:以1和100*(成交量(手)的5日累和/(3*当前流通股本(手)))的较大值为权重收盘价的12日指数移动平均的动态移动平均 ''' SWL=(EMA(CLOSE,5)*7+EMA(CLOSE,10)*3)/10 IF(100*(SUM(VOL,5)/(3*CAPITAL)>1),100*(SUM(VOL,5)/(3*CAPITAL)),1) SWS=DMA(EMA(CLOSE,12),MAX(1,1)) return SWL,SWS ``` ### ATR真实波幅 ``` def ATR(CLOSE,HIGH,LOW,N=14): ''' 真实波幅 输出MTR:(最高价-最低价)和1日前的收盘价-最高价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值 输出真实波幅:MTR的N日简单移动平均 ''' MTR=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)) ATR=MA(MTR,N) return MTR,ATR ``` ### DKX多空线 ``` def DKX(CLOSE,LOW,OPEN,HIGH,M=10): ''' 多空线 MID赋值:(3*收盘价+最低价+开盘价+最高价)/6 输出多空线:(20*MID+19*1日前的MID+18*2日前的MID+17*3日前的MID+16*4日前的MID+15*5日前的MID+14*6日前的MID+13*7日前的MID+12*8日前的MID+11*9日前的MID+10*10日前的MID+9*11日前的MID+8*12日前的MID+7*13日前的MID+6*14日前的MID+5*15日前的MID+4*16日前的MID+3*17日前的MID+2*18日前的MID+20日前的MID)/210 输出MADKX:DKX的M日简单移动平均 ''' MID=(3*CLOSE+LOW+OPEN+HIGH)/6 DKX=(20*MID+19*REF(MID,1)+18*REF(MID,2)+17*REF(MID,3)+ 16*REF(MID,4)+15*REF(MID,5)+14*REF(MID,6)+ 13*REF(MID,7)+12*REF(MID,8)+11*REF(MID,9)+ 10*REF(MID,10)+9*REF(MID,11)+8*REF(MID,12)+ 7*REF(MID,13)+6*REF(MID,14)+5*REF(MID,15)+ 4*REF(MID,16)+3*REF(MID,17)+2*REF(MID,18)+REF(MID,20))/210 MADKX=MA(DKX,M) return DKX,MADKX ``` ### 2趋势类型 ### ASI振动升降指标 ``` def ASI(OPEN,CLOSE,HIGH,LOW,M1=26,M2=10): ''' 振动升降指标 ''' LC=REF(CLOSE,1) AA=ABS(HIGH-LC) BB=ABS(LOW-LC) CC=ABS(HIGH-REF(LOW,1)) DD=ABS(LC-REF(OPEN,1)) R=IF( (AA>BB) & (AA>CC),AA+BB/2+DD/4,IF( (BB>CC) & (BB>AA),BB+AA/2+DD/4,CC+DD/4)) X=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1)) SI=16*X/R*MAX(AA,BB) ASI=SUM(SI,M1) ASIT=MA(ASI,M2) return ASI,ASIT ``` ### CHO佳庆指标 ``` def CHO(CLOSE,OPEN,LOW,HIGH,VOL,N1=10,N2=20,M=6): ''' 佳庆指标 MID赋值:成交量(手)*(2*收盘价-最高价-最低价)/(最高价+最低价)的历史累和 输出佳庆指标:MID的N1日简单移动平均-MID的N2日简单移动平均 输出MACHO:CHO的M日简单移动平均 ''' MID=SUM(VOL*(2*CLOSE-HIGH-LOW)/(HIGH+LOW),0) CHO=MA(MID,N1)-MA(MID,N2) MACHO=MA(CHO,M) return CHO,MACHO ``` ### DMA_XT平均差 ``` def DMA_XT(CLOSE,N1=10,N2=50,M=10): ''' 平均差 输出DIF:收盘价的N1日简单移动平均-收盘价的N2日简单移动平均 输出DIFMA:DIF的M日简单移动平均 ''' DIF=MA(CLOSE,N1)-MA(CLOSE,N2) DIFMA=MA(DIF,M) return DIF,DIFMA ``` ### DMI趋向指标 ``` def DMI(CLOSE,HIGH,LOW,N=14,M=6): ''' 趋向指标 MTR赋值:最高价-最低价和最高价-1日前的收盘价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值的N日累和 赋值:最高价-1日前的最高价 赋值:1日前的最低价-最低价 DMP赋值:如果HD>0并且HD>LD,返回HD,否则返回0的N日累和 DMM赋值:如果LD>0并且LD>HD,返回LD,否则返回0的N日累和 输出PDI: DMP*100/MTR 输出MDI: DMM*100/MTR 输出ADX: MDI-PDI的绝对值/(MDI+PDI)*100的M日简单移动平均 输出ADXR:(ADX+M日前的ADX)/2 ''' MTR=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(REF(CLOSE,1)-LOW)),N) HD =HIGH-REF(HIGH,1) LD =REF(LOW,1)-LOW list_A=[] list_B=[] for m,n in zip(LD>0,LD>HD): if m==n and m==True: list_A.append(True) else: list_A.append(False) for i,j in zip(LD>0,LD>HD): if i==j and i==True: list_B.append(True) else: list_B.append(False) DMP=SUM(IF(list_A,HD,0),N) DMM=SUM(IF(list_B,LD,0),N) PDI= DMP*100/MTR MDI=DMM*100/MTR ADX=MA(ABS(MDI-PDI)/(MDI+PDI)*100,M) ADXR=(ADX+REF(ADX,M))/2 return PDI,MDI,ADX,ADXR ``` ### DPO区间震荡线 ``` def DPO(CLOSE,N=21,M=6): ''' 区间震荡线 输出区间震荡线:收盘价-N/2+1日前的收盘价的N日简单移动平均 输出MADPO:DPO的M日简单移动平均 ''' #print(REF(MA(CLOSE,N),N/2)) DPO=CLOSE-REF(MA(CLOSE,7),6) MADPO=MA(DPO,M) return DPO,MADPO ``` ### EMV简易波动指标 ``` def EMV(HIGH,LOW,VOL,N=14,M=9): ''' 简易波动指标 VOLUME赋值:成交量(手)的N日简单移动平均/成交量(手) MID赋值:100*(最高价+最低价-1日前的最高价+最低价)/(最高价+最低价) 输出EMV:MID*VOLUME*(最高价-最低价)/最高价-最低价的N日简单移动平均的N日简单移动平均 输出MAEMV:EMV的M日简单移动平均 ''' VOLUME=MA(VOL,N)/VOL MID=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW) EMV=MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N) MAEMV=MA(EMV,M) return EMV,MAEMV ``` ### MACD平滑异同平均线 ``` def MACD(CLOSE,SHORT=12,LONG=26,MID=9): ''' 平滑异同平均线 输出DIF:收盘价的SHORT日指数移动平均-收盘价的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:(DIF-DEA)*2,COLORSTICK ''' DIF=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG) DEA=EMA(DIF,MID) MACD=(DIF-DEA)*2 return DIF,DEA,MACD ``` ### VMACD 量平滑异同平均线 ``` def VMACD(VOL,SHORT=12,LONG=26,MID=9): ''' 量平滑异同平均线 输出DIF:成交量(手)的SHORT日指数移动平均-成交量(手)的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:DIF-DEA,COLORSTICK ''' DIF=EMA(VOL,SHORT)-EMA(VOL,LONG) DEA=EMA(DIF,MID) MACD=DIF-DEA return DIF,DEA,MACD ``` ### SMACD单线平滑异同平均线 ``` def SMACD(CLOSE,SHORT=12,LONG=26,MID=9): ''' 单线平滑异同平均线 DIF赋值:收盘价的SHORT日指数移动平均-收盘价的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:DIF,COLORSTICK ''' DIF=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG) DEA=EMA(DIF,MID) MACD=DIF return DEA,MACD ``` ### QACD快速异同平均线 ``` def QACD(CLOSE,N1=12,N2=12,M=9): ''' 快速异同平均线 输出DIF:收盘价的N1日指数移动平均-收盘价的N2日指数移动平均 输出平滑异同平均线:DIF的M日指数移动平均 输出DDIF:DIF-MACD ''' DIF=EMA(CLOSE,N1)-EMA(CLOSE,N2) MACD=EMA(DIF,M) DDIF=DIF-MACD return DIF,MACD,DDIF ``` ### TRIX三重指数平均线 ``` def TRIX(CLOSE,N=12,M=9): ''' 三重指数平均线 MTR赋值:收盘价的N日指数移动平均的N日指数移动平均的N日指数移动平均 输出三重指数平均线:(MTR-1日前的MTR)/1日前的MTR*100 输出MATRIX:TRIX的M日简单移动平均 ''' MTR=EMA(EMA(EMA(CLOSE,N),N),N) TRIX=(MTR-REF(MTR,1))/REF(MTR,1)*100 MATRIX=MA(TRIX,M) return TRIX,MATRIX ``` ### UOS终极指标 ``` def UOS(CLOSE,HIGH,LOW,N1=7,N2=14,N3=28,M=6): ''' 终极指标 TH赋值:最高价和1日前的收盘价的较大值 TL赋值:最低价和1日前的收盘价的较小值 ACC1赋值:收盘价-TL的N1日累和/TH-TL的N1日累和 ACC2赋值:收盘价-TL的N2日累和/TH-TL的N2日累和 ACC3赋值:收盘价-TL的N3日累和/TH-TL的N3日累和 输出终极指标:(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3) 输出MAUOS:UOS的M日指数平滑移动平均 ''' TH=MAX(HIGH,REF(CLOSE,1)) TL=MIN(LOW,REF(CLOSE,1)) ACC1=SUM(CLOSE-TL,N1)/SUM(TH-TL,N1) ACC2=SUM(CLOSE-TL,N2)/SUM(TH-TL,N2) ACC3=SUM(CLOSE-TL,N3)/SUM(TH-TL,N3) UOS=(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3) MAUOS=EXPMEMA(pd.Series(UOS),M) return UOS,np.array(MAUOS) ``` ### VTP量价曲线 ``` def VTP(CLOSE,VOL,N=51,M=6): ''' 量价曲线 输出量价曲线:成交量(手)*(收盘价-1日前的收盘价)/1日前的收盘价的N日累和 输出MAVPT:VPT的M日简单移动平均 ''' VPT=SUM(VOL*(CLOSE-REF(CLOSE,1))/REF(CLOSE,1),N) MAVP=MA(VPT,M) return VPT,MAVP ``` ### WVAD威廉变异离散量 ``` def WVAD(CLOSE,OPEN,HIGH,LOW,VOL,N=24,M=6): ''' 威廉变异离散量 输出WVAD:(收盘价-开盘价)/(最高价-最低价)*成交量(手)的N日累和/10000 输出MAWVAD:WVAD的M日简单移动平均 ''' WVAD=SUM((CLOSE-OPEN)/(HIGH-LOW)*VOL,N)/10000 MAWVAD=MA(WVAD,M) return WVAD,MAWVAD ``` ###DBQR 对比强弱(需下载日线) ``` def DBQR(CLOSE,N=5,M1=10,M2=20,M3=60): ''' 对比强弱(需下载日线) 输出ZS:(大盘的收盘价-N日前的大盘的收盘价)/N日前的大盘的收盘价 输出GG:(收盘价-N日前的收盘价)/N日前的收盘价 输出MADBQR1:GG的M1日简单移动平均 输出MADBQR2:GG的M2日简单移动平均 输出MADBQR3:GG的M3日简单移动平均 ''' ZS=(INDEXC-REF(INDEXC,N))/REF(INDEXC,N) GG=(CLOSE-REF(CLOSE,N))/REF(CLOSE,N) MADBQR1=MA(GG,M1) MADBQR2=MA(GG,M2) MADBQR3=MA(GG,M3) return ZS,GG,MADBQR1,MADBQR2,MADBQR3 ``` ### JS加数线 ``` def JS(CLOSE,N=5,M1=5,M2=10,M3=20): ''' 加数线 输出加速线:100*(收盘价-N日前的收盘价)/(N*N日前的收盘价) 输出MAJS1:JS的M1日简单移动平均 输出MAJS2:JS的M2日简单移动平均 输出MAJS3:JS的M3日简单移动平均 ''' JS=100*(CLOSE-REF(CLOSE,N))/(N*REF(CLOSE,N)) MAJS1=MA(JS,M1) MAJS2=MA(JS,M2) MAJS3=MA(JS,M3) return JS,MAJS1,MAJS2,MAJS3 ``` ### CYE市场趋势 ``` def CYE(CLOSE): ''' 市场趋势 MAL赋值:收盘价的5日简单移动平均 MAS赋值:收盘价的20日简单移动平均的5日简单移动平均 输出CYEL:(MAL-1日前的MAL)/1日前的MAL*100 输出CYES:(MAS-1日前的MAS)/1日前的MAS*100 ''' MAL=MA(CLOSE,5) MAS=MA(MA(CLOSE,20),5) CYEL=(MAL-REF(MAL,1))/REF(MAL,1)*100 CYES=(MAS-REF(MAS,1))/REF(MAS,1)*100 return CYEL,CYES ``` ### QR 强弱指标(需下载日线) ``` def QR(CLOSE,N=21): ''' 强弱指标(需下载日线) NN赋值:收盘价的有效数据周期数和N的较小值 输出 个股: (收盘价-NN日前的收盘价)/NN日前的收盘价*100 输出 大盘: (大盘的收盘价-NN日前的大盘的收盘价)/NN日前的大盘的收盘价*100 输出 强弱值:个股-大盘的2日指数移动平均,COLORSTICK ''' NN=MIN(BARSCOUNT(CLOSE),N) GG=(CLOSE-REF(CLOSE,NN))/REF(CLOSE,NN)*100 DP=(INDEXC-REF(INDEXC,NN))/REF(INDEXC,NN)*100 value=EMA(GG-DP,2) return GG,DP,value ``` ### GDX轨道线 ``` def GDX(CLOSE,HIGH,LOW,N=30,M=9): ''' 轨道线 AA赋值:(2*收盘价+最高价+最低价)/4-收盘价的N日简单移动平均的绝对值/收盘价的N日简单移动平均 输出 轨道:以AA为权重收盘价的动态移动平均 输出压力线:(1+M/100)*轨道 输出 支撑线:(1-M/100)*轨道 ''' AA=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,N))/MA(CLOSE,N) 轨道 =DMA(AA,0.5) 压力线=(1+M/100)*轨道 支撑线=(1-M/100)*轨道 return 轨道,压力线,支撑线 ``` ### JLHB绝路航标 ``` def JLHB(CLOSE,LOW,N=7,M=5): ''' 绝路航标 VAR1赋值:(收盘价-60日内最低价的最低值)/(60日内最高价的最高值-60日内最低价的最低值)*80 输出 B:VAR1的N日[1日权重]移动平均 输出 VAR2:B的M日[1日权重]移动平均 输出 绝路航标:如果B上穿VAR2ANDB<40,返回50,否则返回0 ''' VAR1=(CLOSE-LLV(LOW,60))/(HHV(HIGH,60)-LLV(LOW,60))*80 B=SMA(VAR1,N,1) VAR2=SMA(B,M,1) 绝路航标=IF(np.logical_and(B,VAR2),50,0) return B,VAR2,绝路航标 ``` ### 3能量类型 ### BRAR情绪指标 ``` def BRAR(OPEN,HIGH,LOW,N=26): ''' 情绪指标 输出BR:0和最高价-1日前的收盘价的较大值的N日累和/0和1日前的收盘价-最低价的较大值的N日累和*100 输出AR:最高价-开盘价的N日累和/开盘价-最低价的N日累和*100 ''' BR=SUM(MAX(0,HIGH-REF(CLOSE,1)),N)/SUM(MAX(0,REF(CLOSE,1)-LOW),N)*100 AR=SUM(HIGH-OPEN,N)/SUM(OPEN-LOW,N)*100 return BR,AR ``` ### CR带状能量线 ``` def CR(HIGH,LOW,N=26,M1=10,M2=20,M3=40,M4=60): ''' 带状能量线 MID赋值:1日前的最高价+最低价/2 输出带状能量线:0和最高价-MID的较大值的N日累和/0和MID-最低价的较大值的N日累和*100 输出MA1:M1/2.5+1日前的CR的M1日简单移动平均 输出均线:M2/2.5+1日前的CR的M2日简单移动平均 输出MA3:M3/2.5+1日前的CR的M3日简单移动平均 输出MA4:M4/2.5+1日前的CR的M4日简单移动平均 ''' MID=REF(HIGH+LOW,1)/2 CR=SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100 MA1=pd.DataFrame(CR).shift(11).mean() MA2=pd.DataFrame(CR).shift(5).mean() MA3=pd.DataFrame(CR).shift(17).mean() MA4=pd.DataFrame(CR).shift(25).mean() return CR,MA1,MA2,MA3,MA4 ``` ### MASS梅斯线 ``` def MASS(HIGH,LOW,N1=9,N2=25,M=6): ''' 梅斯线 输出梅斯线:最高价-最低价的N1日简单移动平均/最高价-最低价的N1日简单移动平均的N1日简单移动平均的N2日累和 输出MAMASS:MASS的M日简单移动平均 ''' MASS=SUM(MA(HIGH-LOW,N1)/MA(MA(HIGH-LOW,N1),N1),N2) MAMASS=MA(MASS,M) return MASS,MAMASS ``` ### PSY心理线 ``` def PSY(CLOSE,N=12,M=6): ''' 心理线 输出PSY:统计N日中满足收盘价>1日前的收盘价的天数/N*100 输出PSYMA:PSY的M日简单移动平均 ''' PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100 PSYMA=MA(PSY,M) return PSY,PSYMA ``` ### VR成交量变异率 ``` def VR(CLOSE,N=26,M=6): ''' 成交量变异率 TH赋值:如果收盘价>1日前的收盘价,返回成交量(手),否则返回0的N日累和 TL赋值:如果收盘价<1日前的收盘价,返回成交量(手),否则返回0的N日累和 TQ赋值:如果收盘价=1日前的收盘价,返回成交量(手),否则返回0的N日累和 输出VR:100*(TH*2+TQ)/(TL*2+TQ) 输出MAVR:VR的M日简单移动平均 ''' TH=SUM(IF(CLOSE>REF(CLOSE,1),VOL,0),N) TL=SUM(IF(CLOSE1日前的收盘价,返回MIDA,否则返回MIDB的历史累和 输出MAWAD:WAD的M日简单移动平均 ''' MIDA=CLOSE-MIN(REF(CLOSE,1),LOW) MIDB=IF(CLOSEREF(CLOSE,1),MIDA,MIDB),0) MAWAD=MA(WAD,M) return WAD,MAWAD ``` ### EXPMEMA指数平滑 ``` def EXPMEMA(CLOSE,M=5): ''' 指数平滑 ''' return pd.Series(CLOSE).ewm(span=M, adjust=False).mean().values ``` ### PCNT输出幅度比 ``` def PCNT(CLOSE,M=5): ''' 输出幅度比:(收盘价-1日前的收盘价)/收盘价*100 输出MAPCNT:PCNT的M日指数平滑移动平均 ''' PCNT=(CLOSE-REF(CLOSE,1))/CLOSE*100 MAPCNT=EXPMEMA(PCNT,M) return PCNT,MAPCNT ``` ### CYR市场强弱 ``` def CYR(AMOUNT,N=13,M=5): ''' 市场强弱 AMOUNT成交量=price*volume DIVE赋值:0.01*成交额(元)的N日指数移动平均/成交量(手)的N日指数移动平均 输出市场强弱:(DIVE/1日前的DIVE-1)*100 输出MACYR:CYR的M日简单移动平均 ''' DIVE=0.01*EMA(AMOUNT,N)/EMA(VOL,N) CYR=(DIVE/REF(DIVE,1)-1)*100 MACYR=MA(CYR,M) return CYR,MACYR ``` ### 4能量型 ### AMO成交金额 ``` def AMO(AMOUNT,M1=5,M2=10): ''' 成交金额 输出AMOW:成交额(元)/10000.0,VOLSTICK 输出AMO1:AMOW的M1日简单移动平均 输出AMO2:AMOW的M2日简单移动平均 ''' AMOW=AMOUNT/10000.0 AMO1=MA(AMOW,M1) AMO2=MA(AMOW,M2) return AMOW,AMO1,AMO2 ``` ### OBV累积能量线 ``` def OBV(VOL,CLOSE,M=30): ''' 累积能量线 VA赋值:如果收盘价>1日前的收盘价,返回成交量(手),否则返回-成交量(手) 输出OBV:如果收盘价=1日前的收盘价,返回0,否则返回VA的历史累和 输出MAOBV:OBV的M日简单移动平均 ''' VA=IF(CLOSE>REF(CLOSE,1),VOL,-VOL) OBV=SUM(IF(CLOSE==REF(CLOSE,1),0,VA),0) MAOBV=MA(OBV,M) return OBV,MAOBV ``` ### VOL_XT成交量 ``` def VOL_XT(VOL,M1=5,M2=10): ''' 成交量 输出VOLUME:成交量(手),VOLSTICK 输出MAVOL1:VOLUME的M1日简单移动平均 输出MAVOL2:VOLUME的M2日简单移动平均 ''' VOLUME=VOL MAVOL1=MA(VOLUME,M1) MAVOL2=MA(VOLUME,M2) return MAVOL1,MAVOL2 ``` ### VRSI相对强弱量 ``` def VRSI(VOL,N1=6,N2=12,N3=24): ''' 相对强弱量 LC赋值:1日前的成交量(手) 输出RSI1:成交量(手)-LC和0的较大值的N1日[1日权重]移动平均/成交量(手)-LC的绝对值的N1日[1日权重]移动平均*100 输出RSI2:成交量(手)-LC和0的较大值的N2日[1日权重]移动平均/成交量(手)-LC的绝对值的N2日[1日权重]移动平均*100 输出RSI3:成交量(手)-LC和0的较大值的N3日[1日权重]移动平均/成交量(手)-LC的绝对值的N3日[1日权重]移动平均*100 ''' LC=REF(VOL,1) RSI1=SMA(MAX(VOL-LC,0),N1,1)/SMA(ABS(VOL-LC),N1,1)*100 RSI2=SMA(MAX(VOL-LC,0),N2,1)/SMA(ABS(VOL-LC),N2,1)*100 RSI3=SMA(MAX(VOL-LC,0),N3,1)/SMA(ABS(VOL-LC),N3,1)*100 return RSI1,RSI2,RSI3 ``` ### HSL换手线 ``` def HSL(HSL,N=5): ''' 换手线 ''' HSL=HSL MAHSL=MA(HSL,N) return HSL,MAHSL ``` ### 5均线系统 ### MA_XT均线 ``` def MA_XT(CLOSE,M1=5,M2=10,M3=20,M4=60): ''' 均线 输出MA1:收盘价的M1日简单移动平均 输出均线:收盘价的M2日简单移动平均 输出MA3:收盘价的M3日简单移动平均 输出MA4:收盘价的M4日简单移动平均 输出MA5:收盘价的M5日简单移动平均 输出MA6:收盘价的M6日简单移动平均 输出MA7:收盘价的M7日简单移动平均 输出MA8:收盘价的M8日简单移动平均 ''' MA1=MA(CLOSE,M1) MA2=MA(CLOSE,M2) MA3=MA(CLOSE,M3) MA4=MA(CLOSE,M4) return MA1,MA2,MA3,MA4 ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) ### **二函数说明** ### 一基础函数 ### 1 RD 四舍五入取3位小数 源代码 ``` def RD(N,D=3): #四舍五入取3位小数 return np.round(N,D) ``` 例子 ``` from xg_tdx_func.xg_tdx_func import * import akshare as ak df=ak.stock_zh_a_daily(symbol='sh600031',start_date='20240101') rd=RD(N=df['close'],D=2) print(rd) ``` 调用的数据 ``` 0 13.76 1 13.63 2 13.49 3 13.41 4 13.25 ... 162 16.31 163 16.38 164 16.35 165 16.43 166 16.13 Name: close, Length: 167, dtype: float64 ``` ### 2RET 返回序列倒数第N个值,默认返回最后一个 ``` def RET(S,N=1): ''' 返回序列倒数第N个值,默认返回最后一个 ''' return np.array(S)[-N] ``` ### 3ABS 返回N的绝对值 ``` def ABS(S): ''' 返回N的绝对值 ''' return np.abs(S) ``` ### 4MIN 序列min ``` def MIN(S1,S2): ''' 序列min ''' return np.minimum(S1,S2) ``` ### 5IF 序列布尔判断 return=A if S==True else B ``` def IF(S,A,B): ''' 序列布尔判断 return=A if S==True else B ''' return np.where(S,A,B) ``` ### 6REF 对序列整体下移动N,返回序列(shift后会产生NAN) ``` def REF(S, N=1): ''' 对序列整体下移动N,返回序列(shift后会产生NAN) ''' return pd.Series(S).shift(N).values ``` ### 7DIFF 前一个值减后一个值,前面会产生nan np.diff(S)直接删除nan,会少一行 ``` def DIFF(S, N=1): ''' 前一个值减后一个值,前面会产生nan np.diff(S)直接删除nan,会少一行 ''' return pd.Series(S).diff(N).values ``` ### 8STD 求序列的N日标准差,返回序列 ``` def STD(S,N): ''' 求序列的N日标准差,返回序列 ''' return pd.Series(S).rolling(N).std(ddof=0).values ``` ### 9SUM 对序列求N天累计和,返回序列 N=0对序列所有依次求和 ``` def SUM(S, N): ''' 对序列求N天累计和,返回序列 N=0对序列所有依次求和 ''' return pd.Series(S).rolling(N).sum().values if N>0 else pd.Series(S).cumsum().values ``` ### 10CONST 返回序列S最后的值组成常量序列 ``` def CONST(S): ''' 返回序列S最后的值组成常量序列 ''' return np.full(len(S),S[-1]) ``` ### 11AND and函数 ``` def AND(S1,S2): #and return np.logical_and(S1,S2) ``` ### 12 OR or选择函数 ``` def OR(S1,S2): #or return np.logical_or(S1,S2) ``` ### 13 NOT not函数 ``` def NOT(S1,S2): ''' not ''' return np.logical_not(S1,S2) ``` ### 14 RANGE 期间函数 B<=A<=C ``` def RANGE(A,B,C): ''' 期间函数 B<=A<=C ''' df=pd.DataFrame() df['select']=A.tolist() df['select']=df['select'].apply(lambda x: True if (x>=B and x<=C) else False) return df['select'] ``` ### 15 HHV HHV(C, 5) 最近5天收盘最高价 ``` def HHV(S,N): ''' HHV(C, 5) 最近5天收盘最高价 ''' return pd.Series(S).rolling(N).max().values ``` ### 16LLV LLV(C, 5) 最近5天收盘最低价 ``` def LLV(S,N): ''' LLV(C, 5) 最近5天收盘最低价 ''' return pd.Series(S).rolling(N).min().values ``` ### 17HHVBARS 求N周期内S最高值到当前周期数, 返回序列 ``` def HHVBARS(S,N): ''' 求N周期内S最高值到当前周期数, 返回序列 ''' return pd.Series(S).rolling(N).apply(lambda x: np.argmax(x[::-1]),raw=True).values ``` ### 18LLVBARS 求N周期内S最低值到当前周期数, 返回序列 ``` def LLVBARS(S,N): ''' 求N周期内S最低值到当前周期数, 返回序列 ''' return pd.Series(S).rolling(N).apply(lambda x: np.argmin(x[::-1]),raw=True).values ``` ### 19MA 求序列的N日简单移动平均值,返回序 ``` def MA(S,N): ''' 求序列的N日简单移动平均值,返回序列 ''' return pd.Series(S).rolling(N).mean().values ``` ### 20EMA 指数移动平均,为了精度 S>4*N EMA至少需要120周期 alpha=2/(span+1) ``` def EMA(S,N): ''' 指数移动平均,为了精度 S>4*N EMA至少需要120周期 alpha=2/(span+1) ''' retur ``` ### 21 SMA SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) ``` def SMA(S, N, M=1): ''' SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) ''' return pd.Series(S).ewm(alpha=M/N,adjust=False).mean().values #com=N-M/M ``` ### 22DMA 求S的动态移动平均,A作平滑因子,必须 0B & A>0 & B>=0 ``` def LAST(S, A, B): ''' 从前A日到前B日一直满足S_BOOL条件, 要求A>B & A>0 & B>=0 ''' return np.array(pd.Series(S).rolling(A+1).apply(lambda x:np.all(x[::-1][B:]),raw=True),dtype=bool) ``` ### 28COUNT COUNT(CLOSE>O, N): 最近N天满足S_BOO的天数 True的天数 ``` def COUNT(S, N): ''' # COUNT(CLOSE>O, N): 最近N天满足S_BOO的天数 True的天数 ''' return SUM(S,N) ``` ### 29EVERY EVERY(CLOSE>O, 5) 最近N天是否都是True ``` def EVERY(S, N): ''' EVERY(CLOSE>O, 5) 最近N天是否都是True ''' return IF(SUM(S,N)==N,True,False) ``` ### 30EXIST EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点 ``` def EXIST(S, N): ''' EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点 ''' return IF(SUM(S,N)>0,True,False) ``` ### 31FILTER FILTER函数,S满足条件后,将其后N周期内的数据置为0, FILTER(C==H,5) ``` def FILTER(S, N): ''' FILTER函数,S满足条件后,将其后N周期内的数据置为0, FILTER(C==H,5) ''' for i in range(len(S)): S[i+1:i+1+N]=0 if S[i] else S[i+1:i+1+N] return S ``` ### 32BARSLAST 上一次条件成立到当前的周期, BARSLAST(C/REF(C,1)>=1.1) 上一次涨停到今天的天数 ``` def BARSLAST(S): ''' 上一次条件成立到当前的周期, BARSLAST(C/REF(C,1)>=1.1) 上一次涨停到今天的天数 ''' M=np.concatenate(([0],np.where(S,1,0))) for i in range(1, len(M)): M[i]=0 if M[i] else M[i-1]+1 return M[1:] ``` ### 33BARSLASTCOUNT 统计连续满足S条件的周期数 BARSLASTCOUNT(CLOSE>OPEN)表示统计连续收阳的周期数 ``` def BARSLASTCOUNT(S): ''' 统计连续满足S条件的周期数 ''' rt = np.zeros(len(S)+1) for i in range(len(S)): rt[i+1]=rt[i]+1 if S[i] else rt[i+1] return rt[1:] ``` ### 34 BARSSINCEN N周期内第一次S条件成立到现在的周期数,N为常量 ``` def BARSSINCEN(S, N): ''' ''' return pd.Series(S).rolling(N).apply(lambda x:N-1-np.argmax(x) if np.argmax(x) or x[0] else 0,raw=True).fillna(0).values.astype(int) ``` ### 35 CROSS 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ``` def CROSS(S1, S2): ''' 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ''' return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) ``` ### 36CROSS_UP 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ``` def CROSS_UP(S1, S2): ''' #判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ''' return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) ``` ### 37 CROSS_DOWN 判断向上死叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,5),MA(C,10)) ``` def CROSS_DOWN(S1, S2): ''' 判断向上死叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,5),MA(C,10)) ''' return np.concatenate(([False], np.logical_not((S1S2)),dtype=bool) # ``` ### 39 VALUEWHEN 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 ``` def VALUEWHEN(S, X): ''' 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 ''' return pd.Series(np.where(S,X,np.nan)).ffill().values ``` ### 40BACKSET 属于未来函数,将当前位置到若干周期前的数据设为1. 用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0 ``` def BACKSET(X, N): ''' 属于未来函数,将当前位置到若干周期前的数据设为1. 用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0 ''' # 创建一个与X相同形状的全零数组 result = np.zeros_like(X) # 遍历X的元素,根据条件设置result的值 for i in range(len(X)): if X[i] != 0: start_index = max(0, i - N + 1) result[start_index:i+1] = 1 return result ``` ### 41 ALIGNRIGHT 有效数据右对齐. 用法: ALIGNRIGHT(X)有效数据向右移动,左边空出来的周期填充无效值 例如:TC:=IF(CURRBARSCOUNT=2 || CURRBARSCOUNT=5,DRAWNULL,C);XC:ALIGNRIGHT(TC);删除了两天的收盘价,并将剩余数据右移 ``` def ALIGNRIGHT(X): ''' 有效数据右对齐. 用法: ALIGNRIGHT(X)有效数据向右移动,左边空出来的周期填充无效值 例如:TC:=IF(CURRBARSCOUNT=2 || CURRBARSCOUNT=5,DRAWNULL,C);XC:ALIGNRIGHT(TC);删除了两天的收盘价,并将剩余数据右移 ''' # 获取有效数据的索引 valid_indices = np.where(X != np.nan)[0] # 计算需要填充的无效数据的数量 invalid_count = len(X) - len(valid_indices) # 创建一个新的数组,将有效数据向右移动,左边填充无效值 result = np.empty_like(X) result[:] = np.nan result[invalid_count:len(valid_indices)+invalid_count] = X[valid_indices] return result ``` ### 42BARSCOUNT 有效数据周期数. 用法: BARSCOUNT(X)第一个有效数据到当前的间隔周期数 注意:判断范围为指标或条件选股计算时公式使用的数据, 如果给画线指标的数据少(比如没有按下箭头取更多K线)或给条件选股给的数据少,这个有效值也可能少 ``` def BARSCOUNT(X): ''' 有效数据周期数. 用法: BARSCOUNT(X)第一个有效数据到当前的间隔周期数 注意:判断范围为指标或条件选股计算时公式使用的数据, 如果给画线指标的数据少(比如没有按下箭头取更多K线)或给条件选股给的数据少,这个有效值也可能少 ''' # 获取有效数据的索引 valid_indices = np.where(~np.isnan(X))[0] # 如果数组中没有有效数据,返回0 if len(valid_indices) == 0: return 0 # 计算第一个有效数据到当前位置的间隔周期数 first_valid_index = valid_indices[0] current_index = len(X) - 1 bars_count = current_index - first_valid_index + 1 return bars_count ``` ### 43BARSLASTS 倒数第N次成立时距今的周期数. 用法: BARSLASTS(X,N):X倒数第N满足到现在的周期数,N支持变量 ``` def BARSLASTS(X, N): ''' 倒数第N次成立时距今的周期数. 用法: BARSLASTS(X,N):X倒数第N满足到现在的周期数,N支持变量 ''' # 获取有效数据的索引 valid_indices = np.where(~np.isnan(X))[0] # 如果数组中没有有效数据,返回-1 if len(valid_indices) == 0: return -1 # 计算倒数第N次满足条件到现在的周期数 last_n_indices = valid_indices[-N:] if len(last_n_indices) < N: return -1 current_index = len(X) - 1 bars_since_last_n = current_index - last_n_indices[-1] + 1 return bars_since_last_n ``` 44 zig ``` def cacal_zig_data(self,x=0.05): ''' 计算之字转向 x=5%之子转向 :return: ''' ZIG_STATE_START = 0 ZIG_STATE_RISE = 1 ZIG_STATE_FALL = 2 df=self.df # print(list(df["close"])) df = df[::-1] df = df.reset_index(drop=True) # df = df.iloc[-100:] x = x k = df["close"] d = df["date"] peer_i = 0 candidate_i = None scan_i = 0 peers = [0] z = np.zeros(len(k)) state = ZIG_STATE_START while True: scan_i += 1 if scan_i == len(k) - 1: # 扫描到尾部 if candidate_i is None: peer_i = scan_i peers.append(peer_i) else: if state == ZIG_STATE_RISE: if k[scan_i] >= k[candidate_i]: peer_i = scan_i peers.append(peer_i) else: peer_i = candidate_i peers.append(peer_i) peer_i = scan_i peers.append(peer_i) elif state == ZIG_STATE_FALL: if k[scan_i] <= k[candidate_i]: peer_i = scan_i peers.append(peer_i) else: peer_i = candidate_i peers.append(peer_i) peer_i = scan_i peers.append(peer_i) break if state == ZIG_STATE_START: if k[scan_i] >= k[peer_i] * (1 + x): candidate_i = scan_i state = ZIG_STATE_RISE elif k[scan_i] <= k[peer_i] * (1 - x): candidate_i = scan_i state = ZIG_STATE_FALL elif state == ZIG_STATE_RISE: if k[scan_i] >= k[candidate_i]: candidate_i = scan_i elif k[scan_i] <= k[candidate_i] * (1 - x): peer_i = candidate_i peers.append(peer_i) state = ZIG_STATE_FALL candidate_i = scan_i elif state == ZIG_STATE_FALL: if k[scan_i] <= k[candidate_i]: candidate_i = scan_i elif k[scan_i] >= k[candidate_i] * (1 + x): peer_i = candidate_i peers.append(peer_i) state = ZIG_STATE_RISE candidate_i = scan_i for i in range(len(peers) - 1): peer_start_i = peers[i] peer_end_i = peers[i + 1] start_value = k[peer_start_i] end_value = k[peer_end_i] a = (end_value - start_value) / (peer_end_i - peer_start_i) # 斜率 for j in range(peer_end_i - peer_start_i + 1): z[j + peer_start_i] = start_value + a * j df['结果']=z return df ``` ### 45WINNER 计算某价位的盈利盘比例 ``` def WINNER(HIGH:Iterable,LOW:Iterable,VOL:Iterable,Turnrate:Iterable,price,avg:Union[Iterable,str]='hlavg')->Optional[np.ndarray]: '''计算某价位的盈利盘比例 :HIGH-最高价[序列值] :LOW-最低价[序列值] :VOL-成交量[序列值],单位是手,万股等不重要,只要统一就行 :Turnrate[换手率]:取值范围0-1,注意50%的换手应写作0.5 *换手率由于流通股变动问题,故不能简单使用“成交量/流通股”的方式计算,这也是本函数保留输入换手率的原因 :price-某价格的盈利比例中的价格,可以是具体数值(如:99.98),也可以是序列(如收盘价、开盘价等) :avg-三角分部顶点:默认取每日最高价和最低价的平均值,某些算法中使用“成交额/成交量”的计算方法 *使用“成交额/成交量”的计算方法的话,注意这个平均位置也要复权,否则会出现平均位置出现在当日最高价和最低价之外的情况 返回一组获利比例的序列值,范围0-1,如0.1即当前股价的盈利比例为10% *此函数专用于T+1交易,不适用于可转债或者非日线周期等换手率超过100的情况 ''' return pyML.WINNER(HIGH,LOW,VOL,Turnrate,price,avg) ``` ### 46COST 计算某盈利比例对应的股价 ``` def COST(HIGH:Iterable,LOW:Iterable,VOL:Iterable,Turnrate:Iterable,winpercent:Iterable,radio:float=0.01,avg:Union[Iterable,str]='hlavg')->Optional[np.ndarray]: '''计算某盈利比例对应的股价 :HIGH-最高价[序列值] :LOW-最低价[序列值] :VOL-成交量[序列值],单位是手,万股等不重要,只要统一就行 :Turnrate[换手率]:取值范围0-1,注意50%的换手应写作0.5 *换手率由于流通股变动问题,故不能简单使用“成交量/流通股”的方式计算,这也是本函数保留输入换手率的原因 :winpercent-指定获利比例,应为0-100之间的数值(如winpercent=90,即返回盈利90%的股价) :avg-三角分部顶点:默认取每日最高价和最低价的平均值,某些算法中使用“成交额/成交量”的计算方法 *使用“成交额/成交量”的计算方法的话,注意这个平均位置也要复权,否则会出现平均位置出现在当日最高价和最低价之外的情况 :radio-精确度:如股票等使用0.01,ETF,Reits等使用0.001 返回一组指定获利比例的股价。 *此函数专用于T+1交易,不适用于可转债或者非日线周期等换手率超过100的情况''' return pyML.COST(HIGH,LOW,VOL,Turnrate,winpercent,radio,avg) ``` ### 47LLVBARS 求上一低点到当前的周期数. ``` def LLVBARS(S:Iterable,N:int)->Optional[np.ndarray]: '''求上一低点到当前的周期数. 用法: LLVBARS(S,N):求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计''' return pyML.LLVBARS(S,N) ``` ### 49 HHVBARS 求上一高点到当前的周期数. ``` def HHVBARS(S:Iterable,N:int)->Optional[np.ndarray]: '''求上一高点到当前的周期数. 用法: HHVBARS(S,N):求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计''' return pyML.HHVBARS(S,N) ``` ### 50 SAR ``` def SAR(cls, ohlc: DataFrame, af: int = 0.02, amax: int = 0.2) -> Series: """SAR stands for “stop and reverse,” which is the actual indicator used in the system. SAR trails price as the trend extends over time. The indicator is below prices when prices are rising and above prices when prices are falling. In this regard, the indicator stops and reverses when the price trend reverses and breaks above or below the indicator.""" high, low = ohlc.high, ohlc.low # Starting values sig0, xpt0, af0 = True, high[0], af _sar = [low[0] - (high - low).std()] for i in range(1, len(ohlc)): sig1, xpt1, af1 = sig0, xpt0, af0 lmin = min(low[i - 1], low[i]) lmax = max(high[i - 1], high[i]) if sig1: sig0 = low[i] > _sar[-1] xpt0 = max(lmax, xpt1) else: sig0 = high[i] >= _sar[-1] xpt0 = min(lmin, xpt1) if sig0 == sig1: sari = _sar[-1] + (xpt1 - _sar[-1]) * af1 af0 = min(amax, af1 + af) if sig0: af0 = af0 if xpt0 > xpt1 else af1 sari = min(sari, lmin) else: af0 = af0 if xpt0 < xpt1 else af1 sari = max(sari, lmax) else: af0 = af sari = xpt0 _sar.append(sari) return pd.Series(_sar, index=ohlc.index) ``` ### **二通达信函数** ### 一超卖超买类 ### 1CCI商品路劲指标 ``` def CCI(CLOSE,HIGH,LOW,N=14): ''' 超卖超买类 CCI商品路劲指标 TYP赋值:(最高价+最低价+收盘价)/3 输出CCI:(TYP-TYP的N日简单移动平均)*1000/(15*TYP的N日平均绝对偏差) ''' TYP=(HIGH+LOW+CLOSE)/3 result=(TYP-MA(TYP,N))*1000/(15*AVEDEV(TYP,N)) return result ``` ### 2KDJ ``` def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3): ''' 超卖超买类 RSV赋值:(收盘价-N日内最低价的最低值)/(N日内最高价的最高值-N日内最低价的最低值)*100 输出K:RSV的M1日[1日权重]移动平均 输出D:K的M2日[1日权重]移动平均 输出J:3*K-2*D ''' RSV=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100 K=SMA(RSV,M1,1) D=SMA(K,M2,1) J=3*K-2*D return K,D,J ``` ### 3MFI最近流量指标 ``` def MFI(CLOSE,HIGH,LOW,VOL,N=14): ''' 最近流量指标 超卖超买类 赋值: (最高价 + 最低价 + 收盘价)/3 V1赋值:如果TYP>1日前的TYP,返回TYP*成交量(手),否则返回0的N日累和/如果TYP<1日前的TYP,返回TYP*成交量(手),否则返回0的N日累和 输出资金流量指标:100-(100/(1+V1)) ''' TYP = (HIGH + LOW + CLOSE)/3 V1=SUM(IF(TYP>REF(TYP,1),TYP*VOL,0),N)/SUM(IF(TYP=0,返回DIF,否则返回0 VD赋值:如果DIF<0,返回-DIF,否则返回0 MAU1赋值:VU的M1日平滑移动平均 MAD1赋值:VD的M1日平滑移动平均 MAU2赋值:VU的M2日平滑移动平均 ''' DIF=CLOSE-REF(CLOSE,1) VU=IF(DIF>=0,DIF,0) VD=IF(DIF<0,-DIF,0) MAU1=MEMA(VU,M1) MAD1=MEMA(VD,M1) MAU2=MEMA(VU,M2) MAD2=MEMA(VD,M2) RSI1=MA(100*MAU1/(MAU1+MAD1),M1) RSI2=MA(100*MAU2/(MAU2+MAD2),M2) return RSI1,RSI2 ``` ### 16BIAS_QL乖离率-传统版 ``` def BIAS_QL(CLOSE,N=6,M=6): ''' 乖离率-传统版 输出乖离率 :(收盘价-收盘价的N日简单移动平均)/收盘价的N日简单移动平均*100 输出BIASMA :乖离率的M日简单移动平均 ''' BIAS=(CLOSE-MA(CLOSE,N))/MA(CLOSE,N)*100 BIASMA=MA(BIAS,M) return BIAS,BIASMA ``` ### BIAS乖离率 ``` def BIAS(CLOSE,N1=6,N2=12,N3=24): ''' 乖离率 输出BIAS1 :(收盘价-收盘价的N1日简单移动平均)/收盘价的N1日简单移动平均*100 输出BIAS2 :(收盘价-收盘价的N2日简单移动平均)/收盘价的N2日简单移动平均*100 输出BIAS3 :(收盘价-收盘价的N3日简单移动平均)/收盘价的N3日简单移动平均*100 ''' BIAS1=(CLOSE-MA(CLOSE,N1))/MA(CLOSE,N1)*100 BIAS2=(CLOSE-MA(CLOSE,N2))/MA(CLOSE,N2)*100 BIAS3=(CLOSE-MA(CLOSE,N3))/MA(CLOSE,N3)*100 return BIAS1,BIAS2,BIAS3 ``` ### 三六乖离BIAS36 ``` def BIAS36(CLOSE,M=6): ''' 三六乖离 输出三六乖离:收盘价的3日简单移动平均-收盘价的6日简单移动平均 输出BIAS612:收盘价的6日简单移动平均-收盘价的12日简单移动平均 输出MABIAS:BIAS36的M日简单移动平均 ''' BIAS36=MA(CLOSE,3)-MA(CLOSE,6) BIAS612=MA(CLOSE,6)-MA(CLOSE,12) MABIAS=MA(BIAS36,M) return BIAS36,BIAS612,MABIAS ``` ### 幅度涨速ACCER ``` def ACCER(CLOSE,N=8): ''' 幅度涨速 输出幅度涨速:收盘价的N日线性回归斜率/收盘价 ''' ACCER=SLOPE(CLOSE,N)/CLOSE return ACCER ``` ### CYD承接因子 ``` def CYD(CLOSE,CAPITAL,N=21): ''' 承接因子 输出CYDS:以收盘价计算的获利盘比例/(成交量(手)/当前流通股本(手)) 输出CYDN:以收盘价计算的获利盘比例/成交量(手)/当前流通股本(手)的N日简单移动平均 ''' CYDS=WINNER(CLOSE)/(VOL/CAPITAL) CYDN=WINNER(CLOSE)/MA(VOL/CAPITAL,N); return CYDS,CYDN ``` ### CYF市场能量 ``` def CYF(HSL,N=21): ''' 市场能量 输出市场能量:100-100/(1+换手线的N日指数移动平均) ''' CYF=100-100/(1+EMA(HSL,N)) return CYF ``` ### SFL分水岭 ``` def SFL(CLOSE): ''' 分水岭 输出SWL:(收盘价的5日指数移动平均*7+收盘价的10日指数移动平均*3)/10 输出SWS:以1和100*(成交量(手)的5日累和/(3*当前流通股本(手)))的较大值为权重收盘价的12日指数移动平均的动态移动平均 ''' SWL=(EMA(CLOSE,5)*7+EMA(CLOSE,10)*3)/10 IF(100*(SUM(VOL,5)/(3*CAPITAL)>1),100*(SUM(VOL,5)/(3*CAPITAL)),1) SWS=DMA(EMA(CLOSE,12),MAX(1,1)) return SWL,SWS ``` ### ATR真实波幅 ``` def ATR(CLOSE,HIGH,LOW,N=14): ''' 真实波幅 输出MTR:(最高价-最低价)和1日前的收盘价-最高价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值 输出真实波幅:MTR的N日简单移动平均 ''' MTR=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)) ATR=MA(MTR,N) return MTR,ATR ``` ### DKX多空线 ``` def DKX(CLOSE,LOW,OPEN,HIGH,M=10): ''' 多空线 MID赋值:(3*收盘价+最低价+开盘价+最高价)/6 输出多空线:(20*MID+19*1日前的MID+18*2日前的MID+17*3日前的MID+16*4日前的MID+15*5日前的MID+14*6日前的MID+13*7日前的MID+12*8日前的MID+11*9日前的MID+10*10日前的MID+9*11日前的MID+8*12日前的MID+7*13日前的MID+6*14日前的MID+5*15日前的MID+4*16日前的MID+3*17日前的MID+2*18日前的MID+20日前的MID)/210 输出MADKX:DKX的M日简单移动平均 ''' MID=(3*CLOSE+LOW+OPEN+HIGH)/6 DKX=(20*MID+19*REF(MID,1)+18*REF(MID,2)+17*REF(MID,3)+ 16*REF(MID,4)+15*REF(MID,5)+14*REF(MID,6)+ 13*REF(MID,7)+12*REF(MID,8)+11*REF(MID,9)+ 10*REF(MID,10)+9*REF(MID,11)+8*REF(MID,12)+ 7*REF(MID,13)+6*REF(MID,14)+5*REF(MID,15)+ 4*REF(MID,16)+3*REF(MID,17)+2*REF(MID,18)+REF(MID,20))/210 MADKX=MA(DKX,M) return DKX,MADKX ``` ### 2趋势类型 ### ASI振动升降指标 ``` def ASI(OPEN,CLOSE,HIGH,LOW,M1=26,M2=10): ''' 振动升降指标 ''' LC=REF(CLOSE,1) AA=ABS(HIGH-LC) BB=ABS(LOW-LC) CC=ABS(HIGH-REF(LOW,1)) DD=ABS(LC-REF(OPEN,1)) R=IF( (AA>BB) & (AA>CC),AA+BB/2+DD/4,IF( (BB>CC) & (BB>AA),BB+AA/2+DD/4,CC+DD/4)) X=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1)) SI=16*X/R*MAX(AA,BB) ASI=SUM(SI,M1) ASIT=MA(ASI,M2) return ASI,ASIT ``` ### CHO佳庆指标 ``` def CHO(CLOSE,OPEN,LOW,HIGH,VOL,N1=10,N2=20,M=6): ''' 佳庆指标 MID赋值:成交量(手)*(2*收盘价-最高价-最低价)/(最高价+最低价)的历史累和 输出佳庆指标:MID的N1日简单移动平均-MID的N2日简单移动平均 输出MACHO:CHO的M日简单移动平均 ''' MID=SUM(VOL*(2*CLOSE-HIGH-LOW)/(HIGH+LOW),0) CHO=MA(MID,N1)-MA(MID,N2) MACHO=MA(CHO,M) return CHO,MACHO ``` ### DMA_XT平均差 ``` def DMA_XT(CLOSE,N1=10,N2=50,M=10): ''' 平均差 输出DIF:收盘价的N1日简单移动平均-收盘价的N2日简单移动平均 输出DIFMA:DIF的M日简单移动平均 ''' DIF=MA(CLOSE,N1)-MA(CLOSE,N2) DIFMA=MA(DIF,M) return DIF,DIFMA ``` ### DMI趋向指标 ``` def DMI(CLOSE,HIGH,LOW,N=14,M=6): ''' 趋向指标 MTR赋值:最高价-最低价和最高价-1日前的收盘价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值的N日累和 赋值:最高价-1日前的最高价 赋值:1日前的最低价-最低价 DMP赋值:如果HD>0并且HD>LD,返回HD,否则返回0的N日累和 DMM赋值:如果LD>0并且LD>HD,返回LD,否则返回0的N日累和 输出PDI: DMP*100/MTR 输出MDI: DMM*100/MTR 输出ADX: MDI-PDI的绝对值/(MDI+PDI)*100的M日简单移动平均 输出ADXR:(ADX+M日前的ADX)/2 ''' MTR=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(REF(CLOSE,1)-LOW)),N) HD =HIGH-REF(HIGH,1) LD =REF(LOW,1)-LOW list_A=[] list_B=[] for m,n in zip(LD>0,LD>HD): if m==n and m==True: list_A.append(True) else: list_A.append(False) for i,j in zip(LD>0,LD>HD): if i==j and i==True: list_B.append(True) else: list_B.append(False) DMP=SUM(IF(list_A,HD,0),N) DMM=SUM(IF(list_B,LD,0),N) PDI= DMP*100/MTR MDI=DMM*100/MTR ADX=MA(ABS(MDI-PDI)/(MDI+PDI)*100,M) ADXR=(ADX+REF(ADX,M))/2 return PDI,MDI,ADX,ADXR ``` ### DPO区间震荡线 ``` def DPO(CLOSE,N=21,M=6): ''' 区间震荡线 输出区间震荡线:收盘价-N/2+1日前的收盘价的N日简单移动平均 输出MADPO:DPO的M日简单移动平均 ''' #print(REF(MA(CLOSE,N),N/2)) DPO=CLOSE-REF(MA(CLOSE,7),6) MADPO=MA(DPO,M) return DPO,MADPO ``` ### EMV简易波动指标 ``` def EMV(HIGH,LOW,VOL,N=14,M=9): ''' 简易波动指标 VOLUME赋值:成交量(手)的N日简单移动平均/成交量(手) MID赋值:100*(最高价+最低价-1日前的最高价+最低价)/(最高价+最低价) 输出EMV:MID*VOLUME*(最高价-最低价)/最高价-最低价的N日简单移动平均的N日简单移动平均 输出MAEMV:EMV的M日简单移动平均 ''' VOLUME=MA(VOL,N)/VOL MID=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW) EMV=MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N) MAEMV=MA(EMV,M) return EMV,MAEMV ``` ### MACD平滑异同平均线 ``` def MACD(CLOSE,SHORT=12,LONG=26,MID=9): ''' 平滑异同平均线 输出DIF:收盘价的SHORT日指数移动平均-收盘价的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:(DIF-DEA)*2,COLORSTICK ''' DIF=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG) DEA=EMA(DIF,MID) MACD=(DIF-DEA)*2 return DIF,DEA,MACD ``` ### VMACD 量平滑异同平均线 ``` def VMACD(VOL,SHORT=12,LONG=26,MID=9): ''' 量平滑异同平均线 输出DIF:成交量(手)的SHORT日指数移动平均-成交量(手)的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:DIF-DEA,COLORSTICK ''' DIF=EMA(VOL,SHORT)-EMA(VOL,LONG) DEA=EMA(DIF,MID) MACD=DIF-DEA return DIF,DEA,MACD ``` ### SMACD单线平滑异同平均线 ``` def SMACD(CLOSE,SHORT=12,LONG=26,MID=9): ''' 单线平滑异同平均线 DIF赋值:收盘价的SHORT日指数移动平均-收盘价的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:DIF,COLORSTICK ''' DIF=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG) DEA=EMA(DIF,MID) MACD=DIF return DEA,MACD ``` ### QACD快速异同平均线 ``` def QACD(CLOSE,N1=12,N2=12,M=9): ''' 快速异同平均线 输出DIF:收盘价的N1日指数移动平均-收盘价的N2日指数移动平均 输出平滑异同平均线:DIF的M日指数移动平均 输出DDIF:DIF-MACD ''' DIF=EMA(CLOSE,N1)-EMA(CLOSE,N2) MACD=EMA(DIF,M) DDIF=DIF-MACD return DIF,MACD,DDIF ``` ### TRIX三重指数平均线 ``` def TRIX(CLOSE,N=12,M=9): ''' 三重指数平均线 MTR赋值:收盘价的N日指数移动平均的N日指数移动平均的N日指数移动平均 输出三重指数平均线:(MTR-1日前的MTR)/1日前的MTR*100 输出MATRIX:TRIX的M日简单移动平均 ''' MTR=EMA(EMA(EMA(CLOSE,N),N),N) TRIX=(MTR-REF(MTR,1))/REF(MTR,1)*100 MATRIX=MA(TRIX,M) return TRIX,MATRIX ``` ### UOS终极指标 ``` def UOS(CLOSE,HIGH,LOW,N1=7,N2=14,N3=28,M=6): ''' 终极指标 TH赋值:最高价和1日前的收盘价的较大值 TL赋值:最低价和1日前的收盘价的较小值 ACC1赋值:收盘价-TL的N1日累和/TH-TL的N1日累和 ACC2赋值:收盘价-TL的N2日累和/TH-TL的N2日累和 ACC3赋值:收盘价-TL的N3日累和/TH-TL的N3日累和 输出终极指标:(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3) 输出MAUOS:UOS的M日指数平滑移动平均 ''' TH=MAX(HIGH,REF(CLOSE,1)) TL=MIN(LOW,REF(CLOSE,1)) ACC1=SUM(CLOSE-TL,N1)/SUM(TH-TL,N1) ACC2=SUM(CLOSE-TL,N2)/SUM(TH-TL,N2) ACC3=SUM(CLOSE-TL,N3)/SUM(TH-TL,N3) UOS=(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3) MAUOS=EXPMEMA(pd.Series(UOS),M) return UOS,np.array(MAUOS) ``` ### VTP量价曲线 ``` def VTP(CLOSE,VOL,N=51,M=6): ''' 量价曲线 输出量价曲线:成交量(手)*(收盘价-1日前的收盘价)/1日前的收盘价的N日累和 输出MAVPT:VPT的M日简单移动平均 ''' VPT=SUM(VOL*(CLOSE-REF(CLOSE,1))/REF(CLOSE,1),N) MAVP=MA(VPT,M) return VPT,MAVP ``` ### WVAD威廉变异离散量 ``` def WVAD(CLOSE,OPEN,HIGH,LOW,VOL,N=24,M=6): ''' 威廉变异离散量 输出WVAD:(收盘价-开盘价)/(最高价-最低价)*成交量(手)的N日累和/10000 输出MAWVAD:WVAD的M日简单移动平均 ''' WVAD=SUM((CLOSE-OPEN)/(HIGH-LOW)*VOL,N)/10000 MAWVAD=MA(WVAD,M) return WVAD,MAWVAD ``` ###DBQR 对比强弱(需下载日线) ``` def DBQR(CLOSE,N=5,M1=10,M2=20,M3=60): ''' 对比强弱(需下载日线) 输出ZS:(大盘的收盘价-N日前的大盘的收盘价)/N日前的大盘的收盘价 输出GG:(收盘价-N日前的收盘价)/N日前的收盘价 输出MADBQR1:GG的M1日简单移动平均 输出MADBQR2:GG的M2日简单移动平均 输出MADBQR3:GG的M3日简单移动平均 ''' ZS=(INDEXC-REF(INDEXC,N))/REF(INDEXC,N) GG=(CLOSE-REF(CLOSE,N))/REF(CLOSE,N) MADBQR1=MA(GG,M1) MADBQR2=MA(GG,M2) MADBQR3=MA(GG,M3) return ZS,GG,MADBQR1,MADBQR2,MADBQR3 ``` ### JS加数线 ``` def JS(CLOSE,N=5,M1=5,M2=10,M3=20): ''' 加数线 输出加速线:100*(收盘价-N日前的收盘价)/(N*N日前的收盘价) 输出MAJS1:JS的M1日简单移动平均 输出MAJS2:JS的M2日简单移动平均 输出MAJS3:JS的M3日简单移动平均 ''' JS=100*(CLOSE-REF(CLOSE,N))/(N*REF(CLOSE,N)) MAJS1=MA(JS,M1) MAJS2=MA(JS,M2) MAJS3=MA(JS,M3) return JS,MAJS1,MAJS2,MAJS3 ``` ### CYE市场趋势 ``` def CYE(CLOSE): ''' 市场趋势 MAL赋值:收盘价的5日简单移动平均 MAS赋值:收盘价的20日简单移动平均的5日简单移动平均 输出CYEL:(MAL-1日前的MAL)/1日前的MAL*100 输出CYES:(MAS-1日前的MAS)/1日前的MAS*100 ''' MAL=MA(CLOSE,5) MAS=MA(MA(CLOSE,20),5) CYEL=(MAL-REF(MAL,1))/REF(MAL,1)*100 CYES=(MAS-REF(MAS,1))/REF(MAS,1)*100 return CYEL,CYES ``` ### QR 强弱指标(需下载日线) ``` def QR(CLOSE,N=21): ''' 强弱指标(需下载日线) NN赋值:收盘价的有效数据周期数和N的较小值 输出 个股: (收盘价-NN日前的收盘价)/NN日前的收盘价*100 输出 大盘: (大盘的收盘价-NN日前的大盘的收盘价)/NN日前的大盘的收盘价*100 输出 强弱值:个股-大盘的2日指数移动平均,COLORSTICK ''' NN=MIN(BARSCOUNT(CLOSE),N) GG=(CLOSE-REF(CLOSE,NN))/REF(CLOSE,NN)*100 DP=(INDEXC-REF(INDEXC,NN))/REF(INDEXC,NN)*100 value=EMA(GG-DP,2) return GG,DP,value ``` ### GDX轨道线 ``` def GDX(CLOSE,HIGH,LOW,N=30,M=9): ''' 轨道线 AA赋值:(2*收盘价+最高价+最低价)/4-收盘价的N日简单移动平均的绝对值/收盘价的N日简单移动平均 输出 轨道:以AA为权重收盘价的动态移动平均 输出压力线:(1+M/100)*轨道 输出 支撑线:(1-M/100)*轨道 ''' AA=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,N))/MA(CLOSE,N) 轨道 =DMA(AA,0.5) 压力线=(1+M/100)*轨道 支撑线=(1-M/100)*轨道 return 轨道,压力线,支撑线 ``` ### JLHB绝路航标 ``` def JLHB(CLOSE,LOW,N=7,M=5): ''' 绝路航标 VAR1赋值:(收盘价-60日内最低价的最低值)/(60日内最高价的最高值-60日内最低价的最低值)*80 输出 B:VAR1的N日[1日权重]移动平均 输出 VAR2:B的M日[1日权重]移动平均 输出 绝路航标:如果B上穿VAR2ANDB<40,返回50,否则返回0 ''' VAR1=(CLOSE-LLV(LOW,60))/(HHV(HIGH,60)-LLV(LOW,60))*80 B=SMA(VAR1,N,1) VAR2=SMA(B,M,1) 绝路航标=IF(np.logical_and(B,VAR2),50,0) return B,VAR2,绝路航标 ``` ### 3能量类型 ### BRAR情绪指标 ``` def BRAR(OPEN,HIGH,LOW,N=26): ''' 情绪指标 输出BR:0和最高价-1日前的收盘价的较大值的N日累和/0和1日前的收盘价-最低价的较大值的N日累和*100 输出AR:最高价-开盘价的N日累和/开盘价-最低价的N日累和*100 ''' BR=SUM(MAX(0,HIGH-REF(CLOSE,1)),N)/SUM(MAX(0,REF(CLOSE,1)-LOW),N)*100 AR=SUM(HIGH-OPEN,N)/SUM(OPEN-LOW,N)*100 return BR,AR ``` ### CR带状能量线 ``` def CR(HIGH,LOW,N=26,M1=10,M2=20,M3=40,M4=60): ''' 带状能量线 MID赋值:1日前的最高价+最低价/2 输出带状能量线:0和最高价-MID的较大值的N日累和/0和MID-最低价的较大值的N日累和*100 输出MA1:M1/2.5+1日前的CR的M1日简单移动平均 输出均线:M2/2.5+1日前的CR的M2日简单移动平均 输出MA3:M3/2.5+1日前的CR的M3日简单移动平均 输出MA4:M4/2.5+1日前的CR的M4日简单移动平均 ''' MID=REF(HIGH+LOW,1)/2 CR=SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100 MA1=pd.DataFrame(CR).shift(11).mean() MA2=pd.DataFrame(CR).shift(5).mean() MA3=pd.DataFrame(CR).shift(17).mean() MA4=pd.DataFrame(CR).shift(25).mean() return CR,MA1,MA2,MA3,MA4 ``` ### MASS梅斯线 ``` def MASS(HIGH,LOW,N1=9,N2=25,M=6): ''' 梅斯线 输出梅斯线:最高价-最低价的N1日简单移动平均/最高价-最低价的N1日简单移动平均的N1日简单移动平均的N2日累和 输出MAMASS:MASS的M日简单移动平均 ''' MASS=SUM(MA(HIGH-LOW,N1)/MA(MA(HIGH-LOW,N1),N1),N2) MAMASS=MA(MASS,M) return MASS,MAMASS ``` ### PSY心理线 ``` def PSY(CLOSE,N=12,M=6): ''' 心理线 输出PSY:统计N日中满足收盘价>1日前的收盘价的天数/N*100 输出PSYMA:PSY的M日简单移动平均 ''' PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100 PSYMA=MA(PSY,M) return PSY,PSYMA ``` ### VR成交量变异率 ``` def VR(CLOSE,N=26,M=6): ''' 成交量变异率 TH赋值:如果收盘价>1日前的收盘价,返回成交量(手),否则返回0的N日累和 TL赋值:如果收盘价<1日前的收盘价,返回成交量(手),否则返回0的N日累和 TQ赋值:如果收盘价=1日前的收盘价,返回成交量(手),否则返回0的N日累和 输出VR:100*(TH*2+TQ)/(TL*2+TQ) 输出MAVR:VR的M日简单移动平均 ''' TH=SUM(IF(CLOSE>REF(CLOSE,1),VOL,0),N) TL=SUM(IF(CLOSE1日前的收盘价,返回MIDA,否则返回MIDB的历史累和 输出MAWAD:WAD的M日简单移动平均 ''' MIDA=CLOSE-MIN(REF(CLOSE,1),LOW) MIDB=IF(CLOSEREF(CLOSE,1),MIDA,MIDB),0) MAWAD=MA(WAD,M) return WAD,MAWAD ``` ### EXPMEMA指数平滑 ``` def EXPMEMA(CLOSE,M=5): ''' 指数平滑 ''' return pd.Series(CLOSE).ewm(span=M, adjust=False).mean().values ``` ### PCNT输出幅度比 ``` def PCNT(CLOSE,M=5): ''' 输出幅度比:(收盘价-1日前的收盘价)/收盘价*100 输出MAPCNT:PCNT的M日指数平滑移动平均 ''' PCNT=(CLOSE-REF(CLOSE,1))/CLOSE*100 MAPCNT=EXPMEMA(PCNT,M) return PCNT,MAPCNT ``` ### CYR市场强弱 ``` def CYR(AMOUNT,N=13,M=5): ''' 市场强弱 AMOUNT成交量=price*volume DIVE赋值:0.01*成交额(元)的N日指数移动平均/成交量(手)的N日指数移动平均 输出市场强弱:(DIVE/1日前的DIVE-1)*100 输出MACYR:CYR的M日简单移动平均 ''' DIVE=0.01*EMA(AMOUNT,N)/EMA(VOL,N) CYR=(DIVE/REF(DIVE,1)-1)*100 MACYR=MA(CYR,M) return CYR,MACYR ``` ### 4能量型 ### AMO成交金额 ``` def AMO(AMOUNT,M1=5,M2=10): ''' 成交金额 输出AMOW:成交额(元)/10000.0,VOLSTICK 输出AMO1:AMOW的M1日简单移动平均 输出AMO2:AMOW的M2日简单移动平均 ''' AMOW=AMOUNT/10000.0 AMO1=MA(AMOW,M1) AMO2=MA(AMOW,M2) return AMOW,AMO1,AMO2 ``` ### OBV累积能量线 ``` def OBV(VOL,CLOSE,M=30): ''' 累积能量线 VA赋值:如果收盘价>1日前的收盘价,返回成交量(手),否则返回-成交量(手) 输出OBV:如果收盘价=1日前的收盘价,返回0,否则返回VA的历史累和 输出MAOBV:OBV的M日简单移动平均 ''' VA=IF(CLOSE>REF(CLOSE,1),VOL,-VOL) OBV=SUM(IF(CLOSE==REF(CLOSE,1),0,VA),0) MAOBV=MA(OBV,M) return OBV,MAOBV ``` ### VOL_XT成交量 ``` def VOL_XT(VOL,M1=5,M2=10): ''' 成交量 输出VOLUME:成交量(手),VOLSTICK 输出MAVOL1:VOLUME的M1日简单移动平均 输出MAVOL2:VOLUME的M2日简单移动平均 ''' VOLUME=VOL MAVOL1=MA(VOLUME,M1) MAVOL2=MA(VOLUME,M2) return MAVOL1,MAVOL2 ``` ### VRSI相对强弱量 ``` def VRSI(VOL,N1=6,N2=12,N3=24): ''' 相对强弱量 LC赋值:1日前的成交量(手) 输出RSI1:成交量(手)-LC和0的较大值的N1日[1日权重]移动平均/成交量(手)-LC的绝对值的N1日[1日权重]移动平均*100 输出RSI2:成交量(手)-LC和0的较大值的N2日[1日权重]移动平均/成交量(手)-LC的绝对值的N2日[1日权重]移动平均*100 输出RSI3:成交量(手)-LC和0的较大值的N3日[1日权重]移动平均/成交量(手)-LC的绝对值的N3日[1日权重]移动平均*100 ''' LC=REF(VOL,1) RSI1=SMA(MAX(VOL-LC,0),N1,1)/SMA(ABS(VOL-LC),N1,1)*100 RSI2=SMA(MAX(VOL-LC,0),N2,1)/SMA(ABS(VOL-LC),N2,1)*100 RSI3=SMA(MAX(VOL-LC,0),N3,1)/SMA(ABS(VOL-LC),N3,1)*100 return RSI1,RSI2,RSI3 ``` ### HSL换手线 ``` def HSL(HSL,N=5): ''' 换手线 ''' HSL=HSL MAHSL=MA(HSL,N) return HSL,MAHSL ``` ### 5均线系统 ### MA_XT均线 ``` def MA_XT(CLOSE,M1=5,M2=10,M3=20,M4=60): ''' 均线 输出MA1:收盘价的M1日简单移动平均 输出均线:收盘价的M2日简单移动平均 输出MA3:收盘价的M3日简单移动平均 输出MA4:收盘价的M4日简单移动平均 输出MA5:收盘价的M5日简单移动平均 输出MA6:收盘价的M6日简单移动平均 输出MA7:收盘价的M7日简单移动平均 输出MA8:收盘价的M8日简单移动平均 ''' MA1=MA(CLOSE,M1) MA2=MA(CLOSE,M2) MA3=MA(CLOSE,M3) MA4=MA(CLOSE,M4) return MA1,MA2,MA3,MA4 ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) ### **二函数说明** ### 一基础函数 ### 1 RD 四舍五入取3位小数 源代码 ``` def RD(N,D=3): #四舍五入取3位小数 return np.round(N,D) ``` 例子 ``` from xg_tdx_func.xg_tdx_func import * import akshare as ak df=ak.stock_zh_a_daily(symbol='sh600031',start_date='20240101') rd=RD(N=df['close'],D=2) print(rd) ``` 调用的数据 ``` 0 13.76 1 13.63 2 13.49 3 13.41 4 13.25 ... 162 16.31 163 16.38 164 16.35 165 16.43 166 16.13 Name: close, Length: 167, dtype: float64 ``` ### 2RET 返回序列倒数第N个值,默认返回最后一个 ``` def RET(S,N=1): ''' 返回序列倒数第N个值,默认返回最后一个 ''' return np.array(S)[-N] ``` ### 3ABS 返回N的绝对值 ``` def ABS(S): ''' 返回N的绝对值 ''' return np.abs(S) ``` ### 4MIN 序列min ``` def MIN(S1,S2): ''' 序列min ''' return np.minimum(S1,S2) ``` ### 5IF 序列布尔判断 return=A if S==True else B ``` def IF(S,A,B): ''' 序列布尔判断 return=A if S==True else B ''' return np.where(S,A,B) ``` ### 6REF 对序列整体下移动N,返回序列(shift后会产生NAN) ``` def REF(S, N=1): ''' 对序列整体下移动N,返回序列(shift后会产生NAN) ''' return pd.Series(S).shift(N).values ``` ### 7DIFF 前一个值减后一个值,前面会产生nan np.diff(S)直接删除nan,会少一行 ``` def DIFF(S, N=1): ''' 前一个值减后一个值,前面会产生nan np.diff(S)直接删除nan,会少一行 ''' return pd.Series(S).diff(N).values ``` ### 8STD 求序列的N日标准差,返回序列 ``` def STD(S,N): ''' 求序列的N日标准差,返回序列 ''' return pd.Series(S).rolling(N).std(ddof=0).values ``` ### 9SUM 对序列求N天累计和,返回序列 N=0对序列所有依次求和 ``` def SUM(S, N): ''' 对序列求N天累计和,返回序列 N=0对序列所有依次求和 ''' return pd.Series(S).rolling(N).sum().values if N>0 else pd.Series(S).cumsum().values ``` ### 10CONST 返回序列S最后的值组成常量序列 ``` def CONST(S): ''' 返回序列S最后的值组成常量序列 ''' return np.full(len(S),S[-1]) ``` ### 11AND and函数 ``` def AND(S1,S2): #and return np.logical_and(S1,S2) ``` ### 12 OR or选择函数 ``` def OR(S1,S2): #or return np.logical_or(S1,S2) ``` ### 13 NOT not函数 ``` def NOT(S1,S2): ''' not ''' return np.logical_not(S1,S2) ``` ### 14 RANGE 期间函数 B<=A<=C ``` def RANGE(A,B,C): ''' 期间函数 B<=A<=C ''' df=pd.DataFrame() df['select']=A.tolist() df['select']=df['select'].apply(lambda x: True if (x>=B and x<=C) else False) return df['select'] ``` ### 15 HHV HHV(C, 5) 最近5天收盘最高价 ``` def HHV(S,N): ''' HHV(C, 5) 最近5天收盘最高价 ''' return pd.Series(S).rolling(N).max().values ``` ### 16LLV LLV(C, 5) 最近5天收盘最低价 ``` def LLV(S,N): ''' LLV(C, 5) 最近5天收盘最低价 ''' return pd.Series(S).rolling(N).min().values ``` ### 17HHVBARS 求N周期内S最高值到当前周期数, 返回序列 ``` def HHVBARS(S,N): ''' 求N周期内S最高值到当前周期数, 返回序列 ''' return pd.Series(S).rolling(N).apply(lambda x: np.argmax(x[::-1]),raw=True).values ``` ### 18LLVBARS 求N周期内S最低值到当前周期数, 返回序列 ``` def LLVBARS(S,N): ''' 求N周期内S最低值到当前周期数, 返回序列 ''' return pd.Series(S).rolling(N).apply(lambda x: np.argmin(x[::-1]),raw=True).values ``` ### 19MA 求序列的N日简单移动平均值,返回序 ``` def MA(S,N): ''' 求序列的N日简单移动平均值,返回序列 ''' return pd.Series(S).rolling(N).mean().values ``` ### 20EMA 指数移动平均,为了精度 S>4*N EMA至少需要120周期 alpha=2/(span+1) ``` def EMA(S,N): ''' 指数移动平均,为了精度 S>4*N EMA至少需要120周期 alpha=2/(span+1) ''' retur ``` ### 21 SMA SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) ``` def SMA(S, N, M=1): ''' SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) ''' return pd.Series(S).ewm(alpha=M/N,adjust=False).mean().values #com=N-M/M ``` ### 22DMA 求S的动态移动平均,A作平滑因子,必须 0B & A>0 & B>=0 ``` def LAST(S, A, B): ''' 从前A日到前B日一直满足S_BOOL条件, 要求A>B & A>0 & B>=0 ''' return np.array(pd.Series(S).rolling(A+1).apply(lambda x:np.all(x[::-1][B:]),raw=True),dtype=bool) ``` ### 28COUNT COUNT(CLOSE>O, N): 最近N天满足S_BOO的天数 True的天数 ``` def COUNT(S, N): ''' # COUNT(CLOSE>O, N): 最近N天满足S_BOO的天数 True的天数 ''' return SUM(S,N) ``` ### 29EVERY EVERY(CLOSE>O, 5) 最近N天是否都是True ``` def EVERY(S, N): ''' EVERY(CLOSE>O, 5) 最近N天是否都是True ''' return IF(SUM(S,N)==N,True,False) ``` ### 30EXIST EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点 ``` def EXIST(S, N): ''' EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点 ''' return IF(SUM(S,N)>0,True,False) ``` ### 31FILTER FILTER函数,S满足条件后,将其后N周期内的数据置为0, FILTER(C==H,5) ``` def FILTER(S, N): ''' FILTER函数,S满足条件后,将其后N周期内的数据置为0, FILTER(C==H,5) ''' for i in range(len(S)): S[i+1:i+1+N]=0 if S[i] else S[i+1:i+1+N] return S ``` ### 32BARSLAST 上一次条件成立到当前的周期, BARSLAST(C/REF(C,1)>=1.1) 上一次涨停到今天的天数 ``` def BARSLAST(S): ''' 上一次条件成立到当前的周期, BARSLAST(C/REF(C,1)>=1.1) 上一次涨停到今天的天数 ''' M=np.concatenate(([0],np.where(S,1,0))) for i in range(1, len(M)): M[i]=0 if M[i] else M[i-1]+1 return M[1:] ``` ### 33BARSLASTCOUNT 统计连续满足S条件的周期数 BARSLASTCOUNT(CLOSE>OPEN)表示统计连续收阳的周期数 ``` def BARSLASTCOUNT(S): ''' 统计连续满足S条件的周期数 ''' rt = np.zeros(len(S)+1) for i in range(len(S)): rt[i+1]=rt[i]+1 if S[i] else rt[i+1] return rt[1:] ``` ### 34 BARSSINCEN N周期内第一次S条件成立到现在的周期数,N为常量 ``` def BARSSINCEN(S, N): ''' ''' return pd.Series(S).rolling(N).apply(lambda x:N-1-np.argmax(x) if np.argmax(x) or x[0] else 0,raw=True).fillna(0).values.astype(int) ``` ### 35 CROSS 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ``` def CROSS(S1, S2): ''' 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ''' return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) ``` ### 36CROSS_UP 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ``` def CROSS_UP(S1, S2): ''' #判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) ''' return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) ``` ### 37 CROSS_DOWN 判断向上死叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,5),MA(C,10)) ``` def CROSS_DOWN(S1, S2): ''' 判断向上死叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,5),MA(C,10)) ''' return np.concatenate(([False], np.logical_not((S1S2)),dtype=bool) # ``` ### 39 VALUEWHEN 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 ``` def VALUEWHEN(S, X): ''' 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 ''' return pd.Series(np.where(S,X,np.nan)).ffill().values ``` ### 40BACKSET 属于未来函数,将当前位置到若干周期前的数据设为1. 用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0 ``` def BACKSET(X, N): ''' 属于未来函数,将当前位置到若干周期前的数据设为1. 用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLOSE>OPEN,2)若收阳则将该周期及前一周期数值设为1,否则为0 ''' # 创建一个与X相同形状的全零数组 result = np.zeros_like(X) # 遍历X的元素,根据条件设置result的值 for i in range(len(X)): if X[i] != 0: start_index = max(0, i - N + 1) result[start_index:i+1] = 1 return result ``` ### 41 ALIGNRIGHT 有效数据右对齐. 用法: ALIGNRIGHT(X)有效数据向右移动,左边空出来的周期填充无效值 例如:TC:=IF(CURRBARSCOUNT=2 || CURRBARSCOUNT=5,DRAWNULL,C);XC:ALIGNRIGHT(TC);删除了两天的收盘价,并将剩余数据右移 ``` def ALIGNRIGHT(X): ''' 有效数据右对齐. 用法: ALIGNRIGHT(X)有效数据向右移动,左边空出来的周期填充无效值 例如:TC:=IF(CURRBARSCOUNT=2 || CURRBARSCOUNT=5,DRAWNULL,C);XC:ALIGNRIGHT(TC);删除了两天的收盘价,并将剩余数据右移 ''' # 获取有效数据的索引 valid_indices = np.where(X != np.nan)[0] # 计算需要填充的无效数据的数量 invalid_count = len(X) - len(valid_indices) # 创建一个新的数组,将有效数据向右移动,左边填充无效值 result = np.empty_like(X) result[:] = np.nan result[invalid_count:len(valid_indices)+invalid_count] = X[valid_indices] return result ``` ### 42BARSCOUNT 有效数据周期数. 用法: BARSCOUNT(X)第一个有效数据到当前的间隔周期数 注意:判断范围为指标或条件选股计算时公式使用的数据, 如果给画线指标的数据少(比如没有按下箭头取更多K线)或给条件选股给的数据少,这个有效值也可能少 ``` def BARSCOUNT(X): ''' 有效数据周期数. 用法: BARSCOUNT(X)第一个有效数据到当前的间隔周期数 注意:判断范围为指标或条件选股计算时公式使用的数据, 如果给画线指标的数据少(比如没有按下箭头取更多K线)或给条件选股给的数据少,这个有效值也可能少 ''' # 获取有效数据的索引 valid_indices = np.where(~np.isnan(X))[0] # 如果数组中没有有效数据,返回0 if len(valid_indices) == 0: return 0 # 计算第一个有效数据到当前位置的间隔周期数 first_valid_index = valid_indices[0] current_index = len(X) - 1 bars_count = current_index - first_valid_index + 1 return bars_count ``` ### 43BARSLASTS 倒数第N次成立时距今的周期数. 用法: BARSLASTS(X,N):X倒数第N满足到现在的周期数,N支持变量 ``` def BARSLASTS(X, N): ''' 倒数第N次成立时距今的周期数. 用法: BARSLASTS(X,N):X倒数第N满足到现在的周期数,N支持变量 ''' # 获取有效数据的索引 valid_indices = np.where(~np.isnan(X))[0] # 如果数组中没有有效数据,返回-1 if len(valid_indices) == 0: return -1 # 计算倒数第N次满足条件到现在的周期数 last_n_indices = valid_indices[-N:] if len(last_n_indices) < N: return -1 current_index = len(X) - 1 bars_since_last_n = current_index - last_n_indices[-1] + 1 return bars_since_last_n ``` 44 zig ``` def cacal_zig_data(self,x=0.05): ''' 计算之字转向 x=5%之子转向 :return: ''' ZIG_STATE_START = 0 ZIG_STATE_RISE = 1 ZIG_STATE_FALL = 2 df=self.df # print(list(df["close"])) df = df[::-1] df = df.reset_index(drop=True) # df = df.iloc[-100:] x = x k = df["close"] d = df["date"] peer_i = 0 candidate_i = None scan_i = 0 peers = [0] z = np.zeros(len(k)) state = ZIG_STATE_START while True: scan_i += 1 if scan_i == len(k) - 1: # 扫描到尾部 if candidate_i is None: peer_i = scan_i peers.append(peer_i) else: if state == ZIG_STATE_RISE: if k[scan_i] >= k[candidate_i]: peer_i = scan_i peers.append(peer_i) else: peer_i = candidate_i peers.append(peer_i) peer_i = scan_i peers.append(peer_i) elif state == ZIG_STATE_FALL: if k[scan_i] <= k[candidate_i]: peer_i = scan_i peers.append(peer_i) else: peer_i = candidate_i peers.append(peer_i) peer_i = scan_i peers.append(peer_i) break if state == ZIG_STATE_START: if k[scan_i] >= k[peer_i] * (1 + x): candidate_i = scan_i state = ZIG_STATE_RISE elif k[scan_i] <= k[peer_i] * (1 - x): candidate_i = scan_i state = ZIG_STATE_FALL elif state == ZIG_STATE_RISE: if k[scan_i] >= k[candidate_i]: candidate_i = scan_i elif k[scan_i] <= k[candidate_i] * (1 - x): peer_i = candidate_i peers.append(peer_i) state = ZIG_STATE_FALL candidate_i = scan_i elif state == ZIG_STATE_FALL: if k[scan_i] <= k[candidate_i]: candidate_i = scan_i elif k[scan_i] >= k[candidate_i] * (1 + x): peer_i = candidate_i peers.append(peer_i) state = ZIG_STATE_RISE candidate_i = scan_i for i in range(len(peers) - 1): peer_start_i = peers[i] peer_end_i = peers[i + 1] start_value = k[peer_start_i] end_value = k[peer_end_i] a = (end_value - start_value) / (peer_end_i - peer_start_i) # 斜率 for j in range(peer_end_i - peer_start_i + 1): z[j + peer_start_i] = start_value + a * j df['结果']=z return df ``` ### 45WINNER 计算某价位的盈利盘比例 ``` def WINNER(HIGH:Iterable,LOW:Iterable,VOL:Iterable,Turnrate:Iterable,price,avg:Union[Iterable,str]='hlavg')->Optional[np.ndarray]: '''计算某价位的盈利盘比例 :HIGH-最高价[序列值] :LOW-最低价[序列值] :VOL-成交量[序列值],单位是手,万股等不重要,只要统一就行 :Turnrate[换手率]:取值范围0-1,注意50%的换手应写作0.5 *换手率由于流通股变动问题,故不能简单使用“成交量/流通股”的方式计算,这也是本函数保留输入换手率的原因 :price-某价格的盈利比例中的价格,可以是具体数值(如:99.98),也可以是序列(如收盘价、开盘价等) :avg-三角分部顶点:默认取每日最高价和最低价的平均值,某些算法中使用“成交额/成交量”的计算方法 *使用“成交额/成交量”的计算方法的话,注意这个平均位置也要复权,否则会出现平均位置出现在当日最高价和最低价之外的情况 返回一组获利比例的序列值,范围0-1,如0.1即当前股价的盈利比例为10% *此函数专用于T+1交易,不适用于可转债或者非日线周期等换手率超过100的情况 ''' return pyML.WINNER(HIGH,LOW,VOL,Turnrate,price,avg) ``` ### 46COST 计算某盈利比例对应的股价 ``` def COST(HIGH:Iterable,LOW:Iterable,VOL:Iterable,Turnrate:Iterable,winpercent:Iterable,radio:float=0.01,avg:Union[Iterable,str]='hlavg')->Optional[np.ndarray]: '''计算某盈利比例对应的股价 :HIGH-最高价[序列值] :LOW-最低价[序列值] :VOL-成交量[序列值],单位是手,万股等不重要,只要统一就行 :Turnrate[换手率]:取值范围0-1,注意50%的换手应写作0.5 *换手率由于流通股变动问题,故不能简单使用“成交量/流通股”的方式计算,这也是本函数保留输入换手率的原因 :winpercent-指定获利比例,应为0-100之间的数值(如winpercent=90,即返回盈利90%的股价) :avg-三角分部顶点:默认取每日最高价和最低价的平均值,某些算法中使用“成交额/成交量”的计算方法 *使用“成交额/成交量”的计算方法的话,注意这个平均位置也要复权,否则会出现平均位置出现在当日最高价和最低价之外的情况 :radio-精确度:如股票等使用0.01,ETF,Reits等使用0.001 返回一组指定获利比例的股价。 *此函数专用于T+1交易,不适用于可转债或者非日线周期等换手率超过100的情况''' return pyML.COST(HIGH,LOW,VOL,Turnrate,winpercent,radio,avg) ``` ### 47LLVBARS 求上一低点到当前的周期数. ``` def LLVBARS(S:Iterable,N:int)->Optional[np.ndarray]: '''求上一低点到当前的周期数. 用法: LLVBARS(S,N):求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计''' return pyML.LLVBARS(S,N) ``` ### 49 HHVBARS 求上一高点到当前的周期数. ``` def HHVBARS(S:Iterable,N:int)->Optional[np.ndarray]: '''求上一高点到当前的周期数. 用法: HHVBARS(S,N):求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计''' return pyML.HHVBARS(S,N) ``` ### 50 SAR ``` def SAR(cls, ohlc: DataFrame, af: int = 0.02, amax: int = 0.2) -> Series: """SAR stands for “stop and reverse,” which is the actual indicator used in the system. SAR trails price as the trend extends over time. The indicator is below prices when prices are rising and above prices when prices are falling. In this regard, the indicator stops and reverses when the price trend reverses and breaks above or below the indicator.""" high, low = ohlc.high, ohlc.low # Starting values sig0, xpt0, af0 = True, high[0], af _sar = [low[0] - (high - low).std()] for i in range(1, len(ohlc)): sig1, xpt1, af1 = sig0, xpt0, af0 lmin = min(low[i - 1], low[i]) lmax = max(high[i - 1], high[i]) if sig1: sig0 = low[i] > _sar[-1] xpt0 = max(lmax, xpt1) else: sig0 = high[i] >= _sar[-1] xpt0 = min(lmin, xpt1) if sig0 == sig1: sari = _sar[-1] + (xpt1 - _sar[-1]) * af1 af0 = min(amax, af1 + af) if sig0: af0 = af0 if xpt0 > xpt1 else af1 sari = min(sari, lmin) else: af0 = af0 if xpt0 < xpt1 else af1 sari = max(sari, lmax) else: af0 = af sari = xpt0 _sar.append(sari) return pd.Series(_sar, index=ohlc.index) ``` ### **二通达信函数** ### 一超卖超买类 ### 1CCI商品路劲指标 ``` def CCI(CLOSE,HIGH,LOW,N=14): ''' 超卖超买类 CCI商品路劲指标 TYP赋值:(最高价+最低价+收盘价)/3 输出CCI:(TYP-TYP的N日简单移动平均)*1000/(15*TYP的N日平均绝对偏差) ''' TYP=(HIGH+LOW+CLOSE)/3 result=(TYP-MA(TYP,N))*1000/(15*AVEDEV(TYP,N)) return result ``` ### 2KDJ ``` def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3): ''' 超卖超买类 RSV赋值:(收盘价-N日内最低价的最低值)/(N日内最高价的最高值-N日内最低价的最低值)*100 输出K:RSV的M1日[1日权重]移动平均 输出D:K的M2日[1日权重]移动平均 输出J:3*K-2*D ''' RSV=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100 K=SMA(RSV,M1,1) D=SMA(K,M2,1) J=3*K-2*D return K,D,J ``` ### 3MFI最近流量指标 ``` def MFI(CLOSE,HIGH,LOW,VOL,N=14): ''' 最近流量指标 超卖超买类 赋值: (最高价 + 最低价 + 收盘价)/3 V1赋值:如果TYP>1日前的TYP,返回TYP*成交量(手),否则返回0的N日累和/如果TYP<1日前的TYP,返回TYP*成交量(手),否则返回0的N日累和 输出资金流量指标:100-(100/(1+V1)) ''' TYP = (HIGH + LOW + CLOSE)/3 V1=SUM(IF(TYP>REF(TYP,1),TYP*VOL,0),N)/SUM(IF(TYP=0,返回DIF,否则返回0 VD赋值:如果DIF<0,返回-DIF,否则返回0 MAU1赋值:VU的M1日平滑移动平均 MAD1赋值:VD的M1日平滑移动平均 MAU2赋值:VU的M2日平滑移动平均 ''' DIF=CLOSE-REF(CLOSE,1) VU=IF(DIF>=0,DIF,0) VD=IF(DIF<0,-DIF,0) MAU1=MEMA(VU,M1) MAD1=MEMA(VD,M1) MAU2=MEMA(VU,M2) MAD2=MEMA(VD,M2) RSI1=MA(100*MAU1/(MAU1+MAD1),M1) RSI2=MA(100*MAU2/(MAU2+MAD2),M2) return RSI1,RSI2 ``` ### 16BIAS_QL乖离率-传统版 ``` def BIAS_QL(CLOSE,N=6,M=6): ''' 乖离率-传统版 输出乖离率 :(收盘价-收盘价的N日简单移动平均)/收盘价的N日简单移动平均*100 输出BIASMA :乖离率的M日简单移动平均 ''' BIAS=(CLOSE-MA(CLOSE,N))/MA(CLOSE,N)*100 BIASMA=MA(BIAS,M) return BIAS,BIASMA ``` ### BIAS乖离率 ``` def BIAS(CLOSE,N1=6,N2=12,N3=24): ''' 乖离率 输出BIAS1 :(收盘价-收盘价的N1日简单移动平均)/收盘价的N1日简单移动平均*100 输出BIAS2 :(收盘价-收盘价的N2日简单移动平均)/收盘价的N2日简单移动平均*100 输出BIAS3 :(收盘价-收盘价的N3日简单移动平均)/收盘价的N3日简单移动平均*100 ''' BIAS1=(CLOSE-MA(CLOSE,N1))/MA(CLOSE,N1)*100 BIAS2=(CLOSE-MA(CLOSE,N2))/MA(CLOSE,N2)*100 BIAS3=(CLOSE-MA(CLOSE,N3))/MA(CLOSE,N3)*100 return BIAS1,BIAS2,BIAS3 ``` ### 三六乖离BIAS36 ``` def BIAS36(CLOSE,M=6): ''' 三六乖离 输出三六乖离:收盘价的3日简单移动平均-收盘价的6日简单移动平均 输出BIAS612:收盘价的6日简单移动平均-收盘价的12日简单移动平均 输出MABIAS:BIAS36的M日简单移动平均 ''' BIAS36=MA(CLOSE,3)-MA(CLOSE,6) BIAS612=MA(CLOSE,6)-MA(CLOSE,12) MABIAS=MA(BIAS36,M) return BIAS36,BIAS612,MABIAS ``` ### 幅度涨速ACCER ``` def ACCER(CLOSE,N=8): ''' 幅度涨速 输出幅度涨速:收盘价的N日线性回归斜率/收盘价 ''' ACCER=SLOPE(CLOSE,N)/CLOSE return ACCER ``` ### CYD承接因子 ``` def CYD(CLOSE,CAPITAL,N=21): ''' 承接因子 输出CYDS:以收盘价计算的获利盘比例/(成交量(手)/当前流通股本(手)) 输出CYDN:以收盘价计算的获利盘比例/成交量(手)/当前流通股本(手)的N日简单移动平均 ''' CYDS=WINNER(CLOSE)/(VOL/CAPITAL) CYDN=WINNER(CLOSE)/MA(VOL/CAPITAL,N); return CYDS,CYDN ``` ### CYF市场能量 ``` def CYF(HSL,N=21): ''' 市场能量 输出市场能量:100-100/(1+换手线的N日指数移动平均) ''' CYF=100-100/(1+EMA(HSL,N)) return CYF ``` ### SFL分水岭 ``` def SFL(CLOSE): ''' 分水岭 输出SWL:(收盘价的5日指数移动平均*7+收盘价的10日指数移动平均*3)/10 输出SWS:以1和100*(成交量(手)的5日累和/(3*当前流通股本(手)))的较大值为权重收盘价的12日指数移动平均的动态移动平均 ''' SWL=(EMA(CLOSE,5)*7+EMA(CLOSE,10)*3)/10 IF(100*(SUM(VOL,5)/(3*CAPITAL)>1),100*(SUM(VOL,5)/(3*CAPITAL)),1) SWS=DMA(EMA(CLOSE,12),MAX(1,1)) return SWL,SWS ``` ### ATR真实波幅 ``` def ATR(CLOSE,HIGH,LOW,N=14): ''' 真实波幅 输出MTR:(最高价-最低价)和1日前的收盘价-最高价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值 输出真实波幅:MTR的N日简单移动平均 ''' MTR=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)) ATR=MA(MTR,N) return MTR,ATR ``` ### DKX多空线 ``` def DKX(CLOSE,LOW,OPEN,HIGH,M=10): ''' 多空线 MID赋值:(3*收盘价+最低价+开盘价+最高价)/6 输出多空线:(20*MID+19*1日前的MID+18*2日前的MID+17*3日前的MID+16*4日前的MID+15*5日前的MID+14*6日前的MID+13*7日前的MID+12*8日前的MID+11*9日前的MID+10*10日前的MID+9*11日前的MID+8*12日前的MID+7*13日前的MID+6*14日前的MID+5*15日前的MID+4*16日前的MID+3*17日前的MID+2*18日前的MID+20日前的MID)/210 输出MADKX:DKX的M日简单移动平均 ''' MID=(3*CLOSE+LOW+OPEN+HIGH)/6 DKX=(20*MID+19*REF(MID,1)+18*REF(MID,2)+17*REF(MID,3)+ 16*REF(MID,4)+15*REF(MID,5)+14*REF(MID,6)+ 13*REF(MID,7)+12*REF(MID,8)+11*REF(MID,9)+ 10*REF(MID,10)+9*REF(MID,11)+8*REF(MID,12)+ 7*REF(MID,13)+6*REF(MID,14)+5*REF(MID,15)+ 4*REF(MID,16)+3*REF(MID,17)+2*REF(MID,18)+REF(MID,20))/210 MADKX=MA(DKX,M) return DKX,MADKX ``` ### 2趋势类型 ### ASI振动升降指标 ``` def ASI(OPEN,CLOSE,HIGH,LOW,M1=26,M2=10): ''' 振动升降指标 ''' LC=REF(CLOSE,1) AA=ABS(HIGH-LC) BB=ABS(LOW-LC) CC=ABS(HIGH-REF(LOW,1)) DD=ABS(LC-REF(OPEN,1)) R=IF( (AA>BB) & (AA>CC),AA+BB/2+DD/4,IF( (BB>CC) & (BB>AA),BB+AA/2+DD/4,CC+DD/4)) X=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1)) SI=16*X/R*MAX(AA,BB) ASI=SUM(SI,M1) ASIT=MA(ASI,M2) return ASI,ASIT ``` ### CHO佳庆指标 ``` def CHO(CLOSE,OPEN,LOW,HIGH,VOL,N1=10,N2=20,M=6): ''' 佳庆指标 MID赋值:成交量(手)*(2*收盘价-最高价-最低价)/(最高价+最低价)的历史累和 输出佳庆指标:MID的N1日简单移动平均-MID的N2日简单移动平均 输出MACHO:CHO的M日简单移动平均 ''' MID=SUM(VOL*(2*CLOSE-HIGH-LOW)/(HIGH+LOW),0) CHO=MA(MID,N1)-MA(MID,N2) MACHO=MA(CHO,M) return CHO,MACHO ``` ### DMA_XT平均差 ``` def DMA_XT(CLOSE,N1=10,N2=50,M=10): ''' 平均差 输出DIF:收盘价的N1日简单移动平均-收盘价的N2日简单移动平均 输出DIFMA:DIF的M日简单移动平均 ''' DIF=MA(CLOSE,N1)-MA(CLOSE,N2) DIFMA=MA(DIF,M) return DIF,DIFMA ``` ### DMI趋向指标 ``` def DMI(CLOSE,HIGH,LOW,N=14,M=6): ''' 趋向指标 MTR赋值:最高价-最低价和最高价-1日前的收盘价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值的N日累和 赋值:最高价-1日前的最高价 赋值:1日前的最低价-最低价 DMP赋值:如果HD>0并且HD>LD,返回HD,否则返回0的N日累和 DMM赋值:如果LD>0并且LD>HD,返回LD,否则返回0的N日累和 输出PDI: DMP*100/MTR 输出MDI: DMM*100/MTR 输出ADX: MDI-PDI的绝对值/(MDI+PDI)*100的M日简单移动平均 输出ADXR:(ADX+M日前的ADX)/2 ''' MTR=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(REF(CLOSE,1)-LOW)),N) HD =HIGH-REF(HIGH,1) LD =REF(LOW,1)-LOW list_A=[] list_B=[] for m,n in zip(LD>0,LD>HD): if m==n and m==True: list_A.append(True) else: list_A.append(False) for i,j in zip(LD>0,LD>HD): if i==j and i==True: list_B.append(True) else: list_B.append(False) DMP=SUM(IF(list_A,HD,0),N) DMM=SUM(IF(list_B,LD,0),N) PDI= DMP*100/MTR MDI=DMM*100/MTR ADX=MA(ABS(MDI-PDI)/(MDI+PDI)*100,M) ADXR=(ADX+REF(ADX,M))/2 return PDI,MDI,ADX,ADXR ``` ### DPO区间震荡线 ``` def DPO(CLOSE,N=21,M=6): ''' 区间震荡线 输出区间震荡线:收盘价-N/2+1日前的收盘价的N日简单移动平均 输出MADPO:DPO的M日简单移动平均 ''' #print(REF(MA(CLOSE,N),N/2)) DPO=CLOSE-REF(MA(CLOSE,7),6) MADPO=MA(DPO,M) return DPO,MADPO ``` ### EMV简易波动指标 ``` def EMV(HIGH,LOW,VOL,N=14,M=9): ''' 简易波动指标 VOLUME赋值:成交量(手)的N日简单移动平均/成交量(手) MID赋值:100*(最高价+最低价-1日前的最高价+最低价)/(最高价+最低价) 输出EMV:MID*VOLUME*(最高价-最低价)/最高价-最低价的N日简单移动平均的N日简单移动平均 输出MAEMV:EMV的M日简单移动平均 ''' VOLUME=MA(VOL,N)/VOL MID=100*(HIGH+LOW-REF(HIGH+LOW,1))/(HIGH+LOW) EMV=MA(MID*VOLUME*(HIGH-LOW)/MA(HIGH-LOW,N),N) MAEMV=MA(EMV,M) return EMV,MAEMV ``` ### MACD平滑异同平均线 ``` def MACD(CLOSE,SHORT=12,LONG=26,MID=9): ''' 平滑异同平均线 输出DIF:收盘价的SHORT日指数移动平均-收盘价的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:(DIF-DEA)*2,COLORSTICK ''' DIF=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG) DEA=EMA(DIF,MID) MACD=(DIF-DEA)*2 return DIF,DEA,MACD ``` ### VMACD 量平滑异同平均线 ``` def VMACD(VOL,SHORT=12,LONG=26,MID=9): ''' 量平滑异同平均线 输出DIF:成交量(手)的SHORT日指数移动平均-成交量(手)的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:DIF-DEA,COLORSTICK ''' DIF=EMA(VOL,SHORT)-EMA(VOL,LONG) DEA=EMA(DIF,MID) MACD=DIF-DEA return DIF,DEA,MACD ``` ### SMACD单线平滑异同平均线 ``` def SMACD(CLOSE,SHORT=12,LONG=26,MID=9): ''' 单线平滑异同平均线 DIF赋值:收盘价的SHORT日指数移动平均-收盘价的LONG日指数移动平均 输出DEA:DIF的MID日指数移动平均 输出平滑异同平均线:DIF,COLORSTICK ''' DIF=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG) DEA=EMA(DIF,MID) MACD=DIF return DEA,MACD ``` ### QACD快速异同平均线 ``` def QACD(CLOSE,N1=12,N2=12,M=9): ''' 快速异同平均线 输出DIF:收盘价的N1日指数移动平均-收盘价的N2日指数移动平均 输出平滑异同平均线:DIF的M日指数移动平均 输出DDIF:DIF-MACD ''' DIF=EMA(CLOSE,N1)-EMA(CLOSE,N2) MACD=EMA(DIF,M) DDIF=DIF-MACD return DIF,MACD,DDIF ``` ### TRIX三重指数平均线 ``` def TRIX(CLOSE,N=12,M=9): ''' 三重指数平均线 MTR赋值:收盘价的N日指数移动平均的N日指数移动平均的N日指数移动平均 输出三重指数平均线:(MTR-1日前的MTR)/1日前的MTR*100 输出MATRIX:TRIX的M日简单移动平均 ''' MTR=EMA(EMA(EMA(CLOSE,N),N),N) TRIX=(MTR-REF(MTR,1))/REF(MTR,1)*100 MATRIX=MA(TRIX,M) return TRIX,MATRIX ``` ### UOS终极指标 ``` def UOS(CLOSE,HIGH,LOW,N1=7,N2=14,N3=28,M=6): ''' 终极指标 TH赋值:最高价和1日前的收盘价的较大值 TL赋值:最低价和1日前的收盘价的较小值 ACC1赋值:收盘价-TL的N1日累和/TH-TL的N1日累和 ACC2赋值:收盘价-TL的N2日累和/TH-TL的N2日累和 ACC3赋值:收盘价-TL的N3日累和/TH-TL的N3日累和 输出终极指标:(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3) 输出MAUOS:UOS的M日指数平滑移动平均 ''' TH=MAX(HIGH,REF(CLOSE,1)) TL=MIN(LOW,REF(CLOSE,1)) ACC1=SUM(CLOSE-TL,N1)/SUM(TH-TL,N1) ACC2=SUM(CLOSE-TL,N2)/SUM(TH-TL,N2) ACC3=SUM(CLOSE-TL,N3)/SUM(TH-TL,N3) UOS=(ACC1*N2*N3+ACC2*N1*N3+ACC3*N1*N2)*100/(N1*N2+N1*N3+N2*N3) MAUOS=EXPMEMA(pd.Series(UOS),M) return UOS,np.array(MAUOS) ``` ### VTP量价曲线 ``` def VTP(CLOSE,VOL,N=51,M=6): ''' 量价曲线 输出量价曲线:成交量(手)*(收盘价-1日前的收盘价)/1日前的收盘价的N日累和 输出MAVPT:VPT的M日简单移动平均 ''' VPT=SUM(VOL*(CLOSE-REF(CLOSE,1))/REF(CLOSE,1),N) MAVP=MA(VPT,M) return VPT,MAVP ``` ### WVAD威廉变异离散量 ``` def WVAD(CLOSE,OPEN,HIGH,LOW,VOL,N=24,M=6): ''' 威廉变异离散量 输出WVAD:(收盘价-开盘价)/(最高价-最低价)*成交量(手)的N日累和/10000 输出MAWVAD:WVAD的M日简单移动平均 ''' WVAD=SUM((CLOSE-OPEN)/(HIGH-LOW)*VOL,N)/10000 MAWVAD=MA(WVAD,M) return WVAD,MAWVAD ``` ###DBQR 对比强弱(需下载日线) ``` def DBQR(CLOSE,N=5,M1=10,M2=20,M3=60): ''' 对比强弱(需下载日线) 输出ZS:(大盘的收盘价-N日前的大盘的收盘价)/N日前的大盘的收盘价 输出GG:(收盘价-N日前的收盘价)/N日前的收盘价 输出MADBQR1:GG的M1日简单移动平均 输出MADBQR2:GG的M2日简单移动平均 输出MADBQR3:GG的M3日简单移动平均 ''' ZS=(INDEXC-REF(INDEXC,N))/REF(INDEXC,N) GG=(CLOSE-REF(CLOSE,N))/REF(CLOSE,N) MADBQR1=MA(GG,M1) MADBQR2=MA(GG,M2) MADBQR3=MA(GG,M3) return ZS,GG,MADBQR1,MADBQR2,MADBQR3 ``` ### JS加数线 ``` def JS(CLOSE,N=5,M1=5,M2=10,M3=20): ''' 加数线 输出加速线:100*(收盘价-N日前的收盘价)/(N*N日前的收盘价) 输出MAJS1:JS的M1日简单移动平均 输出MAJS2:JS的M2日简单移动平均 输出MAJS3:JS的M3日简单移动平均 ''' JS=100*(CLOSE-REF(CLOSE,N))/(N*REF(CLOSE,N)) MAJS1=MA(JS,M1) MAJS2=MA(JS,M2) MAJS3=MA(JS,M3) return JS,MAJS1,MAJS2,MAJS3 ``` ### CYE市场趋势 ``` def CYE(CLOSE): ''' 市场趋势 MAL赋值:收盘价的5日简单移动平均 MAS赋值:收盘价的20日简单移动平均的5日简单移动平均 输出CYEL:(MAL-1日前的MAL)/1日前的MAL*100 输出CYES:(MAS-1日前的MAS)/1日前的MAS*100 ''' MAL=MA(CLOSE,5) MAS=MA(MA(CLOSE,20),5) CYEL=(MAL-REF(MAL,1))/REF(MAL,1)*100 CYES=(MAS-REF(MAS,1))/REF(MAS,1)*100 return CYEL,CYES ``` ### QR 强弱指标(需下载日线) ``` def QR(CLOSE,N=21): ''' 强弱指标(需下载日线) NN赋值:收盘价的有效数据周期数和N的较小值 输出 个股: (收盘价-NN日前的收盘价)/NN日前的收盘价*100 输出 大盘: (大盘的收盘价-NN日前的大盘的收盘价)/NN日前的大盘的收盘价*100 输出 强弱值:个股-大盘的2日指数移动平均,COLORSTICK ''' NN=MIN(BARSCOUNT(CLOSE),N) GG=(CLOSE-REF(CLOSE,NN))/REF(CLOSE,NN)*100 DP=(INDEXC-REF(INDEXC,NN))/REF(INDEXC,NN)*100 value=EMA(GG-DP,2) return GG,DP,value ``` ### GDX轨道线 ``` def GDX(CLOSE,HIGH,LOW,N=30,M=9): ''' 轨道线 AA赋值:(2*收盘价+最高价+最低价)/4-收盘价的N日简单移动平均的绝对值/收盘价的N日简单移动平均 输出 轨道:以AA为权重收盘价的动态移动平均 输出压力线:(1+M/100)*轨道 输出 支撑线:(1-M/100)*轨道 ''' AA=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,N))/MA(CLOSE,N) 轨道 =DMA(AA,0.5) 压力线=(1+M/100)*轨道 支撑线=(1-M/100)*轨道 return 轨道,压力线,支撑线 ``` ### JLHB绝路航标 ``` def JLHB(CLOSE,LOW,N=7,M=5): ''' 绝路航标 VAR1赋值:(收盘价-60日内最低价的最低值)/(60日内最高价的最高值-60日内最低价的最低值)*80 输出 B:VAR1的N日[1日权重]移动平均 输出 VAR2:B的M日[1日权重]移动平均 输出 绝路航标:如果B上穿VAR2ANDB<40,返回50,否则返回0 ''' VAR1=(CLOSE-LLV(LOW,60))/(HHV(HIGH,60)-LLV(LOW,60))*80 B=SMA(VAR1,N,1) VAR2=SMA(B,M,1) 绝路航标=IF(np.logical_and(B,VAR2),50,0) return B,VAR2,绝路航标 ``` ### 3能量类型 ### BRAR情绪指标 ``` def BRAR(OPEN,HIGH,LOW,N=26): ''' 情绪指标 输出BR:0和最高价-1日前的收盘价的较大值的N日累和/0和1日前的收盘价-最低价的较大值的N日累和*100 输出AR:最高价-开盘价的N日累和/开盘价-最低价的N日累和*100 ''' BR=SUM(MAX(0,HIGH-REF(CLOSE,1)),N)/SUM(MAX(0,REF(CLOSE,1)-LOW),N)*100 AR=SUM(HIGH-OPEN,N)/SUM(OPEN-LOW,N)*100 return BR,AR ``` ### CR带状能量线 ``` def CR(HIGH,LOW,N=26,M1=10,M2=20,M3=40,M4=60): ''' 带状能量线 MID赋值:1日前的最高价+最低价/2 输出带状能量线:0和最高价-MID的较大值的N日累和/0和MID-最低价的较大值的N日累和*100 输出MA1:M1/2.5+1日前的CR的M1日简单移动平均 输出均线:M2/2.5+1日前的CR的M2日简单移动平均 输出MA3:M3/2.5+1日前的CR的M3日简单移动平均 输出MA4:M4/2.5+1日前的CR的M4日简单移动平均 ''' MID=REF(HIGH+LOW,1)/2 CR=SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100 MA1=pd.DataFrame(CR).shift(11).mean() MA2=pd.DataFrame(CR).shift(5).mean() MA3=pd.DataFrame(CR).shift(17).mean() MA4=pd.DataFrame(CR).shift(25).mean() return CR,MA1,MA2,MA3,MA4 ``` ### MASS梅斯线 ``` def MASS(HIGH,LOW,N1=9,N2=25,M=6): ''' 梅斯线 输出梅斯线:最高价-最低价的N1日简单移动平均/最高价-最低价的N1日简单移动平均的N1日简单移动平均的N2日累和 输出MAMASS:MASS的M日简单移动平均 ''' MASS=SUM(MA(HIGH-LOW,N1)/MA(MA(HIGH-LOW,N1),N1),N2) MAMASS=MA(MASS,M) return MASS,MAMASS ``` ### PSY心理线 ``` def PSY(CLOSE,N=12,M=6): ''' 心理线 输出PSY:统计N日中满足收盘价>1日前的收盘价的天数/N*100 输出PSYMA:PSY的M日简单移动平均 ''' PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100 PSYMA=MA(PSY,M) return PSY,PSYMA ``` ### VR成交量变异率 ``` def VR(CLOSE,N=26,M=6): ''' 成交量变异率 TH赋值:如果收盘价>1日前的收盘价,返回成交量(手),否则返回0的N日累和 TL赋值:如果收盘价<1日前的收盘价,返回成交量(手),否则返回0的N日累和 TQ赋值:如果收盘价=1日前的收盘价,返回成交量(手),否则返回0的N日累和 输出VR:100*(TH*2+TQ)/(TL*2+TQ) 输出MAVR:VR的M日简单移动平均 ''' TH=SUM(IF(CLOSE>REF(CLOSE,1),VOL,0),N) TL=SUM(IF(CLOSE1日前的收盘价,返回MIDA,否则返回MIDB的历史累和 输出MAWAD:WAD的M日简单移动平均 ''' MIDA=CLOSE-MIN(REF(CLOSE,1),LOW) MIDB=IF(CLOSEREF(CLOSE,1),MIDA,MIDB),0) MAWAD=MA(WAD,M) return WAD,MAWAD ``` ### EXPMEMA指数平滑 ``` def EXPMEMA(CLOSE,M=5): ''' 指数平滑 ''' return pd.Series(CLOSE).ewm(span=M, adjust=False).mean().values ``` ### PCNT输出幅度比 ``` def PCNT(CLOSE,M=5): ''' 输出幅度比:(收盘价-1日前的收盘价)/收盘价*100 输出MAPCNT:PCNT的M日指数平滑移动平均 ''' PCNT=(CLOSE-REF(CLOSE,1))/CLOSE*100 MAPCNT=EXPMEMA(PCNT,M) return PCNT,MAPCNT ``` ### CYR市场强弱 ``` def CYR(AMOUNT,N=13,M=5): ''' 市场强弱 AMOUNT成交量=price*volume DIVE赋值:0.01*成交额(元)的N日指数移动平均/成交量(手)的N日指数移动平均 输出市场强弱:(DIVE/1日前的DIVE-1)*100 输出MACYR:CYR的M日简单移动平均 ''' DIVE=0.01*EMA(AMOUNT,N)/EMA(VOL,N) CYR=(DIVE/REF(DIVE,1)-1)*100 MACYR=MA(CYR,M) return CYR,MACYR ``` ### 4能量型 ### AMO成交金额 ``` def AMO(AMOUNT,M1=5,M2=10): ''' 成交金额 输出AMOW:成交额(元)/10000.0,VOLSTICK 输出AMO1:AMOW的M1日简单移动平均 输出AMO2:AMOW的M2日简单移动平均 ''' AMOW=AMOUNT/10000.0 AMO1=MA(AMOW,M1) AMO2=MA(AMOW,M2) return AMOW,AMO1,AMO2 ``` ### OBV累积能量线 ``` def OBV(VOL,CLOSE,M=30): ''' 累积能量线 VA赋值:如果收盘价>1日前的收盘价,返回成交量(手),否则返回-成交量(手) 输出OBV:如果收盘价=1日前的收盘价,返回0,否则返回VA的历史累和 输出MAOBV:OBV的M日简单移动平均 ''' VA=IF(CLOSE>REF(CLOSE,1),VOL,-VOL) OBV=SUM(IF(CLOSE==REF(CLOSE,1),0,VA),0) MAOBV=MA(OBV,M) return OBV,MAOBV ``` ### VOL_XT成交量 ``` def VOL_XT(VOL,M1=5,M2=10): ''' 成交量 输出VOLUME:成交量(手),VOLSTICK 输出MAVOL1:VOLUME的M1日简单移动平均 输出MAVOL2:VOLUME的M2日简单移动平均 ''' VOLUME=VOL MAVOL1=MA(VOLUME,M1) MAVOL2=MA(VOLUME,M2) return MAVOL1,MAVOL2 ``` ### VRSI相对强弱量 ``` def VRSI(VOL,N1=6,N2=12,N3=24): ''' 相对强弱量 LC赋值:1日前的成交量(手) 输出RSI1:成交量(手)-LC和0的较大值的N1日[1日权重]移动平均/成交量(手)-LC的绝对值的N1日[1日权重]移动平均*100 输出RSI2:成交量(手)-LC和0的较大值的N2日[1日权重]移动平均/成交量(手)-LC的绝对值的N2日[1日权重]移动平均*100 输出RSI3:成交量(手)-LC和0的较大值的N3日[1日权重]移动平均/成交量(手)-LC的绝对值的N3日[1日权重]移动平均*100 ''' LC=REF(VOL,1) RSI1=SMA(MAX(VOL-LC,0),N1,1)/SMA(ABS(VOL-LC),N1,1)*100 RSI2=SMA(MAX(VOL-LC,0),N2,1)/SMA(ABS(VOL-LC),N2,1)*100 RSI3=SMA(MAX(VOL-LC,0),N3,1)/SMA(ABS(VOL-LC),N3,1)*100 return RSI1,RSI2,RSI3 ``` ### HSL换手线 ``` def HSL(HSL,N=5): ''' 换手线 ''' HSL=HSL MAHSL=MA(HSL,N) return HSL,MAHSL ``` ### 5均线系统 ### MA_XT均线 ``` def MA_XT(CLOSE,M1=5,M2=10,M3=20,M4=60): ''' 均线 输出MA1:收盘价的M1日简单移动平均 输出均线:收盘价的M2日简单移动平均 输出MA3:收盘价的M3日简单移动平均 输出MA4:收盘价的M4日简单移动平均 输出MA5:收盘价的M5日简单移动平均 输出MA6:收盘价的M6日简单移动平均 输出MA7:收盘价的M7日简单移动平均 输出MA8:收盘价的M8日简单移动平均 ''' MA1=MA(CLOSE,M1) MA2=MA(CLOSE,M2) MA3=MA(CLOSE,M3) MA4=MA(CLOSE,M4) return MA1,MA2,MA3,MA4 ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)