GithubHelp home page GithubHelp logo

mpquant / mytt Goto Github PK

View Code? Open in Web Editor NEW
1.6K 45.0 545.0 415 KB

MyTT将通达信,同花顺,文华麦语言等指标公式,最简移植到Python中,核心库单个文件,仅百行代码,十几个核心函数,神奇的实现所有常见技术指标算法(不依赖talib库)的纯python实现和转换通达信MACD,RSI,BOLL,ATR,KDJ,CCI,PSY等公式,全部基于pandas函数计算方法封装,简洁且高性能,能非常方便的应用在股票指标公式,股市期货量化框架分析,自动程序化交易,数字货币量化等领域,它是您最精练的股市量化工具。Python library with most stock market indicators.

Python 100.00%
indicators python macd rsi boll atr kdj cci psy btc

mytt's Introduction

MyTT (My麦语言 T通达信 T同花顺)

MyTT是您量化工具箱里的瑞士军刀,精炼而高效,它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标MACD,RSI,BOLL,ATR,KDJ,CCI,PSY等,全部基于numpy和pandas的函数封装,简洁且高性能,能非常方便的应用在各自股票股市技术分析,股票自动程序化交易,数字货币BTC等量化等领域.Mini Python library with most stock market indicators.

license

功能特点

  • 核心库轻量化: 项目库就一个文件 MyTT.py,不用安装设置,可自由裁剪,随用随走 from MyTT import * 即可

  • 代码人类化:) 没有什么炫耀的编程花样,初学者也能看懂,自己就能自行增加指标,马上就能用在项目中。

  • 不需要安装ta-lib库,是纯python代码实现的的核心逻辑,很多人都有安装ta-lib库的痛苦经历

  • 和通达信,同花顺的指标写法完全兼容,一个新的指标基本不用做修改,直接拿来即可使用

  • 超高性能,基本不用循环,全是靠numpy,pandas的内置函数实现各种指标

  • 和Talib库一样是多天参数进,多天指标出(序列进,序列出),便于画图和观察趋势

  • MyTT实现的各种指标和通达信,同花顺,雪球等软件的技术指标一致到小数点后2位

  • MyTT高级进阶版本,收录了高级复杂用法的函数和实验验证函数 MyTT_plus

  • MyTT也能在python2的老版本pandas中使用,请用此python2版本 MyTT_python2

先看一个最简单的例子

#数字货币行情获取和指标计算演示
from  hb_hq_api import *         #数字货币行情库
from  MyTT import *              #myTT麦语言工具函数指标库

#获取btc.usdt交易对120日的数据
df=get_price('btc.usdt',count=120,frequency='1d');     #'1d'是1天, '4h'是4小时

#-----------df结果如下表(股市也基本一样)-------------------------------------------
open close high low vol
2021-05-16 48983.62 47738.24 49800.00 46500.0 1.333333e+09
2021-05-17 47738.24 43342.50 48098.66 42118.0 3.353662e+09
2021-05-18 43342.50 44093.24 45781.52 42106.0 1.793267e+09
#-------有数据了,下面开始正题 -------------
CLOSE=df.close.values;  OPEN=df.open.values           #基础数据定义,只要传入的是序列都可以   
HIGH=df.high.values;    LOW=df.low.values             #例如 CLOSE=list(df.close) 都是一样

MA5=MA(CLOSE,5)                                       #获取5日均线序列
MA10=MA(CLOSE,10)                                     #获取10日均线序列

print('BTC5日均线', MA5[-1] )                          # 只取最后一个数   
print('BTC10日均线',RET(MA10))                         # RET(MA10) == MA10[-1]
print('今天5日线是否上穿10日线',RET(CROSS(MA5,MA10)))
print('最近5天收盘价全都大于10日线吗?',EVERY(CLOSE>MA10,5) )

安装方法

  • 直接拷贝 MyTT.py到你的项目下 from MyTT import * 即可调用文件中的所有函数

  • 传统标准库安装 pip install MyTT

from  MyTT import *                 #声明调用MyTT, 请注意大小写
S=np.random.randint(1,99,[10])      #生成1-99内的10个数序列 
EMA(S,6)                            #对这个序列S进行6周期EMA指数平均计算

教程和案例应用

MyTT库中的部分工具函数

  • n天前的数据:REF
REF(CLOSE, 1)              # 截止到昨天收盘价 序列
  • 移动平均线计算:MA
MA(CLOSE, 5)             # 取得收盘价5日平均线
  • 加权移动平均计算:EMA
EMA(CLOSE, 5)            # 为了精度 ,  EMA至少需要120周期   
  • **式的SMA计算:SMA
SMA(CLOSE, 5)            # 为了精度 ,  SMA至少需要120周期   
  • 返回序列标准差:STD
STD(CLOSE, 5)             # 返回收盘价5日内标准差
  • 平均绝对偏差:AVEDEV
AVEDEV(CLOSE, 5)    # 序列与其平均值的绝对差的平均值
  • 金叉判断:CROSS
CROSS(MA(CLOSE, 5), MA(CLOSE, 10))       #5日均线上穿10日均线
  • 两个序列取最大值,最小值:MAX MIN
MAX(OPEN, CLOSE )                       #K线实体的最高价
  • n天内满足条件的天数:COUNT
COUNT(CLOSE > OPEN, 10)                 #最近10天收阳线的天数
  • n天内全部满足条件的天数:EVERY
EVERY(CLOSE >OPEN, 5)                   #最近5天都是收阳线
  • 从前A日到前B日一直满足条件 :LAST
LAST(CLOSE>OPEN,5,3)                    #5天前到3天前是否都收阳线
  • n天内是否至少满足条件一次:EXIST
EXIST(CLOSE>OPEN, 5)                   #最近5天是否有一天收阳线
  • 上一次条件成立到当前的周期:BARSLAST
BARSLAST(CLOSE/REF(CLOSE)>=1.1)         #上一次涨停到今天的天数
  • 返回序列的线性回归斜率:SLOPE
SLOPE(MA(CLOSE,10),5)                   #得到10日平均线最近5天的斜率(其实就是MA均线的方向)
  • 取回线性回归后的预测值:FORCAST
FORCAST(CLOSE,20)                       #根据最近20日的走势预测明天的收盘价
  • n天内最大值:HHV
HHV(MAX(OPEN, CLOSE), 20)               #最近20天K线实体的最高价
  • n天内最小值:LLV
LLV(MIN(OPEN, CLOSE), 60)              #最近60天K线实体的最低价
  • 条件 IF
IF(OPEN > CLOSE, OPEN, CLOSE)          #如果 开盘>收盘  返回OPEN ,否则返回CLOSE

具体指标的实现,全部基于MyTT库中的工具函数 (更多指标可以自行添加)

def MACD(CLOSE,SHORT=12,LONG=26,M=9):    # EMA的关系,CLOSE取120日,结果能精确到雪球小数点2位
    DIF = EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);  
    DEA = EMA(DIF,M);      MACD=(DIF-DEA)*2
    return RD(DIF),RD(DEA),RD(MACD)
def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3):   
    RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    K = EMA(RSV, (M1*2-1));    D = EMA(K,(M2*2-1));        J=K*3-D*2
    return K, D, J
def RSI(CLOSE, N=24):                     #RSI指标
    DIF = CLOSE-REF(CLOSE,1) 
    return RD(SMA(MAX(DIF,0), N) / SMA(ABS(DIF), N) * 100)  
def WR(CLOSE, HIGH, LOW, N=10, N1=6):    #W&R 威廉指标
    WR = (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    WR1 = (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1)) * 100
    return RD(WR), RD(WR1)
def BIAS(CLOSE,L1=6, L2=12, L3=24):      #BIAS乖离率
    BIAS1 = (CLOSE - MA(CLOSE, L1)) / MA(CLOSE, L1) * 100
    BIAS2 = (CLOSE - MA(CLOSE, L2)) / MA(CLOSE, L2) * 100
    BIAS3 = (CLOSE - MA(CLOSE, L3)) / MA(CLOSE, L3) * 100
    return RD(BIAS1), RD(BIAS2), RD(BIAS3)
def BOLL(CLOSE,N=20, P=2):                #BOLL布林带    
    MID = MA(CLOSE, N); 
    UPPER = MID + STD(CLOSE, N) * P
    LOWER = MID - STD(CLOSE, N) * P
    return RD(UPPER), RD(MID), RD(LOWER)    
