溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

VNPY中Tick級別準高頻交易簡單策略是什么

發(fā)布時間:2021-12-04 15:24:50 來源:億速云 閱讀:268 作者:柒染 欄目:編程語言

VNPY中Tick級別準高頻交易簡單策略是什么,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

VNPY中,大多策略都是基于bar分鐘級別;國內(nèi)tick是一秒兩筆,頻率不算太高。這里嘗試做了一個Tick基本準高頻交易策略,只是為了實現(xiàn)思路。可以回測,不要直接用。。

回測時候記得把回測模式改為TICK_MODE, 數(shù)據(jù)庫改為TICK_DB_NAME,還有setStartDate時候initdays設(shè)為0,不需要回讀歷史天數(shù),只需要當天數(shù)據(jù); 另外TICK回測超過一天系統(tǒng)就報錯內(nèi)存不夠, 所以最好一天就夠。還有,把currentTime改為開盤時間, 因為策略只在開盤時間運行,收盤前會自動平倉。

入場: 每次讀Tick,分析過去10個tick的的總計,如果買量大于賣量,開多單;反之空單

          下單價格是當前tick市價;

止損:下單同時開反向2個價位的阻止單;

離場:下次TICK讀取時候,如果已經(jīng)是買入價格正向3個點,再次判斷買賣量比,如果已經(jīng)不符合,市價賣出;如果還是符合原來量比就極小持有,清掉之前阻止單,改掛當前價位反向2個點阻止單。

7-24 更新,具體代碼更新等驗證后更新:

  1. 更改stoporder止損單為limit order限價單,這樣更為快速;放在ontrade(),一旦主動交易確認發(fā)生后,發(fā)出這個止損limit order

  2. 在onorder()加入,一旦發(fā)現(xiàn)發(fā)出交易沒有完成,還在掛單,取消

  3. 新增一個類全局變量級別的鎖,當有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()
        # 平當日倉位, 如果當前時間是結(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)不符合,市價賣出。如果持有,清掉之前阻止單,改掛當前價位反向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)不符合,市價賣出。如果持有,清掉之前阻止單,改掛當前價位反向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序列管理工具,負責:
    1. Tick時間序列的維護
    2. 常用技術(shù)指標的計算
    """
 
    # ----------------------------------------------------------------------
    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級別準高頻交易簡單策略是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI