前沿
M+ k0 [9 l8 s2 U4 ]8 [: c% z$ r4 H) e1 I
上次我们已经发布了开仓的代码,) A ~, O$ n: b( z: I* Z, T
币安 币本位合约 资金费率套利及套利开仓(含代码)
* w1 [) X+ X/ ^3 ?& @5 s! M: u手动平仓是发现挺麻烦的, 我们再来篇平仓代码,只需要更改主运行文件, 配置文件和api文件不用变化 A4 m+ c' h6 c6 J
基本步骤
' i4 I* u o: a# I2 i# {" m
9 m( F4 X7 e8 t0 S X1 Y& F% q* f第二步:卖出币本位永续合约。
$ t0 h/ V) s$ M+ N# _% T第三部:转入现货& l' O0 l* ?$ v( G1 o4 S
第四步:现货在开多对应数量
6 n" q" c, X, n0 |8 W% r1 I# h. o u代码实现
& @, q% D! z. {#-*-coding:utf-8-*-
4 Y6 y; P* A9 n/ `" A# 币安币合约资金费率如何进行套利及套利平仓代码+ Y& I: E: Z. n2 }
import json s7 h6 n& c# J8 q
import traceback
* A/ X+ P+ A8 M3 _7 |2 ]. H6 wimport ccxt
$ I3 B9 r' j% [: bimport pandas as pd
$ I7 N/ C/ |3 ~* N0 _7 S3 T5 Iimport time
1 r$ O/ g! ]3 |0 @5 }4 U0 mimport hmac
" c- w O' J. h, O& W9 E; `from hashlib import sha2569 C9 J9 g) B p) z( I c% b: U
import requests2 |6 ~8 j; g' b1 e- u6 P5 z" G
from get_binance_data import *
* W+ k' z( K/ p; y! U0 Qfrom config import *
0 {- U" e5 L1 H5 F8 F' g H) N' P
/ l- ^7 h. i' z _4 o. Cpd.set_option("display.max_rows", 1000)
& \+ n4 [7 Z6 p8 q; N' vpd.set_option('expand_frame_repr', False) # 当列太多时不换行
0 H# S$ o+ D5 ?; Q' n8 Q8 Q2 q7 ^) B/ G
spot_symbol = '{}/{}'.format(coin, base_coin) # 构建现货交易对
- k$ X5 H9 h+ l! f/ W3 fdelivery_symbol = '{}{}'.format(coin, base_coin.replace('USDT', 'USD_PERP')) # 构建合约交易对# u9 c9 q- d* a; g7 }0 B, h' [& o# o
X9 j& L. z: c; Z/ P4 w w" D/ G p0 S
exchange = ccxt.binance(BINANCE_CONFIG)$ z: a, p6 V; J5 c
7 ?/ K) J- G. G; l+ e
exchange_info = exchange.dapiPublic_get_exchangeinfo()
, N( Q2 L6 u- T, m& W% Fexchange_info = pd.DataFrame(exchange_info['symbols'], dtype=float)! e4 F" o5 x: B) G
exchange_info.set_index('symbol', inplace=True)1 n, L+ k: B/ k u
priceprecision = int(exchange_info.loc[delivery_symbol, 'pricePrecision'])
# G. I& ~ h5 S, {% O6 i' ?; Zquantityprecision = int(exchange_info.loc[delivery_symbol, 'quantityPrecision'])5 F! Y( G2 g9 f5 ^( o5 v- ^& M, I
& E" Y F( [( ^+ k7 R. { A" v o
- B2 f1 _7 S5 M1 c
% B P: i8 P/ l( A: Q3 K0 q; ywhile True:4 j1 n5 O- L' C' N/ ]) W
# 获取现货买一价格
2 ?/ q" z) u. v spot_buy1_price = exchange.fetch_ticker(spot_symbol)['bid']9 N! V( d4 c" e' |9 L! `
# 获取永续合约卖一价格
* G J6 c& Q M7 J5 i# H8 s6 _) A& \9 l params = {'symbol': delivery_symbol, 'limit': 5}
) {0 P7 d3 g& Y+ J6 j delivery_sell1_price = float(exchange.dapiPublicGetDepth(params=params)['asks'][0][0])8 J9 {3 r* d, r, h2 N3 G3 j
# 计算价差
- J. [: ?1 o5 f r = delivery_sell1_price / spot_buy1_price - 1( B% R! u0 t: o$ B* b5 G; e, ]! X) H$ C
print('现货价格:%.4f,期货价格:%.4f,价差:%.4f' % (spot_buy1_price, delivery_sell1_price, r))1 `9 f6 E; X, C
6 N: `1 N( }; l1 z* K
# ===判断价差是否满足要求( Z; F2 ]" o1 V/ v5 k
# =====自动出金
, y3 C$ P/ s) g. o if r > out_threshold:) Q: B" O! V. Y0 b5 j* ?
print('利差小于目标阀值,不出金')
2 ]' f: e$ v2 \2 I' k" k, `* o else:
% Q( b& s" W* b0 R1 E! X! L6 N9 Q print('利差大于目标阀值,开始出金')
% X/ I* ]/ t4 s, Q6 D
, o& W m( W4 O* i # 查询永续合约金额: N' ~* P+ l- M# o- W2 C, a
asset_maxWithdrawAmount, marginBalance = get_delivery_account()
. F5 h7 c; @9 v( E9 A$ K1 j print('查询永续合约金额!', asset_maxWithdrawAmount, marginBalance)& U/ H& `+ ~' A, i: Y
qty = select_delivery_order(delivery_symbol)
) D# V6 D3 F! {" R4 `2 ~( w7 D; Y+ l
# 平仓
- O8 C w/ f7 ^- _ order_delivery(delivery_symbol, 'BUY', delivery_sell1_price*1.001, qty, priceprecision)# X( Z7 F) K) @ @: B3 N0 a
time.sleep(1)
% C' f, H/ U+ L) j+ a
6 K, E& A# [1 Z4 Z
* ?; e& Q/ X) |/ Y6 K4 {+ b k asset_maxWithdrawAmount, marginBalance = get_delivery_account() # 查询永续合约金额; A a- J* i7 m: H6 D: w, _) k: z. m1 V
transder_all('CMFUTURE_MAIN', asset_maxWithdrawAmount) # 划转到现货
& r+ @9 o1 W) E' i6 r free = get_spot_account() # 查询现货合约余额
' o! \. ]+ E( Z! G1 Y; }
( m8 M/ {7 t, @% l+ ?# h8 `: K$ B: G # 卖出现货
/ F' x' F- H7 _0 L3 o, ] print('卖出现货param', spot_symbol, 'limit', 'sell', free, spot_buy1_price * 0.999)6 f K$ z5 T3 V" f5 k* `2 V
order_info = exchange.create_order(spot_symbol, 'limit', 'sell', free, spot_buy1_price * 0.999)
+ N) j$ X2 U3 K8 V$ T9 N print('卖出现货order_info:', order_info)
' O' ~) h- g# z! q, ]8 |* z; h6 N& Q' h# Z, i7 g
# # 计数 c/ f% A- t2 ]% }8 s- ?4 W
execute_num += 1
3 z: K) K9 y0 d2 I0 f7 x2 Y
2 g; b l5 N9 }% a$ R E # ===循环结束
! c3 p% c% r; e: i9 e; {' E1 {# v print('*' * 20, '本次循环结束,暂停', '*' * 20, '\n')
& h0 e9 }& ?1 s9 I time.sleep(3)
1 Y1 H l+ d2 V% g2 ]) \4 q- Z
if execute_num >= max_execute_num:
4 r5 s. h- W; B9 i- A- G print('达到最大下单次数,完成建仓计划,退出程序')* y7 S0 R4 e# g; f
Break |