十个趋势与反转策略编写与测试

博客介绍了多种期货交易策略的编写,包括三均线、单均线、唐琪安通道等策略,还给出了策略改进实例v1。同时对部分策略进行回测,展示了各策略的报告总汇、累计收益和信号图等信息,策略参数凭经验设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录


所有期货分钟级别以上 数据下载

策略改进实例v1(亏钱改为赚钱) 视频教程


1、策略编写

1.1、三均线策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def 三均线策略_v1(cl):
    """
    此策略为三均线演示策略
    :param cl策略类
    :param cl.klines: k线数据,为df表,0层数据用klines[0]表示
    :param cl.openingdata: 交易数据,为字典,里面有持仓状态,理论持仓数量,开仓价格,开仓时间等
    :param cl.zhanghu: 账户列表
    :param cl.jiaoyishezhi: 为交易设置数据,算法交易,交易合约,其他功能参数都在里面
    :param cl.jiaoyiqidong: 是否启动了交易,为TRUS表示启动
    :return: 输出要在软件上显示的指标
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, cl.klines[0].datetime.values]  # 传递给交易函数用于交易
    riqi = cl.get_riqi(1)
    shijian = cl.get_shijian(1)
    chicang = cl.openingdata['kaicangzhuangtai']  # 持仓状态和持仓数量
    chicangshuliang = cl.openingdata['kaicangshuliang']  # 理论持仓数量
    kaicangjia = cl.openingdata['kaicangjia']  # 开仓价格

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    n1 = cl.jiaoyishezhi[5][1]  # ma1周期
    n2 = cl.jiaoyishezhi[5][2]  # ma2周期
    n3 = cl.jiaoyishezhi[5][3]  # ma3周期
    # 指标计算区
    ma1 = ema_z(Close[-300:], n1)
    ma2 = ema_z(Close[-300:], n2)
    ma3 = ema_z(Close[-300:], n3)
    # # 用ma
    # ma1 = ma_z(Close[-300:], n1)
    # ma2 = ma_z(Close[-300:], n2)
    # ma3 = ema_z(Close[-300:], n2)

    # 交易逻辑执行区
    if chicang <= 0 and ma1[-2] > ma2[-2] and ma2[-2] > ma3[-2]:
        Buy(ss, Open[-1], canshu)
    else:
        if chicang >= 0 and ma1[-2] < ma2[-2] and ma2[-2] < ma3[-2]:
            SellShort(ss,  Open[-1], canshu)

    return ma1[-2], ma2[-2], ma3[-2], 0  # 此处输出的指标会在k线图中和监控界面中显示


1.2、单均线策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def 单均线策略_v1(cl):
    """
    此策略为单均线策略
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    # High = cl.klines[0].high.values   # 最高价np列表
    # Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    # riqi = cl.get_riqi(1)
    # shijian = cl.get_shijian(1)
    理论持仓 = cl.openingdata['kaicangshuliang'] * cl.openingdata['kaicangzhuangtai']
    开仓价格 = cl.openingdata['kaicangjia']  # 开仓价格
    # 参数设置区
    开仓手数 = cl.jiaoyishezhi[5][0]  # 开仓数量
    均线周期 = cl.jiaoyishezhi[5][1]  # ma1周期
    # 指标计算区
    ma1 = ema_z(Close[-300:], 均线周期)
    # 交易逻辑执行区
    if 理论持仓 <= 0 and Open[-2] > ma1[-2] and Close[-2] > ma1[-2]:  # 开盘价和收盘价都要大于均线
        Buy(开仓手数, Open[-1], canshu)  # 平空开多
    else:
        if 理论持仓 >= 0 and Open[-2] < ma1[-2] and Close[-2] < ma1[-2]:  # 开盘价和收盘价都要小于均线
            SellShort(开仓手数, Open[-1], canshu)  # 平多开空

    return round(ma1[-2], 2), 'w', 开仓价格, 理论持仓  # 此处输出的指标会在k线图中和监控界面中显示


