VeighNa量化社区
你的开源社区量化交易平台
ranjianlin's Avatar
Member
离线
244 帖子
声望: 0

1:老师您好,咨询一下,no_ui无人值守模式,如果想要在交易时间结束的那一刻,同步持仓数据和变量,除了把sync_data函数写入到策略外,还有其他方法在no_ui脚本中来实现这个功能吗?

1:老师您好,咨询一下,如果直接使用vntrader连接ib gateway的话,可以正常从ib gateway拉取历史数据初始化,一般5个策略初始化时间为3分钟左右,但是如果使用RPC服务器进行CTA策略的初始化,5个策略就会在1秒内直接初始化完成,这种差距太大了,是否是RPC无法从API拉取历史数据进行初始化呢? 只能是实时行情的数据推送?望Enhancement这个功能,万分感激!

2:老师您好,如果想在RPC服务端添加一个通过API拉取历史数据行情的功能,是否是把vnpy\gateway\ib\ib_gateway.py中关于拉取历史行情的代码复制粘贴到vnpy\rpc__init__中,自己没有方向,老师方便指点一下吗?万分感激!

1:老师您好,咨询一下,如下图所示,Jupyter的portfolio_backtesting回测中,有5个策略,每个策略的capital设置为2000元,5个策略capital共计应该是1万元,但是回测结果显示起始资金却是1,000,000.00元,这个该如何修改为自定义金额呢?望指导,万分感激!

description

1:RPC客户端可以看见RPC服务端运行的策略,并且RPC客户端初始化、启动、停止、编辑、移除均报错提示KeyError,十分困惑,是RPC客户端不能和服务端启动一样的策略和填写一样的策略名称吗?那应该如何在RPC客户端运行策略呢?可以看见“CTA策略信息框”内的信息完全和服务端一致,望老师解疑,万分感激!

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\vnpy20200804\vnpy-master\vnpy\app\cta_strategy\ui\widget.py", line 284, in remove_strategy
    result = self.cta_engine.remove_strategy(self.strategy_name)
  File "C:\Users\Administrator\Desktop\vnpy20200804\vnpy-master\vnpy\app\cta_strategy\engine.py", line 735, in remove_strategy
    strategy = self.strategies[strategy_name]
KeyError: '7'

1:老师好,如下面代码所示,在no_ui脚本模式基础上添加了图形界面,成功连接到行情和初始化了策略,并且界面也启动成功,但是为什么启动后图形界面什么都没有更新呢?CTA策略图形界面也没有打开,该如何改进,望老师指导,万分感激!

import multiprocessing
from time import sleep
from datetime import datetime, time
from logging import INFO

from vnpy.event import EventEngine
from vnpy.trader.setting import SETTINGS
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp


from vnpy.gateway.ib import IbGateway
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_strategy.base import EVENT_CTA_LOG


SETTINGS["log.active"] = True
SETTINGS["log.level"] = INFO
SETTINGS["log.console"] = True
SETTINGS["log.file"] = True

ib_setting = {
    "TWS地址": "127.0.0.1",
    "TWS端口": 4002,
    "客户号": 1,
    "交易账户": ""
}

def run_child():
    """
    Running in the child process.
    """
    qapp = create_qapp()

    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)





    main_engine.add_gateway(IbGateway)
    cta_engine = main_engine.add_app(CtaStrategyApp)
    main_engine.write_log("主引擎创建成功")


    log_engine = main_engine.get_engine("log")
    event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event)
    main_engine.write_log("注册日志事件监听")



    main_window = MainWindow(main_engine, event_engine)
    main_window.showMaximized()
    qapp.exec()




    main_engine.connect(ib_setting, "IB")
    sleep(3)
    main_engine.write_log("已连接到盈透API")



    cta_engine.init_engine()
    main_engine.write_log("CTA策略开始初始化")

    cta_engine.init_all_strategies()

    sleep(10)   # Leave enough time to complete strategy initialization


    main_engine.write_log("CTA策略已全部初始化")

    cta_engine.start_all_strategies()
    main_engine.write_log("CTA策略已全部启动")


    sleep(10)

    while True:

        sleep(1)


def run_parent():
    """
    Running in the parent process.
    """
    print("启动CTA策略守护父进程")

    # Chinese futures market trading period (day/night)
    DAY_START = time(8, 45)
    DAY_END = time(16, 40)

    NIGHT_START = time(16, 55)
    NIGHT_END = time(5, 20)



    child_process = None

    while True:
        current_time = datetime.now().time()
        trading = False

        # Check whether in trading period
        if (
            (current_time >= DAY_START and current_time <= DAY_END)
            or (current_time >= NIGHT_START)
            or (current_time <= NIGHT_END)
        ):
            trading = True

        # Start child process in trading period
        if trading and child_process is None:
            print("启动子进程")
            child_process = multiprocessing.Process(target=run_child)
            child_process.start()
            print("子进程启动成功")

        # 非记录时间则退出子进程
        if not trading and child_process is not None:
            print("关闭子进程")
            child_process.terminate()
            child_process.join()
            child_process = None
            print("子进程关闭成功")

        sleep(5)


