【python数字货币量化_21精华帖_策略第27篇】基于币安交易所的定投框架

[复制链接]
查看6376 | 回复0 | 2023-8-5 04:08:30 | 显示全部楼层 |阅读模式
市场转熊,到了中性跑的不理想,趋势也被来回割的阶段,没有特别好的赚钱方法,于是决定还是做好定投,布局下一波吧,之前有老板做过OKEX的定投框架,现在币安返佣很香,所以搞了一发币安的定投框架,完成了我自己的币安三件套中的最后一样,测了2周(目前实盘3天一投),暂时比较稳定。
7 i: {( T* R4 {7 C8 l2 o6 Z9 S一、总体思路) }2 G2 B; M) P9 j. w. u% C
4 Q5 l$ C, |  x! S. \* C
分8个大的步骤,如下:
- n) z3 N1 S2 s, l# ##################### 1、获取币安现货价格精度 #######################  D2 ^$ N" w# r
    usdt_future_exchange_info(exchange, symbol_config)​& t( U; n  g3 H- H0 D$ D
# ##################### 2、获取目标现货历史数据 #######################0 @: I' s7 c# ?, h
    # 遍历获取币种历史数据; n$ j( ^# t: v
    print('获取交易币种的历史K线数据')) l3 M' s6 x3 V
    # 获取币种的历史数据,会删除最新一行的数据
) z; E# p+ k7 o2 h% c/ M% L! H7 Q5 g$ t    symbol_candle_data = get_binance_history_candle_data(exchange, symbol_config, time_interval, max_len)​) I  C% ?* n9 I
# ##################### 3、获取当前账户信息 #######################
- |2 X4 r6 q8 z- s        # 更新账户信息symbol_info1 s, o3 E3 G. Z. c9 s7 @1 S
        symbol_info = update_symbol_info(exchange, symbol_info, symbol_config)​
4 Z. V: @9 b* v3 q) _# T$ G) Z# ##################### 4、计算并等待到下一次交易时间 #######################
4 y2 d- z! C9 f1 Y" d        # =获取策略执行时间,并sleep至该时间
5 W; `8 ?' n& Y' q: o" P5 \! U& I        run_time = sleep_until_run_time(execution_interval)​' d2 @" ^- W/ S- z  A2 I0 ~5 h8 v
# ##################### 5、获取目标币种最新数据 #######################! ~2 c8 ~$ v" l! e% ?
        # 获取数据
+ p' d# a$ P4 G        recent_candle_data = single_threading_get_binance_candle_data(exchange, symbol_config, symbol_info, time_interval, run_time, candle_num)​
8 y' f  l! y% Z# T4 t # ##################### 6、根据定投规则计算交易信号及目标持仓量 #######################
! h' Y  _, o5 Y6 X& [( s        # =计算每个币种的交易信号
9 }4 c  e' [. a- e8 o        symbol_info = calculate_trade_vol(symbol_info, symbol_config, symbol_candle_data)
6 p, x1 I) W; q" M$ _1 O        print('\n现货持仓与本次定投计划:\n', symbol_info)​5 o$ e$ w; V+ I" N. f1 n
# ##################### 7、下单,并更新订单信息到文档中 #######################
% @( {, V9 G. L* B6 ]$ I        # order_info = place_binance_batch_order(exchange, symbol_order_params)
. X" R& I; S5 A( w3 b$ z        symbol_order = single_threading_place_order(exchange, symbol_info, symbol_config)  # 单线程下单* ]5 x# ?  E0 J# `+ U) P! s, a
        print('下单记录:\n', symbol_order)' X/ P& A) W) l9 q8 q

& R5 |, ^2 E, [- q: f- c( \9 ?: w, g        # 更新订单信息,查看是否完全成交
$ z3 _- e2 }* r# A4 ^, i, e$ l        time.sleep(short_sleep_time)  # 休息一段时间再更新订单信息' }$ l- {) l% D+ Z, @" [2 ^5 R
        symbol_order = update_order_info(exchange, symbol_config, symbol_order)1 o! }6 m5 _5 p- N
        print('更新下单记录:', '\n', symbol_order)
