如何在闪电兑换中参与做市商?
闪电兑换是通过一方公开报价,另一方快速成交的交易模式,链下撮合,链上结算。用户在闪电兑换上没有传统交易模式的对手盘,所有的交易深度由做市商者提供。本篇文章会讲述闪兑的架构,并通过一个例子展示如何在闪电兑换中挂单交易。
闪兑做市架构
闪兑做市原理
市商在本地启动Dealer,通过本地Dealer的RESTful API发送订单以及撤销订单。在这个过程中,做市商需要不断的轮询Mov Server服务器来获取账户资产余额的变化,变化部分即是闪电兑换成交的资产。
闪兑做市教程
准备Dealer配置文件
单签地址做市配置如下:
{
"port": 1024,
"bycoin_url": "https://ex.movapi.com",
"flash_swap_url": "47.101.190.112:50052",
"mnemonic": "你的助记词",
"derive_rule": {
"account_idx": 1,
"address_idx": 1
},
"network": "mainnet",
"logs": {
"rotate_time": "24h",
"max_age": "72h"
}
}
多签地址做市配置如下:
{
"port": 1024,
"bycoin_url": "https://ex.movapi.com",
"flash_swap_url": "47.101.190.112:50052",
"mnemonic": "你的助记词",
"derive_rule": {
"account_idx": 1,
"address_idx": 1
},
"quant_mode": {
"quant_delegation_url": "https://ex.movapi.com/delegation",
"funder_pubkey": 三方管理的合作伙伴公钥",
"attester_pubkey": "三方管理生成的公钥"
},
"network": "mainnet",
"logs": {
"rotate_time": "24h",
"max_age": "72h"
}
}
port是本地使用的端口号,默认使用1024,可以自行设置 derive_rule 是私钥的派生路径,原则上不用修改 flash_swap_url 闪兑服务器地址 quant_mode 是量化端口时要设置的配置
后台运行Dealer
使用mmdk关于闪兑的方法前,需要先启动Dealer并指定正确的配置文件dealer.conf 可以将两部分文件放在同一目录下,启动服务的命令行如下:
$ nohup ./linux_dealer_hz_test dealer.conf &
Dealer后台运行后,可以通过$ ps -aux | grep dealer来查询程序Dealer进程是否成功运行。
调用MOV-MMDK提供的方法
目前针对闪电兑换,MMDK提供了以下几个方法 可供使用:
- get_depth(self, symbol) 获取市场深度
- send_order(self, symbol, side, price, amount) 发送交易订单
- cancel_order_by_id(self, order_id) 取消订单
- query_list_orders(self, symbol, side) 查询订单
1.通过python3启动python解释器,在代码中添加依赖,创建FlashApi对象就可以调用MOV-MMDK提供的API参与闪电兑换做市商。
from mov_sdk.flash_api import FlashApi
//1024为dealer.conf中设置的端口号,此处需与dealer配置文件相同
FLASH_LOCAL_URL = "http://127.0.0.1:1024"
client = FlashApi(_local_url=FLASH_LOCAL_URL)//创建对象
2.查询闪兑市场中指定交易对的深度
print(client.get_depth("btm_usdt"))
3.发送订单提供深度,例如我们发送一笔价格为0.07u,数量为0.1btm的卖单
print(client.send_order(symbol="btm_usdt", side="sell", price="0.07", amount="0.1"))
可以再次查询深度,并与步骤2的查询结果对比
print(client.get_depth("btm_usdt"))
显然,我们刚刚发送的订单已经可以被查询到了。
4.通过交易对和交易方向查询订单
print(client.query_list_orders(symbol="btm_usdt",side="sell"))
通过这个方法可以查询到我们订单的信息。通过订单的order_id我们可以取消订单。
5.取消订单
print(client.cancel_order_by_id(order_id=32487))
成功取消后再次查看深度,可以发现我们的订单已经不在asks队列中