从零开始搭建链上dex自动化价差套利程序(11)

2023-12-09 19:45

本文主要是介绍从零开始搭建链上dex自动化价差套利程序(11),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

风险控制

需要将仓位杠杆控制到3倍以内,由于dydx与apex没有获取仓位杠杆的接口,但是每次发送交易的数额可以决定,故而可以设置每次发送总仓位1.5倍杠杆的数额,然后设置一个变量保证每个方向上的交易不超过2次,即可保证总仓位始终小于3倍杠杆

细节:

send_order_apex(client_apex, symbol=“BTC-USDC”, side=“BUY”,type=“MARKET”,size=“0.004”, expirationEpochSeconds=currentTime+100,price=’58888’, limitFeeRate=limitFeeRate)

在apex市价交易参数里,price代表可接受的价格,故而当卖出时,此price要尽可能的调低,否则会失败,同理买进时要尽可能的高。

同时将价差计算修改为:

 # 计算价差
    spread1 = ((float(b_first_price_apex) -float(s_first_price_dydx))/float(b_first_price_apex))*100
    spread2 = ((float(b_first_price_dydx) - float(s_first_price_apex))/float(b_first_price_dydx))*100 

因为如果在apex卖,dydx买的话,apex的卖价应该大于dydx的买价,apex的卖价由apex买一价决定,dydx买价由dydx卖一价决定。反之同理。

代码修改如下:

get_depth_data_btc.py

"""
这是一个用来计算 APEX 和 dydx 之间的 BTCUSDC 价差的模块。
可以调用 calculate_spread 函数来返回两个交易所的卖一价、买一价和价差。
"""import asyncio
from apexpro.http_public import HttpPublic
from dydx3 import Client
from dydx3.constants import MARKET_BTC_USD# 定义交易对列表
symbol = 'BTCUSDC'
market = MARKET_BTC_USD# 定义异步函数来获取 APEX 的价格
async def get_apex_price():# 初始化API客户端apexclient = HttpPublic("https://pro.apex.exchange")# 获取深度数据trades_data = apexclient.depth(symbol=symbol)['data']# 返回卖一价和买一价return trades_data['a'][0][0], trades_data['b'][0][0], trades_data['a'][0][1], trades_data['b'][0][1]# 定义异步函数来获取 dydx 的价格
async def get_dydx_price():# 初始化API客户端dydxclient = Client(host='https://api.dydx.exchange')# 获取深度数据orderbook_response = dydxclient.public.get_orderbook(market=market)orderbook_data = orderbook_response.data# 返回卖一价和买一价return orderbook_data['asks'][0]['price'], orderbook_data['bids'][0]['price'], orderbook_data['asks'][0]['size'], orderbook_data['bids'][0]['size']# 定义异步函数来计算价差
async def calculate_spread():# 创建两个任务,分别获取 APEX 和 dydx 的价格task1 = asyncio.create_task(get_apex_price())task2 = asyncio.create_task(get_dydx_price())# 等待两个任务完成,并获取结果s_first_price_apex, b_first_price_apex,s_first_size_apex,b_first_size_apex = await task1s_first_price_dydx, b_first_price_dydx,s_first_size_dydx,b_first_size_dydx   = await task2# 计算价差spread1 = ((float(b_first_price_apex) - float(s_first_price_dydx))/float(b_first_price_apex))*100spread2 = ((float(b_first_price_dydx) - float(s_first_price_apex))/float(b_first_price_dydx))*100return s_first_price_apex,b_first_price_apex,s_first_price_dydx,b_first_price_dydx,s_first_size_apex,b_first_size_apex,s_first_size_dydx,b_first_size_dydx,spread1,spread2if __name__ == '__main__':# 创建事件循环loop = asyncio.get_event_loop()# 运行异步函数loop.run_until_complete(calculate_spread())# 关闭事件循环loop.close()

place_order_btc.py

from init_apex_client import init_client
import asyncio
from send_order_apex import send_order_apex
from init_dydx_client import init_dydx_client
from send_order_dydx import send_order_dydx
from dydx3.constants import MARKET_BTC_USD
from dydx3.constants import ORDER_SIDE_BUY,ORDER_SIDE_SELL
from dydx3.constants import ORDER_TYPE_MARKET,ORDER_TYPE_LIMIT
from get_depth_data_btc import calculate_spread
import time#价格设置需要更精确,不然发不出去!# 初始化apex客户端
client_apex = init_client()
configs = client_apex.configs()
# 获取apex用户和账户信息
client_apex.get_user()
client_apex.get_account()# 初始化dydx客户端
client_dydx = init_dydx_client()
# 获取我们的dydx仓位 ID
account_response = client_dydx.private.get_account()
position_id = account_response.data['account']['positionId']async def arbitrage():arbitrage_count = 0while True:# 计算价差s_first_price_apex,b_first_price_apex,s_first_price_dydx,b_first_price_dydx,s_first_size_apex,b_first_size_apex,s_first_size_dydx,b_first_size_dydx,spread1,spread2 = await calculate_spread()# 根据价差判断是否发送交易if spread1 > 0.7:if arbitrage_count <2:currentTime = time.time()limitFeeRate = client_apex.account['takerFeeRate']task_apex_sell = asyncio.create_task(send_order_apex(client_apex, symbol="BTC-USDC", side="SELL",type="MARKET", size="0.004", expirationEpochSeconds=currentTime+100,price='18888', limitFeeRate=limitFeeRate))task_dydx_buy = asyncio.create_task(send_order_dydx(client_dydx, position_id, MARKET_BTC_USD, ORDER_SIDE_BUY, ORDER_TYPE_LIMIT,True, '0.004', b_first_price_dydx, '0.0015', currentTime+100))orderResult1 = await task_apex_sellorderResult2 = await task_dydx_buyarbitrage_count += 1if arbitrage_count >=2:print('above leverage ,stop')print(orderResult1,orderResult2)if spread2 > 0.7: if arbitrage_count >-2:currentTime = time.time()# 异步地发送一个apex市价买单和一个dydx市价卖单limitFeeRate = client_apex.account['takerFeeRate']task_apex_buy = asyncio.create_task(send_order_apex(client_apex, symbol="BTC-USDC", side="BUY",type="MARKET", size="0.004", expirationEpochSeconds=currentTime+100,price='58888', limitFeeRate=limitFeeRate))task_dydx_sell = asyncio.create_task(send_order_dydx(client_dydx, position_id, MARKET_BTC_USD, ORDER_SIDE_SELL, ORDER_TYPE_LIMIT,True, '0.004', s_first_price_dydx, '0.0015', currentTime+100))orderResult1 = await task_apex_buyorderResult2 = await task_dydx_sellarbitrage_count -= 1if arbitrage_count <=-2:print('above leverage ,stop')print(orderResult1,orderResult2)# 延时一秒,避免过于频繁await asyncio.sleep(1)# 运行异步函数
asyncio.run(arbitrage())

持续运行:

写一个脚本确保因为各种异常程序退出后能够重启:

import subprocess
import timedef run_program():# 这里替换为你需要执行的程序命令process = subprocess.Popen(["python", "place_order_btc.py"])  # 例如:python your_program.pyreturn processif __name__ == "__main__":while True:program = run_program()while program.poll() is None:# 程序正在运行time.sleep(5)  # 每5秒检查一次程序状态# 程序已终止,等待一段时间后重启print("程序已终止,重新启动中...")time.sleep(3)  # 等待3秒

这篇关于从零开始搭建链上dex自动化价差套利程序(11)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474860

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可