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

首先我已经更新到最新版本了
macd 用的参数是 12,26,9(标准数值)

数据来源是米筐

合约是y2101

执行策略如下

from typing import Any
from vnpy.app.cta_strategy import (
    CtaTemplate,
    BarGenerator,
    ArrayManager
)
from vnpy.trader.object import (
    BarData,
    TickData
)

# 定义自己的策略类
class MACD_1m_Stragety(CtaTemplate):
""""""
# 1、策略作者
author = "qqfood"
# 2、定义类的参数



# 3、定义类的变量
fast_ma0 = 0.0
fast_ma1 = 0.0
slow_ma0 = 0.0
slow_ma1 = 0.0

parameters =[]

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("策略初始化")
    # 加载10天的历史数据用于初始化回放
    self.load_bar(10)

def on_start(self):
    """
    当策略被启动时候调用该函数
    """
    self.write_log("策略启动")

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

def on_tick(self,tick:TickData):
    """TICK更新"""
    self.bg.update_tick(tick)



def on_bar(self, bar:BarData):
    """K线更新"""
    am =self.am

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


    self.macd_macd, self.macd_signal, self.macd_hist = am.macd(12,26,9,array=True)


    self.fast_ma0 = self.macd_macd[-1]
    self.fast_ma1 = self.macd_macd[-2]

    self.slow_ma0 = self.macd_signal[-1]
    self.slow_ma1 = self.macd_signal[-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.sell(price,1)
        elif self.pos>0:
            self.sell(price,1)
            self.short(price,1)
    # 更新图形界面
    self.put_event()


vn.py 回测的结果 是显示红框中第绿柱子 是死叉

description

文华财经的结果 是显示红框中第 绿柱子 是死叉

description

金叉也是不一致 文华财经 红框中第 二根柱子 vn.py 是第三根柱子

文华财经

description

vn.py

description

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

可参考https://www.vnpy.com/forum/topic/2536-he-qi-ta-ping-tai-shu-ju-bu-yi-zhi
https://www.vnpy.com/forum/topic/3303-guan-yu-4hde-macdzhi-biao-ji-suan-wen-ti

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

策略执行中,为何没有成交记录

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

xy8008133 wrote:

策略执行中,为何没有成交记录
请自行打印策略状态进行排查了

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

怀疑self.macd_macd, self.macd_signal, self.macd_hist = am.macd(12,26,9,array=True)中
am.macd这句没有数据输出

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

请问是不是am还没初始化就开始计算了

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

刚刚测试了一下,talib计算MACD指标的返回值
macd(a), signal(b), hist(c) = talib.MACD(self.close, fast_period, slow_period, signal_period) # 这里是vnpy里面的代码,
和通达信软件的数据有差别。talib.macd返回的三个参数依次为通达信软件中的DIF, DEA, MACD / 2。

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

沪公网安备 31011502017034号

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