VNPY 策略開發!你的第一個雙均線策略。
2023/3/2 - 達錢 4 / TOUCHANCE / VN.PY / Python / 期貨 / 程式交易 / 量化交易 / 均線策略 / 黃金交叉 / 死亡交叉
用 VNPY 開發策略真的很容易
我們直接來開發一個簡單的均線策略,讓大家能一次就瞭解到如何在 VNPY 建構一個交易策略的回測與績效評估。
過去使用 Python 需要自己爬資料,串 Library ,開發各式各樣的模組,今天 VNPY 一次給你,你會發現用 Python 建構你的程式交易真的非常容易。
策略的放置位置
開發策略前,我們先來瞭解一下達錢 4 整合 VNPY 的目錄位置。
- VNPY 執行環境:C:\TC4\APPs\AppFiles\A00047\Release
- VNPY CTA 策略模板:C:\TC4\APPs\AppFiles\A00047\Release\vnpy_ctastrategy
- VNPY CTA 策略:C:\TC4\APPs\AppFiles\A00047\Release\vnpy_ctastrategy\strategies
重要提醒!
開發策略前,你必須要先完成環境變數的設定,請跟著我們的影片介紹,先完成 VNPY 基本環境設定,增加 PYTHONPATH 的環境變數。
》影片連結
開發模板的介紹
Callback 函數 | 説明 |
---|---|
on_init(self) | 策略初始化時呼叫。 |
on_start(self) | 策略被啓動時呼叫。 |
on_stop(self) | 策略停止時呼叫。 |
on_bar(self, bar: BarData) | K Bar 完成時呼叫。 |
完整的 Sample Code
from vnpy_ctastrategy import (
CtaTemplate,
BarData,
BarGenerator,
ArrayManager
)
class DemoStrategy(CtaTemplate):
""""""
author = "TOUCHANCE X"
"""定義使用者可以輸入的參數"""
sma_length = 10
lma_length = 20
parameters = [
"sma_length",
"lma_length"
]
"""定義策略運算的變數"""
sma = 0
lma = 0
variables = [
"sma",
"lma"
]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
"""BarGenetator"""
"""K 線合成"""
"""將 Tick 合成 1 K,或是將 1K 合成其他周期"""
self.bg = BarGenerator( self.on_bar )
"""ArrayManager"""
"""時間序列儲存,儲存 K 線資料"""
self.am = ArrayManager()
def on_init(self):
"""
Callback when strategy is inited.
"""
"""載入指標計算最少需要的 Bar 數量"""
self.load_bar( 10 )
def on_start(self):
"""
Callback when strategy is started.
"""
self.write_log("策略啓動")
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
am = self.am
"""K Bar 更新時"""
"""將 K Bar 的資料儲存到 ArrayManager """
am.update_bar( bar )
"""如果需要載入的 K bar 長度還不夠,就不往下計算"""
if not am.inited:
return
mp = self.pos
"""開始計算指標"""
sma = am.sma( self.sma_length, array=True )
lma = am.sma( self.lma_length, array=True )
"""判斷黃金或死亡交叉"""
cross_over = ( sma[-1] >= lma[-1] and sma[-2] < lma[-2] )
cross_under = ( sma[-1] <= lma[-1] and sma[-2] > lma[-2] )
price = bar.close_price
if cross_over:
if mp == 0:
self.buy( price, 1 )
elif mp < 0:
self.cover(price, 1)
self.buy(price, 1)
elif cross_under:
if mp == 0:
self.short( price, 1)
elif mp > 0:
self.sell( price, 1 )
self.short( price, 1 )
self.put_event()
即日起,加入達錢 4 會員,即可享受 14 天的免費試用。