# 闪电兑换做市商

# MOV-MMDK介绍

MOV Market Maker Develo pment Kit,基于MOV Server的RESTful API开发的Python SDK,提供获取市场深度、发送订单、取消订单、查询订单、查询账户余额等功能。

# MOV-MMDK安装

git clone https://github.com/Bytom/mov-mmdk
cd mov-mmdk/
pip3 install -r requirements.txt
python3 setup.py install

# 闪电兑换做市流程

闪电兑换是通过一方公开报价,另一方快速成交的交易模式,链下撮合,链上结算。用户在闪电兑换上没有传统交易模式的对手盘,所有的交易深度由做市商者提供。

# 闪兑做市架构

img

# 闪兑做市原理

市商在本地启动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)

在代码中添加依赖,创建FlashApi对象就可以调用MOV-MMDK提供的API参与闪电兑换做市商。

from mov_sdk.flash_api import FlashApi
FLASH_LOCAL_URL = "http://127.0.0.1:1024"  //1024为dealer.conf中设置的端口号,此处需与dealer配置文件相同
client = FlashApi(_local_url=FLASH_LOCAL_URL)//创建对象

# 获取市场深度

# Params

名称 必选 类型 描述
symbol string 交易对,如:btm_usdt

# Response

名称 类型 描述
symbol String 交易对
fee_rate String 交易手续费费率
bids Array 指定深度的买单的价格和数量
asks Array 指定深度的卖单的价格和数量
>>> print(client.get_depth("btm_usdt"))
>>> 
{
    "code": 200,
    "msg": "",
    "data": {
        "symbol": "BTM/USDT",
        "fee_rate": "0.003000",
        "asks": [
            [
                "0.0597",
                "47690.22"
            ],
            [
                "0.0598",
                "140120.65"
            ]
        ],
        "bids": [
            [
                "0.0596",
                "37857.85"
            ],
            [
                "0.0595",
                "158661.60"
            ]
        ]
    }
}

# 提交订单

# Params

名称 必选 类型 描述
symbol string 交易对,如:btm_usdt
side String 买单/卖单,buy / sell
price String 挂单价格
amount String 挂单的数量

# Response

名称 类型 描述
code Int 状态码
msg String 返回的消息
result Object 返回的结果
data Object 订单数据
├── order_id Int 订单ID
├── order Object 订单
├──── symbol String 交易对
├──── side String 交易方向
├──── price String 挂单价格
└──── amount String 挂单的数量
└── address String 发起订单的侧链地址
>>> print(client.send_order(symbol="btm_usdt", side="sell", price="5", amount="0.3"))
>>> 
{
	'code': 200,
	'msg': '',
	'result': {
		'data': {
			'order_id': 1340936,
			'order': {
				'symbol': 'BTM/USDT',
				'side': 'sell',
				'price': '5',
				'amount': '0.3'
			},
			'address': 'vp1quxu2u2m04stfc82v3ucgpr00vr0w8xuc2zqgu5'
		}
	}
}

# 取消订单

# Params

名称 必选 类型 描述
order_id String 订单ID

# Response

名称 类型 描述
code Int 状态码,200为成功
msg String 返回的消息
result Object 返回的结果
>>> print(client.cancel_order_by_id(order_id=1340936))
>>> 
{
	'code': 200,
	'msg': '',
	'result': {
		'data': None
	}
}

# 查询订单

# Params

名称 必选 类型 描述
symbol String 需要查询的交易对
side String 交易方向,buy或sell

# Response

名称 类型 描述
code Int 状态码,200为成功
msg String 返回的消息
result Object 返回的结果
data Object 订单数据
├── order_id Int 订单ID
├── order Object 订单
├──── symbol String 交易对
├──── side String 交易方向
├──── price String 挂单价格
└──── amount String 挂单的数量
└── address String 发起订单的侧链地址
>>> print(client.query_list_orders(symbol="btm_usdt", side="sell"))
>>> 
{
	'code': 200,
	'msg': '',
	'result': {
		'data': [{
			'order_id': 1340936,
			'order': {
				'symbol': 'BTM/USDT',
				'side': 'sell',
				'price': '5',
				'amount': '0.3'
			},
			'address': 'vp1quxu2u2m04stfc82v3ucgpr00vr0w8xuc2zqgu5'
		}]
 	}
}
Last Updated: 12/16/2020, 1:49:21 PM