三、区块量化 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('已持仓中,无法修改杠杆倍数')
浙公网安备 33010602011771号