首先po一下迅投QMT自带的策略,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
import pandas as pd import numpy as np import datetime """ 示例说明:双均线实盘策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出 """ class a(): pass A = a()
def init(C): A.stock= C.stockcode + '.' + C.market A.acct= account A.acct_type= accountType A.amount = 10000 A.line1=17 A.line2=27 A.waiting_list = [] A.buy_code = 23 if A.acct_type == 'STOCK' else 33 A.sell_code = 24 if A.acct_type == 'STOCK' else 34 C.set_universe([A.stock]) print(f'双均线实盘示例{A.stock} {A.acct} {A.acct_type} 单笔买入金额{A.amount}') 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 account = get_trade_detail_data(A.acct, A.acct_type, 'account') if len(account)==0: print(f'账号{A.acct} 未登录 请检查') return account = account[0] available_cash = int(account.m_dAvailable) if A.waiting_list: found_list = [] orders = get_trade_detail_data(A.acct, A.acct_type, 'order') for order in orders: if order.m_strRemark in A.waiting_list: found_list.append(order.m_strRemark) A.waiting_list = [i for i in A.waiting_list if i not in found_list] if A.waiting_list: print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单") return holdings = get_trade_detail_data(A.acct, A.acct_type, 'position') holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings} data = C.get_history_data(max(A.line1, A.line2)+1, '1d', 'close',dividend_type='front_ratio') close_list = data[A.stock] if len(close_list) < max(A.line1, A.line2)+1: print('行情长度不足(新上市或最近有停牌) 跳过运行') return pre_line1 = np.mean(close_list[-A.line1-1: -1]) pre_line2 = np.mean(close_list[-A.line2-1: -1]) current_line1 = np.mean(close_list[-A.line1:]) current_line2 = np.mean(close_list[-A.line2:]) vol = int(A.amount / close_list[-1] / 100) * 100 if A.amount < available_cash and vol >= 100 and A.stock not in holdings and pre_line1 < pre_line2 and current_line1 > current_line2: msg = f"双均线实盘 {A.stock} 上穿均线 买入 {vol}股" passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 1 , msg, C) print(msg) A.waiting_list.append(msg) if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2: msg = f"双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股" passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 1 , msg, C) print(msg) A.waiting_list.append(msg)
|
解读如下:
这个代码实现了一个基于双均线策略的量化交易系统。以下是代码的主要功能:
1. 策略概述
双均线策略:该策略通过计算两个不同周期的移动平均线(快线和慢线),在快线从下方穿过慢线时(金叉)买入,在快线从上方穿过慢线时(死叉)卖出。
交易品种:代码中交易的品种是用户在模型交易界面选择的股票或融资融券品种。
交易账号:使用用户在模型交易界面选择的账号进行交易。
2. 代码结构
init(C) 函数:初始化函数,设置交易品种、账号、交易金额、快慢线周期等参数,并订阅品种的行情数据。
handlebar(C) 函数:处理每个K线的函数,根据当前的市场行情和持仓情况,判断是否触发买入或卖出信号,并执行相应的交易操作。
3. 主要功能
初始化:
设置交易品种、账号、交易金额、快慢线周期等参数。
订阅品种的行情数据。
行情数据处理:
获取历史收盘价数据,计算快线和慢线的移动平均值。
判断是否满足买入或卖出的条件。
交易执行:
买入条件:当快线从下方穿过慢线(金叉),且当前没有持仓时,执行买入操作。
卖出条件:当快线从上方穿过慢线(死叉),且当前有持仓时,执行卖出操作。
委托管理:
通过 A.waiting_list 管理未查到的委托,防止重复下单。
在每次交易后,将委托信息添加到 A.waiting_list 中,并在查询到委托后从列表中移除。
4. 交易逻辑
买入逻辑:
检查账户可用资金是否足够。
计算买入数量(向下取整到100的整数倍)。
如果满足买入条件,执行买入操作,并记录委托信息。
卖出逻辑:
检查当前是否有持仓。
如果满足卖出条件,执行卖出操作,并记录委托信息。
5. 其他功能
时间过滤:只在交易时间段(09:30:00 到 15:00:00)内执行交易逻辑。
历史K线过滤:跳过非最新的K线,只在最新的K线上执行交易逻辑。
委托查询:在每次交易前,查询是否有未查到的委托,防止重复下单。
6. 输出信息
在初始化时,输出策略的基本信息(如交易品种、账号、交易金额等)。
在每次交易时,输出交易信息(如买入或卖出的股票数量、价格等)。
7. 依赖库
pandas:用于数据处理。
numpy:用于计算移动平均线。
datetime:用于处理时间相关的操作。
总结
这个代码实现了一个基于双均线策略的量化交易系统,通过计算快慢均线的交叉点来判断买入和卖出的时机,并在满足条件时执行相应的交易操作。代码中还包含了委托管理、时间过滤、历史K线过滤等功能,以确保交易的准确性和安全性。
小技巧,我的其他关于qmt的文章
QMT使用指南 开始阅读
国债逆回购-闲钱理财 开始阅读
开户qmt 开始阅读
判断当前时段是交易/非交易/竞价/盘后等时间段 开始阅读
如何判断今天是不是交易日 开始阅读
如何低成本选择讯投QMT 的服务器/电脑,低成本运行? 开始阅读
为什么每天早晨QMT会退出登录/重新启动/自动初始化 开始阅读
迅投QMT量化交易系统服务器连接 中断与再连接 开始阅读
迅投QMT交易系统 延迟 委托/成交/持仓/账号信息延迟 get_trade_detail_data延迟 开始阅读
量化交易策略中如何判断当前MACD是否达到最小值 开始阅读
迅投QMT自带策略-双均线实盘示例PY策略-解读 开始阅读
使用DeepSeek R1大模型编写迅投 QMT 的量化交易 Python 代码 开始阅读
本文更新于2025年2月19日