def PSY(CLOSE,N=12, M=6):                 #PSY心理线指标
    PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100
    PSYMA=MA(PSY,M)
    return RD(PSY),RD(PSYMA)
def CCI(CLOSE,HIGH,LOW,N=14):            #CCI顺势指标
    TP=(HIGH+LOW+CLOSE)/3
    return (TP-MA(TP,N))/(0.015*AVEDEV(TP,N))
def ATR(CLOSE,HIGH,LOW, N=20):           #真实波动N日平均值
    TR = MAX(MAX((HIGH - LOW), ABS(REF(CLOSE, 1) - HIGH)), ABS(REF(CLOSE, 1) - LOW))
    return MA(TR, N)
def BBI(CLOSE,M1=3,M2=6,M3=12,M4=20):    #BBI多空指标   
    return (MA(CLOSE,M1)+MA(CLOSE,M2)+MA(CLOSE,M3)+MA(CLOSE,M4))/4  
def TAQ(HIGH,LOW,N):                         #唐安奇通道(海龟)交易指标,大道至简,能穿越牛熊
    UP=HHV(HIGH,N);    DOWN=LLV(LOW,N);    MID=(UP+DOWN)/2
    return UP,MID,DOWN
def KTN(CLOSE,HIGH,LOW,N=20,M=10):           #肯特纳交易通道, N选20日,ATR选10日
    MID=EMA((HIGH+LOW+CLOSE)/3,N)
    ATRN=ATR(CLOSE,HIGH,LOW,M)
    UPPER=MID+2*ATRN;   LOWER=MID-2*ATRN
    return UPPER,MID,LOWER   
def TRIX(CLOSE,M1=12, M2=20):                #三重指数平滑平均线
    TR = EMA(EMA(EMA(CLOSE, M1), M1), M1)
    TRIX = (TR - REF(TR, 1)) / REF(TR, 1) * 100
    TRMA = MA(TRIX, M2)
    return TRIX, TRMA
def BRAR(OPEN,CLOSE,HIGH,LOW,M1=26):         #BRAR-ARBR 情绪指标  
    AR = SUM(HIGH - OPEN, M1) / SUM(OPEN - LOW, M1) * 100
    BR = SUM(MAX(0, HIGH - REF(CLOSE, 1)), M1) / SUM(MAX(0, REF(CLOSE, 1) - LOW), M1) * 100
    return AR, BR
def MTM(CLOSE,N=12,M=6):                    #动量指标
    MTM=CLOSE-REF(CLOSE,N);         MTMMA=MA(MTM,M)
    return MTM,MTMMA
def ROC(CLOSE,N=12,M=6):                     #变动率指标
    ROC=100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);    MAROC=MA(ROC,M)
    return ROC,MAROC
def EXPMA(CLOSE,N1=12,N2=50):                #EMA指数平均数指标
    return EMA(CLOSE,N1),EMA(CLOSE,N2);
def OBV(CLOSE,VOL):                          #能量潮指标
    return SUM(IF(CLOSE>REF(CLOSE,1),VOL,IF(CLOSE<REF(CLOSE,1),-VOL,0)),0)/10000
def MFI(CLOSE,HIGH,LOW,VOL,N=14):            #MFI指标是成交量的RSI指标
    TYP = (HIGH + LOW + CLOSE)/3
    V1=SUM(IF(TYP>REF(TYP,1),TYP*VOL,0),N)/SUM(IF(TYP<REF(TYP,1),TYP*VOL,0),N)  
    return 100-(100/(1+V1))    

因为语法的问题 =: 是不能用了,python就是=号 ,条件与是& ,条件或是|

#通达信函数 VAR1:=(C>REF(C,1) AND C>REF(C,2));
 python写法VAR1=( (CLOSE>REF(CLOSE,1)) & (CLOSE>REF(CLOSE,2)) );

# 收盘价在10日均线上 且10日均线在20日均线上
python写法: (C > MA(C, 10)) & (MA(C, 10) > MA(C, 20))

# 收阳线 或 收盘价大于昨收
python写法: (CLOSE > O) | (CLOSE > REF(CLOSE, 1))

BOLL带指标数据获取和做图演示 (上证综指)

up,mid,lower=BOLL(CLOSE)                                        #获取布林带数据 

plt.figure(figsize=(15,8))  
plt.plot(CLOSE,label='上证');    plt.plot(up,label='up');        #画图显示 
plt.plot(mid,label='mid');      plt.plot(lower,label='lower');
Boll线

唐安奇交易通道指标计算和做图演示 (沪深300指数)

up,mid,down=TAQ(HIGH,LOW,20)                                    #获取唐安奇交易通道数据,大道至简,能穿越牛熊
plt.figure(figsize=(15,8))  
plt.plot(CLOSE,label='沪深300指数')                                  
plt.plot(up,label='唐安奇-上轨');     plt.plot(mid,label='唐安奇-中轨');      plt.plot(down,label='唐安奇-下轨')
taq

需安装第三方库(无需ta-lib库,所有指标实现仅需要安装pandas既可)

  • pandas

代码贡献者Contributors

火焰,jqz1226, stanene, bcq

团队其他开源项目 - 如果本项目能帮助到您,请右上角帮我们点亮 ★star 以示鼓励!


加入群聊

股市程序化交易大群,数字货币量化交易探讨, 圈内大咖量化策略分享

全是干货,无闲聊 ,物以类聚,人以群分,一起感受思维碰撞的力量!


Star 历史

Star History Chart

mytt's People

Contributors

75168117 avatar mpquant avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mytt's Issues

HHV和LLV的第二个参数如果是序列应该怎么实现?

下面是一段通达信的代码:
T:=BARSLAST(CROSS(MA5,MA60));{5日均线上穿10均线以来的周期数}
ZDL:=HHV(VOL,T+20);{最大成交量}
ZXL:=LLV(VOL,T);{最小成交量}
YT:=HHV(C,T);{鸭头顶}
A1:=EVERY(C>MA60,T);{收盘价都在MA60以上}

其中HHV、LLV的第二个参数是T的一个序列,这个好像在python中会报错,因为第二个参数不支持序列,请问有什么实现的办法吗?
谢谢了!

贡献两个函数:WMA函数及FORCAST函数

def WMA(X, n):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信WMA, X的N日加权移动平均,算法 Yn = (1*X1+2*X2+3*X3+...+n*Xn)/(1+2+3+...+Xn)
    :param X: 数组。源数据。

    :param n: 整数。周期。
    :return: 数组。X的N日加权移动平均
    """
    weights = np.array(range(1, n + 1))
    w = weights / np.sum(weights)
    S = pd.Series(X)

    res = S.rolling(window=n).apply(lambda x: np.sum(w * x), raw=False).values
    return res


def FORCAST(X, n):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信FORCAST. 返回X的线性回归预测值,n暂时不支持变量
    参考资料:[FORCAST函数的真实含义](http://www.70822.com/soft/sort013/sort03/down-18804.html)
    
    :param X: 数组。源数据。
    :param n: 整数。周期。
    :return: 数组。线性回归预测值
    """
    return 3 * WMA(X, n) - 2 * MA(X, n)

FORCAST函数的实现,很另类,但反复核对,正确无误。

贡献两个函数,filter,sumbars

def sumbars(X, A):
    # type: (np.ndarray, Optional[np.ndarray, float, int]) -> np.ndarray
    """
    通达信SumBars函数的Python实现
    SumBars函数将X向前累加,直到大于等于A, 返回这个区间的周期数。例如SUMBARS(VOL, CAPITAL),求完全换手的周期数。

    :param X: 数组。被累计的源数据。 源数组中不能有小于0的元素。
    :param A: 数组(一组)或者浮点数(一个)或者整数(一个),累加截止的界限数
    :return:  数组。各K线分别对应的周期数
    """
    X = np.flipud(X)  # 倒转
    length = len(X)

    if isinstance(A * 1.0, float):  # 是单值
        A = np.repeat(A, length)  # 转化为数组

    sumbars = np.zeros(length)  # 初始化sumbars为0
    Sigma = np.insert(np.cumsum(X), 0, 0.0)  # 在累加值前面插入一个0.0(元素变多1个,便于引用)

    for i in range(length):
        k = np.searchsorted(Sigma[i + 1:], A[i] + Sigma[i])
        if k < length - i:  # 找到
            sumbars[length - i - 1] = k + 1

    return sumbars.astype(int)


