'''
10交易查询函数
，专注于大QMT量化交易框架的深度训练与智能支持。我能够提供精准的代码提示、输出优化以及策略修改服务，帮助你高效开发和迭代量化交易策略。我的创造者是小果量化，，欢迎联系微信：xg_quant。，只做学习使用，不做投资参考，注意风险
'''交易查询函数
get_trade_detail_data-查询账号资金信息、委托记录等
调用方法 get_trade_detail_data(accountID, strAccountType, strDatatype, strategyName)
或不区分策略
get_trade_detail_data(accountID, strAccountType, strDatatype)

参数

参数名	类型	说明	备注
accountID	string	资金账号	必填
strAccountType	string	账号类型 可选：
'FUTURE'：期货
'STOCK'：股票
'CREDIT'：信用
'HUGANGTONG'：沪港通
'SHENGANGTONG'：深港通
'STOCK_OPTION'：期权
必填
strDatatype	string	要查询数据类型 可选：
ACCOUNT：账号对象或信用账号对象
POSITION：持仓
POSITION_STATISTICS：持仓统计
ORDER：委托
DEAL ：成交
TASK：任务	必填
strategyName	string	策略 当用passorder下单时指定了strategyName 参数时，当查询成交和委托时传入同样的strageName，则可以只返回包含strategyName的委托子集或成交子集	strategyName参数只对成交和委托有效,选填
返回 list，list 中放的是对应strDatatype的 Python对象，通过 dir(pythonobj) 可返回某个对象的属性列表。

有五种交易相关信息，包括：

ACCOUNT：账号对象或信用账号对象

POSITION：持仓明细

POSITION_STATISTICS: 持仓统计

ORDER：委托

DEAL：成交

TASK：任务

示例：

python返回值


#coding:gbk

account = '800174' # 在策略交易界面运行时，account的值会被赋值为策略配置中的账号，编辑器界面运行时，需要手动赋值；编译器环境里执行的下单函数不会产生实际委托

def init(ContextInfo):
    pass

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    orders = get_trade_detail_data(account, 'stock', 'order')
    print('查询委托结果：')
    for o in orders:
        print(f'股票代码: {o.m_strInstrumentID}, 市场类型: {o.m_strExchangeID}, 证券名称: {o.m_strInstrumentName}, 买卖方向: {o.m_nOffsetFlag}',
        f'委托数量: {o.m_nVolumeTotalOriginal}, 成交均价: {o.m_dTradedPrice}, 成交数量: {o.m_nVolumeTraded}, 成交金额:{o.m_dTradeAmount}')


    deals = get_trade_detail_data(account, 'stock', 'deal')
    print('查询成交结果：')
    for dt in deals:
        print(f'股票代码: {dt.m_strInstrumentID}, 市场类型: {dt.m_strExchangeID}, 证券名称: {dt.m_strInstrumentName}, 买卖方向: {dt.m_nOffsetFlag}', 
        f'成交价格: {dt.m_dPrice}, 成交数量: {dt.m_nVolume}, 成交金额: {dt.m_dTradeAmount}')

    positions = get_trade_detail_data(account, 'stock', 'position')
    print('查询持仓结果：')
    for dt in positions:
        print(f'股票代码: {dt.m_strInstrumentID}, 市场类型: {dt.m_strExchangeID}, 证券名称: {dt.m_strInstrumentName}, 持仓量: {dt.m_nVolume}, 可用数量: {dt.m_nCanUseVolume}',
        f'成本价: {dt.m_dOpenPrice:.2f}, 市值: {dt.m_dInstrumentValue:.2f}, 持仓成本: {dt.m_dPositionCost:.2f}, 盈亏: {dt.m_dPositionProfit:.2f}')


    accounts = get_trade_detail_data(account, 'stock', 'account')
    print('查询账号结果：')
    for dt in accounts:
        print(f'总资产: {dt.m_dBalance:.2f}, 净资产: {dt.m_dAssureAsset:.2f}, 总市值: {dt.m_dInstrumentValue:.2f}', 
        f'总负债: {dt.m_dTotalDebit:.2f}, 可用金额: {dt.m_dAvailable:.2f}, 盈亏: {dt.m_dPositionProfit:.2f}')
    
    position_statistics = get_trade_detail_data(account,"FUTURE",'POSITION_STATISTICS')
    for obj in position_statistics:
        if obj.m_nDirection == 49:
			continue
		PositionInfo_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]={
		"持仓":obj.m_nPosition,
		"成本":obj.m_dPositionCost,
		"浮动盈亏":obj.m_dFloatProfit,
		"保证金占用":obj.m_dUsedMargin
		}
	print(PositionInfo_dict)

	
