三、区块量化 Okx 合约操作文件

发布时间 2023-06-16 16:52:51作者: 金记缘

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
from okx.config import api_key, secret_key, passphrase, flag
import time

account_api = account.AccountAPI(api_key, secret_key, passphrase, False, flag)
trade_api = trade.TradeAPI(api_key, secret_key, passphrase, False, flag)
marketdata_api = marketdata.MarketAPI(flag)
pd.set_option('expand_frame_repr', False)

def get_orderbook_ask(symbol='EOS-USDT-SWAP'):
"""
查看买一的价格
@param symbol: 币种
@return:
"""
result = marketdata_api.get_orderbook(instId=symbol)
return float(result['data'][0]['asks'][0][0])

def get_orderbook_bid(symbol='EOS-USDT-SWAP'):
"""
查看卖一的价格
@param symbol: 币种
@return:
"""
result = marketdata_api.get_orderbook(instId=symbol)
return float(result['data'][0]['bids'][0][0])

def get_available_cash(symbol='USDT'):
"""
查看账户余额
@param symbol: 币种
@return:
"""
result = account_api.get_max_withdrawal(ccy=symbol)
return float(result['data'][0]['maxWd'])


def get_candlesticks(symbol='EOS-USDT-SWAP', interval='5m', limit='30'):
"""
查看历吏价格
@param symbol: 交易对以-SWAP为结尾
@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=['time', 'open', 'high', 'low', 'close', 'vol'])
df['symbol'] = symbol
# 时区转换为+8.00 区域
df['time'] = pd.to_datetime(df['time'], unit='ms', utc=True).dt.tz_convert('Asia/Shanghai')
# 删除重复数据
df.drop_duplicates(['time'], inplace=True)
# 将数值数据转为float型,便于后续处理
convert_list = ['open', 'high', 'low', 'close', 'vol']
df[convert_list] = df[convert_list].astype(float)
# 重新排序
df.sort_values(by=['symbol', 'time'], ignore_index=True, ascending=True, inplace=True)
# 重置索引
df.reset_index(drop=True, inplace=True)
return df

def get_timestamp(datetime):
"""
标准时间转时间戳
@param datetime: 输入日期
@return: 返回Unix时间戳
"""
# 转换成时间数组
timeArray = time.strptime(datetime, "%Y-%m-%d %H:%M:%S")
# 转换成时间戳
timestamp = int(time.mktime(timeArray))
# 输出时间戳
return timestamp


def get_datetime(timestamp):
"""
时间戳转标准时间
@param timestamp: 输入Unix时间戳
@return: 返回日期
"""
# 转换成localtime
time_local = time.localtime(timestamp)
# 转换成新的时间格式(2016-05-09 18:59:20)
datetime = time.strftime("%Y-%m-%d %H:%M:%S", time_local)
# 输出时间标准格式
return datetime


def get_long_positions(symbol='EOS-USDT-SWAP'):
"""
查看合约多仓持仓信息
@param symbol: 交易对以-SWAP为结尾
@return:
"""
result = account_api.get_positions(instId=symbol, instType='SWAP')
for value in result['data']:
if value['posSide'] == 'long':
return float(value['pos'])


def get_short_positions(symbol='EOS-USDT-SWAP'):
"""
查看合约空仓持仓信息
@param symbol: 交易对以-SWAP为结尾
@return:
"""
result = account_api.get_positions(instId=symbol, instType='SWAP')
for value in result['data']:
if value['posSide'] == 'short':
return float(value['pos'])


def set_leverage(symbol='EOS-USDT-SWAP', leverage='25'):
"""
设置合约杠杆倍数
@param symbol: 交易对以-SWAP为结尾
@param leverage: 倍数
@return:
"""
long_positions = get_long_positions(symbol)
short_positions = get_short_positions(symbol)
if not long_positions and not short_positions:
result = account_api.set_leverage(instId=symbol, lever=leverage, mgnMode='cross')
return result
else:
print('已持仓中,无法修改杠杆倍数')