tqsdk.risk_rule - 风控类模块

class tqsdk.risk_rule.TqRuleOpenCountsLimit(api: TqApi, open_counts_limit: int, symbol: str | List[str], account: UnionTradeable | None = None)

风控规则类 - 交易日内开仓次数限制。

Args:

api (TqApi): TqApi 实例

open_counts_limit (int): 交易日内开仓次数上限

symbol (str/list of str): 负责限制的合约代码或合约代码列表.
  • str: 一个合约代码

  • list of str: 合约代码列表

account (TqAccount/TqKq/TqZq/TqKqStock/TqSim/TqSimStock/TqCtp/TqRohon/TqJees/TqYida/TqTradingUnit): [可选] 指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

Example1:

from tqsdk import TqApi
from tqsdk.risk_rule import TqRuleOpenCountsLimit

api = TqApi(auth=TqAuth("快期账户", "账户密码"))

rule = TqRuleOpenCountsLimit(api, open_counts_limit=10, symbol="DCE.m2112")  # 创建风控规则实例
api.add_risk_rule(rule)  # 添加风控规则

quote = api.get_quote("DCE.m2112")
try:
    # 每次最新价变动,下一笔订单,直到超过开仓次数风控限制
    while True:
        api.wait_update()
        if api.is_changing(quote, ['last_price']):
            order = api.insert_order(symbol="DCE.m2112", direction="BUY", offset="OPEN", volume=1)
            while order.status != "FINISHED":
                api.wait_update()
except TqRiskRuleError as e:
    print('!!!', e)
api.close()
class tqsdk.risk_rule.TqRuleOpenVolumesLimit(api: TqApi, open_volumes_limit: int, symbol: str | List[str], account: UnionTradeable | None = None)

风控规则类 - 交易日内开仓手数限制

Args:

api (TqApi): TqApi 实例

open_volumes_limit (int): 交易日内开仓手数上限

symbol (str/list of str): 负责限制的合约代码或合约代码列表.
  • str: 一个合约代码

  • list of str: 合约代码列表

account (TqAccount/TqKq/TqZq/TqKqStock/TqSim/TqSimStock/TqCtp/TqRohon/TqJees/TqYida/TqTradingUnit): [可选] 指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

Example1:

from tqsdk import TqApi
from tqsdk.risk_rule import TqRuleOpenVolumesLimit

api = TqApi(auth=TqAuth("快期账户", "账户密码"))

rule = TqRuleOpenVolumesLimit(api, open_volumes_limit=10, symbol="DCE.m2112")  # 创建风控规则实例
api.add_risk_rule(rule)  # 添加风控规则

# 下单 5 手,不会触发风控规则
order1 = api.insert_order(symbol="DCE.m2112", direction="BUY", offset="OPEN", volume=5)
while order1.status != "FINISHED":
    api.wait_update()

# 继续下单 8 手,会触发风控规则
order2 = api.insert_order(symbol="DCE.m2112", direction="BUY", offset="OPEN", volume=8)
while order2.status != "FINISHED":
    api.wait_update()
api.close()

Example2:

from tqsdk import TqApi, TqKq, TqRiskRuleError
from tqsdk.risk_rule import TqRuleOpenVolumesLimit

account = TqKq()
api = TqApi(account=account, auth=TqAuth("快期账户", "账户密码"))

rule = TqRuleOpenVolumesLimit(api, open_volumes_limit=10, symbol="DCE.m2112", account=account)  # 创建风控规则实例
api.add_risk_rule(rule)  # 添加风控规则

try:
    # 下单 11 手,触发风控规则
    order1 = api.insert_order(symbol="DCE.m2112", direction="BUY", offset="OPEN", volume=11)
    while order1.status != "FINISHED":
        api.wait_update()
except TqRiskRuleError as e:
    print("!!!", e)

api.close()
class tqsdk.risk_rule.TqRuleAccOpenVolumesLimit(api: TqApi, open_volumes_limit: int, symbol: str | List[str], account: UnionTradeable | None = None)

风控规则类 - 累计开仓手数限制。

限制合约开仓手数之和。

Args:

api (TqApi): TqApi 实例

open_volumes_limit (int): 交易日内开仓手数之和上限

symbol (str/list of str): 负责限制的合约代码或合约代码列表.
  • str: 一个合约代码

  • list of str: 合约代码列表

account (TqAccount/TqKq/TqZq/TqKqStock/TqSim/TqSimStock/TqCtp/TqRohon/TqJees/TqYida/TqTradingUnit): [可选] 指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

Example:

from tqsdk import TqApi, TqKq, TqRiskRuleError
from tqsdk.risk_rule import TqRuleAccOpenVolumesLimit

account = TqKq()
api = TqApi(account=account, auth=TqAuth("快期账户", "账户密码"))

