這篇文章主要介紹在VNPY中策略中如何使用分鐘線合成日K線,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
目前創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、任城網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
在論壇里面看到不少關(guān)于分鐘合成日線的討論,也試著實現(xiàn)了。這里是針對vnpy2.0的,1.92其實基本也差不多。
這里把合成的日線HLOC信息放在pandas.DataFrame里面,因為日線分析的話,對運算時間要求不是特別高,DataFrame足矣
合成過程放在on_bar方法里面,對每個傳入的分鐘進(jìn)行日線合并處理;
這里用了trading == False進(jìn)行判斷,就是只在策略初始化過程對于歷史數(shù)據(jù)進(jìn)行日線合并。在交易過程中,不對當(dāng)天傳入分鐘數(shù)據(jù)進(jìn)行處理。因為日線是長周期數(shù)據(jù),放在程序啟動時候調(diào)用使用就可以,不必要盤中分析,如果打算真要,注釋掉這個就可以。
這里只是提供了這個DataFrame 放置日線數(shù)據(jù),具體如何分析還是要看使用者了
定于dayFrame存儲日線數(shù)據(jù),在策略定義中插入全局變量
class *********Strategy(CtaTemplate): author = "用Python的交易員" import pandas as pd dayFrame = pd.DataFrame(columns=['datetime', 'high', 'low', 'open', 'close'])
合并過程,在on_bar 方法中插入下面代碼
def on_bar(self, bar: BarData): """ """ if self.trading == False: # adjustedBarTime = bar.datetime + timedelta(hours = 5) if self.dayFrame.empty: # 如果dayFrame 為空,先加入一條 self.dayFrame = self.dayFrame.append({'datetime': bar.datetime.date(), 'high':bar.high_price, 'low': bar.low_price, 'open': bar.open_price, 'close': bar.close_price}, ignore_index=True) else: self.dayFrame = self.dayFrame.sort_values(['datetime']).reset_index(drop=True) # 如果dayFrame 不為空,先按照日期排序, if bar.datetime.date() in self.dayFrame['datetime'].values: # 如果是已有日期,對比high,low更新,并使用新close self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'high'] = \ max(max(self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'high'].values),bar.high_price) self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'low'] = \ min(min(self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'low'].values),bar.low_price) self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'close'] = bar.close_price else: # 如果是新的日期,新建一條 self.dayFrame = self.dayFrame.append( {'datetime': bar.datetime.date(), 'high': bar.high_price, 'low': bar.low_price, 'open': bar.open_price, 'close': bar.close_price}, ignore_index=True)
另外,這里默認(rèn)就是自然日。如果想按照國內(nèi)期貨期貨時間,就是晚上九點開盤時間就是第二天的話。有個取巧的方法,就是把bar時間加上5個小時,那么下午9點就變成明天1點,這樣dataframe就會存儲為下一天數(shù)據(jù)。而當(dāng)天15點加上5點20點還是當(dāng)天數(shù)據(jù)。
不過這樣改很粗糙,只能支持國內(nèi)時間和國內(nèi)期貨,如果服務(wù)器再其他時區(qū),或者其他產(chǎn)品就另外分析。
修改方法,定義局部變量adjustedBarTime,是傳入bar.datetime 時間加5;代替后面新增代碼中所有用到bar.datetime地方。
周五時候想到一個問題,對于國內(nèi)期貨,周五晚上數(shù)據(jù)屬于周一的,想想還真是頭大,這里還要加上一天判斷是否第二天是周六,如果是就要改到加兩天,幸好一般節(jié)假日之前的交易日晚上無夜盤,不然更麻煩。
from datetime import datetime, timedelta if self.trading == False: adjustedBarTime = bar.datetime + timedelta(hours = 5) if adjustedBarTime.weekday() is 5: adjustedBarTime = adjustedBarTime + timedelta(days= 2)
會插入如下數(shù)據(jù),按照初始化使用天數(shù),就會有多少條,
以上是“在VNPY中策略中如何使用分鐘線合成日K線”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!