VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 5
声望: 0

按照课程步骤在user/adminstrator 下创建strategies 文件夹并创建demo_strategy.py文件,所有代码和课程内一样,但是打开vn station回测里面并没有这个策略。如何解决?

Member
avatar
加入于:
帖子: 4618
声望: 284

请问启动目录是在user/adminstrator下吗?

Member
avatar
加入于:
帖子: 5
声望: 0

是的。 只不过我的用户名是自己的。底下是按照课程敲进去的代码。查过几遍了 应该是一样的。。

from calendar import c
from multiprocessing.dummy import Array
from termios import TIOCPKT_DATA
from typing import Any
from vnpy_ctastrategy import (
CtaTemplate
)
from vnpy.trader.object import (
BarData,
TickData
)
from vnpy.trader.utility import (
BarGenerator,
ArrayManager
)

class DemoStrategy(CtaTemplate):
""""""

author = "Leo Fang"

# 定义参数
fast_window = 10
slow_window = 20

# 定义变量
fast_ma0 = 0.0
fast_ma1 = 0.0
slow_ma0 = 0.0
slow_ma1 = 0.0

parameters = [
    "fast_window",
    "slow_window"
]

variables = [
    "fast_ma0",
    "fast_ma1",
    "slow_ma0",       
    "slow_ma1",
]

def __init__(
    self,
    cta_engine: Any,
    strategy_name: str,
    vt_symbol: str,
    setting: dict,
):
    super().__init__(
        cta_engine, strategy_name, vt_symbol, setting
    )

    self.bg = BarGenerator(self.on_bar)
    self.am = ArrayManager()

def on_init(self):
    self.write_log("策略初始化")

    self.load_bar(10)

def on_start(self):
    self.write_log("策略启动")    

def on_stop(self):
    self.write_log("策略停止")

def on_tick(self, tick: TickData):
    self.bg.update_tick(tick) 

def on_bar(self, bar: BarData):
    am = self.am

    am.update_bar(bar)
    if not am.inited:
        return

    fast_ma = am.sma(self.fast_window, array=True)
    fast_ma0 = fast_ma[-1]
    fast_ma1 = fast_ma[-2]

    slow_ma = am.sma(self.slow_window, array=True)
    slow_ma0 = slow_ma[-1]
    slow_ma1 = slow_ma[-2]

    cross_over  = (self.fast_ma0 >= self.slow_ma0 and
                   self.fast_ma1 < self.slow_ma1)

    cross_below = (self.fast_ma0 <= self.slow_ma0 and
                   self.fast_ma1 > self.slow_ma1)

    if cross_over:
        price = bar.close_price + 5

        if not self.pos:
            self.buy(price,1)
        elif self.pos < 0:
            self.cover(price,1)
            self.buy(price, 1)

    elif cross_below:
        price = bar.close_price - 5

        if not self.pos:
            self.short(price, 1)
        elif self.pos > 0:
            self.sell(price, 1)
            self.short(price, 1)

    self.put_event()
Member
avatar
加入于:
帖子: 4618
声望: 284

请问示例策略能显示吗?如果不能,请升级至最新版再试试
如果示例策略能显示,可以自己在vnpy_ctabacktester.engine的load_strategy_class函数下打印一下读取的path

Member
avatar
加入于:
帖子: 5
声望: 0

是这段代码吗 具体如何添加Path呢?

def load_strategy_class(self):
    """
    Load strategy class from source code.
    """
    app_path = Path(vnpy_ctastrategy.__file__).parent
    path1 = app_path.joinpath("strategies")
    self.load_strategy_class_from_folder(path1, "vnpy_ctastrategy.strategies")

    path2 = Path.cwd().joinpath("strategies")
    self.load_strategy_class_from_folder(path2, "strategies")
Member
avatar
加入于:
帖子: 4618
声望: 284

你打印一下path2看看是否是你放置策略的路径

Member
avatar
加入于:
帖子: 4
声望: 0

同问一样的问题, 可以显示自带的策略类, 但是自己新建的不能显示. 新建的策略,代码完全复制双均线或者atr的,不存在代码有错误的问题.

Member
avatar
加入于:
帖子: 4
声望: 0

问题解决了, 历史回测显示的是 策略代码里面的类名, 不是文件名, 如果类名一样就只显示一个

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】