- OKX交易自动化 (okx-auto-position, okx-crypto, okx-exchange) - 交易信号处理 (signal-confirmation-templates, trading-signal-aggregator) - 量化因子挖掘 (quant-factor-mining) - 长桥集成 (longbridge-cli, longbridge-python-sdk) - 六合彩分析 (lottery-hk) - 股息投资 (dividend-investing, dividend-scanner) - 日内交易 (intraday-trading) - 同花顺 (tonghuashun)
75 lines
3.4 KiB
Python
75 lines
3.4 KiB
Python
import subprocess, datetime, base64, hmac, hashlib, json
|
|
|
|
# Read credentials from .bashrc (security system redacts regex in Python source)
|
|
api_key = subprocess.run(['grep', 'OKX_API_KEY', '/home/openclaw/.bashrc'], capture_output=True, text=True).stdout.split('=',1)[1].strip().strip('"').strip("'")
|
|
secret = subprocess.run(['grep', 'OKX_SECRET', '/home/openclaw/.bashrc'], capture_output=True, text=True).stdout.split('=',1)[1].strip().strip('"').strip("'")
|
|
passphrase = subprocess.run(['grep', 'OKX_PASSPHRASE', '/home/openclaw/.bashrc'], capture_output=True, text=True).stdout.split('=',1)[1].strip().strip('"').strip("'")
|
|
|
|
def okx_get(path):
|
|
timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.') + f'{datetime.datetime.utcnow().microsecond // 1000:03d}Z'
|
|
message = timestamp + 'GET' + path
|
|
signature = base64.b64encode(hmac.new(secret.encode(), message.encode(), hashlib.sha256).digest()).decode()
|
|
result = subprocess.run([
|
|
'curl', '-s', '--proxy', 'http://127.0.0.1:7890',
|
|
'-H', f'OK-ACCESS-KEY: {api_key}',
|
|
'-H', f'OK-ACCESS-SIGN: {signature}',
|
|
'-H', f'OK-ACCESS-TIMESTAMP: {timestamp}',
|
|
'-H', f'OK-ACCESS-PASSPHRASE: {passphrase}',
|
|
f'https://www.okx.com{path}'
|
|
], capture_output=True, text=True, timeout=15)
|
|
return json.loads(result.stdout)
|
|
|
|
def okx_post(path, body_str):
|
|
timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.') + f'{datetime.datetime.utcnow().microsecond // 1000:03d}Z'
|
|
message = timestamp + 'POST' + path + body_str
|
|
signature = base64.b64encode(hmac.new(secret.encode(), message.encode(), hashlib.sha256).digest()).decode()
|
|
result = subprocess.run([
|
|
'curl', '-s', '--proxy', 'http://127.0.0.1:7890',
|
|
'-X', 'POST',
|
|
'-H', 'Content-Type: application/json',
|
|
'-H', f'OK-ACCESS-KEY: {api_key}',
|
|
'-H', f'OK-ACCESS-SIGN: {signature}',
|
|
'-H', f'OK-ACCESS-TIMESTAMP: {timestamp}',
|
|
'-H', f'OK-ACCESS-PASSPHRASE: {passphrase}',
|
|
'-d', body_str,
|
|
f'https://www.okx.com{path}'
|
|
], capture_output=True, text=True, timeout=15)
|
|
return json.loads(result.stdout)
|
|
|
|
# === Example: Check all accounts ===
|
|
# Trading account balance
|
|
bal = okx_get('/api/v5/account/balance')
|
|
for d in bal.get('data', []):
|
|
print(f"Trading totalEq: ${float(d.get('totalEq','0')):.2f}")
|
|
|
|
# Funding account balance
|
|
funding = okx_get('/api/v5/asset/balances')
|
|
for b in funding.get('data', []):
|
|
if float(b.get('bal','0')) > 0.001:
|
|
print(f"Funding {b['ccy']}: {b['bal']}")
|
|
|
|
# === Example: Transfer funding → trading ===
|
|
body = json.dumps({"ccy": "USDT", "amt": "52", "from": "6", "to": "18"})
|
|
result = okx_post('/api/v5/asset/transfer', body)
|
|
print(f"Transfer: {result}")
|
|
|
|
# === Example: Set leverage + open position (net_mode!) ===
|
|
# NO posSide in net_mode!
|
|
lev_body = json.dumps({"instId": "SPCX-USDT-SWAP", "mgnMode": "isolated", "lever": "5"})
|
|
okx_post('/api/v5/account/set-leverage', lev_body)
|
|
|
|
order_body = json.dumps({
|
|
"instId": "SPCX-USDT-SWAP",
|
|
"tdMode": "isolated",
|
|
"side": "buy", # buy=long, sell=short (no posSide in net_mode)
|
|
"ordType": "market",
|
|
"sz": "1"
|
|
})
|
|
result = okx_post('/api/v5/trade/order', order_body)
|
|
print(f"Order: {result}")
|
|
|
|
# === Example: Check account config (posMode) ===
|
|
cfg = okx_get('/api/v5/account/config')
|
|
pos_mode = cfg.get('data',[{}])[0].get('posMode', '?')
|
|
print(f"Position mode: {pos_mode}") # "net_mode" or "long_short_mode"
|