從零開始搭建鏈上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秒

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211484.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構和算法-單鏈表

數據結構和算法-單鏈表 1. 鏈表介紹 鏈表是有序的列表&#xff0c;但是它在內存中是存儲如下 圖1 單鏈表示意圖 小結: 鏈表是以節點的方式存儲每個節點包含data域&#xff0c;next域&#xff0c;指向下一個節點。如圖&#xff1a;發現鏈表的各個節點不一定是連續存儲。比如地…

滑動窗口練習(三)— 加油站問題

題目 測試鏈接 在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。 你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。 給定兩個整數數組…

如何教會小白使用淘寶API接口獲取商品數據

隨著互聯網的普及&#xff0c;越來越多的人開始接觸網絡購物&#xff0c;而淘寶作為中國最大的電商平臺之一&#xff0c;成為了眾多消費者首選的購物平臺。然而&#xff0c;對于一些小白用戶來說&#xff0c;如何通過淘寶API接口獲取商品數據可能是一個難題。本文將詳細介紹如何…

Python學習之——時間和日期

Python學習之——時間模塊 參考time 模塊常見接口 datetime 模塊常見接口 calendar 模塊常見接口 示例 參考 Python datetime模塊詳解、示例 搞定Python時區的N種姿勢 calendar – 日歷相關 time 模塊 在Python中&#xff0c;通常有這幾種方式來表示時間&#xff1a; 1&…

浮點數在計算機中如何存儲

舉例&#xff1a; 結果&#xff1a; 文字描述&#xff1a; 先將浮點數轉化為二進制的表示形式&#xff0c; 接著將其二進制的形式按照科學計數法來表示&#xff0c; 符號位的確定&#xff1a;正數0&#xff0c; 負數1 指數的確定&#xff1a;將其二進制表示成為科學計數法…

Fall in love with English

Fall in love with English 愛上英語 Hiding behind the loose dusty curtain, a teenager packed up his overcoat into the suitcase. 躲藏在布滿塵土的松軟的窗簾后邊&#xff0c;一個年輕人打包他的外套到行李箱中。 He planned to leave home at dusk though there was th…

超完整的mysql安裝配置方法(包含idea和navicat連接mysql,并實現建表)

mysql安裝配置方法 1、下載mysql2、解壓到指定的安裝目錄3、配置初始化文件my.ini4、配置用戶變量和系統變量5、初始化mysql6、安裝mysql服務并啟動修改密碼7、使用idea連接mysql8、使用Navicat可視化工具連接mysql&#xff0c;并實現新建數據庫&#xff0c;新建表 1、下載mysq…

計算機考研408-計算機網絡、操作系統整書知識點腦圖

計算機網絡、操作系統整書知識點腦圖 今天突然想起來考研期間為了方便記憶&#xff0c;費了很大力氣整理了計算機網絡、操作系統兩本書知識點的腦圖&#xff0c;想著放著也沒啥用&#xff0c;分享出來給大家看看 但是思維導圖格式的東西好像沒法直接發成文章&#xff0c;上傳…

【NodeJs】UniSMS 實現短信驗證碼

承接上文 &#xff0c;上次用的是 短信寶平臺 認證已經通過 后續又新增要求 平臺相當麻煩&#xff01; 短信寶實現短信發送要求&#xff1a; 1.平臺綁定手機號 必須和 營業執照法人一致 2.平臺個人實名認證 必須和 營業執照法人一致 3.平臺需要上傳營業執照 4.平臺需要上…

拒接服務攻擊(DOS)的初步介紹

文章目錄 什么是拒絕服務攻擊拒絕服務攻擊的過程拒絕服務攻擊的類型常見的拒絕服務攻擊如何防范拒絕服務攻擊分布式拒絕服務攻擊&#xff08;DDoS&#xff09; 什么是拒絕服務攻擊 拒絕服務攻擊是一種網絡攻擊方式&#xff0c;攻擊者通過向目標計算機系統或網絡發送大量的請求…