if __name__ == "__main__":
    run_parent()

1:如下代码所示,如果把代码第一行和第二行注释掉,write_log函数就无法把日志写入本地log文件了,想咨询一下,write_log函数与第一行和第二行代码之间的关联是?
2:想咨询一下log_engine具体的工作逻辑是? 它是如何把日志保存到本地的呢?相关处理逻辑代码是?

1:    log_engine = main_engine.get_engine("log")
2:    event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event)
3:    main_engine.write_log("注册日志事件监听")

1:同一品种加载2个同样策略(仅修改了策略名称),里面的参数和变量是否会相互影响?
2:同一品种加载2个同样策略(仅修改了策略名称),目前最好的解决方案目前是?

1:如下图所示,最近一个月一直正常使用,今天突然CTA回测界面中间回测结果输出异常变窄,左边异常变宽,这是什么原因造成的呢?(未更改设置,也为修改分辨率)
2:关于这种异常,有什么好的解决方案吗?已尝试删除.vntrader文件夹,和重新下载vnpy包运行,均无法解决,望回复,万分感激!

description

1:vnpy自带的BarGenerator能被4整除,是不是意味着vnpy原生支持4分钟k线呢? x minute bar, x must be able to divide 60: 2, 3, 5, 6, 10, 15, 20, 30
2:老师您好,一直没能理解下面这段代码的意思,可以帮忙科普一下吗?万分感激!

           # x-minute bar
            if not (bar.datetime.minute + 1) % self.window:
                finished = True

1:老师您好,咨询一下,可以通过加载api历史数据计算出的变量,是否有必要放入variables列表里面去呢?

1:老师您好,咨询一下,如何在vntrader界面的委托和成交后面添加一栏策略名称呢? 实盘测试时发现策略一个bug,因为启动了10个策略,所以不确定某个委托号对应的是那个策略,望指导,万分感激

1:vntrader界面版使用日志self.write_log 函数,为什么不会写到日志文件里?只显示在页面上呢? self.write_log只支持no_ui无人值守模式吗? 全局配置设置如下:

description

1:使用如下代码,会存在重复发单的情况,可能是程序还未接收到成交回报,就再次发单了,如何避免这类情况呢?王老师指导,万分感激!

def on_tick(self, tick: TickData):

        self.cancel_all()
        self.bg_x.update_tick(tick)
        self.price = tick.last_price

        if self.pos > 0:
            if tick.last_price < self.long_stop:
                self.sell(tick.last_price*0.9, abs(self.pos))
                self.write_log(f"策略名称:15号策略  {tick.datetime}  多头平仓:{abs(self.pos)}手  {tick.last_price*0.9}  备注:保命出场")


        elif self.pos < 0:
            if tick.last_price > self.short_stop:
                self.cover(tick.last_price*1.2, abs(self.pos))
                self.write_log(f"策略名称:15号策略  {tick.datetime}  空头平仓:{abs(self.pos)}手  {tick.last_price*1.2}  备注:保命出场")
        self.put_event()

咨询老师一下,在on_trade中使用trade.offset == Offset.CLOSE如何获取平仓手数呢?我使用如下代码获取到的结果是,平仓: 0 手

    def on_trade(self, trade: TradeData):
        if trade.offset == Offset.CLOSE:
            self.bar_counts = 0           
            print("策略名称:15号",trade.datetime,"平仓:", abs(self.pos),"手",trade.price,"备注:平仓")

打印出来的结果显示如下:平仓:0 手

策略名称:15号策略 2020-02-24 18:18:00+08:06 平仓: 0 手 13450.0 备注:平仓

望指导,万分感激!

1:vnpy中的持仓数据是多久更新一次呢?
2:具体是在vnpy的那个文件可以查询到持仓更新时间间隔呢?

关于vnpy意外停止,委托单全部取消,重启后是否还会重新发送原来取消的委托订单呢?

1:在vnpy中如何避免反复打印开平仓数据呢?限制只打印一次即可

 if self.pos > 0:
     print(bar.datetime,bar.close_price ,"开空单  开仓手数:",self.lots)

description

1:原版example下的no_ui_run.py,在策略停止的时候都没有调用stop_all_strategy,这样就不会把结束时候的状态保存下来,这样就不是无人值守啊,example下的no_ui_run.py中是否有必要同步持仓和止盈止损的数据,把结束时候的状态保存下来,防止run.py的重启?

2:如何在策略on_bar函数内调用sync_data函数来同步数据?是直接在on_bar的最后面添加一句 self.sync_data就可以了吗?

        self.sync_data

        self.put_event()

2.1:如果在on_tick 、on_bar、on_xmin_bar都有交易,是否需要在on_tick 、on_bar、on_xmin_bar都添加self.sync_data这句代码呢?

3:是否可以在no_ui_run.py中,实现类似vntrader界面版一样,点击全部停止后,就自动同步持仓和止盈止损的variables列表数据到硬盘中? 望指导,万分感激

1:如何在no_ui.py中添加vnpy的email成交发送邮件的功能?望指导

1:老师您好,咨询一下,可以通过加载api数据计算出的变量,是否有必要放入variables列表里面去呢?

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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