# 常见问题 FAQ

# 行情网关订阅合约列表为空

订阅合约列表为空 这是因为不同的网关合约来源不同:
对于CTP网关,合约来源有两个,要么是开通了实盘账号,要么是开通了数据服务。若没有CTP合约,可使用模拟合约,详情参考 模拟行情下的模拟交易

# 数据服务已经配置了secret,但请求仍然报401或者403

这代表你的SECRET配置没有生效。打开jshell环境验证一下

jshell> System.getenv("NS_DS_SECRET")

# 能否增加期货公司选项

期货公司列表 可以,详情参考 CTP网关 (opens new window)

# 监控台登录时,显示“服务端未启动”

服务端未启动 常见于前后端启动的profile不一致造成。
注意,在开发环境下,前后端用http通信;在生产环境下,前后端用https通信。
服务端默认是以dev模式启动,桌面监控台则是production模式启动。
若前端使用桌面监控台,服务端必须以prod模式启动;
若开发环境下,前端监控台用 npm start 启动 northstar-monitor 项目。

# 监控台登录时,显示“使用了非法登录时间戳,请同步校准电脑时间”

这个错误意味着监控台系统时间与服务器时间之时的时差过大,容许的误差必须在60秒以内。

# 启动程序报错,找不到BuildProperties

IDEA启动报错 要先对 northstar 目录运行 mvn install

# 为什么开发环境与生产环境不能统一使用http或https

生产环境不使用http一是出于安全考虑;二是electron桌面端对https更友好,使用http会有问题。
开发环境不使用https是由于证书问题,导致websocket连接会默认被拒绝,尽管能通过一些操作解决这个问题,但这个坑比较深,比上述提及到的前后端环境不统一的处理还要麻烦。
所以综合考虑下来,便让开发环境使用http,而生产环境使用https。

# CTP网关无法连线

  • 请确保当前是开市时间。CTP网关正常工作时间:交易日日盘8:30至15:30,夜盘20:30至2:30
  • 请确保开通了宏源实盘账户
  • 请确保账户名与密码无误
  • 请确保选择了正确的主次席选项

# 手动干预账户持仓,模组账户的持仓没有同步

首先要明确的是,账户模组账户 是两个完全独立的概念。
账户 是指在账户管理页面能创建的账户实例;
模组账户 则是指在创建模组时,为模组创建的一个虚拟账本,它主要是为了方便统计模组的绩效而设置的。
由于一个 账户 会关联多个模组,因此 账户模组账户 是一对多的关系。所以,当对 账户 持仓进行手工干预时,模组账户 是无法自行同步。同理,如果手工调整 模组账户 的持仓也不会对 账户 持仓产生任何影响。
所以,当 账户 持仓与 模组账户 持仓不一致时,可以手动干预任何一边,使两边同步。具体操作请参考【如何同步模组持仓】
需要特别注意,当一个账户关联了多个模组账户时,请务必核对持仓总数,以免出错造成不必要的损失。

# 开仓下单如何带上止损

由于止损价是基于交易所接口的实现,并非所有的交易所都能支持开仓带止损,因此为了避免不可控的情况,建议在策略层自行实现止损的逻辑。
此外,止损逻辑也属于交易策略的一部分,有些止损是会按实际情况动态变动的,所以应该按实际情况自行实现。

# 为什么控制台看不到模组日志

因为模组的日志被单独输出。可从模组管理页面的【日志】入口在监控台查看,也可以找到日志文件夹以模组命名的目录查找日志文件

# 为什么不支持SIMNOW

SIMNOW是上期技术开发的CTP测试平台,仅对接口开发时有用。Northstar 已经为用户踩过相应的坑,因此用户没有使用SIMNOW的必要。更关键的是,SIMNOW平台经常性不靠谱,用户不熟悉时,会分不清楚是程序有问题还是SIMNOW有问题。所以,这就是 Northstar 不支持SIMNOW的原因。

# 为什么使用redis而没有使用一般常见的数据库

首先,从程序的设计上看,作者为了简化用户的维护难度,把历史数据的维护剥离了。用户无需维护繁杂的来自不同交易所接口的历史行情数据,直接通过调用第三方服务来获取历史数据。
因此,剩下的数据存储需求便只有一些基本的配置信息,以及缓存当天的实时行情数据。在作者看来,正因为redis既能当缓存又能当数据库,能很简单地满足业务需求;加上IO读写效率要远高于一般的数据库,采用redis可谓是再合适不过了。

# 为什么回测股票历史行情时不要做复权处理

因为策略在实盘运行时,是无法进行复权处理的。如果回测时做了复权处理,到了实盘运行就会导致策略变形。

# 为什么实盘运行时无法进行复权处理

因为历史数据不能被改写。假设N日的数据已经加载到内存中,第N+1日出现了除权。如果采用后复权处理,就会导致计算的价格与实盘下单价格不一致;如果采用前复权处理,就需要把内存中的历史全部计一次。但历史数据是不能被改写的。