三十九、区块量化 BitGet 合约操作文件

发布时间 2023-07-10 11:09:07作者: 金记缘

1、打开新增的cross_order.py 文件

# -*- coding: utf-8 -*-
import pandas as pd
import bitget.mix.market_api as market
import bitget.mix.account_api as accounts
import bitget.mix.position_api as position
import bitget.mix.order_api as order
from bitget.config import Config
import time
from datetime import datetime
import weixin
from bitget.enums import *

# 市场行情接口
marketApi = market.MarketApi(Config.BITGET_API_KEY, Config.BITGET_API_SECRET, Config.BITGET_PASSPHRASE,
use_server_time=False, first=False)
# 用户账户接口
accountApi = accounts.AccountApi(Config.BITGET_API_KEY, Config.BITGET_API_SECRET, Config.BITGET_PASSPHRASE,
use_server_time=False, first=False)
# 仓位接口
positionApi = position.PositionApi(Config.BITGET_API_KEY, Config.BITGET_API_SECRET, Config.BITGET_PASSPHRASE,
use_server_time=False, first=False)
# 订单接口
orderApi = order.OrderApi(Config.BITGET_API_KEY, Config.BITGET_API_SECRET, Config.BITGET_PASSPHRASE,
use_server_time=False, first=False)
pd.set_option('expand_frame_repr', False)

# 交易对集合
# symbol:交易对
symbol_pool = ['BTCUSDT_UMCBL', 'ETHUSDT_UMCBL']


def get_orderbook(symbol='BTCUSDT_UMCBL'):
"""
查看买一和卖一的价格
@param symbol: 交易对
@return:
"""
result = marketApi.ticker(symbol=symbol)
if len(result['data']) > 0:
return float(result['data']['bestAsk']), float(result['data']['bestBid'])
else:
return 0, 0


def get_orderbook_ask(symbol='BTCUSDT_UMCBL'):
"""
查看买一的价格
@param symbol: 交易对
@return:
"""
result = marketApi.ticker(symbol=symbol)
if len(result['data']) > 0:
return float(result['data']['bestAsk'])
else:
return 0


def get_orderbook_bid(symbol='BTCUSDT_UMCBL'):
"""
查看卖一的价格
@param symbol: 交易对
@return:
"""
result = marketApi.ticker(symbol=symbol)
if len(result['data']) > 0:
return float(result['data']['bestBid'])
else:
return 0


def get_available_cash(asset='umcbl'):
"""
查看账户余额
@param asset: 币种
@return: 可用余额、占用金额
"""
result = accountApi.accounts(productType=asset)
if len(result['data']) > 0:
return float(result['data'][0]['available'])
# return float(result['data'][0]['available']), float(result['data'][0]['locked'])
else:
return 0


def datetime_to_timestamp13(date):
"""
生成13时间戳
@date 输入日期
@return: Unix时间戳的毫秒数格式 如:1540281250399895
"""
timeArray = datetime.strptime(date, "%Y-%m-%d %H:%M:%S.%f")
# 10位,时间点相当于从UNIX TIME的纪元时间开始的当年时间编号
date_stamp = str(int(time.mktime(timeArray.timetuple())))
# 3位,微秒
data_microsecond = str("%06d" % timeArray.microsecond)[0:3]
timestamp = date_stamp + data_microsecond
return str(timestamp)


def get_timestamp13():
"""
生成13时间戳
@return: Unix时间戳的毫秒数格式 如:1540281250399895
"""
datetime_now = datetime.now()
# 10位,时间点相当于从UNIX TIME的纪元时间开始的当年时间编号
date_stamp = str(int(time.mktime(datetime_now.timetuple())))
# 3位,微秒
data_microsecond = str("%06d" % datetime_now.microsecond)[0:3]
timestamp = date_stamp + data_microsecond
return str(timestamp)


def timestamp_to_datetime(timestamp):
"""
时间戳转标准时间
@param timestamp:
@return:
"""
datatime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(float(str(timestamp)[0:10])))
datatime = datatime + '.' + str(timestamp)[10:]
return datatime


def get_candlesticks(symbol='BTCUSDT_UMCBL', interval='5m', limit='30'):
"""
查看历吏价格
@param symbol: 交易对
@param interval: K线数据
@param limit: 显示条数
@return:
"""
end_str = get_timestamp13()
result = marketApi.history_candles(symbol=symbol, granularity=interval, endTime=end_str, limit=limit)
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.sort_values(by=['symbol', 'datetime'], ignore_index=True, ascending=True, inplace=True)
# 重置索引
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='BTCUSDT_UMCBL'):
"""
查看合约多仓持仓信息
@param symbol: 交易对
@return:
"""
result = positionApi.single_position(symbol=symbol, marginCoin='USDT')
if len(result['data']) > 0:
for value in result['data']:
if value['holdSide'] == POS_SIDE_LONG:
return float(value['total'])
else:
return 0


def get_short_positions(symbol='BTCUSDT_UMCBL'):
"""
查看合约空仓持仓信息
@param symbol: 交易对
@return:
"""
result = positionApi.single_position(symbol=symbol, marginCoin='USDT')
if len(result['data']) > 0:
for value in result['data']:
if value['holdSide'] == POS_SIDE_SHORT:
return float(value['total'])
else:
return 0


