您好,登錄后才能下訂單哦!
VNPY基于SAR和肯特納的交易策略是怎樣的,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一個比較簡單策略,主要是為了驗證SAR出場指標的;然后和可以結(jié)合其他下單值,做的一個簡單組合。只是用來測試。
入場指標,cci,如果cci大于0,多頭,cci小于0空頭。下阻止單,金額就是Kelter上下軌。多頭買入價格是通道上軌。空頭買入價格是通道下軌。
出場指標,這里出場和入場適用不同周期的k線,因為這樣可以更靈活跑回測。SAR價格作為賣出價格,開阻止單,如果觸及SAR價格賣出。
先在class ArrayManager() 加入sar方法。當(dāng)然最好還是繼承新增。
點擊(此處)折疊或打開
def sar(self, acceleration = 0.02, maximum = 0.2, array =False):
"""sar"""
real = talib.SAR(self.high,self.low, acceleration= acceleration,maximum = maximum)
if array:
return real
return real[-1]
然后創(chuàng)建策略。
點擊(此處)折疊或打開
# encoding: UTF-8
from __future__ import division
from vnpy.trader.vtObject import VtBarData
from vnpy.trader.vtConstant import EMPTY_STRING
from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate,
BarGenerator,
ArrayManager)
########################################################################
class SARKELStrategy(CtaTemplate):
"""基于sar and Keltner 交易策略"""
className = 'SARKELStrategy'
author = u'BillyZhang'
# 策略參數(shù)
sarAcceleration = 0.02 #加速線
sarMaximum = 0.2 #
cciWindow = 20 # CCI窗口數(shù)
keltnerWindow = 25 # keltner窗口數(shù)
keltnerlMultiplier = 6.0 # 乘數(shù)
initDays = 10 # 初始化數(shù)據(jù)所用的天數(shù)
fixedSize = 1 # 每次交易的數(shù)量
barMins = 15
barMinsClose = 10
# 策略變量
sarValue = 0 # sar指標數(shù)值
cciValue = 0 # CCI指標數(shù)值
keltnerup = 0
keltnerdown = 0
longStop = 0 # 多頭止損
shortStop = 0 # 空頭止損
# 參數(shù)列表,保存了參數(shù)的名稱
paramList = ['name',
'className',
'author',
'vtSymbol',
'sarAcceleration',
'sarMaximum',
'cciWindow',
'keltnerWindow',
'keltnerlMultiplier',
'initDays',
'fixedSize',
'barMinsClose',
'barMins']
# 變量列表,保存了變量的名稱
varList = ['inited',
'trading',
'pos',
'sarValue',
'cciValue',
'atrValue',
'intraBarHigh',
'intraBarLow',
'longStop',
'shortStop']
# 同步列表,保存了需要保存到數(shù)據(jù)庫的變量名稱
syncList = ['pos',
'intraTradeHigh',
'intraTradeLow']
# ----------------------------------------------------------------------
def __init__(self, ctaEngine, setting):
"""Constructor"""
super(SARKELStrategy, self).__init__(ctaEngine, setting)
self.bg = BarGenerator(self.onBar, self.barMins, self.onXminBar) # 創(chuàng)建K線合成器對象
self.am = ArrayManager()
self.bgclose = BarGenerator(self.onBar, self.barMinsClose, self.onminBarClose)
self.amClose = ArrayManager()
# ----------------------------------------------------------------------
def onminBarClose(self, bar):
"""分鐘作為清倉周期"""
# 如果沒有倉位,那么不用care,直接skip
# 保存K線數(shù)據(jù)
amClose = self.amClose
amClose.updateBar(bar)
if not amClose.inited:
return
# 計算指標數(shù)值
self.sarValue = amClose.sar(self.sarAcceleration,self.sarMaximum)
# 判斷是否要進行交易
if self.pos == 0:
return
# 當(dāng)前無倉位,發(fā)送開倉委托
# 持有多頭倉位
elif self.pos > 0:
self.cancelAll()
self.sell(self.sarValue, abs(self.pos), True)
# 持有空頭倉位
elif self.pos < 0:
self.cancelAll()
self.cover(self.sarValue, abs(self.pos), True)
# 同步數(shù)據(jù)到數(shù)據(jù)庫
self.saveSyncData()
# 發(fā)出狀態(tài)更新事件
self.putEvent()
# ----------------------------------------------------------------------
def onInit(self):
"""初始化策略(必須由用戶繼承實現(xiàn))"""
self.writeCtaLog(u'%s策略初始化' % self.name)
# 載入歷史數(shù)據(jù),并采用回放計算的方式初始化策略數(shù)值
initData = self.loadBar(self.initDays)
for bar in initData:
self.onBar(bar)
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))"""
self.bg.updateTick(tick)
# ----------------------------------------------------------------------
def onBar(self, bar):
"""收到Bar推送(必須由用戶繼承實現(xiàn))"""
self.bg.updateBar(bar)
self.bgclose.updateBar(bar)
# ----------------------------------------------------------------------
def onXminBar(self, bar):
"""收到X分鐘K線"""
# 全撤之前發(fā)出的委托
self.cancelAll()
# 保存K線數(shù)據(jù)
am = self.am
am.updateBar(bar)
if not am.inited:
return
# 計算指標數(shù)值
self.cciValue = am.cci(self.cciWindow)
self.keltnerup, self.keltnerdown = am.keltner(self.keltnerWindow,self.keltnerlMultiplier)
# 判斷是否要進行交易
# 當(dāng)前無倉位,發(fā)送開倉委托
if self.pos == 0:
if self.cciValue > 0:
# ru
self.buy(self.keltnerup,self.fixedSize, True)
elif self.cciValue < 0:
self.short(self.keltnerdown, self.fixedSize, True)
# 同步數(shù)據(jù)到數(shù)據(jù)庫
self.saveSyncData()
# 發(fā)出狀態(tài)更新事件
self.putEvent()
# ----------------------------------------------------------------------
def onOrder(self, order):
"""收到委托變化推送(必須由用戶繼承實現(xiàn))"""
pass
# ----------------------------------------------------------------------
def onTrade(self, trade):
# 發(fā)出狀態(tài)更新事件
self.putEvent()
# ----------------------------------------------------------------------
def onStopOrder(self, so):
"""停止單推送"""
pass
關(guān)于VNPY基于SAR和肯特納的交易策略是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(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)容。