def filter(X, n):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信filter函数,用于过滤连续出现的信号。X满足条件后,将其后n周期内的数据置为0. 例如filter(Close>Open,13)

    :param X: 信号原数组, bool类型
    :param n: 周期
    :return: 处理后的信号数组, bool类型
    """
    i = 0
    while i < len(X):
        if X[i]:
            X[i + 1: i + n + 1] = False  # 其后的n周期数据置为False
            i += n + 1  # 直接跳转到(n+1)个数据之后
        else:
            i += 1
    #
    return X

写的不怎么优雅,但准确性和速度是没有问题的。

价格为小数时,MyTT计算指标精度丢失

In [8]: cs=pd.Series([0.0014206, 0.0014267, 0.0014481, 0.0014968, 0.0015338, 0.001553 ,
   ...:        0.0015419, 0.0015932, 0.0016061, 0.0016428, 0.0015578, 0.0016377,
   ...:        0.0016215, 0.0015671, 0.0015631, 0.0015753, 0.0015723, 0.0015584,
   ...:        0.0015552, 0.0015157, 0.0015386, 0.0015448, 0.0015455, 0.001557 ,
   ...:        0.0015842, 0.0015893, 0.0016561, 0.0018115, 0.0018354, 0.0018405])
   ...: MyTT.BOLL(cs)
Out[8]: 
(array([  nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
        0.002, 0.002, 0.002]),
 array([  nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
        0.002, 0.002, 0.002]),
 array([  nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan, 0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.002, 0.002,
        0.001, 0.001, 0.001]))

对SLOPE函数的修改

myTT中现在的SLOPE函数:

def SLOPE(S, N, RS=False):  # 返S序列N周期回线性回归斜率 (默认只返回斜率,不返回整个直线序列)
    M = pd.Series(S[-N:])
    poly = np.polyfit(M.index, M.values, deg=1)
    Y = np.polyval(poly, M.index)
    if RS:
        return Y[1] - Y[0], Y
    return Y[1] - Y[0]

存在如下问题:
1) 有三个参数,与通达信不一致;
2)违背了array in, array out的原则;
3)写法繁琐

特修改如下:

def SLOPE(S, N):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信SLOPE。返S序列N周期回线性回归斜率,N暂时不支持变量。
    """
    M = pd.Series(S)
    return M.rolling(window=N).apply(lambda y: np.polyfit(y.index, y.values, deg=1)[0], raw=False)

求CR指标,谢谢

这是通达信的参数

MID:=REF(HIGH+LOW+CLOSE,1)/3;
CR:SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100,COLORFF7F27;

CROSS结果不对

使用上穿时,debug肯定是有True的地方,事实结果全是flase
s1 = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,15,16])
s2 = pd.Series([6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,6])
s1 = MA(s1, 3)
s2 = MA(s2, 5)
c = CROSS(s1, s2)

结果全是false

通达信指标的编写,遇到REF问题

你好,使用您的库函数如果编写下面的这两个公式:
VAR1:=(C>REF(C,1) AND C>REF(C,2));
VAR2:=(REF(VAR1,1) AND C<=REF(C,1) AND C>=REF(C,2));

我是这样编写的:
VAR1=(CLOSE>REF(CLOSE,1) & CLOSE>REF(CLOSE,2));
一直出现报错:
TypeError:unsupported operand type(s) for &: 'LinesOperation' and 'LinesOperation'

add BARSLAST

上一次条件成立到当前的周期
BARSLAST(CLOSE/REF(CLOSE)>=1.1) #上一次涨停到今天的天数

CROSS 函数没有顺序性?

测试了一下为什么CROSS(MA(CLOSE, 30), MA(CLOSE, 10))和CROSS(MA(CLOSE, 10), MA(CLOSE, 30)) 返回的结果是一样的呢?
30日线穿过10日线,和10日线穿过30日线按理说应该不一样才对
求解答

FILTER

建议加个filter函数,目前功能很完善,比funcat使用方便准确,多谢,加油

