QMT的交易示例中《调整至目标持仓Demo》的bug代码梳理

2023-11-05

#encoding:gbk

'''
调仓到指定篮子
'''

import pandas as pd
import numpy as np
import time
from datetime import timedelta,datetime

#自定义类 用来保存状态 
class a(object):
	def __init__(self):
		#初始化委托状态记录容器
		self.waiting_dict = {}
		self.all_order_ref_dict = {}
		#撤单间隔 单位秒 超过间隔未成交的委托撤回重报
		self.withdraw_secs = 30
		#定义策略开始结束时间 在两者间时进行下单判断 其他时间跳过
		self.start_time = '093000'
		self.end_time = '150000'
A=a()


def init(C):
	'''读取目标仓位 字典格式 品种代码:持仓股数, 可以读本地文件/数据库,当前在代码里写死,600000.SH浦发银行,000001.SZ平安银行'''
	A.final_dict = {"600000.SH" :300, '000001.SZ' : 200}
	'''设置交易账号 acount accountType是界面上选的账号 账号类型'''
	A.acct = account
	A.acct_type = accountType
	#定时器 定时触发指定函数
	C.run_time("f","1nSecond","2019-10-14 13:20:00","SH")  #pengxuan_note:官方文档中只有4个参数,这里有5个,最后一个是没用的,也没有报错不知道什么原因


def f(C):
	'''定义定时触发的函数 入参是ContextInfo对象'''
	#记录本次调用时间戳
	t0 = time.time()
	final_dict=A.final_dict
	#本次运行时间字符串
	now = datetime.now()
	now_timestr = now.strftime("%H%M%S")
	#跳过非交易时间 pengxuan_note:未判断中午11:30:00——13:00:00之间的休市时间
	if now_timestr < A.start_time or now_timestr > A.end_time:
		return
	#获取账号信息
	acct = get_trade_detail_data(A.acct, A.acct_type, 'account')
	if len(acct) == 0:
		print(A.acct, '账号未登录 停止委托')
		return
	acct = acct[0]
	#获取可用资金
	available_cash = acct.m_dAvailable
	print(now, '可用资金', available_cash)
	#获取持仓信息
	position_list = get_trade_detail_data(A.acct, A.acct_type, 'position')
	#持仓数据 组合为字典
	position_dict = {i.m_strInstrumentID + '.' + i.m_strExchangeID : int(i.m_nVolume) for i in position_list}
	position_dict_available = {i.m_strInstrumentID + '.' + i.m_strExchangeID : int(i.m_nCanUseVolume) for i in position_list}
	#未持有的品种填充持股数0
	not_in_position_stock_dict = {i : 0 for i in final_dict if i not in position_dict}
	position_dict.update(not_in_position_stock_dict)
	#print(position_dict)
	stock_list = list(position_dict.keys())
	# print(stock_list)
	#获取全推行情
	full_tick = C.get_full_tick(stock_list)
	#print('fulltick', full_tick)
	#更新持仓状态记录
	refresh_waiting_dict(C)
	#撤超时委托
	order_list = get_trade_detail_data(A.acct, 'stock', 'order')
	if '091500'<= now_timestr <= '093000':#指定的范围內不撤单
		pass
	else:
		for order in order_list:
			#非本策略 本次运行记录的委托 不撤
			if order.m_strRemark not in A.all_order_ref_dict:
				continue
			#委托后 时间不到撤单等待时间的 不撤
			if time.time() - A.all_order_ref_dict[order.m_strRemark] < A.withdraw_secs:
				continue
			#对所有可撤状态的委托 撤单
			if order.m_nOrderStatus in [48,49,50,51,52,55,86,255]:
				print(f"超时撤单 停止等待 {order.m_strRemark}")
				#cancel(order.m_strOrderSysID,A.acct,'stock',C)
	#下单判断
	for stock in position_dict:
		#有未查到的委托的品种 跳过下单 防止超单
		if stock in A.waiting_dict:
			print(f"{stock} 未查到或存在未撤回委托 {A.waiting_dict[stock]} 暂停后续报单")
			continue
		if stock in position_dict.keys(): #pengxuan_note:此处用判断条件没用,stock 是从上面for循环中position_dict取出来的,一定是存在于position_dict.keys中的
			#print(position_dict[stock],target_vol,'1111')
			#到达目标数量的品种 停止委托
			target_vol = final_dict[stock] if stock in final_dict else 0
			if int(abs(position_dict[stock] - target_vol)) == 0:  #pengxuan_note:此处用int其实没用
				print(stock, C.get_stock_name(stock), '与目标一致')
				continue
			#与目标数量差值小于100股的品种 停止委托
			if abs(position_dict[stock] - target_vol) < 100:
				print(f"{stock} {C.get_stock_name(stock)} 目标持仓{target_vol} 当前持仓{position_dict[stock]} 差额小于100 停止委托")
				continue
			#持仓大于目标持仓 卖出
			if position_dict[stock]>target_vol:
				vol = int((position_dict[stock] - target_vol)/100)*100
				if stock not in position_dict_available: #pengxuan_note:在59,60,62,63行中position_dict与position_dict_available都是从持仓中取出,并且position_dict数据更多,怎么可能stock不在position_dict_available呢
					continue
				vol = min(vol, position_dict_available[stock])
				#获取买一价
				print(stock,C.get_stock_name(stock),'应该卖出')
				buy_one_price = full_tick[stock]['bidPrice'][0]
				#买一价无效时 跳过委托
				if not buy_one_price > 0:
					print(f"{stock} {C.get_stock_name(stock)} 取到的价格{buy_one_price}无效,跳过此次推送")
					continue
				print(f"{stock} {C.get_stock_name(stock)} 目标股数{target_vol} 当前股数{position_dict[stock]}")
				msg = f"{now.strftime('%Y%m%d%H%M%S')}_{stock}_sell_{vol}股"
				print(msg)
				#挂单价卖出
				#passorder(24,1101,A.acct,stock,13,-1,vol,'对冲',2,msg,C)
				A.waiting_dict[stock] = msg
				A.all_order_ref_dict[msg] = time.time()
			#持仓小于目标持仓 买入
			if position_dict[stock]<target_vol:
				vol = int((target_vol-position_dict[stock])/100) #pengxuan_note:缺少再乘100
				#获取卖一价
				sell_one_price = full_tick[stock]['askPrice'][0]
				#卖一价无效时 跳过委托
				if not sell_one_price > 0:
					print(f"{stock} {C.get_stock_name(stock)} 取到的价格{sell_one_price}无效,跳过此次推送")
					continue
				target_value = sell_one_price * vol
				if target_value > available_cash:
					print(f"{stock} 目标市值{target_value} 大于 可用资金{available_cash} 跳过委托")
					continue
				print(f"{stock} {C.get_stock_name(stock)} 目标股数{target_vol} 当前股数{position_dict[stock]}")
				msg = f"{now.strftime('%Y%m%d%H%M%S')}_{stock}_buy_{vol}股"
				print(msg)
				#挂单价买入
				#passorder(23,1101,A.acct,stock,13,-1,vol,'对冲',2,msg,C)
				A.waiting_dict[stock] = msg
				A.all_order_ref_dict[msg] = time.time()
				available_cash -= target_value
	#打印函数运行耗时 定时器间隔应大于该值
	print(f"下单判断函数运行完成 耗时{time.time() - t0}秒")


