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()