关于DMA函数的定义

看了一下myTT中对DMA函数的定义:

# myTT定义的DMA
def DMA(CLOSE, N1=10, N2=50, M=10):  # 平行线差指标
    DIF = MA(CLOSE, N1) - MA(CLOSE, N2)
    DIF_MA = MA(DIF, M)
    return DIF, DIF_MA

显然,与通达信的动态移动平均函数DMA不是一回事。

为此,给出与通达信完全一致的DMA函数定义:

# jqz1226定义的DMA, 通达信动态移动平均, py3版
def DMA(S, A):
    return pd.Series(S).ewm(alpha=A, adjust=False).mean().values
# jqz1226定义的DMA, 通达信动态移动平均, py2版
def DMA(S, A):
    return pd.ewma(S,com=1.0/A - 1,adjust=False)

为稳定版本,建议拉个开发分支出来

现有的main分支慎重更新,不然追求稳定的项目不大敢引用这个库,怕乱套了。

想法和贡献先在开发分支里实现,验证无误再合并main分支并打版本标签,这样就很清晰了。

怎么引用通达信的dll

公式可以编写,但引用的dll没有源码,能直接像在通达信里绑定dll吗?怎么弄?

请问RET和REF有差别吗?

另外你例子里面数字货币判断今天是否上穿?我看你的CROSS函数是判断穿越包含了上穿和下穿。RET(CROSS())代表上穿吗

py2版SMA函数定义错误

mytt.py的py2版本中,SMA定义为:

def SMA(S, N, M=1):        #**式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)
    return pd.ewma(S,com=N-M,adjust=True)   

已知:
alpha =1/(1+com)

又知道,SMA正确的alpha是M/N
alpha = M/N

容易求出:
com = N/M-1=(N-M)/M

所以,py2中SMA中正确的定义应该是:

def SMA(S, N, M=1):        #**式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)
    return pd.ewma(S,com=((N-M)*1.0)/M,adjust=False)  

或者:

def SMA(S, N, M=1):        #**式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)
    return pd.ewma(S,com=(N*1.0)/M - 1,adjust=False)

注意到画蛇添足地乘以了1.0,是因为直接除,py2中会变成整除。先乘以1.0,int转化为float后,再除,就是正确的了。

已经在一创聚宽验证过了,上述两个修改版,计算结果都是正确的。

CROSS函数计算结果处理错误,修正建议

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:])) # 不使用0级函数,移植方便 by jqz1226

改成:
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:].reset_index(drop=True)))

好哥哥,可以告诉我OBV函数怎么使用吗?

这是函数的参数定义
def OBV(CLOSE,VOL)
我传入收盘价与量的集合,会产生异常。
而我不传集合,每日收盘价和量不会异常,但是返回0.

So! 这个函数到底应该怎么用呢?

SMA函数定义错误

SMA函数正确的写法应该是:

def SMA(S, N, M=1):  # **式的SMA,至少需要120周期才精确,直接定义alpha=m/n
    return pd.Series(S).ewm(alpha=M / N, adjust=True).mean().values

贡献3个函数:量比,钱龙短线指标,钱龙长线指标

def QRR(VOL):  # 量比(Quantity Relative Ratio)
    return (VOL / MA(REF(VOL), 5)).values


def SHO(CLOSE, VOL, N=5):  # 钱龙短线指标(Short)
    VAR1 = MA((VOL - REF(VOL, 1)) / REF(VOL, 1), 5)
    VAR2 = (CLOSE - MA(CLOSE, 24)) / MA(CLOSE, 24) * 100
    SHT = VAR2 * (1 + VAR1)
    SHTMA = MA(SHT, N)
    return SHT, SHTMA


def LON(CLOSE, HIGH, LOW, VOL):  # 钱龙长线指标(Long)
    LC = REF(CLOSE, 1)
    VID = SUM(VOL, 2) / (((HHV(HIGH, 2) - LLV(LOW, 2))) * 100)
    RC = (CLOSE - LC) * VID
    LONG = SUM(RC, 0)
    DIFF = SMA(LONG, 10, 1)
    DEA = SMA(LONG, 20, 1)
    LON = DIFF - DEA
    LONMA = MA(LON, 10)
    return LON, LONMA

