一、设计目的
在期货交易中,风险管理是交易策略的核心组成部分。无论是新手还是经验丰富的交易者,都必须充分重视风险控制,以避免在市场波动中遭遇不必要的损失。为了提升交易的智能化和自动化水平,今天为大家分享一款“自动带止损止盈风控模型”,旨在通过系统化的风控策略实现对交易订单的实时监控与管理,最大限度地保护收益并降低潜在的风险。
二、风控模型的基本原理
本风控模型的核心原理是通过设定“止盈”和“止损”点位,自动化地对期货市场的持仓单进行实时监控。具体来说,风控系统将根据每个合约的当前市场价格,计算出一个预设的止盈与止损点位,并根据这些点位实时调整持仓状态,从而实现自动平仓操作。
1. 止盈和止损的定义
- 止盈点位:当市场价格达到预设的止盈百分比时,系统自动执行平仓操作,确保投资者的利润最大化。
- 止损点位:当市场价格下跌至预设的止损百分比时,系统自动执行平仓操作,防止损失进一步扩大。
2. 风控模型的参数设置
- 止盈百分比(N%):设置期货合约的止盈阈值。若持仓的市场价格上涨超过该百分比,自动触发平仓。
- 止损百分比(M%):设置期货合约的止损阈值。若持仓的市场价格下跌超过该百分比,自动触发平仓。
3. 止盈止损点的计算
以某合约为例,假设某期货合约(如螺纹钢)在开盘时以4000元的价格买入1手多单:
- 止盈点:4000 × (1 + 5%) = 4200元
- 止损点:4000 × (1 – 2%) = 3920元
如果市场价格达到4200元,系统将自动执行平仓操作,锁定5%的收益;如果价格下跌到3920元,则会自动止损,限制损失为2%。
4. 全局风控与个性化设置
- 全局风控:系统可以为所有合约设置统一的止盈止损策略,确保无论用户操作哪个合约,风控措施都能实时生效。
- 单独合约风控:对于某些特定的合约,用户可以单独设置不同的止盈止损比例。例如,对于波动较大的品种,可以设置更高的止损比例,以减少被触发的风险。
5. 统一配置与持久有效性
一次性设置后,用户无需每天重新设置参数。无论在何时进行交易,无论是哪个交易终端(如文华财经、博易大师等),风控模型都会自动启用并长期有效,直到用户手动修改相关参数为止。
三、模型实现目标
1.实时风控,减少人工干预
传统的风控通常依赖人工监控,当市场价格波动时,交易者需要手动设置止盈止损点,这不仅增加了工作负担,也容易因为市场波动过快或人为操作失误而导致损失。自动带止损止盈风控模型能够实时监控每个交易单的盈亏情况,并根据设定的百分比自动触发平仓操作,从而有效减少了人工干预的需求。
2.确保风险控制的一致性与标准化
对于不同的品种和交易账户,传统的风控管理可能存在操作不一致的情况。该风控模型允许用户在一个统一平台上设置所有合约的止盈止损参数,确保无论交易哪个品种,风控策略都能够统一生效,避免因操作差异导致的风险暴露。
3.提高交易的执行效率
在快节奏的期货市场中,价格波动可能发生得非常迅速,人工操作常常无法及时响应。而自动风控模型可以根据预设的规则实时执行平仓,确保交易者能够在最佳时机实现止盈止损,有效规避市场波动的风险。
4.降低情绪化决策的影响
交易者在市场波动较大时,往往容易受情绪影响做出不理智的决策。而风控模型能够自动执行预设的交易策略,避免由于市场恐慌或过度乐观而导致的不理性操作。
四、模型的优势
1.风险最大化控制
通过预设止盈和止损比例,系统能够最大限度地限制单一合约的亏损范围,同时确保在市场达到预期的盈利点时及时平仓,实现收益的最大化。
2.灵活的个性化配置
用户可以根据不同的市场情况和个人风险承受能力灵活设置各合约的止盈止损比例。例如,对于波动性较大的期货品种,止损比例可以适当放宽;而对于风险较小的品种,则可以设定较小的止损比例,增加盈利的机会。
3.跨平台操作
该风控模型是基于期魔方的规则开发的,用户只需在期魔方设置了风控,无论从哪个第三方交易终端(如文华财经、博易大师等)下单,都能够同步应用期魔方中的风控规则。
五、源码实现
#——————————————#
#文件类型:量化策略
#帮助文档:https://qmfquant.com/static/doc/code/strategyEdit.html
#期魔方,为您提供专业的量化服务
#——————————————#
from pydantic import BaseModel, Field
class Params(BaseModel, validate_assignment=True):
“””参数映射模型”””
symbols_mode:dict = Field(default={“options”:[“全局”,”指定合约”],\
“value”:”全局”},title =”跟踪对象”)
symbols:str = Field(default=”ag2412,au2412″,title=”合约代码”)
tp_rate:float = Field(default=0.05,title=”止盈比例(%)”)
sl_rate:float = Field(default=0.02,title=”止损比例(%)”)
send_order_mode:dict = Field(default={“options”:[“市价”,”现价”,”对价”],\
“value”:”市价”},title =”报单方式”)
def on_init(context):
print(“demo start”)
def on_tick(context):
“””获取账户信息”””
auto_tpsl(context)
def isSHFEoINE(context,exchangeid):
return exchangeid in “SHFE INE”
def close_order(context,symbol,exchangid,direction,volume,comboffsetflag):
try:
tick = get_tick(symbol)
if not tick.get(“ActionDay”):
#tick获取失败 返回等待下一次运行
return
upper_price = float(tick.get(“UpperLimitPrice”))
lower_price = float(tick.get(“LowerLimitPrice”))
if context.send_order_mode.get(“value”) == “现价”:
upper_price = float(tick.get(“LastPrice”))
lower_price = float(tick.get(“LastPrice”))
if context.send_order_mode.get(“value”) == “对价”:
upper_price = float(tick.get(“BidPrice1”))
lower_price = float(tick.get(“AskPrice1”))
price =upper_price if direction==”0″ else lower_price
order = {
“symbol”:symbol,
“exchangeid”:exchangid,
“limitprice”:price,
“direction”:direction,
“orderpricetype”:”2″,
“comboffsetflag”:comboffsetflag,
“volumn”:volume
}
send_order(order)
except Exception as e:
print(f”开单出现错误=>请查看GridTrade.close_order[{e}]”)
return 0
return 1
def auto_tpsl(context):
position = get_position()
CLOSE_DIRECTION_MAP = {“2″:”1″,”3″:”0”}
for item in position:
InstrumentID = item.get(“InstrumentID”)
if context.symbols_mode.get(“value”) == “指定合约”:
if InstrumentID not in context.symbols:
continue
tick = get_tick(InstrumentID)
if not tick.get(“ActionDay”):
#tick获取失败 返回等待下一次运行
return
info = item.get(“symbolinfo”)
VolumeMultiple = info.get(“VolumeMultiple”)
last_price = float(tick.get(“LastPrice”))
LongFrozen = item.get(“LongFrozen”)
ShortFrozen = item.get(“ShortFrozen”)
Position = item.get(“Position”)
open_cost = item.get(“OpenCost”)
position_cost = Position * last_price * VolumeMultiple
profit = position_cost – open_cost
if profit > 0:
if profit/open_cost < context.tp_rate:
continue
else:
if abs(profit/open_cost) < context.sl_rate:
continue
PosiDirection = item.get(“PosiDirection”)
direction = CLOSE_DIRECTION_MAP[PosiDirection]
YdStrikeFrozen = item.get(“YdStrikeFrozen”)
Frozen = LongFrozen if direction == “0” else ShortFrozen
todayFrozen = Frozen – YdStrikeFrozen
today_volume = item.get(“TodayPosition”) – todayFrozen
yestoday_volume = item.get(“YdPosition”) – YdStrikeFrozen
exchangeid = item.get(“ExchangeID”)
today_position = 0
if isSHFEoINE(context,exchangeid):
today_position = today_volume
yestoday_position = yestoday_volume
else:
yestoday_position = today_volume + yestoday_volume
“””暂定一组订单同时报两次”””
“””不做回复确认 => 重获取持仓时再做重新分配 直到分配结束”””
if today_position > 0:
close_order(context,InstrumentID,exchangeid,direction,today_position,”3″)
if yestoday_position > 0:
close_order(context,InstrumentID,exchangeid,direction,yestoday_position,”1″)
def onStop(context):
print(“demo停止”)
2 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系客服进行删除处理
3 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责
4 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向客服举报
暂无评论内容