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

代码整合

btc目前的策略如下:价差超过百1则两边同时make

代码如下:

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
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():
  while True:
    # 计算价差
    spread1,spread2 = await calculate_spread()
    # 根据价差判断是否发送交易
    if spread1 > 1:
      currentTime = time.time()
      # 异步地发送一个apex市价卖单和一个dydx市价买单
      limitFeeRate = client_apex.account['takerFeeRate']
      orderResult1, orderResult2 = await asyncio.gather(
        send_order_apex(client_apex, symbol="BTC-USDC", side="SELL",
                                           type="MARKET", size="0.001", expirationEpochSeconds= currentTime,
                                           price="28888.5", limitFeeRate=limitFeeRate),
        send_order_dydx(client_dydx, position_id, MARKET_BTC_USD, ORDER_SIDE_BUY, ORDER_TYPE_MARKET, True, '0.001', '28888', '0.0015', currentTime)
      )
      print(orderResult1)
      print('order_response', orderResult2.data)
    if spread2 > 1:
      currentTime = time.time()
      # 异步地发送一个apex市价买单和一个dydx市价卖单
      limitFeeRate = client_apex.account['takerFeeRate']
      orderResult1, orderResult2 = await asyncio.gather(
        send_order_apex(client_apex, symbol="BTC-USDC", side="BUY",
                                           type="MARKET", size="0.001", expirationEpochSeconds= currentTime,
                                           price="28888.5", limitFeeRate=limitFeeRate),
        send_order_dydx(client_dydx, position_id, MARKET_BTC_USD, ORDER_SIDE_SELL, ORDER_TYPE_MARKET, True, '0.001', '28888', '0.0015', currentTime)
      )
      print(orderResult1)
      print('order_response', orderResult2.data)
    # 延时一秒,避免过于频繁
    await asyncio.sleep(1)

# 运行异步函数
asyncio.run(arbitrage())

bug

dydx发市价单不知道参数怎么设置,文档也不详细,故而改成了发限价单。

还有一些同步异步的问题,要把发交易的函数前加上async。现在修改以及整合的代码部分如下:

1.send_order_apex

from apexpro.helpers.util import round_size

# 定义一个函数,用来发交易
async def send_order_apex(client, symbol, side, type, size, expirationEpochSeconds, price, limitFeeRate):
    # 优化订单的大小和价格
    symbolData = {}
    for k, v in enumerate(client.configs().get('data').get('perpetualContract')):
        if v.get('symbol') == symbol:
            symbolData = v
    size = round_size(size, symbolData.get('stepSize'))
    price = round_size(price, symbolData.get('tickSize'))
    # 创建订单
    createOrderRes = client.create_order(symbol=symbol, side=side,
                                           type=type, size=size, expirationEpochSeconds=expirationEpochSeconds,
                                           price=price, limitFeeRate=limitFeeRate)
    # 返回订单结果
    return createOrderRes


2.send_order_dydx.py

# 定义一个函数,用来发交易
async def send_order_dydx(client, position_id, market, side, order_type, post_only, size, price, limit_fee, expiration_epoch_seconds):
    # 创建订单参数
    order_params = {
        'position_id': position_id,
        'market': market,
        'side': side,
        'order_type': order_type,
        'post_only': post_only,
        'size': size,
        'price': price,
        'limit_fee': limit_fee,
        'expiration_epoch_seconds': expiration_epoch_seconds
    }
    # 创建订单
    order_response = client.private.create_order(**order_params)
    # 返回订单结果
    return order_response.data

3.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():
  while 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:
          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.001", expirationEpochSeconds=currentTime,
                              price=b_first_price_apex, 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.001', b_first_price_dydx, '0.0015', currentTime+100)
          )

          orderResult1 = await task_apex_sell
          orderResult2 = await task_dydx_buy
          print(orderResult1,orderResult2)
    if spread2 > 0.7: 
      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.001", expirationEpochSeconds=currentTime,
                              price=s_first_price_apex, 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.001', s_first_price_dydx, '0.0015', currentTime+100)
      )

      orderResult1 = await task_apex_buy
      orderResult2 = await task_dydx_sell
      print(orderResult1,orderResult2)
    # 延时一秒,避免过于频繁
    await asyncio.sleep(1)

# 运行异步函数
asyncio.run(arbitrage())

下期介绍一下优化相关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半事无意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值