QMT小练习翻译一个通达信T0指标

通达信T0指标

大家在做量化之前,一定研究过通达信的指标吧。有这么一个T0指标,大家应该接触过。

指标网址:
https://www.logic88.cn/37131.html

QMT小练习翻译一个通达信T0指标

图上是指标的效果,黄色五星代表买入,红色五星代表卖出。图片最下面还有指标线。

第一次看到这个指标的时候,我如获珍宝,认为我离发财不远了。第二天,打开通达信,照着指标操作,然后亏钱了。我就纳闷了,指标很好,我也是严格按照信号来交易的,怎么可能亏钱的。于是仔细检查,发现我的操作依据——那些信号,大部分不见了,只有很少几个还在上面。当然,如果照着这几个仅存的信号买的话,还是赚的。

原来,这些信号只能从后向前看。照着操作的话,不一定会赚到钱,最后,赚不到钱的信号消失了。后来,我了解到一个词语——未来函数,就是形容这种情况的。

这个指标的未来函数在哪儿呢?

QMT小练习翻译一个通达信T0指标

红圈的部分,是获取当天的最高价和最低价。盘中时,会出现当天的最高价和最低价,只是这两个价格是不到4小时生成的,也就是在收盘之前还会有变数,因此,发出的信号也会有变数。收盘后,当天的最高价和最低价固定住了,信号也不会再变化了。

翻译成QMT代码

尽管刚才说的那个通达信指标有未来函数,不能无脑拿来赚钱。但是这个指标的支撑线和阻力线公式也是有参考意义的。今天就以支撑线和阻力线为依据,在股价下穿和上穿时发出买卖信号,代码如下:

#encoding:gbk


import pandas as pd
import numpy as np


def init(C):
    #设置标的
    C.trade_code='300750.SZ'
    
def handlebar(C):
    #K线当天的日期
    day = timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d')
    #K线当天的时间
    minute = timetag_to_datetime(C.get_bar_timetag(C.barpos),'%Y%m%d%H%M%S')
    #从这一天开始获取数据
    C.start_time = '20240401'
    #获取数据到这一天结束
    C.end_time = '20240726'
    #获取分钟K线的收盘价
    price_m = C.get_market_data_ex(fields=['close'],stock_code=[C.trade_code],period='1m',start_time=C.start_time,end_time=minute,count=50,dividend_type='front',fill_data=True,subscribe=True)
    #获取日K线的收盘价、最高价和最低价
    price_d = C.get_market_data_ex(fields=['close','high','low'],stock_code=[C.trade_code],period='1d',start_time=C.start_time,end_time=day,count=50,dividend_type='front',fill_data=True,subscribe=True)
    #日K收盘价数组
    DYNAINFO_3 = price_d[C.trade_code]['close'].values
    #日K最高价数组
    DYNAINFO_5 = price_d[C.trade_code]['high'].values
    #日K最低价数组
    DYNAINFO_6 = price_d[C.trade_code]['low'].values
    #以下为与通达信公式一致
    H1 = MAX(DYNAINFO_3,DYNAINFO_5)
    L1 = MIN(DYNAINFO_3,DYNAINFO_6)
    P1 = H1 - L1
    zuli = L1+P1*7/8
    zhicheng = L1+P1*0.5/8
    #发出买入信号
    if LONGCROSS(zhicheng[-21:],price_m[C.trade_code]['close'].values[-21:],2)[-1]:
        print(minute,'买入')
    #发出卖出信号
    if LONGCROSS(price_m[C.trade_code]['close'].values[-21:],zuli[-21:],2)[-1]:
        print(minute,'卖出') 


def MAX(S1,S2):  return np.maximum(S1,S2)
def MIN(S1,S2):  return np.minimum(S1,S2)    #序列min
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:])),dtype=bool)
def LONGCROSS(S1,S2,N):                #两条线维持一定周期后交叉,S1在N周期内都小于S2,本周期从S1下方向上穿过S2时返回1,否则返回0         
    return  np.array(np.logical_and(LAST(S1<S2,N,1),(S1>S2)),dtype=bool)            # N=1时等同于CROSS(S1, S2)

这个策略,用到了mytt库中的函数,为了好好的给大家展示,就没有导入库,而是直接把函数代码粘到了第42-47行。策略比较简单,大多数地方我给做了注释。

运行了一下,买卖信号如下(短时间内信号有些频繁,后期优化一下):

QMT小练习翻译一个通达信T0指标

用同花顺打开检验一下:

下图红圈处是卖出信号

QMT小练习翻译一个通达信T0指标

下图红圈处是买入信号

QMT小练习翻译一个通达信T0指标

效果马马虎虎吧。后续改进改进,再模拟一下,看看能不能成为一个好策略。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/129435
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 1小时前
下一篇 58分钟前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注