gateway的资产管理¶
- 网关模块负责管理和同步资产。将最新的资产信息写入共享内存,其它进程可以从共享内存中读取最新的资产信息
- 共享内存中所有的信息,只能有一个写入者,所以网关模块是资产的唯一维护者,其它所有的模块只能读取,不能修改资产
- 支持虚拟账户,详见 共享内存资产&策略资产
如何维护资产¶
- 初始化:系统初始化的时候,通过REST API获取资产余额 → 初始化资产
- 成交:每次有成交发生的时候,本地计算余额变化 → 更新到共享内存
- 定时同步:每60秒 REST API 校验并修正,有具体的校验和修正逻辑
- IPC命令:外部指令调整资金 → 调用虚拟账户相关的API来分配&管理资金
如何读取资产¶
通过API直接从共享内存中读取资产信息
资产¶
简单的资产逻辑,没有虚拟子账户的概念
import hft
get_single_quote_currency = hft.getSingleQuoteCurrency
def get_balance(exchange: Exchange, currency: Currency) -> SingleQuote:
return get_single_quote_currency(
exchange,
DataType.BALANCE,
currency,
)
# 获取并输出USDT余额
usdt_balance = get_balance(Exchange.KRAKEN, Currency.USDT)
print(f"USDT Balance: {usdt_balance.mid}")
策略资产¶
模拟虚拟子账户的逻辑,每个虚拟子账户对一个子策略
from hftpy.common import StrategyBalanceManager
import hft
# 创建管理器(Kraken交易所,8个策略槽位)
manager = StrategyBalanceManager(hft.Exchange.KRAKEN, strategy_count=8)
total = manager.get_balance(hft.Currency.USDC, index=0) # 总资金
available = manager.get_balance(hft.Currency.USDC, index=1) # 主策略(可用)
strategy_a = manager.get_balance(hft.Currency.USDC, index=2) # 策略A
strategy_b = manager.get_balance(hft.Currency.USDC, index=3) # 策略B
print(f"USDC: total={total}, available={available}, strategy_a={strategy_a}, strategy_b={strategy_b}")
IPC命令¶
策略和网关在不同的进程,通过RPC的方式进行资金操作
子策略申请或者归还资金¶
- 调用allocate或者release来申请或者归还资金
// 申请资金
{
"strategy": "a", // 策略名称
"cmd": "allocate", // 申请资金
"currency": "usd", // 币种
"amount": 100, // 申请金额
"index": 2 // 子策略索引
}
// 归还资金
{
"strategy": "a", // 策略名称
"cmd": "release", // 归还资金
"currency": "usd", // 币种
"amount": 100, // 归还金额
"index": 2 // 子策略索引
}
from hftpy.ipc.ipc_command_system import IPCCommandSystem
from hftpy.common import KRAKEN_STRATEGY_BALANCE_CMD
from hftpy.common.kraken_gateway_proto import kraken_strategy_balance
# 初始化 IPC 命令系统
command_system = IPCCommandSystem("my_strategy")
command_system.start()
# 申请资金
payload = kraken_strategy_balance(
strategy="a",
cmd="allocate",
currency="usd",
index=2,
amount=100
)
await command_system.send_command("kraken_gateway", KRAKEN_STRATEGY_BALANCE_CMD, payload)
# 归还资金
payload = kraken_strategy_balance(
strategy="a",
cmd="release",
currency="usd",
index=2,
amount=100
)
await command_system.send_command("kraken_gateway", KRAKEN_STRATEGY_BALANCE_CMD, payload)
转账成功¶
- 成功转入或者转出后,调用adjust通知网关调整总资产
// 转账:资金转出
{
"strategy": "a", // 策略名称
"cmd": "adjust", // 命令类型
"currency": "usd", // 币种
"amount": -1000, // 调整金额(负数表示转出)
"index": 0 // 索引(0=总资金)
}
from hftpy.ipc.ipc_command_system import IPCCommandSystem
from hftpy.common import KRAKEN_STRATEGY_BALANCE_CMD
from hftpy.common.kraken_gateway_proto import kraken_strategy_balance
# 初始化 IPC 命令系统
command_system = IPCCommandSystem("my_strategy")
command_system.start()
# 转账成功后通知网关调整总资产
payload = kraken_strategy_balance(
strategy="a",
cmd="adjust",
currency="usd",
delta=-1000, # 负数表示转出
index=0 # 0=总资金
)
await command_system.send_command("kraken_gateway", KRAKEN_STRATEGY_BALANCE_CMD, payload)