【python数字货币量化_21精华帖_策略第21篇】币安 币本位合约 资金费率套利及套利 自动平仓

[复制链接]
查看4523 | 回复0 | 2023-8-4 17:05:55 | 显示全部楼层 |阅读模式
前沿
5 @5 u3 g+ ~7 u" f; f- w: u
0 E4 O& j" d  S) ~) E4 R2 s上次我们已经发布了开仓的代码,
1 {7 m/ R% v8 I币安 币本位合约 资金费率套利及套利开仓(含代码)
! N" A+ P* {; {# J手动平仓是发现挺麻烦的, 我们再来篇平仓代码,只需要更改主运行文件, 配置文件和api文件不用变化/ B  o2 @; Z: ?5 [5 D+ [0 A
基本步骤
! c* R/ R. v% t) T2 U: Z8 E* R" _9 o: S- u
第二步:卖出币本位永续合约。/ T# S: d2 u  K; ?) B
第三部:转入现货
9 Y4 t  P6 Q+ c: @: \$ Z/ G/ w; X& p第四步:现货在开多对应数量
9 a$ Y' q" @- X7 p; [/ B  {代码实现) |; M# ]! P, D& I
#-*-coding:utf-8-*-
  T% D" {% @8 j& i8 u) R# 币安币合约资金费率如何进行套利及套利平仓代码
) M4 c0 ^: \3 x0 D) {$ ]import json
# I! Z; H3 V  N0 E( Qimport traceback$ P" M+ `7 a* Y: k. O. V- I
import ccxt
0 R8 |5 ^8 l* M( D8 b0 nimport pandas as pd0 Y5 E- [+ f5 H+ Z4 S
import time
$ P6 @/ W$ m" c1 o* vimport hmac
( }6 V, q8 d+ H; u0 hfrom hashlib import sha256
4 P: i, \- i8 ?0 A/ ?0 l/ pimport requests9 d$ b; L" h& E$ H) `
from get_binance_data import *
% L$ K6 M: c6 k: X9 ]3 G$ nfrom config import *
+ S: W7 S9 i" q$ O# h# S3 N' o
, R% K: R% B3 ~, N* hpd.set_option("display.max_rows", 1000)
6 M. y9 q3 y" t: G( N2 U, x- F" ppd.set_option('expand_frame_repr', False)  # 当列太多时不换行/ ^9 Z. A# X4 y4 L) J
& F- ^7 V; ^: t8 _
spot_symbol = '{}/{}'.format(coin, base_coin)  # 构建现货交易对
8 Q# O' t, h$ J" l- Cdelivery_symbol = '{}{}'.format(coin, base_coin.replace('USDT', 'USD_PERP'))  # 构建合约交易对
; j  ]8 b( P  V3 _  e9 h+ a5 ~8 f, c& l6 p
9 I8 j4 o! s7 P7 T: u: @& s! Zexchange = ccxt.binance(BINANCE_CONFIG)
/ H3 e, K/ E9 D5 h6 Q
, B4 I, ^3 L( P8 n8 l9 M$ m' qexchange_info = exchange.dapiPublic_get_exchangeinfo()
5 E- F: _8 h5 D& m6 Bexchange_info = pd.DataFrame(exchange_info['symbols'], dtype=float)7 \! `+ \( D4 e2 v: ~- q
exchange_info.set_index('symbol', inplace=True)
4 V/ q& ?0 ~5 @" x7 L1 Apriceprecision = int(exchange_info.loc[delivery_symbol, 'pricePrecision'])
0 e( S6 E; d1 T) n( r5 ~quantityprecision = int(exchange_info.loc[delivery_symbol, 'quantityPrecision'])" a' U, v8 |1 U: }0 v

+ o4 L* K2 U+ N' s6 }4 c% K9 u/ H9 Z

& S( e4 x1 i) x6 }" a$ Q* Q% qwhile True:
! e3 K# ~. V( B6 C) T. h    #  获取现货买一价格! G" z) G, Q" d& _6 P) V+ A
    spot_buy1_price = exchange.fetch_ticker(spot_symbol)['bid']
1 |  c* Z% p% C  u0 I, h    # 获取永续合约卖一价格
1 a% w+ ^* X# V& x    params = {'symbol': delivery_symbol, 'limit': 5}
$ [) l2 R+ D. D    delivery_sell1_price = float(exchange.dapiPublicGetDepth(params=params)['asks'][0][0])4 o: g0 c: N9 L% d# p  s4 t6 d
    # 计算价差; S3 v( p/ z! \3 m& F. ~
    r = delivery_sell1_price / spot_buy1_price - 1
5 Y8 a0 [% ~! S. K+ m. U    print('现货价格:%.4f,期货价格:%.4f,价差:%.4f' % (spot_buy1_price, delivery_sell1_price, r))6 Q1 ]6 E, _# c; u
4 t( U/ _4 a9 P  R: ]7 w
    # ===判断价差是否满足要求
% X/ {5 f5 O2 q: F" u, b' s& H    # =====自动出金
- T# L! s: M% q5 S( B2 h% ~    if r > out_threshold:+ l9 k8 B# i8 Q/ T; Z: B1 x
        print('利差小于目标阀值,不出金')
# N" f" s7 G8 v6 k# u; a    else:8 C  B& \& p" P" k- l2 o  ]3 M
        print('利差大于目标阀值,开始出金')7 t$ q. A+ V& y6 v
( C! H8 ]# G: j
        # 查询永续合约金额8 p7 ]- [; ~& j/ K
        asset_maxWithdrawAmount, marginBalance = get_delivery_account()7 b+ M7 e- c( Y& K0 d' \
        print('查询永续合约金额!', asset_maxWithdrawAmount, marginBalance)
" u- T& ]. J; q; H        qty = select_delivery_order(delivery_symbol)0 c# d( l+ |2 d
& M& Y- k! Q2 v) f7 ~
        # 平仓  a1 m/ d* O  K+ `7 z
        order_delivery(delivery_symbol, 'BUY', delivery_sell1_price*1.001, qty, priceprecision)
7 K! [4 s+ @: L, @/ ^. E        time.sleep(1)
, q& \4 M8 q7 `% o$ {% O: K. K; X8 [/ y
% v; W, X. D: p% [# |
        asset_maxWithdrawAmount, marginBalance = get_delivery_account() # 查询永续合约金额
$ t6 N1 [# F' ~4 o% D        transder_all('CMFUTURE_MAIN', asset_maxWithdrawAmount) # 划转到现货
$ U% }! R9 s6 N# |( {' L        free = get_spot_account() # 查询现货合约余额" ^$ u" W" p  `5 f# H! ]

2 O0 c3 k: @3 {% X& J7 }        # 卖出现货, r1 U. H! Y8 A, Z
        print('卖出现货param', spot_symbol, 'limit', 'sell', free, spot_buy1_price * 0.999)
+ T" n- E- B' f. o. q        order_info = exchange.create_order(spot_symbol, 'limit', 'sell', free, spot_buy1_price * 0.999)
: I  x# c/ o8 b1 l        print('卖出现货order_info:', order_info)
8 A5 |. _/ ~* g5 M
+ Y' d% s2 g1 o! Q- H/ d- f5 l        # # 计数% i3 w) }$ X2 }
        execute_num += 1# o4 g- q6 ^  _: b1 U
2 ]7 R' g& A" ?, h: p- ^+ a
    # ===循环结束6 m. s  a" e0 Y: g
    print('*' * 20, '本次循环结束,暂停', '*' * 20, '\n'), x! o( H& p: a, H
    time.sleep(3)5 ]2 K4 }" L- s1 S8 Y1 a

1 k% ]" d" K5 _: S6 J1 A8 |+ c    if execute_num >= max_execute_num:
9 ]' q0 z$ u! u% {3 b& U        print('达到最大下单次数,完成建仓计划,退出程序')
& ?5 h5 F+ K7 F* V& t. Z        Break
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

201

金钱

0

收听

0

听众
性别
保密

新手上路

金钱
201 元