def refresh_waiting_dict(C):
	"""更新委托状态 入参为ContextInfo对象"""
	#获取委托信息
	order_list = get_trade_detail_data(A.acct,A.acct_type,'order')
	#取出委托对象的 投资备注 : 委托状态
	ref_dict = {i.m_strRemark : int(i.m_nOrderStatus) for i in order_list}
	del_list = []
	for stock in A.waiting_dict:
		if A.waiting_dict[stock] in ref_dict and ref_dict[A.waiting_dict[stock]] in [56, 53, 54]:
			#查到对应投资备注 且状态为成交 / 已撤 / 部撤, 从等待字典中删除
			print(f'查到投资备注 {A.waiting_dict[stock]},的委托 状态{ref_dict[A.waiting_dict[stock]]} (56已成 53部撤 54已撤)从等待等待字典中删除')
			del_list.append(stock)
		if A.waiting_dict[stock] in ref_dict and ref_dict[A.waiting_dict[stock]] == 57:
			#委托状态是废单的 也停止等待 从等待字典中删除 
			print(f"投资备注为{A.waiting_dict[stock]}的委托状态为废单 停止等待")
			del_list.append(stock)
	for stock in del_list:
		del A.waiting_dict[stock]

bug代码在上面代码中用注释进行标注。官方文档都写成这样,不能用点心吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QMT的交易示例中《调整至目标持仓Demo》的bug代码梳理 的相关文章