求通达信TFILTER函数

过滤连续出现的信号.
用法:TFILTER(买入条件,卖出条件,N);过滤掉买入(卖出)信号发出后,下一个反向信号发出前的所有买入(卖出)信号.

N=1表示仅对买入信号过滤;
N=2表示仅对卖出信号过滤;
N=0表示对买入和卖出信号都过滤,返回1,2表示买入或卖出条件成立;
同一K线上只能有一个信号;

增加一个ZIP之字转向吧

建议加一个ZIP之字转向。
ZIG(K,N),当价格变化超过N%时转向,K表示0:开盘价,1:最高价,2:最低价,3:收盘价,其余:数组信息。
例如:ZIGA(3,5)表示收盘价变化5%的ZIGA转向。

贡献一个相对强弱指标stoch RSI

def STOCHRSI(CLOSE, N=14, S=5, P=3):  # 随机相对强弱指标  Stochastic Relative Strength Index(Stoch RSI)
    RSI_D = RSI(CLOSE, N=N)
    LLV_D = LLV(RSI_D, S)
    HHV_D = HHV(RSI_D, S)
    stochRSI = (RSI_D - LLV_D) / (HHV_D - LLV_D) * 100
    K = MA(stochRSI, P)
    D = MA(K, P)
    return K, D

BARSLAST函数有两个潜在BUG

1 你们BARSLAST要求的参数S_BOOL 只能为ndarray类型,传入pd.Series会报错,还要用户在外面转换一道,建议在函数里面转换
2 BARSLAST返回的是一个值,我还以为是一个序列,那么返回序列的话要怎么改呢?

RSI指标计算

使用RSI指标计算的时候报错:
invalid value encountered in divide
return RD(SMA(MAX(DIF, 0), N) / SMA(ABS(DIF), N) * 100)

这里并不是一直报错,是运行一阵之后偶尔报错

BARSLAST这个函数不是应该返回一个序列吗

BARSLAST这个函数不是应该返回一个序列吗?假设一个列表有2个条件成立的位置,上个条件成立的位置到列表最后一个就是列表最大值,上个条件成立的位置起始点就是返回的最小值

关于REF函数

REF(price,N)N只能是整数,如果N是序列,该如何处理?

错误应该挺多的

刚才测试了HHV和HHVBARS,发现跟通达信不同,你在通达信里面选择一个才上市的日K线少的股票测试一下就知道.,比如301302
HIGH
array([72.99, 64.79, 64.8 , 64.94, 67.21, 63.98, 69.6 , 72.12, 75. ,
72.72, 74.23, 70.33, 68.82, 65.38, 63.89, 66. , 66.52, 64.77,
66.4 , 68.68, 67.58])

HHV(HIGH,5)
array([ nan, nan, nan, nan, 72.99, 67.21, 69.6 , 72.12, 75. ,
75. , 75. , 75. , 75. , 74.23, 74.23, 70.33, 68.82, 66.52,
66.52, 68.68, 68.68])

HHVBARS(HIGH,5)
array([nan, nan, nan, nan, 4., 1., 0., 0., 0., 1., 2., 3., 4.,
3., 4., 4., 4., 1., 2., 0., 1.])

你们看看,这个是需要的结果么,肯定要把nan消除.
应该改成这样,加一个min_periods=1,HHVBARS也类似:

def HHV(S,N): #HHV(C, 5) 最近5天收盘最高价
return pd.Series(S).rolling(N,1).max().values

还有个问题,如果这个N是个序列,比如通达信里面可以这样:
M:=500;
HH1:=HHV(HIGH,M);{高点1}
HP1:=HHVBARS(HIGH,M);{高点1位置}
LL1:=LLV(LOW,M);{低点1}
LP1:=LLVBARS(LOW,M);{低点1位置}

HH2:=HHV(HIGH,LP1);{高点2} # 转成python后,这个LP1是序列,执行这行就崩溃了
HP2:=HHVBARS(HIGH,LP1);{高点2位置}
如果是序列,应该每根K线取对应的LP1里面的值,这个怎么写?没细想,:)

另外还有不少函数没实现,稍微复杂的公式,就发现没法跑

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.