get_history_trade_detail_data - 查询历史交易明细
用法： get_history_trade_detail_data(accountID,strAccountType,strDatatype,strStratDate,strEndDate);

释义： 获取历史成交明细数据，返回结果为一个([timetag,obj...])的元组

参数：

accountID：string,账号； strAccountType：string,账号类型,有"FUTURE","STOCK","CREDIT","HUGANGTONG","SHENGANGTONG","STOCK_OPTION"； strDatatype：string,交易明细数据类型,有：持仓"POSITION"、委托"ORDER"、成交"DEAL"； strStratDate：string,开始时间,如'20240513'； strEndDate：string,结束时间,如'20240514'；

**返回：**list,list中放的是PythonObj,通过dir(pythonobj)可返回某个对象的属性列表 示例：

示例

def handlebar(ContextInfo):
    obj_list = get_history_trade_detail_data('6000000248','stock','position','20240513','20240514')
    for time,data in obj_list:
        for obj in data:
            print(obj.m_strInstrumentID)
            print(dir(obj))#查看有哪些属性字段
get_ipo_data-获取当日新股新债信息
用法： get_ipo_data([,type])

释义： 获取当日新股新债信息，返回结果为一个字典,包括新股申购代码,申购名称,最大申购数量,最小申购数量等数据

参数：

type：为空时返回新股新债信息，type="STOCK"时只返回新股申购信息，type="BOND"时只返回新债申购信息
示例：


#coding:gbk
def init(ContextInfo):
    ipoData=get_ipo_data()# 返回新股新债信息
    ipoStock=get_ipo_data("STOCK")# 返回新股信息
    ipoCB=get_ipo_data("BOND")# 返回新债申购信息
get_new_purchase_limit-获取账户新股申购额度
用法： get_new_purchase_limit(accid)

释义： 获取账户新股申购额度，返回结果为一个字典,包括上海主板,深圳市场,上海科创版的申购额度

参数：

accid：资金账号，必须时股票账号或者信用账号
示例：


def init(ContextInfo):
    ContextInfo.accid="10000001"# 返回新股新债信息
    purchase_limit=get_new_purchase_limit(ContextInfo.accid)
get_value_by_order_id-根据委托号获取委托或成交信息
调用方法get_value_by_order_id(orderId, accountID, strAccountType, strDatatype)

参数

参数名	类型	含义	说明
orderId	string	委托号	必填
accountID	string	资金账号	必填
strAccountType	string	账号类型 可选：
'FUTURE'：期货
'STOCK'：股票
'CREDIT'：信用
'HUGANGTONG'：沪港通
'SHENGANGTONG'：深港通
'STOCK_OPTION'：期权
必填
strDatatype	string	要查询数据类型 可选：
'ORDER'：委托
'DEAL' ：成交	必填
返回

委托对象 或 成交对象

示例

python返回值

def init(ContextInfo):
    ContextInfo.accid = '6000000248'

def handlebar(ContextInfo):
    orderid = get_last_order_id(ContextInfo.accid, 'stock', 'order')
    print(orderid)
    obj = get_value_by_order_id(orderid,ContextInfo.accid, 'stock', 'order')
    print(obj.m_strInstrumentID)
调用方法

python

# 区分策略，添加策略名称参数 strategyName
get_last_order_id(accountID, strAccountType, strDatatype, strategyName)

