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

用Python的交易员 wrote:

下午收盘后必须关闭交易软件,夜盘开盘前启动

1:老师您好,建议vntrader添加软件定时重启和API账号定时重连功能,实盘时这是非常实在的一个功能,望考虑,万分感激!

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'

用Python的交易员 wrote:

先创建MainWindow,再去调用初始化函数操作

1:老师您好,以上源码已修改,现在是先创建MainWindow,再去调用api和初始化函数操作,但是为什么没有连接到api和初始化策略呢?需要使用put_evet吗?望老师指导,万分感激

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()

hxxjava wrote:

下一步的计划

目前的K线图表只是可以显示行情,下一步计划是:让CTA策略的交易在K线图上可以K得见。

老师您好,这个功能推出的时间表大概是什么时候呢?期待,希望可以合并到官方源码中去

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个同样策略(仅修改了策略名称),目前最好的解决方案目前是?

xiaohe wrote:

只要能被整除就可以吧。如果对K线合成和K线自定义合成感兴趣,可以去看CTA进阶课程里的第七课和第八课。
1:老师您好,已反复看了多遍,就是关于这一点没能正确理解,望老师解惑,万分感激!

xiaohe wrote:

可以把屏幕分辨率改成1920x1080+缩放比例改成100%试试看。
1:老师您好,我的屏幕分辨率一直都是1920x1080+缩放比例100%
2:老师,还有其他什么好的解决方案吗?

xiaohe wrote:

  1. 可以
  2. 就是看你传进来分钟数能不能整除这个window,能的话就finished,也就是这条k线合成完了。

1:老师您好,那不是1-60分钟内任意分钟数,都可以被传进来分钟数能整除这个window,Bargenerator中的window不是可以是1-60的任意分钟数?那vnpy自带的k线合成器为什么又只能合成 2, 3, 4, 5, 6, 10, 15, 20, 30, 60这些周期的k线呢?

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

用Python的交易员 wrote:

vt_orderids = self.buy(...)

1:老师您好,我也遇到类似问题,咨询您一下,self.buy(...)括号里面是写策略名称吗?还是写其他的什么?
2:如下面代码所示,我是这么处理这个问题的,如果设置一个开关变量switch,如果开仓后,开关self.switch = 0立即复位,开仓后self.switch=1好像可以解决tick中未收到成交信息多次发单的情况,老师您好,我这么处理,与您提示的每次下单后,记录委托号,在尚未收到委托变化回报之前,不挂新的委托出去,那种效率更高,更稳定成熟呢? 小白一个,望您指点一下,万分感激!

    def on_tick(self, tick: TickData):
        self.cancel_all()
        self.bg_x.update_tick(tick)
        if self.pos > 0:
            if tick.last_price < self.long_stop and self.switch==1:
                self.sell(tick.last_price*0.9, abs(self.pos))
                self.switch = 0

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

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

用Python的交易员 wrote:

没法直接保存CTA日志,要在启动脚本run.py中注册额外事件监听,参考这里:

https://github.com/vnpy/vnpy/blob/master/examples/no_ui/run.py

日志写入是日志引擎的独立线程负责的,没什么太明显的影响

老师您好,是否可以理解为,如果想要保存log.txt文件的话,必须使用无人值守的no_ui脚本模式,对吗? vntrader界面想保存log文件的话,只支持点鼠标右键,保存为CSV? 望回复,万分感激!

xiaohe wrote:

  1. 这个推送方式应该是不会写在gateway里的,应该封装起来了或者写在服务端。在没有问题的情况下,如果不是特定间隔推送那就应该是有变化了才推送,可以自己print或者观察一下这个推送规律。如果是这样的话,这个应该没法简单的改,因为定时去查和变化推送不是同一套逻辑。如果感兴趣你可以自己研究一下。
  2. 你附的图是持仓,PositionData里本来就没有时间。因为你所有持仓不可能都是同一时间下的单,那该如何显示呢。IB的话,我看了gateway,TradeData里是有时间的,OrderData里好像没缓存,你需要的话可以自己研究缓存一下。

老师您好,如下图所示,vntrader的委托界面,IB接口,无具体的委托时间,该如何显示呢?

description

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

description

xiaohe wrote:

发单的话,只要满足你设定的条件就会发出。但是你平仓应该不会存在开一手平两手的,如果想降低发单次数可以改用停止单试试看。

老师您好,我交易的是外盘A50,外盘是净持仓制度,经测试,在平仓的时候,on_tick函数中,未收到on_trade成交回报,1秒钟内,反向开仓三十多手。

xiaohe wrote:

应该不会,感兴趣的话,可以自己试着在策略里缓存看看

老师您好,冒昧咨询一下,非正常重启(网络、电脑硬件原因),对策略的影响大概有多大影响呢?

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

沪公网安备 31011502017034号

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