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

其他品种

扩展到其他币种的价差套利

1.eth

新建文件get_depth_data_eth.py

import asyncio
from apexpro.http_public import HttpPublic
from dydx3 import Client
from dydx3.constants import MARKET_ETH_USD# 定义交易对列表
symbol = 'ETHUSDC'
market = MARKET_ETH_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(s_first_price_apex))*100spread2 = ((float(b_first_price_dydx) - float(s_first_price_apex))/float(s_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_eth.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_ETH_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_eth 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 <8:currentTime = time.time()limitFeeRate = client_apex.account['takerFeeRate']task_apex_sell = asyncio.create_task(send_order_apex(client_apex, symbol="ETH-USDC", side="SELL",type="MARKET", size="0.001", expirationEpochSeconds=currentTime+100,price=b_first_price_apex, limitFeeRate=limitFeeRate))task_dydx_buy = asyncio.create_task(send_order_dydx(client_dydx, position_id, MARKET_ETH_USD, ORDER_SIDE_BUY, ORDER_TYPE_LIMIT,True, '0.001', b_first_price_dydx, '0.0015', currentTime+100))orderResult1 = await task_apex_sellorderResult2 = await task_dydx_buyarbitrage_count += 1if arbitrage_count >=8:print('above leverage ,stop')print(orderResult1,orderResult2)if spread2 > 0.7: if arbitrage_count >-8:currentTime = time.time()# 异步地发送一个apex市价买单和一个dydx市价卖单limitFeeRate = client_apex.account['takerFeeRate']task_apex_buy = asyncio.create_task(send_order_apex(client_apex, symbol="ETH-USDC", side="BUY",type="MARKET", size="0.001", expirationEpochSeconds=currentTime+100,price=s_first_price_apex, limitFeeRate=limitFeeRate))task_dydx_sell = asyncio.create_task(send_order_dydx(client_dydx, position_id, MARKET_ETH_USD, ORDER_SIDE_SELL, ORDER_TYPE_LIMIT,True, '0.001', s_first_price_dydx, '0.0015', currentTime+100))orderResult1 = await task_apex_buyorderResult2 = await task_dydx_sellarbitrage_count -= 1if arbitrage_count <=-8:print('above leverage ,stop')print(orderResult1,orderResult2)# 延时一秒,避免过于频繁await asyncio.sleep(5)# 运行异步函数
asyncio.run(arbitrage())

其他文件不变,文件结构如下:

初始化api端口

init_apex.client.py

init_dydx.client.py

发送交易

send_order_apex.py

send_order_dydx.py

测试发送交易

place_order_dydx.py

place_order_apex.py

其他品种同理。修改对应部分以及注意发送交易的size即可。

所有品种同时运行

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,MARKET_ETH_USD,MARKET_LINK_USD,MARKET_LTC_USD,MARKET_AVAX_USD,MARKET_ATOM_USD,MARKET_DOGE_USD,MARKET_BCH_USD,MARKET_MATIC_USD,MARKET_SOL_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 as calculate_spread_btc
from get_depth_data_eth import calculate_spread as calculate_spread_eth
from get_depth_data_link import calculate_spread as calculate_spread_link
from get_depth_data_ltc import calculate_spread as calculate_spread_ltc
from get_depth_data_avax import calculate_spread as calculate_spread_avax
from get_depth_data_atom import calculate_spread as calculate_spread_atom
from get_depth_data_doge import calculate_spread as calculate_spread_doge
from get_depth_data_bch import calculate_spread as calculate_spread_bch
from get_depth_data_matic import calculate_spread as calculate_spread_matic
from get_depth_data_sol import calculate_spread as calculate_spread_sol
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']arbitrage_count = 0async def execute_trade(client_apex, client_dydx, position_id, market, spread1, spread2, size, price1,price2, symbol,s_first_price,b_first_price):global arbitrage_countif spread1 > 0.7:if arbitrage_count<8:currentTime = time.time()limitFeeRate = client_apex.account['takerFeeRate']task_apex_sell = asyncio.create_task(send_order_apex(client_apex, symbol=symbol, side="SELL",type="MARKET", size=size, expirationEpochSeconds=currentTime+100,price=price1, limitFeeRate=limitFeeRate))task_dydx_buy = asyncio.create_task(send_order_dydx(client_dydx, position_id, market, ORDER_SIDE_BUY, ORDER_TYPE_LIMIT,True, size, b_first_price, '0.0015', currentTime+100))arbitrage_count += 1orderResult1 = await task_apex_sellorderResult2 = await task_dydx_buyprint(orderResult1, orderResult2)if spread2 > 0.7:if arbitrage_count >-8:currentTime = time.time()limitFeeRate = client_apex.account['takerFeeRate']task_apex_buy = asyncio.create_task(send_order_apex(client_apex, symbol=symbol, side="BUY",type="MARKET", size=size, expirationEpochSeconds=currentTime+100,price=price2, limitFeeRate=limitFeeRate))task_dydx_sell = asyncio.create_task(send_order_dydx(client_dydx, position_id, market, ORDER_SIDE_SELL, ORDER_TYPE_LIMIT,True, size, s_first_price, '0.0015', currentTime+100))arbitrage_count -= 1orderResult1 = await task_apex_buyorderResult2 = await task_dydx_sellprint(orderResult1, orderResult2)async def arbitrage():while True:# 计算价差_, _, s_first_price_dydx_btc, b_first_price_dydx_btc, _, _, _, _, spread1_btc, spread2_btc = await calculate_spread_btc()_, _, s_first_price_dydx_eth, b_first_price_dydx_eth, _, _, _, _, spread1_eth, spread2_eth = await calculate_spread_eth()_, _, s_first_price_dydx_link, b_first_price_dydx_link, _, _, _, _, spread1_link, spread2_link = await calculate_spread_link()_, _, s_first_price_dydx_ltc, b_first_price_dydx_ltc, _, _, _, _, spread1_ltc, spread2_ltc = await calculate_spread_ltc()_, _, s_first_price_dydx_avax, b_first_price_dydx_avax, _, _, _, _, spread1_avax, spread2_avax = await calculate_spread_avax()_, _, s_first_price_dydx_atom, b_first_price_dydx_atom, _, _, _, _, spread1_atom, spread2_atom = await calculate_spread_atom()_, _, s_first_price_dydx_doge, b_first_price_dydx_doge, _, _, _, _, spread1_doge, spread2_doge = await calculate_spread_doge()_, _, s_first_price_dydx_bch, b_first_price_dydx_bch, _, _, _, _, spread1_bch, spread2_bch = await calculate_spread_bch()_, _, s_first_price_dydx_matic, b_first_price_dydx_matic, _, _, _, _, spread1_matic, spread2_matic = await calculate_spread_matic()_, _, s_first_price_dydx_sol, b_first_price_dydx_sol, _, _, _, _, spread1_sol, spread2_sol = await calculate_spread_sol()# 根据价差判断是否发送交易await execute_trade(client_apex, client_dydx, position_id, MARKET_BTC_USD, spread1_btc, spread2_btc, '0.001', '18888','58888', 'BTC-USDC',s_first_price_dydx_btc,b_first_price_dydx_btc)await execute_trade(client_apex, client_dydx, position_id, MARKET_ETH_USD, spread1_eth, spread2_eth, '0.01', '888','5888', 'ETH-USDC',s_first_price_dydx_eth,b_first_price_dydx_eth)await execute_trade(client_apex, client_dydx, position_id, MARKET_LINK_USD, spread1_link, spread2_link, '1', '8','58', 'LINK-USDC',s_first_price_dydx_link,b_first_price_dydx_link)await execute_trade(client_apex, client_dydx, position_id, MARKET_LTC_USD, spread1_ltc, spread2_ltc, '0.5', '48', '488','LTC-USDC',s_first_price_dydx_ltc,b_first_price_dydx_ltc)await execute_trade(client_apex, client_dydx, position_id, MARKET_AVAX_USD, spread1_avax, spread2_avax, '1', '8', '188','AVAX-USDC',s_first_price_dydx_avax,b_first_price_dydx_avax)await execute_trade(client_apex, client_dydx, position_id, MARKET_ATOM_USD, spread1_atom, spread2_atom, '3', '4', '88','ATOM-USDC',s_first_price_dydx_atom,b_first_price_dydx_atom)await execute_trade(client_apex, client_dydx, position_id, MARKET_DOGE_USD, spread1_doge, spread2_doge, '300', '0.04', '2','DOGE-USDC',s_first_price_dydx_doge,b_first_price_dydx_doge)await execute_trade(client_apex, client_dydx, position_id, MARKET_BCH_USD, spread1_bch, spread2_bch, '0.1', '88', '588','BCH-USDC',s_first_price_dydx_bch,b_first_price_dydx_bch)await execute_trade(client_apex, client_dydx, position_id, MARKET_MATIC_USD, spread1_matic, spread2_matic, '30', '0.1', '4','MATIC-USDC',s_first_price_dydx_matic,b_first_price_dydx_matic)await execute_trade(client_apex, client_dydx, position_id, MARKET_SOL_USD, spread1_sol, spread2_sol, '0.5', '48', '488','SOL-USDC',s_first_price_dydx_sol,b_first_price_dydx_sol)# 调用 execute_trade 处理其他币种的交易逻辑await asyncio.sleep(1)# 运行异步函数
asyncio.run(arbitrage())

重写运行文件:

import subprocess
import timedef run_program(file_choice):if file_choice == "1":process = subprocess.Popen(["python", "place_order_btc.py"])elif file_choice == "2":process = subprocess.Popen(["python", "place_order_eth.py"])elif file_choice == "3":process = subprocess.Popen(["python", "place_order_link.py"])elif file_choice == "4":process = subprocess.Popen(["python", "place_order_ltc.py"])elif file_choice == "5":process = subprocess.Popen(["python", "place_order_avax.py"])elif file_choice == "6":process = subprocess.Popen(["python", "place_order_atom.py"])elif file_choice == "7":process = subprocess.Popen(["python", "place_order_doge.py"])elif file_choice == "8":process = subprocess.Popen(["python", "place_order_bch.py"])elif file_choice == "9":process = subprocess.Popen(["python", "place_order_matic.py"])elif file_choice == "10":process = subprocess.Popen(["python", "place_order_sol.py"])elif file_choice == "11":process = subprocess.Popen(["python","place_order_all.py"])else:print("无效的选择")return Nonereturn processif __name__ == "__main__":while True:choice = input("请输入要运行的文件(1-btc,2-eth,3-link,4-ltc,5-avax,6-atom,7-doge,8-bch,9-matic,10-sol,11-all ):")program = run_program(choice)if program:while program.poll() is None:time.sleep(5)print("程序已终止,重新启动中...")time.sleep(3)

大体到此结束,之后还有一些小优化将于下期更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue创建时长时间卡顿无结果

vue创建时长时间卡顿无结果 01 发生场景 当我在VS code中使用vue create myVue &#xff08;注&#xff1a;最后一个是我创建的vue项目的文件名&#xff09;指令时在终端内长时间的无反应 02 问题的产生及其原因 经过面向百度编程&#xff0c;得出的第一结论是vue/cil版本过…

【数据结构】——排序篇(下)

前言&#xff1a;前面我们的排序已经详细的讲解了一系列的方法&#xff0c;那么我们现在久之后一个归并排序了&#xff0c;所以我们现在就来讲解一下归并排序。 归并排序&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法…

代码随想录二刷 |二叉树 | 二叉树的右视图

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉树的右视图 题目描述解题思路代码实现 题目描述 199.二叉树的右视图 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例…

❀My学习Linux命令小记录(15)❀

目录 ❀My学习Linux命令小记录&#xff08;15&#xff09;❀ 61.history指令 62.apt指令 ①apt-get ②apt-key&#xff1a; ③apt-sortpkgs&#xff1a; ④aptitude&#xff1a; 63.yum指令 64.cal指令 65.init指令 ❀My学习Linux命令小记录&#xff08;15&#xff0…

表格的介绍与实战(详细且有案例)

目录​​​​​​​​​​​​​​ 表格的主要作用&#xff1a; 表格的基本语法&#xff1a; 表格相关的标签 合并单元格&#xff1a; 实战&#xff1a; 表格的主要作用&#xff1a; 表格主要是用来展示数据的&#xff0c;使用表格来展示数据&#xff0c;数据可读性更好…

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/default…

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…

产品创新受赞誉,怿星荣获2023未来汽车(电子和软件)创新创业大赛一等奖

2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛 11月29日&#xff0c;上海临港&#xff0c;由中国汽车工程学会和中国&#xff08;上海&#xff09;自由贸易试验区临港新片区管理委员会联合举办的“2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛…

二叉搜索树中第K小的元素[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉搜索树的根节点root&#xff0c;和一个整数k&#xff0c;请你设计一个算法查找其中第k个最小元素&#xff08;从1开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#x…

RHEL8_Linux硬盘管理

主要介绍Linux磁盘管理 了解分区的概念对硬盘进行分区常见的分区swap分区的管理 1.了解分区的概念 1&#xff09;新的硬盘首先需要对其进行分区和格式化&#xff0c;下面来了解以下硬盘的结构&#xff0c;如图。 2&#xff09;硬盘的磁盘上有一个个圈&#xff0c;每两个圈组…

JVM虚拟机系统性学习-类加载子系统

类加载子系统 类加载的时机 类加载的时机主要有 4 个&#xff1a; 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时&#xff0c;如果对应的类没有初始化&#xff0c;则要先进行初始化 new 关键字创建对象时读取或设置一个类型的静态字段时&#xff08;被 …

javaSwing酒店管理系统

一、 使用方法&#xff1a; 在使用前&#xff0c;需要到druid.properties 配置文件中&#xff0c;修改自己对应于自己数据库的属性&#xff1b;如用户名&#xff0c;密码等 driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql:///hotel?useUnicodetrue&characterEn…

midwayjs从零开始创建项目,连接mikro-orm框架(必须有java的springboot基础)

前言&#xff1a; 我一直都是用java的springboot开发项目&#xff0c;然后进来新公司之后&#xff0c;公司的后端是用node.js&#xff0c;然后框架用的是 midwayjs &#xff0c;然后网上的资料比较少&#xff0c;在此特地记录一波 文档&#xff1a; 1.官方文档&#xff1a;介绍…

vue 前端crypto-js 如何实现加密解密

npm 安装 crypto-js 引用 import CryptoJS from "crypto-js"; 或者 import CryptoJS from "crypto-js"; //秘钥 var aesKey "s10dfc3321ba59abbe123057f20f883e"; //将秘钥转换成Utf8字节数组 var key CryptoJS.enc.Utf8.parse(aesKey); /…

Spring Boot 3.0 : 集成flyway数据库版本控制工具

目录 Spring Boot 3.0 : 集成flyway数据库版本控制工具flyway是什么为什么使用flyway主要特性支持的数据库&#xff1a; flyway如何使用spring boot 集成实现引入依赖配置sql版本控制约定3种版本类型 运行SpringFlyway 8.2.1及以后版本不再支持MySQL&#xff1f; 个人主页: 【⭐…

常见web漏洞的流量分析

常见web漏洞的流量分析 文章目录 常见web漏洞的流量分析工具sql注入的流量分析XSS注入的流量分析文件上传漏洞流量分析文件包含漏洞流量分析文件读取漏洞流量分析ssrf流量分析shiro反序列化流量分析jwt流量分析暴力破解流量分析命令执行流量分析反弹shell 工具 攻击机受害机wi…

Unity DOTS中的baking(一) Baker简介

Unity DOTS中的baking&#xff08;一&#xff09; Baker简介 baking是DOTS ECS工作流的一环&#xff0c;大概的意思就是将原先Editor下的GameObject数据&#xff0c;全部转换为Entity数据的过程。baking是一个不可逆的过程&#xff0c;原先的GameObject在运行时不复存在&#x…

leetcode 股票DP系列 总结篇

121. 买卖股票的最佳时机 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。 只能进行一次交易 很简单&#xff0c;只需边遍历边记录最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …

Vue-安装及安装vscode相应插件

安装Vue 安装nodejs&#xff0c; 地址&#xff1a;https://nodejs.org/en 下载后直接安装。 安装后重新打开命令行工具&#xff0c;输入 node -v PS C:\Users\zcl36> node -v v20.10.0 2. 安装vue包npm install -g vue/cli安装之后&#xff0c;你就可以在命令行中访问 vue…