quote = api.get_quote("SSE.000300")
call_in, call_at, call_out = api.query_all_level_finance_options("SSE.000300", quote.last_price, "CALL", nearbys=0)
put_in, put_at, put_out = api.query_all_level_finance_options("SSE.000300", quote.last_price, "PUT", nearbys=0)
near_symbols = call_in + call_at + call_out + put_in + put_at + put_out  # 找到所有当月期权合约

symbols = api.query_options("SSE.000300", expired=False)  # 找到所有中金所期权合约

# 规则1: 中金所当月期权合约日内开仓不超过 100 手
# 规则2: 中金所所有期权合约日内合约开仓不超过 200 手
rule1 = TqRuleAccOpenVolumesLimit(api, open_volumes_limit=100, symbol=near_symbols, account=account)  # 创建风控规则实例
rule2 = TqRuleAccOpenVolumesLimit(api, open_volumes_limit=200, symbol=symbols, account=account)  # 创建风控规则实例
api.add_risk_rule(rule1)  # 添加风控规则
api.add_risk_rule(rule2)  # 添加风控规则

try:
    # 下单 101 手,触发风控规则
    order1 = api.insert_order(symbol="CFFEX.IO2111-C-4900", direction="BUY", offset="OPEN", volume=101, limit_price=35.6)
    while order1.status != "FINISHED":
        api.wait_update()
except TqRiskRuleError as e:
    print("!!!", e)  # 报错,当月期权合约日内合约开仓不超过 100 手, 已下单次数 0

api.close()
class tqsdk.risk_rule.TqRuleOrderRateLimit(api: TqApi, limit_per_second: int, exchange_id: str | List[str], account: UnionTradeable | None = None)

风控规则类 - 一个 API 实例每秒最大订单操作次数限制。

针对特定的交易所和交易账户,设置每秒订单操作次数阈值(包括报单和撤单)。 当操作次数达到阈值时触发风控。如果指定多个交易所,则每个交易所分别限制。

Args:

api (TqApi): TqApi 实例

limit_per_second (int): 每秒订单操作次数上限(当操作次数超过此值时触发风控)

exchange_id (str/list of str): 指定交易所代码
  • str: 指定交易所代码,如 "SHFE", "DCE", "CZCE", "CFFEX" 等

  • list of str: 交易所代码列表,如 ["DCE", "SHFE"],每个交易所分别限制

account (TqAccount/TqKq/TqZq/TqKqStock/TqSim/TqSimStock/TqCtp/TqRohon/TqJees/TqYida/TqTradingUnit): [可选] 指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

Example1:

from tqsdk import TqApi
from tqsdk.risk_rule import TqRuleOrderRateLimit

api = TqApi(auth=TqAuth("快期账户", "账户密码"))

# 设置大连商品交易所每秒订单操作次数上限为 5(第6次操作时触发风控)
rule = TqRuleOrderRateLimit(api, limit_per_second=5, exchange_id="DCE")
api.add_risk_rule(rule)

try:
    # 快速订单操作,第6次操作时触发风控
    for i in range(10):
        order = api.insert_order(symbol="DCE.m2512", direction="BUY", offset="OPEN", volume=1)
        api.wait_update()
except TqRiskRuleError as e:
    print('!!!', e)
api.close()

Example2:

from tqsdk import TqApi, TqKq
from tqsdk.risk_rule import TqRuleOrderRateLimit

account = TqKq()
api = TqApi(account=account, auth=TqAuth("快期账户", "账户密码"))

# 设置大连商品交易所每秒订单操作次数上限为 3(第4次操作时触发风控)
rule = TqRuleOrderRateLimit(api, limit_per_second=3, exchange_id="DCE", account=account)
api.add_risk_rule(rule)

try:
    for i in range(4):
        order = api.insert_order(symbol="DCE.m2512", direction="BUY", offset="OPEN", volume=1)
        api.wait_update()
except TqRiskRuleError as e:
    print("!!!", e)

api.close()

Example3:

from tqsdk import TqApi, TqKq
from tqsdk.risk_rule import TqRuleOrderRateLimit

account = TqKq()
api = TqApi(account=account, auth=TqAuth("快期账户", "账户密码"))

# 设置大连商品交易所和上海期货交易所,每个交易所每秒订单操作次数上限为 5(第6次操作时触发风控)
rule = TqRuleOrderRateLimit(api, limit_per_second=5, exchange_id=["DCE", "SHFE"], account=account)
api.add_risk_rule(rule)

try:
    for i in range(6):
        order = api.insert_order(symbol="DCE.m2512", direction="BUY", offset="OPEN", volume=1)
        api.wait_update()
        if order.status == "ALIVE":
            api.cancel_order(order)
        api.wait_update()
except TqRiskRuleError as e:
    print("!!!", e)

api.close()