语句:
···
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总是自动断开,自动重联,前一阵子还正常,请问是什么原因?截图如下:
请问
问题一、用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的错误:
源码如下:
这是我的代码和运行结果:
两行下单语句都都执行成功了,确实下了单(实盘),但为什么get_all_positions返回没有持仓、get_all_accounts返回的账户余额不正确(返回的余额是下单前的余额)?
请问如果是纯自己写的脚本策略(不是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 系统,看到不少朋友都出现了这个问题,请问怎么解决?