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 天的免費試用。