def set_leverage(symbol='BTCUSDT_UMCBL', leverage='25'):
"""
设置合约杠杆倍数
@param symbol: 交易对
@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):
result = accountApi.leverage(symbol=symbol, marginCoin='USDT', leverage=leverage)
return result
else:
print('已持仓中,无法修改杠杆倍数')


def create_order(symbol='BTCUSDT_UMCBL', side='open_long', ordtype='limit', price='0', quantity='1',
tpOrdPx='', slOrdPx='', message=''):
"""
全仓合约下单
@param symbol: 交易对
@param side: 订单方向:open_long:多仓, open_short:空仓 close_long: 平多仓 close_short:平空仓
@param ordtype: 订单类型:market:市价单、limit:限价单
@param price: 委托价格
@param quantity: 委托数量
@param tpOrdPx: 止盈委托价
@param slOrdPx: 止损委托价
@param message: 判断依据
@return:
"""
params = dict()
if ordtype in [ORDER_TYPE_LIMIT]:
params.update({
'timeInForceValue': 'normal'
})
if ordtype != ORDER_TYPE_MARKET:
params.update({
'price': price
})
result = orderApi.create_order(symbol=symbol, marginCoin='USDT', side=side, orderType=ordtype, size=quantity,
presetTakeProfitPrice=tpOrdPx, presetStopLossPrice=slOrdPx, **params)
if result["code"] == "00000":
if side == 'sell': sides =
'卖出'
else: sides =
'买入'
wxmsg = 'BITGET 下单成功,\n订单ID{}\n交易对:{}\n买卖方式:{}\n购买价格:{:.2f}\n购买数量:{}\n止盈价格:{:.2f}\n' \
'止损价格:{:.2f}\n判断依据:{}'.format(result["data"][0]["orderId"], symbol, sides, price, quantity, tpOrdPx, slOrdPx, message) weixin.senddata(

'@all', wxmsg)
return result["data"][0]["orderId"]
else: weixin.senddata(
'@all', 'BITGET 下单失败,错误码:' + result["code"] + '\n错误信息:' + result["msg"])
return "下单失败,错误码:", result["code"], ", 错误信息:", result["msg"]


def close_positions(symbol='BTCUSDT_UMCBL', side='close_long', message=''):
"""
平仓方法
@param symbol: 交易对
@param side: 订单方向:close_long: 平多仓 close_short:平空仓
@param message: 判断依据
@return:
"""
create_order(symbol=symbol, side=side, ordtype='market', quantity='1', message=message)


def up_cross_order(symbol='BTCUSDT_UMCBL', ordtype='limit', tpOrdPx='', slOrdPx='', message=''):
"""
开多仓方法
@param symbol: 交易对
@param ordtype: 订单类型:market:市价单、limit:限价单
@param tpOrdPx: 止盈委托价
@param slOrdPx: 止损委托价
@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()
print('可用USDT' + str(free_money))
if free_money > 0: price = get_orderbook_bid(symbol)

print('可成交价格:' + str(price)) quantity =
1
# 如果当时持有空仓,则先平仓,再开多仓;
if short_position != 0:
print('BITGET 如果当时持有空仓,则先平仓,再开多仓:' + symbol) close_positions(
symbol=symbol, side=SIDE_CLOSE_SHORT, message='已持空仓,先平空仓,再开多仓') create_order(
symbol=symbol, side=SIDE_OPEN_LONG, ordtype=ordtype, price=str(price), quantity=str(quantity),
tpOrdPx=tpOrdPx, slOrdPx=slOrdPx, message=message)
# 如果没有持仓,则直接开多仓;
elif (short_position == 0.0) and (long_position == 0.0):
print('BITGET 如果没有持仓,则直接开多仓' + symbol) create_order(
symbol=symbol, side=SIDE_OPEN_LONG, ordtype=ordtype, price=str(price), quantity=str(quantity),
tpOrdPx=tpOrdPx, slOrdPx=slOrdPx, message=message)


def down_cross_order(symbol='BTCUSDT_UMCBL', ordtype='limit', tpOrdPx='', slOrdPx='', message=''):
"""
开空仓方法
@param symbol: 交易对
@param ordtype: 订单类型:market:市价单、limit:限价单
@param tpOrdPx: 止盈委托价
@param slOrdPx: 止损委托价
@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)) free_money = get_available_cash()

print('可用USDT' + str(free_money))
if free_money > 0: price = get_orderbook_ask(symbol)

print('可成交价格:' + str(price)) quantity =
1
# 如果当时持有多仓,则先平仓,再开空仓;
if long_position != 0:
print('BITGET 如果当时持有多仓,则先平仓,再开空仓:' + symbol) close_positions(
symbol=symbol, side=SIDE_CLOSE_LONG, message='已持多仓,先平多仓,再开空仓') create_order(
symbol=symbol, side=SIDE_OPEN_SHORT, ordtype=ordtype, price=str(price), quantity=str(quantity),
tpOrdPx=tpOrdPx, slOrdPx=slOrdPx, message=message)
# 如果没有持仓,则直接开空仓;
elif (short_position == 0) and (long_position == 0):
print('BITGET 如果没有持仓,则直接开空仓;' + symbol) create_order(
symbol=symbol, side=SIDE_OPEN_SHORT, ordtype=ordtype, price=str(price), quantity=str(quantity),
tpOrdPx=tpOrdPx, slOrdPx=slOrdPx, message=message)