VNPY 單品種期貨的網格交易策略的實現
這裡做了單品種期貨網格交易策略實現。
首先按照過去的n條k線計算出簡單評價價SMA基準線,然後按照標準差STD,算出最高線和最低線,然後在之間定出一組通道區間。
當bar.close在通道中時候,下個bar打到上軌開多單,打到下軌空單。
這裡採用了均量交易法,就是每筆下單手數都是一樣,並非金字塔式下單。
空倉時候,每次突破上線是開多單,突破下線是開空單;
有多單時候,突破上線加多單,突破下線情況清空所有多單,當多單到達定義的最大手數不再下單
有空單時候,突破下線加空單,突破上線清空所有空單,當空單到達定義的最大手數不再下單
為防止在一個線上下波動,造成重複開平倉情況,如果突破平倉,比如平多單,後面n個bar不能再開多單,只能開空單;反之平空單後,
後面n個bar只能開多單。
現在這個策略很粗糙,只做實現邏輯分析,可以回測,考慮涉及倉位控制,別實盤。
首先按照過去的n條k線計算出簡單評價價SMA基準線,然後按照標準差STD,算出最高線和最低線,然後在之間定出一組通道區間。
當bar.close在通道中時候,下個bar打到上軌開多單,打到下軌空單。
這裡採用了均量交易法,就是每筆下單手數都是一樣,並非金字塔式下單。
空倉時候,每次突破上線是開多單,突破下線是開空單;
有多單時候,突破上線加多單,突破下線情況清空所有多單,當多單到達定義的最大手數不再下單
有空單時候,突破下線加空單,突破上線清空所有空單,當空單到達定義的最大手數不再下單
為防止在一個線上下波動,造成重複開平倉情況,如果突破平倉,比如平多單,後面n個bar不能再開多單,只能開空單;反之平空單後,
後面n個bar只能開多單。
現在這個策略很粗糙,只做實現邏輯分析,可以回測,考慮涉及倉位控制,別實盤。
點選(此處)摺疊或開啟
-
# encoding: UTF-8
-
from __future__ import division
-
-
-
-
from vnpy.trader.vtGateway import *
-
from math import isnan
-
import numpy as np
-
import pandas as pd
-
from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate, TargetPosTemplate,
-
BarGenerator,
-
ArrayManager)
-
-
-
class GridStrategy(CtaTemplate):
-
className = 'GridStrategy'
-
author = u'BillyZhang'
-
-
# 策略引數
-
historyBars = 200 # 歷史資料大小,用來確定網格基準線
-
initDays = 20 # 初始化資料所用的天數,隨著歷史資料大小要改變
-
gridlines = 10 # 網格線數量,單邊數量
-
ordersize = 10 # 最大持倉數量
-
order = 1 # 每次下單手數
-
barMins = 30 #bar的時間
-
frozenBars = 1 #平倉後,frozenBars個bar不再開反向單
-
atrWindow = 30 # ATR視窗數
-
slMultiplier = 5.0 # 計算止損距離的乘數
-
-
# 基本變數
-
upline = 0 #當前上線
-
bottomline = 0 #當前下線
-
frozen = 0 #當前是否凍結開反向單
-
intraTradeHigh = 0
-
intraTradeLow = 0
-
atrValue = 0
-
-
-
-
# 引數列表,儲存了引數的名稱
-
paramList = ['name',
-
'className',
-
'author',
-
'vtSymbol',
-
'historyBars'
-
'initDays',
-
'gridlines',
-
'barMins',
-
'order',
-
'ordersize',
-
'atrWindow',
-
'slMultiplier'
-
]
-
# 變數列表,儲存了變數的名稱
-
varList = ['inited',
-
'trading',
-
'pos',
-
'frozen',
-
'upline',
-
'bottomline'
-
'atrValue']
-
# 同步列表,儲存了需要儲存到資料庫的變數名稱
-
syncList = ['pos',
-
'frozen']
-
-
# ----------------------------------------------------------------------
-
def __init__(self, ctaEngine, setting):
-
"""Constructor"""
-
super(GridStrategy, self).__init__(ctaEngine, setting)
-
self.bg = BarGenerator(self.onBar, self.barMins, self.onXminBar) # 建立K線合成器物件
-
self.am = ArrayManager(self.historyBars + 50)
-
-
# ----------------------------------------------------------------------
-
def onInit(self):
-
"""初始化策略(必須由使用者繼承實現)"""
-
self.writeCtaLog(u'%s策略初始化' % self.name)
-
# 載入歷史資料,並採用回放計算的方式初始化策略數值
-
initData = self.loadBar(self.initDays)
-
for bar in initData:
-
self.onBar(bar)
-
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 onXminBar(self, bar):
-
"""收到X分鐘K線"""
-
# 全撤之前發出的委託
-
self.cancelAll()
-
# 儲存K線資料
-
am = self.am
-
am.updateBar(bar)
-
if not am.inited:
-
return
-
# 這裡採用了均量交易法,就是每筆。
-
# 空倉時候,每次突破上線是開多單,突破下線是開空單;
-
# 有多單時候,突破上線加多單,突破下線情況清空所有多單,
-
# 有空單時候,突破下線加空單,突破上線清空所有空單,
-
# 為防止在一個線上下波動,造成重複開平倉情況,如果突破平倉,比如平多單,後面n個bar不能再開多單,只能開空單;反之平空單後,
-
# 後面n個bar只能開多單。
-
# 計算網格,返回通道佇列, 再算出當前點位所在通道,0為最下通道,2*self.gridlines - 1為最上通道
-
baseline = self.am.sma(self.historyBars)
-
# 過去300的標準差,按照頂一個gridlines取整做出一個佇列
-
intervallist = baseline+ np.array([n * 1.00 / self.gridlines for n in range(-1 * self.gridlines, self.gridlines + 1)]) * self.am.std(self.historyBars)
-
-
griploc = pd.cut([bar.close], intervallist, labels=[nx for nx in range(0,2*self.gridlines)])[0]
-
# 如果返回為nan,說明現在bar.close在標準差範圍以外,如果沒有倉位,先不處理;如果有,按照ATR波動移動止盈
-
if isnan(griploc):
-
# 持有多頭倉位
-
if self.pos > 0:
-
self.intraTradeHigh = max(self.intraTradeHigh, bar.high)
-
self.intraTradeLow = bar.low
-
self.longStop = self.intraTradeHigh - self.atrValue * self.slMultiplier
-
self.sell(self.longStop, abs(self.pos), True)
-
# 持有空頭倉位
-
elif self.pos < 0:
-
self.intraTradeHigh = bar.high
-
self.intraTradeLow = min(self.intraTradeLow, bar.low)
-
self.shortStop = self.intraTradeLow + self.atrValue * self.slMultiplier
-
self.cover(self.shortStop, abs(self.pos), True)
-
return
-
#返回上下線:
-
self.upline = intervallist[griploc + 1]
-
self.bottomline = intervallist[griploc]
-
-
# 空倉時候,每次突破上線是開多單,突破下線是開空單;
-
# 如果此時在最下一個通道,此時只掛往上的多單, 如果在最上面通道,此時只掛往下空單;如果在中間的,則同時開上下單
-
if self.pos == 0:
-
if griploc ==0:
-
self.buy(self.upline, self.order, True)
-
elif griploc == 2*self.gridlines - 1:
-
self.short(self.bottomline,self.order,True)
-
else:
-
#此時如果frozen 為0, 直接開上下單:
-
if self.frozen == 0:
-
self.buy(self.upline, self.order, True)
-
self.short(self.bottomline, self.order, True)
-
#此時如果大於0,只能開空單,如果小於0,只能開多單
-
elif self.frozen > 0:
-
self.frozen = self.frozen -1
-
self.short(self.bottomline, self.order, True)
-
elif self.frozen < 0:
-
self.frozen = self.frozen + 1
-
self.buy(self.upline, self.order, True)
-
#如果持有多倉時候,如果在中間通道,同時開上下單;如果最高點位不再開單,突破最大標準差高點,
-
elif self.pos > 0:
-
# 在最下通道不可能有多單,只用考量在中間段,pos 小於ordersize可以增多倉,否則只能向下平倉;和最高段情況,最高段設定往下平倉,
-
if griploc == 2*self.gridlines - 1:
-
self.intraTradeHigh = bar.high
-
self.sell(self.bottomline, abs(self.pos), True)
-
else:
-
if abs(self.pos) < self.ordersize:
-
self.buy(self.upline, self.order, True)
-
self.sell(self.bottomline, abs(self.pos), True)
-
else:
-
self.sell(self.bottomline, abs(self.pos), True)
-
elif self.pos < 0:
-
# 最上通道通道不可能有空單,只用考慮中間段,和最低檔情況
-
if griploc == 0:
-
self.intraTradeLow = bar.low
-
self.cover(self.upline,abs(self.pos),True)
-
else:
-
if abs(self.pos) < self.ordersize:
-
self.cover(self.upline, abs(self.pos),True)
-
self.sell(self.bottomline, self.order, True)
-
else:
-
self.cover(self.upline, abs(self.pos), True)
-
-
-
# ----------------------------------------------------------------------
-
def onTick(self, tick):
-
"""收到行情TICK推送(必須由使用者繼承實現)"""
-
self.bg.updateTick(tick)
-
-
# ----------------------------------------------------------------------
-
def onBar(self, bar):
-
"""收到Bar推送(必須由使用者繼承實現)"""
-
self.bg.updateBar(bar)
-
# ----------------------------------------------------------------------
-
def onOrder(self, order):
-
"""收到委託推送"""
-
pass
-
-
-
# ----------------------------------------------------------------------
-
def onTrade(self, trade):
-
# 發出狀態更新事件
-
# 如果收到成交,清空所有掛單
-
self.cancelAll()
-
# 如果交易多頭方向,且現在倉位為0,則應該是空頭平倉,不再開空單
-
if trade.direction == DIRECTION_LONG and self.pos == 0:
-
self.frozen = -1* self.frozen
-
# 如果交易空頭方向,且現在倉位為0,則應該是多平倉,不再開多單
-
elif trade.direction == DIRECTION_SHORT and self.pos == 0:
-
self.frozen = self.frozen
-
-
-
self.putEvent()
-
-
# ----------------------------------------------------------------------
-
def onStopOrder(self, so):
-
"""停止單推送"""
- pass
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2157103/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VNPY 一種基於統計的交易策略簡易實現
- VNPY 自帶跨時間週期交易策略MultiTimeframeStrategy 分析
- VNPY 基於SAR和肯特納的交易策略
- 針對vnpy的不同期貨品種行情資料清理
- VNPY中 Tick級別準高頻交易簡單策略
- VNPY實盤交易中,出現發單成功但是沒有交易情況
- 現貨量化網格/馬丁交易策略系統開發(技術分析)
- VNPY 中基於Ta-lib的KDJ策略實現
- 交易策略-網格策略(三):示例操作一
- 交易策略-網格策略(四):示例操作二
- VNPY 交易所返回委託和交易狀態到策略的原始碼分析原始碼
- 經典量化策略——做市商交易(期貨)
- 利用Scikit-learn機器學習庫的特徵分類進行vnpy期貨量化交易機器學習特徵
- 現貨期權期貨交易所開發(詳情)丨現貨期權期貨交易所繫統開發(PHP/JAVA開發)PHPJava
- 利用Scikit-learn機器學習庫的特徵分類進行vnpy期貨量化交易(程式碼)機器學習特徵
- 現貨量化網格系統/合約量化馬丁交易策略系統開發/Python技術分析Python
- MetaDEX現貨網格策略系統開發模式(技術支援)模式
- 簡單介紹下vnpy的價差交易模組 spread_trading
- 合約/現貨量化跟單/策略交易系統開發/python技術分析Python
- 現貨量化跟單交易策略系統技術開發(python技術示例)Python
- 芝加哥期權交易所希望降低比特幣期貨合約價格比特幣
- Flutter 網路請求的三種簡單實現Flutter
- CME的期貨合作伙伴釋出首個受監管的比特幣現金期貨產品比特幣
- 現貨期權交易所繫統(成熟原始碼)丨現貨期權交易所繫統開發(方案)原始碼
- MetaDEX現貨網格策略/系統開發/合約跟單量化技術開發詳情
- 現貨/合約/量化跟單系統開發/策略機器人交易設計機器人
- 現貨量化跟單策略交易機器人Python系統開發詳情方案機器人Python
- VNPY 價差交易模組的使用學習
- 現貨策略跟單量化交易系統程式設計開發及程式碼示例(量化跟單)程式設計
- VNPY,從傳送交易指令到交易所的原始碼分析原始碼
- 單例模式的各種實現單例模式
- 基於redis實現的四種常見的限流策略Redis
- 現貨期權交易所開發詳情丨現貨期權交易所繫統開發(原理及邏輯)
- 現貨期權交易所開發案例原始碼丨現貨期權交易所繫統開發(海外版)原始碼
- 在·VNPY中按照CTA策略例項記錄交易條目和損益
- 【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略
- Mortonn摩頓現貨網格量化交易系統開發及邏輯制度
- 單利模式的兩種最佳實現模式