随机推荐

  • 基于SSM+JSP校园二手交易系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 数据分析回头看1——Pandas中数据处理总结

    0 前言 因为之前自己在学习pandas的过程中就简单做了下笔记 发现在用的时候还是会比较乏力 很多东西容易忘 所以我就决定结合之前笔记的内容 按照使用pandas的习惯 把知识点梳理一下 方便之后查找和记忆 1 说明pandas中的Ser
  • fiddler抓包工具的使用

    下载 Fiddler Web Debugging Proxy and Troubleshooting Solutions 安装 下载完成后 默认安装即可 使用 双击Fiddler exe进入界面 设置是否抓包 默认时开启的 表头介绍 序号
  • 在VirtualBox虚拟机中安装Linux 6.2 - 配置

    2 在VirtualBox虚拟机node1中安装Linux 6 2 配置 三 配置 一路Forward最后Finish完成 1欢迎界面 Forward gt 2接受红帽系统协议 Forward gt 3不用注册RHN Forward gt
  • 前端初学者必会技能

    1 HTML CSS HTML和CSS是Web开发最基础的部分 其中HTML构成了网页的 骨架 CSS为网页添加了颜色样式 是网页的 皮肤 网页上所看到的文本 图片以及花花绿绿的样式都是通过HTML和CSS实现的 因此学习Web开发首先要学
  • 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个结点

    一 思路 这里分为链表结点个数是 奇数 和 偶数 两种情况 如果是奇数 中间结点只有一个 返回即可 如果是偶数 中间结点则有两个 这里要求返回第二个 上述图片展示的就是奇数的情况 此时中间结点就是 34 以上展示的就是偶数的情况 此时看到中
  • 7种常见的PPT设计元素

    转载者 彩色的翅膀ppt 搜索 7种常见的PPT设计元素 PPT的设计制作是每个人都关心的技能 如何设计好的PPT模板 在设计PPT时 所运用的元素 能起到关键作用 有时候运用一些元素 就能让PPT成为夺人眼球的一份艺术品 设计的元素 可以
  • 锐龙微型计算机,技嘉推出新BRIX Pro微型电脑:锐龙处理器加持

    10月21日 技嘉推出了两款新的BRIX Pro型号 GB BSRE 1505 和 GB BSRE 1605 使用 AMD Ryzen 嵌入式处理器 与技嘉最新推出的 Tiger Lake BRIX PC相比 这些AMD型号的尺寸没有什么不
  • mysql 窗口函数_窗口函数_解决SQL累加问题

    业务场景1 求出每月数量 amount 的累计值 这个需求在Excel里面是非常好实现的 一个求和公式直接搞定 但Excel处理的数据量毕竟有限 这个需求在SQL里 怎么来实现呢 窗口函数 select sum amount over or
  • js 过滤数组,去掉不符合条件的一项

    var str value 1 key 1 name name1 value 4 key 2 name name2 value 3 key 3 name name3 value 4 key 4 name name4 value 4 key
  • 将本地代码上传至新建的远程仓库方法(git指令简单实现)

    第一步 win R 在框中输入cmd 打开命令行窗口第二步 分别输入以下代码 文字部分为代码的功能 1 cd URL 进入需要上传代码的文件夹 URL要替换成文件夹路径 2 git init 在该文件夹中初始化Git仓库 3 git rem
  • 使用CLion单步调试Caffe

    Caffe With CLion CLion介绍 CLion是JetBrain产品线较新的一员 主要针对C C 语言的一款IDE 说起JetBrain大家应该都用过他们出的Pycharm吧 一句话形容这家公司的产品就是JetBrain出品
  • 用Java实现递归策略算法的编写汇总

    算法设计与分析 实验一 递归策略运用练习 一 实验目的 本次实验是针对递归算法的算法设计及应用练习 旨在加深学生对该算法原理的理解 提高学生运用该算法解决问题的能力 二 实验项目 1 运用递归策略设计算法实现下述题目的求解过程 题目列表如下
  • vue cli 报错 WARNING in ..node_modulesVuedistvue.runtime.esm.js

    vue cli 报错 WARNING in node modules Vue dist vue runtime esm js 解决 src文件夹 main js中 修改 import Vue from Vue 为小写 vue
  • 终于搞定了stackoverflow的富文本编辑器pagedown

    原创不易 转载请注明出处 终于搞定了stackoverflow的富文本编辑器pagedown 这个编辑器在最代码平台上运行了大半年发现确实很多人不喜欢 所以选择了ckedidor 来show下非常符合攻城师的编辑器吧 虽然刚开始可能不习惯
  • 从Linux界面下载文件有空格问题报错

    解决关于从Linux界面下载文件有空格问题报错 原因 解决方案 从CMD界面 下载文件因文件名中有空格字符导致无法下载到本地 原因 查看截图 解决方案 在全路径加上双引号即可解决问题 注意一点 双引号是英文模式的 P S 我是Roy 纯手工
  • Dubbo知识点梳理

    文章预览 Apache Dubbo 1 应用架构的演进过程 目标 路径 讲解 1 1 主流的互联网技术特点 1 2 架构演变的过程 1 2 1 单一应用架构 all in one 1 2 2 垂直应用架构 1 2 3 分布式服务架构 1 2
  • 工具--Git详解

    工具 Git详解 零 文章目录 一 什么是版本控制 1 什么是版本控制 版本控制 Revision control 是一种在开发的过程中用于管理我们对文件 目录或工程等内容的修改历史 方便查看更改历史记录 备份以便恢复以前的版本的软件工程技
  • Android使用Fiddler模拟弱网络环境测试

    前言 现在的Android软件 基本上都会有网络请求 有些APP需要频繁的传输数据时对于网络请求的稳定性和在特殊网络条件下的兼容性有要求 但是我们在测试的时候又很难模拟那种弱网络差网络的情况 今天就给大家分享一篇干货来模拟弱网络情况 正文
  • QMT的交易示例中《调整至目标持仓Demo》的bug代码梳理

    encoding gbk 调仓到指定篮子 import pandas as pd import numpy as np import time from datetime import timedelta datetime 自定义类 用来保