1.3、唐琪安通道策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def 唐琪安通道_v1(cl):
    """
    此策略为唐琪安通道突破演示策略
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    chicang = cl.openingdata['kaicangzhuangtai'] *cl.openingdata['kaicangshuliang'] # 持仓状态和持仓数量
    kaicangjia = cl.openingdata['kaicangjia']  # 开仓价格

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    n1 = cl.jiaoyishezhi[5][1]+1  # 高点周期
    n2 = cl.jiaoyishezhi[5][2]+1  # 低点周期
    # print(ss,n1,n2)
    # 指标计算区
    gd = max(High[-n1:-1])
    dd = min(Low[-n2:-1])

    # 交易逻辑执行区
    if chicang <= 0 and High[-1] >= gd:
        Buy(ss, max(Open[-1], gd), canshu)
    else:
        if chicang >= 0 and Low[-1] <= dd:
            SellShort(ss, min(Open[-1], dd), canshu)

    return gd, dd, kaicangjia, 0


1.4、多空线加atr通道出场策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z


def 多空线策略加atr通道出场_v1(cl):
    """
    多空线策略
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    chicang = cl.openingdata['kaicangzhuangtai']  # 持仓状态和持仓数量0,1或-1

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    慢线周期 = cl.jiaoyishezhi[5][1]
    牛熊线周期 = cl.jiaoyishezhi[5][2]
    慢线周期 = 10
    # 指标计算区
    # DKX计算
    MIB = (2 * Close + Low + Open + High) / 5
    MIB = MIB[:-1]
    XD = np.zeros(23)
    j = 20
    kk = 1
    for k in range(0, 20):
        lsbl = j * MIB[:-kk]
        XD = XD + lsbl[-23:]
        j = j - 1
        kk = kk + 1

    dkx = XD / 210
    慢线 = ma_z(dkx, 慢线周期)
    牛熊线 = ma_z(Close, 牛熊线周期)
    # 交易逻辑执行区
    # 开仓
    if chicang <= 0 and dkx[-2] > 慢线[-2] and dkx[-3] < 慢线[-3] and Close[-2]>牛熊线[-2]:
        Buy(ss, Open[-1], canshu)
        # print(ma1.iat[-2],ma2.iat[-2])
    else:
        if chicang >= 0  and dkx[-2] < 慢线[-2] and dkx[-3] > 慢线[-3] and Close[-2]<牛熊线[-2]:
            SellShort(ss,  Open[-1], canshu)

    # dkx平仓
    if chicang > 0 and dkx[-2] < 慢线[-2]:
        Sell(0, Open[-1], canshu)
    else:
        if chicang < 0  and dkx[-2] > 慢线[-2]:
            BuyToCover(0,  Open[-1], canshu)

    # atr通道平仓
    atr = atr_z(High, Low, Open, 10)
    atr上轨 = High[-2] + atr[-2]
    atr下轨 = Low[-2] - atr[-2]
    if chicang > 0 and Close[-2] < atr下轨:  # 平多
        Sell(0, Open[-1], canshu)
    else:
        if chicang < 0  and Close[-2] > atr下轨:  # 平空
            BuyToCover(0,  Open[-1], canshu)

    return dkx[-2], 慢线[-2], atr上轨, atr下轨


1.5、红三兵策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def 红三兵策略_v1(cl):
    """
    连续n根阳线开多,n根阴线开空
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    riqi = cl.get_riqi(1)  # 上一个周期日期
    shijian = cl.get_shijian(1)  # 上一个周期时间
    chicang = cl.openingdata['kaicangzhuangtai']  # 持仓状态和持仓数量

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    n1 = cl.jiaoyishezhi[5][1]  # 周期
    # 指标计算
    n = n1+1
    dd = np.sum(Close[-n:-1] > Open[-n:-1])  # 判断阳线数量
    xx = np.sum(Close[-n:-1] < Open[-n:-1])  # 判断阴线数量
    # 交易逻辑执行区
    if chicang <= 0 and dd >= n1:
        Buy(ss, Open[-1], canshu)  # 平空开多
    else:
        if chicang >= 0 and xx >= n1:
            SellShort(ss, Open[-1], canshu)  # 平多开空

    return dd, xx, 0, 0   # 此处输出的指标会在k线图中和监控界面中显示


1.6、macd策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def macd策略_diff(cl):
    """
    macd,diff策略,diff大于0平空开多,diff小于0平多开空。
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    chicang = cl.openingdata['kaicangzhuangtai'] * cl.openingdata['kaicangshuliang']  # 持仓状态和持仓数量

    # 参数设置区
    手数 = cl.jiaoyishezhi[5][0]  # 开仓数量
    macdzq = cl.jiaoyishezhi[5][1]  # macd短周期
    macdzq2 = cl.jiaoyishezhi[5][2]  # macd长周期

    # 指标计算区
    # if cl.shangcishijian != Datetime[-1]:  # 更新k线时执行,一般用与计算指标
    diff = ema_z(Close[-300:], macdzq) - ema_z(Close[-300:], macdzq2)
    kctj_diff = round(diff[-2], 4)
    # 交易逻辑执行区
    if chicang <= 0 and kctj_diff > 0:
        Buy(手数, Open[-1], canshu)
    else:
        if chicang >= 0 and kctj_diff < 0:
            SellShort(手数, Open[-1], canshu)

    return 'w', kctj_diff, 'w', chicang


