1、新增cross_order.py文件
# -*- coding: utf-8 -*- import pandas as pd from binance import Client, Config import time import weixin from binance.enums import * from decimal import Decimal client = Client(Config.BINANCE_API_KEY, Config.BINANCE_API_SECRET) pd.set_option('expand_frame_repr', False) # 交易对集合 # symbol:交易对 symbol_pool = ['BTCUSDT', 'ETHUSDT'] def get_orderbook(symbol='EOSUSDT'): """ 查看买一和卖一的价格 @param symbol: 交易对 @return: """ result = client.get_orderbook_ticker(symbol=symbol) if len(result) > 0: return float(result['askPrice']), float(result['bidPrice']) else: return 0, 0 def get_orderbook_ask(symbol='EOSUSDT'): """ 查看买一的价格 @param symbol: 币种 @return: """ result = client.get_orderbook_ticker(symbol=symbol) if len(result) > 0: return float(result['askPrice']) else: return 0 def get_orderbook_bid(symbol='EOSUSDT'): """ 查看卖一的价格 @param symbol: 币种 @return: """ result = client.get_orderbook_ticker(symbol=symbol) if len(result) > 0: return float(result['bidPrice']) else: return 0 def get_available_cash(symbol='USDT'): """ 查看账户余额 @param symbol: 币种 @return: """ result = client.futures_account_balance() if len(result) > 0: for value in result: if value['asset'] == symbol: balance = float(value['balance']) return balance else: return 0 def get_candlesticks(symbol='EOSUSDT', interval='5m', limit='30'): """ 查看历吏价格 @param symbol: 交易对 @param interval: K线数据 @param limit: 显示条数 @return: """ limits = int(limit) result = client.futures_klines(symbol=symbol, interval=interval.lower(), limit=limits) for line in result: del line[6:] df = pd.DataFrame(data=result, columns=['datetime', 'open', 'high', 'low', 'close', 'volume']) df['symbol'] = symbol # 时区转换为+8.00区域 df['datetime'] = pd.to_datetime(df['datetime'], unit='ms', utc=True).dt.tz_convert('Asia/Shanghai') # 删除重复数据 df.drop_duplicates(['datetime'], inplace=True) # 将数值数据转为float型,便于后续处理 convert_list = ['open', 'high', 'low', 'close', 'volume'] df[convert_list] = df[convert_list].astype(float) # 重置索引 df.reset_index(drop=True, inplace=True) # 增加id列 df.index = df.index + 1 df = df.reset_index() df = df.rename(columns={'index': 'id'}) return df def get_historicalticks(symbol='EOSUSDT', interval='5m', start_str='2023-05-01', end_str='2023-06-01'): """ 查看历吏价格 @param symbol: 交易对 @param interval: K线数据 @param start_str: 开始时间 @param end_str: 结束时间 @return: """ result = client.futures_historical_klines(symbol=symbol, interval=interval.lower(), start_str=start_str, end_str=end_str) for line in result: del line[6:] df = pd.DataFrame(data=result, columns=['datetime', 'open', 'high', 'low', 'close', 'volume']) df['symbol'] = symbol # 时区转换为+8.00区域 df['datetime'] = pd.to_datetime(df['datetime'], unit='ms', utc=True).dt.tz_convert('Asia/Shanghai') # 删除重复数据 df.drop_duplicates(['datetime'], inplace=True) # 将数值数据转为float型,便于后续处理 convert_list = ['open', 'high', 'low', 'close', 'volume'] df[convert_list] = df[convert_list].astype(float) # 重置索引 df.reset_index(drop=True, inplace=True) # 增加id列 df.index = df.index + 1 df = df.reset_index() df = df.rename(columns={'index': 'id'}) return df def get_long_positions(symbol='EOSUSDT'): """ 查看合约多仓持仓信息 @param symbol: 交易对 @return: """ result = client.futures_position_information(symbol=symbol) if len(result) > 0: for value in result: if value['positionSide'] == POS_SIDE_LONG: return float(value['positionAmt']) else: return 0 def get_short_positions(symbol='EOSUSDT'): """ 查看合约空仓持仓信息 @param symbol: 交易对 @return: """ result = client.futures_position_information(symbol=symbol) if len(result) > 0: for value in result: if value['positionSide'] == POS_SIDE_SHORT: return float(value['positionAmt']) else: return 0 def set_leverage(symbol='EOSUSDT', leverage='5'): """ 设置合约杠杆倍数 @param symbol: 交易对以-SWAP为结尾 @param leverage: 倍数 @return: """ long_positions = get_long_positions(symbol) short_positions = get_short_positions(symbol) if (short_positions == 0.0) and (long_positions == 0.0): leverages = int(leverage) result = client.futures_change_leverage(symbol=symbol, leverage=leverages) return result else: print('已持仓中,无法修改杠杆倍数') def create_order(symbol='EOSUSDT', side='BUY', positionside='LONG', ordtype='LIMIT', price=Decimal('0'), quantity='1', message=''): """ 全仓合约市价下单 @param symbol: 产品ID EOSUSDT @param side: 订单方向:BUY:买, SELL:卖 @param positionside: 持仓方向:LONG 或 SHORT @param ordtype: 订单类型:MARKET:市价单、LIMIT:限价单 @param price: 委托价格 @param quantity: 委托数量 @param message: 判断依据 @return: """ params = dict() if ordtype in [ORDER_TYPE_LIMIT, ORDER_TYPE_STOP_LOSS_LIMIT]: params.update({ 'timeInForce': TIME_IN_FORCE_GTC }) if ordtype != ORDER_TYPE_MARKET: params.update({ 'price': Decimal(price) }) quantitys = float(quantity) result = client.futures_create_order(symbol=symbol, side=side.upper(), positionSide=positionside.upper(), type=ordtype.upper(), quantity=quantitys, **params) if side == 'SELL': sides = '卖出' else: sides = '买入' if positionside == 'SHORT': possides = '做空' else: possides = '做多' weixin.senddata('@all', 'Binance 委托下单成功,\n 订单ID:' + str(result["orderId"]) + '\n 交易对:' + symbol + '\n 买卖方式:' + sides + '\n 购买方向:' + possides + '\n 购买价格:' + str( price) + '\n 购买数量:' + str(quantity) + '\n 判断依据:' + message) def close_positions(symbol='EOSUSDT', side='SELL', positionside='LONG', message=''): """ 平仓方法 开平仓模式下,side和posSide需要进行组合 开多:买入开多(side 填写 BUY; posSide 填写 LONG ) 开空:卖出开空(side 填写 SELL; posSide 填写 SHORT ) 平多:卖出平多(side 填写 SELL;posSide 填写 LONG ) 平空:买入平空(side 填写 BUY; posSide 填写 SHORT ) @param symbol: 交易对 @param side: 订单方向:BUY:买, SELL:卖 @param positionside: 持仓方向:LONG 或 SHORT @param message: 判断依据 @return: """ price = get_orderbook_ask(symbol) client.futures_create_order(symbol=symbol, closePosition=True, type=FUTURE_ORDER_TYPE_STOP_MARKET, side=side, positionSide=positionside, stopPrice=Decimal(price)) weixin.senddata('@all', 'Binance 平仓成功,\n 交易对:' + symbol + '\n 判断依据:' + message) def up_cross_order(symbol, ordtype='LIMIT', message=''): """ 市价开多仓 @param symbol: 交易对 @param ordtype: 订单类型:MARKET:市价单、LIMIT:限价单 @param message: 消息处理 @return: """ print('可做多的交易对:' + symbol) # 获取标的可平多仓 long_position = get_long_positions(symbol=symbol) print('可平多仓:' + str(long_position)) # 获取标的可平空仓 short_position = get_short_positions(symbol=symbol) print('可平空仓:' + str(short_position)) if (long_position + short_position) > 5: print('持仓数最多5个') return free_money = get_available_cash('USDT') print('可用USDT:' + str(free_money)) if free_money > 0: price = get_orderbook_bid(symbol) if symbol == 'BTCUSDT': amount = '0.01' elif symbol == 'ETHUSDT': amount = '0.1' elif symbol == 'DASHUSDT': amount = '0.2' elif symbol == 'BCHUSDT': amount = '0.1' elif symbol == 'ZECUSDT': amount = '0.2' elif symbol == 'LTCUSDT': amount = '0.1' elif symbol == 'FILUSDT': amount = '2' elif symbol == 'XMRUSDT': amount = '0.1' elif symbol == 'DOTUSDT': amount = '2' elif symbol == 'SOLUSDT': amount = '1' else: amount = '1' # 如果当时持有空仓,则先平仓,再开多仓; if short_position != 0: print('Binance 如果当时持有空仓,则先平仓,再开多仓:' + symbol) # 获取标的的最新价 close_positions(symbol=symbol, side=SIDE_BUY, positionside=POS_SIDE_SHORT, message=message) create_order(symbol=symbol, side=SIDE_BUY, positionside=POS_SIDE_LONG, ordtype=ordtype, price=Decimal(price), quantity=str(amount), message=message) # 如果没有持仓,则直接开多仓; elif (short_position == 0.0) and (long_position == 0.0): print('Binance 如果没有持仓,则直接开多仓' + symbol) create_order(symbol=symbol, side=SIDE_BUY, positionside=POS_SIDE_LONG, ordtype=ordtype, price=Decimal(price), quantity=str(amount), message=message) def down_cross_order(symbol, ordtype='LIMIT', message=''): """ 市价开空仓 @param symbol: 交易对 @param ordtype: 订单类型:MARKET:市价单、LIMIT:限价单 @param message: 消息处理 @return: """ print('可做空的交易对:' + symbol) # 获取标的可平多仓 long_position = get_long_positions(symbol=symbol) print('可平多仓:' + str(long_position)) # 获取标的可平空仓 short_position = get_short_positions(symbol=symbol) print('可平空仓:' + str(short_position)) if (long_position + short_position) > 5: print('持仓数最多5个') return free_money = get_available_cash('USDT') print('可用USDT:' + str(free_money)) if free_money > 0: price = get_orderbook_ask(symbol) if symbol == 'BTCUSDT': amount = '0.01' elif symbol == 'ETHUSDT': amount = '0.1' elif symbol == 'DASHUSDT': amount = '0.2' elif symbol == 'BCHUSDT': amount = '0.1' elif symbol == 'ZECUSDT': amount = '0.2' elif symbol == 'LTCUSDT': amount = '0.1' elif symbol == 'FILUSDT': amount = '2' elif symbol == 'XMRUSDT': amount = '0.1' elif symbol == 'DOTUSDT': amount = '2' elif symbol == 'SOLUSDT': amount = '1' else: amount = '1' # 如果当时持有多仓,则先平仓,再开空仓; if long_position != 0: print('Binance 如果当时持有多仓,则先平仓,再开空仓:' + symbol) close_positions(symbol=symbol, side=SIDE_SELL, positionside=POS_SIDE_LONG, message=message) create_order(symbol=symbol, side=SIDE_SELL, positionside=POS_SIDE_SHORT, ordtype=ordtype, price=Decimal(price), quantity=str(amount), message=message) # 如果没有持仓,则直接开空仓; elif (short_position == 0) and (long_position == 0): print('Binance 如果没有持仓,则直接开空仓;' + symbol) create_order(symbol=symbol, side=SIDE_SELL, positionside=POS_SIDE_SHORT, ordtype=ordtype, price=Decimal(price), quantity=str(amount), message=message)