VNPY中Tick級別準(zhǔn)高頻交易簡單策略是什么,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
站在用戶的角度思考問題,與客戶深入溝通,找到華州網(wǎng)站設(shè)計與華州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋華州地區(qū)。VNPY中,大多策略都是基于bar分鐘級別;國內(nèi)tick是一秒兩筆,頻率不算太高。這里嘗試做了一個Tick基本準(zhǔn)高頻交易策略,只是為了實現(xiàn)思路。可以回測,不要直接用。。
回測時候記得把回測模式改為TICK_MODE, 數(shù)據(jù)庫改為TICK_DB_NAME,還有setStartDate時候initdays設(shè)為0,不需要回讀歷史天數(shù),只需要當(dāng)天數(shù)據(jù); 另外TICK回測超過一天系統(tǒng)就報錯內(nèi)存不夠, 所以最好一天就夠。還有,把currentTime改為開盤時間, 因為策略只在開盤時間運行,收盤前會自動平倉。
入場: 每次讀Tick,分析過去10個tick的的總計,如果買量大于賣量,開多單;反之空單
下單價格是當(dāng)前tick市價;
止損:下單同時開反向2個價位的阻止單;
離場:下次TICK讀取時候,如果已經(jīng)是買入價格正向3個點,再次判斷買賣量比,如果已經(jīng)不符合,市價賣出;如果還是符合原來量比就極小持有,清掉之前阻止單,改掛當(dāng)前價位反向2個點阻止單。
7-24 更新,具體代碼更新等驗證后更新:
更改stoporder止損單為limit order限價單,這樣更為快速;放在ontrade(),一旦主動交易確認(rèn)發(fā)生后,發(fā)出這個止損limit order
在onorder()加入,一旦發(fā)現(xiàn)發(fā)出交易沒有完成,還在掛單,取消
新增一個類全局變量級別的鎖,當(dāng)有order掛單或者沒有order發(fā)出單沒有返回信息時候,這個鎖關(guān)閉,不再開新單;避免多個單同時阻塞。
# encoding: UTF-8 from __future__ import division from vnpy.trader.vtGateway import * from datetime import datetime, time from vnpy.trader.vtObject import VtBarData from vnpy.trader.vtConstant import EMPTY_STRING from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate, BarGenerator, ArrayManager, TickArrayManager) ######################################################################## class TickOneStrategy(CtaTemplate): """基于Tick的交易策略""" className = 'TickOneStrategy' author = u'BillyZhang' # 策略參數(shù) fixedSize = 1 Ticksize = 10 initDays = 0 DAY_START = time(9, 00) # 日盤啟動和停止時間 DAY_END = time(14, 58) NIGHT_START = time(21, 00) # 夜盤啟動和停止時間 NIGHT_END = time(10, 58) # 策略變量 posPrice = 0 # 持倉價格 pos = 0 # 持倉數(shù)量 # 參數(shù)列表,保存了參數(shù)的名稱 paramList = ['name', 'className', 'author', 'vtSymbol', 'initDays', 'Ticksize', 'fixedSize' ] # 變量列表,保存了變量的名稱 varList = ['inited', 'trading', 'pos', 'posPrice' ] # 同步列表,保存了需要保存到數(shù)據(jù)庫的變量名稱 syncList = ['pos', 'posPrice', 'intraTradeHigh', 'intraTradeLow'] # ---------------------------------------------------------------------- def __init__(self, ctaEngine, setting): """Constructor""" super(TickOneStrategy, self).__init__(ctaEngine, setting) #創(chuàng)建Array隊列 self.tickArray = TickArrayManager(self.Ticksize) # ---------------------------------------------------------------------- def onminBarClose(self, bar): """""" # ---------------------------------------------------------------------- def onInit(self): """初始化策略(必須由用戶繼承實現(xiàn))""" self.writeCtaLog(u'%s策略初始化' % self.name) #tick級別交易,不需要過往歷史數(shù)據(jù) self.putEvent() # ---------------------------------------------------------------------- def onStart(self): """啟動策略(必須由用戶繼承實現(xiàn))""" self.writeCtaLog(u'%s策略啟動' % self.name) self.putEvent() # ---------------------------------------------------------------------- def onStop(self): """停止策略(必須由用戶繼承實現(xiàn))""" self.writeCtaLog(u'%s策略停止' % self.name) self.putEvent() # ---------------------------------------------------------------------- def onTick(self, tick): """收到行情TICK推送(必須由用戶繼承實現(xiàn))""" currentTime = datetime.now().time() # 平當(dāng)日倉位, 如果當(dāng)前時間是結(jié)束前日盤15點28分鐘,或者夜盤10點58分鐘,如果有持倉,平倉。 if ((currentTime >= self.DAY_START and currentTime <= self.DAY_END) or (currentTime >= self.NIGHT_START and currentTime <= self.NIGHT_END)): TA = self.tickArray TA.updateTick(tick) if not TA.inited: return if self.pos == 0: # 如果空倉,分析過去10個對比,ask賣方多下空單,bid買方多下多單,并防止兩個差價阻止單 if TA.askBidVolumeDif() > 0: self.short(tick.lastPrice, self.fixedSize, False) self.cover(tick.lastPrice + 2,self.fixedSize, True) elif TA.askBidVolumeDif() < 0: self.buy(tick.lastPrice, self.fixedSize, False) self.sell(tick.lastPrice - 2, self.fixedSize, True) elif self.pos > 0: # 如果持有多單,如果已經(jīng)是買入價格正向N3個點,再次判斷趨勢,如果已經(jīng)不符合,市價賣出。如果持有,清掉之前阻止單,改掛當(dāng)前價位反向2個點阻止單。 if tick.lastprice - self.posPrice >= 3: if TA.askBidVolumeDif() < 0: self.cancelAll() self.sell(tick.lastPrice - 2, self.fixedSize, True) else: self.cancelAll() self.sell(tick.lastPrice, self.fixedSize, False) elif self.pos < 0: # 如果持有空單,如果已經(jīng)是買入價格反向N3個點,再次判斷趨勢,如果已經(jīng)不符合,市價賣出。如果持有,清掉之前阻止單,改掛當(dāng)前價位反向2個點阻止單。 if tick.lastPrice - self.posPrice <= -3: if TA.askBidVolumeDif() > 0: self.cancelAll() self.cover(tick.lastPrice + 2, self.fixedSize, True) else: self.cancelAll() self.cover(tick.lastPrice, self.fixedSize, False) else: if self.pos > 0: self.sell(tick.close, abs(self.pos),False) elif self.pos < 0: self.cover(tick.close, abs(self.pos),False) elif self.pos == 0: return # ---------------------------------------------------------------------- def onBar(self, bar): """收到Bar推送(必須由用戶繼承實現(xiàn))""" # ---------------------------------------------------------------------- def onXminBar(self, bar): """收到X分鐘K線""" # ---------------------------------------------------------------------- def onOrder(self, order): """收到委托變化推送(必須由用戶繼承實現(xiàn))""" pass # ---------------------------------------------------------------------- def onTrade(self, trade): self.posPrice = trade.price # 同步數(shù)據(jù)到數(shù)據(jù)庫 self.saveSyncData() # 發(fā)出狀態(tài)更新事件 self.putEvent() # ---------------------------------------------------------------------- def onStopOrder(self, so): """停止單推送""" pass
CTAtemplate 加入新類TickArrayManager ######################################################################## class TickArrayManager(object): """ Tick序列管理工具,負(fù)責(zé): 1. Tick時間序列的維護(hù) 2. 常用技術(shù)指標(biāo)的計算 """ # ---------------------------------------------------------------------- def __init__(self, size=10): """Constructor""" self.count = 0 # 緩存計數(shù) self.size = size # 緩存大小 self.inited = False # True if count>=size self.TicklastPriceArray = np.zeros(self.size) self.TickaskVolume1Array = np.zeros(self.size) self.TickbidVolume1Array = np.zeros(self.size) self.TickaskPrice1Array = np.zeros(self.size) self.TickbidPrice1Array = np.zeros(self.size) self.TickopenInterestArray = np.zeros(self.size) self.TickvolumeArray = np.zeros(self.size) # ---------------------------------------------------------------------- def updateTick(self, tick): """更新tick Array""" self.count += 1 if not self.inited and self.count >= self.size: self.inited = True self.TicklastPriceArray[0:self.size - 1] = self.TicklastPriceArray[1:self.size] self.TickaskVolume1Array[0:self.size - 1] = self.TickaskVolume1Array[1:self.size] self.TickbidVolume1Array[0:self.size - 1] = self.TickbidVolume1Array[1:self.size] self.TickaskPrice1Array[0:self.size - 1] = self.TickaskPrice1Array[1:self.size] self.TickbidPrice1Array[0:self.size - 1] = self.TickbidPrice1Array[1:self.size] self.TickopenInterestArray[0:self.size - 1] = self.TickopenInterestArray[1:self.size] self.TickvolumeArray[0:self.size - 1] = self.TickvolumeArray[1:self.size] self.TicklastPriceArray[-1] = tick.lastPrice self.TickaskVolume1Array[-1] = tick.askVolume1 self.TickbidVolume1Array[-1] = tick.bidVolume1 self.TickaskPrice1Array[-1] = tick.askPrice1 self.TickbidPrice1Array[-1] = tick.bidPrice1 self.TickopenInterestArray[-1] = tick.openInterest self.TickvolumeArray[-1] = tick.volume def askBidVolumeDif(self): return (self.TickaskPrice1Array.sum() - self.TickbidVolume1Array.sum())
關(guān)于VNPY中Tick級別準(zhǔn)高頻交易簡單策略是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)頁標(biāo)題:VNPY中Tick級別準(zhǔn)高頻交易簡單策略是什么-創(chuàng)新互聯(lián)
URL鏈接:http://aaarwkj.com/article46/dpghhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、服務(wù)器托管、動態(tài)網(wǎng)站、定制開發(fā)、搜索引擎優(yōu)化、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容