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

语句:
···
contracts = engine.get_all_contracts(use_df=True)
print (contracts['exchange'].value)
···
调用engine.get_all_contracts(use_df=True)后,返回的dataframe中,exchange列中的数据是枚举类型:Exchange.DCE,Exchange.CZCE,......, 我想获取枚举对象的值,也就是想获取DCE,CZCE...该怎么写呢?尝试print (contracts['exchange'].value)时,报错了。

最近几天,CTP总是自动断开,自动重联,前一阵子还正常,请问是什么原因?截图如下:

description

请问
问题一、用engine.subscribe订阅合约123,再用engine.subscribe订阅合约456,系统推送的tick是推456,还是123456都推?
问题二、我订阅了全市场的行情,但tick返回的都是None,订阅全市场行情后,再订阅部分合约,可以返回部分合约的tick,是怎么回事?

遇到一个奇怪的情况,这两行语句:
contracts = engine.get_all_contracts(use_df=True)
contract_all_opts = contracts[contracts['product']=='Product.OPTION']
print(contract_all_opts)的结果居然是空
类似地,如果把第二行语句换成:
contract_all_opts = contracts[contracts['name']=='pg2403-C-5100']
就能输出1行正确的结果,请问是什么原因?

我买了3手v2309-C-6400,持仓均价61元,但是用engine.get_all_positions()却得到如下结果:
PositionData(gateway_name='CTP', extra=None, symbol='v2309-C-6400', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, volume=3, frozen=0, price=21.0, pnl=0.0, yd_volume=3), PositionData(gatewa
=0, price=21.0, pnl=0.0, yd_volume=3),
显示持仓均价price = 21元,请问这是怎么回事?如何得到正确的持仓均价?

请问engine.get_contract前需要先订阅行情吗? 即engine.subscribe()

脚本模式下,用多进程跑策略报错:
找不到数据服务驱动vnpy_,使用默认的RQData数据服务
Traceback (most recent call last):
File "c:\Users\wp61413_114147317492\期权交易\终稿\test2.py", line 22, in <module>
main()
File "c:\Users\wp61413_114147317492\期权交易\终稿\test2.py", line 18, in main
p1.start()
File "D:\veighna_studio\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "D:\veighna_studio\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "D:\veighna_studio\lib\multiprocessing\context.py", line 327, in _Popen
return Popen(process_obj)
File "D:\veighna_studio\lib\multiprocessing\popen_spawn_win32.py", line 93, in init
reduction.dump(process_obj, to_child)
File "D:\veighna_studio\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'thread.lock' object
找不到数据服务驱动vnpy
,使用默认的RQData数据服务
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "D:\veighna_studio\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "D:\veighna_studio\lib\multiprocessing\spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

源代码如下:

import multiprocessing
from vnpy_scripttrader import init_cli_trading
from vnpy_ctp import CtpGateway

class Strategy:
    def __init__(self,engine = init_cli_trading([CtpGateway])) -> None:
        self.engine = engine

    def stratrgy(self):
        print('111')

def main():
    commodities = Strategy()

    p1 = multiprocessing.Process(target=commodities.stratrgy)
    p2 = multiprocessing.Process(target=commodities.stratrgy)
    p1.start()
    p2.start()

if __name__ == '__main__':
    main()

配置都是一模一样的,图形界面显示全部连接成功,但是脚本模式却报4097的错误:

description
源码如下:

description

这是我的代码和运行结果:
两行下单语句都都执行成功了,确实下了单(实盘),但为什么get_all_positions返回没有持仓、get_all_accounts返回的账户余额不正确(返回的余额是下单前的余额)?

description

description

请问如果是纯自己写的脚本策略(不是no_ui启动),如何开启风控?

我想获得CTP连接状态的返回值,CtpMdApi和CtpTdApi有login_status/connect_status变量,请问如何获取connect_status变量的值呢?
写了如下代码:
from vnpy_ctp.gateway.ctp_gateway import CtpMdApi,TdApi
engine2 = CtpMdApi(TdApi)
运行时报错:
Traceback (most recent call last):
File "C:\Users\wp61413_114147317492\期权交易\终稿\ScriptTrader_vnpy_impvplace_commodityDos.py", line 9, in <module>
engine2 = CtpMdApi(TdApi)
File "D:\veighna_studio\lib\site-packages\vnpy_ctp\gateway\ctp_gateway.py", line 250, in init
self.gateway_name: str = gateway.gateway_name
AttributeError: type object 'vnpy_ctp.api.vnctptd.TdApi' has no attribute 'gateway_name'
请问如何获取呢?谢谢!

请教:
问题一、用脚本策略运行多品种策略时,a = Return10Strategy(StrategyEngine,'zhangsan',vt_symbols,setting) 中的StrategyEngine传什么参数?
问题二、以下代码是用组合策略的模板写的,为什么运行时,打印的bar都是None?

from vnpy_scripttrader import init_cli_trading
from vnpy_ctp import CtpGateway
engine = init_cli_trading([CtpGateway])

setting = {
"用户名": "*",
"密码": "*",
"经纪商代码": "*",
"交易服务器":"*",
"行情服务器":"*",
"产品名称":"*",
"授权编码":"*"
}
engine.connect_gateway(setting,"CTP")