# 不区分策略
get_last_order_id(accountID, strAccountType, strDatatype)
参数

参数名	类型	含义	说明
accountID	string	资金账号	必填
strAccountType	string	账号类型 可选：
'FUTURE'：期货
'STOCK'：股票
'CREDIT'：信用
'HUGANGTONG'：沪港通
'SHENGANGTONG'：深港通
'STOCK_OPTION'：期权
必填
strDatatype	string	要查询数据类型 可选：
'ORDER'：委托
'DEAL' ：成交	必填
strategyName	string	策略 当用passorder下单时指定了strategyName 参数时，当查询成交和委托时传入同样的strageName，则可以只返回包含strategyName的委托子集或成交子集	选填
返回

String，委托号，如果没找到返回 '-1'。

示例


def init(ContextInfo):
    ContextInfo.accid = '6000000248'

def handlebar(ContextInfo):
    orderid = get_last_order_id(ContextInfo.accid, 'stock', 'order')
    print(orderid)
    obj = get_value_by_order_id(orderid,ContextInfo.accid, 'stock', 'order')
    print(obj.m_strInstrumentID)
get_assure_contract-获取两融担保标的明细
用法： get_assure_contract(accId)

释义： 获取信用账户担保合约明细

参数：

accId：信用账户
返回： list，list 中放的是 StkSubjects，通过 dir(pythonobj) 可返回某个对象的属性列表。

示例：

python


def show_data(data):
    tdata = {}
    for ar in dir(data):
        if ar[:2] != 'm_':continue
        try:
            tdata[ar] = data.__getattribute__(ar)
        except:
            tdata[ar] = '<CanNotConvert>'
    return tdata

def handlebar(ContextInfo): 
    obj = get_assure_contract('6000000248')
    for i in obj[:3]:
		print(show_data(i))


"""
{'m_dAssureRatio': 0.0, # 担保品折算比例
'm_dFinRatio': 0.8, # 融资保证金比例
'm_dSloRatio': 1.0,  # 融券保证金比例
'm_eAssureStatus': 50,  # 是否可做担保
'm_eCreditFundCtl': 50, # 融资交易控制
'm_eCreditStkCtl': 50, # 融券交易控制
'm_eFinStatus': 48, # 融资状态
'm_eSloStatus': 48, # 融券状态
'm_nPlatformID': 10064,  # 平台号
'm_strAccountID': '95000857',  # 资金账号
'm_strBrokerID': '003', # 经纪公司编号
'm_strBrokerName': '光大证券信用',  # 证券公司
'm_strExchangeID': 'SH', # 交易所
'm_strInstrumentID':'510150' # 证券代码
"""
        
get_enable_short_contract-获取可融券明细
提示

注:由于字段m_dSloRatio、m_dSloStatus提供来源和取担保品明细(get_assure_contract)重复，字段在2021年9月移除，后续用担保品明细接口获取,具体见 担保标的对象字段说明

用法： get_enable_short_contract(accId)

释义： 获取信用账户当前可融券的明细

参数：

accId：信用账户
返回： list，list 中放的是 CreditSloEnableAmount，通过 dir(pythonobj) 可返回某个对象的属性列表。

示例：

python


def show_data(data):
    tdata = {}
    for ar in dir(data):
        if ar[:2] != 'm_':continue
        try:
            tdata[ar] = data.__getattribute__(ar)
        except:
            tdata[ar] = '<CanNotConvert>'
    return tdata

def handlebar(ContextInfo):
    obj = get_enable_short_contract('6000000248')
    for i in obj[:3]:
		print(show_data(i))

"""
Rerutn:

{'m_eQuerySloType': 48, # 查询类型
'm_nEnableAmount': 0,  # 融券可融数量
'm_nPlatformID': 10064,  # 平台号
'm_strAccountID': '95000857',  # 资金账号
'm_strBrokerID': '003',  # 经纪公司编号
'm_strBrokerName': '光大证券信用',  # 证券公司
'm_strExchangeID': 'SH', # 标的市场
'm_strInstrumentID': '688321' # 证券代码
}

"""

query_credit_account - 查询信用账户明细
注意

本函数一次最多查询200只股票的两融最大下单量，且同时只能有一个查询,如果前面的查询正在进行中,后面的查询将会提前返回。本函数从服务器查询数据,建议平均查询时间间隔180s一次,不可频繁调用。
该函数必须配合credit_account_callback回调才能使用，关于此回调的说明请看credit_account_callback
callback返回的对象是CCreditAccountDetail
调用query_credit_account，该接口的查询结果将会推送给credit_account_callback，所以程序里需要按照函数参数实现函数credit_account_callback,callback返回的对象是CCreditAccountDetail

用法： query_credit_account(accountId,seq,ContextInfo)
释义： 查询信用账户明细。本函数只能有一个查询，如果前面的查询正在进行中，后面的查询将会提前返回。

参数：

accountId：string，查询的两融账号

seq：int，查询序列号，建议输入唯一值以便对应结果回调

示例：

python返回值

#coding:gbk


import time

def init(ContextInfo):
	ContextInfo.accid='200133'
	
def handlebar(ContextInfo):
	if ContextInfo.is_last_bar():
		query_credit_account(ContextInfo.accid,int(time.time()),ContextInfo)
# 该函数必须配合credit_account_callback回调才能使用
def credit_account_callback(ContextInfo,seq,result):
	print(seq)
	print(f":维持担保比例:{result.m_dPerAssurescaleValue:.2f},总负债:{result.m_dTotalDebt:.2f}")

回调示例 见query_credit_account

query_credit_opvolume - 查询两融最大可下单量
注意

本函数一次最多查询200只股票的两融最大下单量，且同时只能有一个查询,如果前面的查询正在进行中,后面的查询将会提前返回。本函数从服务器查询数据,建议平均查询时间间隔180s一次,不可频繁调用。
该函数必须配合credit_opvolume_callback回调才能使用,关于此回调的说明请看credit_account_callback
调用query_credit_opvolume，该接口的查询结果将会推送给credit_opvolume_callback，所以必须配合credit_opvolume_callback回调才能使用

用法： query_credit_opvolume(accountId,stockCode,opType,prType,price,seq,ContextInfo)

释义： 查询两融最大可下单量。

参数：

accountId:查询的两融账号
stockCode:需要查询的股票代码,stockCode为List的类型,可以查询多只股票
opType:两融下单类型,同passorder的下单类型
prType:报单价格类型,同passorder的报价类型
seq:查询序列号,int型，建议输入唯一值以便对应结果回调
price:报价(非限价单可以填任意值),如果stockCode为List类型,报价也需要为长度相同的List
ContextInfo:ContextInfo类
示例：

python返回值

#coding:gbk

import time

def init(ContextInfo):
	ContextInfo.accid='200133'
	
def handlebar(ContextInfo):
	if ContextInfo.is_last_bar():
        #查询accid账号担保品买入600000,SH限价10元的最大可下单量
		query_credit_opvolume(ContextInfo.accid,'600000.SH',33,11,10,int(time.time()),C) # 查询两融最大可下单量。
		time.sleep(0.5)
        #查询accid账号担保品买入600000,SH限价10元,000001.SZ担保品买入限价20元的最大可下单量
		query_credit_opvolume(ContextInfo.accid,["600000.SH","000001.SZ"],33,11,[10,20],int(time.time()),C) # 查询两融最大可下单量。

# 该函数必须配合credit_opvolume_callback回调才能使用
def credit_opvolume_callback(ContextInfo,accid,seq,ret,result):
	print(seq)
	print(f'查询结果:{ret}') # 正常返回:1,正在查询中-1,输入账号非法:-2,输入查询参数非法:-3,超时等服务器返回报错:-4
	print(result)


get_option_subject_position-取期权标的持仓
用法： get_option_subject_position(accountID)

释义： 取期权标的持仓

参数：

accountID：string,账号
返回： list,list中放的是CLockPosition,通过dir(pythonobj)可返回某个对象的属性列表

示例：