1.7、定时清仓策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def 定时清仓策略_v1(cl):
    """
     定时清仓程序
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    chicangshuliang = cl.openingdata['kaicangshuliang']  # 理论持仓数量
    shijian = int(time_to_datetime(Datetime[-1]).time().strftime("%H%M%S"))  # 当前时间
    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 每次开仓数量,0为停止此策略
    清仓时间 = cl.jiaoyishezhi[5][1]  # 时间格式为145500,用的k线时间
    pcpz = cl.jiaoyishezhi[5][2:]  # 排除不平仓的合约

    # zhanghu = cl.zhanghu[cl.jiaoyishezhi[0][0]]  # 开仓账户

    # 初始化,初始化策略,和更新时运行一次
    if 'cczt' not in cl.sjb:  # 初始化时执行一次,用于初始化缓存字典
        cl.sjb['cczt'] = 0  # 持仓状态记录

    # 指标计算区
    if cl.shangcishijian != Datetime[-1]:  # 更新k线时执行,一般用与计算指标
        if shijian == 210000:
            cl.sjb['cczt'] = 0

        if shijian == 清仓时间 and cl.sjb['cczt'] == 0 and cl.jiaoyiqidong:
            cl.sjb['cczt'] = 1
            cc = cl.zhanghu[cl.jiaoyishezhi[0][0]].df_cc
            for i in range(len(cc)):
                if cc['InstrumentID'].iat[i] not in pcpz:
                    if cc['Side'].iat[i] == 0:
                        cl.jiaoyishezhi[3][0] = cc['InstrumentID'].iat[i]  # 交易合约存入交易设置中
                        canshu = [cl.jiaoyiqidong, cl.zhanghu, deepcopy(cl.jiaoyishezhi), cl.openingdata, Datetime]  # 传递给交易函数用于交易
                        Sell_gzxd(int(cc['Position'].iat[i]), 8888, canshu)  # 平多
                        print(shijian, canshu[2][3][0], int(cc['Position'].iat[i]), '平多')
                    else:
                        if cc['Side'].iat[i] == 1:
                            cl.jiaoyishezhi[3][0] = cc['InstrumentID'].iat[i]  # 交易合约存入交易设置中
                            canshu = [cl.jiaoyiqidong, cl.zhanghu, deepcopy(cl.jiaoyishezhi), cl.openingdata, Datetime]  # 传递给交易函数用于交易
                            BuyToCover_gzxd(int(cc['Position'].iat[i]), 8888, canshu)  # 平多
                            print(shijian, canshu[2][3][0], int(cc['Position'].iat[i]), '平空')

    return cl.sjb['cczt'], shijian, 0, 0


1.8、双通道突破回调加仓策略
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

def 双通道突破回调加仓_v1(cl_sj):
    """
    双通道突破回调加仓策略,双通道为均线百分比包络线和收盘价n周期高低点。
    开仓:突破或跌破双通道。
    加仓:开仓后盈利达到百分之2,价格回调到5日均线,然后又突破高点就加仓1次,一直往复。
    平仓:开仓后的最高价回调百分之n平仓,或者反手。
    """
    # 数据初始化,
    Datetime = cl_sj.klines[0].datetime.values  # 时间转换为np列表
    canshu = [cl_sj.jiaoyiqidong, cl_sj.zhanghu, cl_sj.jiaoyishezhi, cl_sj.openingdata, Datetime]  # 传递给交易函数用于交易
    Open = cl_sj.klines[0].open.values
    high = cl_sj.klines[0].high.values
    low = cl_sj.klines[0].low.values
    close = cl_sj.klines[0].close.values
    chicang = cl_sj.openingdata['kaicangzhuangtai']
    kaicangjia = cl_sj.openingdata['kaicangjia']
    riqishijian = str(time_to_datetime(Datetime[-1]))

    # 参数设置区
    SS = cl_sj.jiaoyishezhi[5][0]  # 开仓手数
    MAZQ = cl_sj.jiaoyishezhi[5][1]  # 均线周期
    MATDFD = cl_sj.jiaoyishezhi[5][2]  # MA通道幅度 %
    GDDZQ = cl_sj.jiaoyishezhi[5][3]+1  # 高低点周期
    JCMAZQ = cl_sj.jiaoyishezhi[5][4]  # 加仓均线周期
    PCFD = cl_sj.jiaoyishezhi[5][5]  # 平仓和保本幅度 %
    YLFD = cl_sj.jiaoyishezhi[5][6]  # 达到盈利幅度回调加仓

    # 全局变量的初始化,为空的时候执行
    if 'KCGD' not in cl_sj.sjb:  # 初始化时执行一次,用于初始化缓存字典
        cl_sj.sjb['KCGD'] = [close[-1]]  # 开仓上轨
        cl_sj.sjb['KCDD'] = [close[-1]]  # 开仓下轨
        cl_sj.sjb['JCMA'] = [close[-1]]  # 加仓ma
        cl_sj.sjb['ZGYL'] = 0  # 最高盈利
        cl_sj.sjb['PCJG'] = 0  # 平仓价格
        cl_sj.sjb['HTDMAJS'] = 0  # 回调到均线计数
        cl_sj.sjb['DDYLHJS'] = 0  # 盈利达到计数
        cl_sj.sjb['DQYL'] = 0  # 当前盈利
        cl_sj.sjb['kchgd'] = [0]  # 开仓后最高点
        cl_sj.sjb['kchdd'] = [999999]  # 开仓后最低点
        cl_sj.sjb['kchzq'] = 0  # 开仓后的周期
        cl_sj.sjb['kchbj'] = 1  # 开仓后的标记
        # cl_sj.sjb['fshkcbz'] = 0  # 反手或开仓标志,用于计算开仓后周期

    # 指标计算区
    if cl_sj.shangcishijian != datetime[-1]:  # 更新k线时执行,一般用与计算指标
        MA = ma_z(close[:-1], MAZQ)
        cl_sj.sjb['JCMA'] = ma_z(close[:-1], JCMAZQ)
        MAG = MA[-1]+MA[-1]*(MATDFD*0.01)
        MAD = MA[-1]-MA[-1]*(MATDFD*0.01)
        UP = max(close[-GDDZQ:-1])
        DN = min(close[-GDDZQ:-1])
        cl_sj.sjb['KCGD'].append(max(MAG, UP))
        cl_sj.sjb['KCDD'].append(min(MAD, DN))
        cl_sj.sjb['kchbj'] = 1

        # 求开仓后的周期
        if chicang == 0:
            cl_sj.sjb['kchzq'] = 0
            cl_sj.sjb['fshkcbz'] = 0
        else:
            cl_sj.sjb['kchzq'] = cl_sj.sjb['kchzq'] + 1

    # 交易逻辑执行区
    # 开仓
    if chicang <= 0 and cl_sj.sjb['kchbj'] > 0 and high[-1] > cl_sj.sjb['KCGD'][-1]:  # 开多
        kaicangjia = max(cl_sj.sjb['KCGD'][-1], Open[-1])
        Buy(SS, kaicangjia, canshu)
        cl_sj.sjb['kchbj'] = 0
        cl_sj.sjb['kchzq'] = 0
        cl_sj.sjb['HTDMAJS'] = 0
        cl_sj.sjb['DDYLHJS'] = 0
        chicang = 1
        print(cl_sj.jiaoyishezhi[3][0], riqishijian, '开多:', SS, kaicangjia, '---------------------------------------')

    else:
        if chicang >= 0 and cl_sj.sjb['kchbj'] > 0 and low[-1] < cl_sj.sjb['KCDD'][-1]:  # 开空
            kaicangjia = min(cl_sj.sjb['KCDD'][-1], Open[-1])
            SellShort(SS, kaicangjia, canshu)
            cl_sj.sjb['kchbj'] = 0
            cl_sj.sjb['kchzq'] = 0
            cl_sj.sjb['HTDMAJS'] = 0
            cl_sj.sjb['DDYLHJS'] = 0
            chicang = -1
            print(cl_sj.jiaoyishezhi[3][0], riqishijian, '开空:', SS, kaicangjia, '-----------------------------------')
    # 加仓
    # 加仓条件计算
    if chicang == 1:
        DQYL = (high[-2] - kaicangjia) / kaicangjia * 100  # 当前盈利
        if DQYL > YLFD:
            cl_sj.sjb['DDYLHJS'] = 1  # 达到盈利后计数
        if close[-2] < cl_sj.sjb['JCMA'][-1] and cl_sj.sjb['DDYLHJS'] > 0:
            cl_sj.sjb['HTDMAJS'] = 1  # 价格回调到ma处
    else:
        if chicang == -1:
            DQYL = (kaicangjia - low[-2]) / kaicangjia * 100  # 当前盈利
            if DQYL > YLFD:
                cl_sj.sjb['DDYLHJS'] = 1  # 达到盈利后计数
            if close[-2] > cl_sj.sjb['JCMA'][-1] and cl_sj.sjb['DDYLHJS'] > 0:
                cl_sj.sjb['HTDMAJS'] = 1  # 价格回调到ma处
        else:
            DQYL = 0
            cl_sj.sjb['DDYLHJS'] = 0
            cl_sj.sjb['HTDMAJS'] = 0
        # print(riqishijian, DQYL)
    if chicang == 1 and high[-1]>cl_sj.sjb['KCGD'][-1] and cl_sj.sjb['HTDMAJS']>0 and cl_sj.sjb['DDYLHJS']>0:
        kaicangjia = max(cl_sj.sjb['KCGD'][-1], Open[-1])
        Buy_jjc(SS, kaicangjia, canshu)
        cl_sj.sjb['kchzq'] = 0
        cl_sj.sjb['HTDMAJS'] = 0
        cl_sj.sjb['DDYLHJS'] = 0
        print(cl_sj.jiaoyishezhi[3][0], riqishijian, '加多:', shujuku.hget(cl_sj.openingdata['name'], 'kaicangshuliang'), kaicangjia)
    else:
        if chicang == -1 and low[-1] < cl_sj.sjb['KCDD'][-1] and cl_sj.sjb['HTDMAJS'] > 0 and cl_sj.sjb['DDYLHJS'] > 0:
            kaicangjia = min(cl_sj.sjb['KCDD'][-1], Open[-1])
            SellShort_jjc(SS, kaicangjia, canshu)
            cl_sj.sjb['kchzq'] = 0
            cl_sj.sjb['HTDMAJS'] = 0
            cl_sj.sjb['DDYLHJS'] = 0
            print(cl_sj.jiaoyishezhi[3][0], riqishijian, '加空:', shujuku.hget(cl_sj.openingdata['name'], 'kaicangshuliang'), kaicangjia)

    # 平仓
    # 记录开仓后高低点
    if cl_sj.sjb['kchzq'] == 0:
        cl_sj.sjb['kchgd'] = kaicangjia
        cl_sj.sjb['kchdd'] = kaicangjia
    else:
        if cl_sj.sjb['kchzq'] > 0:
            cl_sj.sjb['kchgd'] = max(cl_sj.sjb['kchgd'], high[-1])
            cl_sj.sjb['kchdd'] = min(cl_sj.sjb['kchdd'], low[-1])

    # print(riqishijian, cl_sj.sjb['kchgd'], cl_sj.sjb['kchdd'])
    if chicang == 1:
        cl_sj.sjb['ZGYL'] = (cl_sj.sjb['kchgd']-kaicangjia)/kaicangjia*100
        cl_sj.sjb['PCJG'] = kaicangjia*(1-PCFD*0.01)  # 平仓价格计算
        if cl_sj.sjb['ZGYL'] > PCFD:
            cl_sj.sjb['PCJG'] = kaicangjia  # 最高盈利到达指定幅度,平仓价格调到指定价
    else:
        if chicang == -1:
            cl_sj.sjb['ZGYL'] = (kaicangjia-cl_sj.sjb['kchdd']) / kaicangjia * 100
            cl_sj.sjb['PCJG'] = kaicangjia * (1 + PCFD * 0.01)  # 平仓价格计算
            if cl_sj.sjb['ZGYL'] > PCFD:
                cl_sj.sjb['PCJG'] = kaicangjia  # 最高盈利到达指定幅度,平仓价格调到指定价
        else:
            cl_sj.sjb['ZGYL'] = close[-1]
            cl_sj.sjb['PCJG'] = close[-1]

    if chicang == 1 and cl_sj.sjb['kchzq'] > 0 and low[-1] <= cl_sj.sjb['PCJG']:
        kaicangjia = min(cl_sj.sjb['PCJG'], Open[-1])
        print(cl_sj.jiaoyishezhi[3][0], riqishijian, '平多:', shujuku.hget(cl_sj.openingdata['name'], 'kaicangshuliang'), kaicangjia)
        Sell(0, kaicangjia, canshu)
        cl_sj.sjb['kchzq'] = 0
    else:
        if chicang == -1 and cl_sj.sjb['kchzq'] > 0 and high[-1] >= cl_sj.sjb['PCJG']:
            kaicangjia = max(cl_sj.sjb['PCJG'], Open[-1])
            print(cl_sj.jiaoyishezhi[3][0], riqishijian, '平空:', shujuku.hget(cl_sj.openingdata['name'], 'kaicangshuliang'), kaicangjia)
            BuyToCover(0, kaicangjia, canshu)
            cl_sj.sjb['kchzq'] = 0

    return cl_sj.sjb['KCGD'][-1], cl_sj.sjb['KCDD'][-1], cl_sj.sjb['PCJG'], cl_sj.sjb['kchzq']


1.9、唐琪安通道加跨周期均线过滤策略

说明:如需开发跨周期或跨品种策略,可以参考此策略进行开发

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z
import tool.MyTT as myttzb

RXZQ = {}  # 按合约储存日线周期k线和指标数据
XIAOSHIZQ = {}  # 按合约储存小时周期k线和指标数据


def 日线周期指标计算_v1(cl):
    """
    日线周期指标计算,用于给下面策略周期调用
    """
    # 数据提取区
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量, 也是控制策略的开关
    n1 = cl.jiaoyishezhi[5][1]  # ma1周期
    n2 = cl.jiaoyishezhi[5][2]  # ma2周期
    交易合约 = cl.jiaoyishezhi[3][0]
    # 指标计算区
    ma1 = myttzb.MA(Close, n1)
    ma2 = myttzb.MA(Close, n2)

    # 数据合并与储存
    df = cl.klines[0]
    df['ma1'] = ma1
    df['ma2'] = ma2
    # 向下移动一位,防止偷价
    df['ma1'] = (df['ma1'].shift(1)).fillna(method='bfill')
    df['ma2'] = (df['ma2'].shift(1)).fillna(method='bfill')
    df = df.set_index(df['datetime'])
    RXZQ[交易合约] = df
    # print(df)
    return 'w', 'w', 'w', 'w'  # 此处输出的指标会在k线图中和监控界面中显示


def 小时周期指标计算_v1(cl):
    """
    小时周期指标计算,用于给下面策略周期调用
    """
    # 数据提取区
    # Open = cl.klines[0].open.values  # 开盘价np列表
    # High = cl.klines[0].high.values   # 最高价np列表
    # Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量, 也是控制策略的开关
    n1 = cl.jiaoyishezhi[5][1]  # ma1周期
    n2 = cl.jiaoyishezhi[5][2]  # ma2周期
    交易合约 = cl.jiaoyishezhi[3][0]
    # 指标计算区
    ma1 = myttzb.MA(Close, n1)
    ma2 = myttzb.MA(Close, n2)

    # 数据合并与储存
    df = cl.klines[0]
    df['ma1'] = ma1
    df['ma2'] = ma2
    # 向下移动一位,防止偷价
    df['ma1'] = (df['ma1'].shift(1)).fillna(method='bfill')
    df['ma2'] = (df['ma2'].shift(1)).fillna(method='bfill')

    df = df.set_index(df['datetime'])
    XIAOSHIZQ[交易合约] = df

    return 'w', 'w', 'w', 'w'  # 此处输出的指标会在k线图中和监控界面中显示


def 唐琪安通道跨周期过滤_v1(cl):
    """
    此策略为唐琪安通道突破演示策略,用日线周期和小时线周期过滤
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表,Close[-1]这样为最新价
    Datetime = cl.klines[0].datetime.values  # 日期时间np列表,为时间戳
    Date = cl.klines[0].date.values  # 日期
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    chicang = cl.openingdata['kaicangzhuangtai'] *cl.openingdata['kaicangshuliang'] # 持仓状态和持仓数量

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    n1 = cl.jiaoyishezhi[5][1]+1  # 高点周期
    n2 = cl.jiaoyishezhi[5][2]+1  # 低点周期
    交易合约 = cl.jiaoyishezhi[3][0]

    # 全局变量的初始化,为空的时候执行
    if '日周期均线' not in cl.sjb:  # 初始化时执行一次,用于初始化缓存字典
        cl.sjb['日周期均线'] = 0
        cl.sjb['时周期均线'] = 0

    # 指标计算区
    gd = max(High[-n1:-1])
    dd = min(Low[-n2:-1])
    try:
        cl.sjb['日周期均线'] = RXZQ[交易合约].loc[Date[-1]]['ma1']
    except:
        pass

    try:
        cl.sjb['时周期均线'] = XIAOSHIZQ[交易合约].loc[Datetime[-1]]['ma1']
    except:
        pass

    # 交易逻辑执行区
    if chicang <= 0 and High[-1] >= gd and Close[-2] > cl.sjb['日周期均线'] and Close[-2] > cl.sjb['时周期均线']:
        Buy(ss, max(Open[-1], gd), canshu)
    else:
        if chicang >= 0 and Low[-1] <= dd and Close[-2] < cl.sjb['日周期均线'] and Close[-2] < cl.sjb['时周期均线']:
            SellShort(ss, min(Open[-1], dd), canshu)

    return gd, dd, cl.sjb['日周期均线'], cl.sjb['时周期均线']