! L  y. ^1 Z% _5 z: s        to_csv_log(symbol_order, 'invest') # 记录订单信息到CSV文件中​, \9 d: Q; P1 W* D1 H) l
# ##################### 8、更新交易后的账户信息 #######################- d" y% {! t+ N5 v5 S* X
        # 重新更新账户信息symbol_info0 m) o& f4 K4 ?% q* {; W% p; ?* g
        time.sleep(long_sleep_time)  # 休息一段时间再更新% I  A5 Y6 J( _) Q4 d, I
        symbol_info = pd.DataFrame(index=symbol_config.keys(), columns=symbol_info_columns)2 p8 ?4 n! f) {* |: k* g
        symbol_info = update_symbol_info(exchange, symbol_info, symbol_config). A& F1 A) [6 I# z, e3 e# P' n
        print('\nsymbol_info:\n', symbol_info, '\n')% V8 _0 z4 S( A  B2 f
二、细节描述
* M5 R5 w. F9 K3 \+ }( Q$ P0 I' r* `9 d! g& N& O: s- s
1 、获取币安价格精度时
1 ?3 f$ ~& ^4 k/ G/ N
  m8 c. S8 l: I. f/ j( {5 s/ i对public_get_exchangeinfo返回的信息做了分析,核心是filters的结构,典型的list中装dict:​
6 T- }* S4 J# s4 d/ d'filters': [
3 P+ h7 N9 y7 h/ d( q7 B{'filterType': 'PRICE_FILTER', 'minPrice': '0.00000100', 'maxPrice': '922327.00000000', 'tickSize': '0.00000100'},
' V! |* ^; q) i$ Z& m{'filterType': 'PERCENT_PRICE', 'multiplierUp': '5', 'multiplierDown': '0.2', 'avgPriceMins': '5'},
7 ]/ f8 S. P& R$ u8 p/ _5 U3 Y{'filterType': 'LOT_SIZE', 'minQty': '0.00100000', 'maxQty': '100000.00000000', 'stepSize': '0.00100000'},
$ J# ~. C0 Q6 n& C( T# w{'filterType': 'MIN_NOTIONAL', 'minNotional': '0.00010000', 'applyToMarket': True, 'avgPriceMins': '5'},
( V5 X; I* i' M7 D* ?4 L/ v{'filterType': 'ICEBERG_PARTS', 'limit': '10'},! S. g1 @/ ]3 L# n
{'filterType': 'MARKET_LOT_SIZE', 'minQty': '0.00000000', 'maxQty': '1525.57157489', 'stepSize': '0.00000000'},  x( c" {. p1 \" Y. O6 E) c
{'filterType': 'MAX_NUM_ORDERS', 'maxNumOrders': '200'},) P! s7 f$ `3 l) E3 J' G- G
{'filterType': 'MAX_NUM_ALGO_ORDERS', 'maxNumAlgoOrders': '5'}! I7 w( g8 P( e5 i3 p3 \
],经过分析,获取价格精度和下单量精度就是:# ]* V3 f! A1 k; Y; k( u# {
# 获取u本为合约交易对的信息
6 W9 O" S! W2 R    exchange_info = retry_wrapper(exchange.public_get_exchangeinfo, act_name='查看现货基本信息')
9 w  E/ w' |6 _/ K    # 转化为dataframe2 Q& D; f' G; ?6 `$ x) `
    df = pd.DataFrame(exchange_info['symbols'])
. P+ i1 {' j. T% F- l. d1 k    df['tickSize'] = df['filters'].apply(lambda x: x[0]['tickSize']) # 最小下单价精度; F+ a- n# B2 r
df['stepSize'] = df['filters'].apply(lambda x: x[2]['stepSize']) # 最小下单量精度2 、录订单信息
# U- u2 y( W3 Y; l6 z: S2 O" m0 A- R8 x0 s1 m/ n
币安接口中不包含某些信息,如只有委托价格,没有实际成交价格(也可能是我没找到合适的接口),因此需要我们自己根据成交量和成交总金额计算:& q- ?& q0 |! @" e# e
if order_info:
: n( M& B$ o% q2 ]' x6 C                symbol_order.at[order_id, "订单状态"] = binance_order_state[order_info["status"]]6 E9 Y* h* E5 F9 O  ]
                if binance_order_state[order_info["status"]] == '失败':
9 a1 v5 ]  P  D4 M/ W# C                    print('下单失败')$ S. _6 [9 [. O/ z$ c
                symbol_order.at[order_id, "交易方向"] = order_info["side"]& n1 G/ H9 e/ C3 M$ A* Z! r
                symbol_order.at[order_id, "委托数量"] = order_info["origQty"]' F( y3 q3 K1 C8 Q! W  b2 r. t
                symbol_order.at[order_id, "成交数量"] = order_info["executedQty"]
# Q6 c- D5 B( k; G6 M( ~; o; O3 K5 H                symbol_order.at[order_id, "委托价格"] = order_info["price"]1 u# D4 u' A) `9 W
                symbol_order.at[order_id, "成交总金额"] = order_info["cummulativeQuoteQty"]
: I$ K5 ]9 U+ r4 t0 g                symbol_order.at[order_id, "成交均价"] = float(order_info["cummulativeQuoteQty"]) / float(
) M# a! g2 m  A) q! D1 Y, ^5 u                    order_info["executedQty"]) # 接口里没有,所以需要自己计算6 e* u# _0 t& f; F# u
                symbol_order.at[order_id, "委托时间"] = pd.to_datetime(order_info["time"], unit='ms')
# ]" `) b! V3 L2 |            else:& n5 [5 Y6 P' I) e! v# G5 Y
                print('根据订单号获取订单信息失败次数超过max_try_amount,发送钉钉')
: J. K9 G5 {% I! C% M3 、定投策略
2 L' Z+ x5 h- D, G: O/ K+ f) V9 v# A6 L
定投策略都包含在Signals文件中,里面策略具体含义可以参考大佬的帖子:目前我用的就是定投策略
' \/ T3 F7 m& M% d++++++++++++++++++++++++++++++++++++  P7 m1 w; w. H. K, L- [
定投是熊市囤币,牛市收割的利器,一起跑起来,
+ n9 R. f! a- S: C$ K
+ a$ L- B# I$ N/ _最后附上代码:% h/ [8 U1 I8 q- q% U

( D% J1 Q1 v0 e' p$ x 【python数字货币量化_21精华帖_策略第27篇】基于币安交易所的定投框架-1.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

274

金钱

0

收听

0

听众
性别
保密

新手上路

金钱
274 元