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)