1.10、策略改进实例v1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z
import tool.MyTT as myttzb

def 策略改进实例_v1(cl):
    """
    策略改进实例,均线与回调加仓策略

    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    Open_z = cl.klines[0].open.values / cl.klines[0].fqxs.values
    High = cl.klines[0].high.values  # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表
    Datetime = cl.klines[0].datetime.values  # 日期时间序列
    canshu = [cl.jiaoyiqidong, cl.zhanghu, cl.jiaoyishezhi, cl.openingdata, Datetime]  # 传递给交易函数用于交易
    riqi = cl.get_riqi(0)  # 当前k线日期
    shijian = cl.get_shijian(0)  # 当前k线时间

    持仓数量 = cl.openingdata['kaicangshuliang']
    chicang = cl.openingdata['kaicangzhuangtai'] * 持仓数量  # 持仓状态和持仓数量
    kaicangjia = cl.openingdata['kaicangjia']  # 开仓价格

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    n1 = cl.jiaoyishezhi[5][1]  # ma1周期
    n2 = cl.jiaoyishezhi[5][2]  # ma2周期
    资金 = cl.jiaoyishezhi[5][3]

    账户 = cl.zhanghu[cl.jiaoyishezhi[0][0]]  # 设置的交易账户对象
    交易合约 = cl.jiaoyishezhi[3][0]
    # 全局变量的初始化,为空的时候执行
    if '最小变动' not in cl.sjb:  # 每次策略初始化或更新数据时执行一次,用于在策略运行期间想持久化的数据
        cl.sjb['最小变动'] = 账户.get_zuixiaobiandong(交易合约)
        cl.sjb['加仓次数'] = 0
        cl.sjb['开仓后最大盈亏'] = 0
        cl.sjb['开仓后利润回调'] = 0

    # 指标计算区
    ma1 = ema_z(Close[-300:], n1)
    ma2 = ema_z(Close[-300:], n2)

    if cl.shangcishijian != Datetime[-1]:  # 更新k线时执行,一般用与收盘需要计算的指标

        乘值 = 账户.get_chengzhi(交易合约)
        开仓手数 = max(1, round(资金 / (Open_z[-1] * 乘值 * 0.1)))  # 保证金比例设置的百分之10
        # 交易逻辑执行区
        if chicang <= 0 and Close[-2] > ma2[-2] and ma1[-2] > ma2[-2]:  # and Close[-3] < ma2[-3]
            Buy(开仓手数, Open[-1], canshu)
            cl.sjb['加仓次数'] = 0
            # print('平空开多', riqi,shijian, ss, Open[-1])
        else:
            if chicang >= 0 and Close[-2] < ma2[-2] and ma1[-2] < ma2[-2]:  # and Close[-3] > ma2[-3]
                SellShort(开仓手数, Open[-1], canshu)
                cl.sjb['加仓次数'] = 0
                # print('平多开空', riqi, shijian, ss, Open[-1])

        首次开仓位置 = cl.shoucikaicangjuli + 1
        开仓后最高价 = High[-首次开仓位置:].max()
        开仓后最低价 = Low[-首次开仓位置:].min()

        if chicang > 0:
            cl.sjb['开仓后最大盈亏'] = (开仓后最高价 - kaicangjia) / kaicangjia * 100
            cl.sjb['开仓后利润回调'] = (开仓后最高价 - Close[-2]) / Close[-2] * 100
        elif chicang < 0:
            cl.sjb['开仓后最大盈亏'] = (kaicangjia - 开仓后最低价) / kaicangjia * 100
            cl.sjb['开仓后利润回调'] = (Close[-2] - 开仓后最低价) / Close[-2] * 100

        else:
            cl.sjb['开仓后最大盈亏'] = 0
            cl.sjb['开仓后利润回调'] = 0

        if cl.shangcikaicangjuli > 2 and cl.sjb['加仓次数'] < 1:
            if chicang > 0 and cl.sjb['开仓后最大盈亏'] > 2 and cl.sjb['开仓后利润回调'] > 1:
                Buy_jjc(开仓手数, Open[-1], canshu)
                cl.sjb['加仓次数'] += 1
                # print('平空开多', riqi,shijian, ss, Open[-1])
            else:
                if chicang < 0 and cl.sjb['开仓后最大盈亏'] > 2 and cl.sjb['开仓后利润回调'] > 1:
                    SellShort_jjc(开仓手数, Open[-1], canshu)
                    cl.sjb['加仓次数'] += 1
                    # print('平多开空', riqi, shijian, ss, Open[-1])

        if cl.shoucikaicangjuli > 6:
            if chicang > 0 and Close[-2] < ma2[-2] and Close[-3] < ma2[-3] and Close[-4] < ma2[-4]:
                Sell(持仓数量, Open[-1], canshu)

            else:
                if chicang < 0 and Close[-2] > ma2[-2] and Close[-3] > ma2[-3] and Close[-4] > ma2[-4]:
                    BuyToCover(持仓数量, Open[-1], canshu)

    return ma1[-2], ma2[-2], cl.sjb['开仓后最大盈亏'], chicang  # 此处输出的指标会在k线图中和监控界面中显示


2、上面部分策略回测

策略参数完全凭经验设置。

回测参数如下图:

在这里插入图片描述

回测模式和工作区如下图:

在这里插入图片描述


2.1、三均线策略

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.2、单均线策略

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.3、唐琪安通道策略

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.4、多空线加atr通道出场策略

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.5、红三兵策略(指数砖形图模式回测)

设置:砖形图幅度设置为1%,回测模式设置为8.

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.6、macd策略

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.7、双通道突破回调加仓策略

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述


2.8、唐琪安通道加跨周期均线过滤策略

工作区:

在这里插入图片描述

报告总汇:
 

在这里插入图片描述


累计收益:
 

在这里插入图片描述


信号图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值