VNPY基于SAR和肯特納的交易策略是怎樣的,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
一個(gè)比較簡(jiǎn)單策略,主要是為了驗(yàn)證SAR出場(chǎng)指標(biāo)的;然后和可以結(jié)合其他下單值,做的一個(gè)簡(jiǎn)單組合。只是用來測(cè)試。
入場(chǎng)指標(biāo),cci,如果cci大于0,多頭,cci小于0空頭。下阻止單,金額就是Kelter上下軌。多頭買入價(jià)格是通道上軌??疹^買入價(jià)格是通道下軌。
出場(chǎng)指標(biāo),這里出場(chǎng)和入場(chǎng)適用不同周期的k線,因?yàn)檫@樣可以更靈活跑回測(cè)。SAR價(jià)格作為賣出價(jià)格,開阻止單,如果觸及SAR價(jià)格賣出。
先在class ArrayManager() 加入sar方法。當(dāng)然最好還是繼承新增。
點(diǎn)擊(此處)折疊或打開
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)建策略。
點(diǎn)擊(此處)折疊或打開
# 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指標(biāo)數(shù)值
cciValue = 0 # CCI指標(biāo)數(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ù)庫(kù)的變量名稱
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線合成器對(duì)象
self.am = ArrayManager()
self.bgclose = BarGenerator(self.onBar, self.barMinsClose, self.onminBarClose)
self.amClose = ArrayManager()
# ----------------------------------------------------------------------
def onminBarClose(self, bar):
"""分鐘作為清倉(cāng)周期"""
# 如果沒有倉(cāng)位,那么不用care,直接skip
# 保存K線數(shù)據(jù)
amClose = self.amClose
amClose.updateBar(bar)
if not amClose.inited:
return
# 計(jì)算指標(biāo)數(shù)值
self.sarValue = amClose.sar(self.sarAcceleration,self.sarMaximum)
# 判斷是否要進(jìn)行交易
if self.pos == 0:
return
# 當(dāng)前無倉(cāng)位,發(fā)送開倉(cāng)委托
# 持有多頭倉(cāng)位
elif self.pos > 0:
self.cancelAll()
self.sell(self.sarValue, abs(self.pos), True)
# 持有空頭倉(cāng)位
elif self.pos < 0:
self.cancelAll()
self.cover(self.sarValue, abs(self.pos), True)
# 同步數(shù)據(jù)到數(shù)據(jù)庫(kù)
self.saveSyncData()
# 發(fā)出狀態(tài)更新事件
self.putEvent()
# ----------------------------------------------------------------------
def onInit(self):
"""初始化策略(必須由用戶繼承實(shí)現(xiàn))"""
self.writeCtaLog(u'%s策略初始化' % self.name)
# 載入歷史數(shù)據(jù),并采用回放計(jì)算的方式初始化策略數(shù)值
initData = self.loadBar(self.initDays)
for bar in initData:
self.onBar(bar)
self.putEvent()
# ----------------------------------------------------------------------
def onStart(self):
"""啟動(dòng)策略(必須由用戶繼承實(shí)現(xiàn))"""
self.writeCtaLog(u'%s策略啟動(dòng)' % self.name)
self.putEvent()
# ----------------------------------------------------------------------
def onStop(self):
"""停止策略(必須由用戶繼承實(shí)現(xiàn))"""
self.writeCtaLog(u'%s策略停止' % self.name)
self.putEvent()
# ----------------------------------------------------------------------
def onTick(self, tick):
"""收到行情TICK推送(必須由用戶繼承實(shí)現(xiàn))"""
self.bg.updateTick(tick)
# ----------------------------------------------------------------------
def onBar(self, bar):
"""收到Bar推送(必須由用戶繼承實(shí)現(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
# 計(jì)算指標(biāo)數(shù)值
self.cciValue = am.cci(self.cciWindow)
self.keltnerup, self.keltnerdown = am.keltner(self.keltnerWindow,self.keltnerlMultiplier)
# 判斷是否要進(jìn)行交易
# 當(dāng)前無倉(cāng)位,發(fā)送開倉(cāng)委托
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ù)庫(kù)
self.saveSyncData()
# 發(fā)出狀態(tài)更新事件
self.putEvent()
# ----------------------------------------------------------------------
def onOrder(self, order):
"""收到委托變化推送(必須由用戶繼承實(shí)現(xiàn))"""
pass
# ----------------------------------------------------------------------
def onTrade(self, trade):
# 發(fā)出狀態(tài)更新事件
self.putEvent()
# ----------------------------------------------------------------------
def onStopOrder(self, so):
"""停止單推送"""
pass
關(guān)于VNPY基于SAR和肯特納的交易策略是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
本文名稱:VNPY基于SAR和肯特納的交易策略是怎樣的-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://www.rwnh.cn/article14/cejdge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、企業(yè)建站、電子商務(wù)、微信小程序、靜態(tài)網(wǎng)站、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容