免費分享一套Springboot+Vue前后端分離的在線商城系統,挺實用的

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的SpringbootVue前后端分離的在線商城系統&#xff0c;分享下哈。 項目視頻演示 【免費】SpringbootVue在線商城系統 畢業設計 Java畢業設計_嗶哩嗶哩_bilibili【免費】springbootvue在線商城系統 畢業設計 …

97基于matlab的改進的帶記憶的模擬退火算法求解TSP問題

基于matlab的改進的帶記憶的模擬退火算法求解TSP問題&#xff0c;采用多普勒型降溫曲線描述迭代過程&#xff0c;在傳統算法的基礎上增加記憶功能&#xff0c;可測試中國31/64/144以及att48城市的數據&#xff0c;也可自行輸入數據進行測試&#xff0c;測試結果基本達到當前最優…

Swagger2的使用

手寫Api文檔的幾個痛點&#xff1a; 文檔需要更新的時候&#xff0c;需要再次發送一份給前端&#xff0c;也就是文檔更新交流不及時。 接口返回結果不明確 不能直接在線測試接口&#xff0c;通常需要使用工具&#xff0c;比如postman 接口文檔太多&#xff0c;不好管理 Sw…

gin投票項目4

對應視頻v2版本 gin項目投票系統4 1.增加一個注冊賬號的功能 增加接口 參數校驗&#xff1a;&#xff08;需求&#xff09; 確認密碼需要一致&#xff0c;不為空用戶名必須唯一, 不為空用戶名大于8小于16位密碼大于8小于16位,并且不能為純數字 正則表達式 必須知道這東西…

我對遷移學習的一點理解(系列2)

文章目錄 我對遷移學習的一點理解 我對遷移學習的一點理解 源域和目標域是相對的概念&#xff0c;指的是在遷移學習任務中涉及到的兩個不同的數據集或領域。 源域&#xff08;Source Domain&#xff09;通常指的是已經進行過訓練和學習的數據集&#xff0c;它被用來提取特征、…

Nginx緩存及HTTPS配置小記

緩存基礎 緩存分類 某些場景下&#xff0c;Nginx需要通過worker到上有服務中獲取數據并將結果響應給客戶端&#xff0c;在高并發場景下&#xff0c;我們完全可以將這些數據視為熱點數據&#xff0c;并將其緩存到Nginx服務上。 客戶端緩存&#xff1a;將緩存數據放到客戶端。 …

yolov8與yolov5網絡對比

回顧一下YOLOv5&#xff0c;不然沒機會了 這里粗略回顧一下&#xff0c;這里直接提供YOLOv5的整理的結構圖吧&#xff1a; Backbone&#xff1a;CSPDarkNet結構&#xff0c;主要結構思想的體現在C3模塊&#xff0c;這里也是梯度分流的主要思想所在的地方&#xff1b;PAN-FPN&…

OFDM模糊函數仿真

文章目錄 前言一、OFDM 信號及模糊函數1、OFDM 信號表達式2、模糊函數表達式 二、MATLAB 仿真1、MATLAB 核心源碼2、仿真結果①、OFDM 模糊函數②、OFDM 距離模糊函數③、OFDM 速度模糊函數 前言 本文進行 OFDM 的仿真&#xff0c;首先看一下 OFDM 的模糊函數仿真效果&#xf…

【vim】常用操作

用的時候看看&#xff0c;記太多也沒用&#xff0c;下面都是最常用的&#xff0c;更多去查文檔vim指令集。 以下均為正常模式下面操作&#xff0c;正在編輯的&#xff0c;先etc一下. 1/拷貝當前行 yy&#xff0c;5yy為拷貝包含當前行往下五行 2/p將拷貝的東西粘貼到當前行下…

Nmap腳本的應用場景

網絡安全檢測和漏洞掃描 Nmap腳本是一種強大的工具&#xff0c;可以用于網絡安全檢測和漏洞掃描。在滲透測試工程師的角度下&#xff0c;本文將詳細闡述Nmap腳本的應用場景&#xff0c;以及如何使用Nmap腳本進行網絡安全檢測和漏洞掃描。 一、Nmap腳本的應用場景 Nmap腳本在滲…