VNPY中 Tick級別準高頻交易簡單策略
VNPY中,大多策略都是基於bar分鐘級別;國內tick是一秒兩筆,頻率不算太高。這裡嘗試做了一個Tick基本準高頻交易策略,只是為了實現思路。可以回測,不要直接用。。
回測時候記得把回測模式改為TICK_MODE, 資料庫改為TICK_DB_NAME,還有setStartDate時候initdays設為0,不需要回讀歷史天數,只需要當天資料; 另外TICK回測超過一天系統就報錯記憶體不夠, 所以最好一天就夠。 還有,把 currentTime改為開盤時間, 因為策略只在開盤時間執行,收盤前會自動平倉。
入場: 每次讀 Tick ,分析過去 10 個 tick 的的總計,如果買量大於賣量,開多單 ;反之空單
下單價格是當前tick市價;
止損:下單同時開反向2個價位的阻止單;
離場:下次TICK讀取時候,如果已經是買入價格正向3個點,再次判斷買賣量比,如果已經不符合,市價賣出;如果還是符合原來量比就極小持有,清掉之前阻止單,改掛當前價位反向2個點阻止單。
7 -24 更新,具體程式碼更新等驗證後更新:
-
更改 stoporder 止損單為 limit order 限價單,這樣更為快速;放在 ontrade() ,一旦主動交易確認發生後,發出這個止損 limit order
-
在 onorder() 加入,一旦發現發出交易沒有完成,還在掛單,取消
-
新增一個類全域性變數級別的鎖,當有 order 掛單或者沒有 order 發出單沒有返回資訊時候,這個鎖關閉,不再開新單;避免多個單同時阻塞。
# 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' # 策略引數 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 # 持倉數量 # 引數列表,儲存了引數的名稱 paramList = ['name', 'className', 'author', 'vtSymbol', 'initDays', 'Ticksize', 'fixedSize' ] # 變數列表,儲存了變數的名稱 varList = ['inited', 'trading', 'pos', 'posPrice' ] # 同步列表,儲存了需要儲存到資料庫的變數名稱 syncList = ['pos', 'posPrice', 'intraTradeHigh', 'intraTradeLow'] # ---------------------------------------------------------------------- def __init__(self, ctaEngine, setting): """Constructor""" super(TickOneStrategy, self).__init__(ctaEngine, setting) #建立Array佇列 self.tickArray = TickArrayManager(self.Ticksize) # ---------------------------------------------------------------------- def onminBarClose(self, bar): """""" # ---------------------------------------------------------------------- def onInit(self): """初始化策略(必須由使用者繼承實現)""" self.writeCtaLog(u'%s策略初始化' % self.name) #tick級別交易,不需要過往歷史資料 self.putEvent() # ---------------------------------------------------------------------- def onStart(self): """啟動策略(必須由使用者繼承實現)""" self.writeCtaLog(u'%s策略啟動' % self.name) self.putEvent() # ---------------------------------------------------------------------- def onStop(self): """停止策略(必須由使用者繼承實現)""" self.writeCtaLog(u'%s策略停止' % self.name) self.putEvent() # ---------------------------------------------------------------------- def onTick(self, tick): """收到行情TICK推送(必須由使用者繼承實現)""" currentTime = datetime.now().time() # 平當日倉位, 如果當前時間是結束前日盤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: # 如果持有多單,如果已經是買入價格正向N3個點,再次判斷趨勢,如果已經不符合,市價賣出。如果持有,清掉之前阻止單,改掛當前價位反向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: # 如果持有空單,如果已經是買入價格反向N3個點,再次判斷趨勢,如果已經不符合,市價賣出。如果持有,清掉之前阻止單,改掛當前價位反向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推送(必須由使用者繼承實現)""" # ---------------------------------------------------------------------- def onXminBar(self, bar): """收到X分鐘K線""" # ---------------------------------------------------------------------- def onOrder(self, order): """收到委託變化推送(必須由使用者繼承實現)""" pass # ---------------------------------------------------------------------- def onTrade(self, trade): self.posPrice = trade.price # 同步資料到資料庫 self.saveSyncData() # 發出狀態更新事件 self.putEvent() # ---------------------------------------------------------------------- def onStopOrder(self, so): """停止單推送""" pass
CTAtemplate 加入新類TickArrayManager ######################################################################## class TickArrayManager(object): """ Tick序列管理工具,負責: 1. Tick時間序列的維護 2. 常用技術指標的計算 """ # ---------------------------------------------------------------------- def __init__(self, size=10): """Constructor""" self.count = 0 # 快取計數 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())
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2158326/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VNPY 一種基於統計的交易策略簡易實現
- VNPY 單品種期貨的網格交易策略的實現
- VNPY 基於SAR和肯特納的交易策略
- 怎麼用VNPY CTP 模擬櫃檯來實現CTP 程式TICK級回測
- 在·VNPY中按照CTA策略例項記錄交易條目和損益
- 幣安鏈量化交易策略機器人系統開發規則丨高頻策略量化交易模式機器人模式
- VNPY 自帶跨時間週期交易策略MultiTimeframeStrategy 分析
- VNPY 交易所返回委託和交易狀態到策略的原始碼分析原始碼
- 簡單介紹下vnpy的價差交易模組 spread_trading
- 簡單說幾個MySQL高頻面試題MySql面試題
- 在VNPY中策略中,使用分鐘線合成日K線
- VNPY 中基於Ta-lib的KDJ策略實現
- 高頻交易下證券公司交易系統的效能最佳化
- VNPY 價差交易模組的使用學習
- 高頻量化交易系統開發,交易機器人系統開發機器人
- VNPY,從傳送交易指令到交易所的原始碼分析原始碼
- vnpy,BollChannel布林線軌道策略分析
- VNPY中開盤前掛單失效的解決方法
- 量化跟單交易機器人/系統開發原理/合約跟單交易策略機器人
- btc交易策略
- 策略模式簡單運用模式
- 簡單瞭解組策略
- 別隻知道策略模式+簡單工廠,試試更香的策略模式+抽象工廠!模式抽象
- 為什麼選擇Java語言用作高頻交易?-JadJava
- 受邀出席Rust 開發者大會|Rust 如何助力量化高頻交易?Rust
- VNPY重新啟動後,沒有停止單掛單原因和簡潔解決方法
- 為VNPY增加資料庫記錄交易資料功能資料庫
- 自動交易量化搬磚系統開發高頻量化搭建
- 高頻量化對沖合約交易模式系統開發模式搭建模式
- 量化交易:日內迴轉交易策略
- 簡單介紹VNPY 1.9.2版本支援看穿式終端的流程
- OpenDoc - 前端簡歷評級標準前端
- 策略模式原來這麼簡單!模式
- 策略模式與簡單java例項模式Java
- 一個簡單mysql 備份策略 。MySql
- Web開發中,什麼級別才算是高併發Web
- 前端基礎 - 資料型別篇(高頻面試!!!)前端資料型別面試
- Windows安全指南之域級別策略(轉)Windows