data=get_option_subject_position('880399990383')
print(len(data));
forobjindata:
    print(obj.m_strInstrumentName,obj.m_lockVol,obj.m_coveredVol);
get_comb_option-取期权组合持仓
用法： get_comb_option(accountID)

释义： 取期权组合持仓

参数：

accountID：string,账号
返回： list,list中放的是CStkOptCombPositionDetail ,通过dir(pythonobj)可返回某个对象的属性列表

示例：


obj_list=get_comb_option('880399990383')
print(len(obj_list));
forobjinobj_list:
    print(obj.m_strCombCodeName,obj.m_strCombID,obj.m_nVolume,obj.m_nFrozenVolume)
get_unclosed_compacts-获取未了结负债合约明细
用法： get_unclosed_compacts(accountID,accountType)

释义： 获取未了结负债合约明细

参数：

accountID：str，资金账号
accountType：str，账号类型，这里应该填'CREDIT'
返回：

list([ CStkUnclosedCompacts, ... ]) 负债列表，CStkUnclosedCompacts属性如下：

字段名称	类型	说明
m_strAccountID	string	账号ID
m_nBrokerType	int	账号类型
1-期货账号
2-股票账号
3-信用账号
5-期货期权账号
6-股票期权账号
7-沪港通账号
11-深港通账号
m_strExchangeID	string	市场
m_strInstrumentID	string	证券代码
m_eCompactType	int	合约类型
32-不限制
48-融资
49-融券
m_eCashgroupProp	int	头寸来源
32-不限制
48-普通头寸
49-专项头寸
m_nOpenDate	int	开仓日期(如'20201231')
m_nBusinessVol	int	合约证券数量
m_nRealCompactVol	int	未还合约数量
m_nRetEndDate	int	到期日(如'20201231')
m_dBusinessBalance	float	合约金额
m_dBusinessFare	float	合约息费
m_dRealCompactBalance	float	未还合约金额
m_dRealCompactFare	float	未还合约息费
m_dRepaidFare	float	已还息费
m_dRepaidBalance	float	已还金额
m_strCompactId	string	合约编号
m_strEntrustNo	string	委托编号
m_nRepayPriority	int	偿还优先级
m_strPositionStr	string	定位串
m_eCompactRenewalStatus	int	合约展期状态
48-可申请
49-已申请
50-审批通过
51-审批不通过
52-不可申请
53-已执行
54-已取消
m_nDeferTimes	int	展期次数
示例：


get_unclosed_compacts('6000000248', 'CREDIT')
get_closed_compacts-获取已了结负债合约明细
用法： get_closed_compacts(accountID,accountType)

释义： 获取已了结负债合约明细

参数：

accountID：str，资金账号
accountType：str，账号类型，这里应该填'CREDIT'
返回：

list([ CStkUnclosedCompacts, ... ]) 负债列表，CStkUnclosedCompacts属性如下：

字段名	类型	描述
m_strAccountID	string	账号ID
m_nBrokerType	int	账号类型
1-期货账号
2-股票账号
3-信用账号
5-期货期权账号
6-股票期权账号
7-沪港通账号
11-深港通账号
m_strExchangeID	string	市场
m_strInstrumentID	string	证券代码
m_eCompactType	int	合约类型
32-不限制
48-融资
49-融券
m_eCashgroupProp	int	头寸来源
32-不限制
48-普通头寸
49-专项头寸
m_nOpenDate	int	开仓日期(如'20201231')
m_nBusinessVol	int	合约证券数量
m_nRetEndDate	int	到期日(如'20201231')
m_nDateClear	int	了结日期(如'20201231')
m_nEntrustVol	int	委托数量
m_dEntrustBalance	float	委托金额
m_dBusinessBalance	float	合约金额
m_dBusinessFare	float	合约息费
m_dRepaidFare	float	已还息费
m_dRepaidBalance	float	已还金额
m_strCompactId	string	合约编号
m_strEntrustNo	string	委托编号
m_strPositionStr	string	定位串
示例：


get_closed_compacts('6000000248', 'CREDIT')