三、区块量化 okx 合约操作文件
1、打开新增的cross_order.py 文件
# -*- coding: utf-8 -*- import pandas as pd import okx.Account as account import okx.Trade as trade import okx.MarketData as marketdata import okx.PublicData as publicdata from okx.config import Config import time from datetime import datetime import weixin from okx.enums import * # 用户账户接口 account_api = account.AccountAPI(Config.OKEX_API_KEY, Config.OKEX_API_SECRET, Config.OKEX_PASSPHRASE, False, Config.OKEX_FLAG) # 交易订单接口 trade_api = trade.TradeAPI(Config.OKEX_API_KEY, Config.OKEX_API_SECRET, Config.OKEX_PASSPHRASE, False, Config.OKEX_FLAG) # 市场行情接口 marketdata_api = marketdata.MarketAPI(Config.OKEX_FLAG) # 公共数据接口 publicdata_api = publicdata.PublicAPI(Config.OKEX_FLAG) pd.set_option('expand_frame_repr', False) # 交易对集合 # symbol:交易对 symbol_pool = ['BTC-USDT-SWAP', 'ETH-USDT-SWAP'] def get_symbol_info(symbol='EOS-USDT-SWAP'): """ 查看币种信息 @param symbol: 交易对 @return: """ result = publicdata_api.get_instruments(instType='SWAP', instId=symbol) if len(result['data']) > 0: return float(result['data'][0]['lotSz']), float(result['data'][0]['tickSz']) else: return 0, 0 def get_orderbook(symbol='EOS-USDT-SWAP'): """ 查看买一和卖一的价格 @param symbol: 交易对 @return: """ result = marketdata_api.get_orderbook(instId=symbol) if len(result['data']) > 0: return float(result['data'][0]['asks'][0][0]), float(result['data'][0]['bids'][0][0]) else: return 0, 0 def get_orderbook_ask(symbol='EOS-USDT-SWAP'): """ 查看买一的价格 @param symbol: 交易对 @return: """ result = marketdata_api.get_orderbook(instId=symbol) if len(result['data']) > 0: return float(result['data'][0]['asks'][0][0]) else: return 0 def get_orderbook_bid(symbol='EOS-USDT-SWAP'): """ 查看卖一的价格 @param symbol: 交易对 @return: """ result = marketdata_api.get_orderbook(instId=symbol) if len(result['data']) > 0: return float(result['data'][0]['bids'][0][0]) else: return 0 def get_available_cash(asset='USDT'): """ 查看账户余额 @param asset: 币种 @return: 可用余额、占用金额 """ result = account_api.get_account_balance(ccy=asset) if len(result['data']) > 0: return float(result['data'][0]['details'][0]['availBal']) # return float(result['data'][0]['details'][0]['availBal']), float(result['data'][0]['details'][0]['frozenBal']) else: return 0 def get_candlesticks(symbol='EOS-USDT-SWAP', interval='5m', limit='30'): """ 查看历吏价格 @param symbol: 交易对 @param interval: K线数据 @param limit: 显示条数 @return: """ result = marketdata_api.get_candlesticks(instId=symbol, bar=interval, limit=limit) for line in result['data']: del line[6:] df = pd.DataFrame(data=result['data'], 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='EOS-USDT-SWAP'): """ 查看合约多仓持仓信息 @param symbol: 交易对 @return: """ result = account_api.get_positions(instId=symbol, instType='SWAP') if len(result['data']) > 0: for value in result['data']: if value['posSide'] == POS_SIDE_LONG: return float(value['pos']) else: return 0 def get_short_positions(symbol='EOS-USDT-SWAP'): """ 查看合约空仓持仓信息 @param symbol: 交易对 @return: """ result = account_api.get_positions(instId=symbol, instType='SWAP') if len(result['data']) > 0: for value in result['data']: if value['posSide'] == POS_SIDE_SHORT: return float(value['pos']) else: return 0 def set_leverage(symbol='EOS-USDT-SWAP', 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 = account_api.set_leverage(instId=symbol, lever=leverage, mgnMode=TD_MODE_CROSS) return result else: print('已持仓中,无法修改杠杆倍数')