from typing import List, Dict
from datetime import datetime

from vnpy_portfoliostrategy import StrategyTemplate, StrategyEngine
from vnpy.trader.utility import BarGenerator, ArrayManager
from vnpy.trader.object import TickData, BarData

from vnpy.trader.constant import Interval

vt_symbols = ['rb2309.SHFE','rb2310.SHFE']

class Return10Strategy(StrategyTemplate):
""""""

author = "KeKe"

price_add_percent = 0.05    # 超价5%下单
fixed_pos_value = 1000000   # 每个合约做100万
signal_ts = {}
signal_total = {}
last_tick_time: datetime = None
trade_day = 0
targets_pos = {}

parameters = [
    "price_add_percent",
    "fixed_size",
]
variables = [
    "signal_ts", "signal_total",
    "trade_day", "targets_pos"
]

def __init__(
    self,
    strategy_engine: StrategyEngine,
    strategy_name: str,
    vt_symbols: List[str],
    setting: dict
):
    """"""
    super().__init__(strategy_engine, strategy_name, vt_symbols, setting)

    self.bgs: Dict[str, BarGenerator] = {}
    self.ams: Dict[str, ArrayManager] = {}

    # Obtain contract info
    for vt_symbol in self.vt_symbols:
        def on_bar(bar: BarData):
            """"""
            pass

        self.bgs[vt_symbol] = BarGenerator(on_bar)
        self.ams[vt_symbol] = ArrayManager()

def on_init(self):
    """
    Callback when strategy is inited.
    """
    print("策略初始化")

def on_start(self):
    """
    Callback when strategy is started.
    """
    print("策略启动")

def on_stop(self):
    """
    Callback when strategy is stopped.
    """
    print("策略停止")

def on_tick(self, tick: TickData):
    """
    Callback of new tick data update.
    """
    if (
        self.last_tick_time
        and self.last_tick_time.minute != tick.datetime.minute
    ):
        bars = {}
        for vt_symbol, bg in self.bgs.items():
            bars[vt_symbol] = bg.generate()
        self.on_bars(bars)

    bg: BarGenerator = self.bgs[tick.vt_symbol]
    bg.update_tick(tick)

    self.last_tick_time = tick.datetime

def on_bars(self, bars: Dict[str, BarData]):
    """"""
    # 1) 全撤
    #self.cancel_all()

    # 2.3)初始化am &计算时间序列
    for vt_symbol, bar in bars.items():
        am: ArrayManager = self.ams[vt_symbol]
        am.update_bar(bar)
        print(am)
        # if not am.inited:
        #     return

        # 信号 过去10天的收益率
        return10 = am.rocp(10)

        # 信号>0,时序信号+1,信号<0,时序信号-1
        if return10 > 0:
            self.signal_ts[vt_symbol] = 1
        elif return10 < - 0:
            self.signal_ts[vt_symbol] = -1
        else:
            self.signal_ts[vt_symbol] = 0

    # 3)信号汇总,总信号=时序信号汇总 + 横截面信号汇总
    # 基于总体信号,得到目标持仓
    for vt_symbol, bar in bars.items():
        self.signal_total[vt_symbol] = self.signal_ts[vt_symbol]
        self.targets_pos[vt_symbol] = int(
            self.fixed_pos_value / bar.close_price
        ) * self.signal_total[vt_symbol]

    # 3)交易执行(每隔10个交易日检查并且调仓)
    if self.trade_day == 0 or not self.trade_day % 10:

        for vt_symbol in self.vt_symbols:
            bar = bars.get(vt_symbol)
            if not bar:
                continue

    self.put_event()

vt_symbols = ['rb2309.SHFE','rb2310.SHFE']
a = Return10Strategy(StrategyEngine,'zhangsan',vt_symbols,setting)
while True:
for vt_symbol in vt_symbols:
print(a.bgs[vt_symbol].bar)

由于不属于CTA策略,所以不想套用CTA策略的模板,请问如何使用脚本策略合成K线。比如:轮询合约ABC,输出ABC的1分钟K线。

get_trades
入参:vt_orderid: str, use_df: bool = False
出参:Sequence[TradeData]
根据给定的一个vt_orderid返回这次报单过程中的所有TradeData对象。vt_orderid是本地委托号,每一个委托OrderData,由于部分成交关系,可以对应多笔成交TradeData。

这是文档中对get_trades的介绍,请问TradeData是指的什么?gei_orders已经返回了哪些成交,哪些未成交,这个TradeData有什么用?哪里可以查到它的数据结构?

使用说明的文档上写:
get_position
入参:vt_positionid: str, use_df: bool = False
出参:PositionData
根据vt_positionid来查询持仓情况,返回对象包含接口名称、交易所、合约代码、数量、冻结数量等。
position = engine.get_position(vt_positionid='rb2202.SHFE.多')

这是查询某个交易所某个合约某个方向的持仓情况的语句,如果想查询所有的持仓,该如何写呢?

我想查询自己的账户里有多少钱,脚本策略运行以下的代码:
account = engine.get_account(vt_accountid="CTP.189672",use_df=False)
请问怎么才能知道自己账户的vt_accountid?

用的windows 10 系统,看到不少朋友都出现了这个问题,请问怎么解决?
description

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

沪公网安备 31011502017034号

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