目录
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、唐琪安通道加跨周期均线过滤策略
工作区:
报告总汇:
累计收益:
信号图: