Pharos
Contract

GetContractType - 获取合约类型

获取当前设置的合约类型(合约代码)。

语法

python
contract_type = exchange.GetContractType()

参数

无参数。

返回值

返回字符串,表示当前合约类型。失败返回空字符串 ""

常见合约类型:

说明
"this_week"当周合约
"next_week"次周合约
"quarter"季度合约
"next_quarter"次季度合约
"swap"永续合约
"BTCUSDT"交割合约代码(某些交易所)

注意:不同交易所的合约类型命名可能不同。

示例

1. 基础获取合约类型

python
# 设置合约
exchange.SetContractType("swap")

# 获取当前合约类型
contract = exchange.GetContractType()
Log(f"当前合约: {contract}")  # 输出: 当前合约: swap

2. 验证合约设置

python
def set_and_verify_contract(target_contract):
    """设置合约并验证是否成功"""
    exchange.SetContractType(target_contract)
    Sleep(500)
    
    current = exchange.GetContractType()
    if current == target_contract:
        Log(f"合约设置成功: {target_contract}")
        return True
    else:
        Log(f"合约设置失败: 期望 {target_contract}, 实际 {current}")
        return False

# 使用
if set_and_verify_contract("swap"):
    # 继续交易逻辑
    pass

3. 多合约切换交易

python
# 在多个合约间轮换交易
contracts = ["this_week", "next_week", "quarter", "swap"]

for contract in contracts:
    exchange.SetContractType(contract)
    Sleep(500)
    
    current = exchange.GetContractType()
    Log(f"切换到合约: {current}")
    
    # 获取该合约的行情
    ticker = exchange.GetTicker()
    if ticker:
        Log(f"  价格: {ticker['Last']}")
    
    # 获取持仓
    positions = exchange.GetPosition()
    if positions:
        Log(f"  持仓: {len(positions)} 个")

4. 根据合约类型调整策略

python
contract = exchange.GetContractType()

if contract == "swap":
    # 永续合约策略
    Log("使用永续合约策略")
    leverage = 5
    position_size = 100
    
elif contract in ["this_week", "next_week"]:
    # 短期合约策略
    Log("使用短期合约策略")
    leverage = 3
    position_size = 50
    
elif contract in ["quarter", "next_quarter"]:
    # 季度合约策略
    Log("使用季度合约策略")
    leverage = 2
    position_size = 30
    
else:
    Log(f"未知合约类型: {contract}")
    leverage = 1
    position_size = 10

exchange.SetMarginLevel(leverage)

5. 显示合约信息面板

python
def show_contract_info():
    """显示当前合约的详细信息"""
    contract = exchange.GetContractType()
    ticker = exchange.GetTicker()
    positions = exchange.GetPosition()
    leverage = exchange.GetMarginLevel()
    
    info = f"""
    ========== 合约信息 ==========
    交易所: {exchange.GetName()}
    合约类型: {contract}
    当前价格: {ticker['Last'] if ticker else 'N/A'}
    杠杆倍数: {leverage}x
    持仓数量: {len(positions)}
    ==============================
    """
    
    Log(info)
    return contract

show_contract_info()

6. 保存合约状态

python
# 保存当前合约状态,便于恢复
saved_state = {
    "contract": exchange.GetContractType(),
    "leverage": exchange.GetMarginLevel(),
    "currency": exchange.GetCurrency()
}

Log(f"已保存状态: {saved_state}")

# ... 执行其他操作,可能切换合约 ...

# 恢复状态
exchange.SetContractType(saved_state["contract"])
exchange.SetMarginLevel(saved_state["leverage"])
exchange.SetCurrency(saved_state["currency"])

Log("状态已恢复")

7. 合约轮询监控

python
def monitor_contracts():
    """监控所有合约的价格"""
    contracts = ["this_week", "next_week", "quarter", "swap"]
    
    while True:
        Log("========== 合约价格监控 ==========")
        
        for contract in contracts:
            exchange.SetContractType(contract)
            Sleep(500)
            
            ticker = exchange.GetTicker()
            if ticker:
                Log(f"{contract}: {ticker['Last']}")
        
        Sleep(30000)  # 每30秒更新一次

monitor_contracts()

8. 检测合约到期

python
def check_contract_expiration():
    """检查合约是否临近到期"""
    contract = exchange.GetContractType()
    
    # 定义到期风险的合约
    expiring_soon = ["this_week"]
    moderate_risk = ["next_week"]
    
    if contract in expiring_soon:
        Log("警告: 当前合约即将到期,请注意风险!")
        return "high_risk"
    elif contract in moderate_risk:
        Log("提示: 当前合约下周到期")
        return "moderate_risk"
    elif contract == "swap":
        Log("永续合约,无到期时间")
        return "no_risk"
    else:
        Log(f"合约类型: {contract}")
        return "unknown"

risk_level = check_contract_expiration()

9. 多交易所合约比较

python
# 假设有多个交易所对象
exchanges = [exchange1, exchange2, exchange3]
contract_type = "swap"

for i, ex in enumerate(exchanges):
    ex.SetContractType(contract_type)
    Sleep(500)
    
    current = ex.GetContractType()
    ticker = ex.GetTicker()
    
    Log(f"交易所 {i+1}:")
    Log(f"  合约: {current}")
    Log(f"  价格: {ticker['Last'] if ticker else 'N/A'}")

10. 合约切换错误处理

python
def safe_set_contract(target_contract, max_retries=3):
    """安全地设置合约,带重试机制"""
    for attempt in range(max_retries):
        exchange.SetContractType(target_contract)
        Sleep(1000)
        
        current = exchange.GetContractType()
        if current == target_contract:
            Log(f"合约设置成功: {target_contract}")
            return True
        else:
            Log(f"尝试 {attempt + 1}/{max_retries} 失败,重试...")
    
    Log(f"合约设置失败,无法切换到: {target_contract}")
    return False

# 使用
if safe_set_contract("swap"):
    # 继续交易
    pass
else:
    # 降级处理或报警
    Log("合约设置失败,策略暂停")

注意事项

  1. 交易所差异:不同交易所的合约类型命名和数量不同,使用前请查阅交易所文档
  2. 验证设置SetContractType 后建议使用 GetContractType 验证是否设置成功
  3. 合约代码:某些交易所使用合约代码(如 BTCUSDT)而非类型名称
  4. 到期风险:交割合约有到期时间,到期前需平仓或移仓
  5. 永续合约:永续合约(swap)没有到期时间,但有资金费率
  6. API 调用:切换合约后,所有交易和查询都针对当前合约

相关方法