开源
macd应该是最有用、也是最多人用的策略了,今天将它开源了。
https://github.com/JizhiXiang/Quant-Strategy/blob/main/qmt_macd%E7%AD%96%E7%95%A5.py
导入包
先导入包,帮你省了很多力气。
A = a()是为了弄一个全局的数据结构,后面可以在任何地方都能用
#encoding:gbk
import talib
import datetime
import numpy as np
# 《macd指标》
# qmt量化交易
# 金叉买入,死叉卖出
# 短时间内不重复下单
# 作者威♥: yiyou888wx
# (可开户、代写)标注来源
# 量化优势:对抗人性、不用盯盘
class a():
pass
A = a()
初始化
def init(C):
# 设置股票代码,上海SH结尾,深圳SZ结尾
A.stock = '000333.SZ'
# 填写自己的账号
A.account = '39001785'
# 设置每次交易的股票数量
A.volume = 100
# 设置k线周期
A.period = '1h'
# 1小时(3600秒)内不重复下单
A.trade_time = 3600
# macd参数配置
# 分别是短周期、长周期、移动平均周期
A.param1,A.param2,A.param3 = 12, 26, 9
# 代码自动下载有用的历史数据,这样无需手动下载
end = datetime.date.today()
# 根据你的周期来,days可需改
start = end - datetime.timedelta(days=10)
start = start.strftime('%Y%m%d')
end = end.strftime('%Y%m%d')
download_history_data(A.stock, A.period, start, end)
# 账号、资金情况
account = get_trade_detail_data(A.account, 'STOCK', 'account')
if len(account)==0:
print(f'账号{A.account} 未登录 请检查')
return
account = account[0]
# 可用资金
available_cash = int(account.m_dAvailable)
# 总资金
total_cash = int(account.m_dBalance)
print('【【账户信息】】')
print(f'账户:{A.account}, 总资金:{total_cash}, 可用资金:{available_cash}')
# 初始化上次成交时间为 None
A.last_trade_time = None
每次处理
默认3秒种处理一次
def handlebar(C):
# 只处理最新数据传来的时候
if not C.is_last_bar():
return
now = datetime.datetime.now()
now_time = now.strftime('%H%M%S')
#跳过非交易时间
if now_time < '093000' or now_time > "150000":
return
stock_data_df = C.get_market_data(['close'],[A.stock], A.period, count=50)
stock_data_closes = np.array(stock_data_df['close'])
#print(f'stock_data_closes:{stock_data_closes[-5:]}')
print(f'股票:{A.stock},当前价格:{stock_data_closes[-1]:.2f}')
# 数据太少 报错!
if len(stock_data_closes)<50:
print('【错误】k线数据不足,无法计算!')
return
dif, dea, macd = talib.MACD(stock_data_closes, fastperiod=A.param1,
slowperiod=A.param2, signalperiod=A.param3)
#print(f'macd: {macd[-5:]}')
# 当前时间
current_time = datetime.datetime.now()
# 金叉
if macd[-2]<0 and macd[-1]>=0:
print(f'进入金叉状态')
# 如果 last_trade_time 为 None,或者距离上次成交时间超过1小时
if A.last_trade_time is None or (current_time - A.last_trade_time).total_seconds() > A.trade_time:
print(f'买入{A.stock}股票,数量:{A.volume},请保证资金充足!')
passorder(23,1101,A.account,A.stock,14,-1,A.volume,2,C)
# 记录当前时间
A.last_trade_time = current_time
else:
print(f'一小时内有过交易,不再处理')
# 死叉
if macd[-2]>0 and macd[-1]<=0:
print(f'进入死叉状态')
# 如果 last_trade_time 为 None,或者距离上次成交时间超过1小时
if A.last_trade_time is None or (current_time - A.last_trade_time).total_seconds() > A.trade_time:
print(f'卖出{A.stock}股票,数量:{A.volume},请保证有持仓!')
passorder(24,1101,A.account,A.stock,14,-1,A.volume,2,C)
# 记录当前时间
A.last_trade_time = current_time
else:
print(f'一小时内有过交易,不再处理')