最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

QMT vs PTrade資金更新速度|高頻中如何處理

2023-07-06 12:04 作者:可轉(zhuǎn)債量化分析  | 我要投稿

平時(shí)在手動(dòng)交易中,下單委托后,再切換回去持倉頁面,可以看到你的可用資金變少了。而在QMT和PTrade里面,卻可能會(huì)表現(xiàn)得不一樣。本文用代碼和實(shí)盤來作對(duì)比。希望本文對(duì)量化新手有所幫助,記得收藏哦!公眾號(hào)首頁鏈接了視頻號(hào),里面也有不少的券商的Ptrade|QMT新手入門教程和進(jìn)階教程,歡迎觀看。

可轉(zhuǎn)債量化分析


了解量化交易程序里面的資金更新速度,無論對(duì)量化T+0日內(nèi)交易(可轉(zhuǎn)債,T+0 ETF),還是輪動(dòng)策略調(diào)倉,都是必須的。

Ptrade

以交易逆回購為例,這也便于量化新手也可以實(shí)踐,可以放心跑,不會(huì)虧錢。

代碼很簡單,每個(gè)tick_data行情更新時(shí)間(3秒)里打印當(dāng)前的可用資金。中途買入(借出)逆回購后,看看當(dāng)面打印的可用資金什么時(shí)候發(fā)生變化。

import?datetime# 作者:可轉(zhuǎn)債量化分析def?initialize(context):
????#?初始化策略
????g.already_run?=?False

def?handle_data(context,?data):
????pass

def?get_available_cash(context):
????#?讀取變量protfolio里的可用資金的值
????return?context.portfolio.cash

def?current_time():
????return?datetime.datetime.now().strftime('%H:%M:%S.%f')

def?tick_data(context,?data):
????log.info('可用資金{}'.format(get_available_cash(context)))
????if?not?g.already_run:
????????g.already_run?=?True
????????#?賣出100手?R-001
????????ret?=?order_tick('131810.SZ',?-10,?priceGear='1',?limit_price=None)

def?on_order_response(context,?trade_list):
????#?委托回調(diào)函數(shù),有委托出現(xiàn)就調(diào)用此函數(shù)
????log.info('已委托下單?{}'.format(current_time()))

注意,逆回購是賣出操作,所以 order_tick('131810.SZ', -10, priceGear='1', limit_price=None) 里面操作張數(shù)是-10

放到Ptrade的實(shí)盤里執(zhí)行,得到下面日志

圖片
ptrade日志

下單前可用資金為17902,程序啟動(dòng)后下單時(shí)間在10:41:08,賣出10張R-001,市值1000元;間隔3s后打印可用資金,在10:41:13的時(shí)候,可用資金依然是17902,此時(shí)時(shí)間已經(jīng)過去了5秒;

在10:41:18打印的時(shí)候資產(chǎn)才發(fā)生了變化,此時(shí)可用資金為16902,此時(shí)距離下單時(shí)的10:41:08,已經(jīng)過去了10秒。所以如果在高頻下單時(shí),使用讀取內(nèi)置的context.portfolio.cash 來獲取可用資金,那就寄了。那是不是意味著Ptrade無法進(jìn)行高頻率的交易了呢?當(dāng)然不是的,此時(shí)可以使用內(nèi)置的成交主推函數(shù)來更新可用資金,后面下面再介紹。

QMT

而qmt的代碼如下,把打印的可用資金的操作放到handlebar里面,它和上面的Ptrade作用一樣,每隔3s執(zhí)行一次。

#?encoding:gbk
import?datetime
# 作者:可轉(zhuǎn)債量化分析

ACCOUNT?=?'你的賬戶ID'
start?=?True

def?init(ContextInfo):
????ContextInfo.set_account(ACCOUNT)

def?current_time():
????return?datetime.datetime.now().strftime('%H:%M:%S.%f')


def?get_available_cash(ContextInfo):
????acct_info?=?get_trade_detail_data(ACCOUNT,?'stock',?'account')
????return?acct_info[0].m_dAvailable


def?deal_callback(ContextInfo,?dealInfo):
????print('before')
????print(dealInfo.m_strProductID)
????print(dealInfo.m_nDirection)
????print(dealInfo.m_dTradeAmount)
????print(dealInfo.m_nVolume)
????print(dealInfo.m_dPrice)
????print('call?back?---?')
????print(current_time())

def?buy_action(ContextInfo):
????opType?=?24
????orderType?=?1101
????accountID?=?ACCOUNT
????orderCode?=?'131810.SZ'
????prType?=?11
????price?=?1.8
????volume?=?10
????quickTrade?=?2
????passorder(opType,?orderType,?accountID,?orderCode,?prType,?price,?volume,?quickTrade,?ContextInfo)

def?handlebar(ContextInfo):
????global?start
????if?ContextInfo.is_last_bar():

????????cash?=?get_available_cash(ContextInfo)
????????print('{}?可用資金{}'.format(current_time(),cash))
????????if?start:
????????????print('下單逆回購?131810?')
????????????buy_action(ContextInfo)
????????????start?=?False

部署到QMT實(shí)盤后,執(zhí)行。

得到下面的運(yùn)行日志:

圖片
QMT實(shí)盤

從上面的日志看出,程序在14:35:11啟動(dòng),馬上使用passorder下單,賣出1000元的R-001,此時(shí)時(shí)間14:35:12,馬上成交了。而可用資金在下單后的0.47秒后,14:35:12,顯示少了1000元。此時(shí)的資金狀態(tài)已經(jīng)被更新了。

所以QMT的資金持倉更新速度要比Ptrade快出不少的,如果不是追求毫秒級(jí)別的話,這個(gè)速度足夠滿足大部分的輪動(dòng)和T+0操作了。

雖然QMT的資金持倉更新很快,但如果你的策略是高頻或偏高頻運(yùn)行,比如你這一個(gè)時(shí)刻剛剛買入,下一個(gè)tick來到時(shí)就要賣出,或者采用驅(qū)動(dòng)成交型的網(wǎng)格交易,你無法知道掛單是在哪一個(gè)時(shí)刻成交的,此時(shí)也亦不能一直循環(huán)讀取你的可以資金或者持倉來判斷是否成交,因?yàn)檫@樣會(huì)阻塞QMT無法進(jìn)行下一步的操作(除非你本身就是一直在等待成交,成交后才進(jìn)行下程序一步)。

委托、成交回調(diào)函數(shù)

Ptrade和QMT都有對(duì)應(yīng)的委托成交回調(diào)函數(shù),用于應(yīng)對(duì)需要即時(shí)獲取成交狀態(tài)的情景下。

接口文檔介紹如下 Ptrade ?http://ptradeapi.com/#on_trade_response

QMT:http://qmt.ptradeapi.com/QMT_Python_API_Doc.html#deal-callback

圖片
API文檔

里面就說明了,“該函數(shù)會(huì)在成交主推回調(diào)時(shí)響應(yīng),比引擎和get_trades()函數(shù)更新Order狀態(tài)的速度更快,適合對(duì)速度要求比較高的策略。”

Ptrade的部分代碼片段如下:

#?交易回調(diào)
def?on_trade_response(context,?trade_list):
????#?成交主推
????now?=?context.blotter.current_dt.strftime("%H:%M:%S")

????for?trade_info?in?trade_list:
????????if?trade_info['order_id']?==?'':
????????????#?不是本策略跳過
????????????log.info('非本策略訂單')
????????????continue

????????code?=?trade_info['stock_code']
????????code?=?post_fix_convert(code)
????????business_time?=?trade_info['business_time']
????????business_amount?=?trade_info['business_amount']??#?這個(gè)是負(fù)數(shù),如果賣出
????????business_price?=?trade_info['business_price']
????????g.total_cash?-=?business_amount?#?馬上更新資金狀態(tài)

g.total_cash是一個(gè)全局的可用資金, 可以提前設(shè)定好,亦可以是開盤前讀取一次你的賬戶可用資金。

每次成交的那一刻,on_trade_response這個(gè)函數(shù)就會(huì)被動(dòng)觸發(fā),在這里就可以簡單的更新你的資金狀態(tài)了。上面的例子是最基礎(chǔ)的更新資金。

實(shí)際可以使用其他的諸如dict或類對(duì)象來更新倉位。

圖片
代碼片

上面代碼是把倉位更新放到一個(gè)全局dict里面,key是股票代碼,value也是一個(gè)dict,里面包含交易時(shí)間,持倉數(shù)目,價(jià)格等等。

好了,時(shí)間有限,今天的教程就到這里了,碼字不易,歡迎點(diǎn)贊+收藏哦~

更多幫助,可以在公眾號(hào)后臺(tái)回復(fù):幫助


QMT vs PTrade資金更新速度|高頻中如何處理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
兴和县| 沁源县| 汨罗市| 塘沽区| 房产| 建始县| 延庆县| 九龙县| 启东市| 玉环县| 大关县| 磐石市| 平舆县| 临安市| 井研县| 卫辉市| 龙江县| 固始县| 霍州市| 德化县| 沅江市| 句容市| 邵阳县| 大埔县| 杭州市| 兴安盟| 安徽省| 长春市| 永川市| 长宁县| 永和县| 嘉善县| 丽水市| 桃园县| 永兴县| 广西| 虞城县| 巨鹿县| 沿河| 安图县| 赤城县|