Bohr1005 / xcrypto

quant,trading system,crypto,async
MIT License
327 stars 90 forks source link

pob.db文件没有数据 #11

Closed benjzyq closed 2 months ago

benjzyq commented 2 months ago

你好,就是我请问正确的获取position的方式是什么?我发现即使我成功交易了,我的.net仍然返回的是0.0。然后我打开了pos.db发现里面仅仅是创建了session对应的table,里面没有数据。

Bohr1005 commented 2 months ago

你是通过交易系统下单来成交的吗,如果不是的话,这个订单对应的成交不会被推送给你策略所使用的session,持仓也不会被记录。 只有通过交易系统发出的订单成交了,才会记录下持仓。策略的日志会显示回报的推送记录,会先推送poisition,再推送trade,net直接可以取到这个session记录到的最新持仓。

benjzyq commented 2 months ago

你是通过交易系统下单来成交的吗,如果不是的话,这个订单对应的成交不会被推送给你策略所使用的session,持仓也不会被记录。 只有通过交易系统发出的订单成交了,才会记录下持仓。策略的日志会显示回报的推送记录,会先推送poisition,再推送trade,net直接可以取到这个session记录到的最新持仓。

我有点没有懂“通过交易系统下单来成交”这句话。我的步骤是先./spot -c=spot.json -l=info运行spot交易引擎,然后运行我的策略py文件。这是正常的使用步骤吗?

benjzyq commented 2 months ago

你是通过交易系统下单来成交的吗,如果不是的话,这个订单对应的成交不会被推送给你策略所使用的session,持仓也不会被记录。 只有通过交易系统发出的订单成交了,才会记录下持仓。策略的日志会显示回报的推送记录,会先推送poisition,再推送trade,net直接可以取到这个session记录到的最新持仓。

比如基于文档给出的example, `from pyalgo import *

class Demo: """"""

def __init__(self, sub: DepthSubscription):
    self.sub = sub
    # use to send/kill order
    self.smtord = SmartOrder(sub)

    self.fin = False

    # add trading phase if you need
    # otherwise self.sub.phase is always Phase.UNDEF

    # set callback
    self.sub.on_data = self.on_depth
    self.sub.on_order = self.on_order

def on_order(self, order: Order):
    info(f"{order}")

def on_depth(self, depth: Depth):
    info(f"{self.sub.datetime}, {self.sub.symbol}")

    if self.sub.net == 0:
        self.smtord.send(
            self.sub.bid_prc(0),
            55,
            Side.BUY,
            OrderType.LIMIT,
            Tif.GTC,
        )

if name == "main": eng = Engine(0.001) session = eng.make_session( addr="ws://localhost:8111", session_id=3, name="test", trading=True )

sub = session.subscribe("dogefdusd", "depth")
demo = Demo(sub)
eng.run()`

这个样子是没有办法记录net的

Bohr1005 commented 2 months ago

你是通过交易系统下单来成交的吗,如果不是的话,这个订单对应的成交不会被推送给你策略所使用的session,持仓也不会被记录。 只有通过交易系统发出的订单成交了,才会记录下持仓。策略的日志会显示回报的推送记录,会先推送poisition,再推送trade,net直接可以取到这个session记录到的最新持仓。

我有点没有懂“通过交易系统下单来成交”这句话。我的步骤是先./spot -c=spot.json -l=info运行spot交易引擎,然后运行我的策略py文件。这是正常的使用步骤吗?

你在运行策略的时候会调用make_session来创建session,通过这个session来订阅instrument,这个instrument的持仓数据就会和这个session绑定在一起,你下单的时候,系统会在订单号里把这个session的id编码进去,用来区分不同的订单,交易所返回的成交回报里面也会有这个订单号,就可以解码出是哪个session发出的订单成交了,把这个持仓记录到对应的session里面去,并异步的写入到pos.db里面。所以如果你是通过其他方式下单,例如通过binance的网页下单,他的订单号是随机生成的,就无法解码出是哪个session发出的订单,这个订单就会被认为是外部订单,系统不会记录与这个订单有关的成交和持仓,你的策略也不会收到回报,net也不会有变化

benjzyq commented 2 months ago

你是通过交易系统下单来成交的吗,如果不是的话,这个订单对应的成交不会被推送给你策略所使用的session,持仓也不会被记录。 只有通过交易系统发出的订单成交了,才会记录下持仓。策略的日志会显示回报的推送记录,会先推送poisition,再推送trade,net直接可以取到这个session记录到的最新持仓。

我有点没有懂“通过交易系统下单来成交”这句话。我的步骤是先./spot -c=spot.json -l=info运行spot交易引擎,然后运行我的策略py文件。这是正常的使用步骤吗?

你在运行策略的时候会调用make_session来创建session,通过这个session来订阅instrument,这个instrument的持仓数据就会和这个session绑定在一起,你下单的时候,系统会在订单号里把这个session的id编码进去,用来区分不同的订单,交易所返回的成交回报里面也会有这个订单号,就可以解码出是哪个session发出的订单成交了,把这个持仓记录到对应的session里面去,并异步的写入到pos.db里面。所以如果你是通过其他方式下单,例如通过binance的网页下单,他的订单号是随机生成的,就无法解码出是哪个session发出的订单,这个订单就会被认为是外部订单,系统不会记录与这个订单有关的成交和持仓,你的策略也不会收到回报,net也不会有变化

看起来我是通过您说的那个方式订阅的: `if name == "main": eng = Engine(0.001) session = eng.make_session( addr="ws://localhost:8111", session_id=3, name="test", trading=True )

sub = session.subscribe("dogefdusd", "depth")
demo = Demo(sub)
eng.run()`

即使是这样他也没有记录。我上面给出了我做测试的代码