【量化交易】技巧2:用简单逻辑完成“追踪止损”功能,实现 ...

论坛 期权论坛 期权     
期权匿名问答   2022-5-22 14:03   9081   3
什么是追踪止损
追踪止损是金融投资的一种操作手法。其含义是:在现货黄金、外汇保证金、期货等高杠杆、T+0交易中通过手动或交易机器人追踪当前价格走势,自动修改成交单的止损条件,达到不断锁定利润规避风险的目的。
追踪止损的主要目的其实是:锁定利润规避风险
提出背景
做现货黄金交易的投资人可能都有这样的经历。在开仓时设置了一个止损和止盈位置。金价的实际运行开始也是按照开仓方向运行的。但是最终交易结束之后发现,价格没有移动到止盈的位置就掉头反转打到了止损的位置,最后以失败收场。
加百力通过研究认为出现这种情况是因为:
第一,止损价位一直是"亏损止损",最终走到这个位置必然亏损。第二,没有人能够准确预测到价格会运行到什么位置开始掉头运动。
所以加百力提出了追踪止损的交易方法,通过手动或交易机器人自动根据当前价位修改订单的止损条件。价格向盈利方向运动的越多,止损价格也跟着运动。这样当价格掉头向下的时候,可以及时止损锁定收益。
如何实现追踪止损
假设我们现在遇到下列问题,应当如何实现代码的编写:
1、开仓做多产生大段盈利,但是由于拉升速度过快,导致指标线还在价格下方很远的价位,当价格开始回落却没有碰到指标线,因此程序未触发平仓信号,导致利润开始大幅回吐,甚至变成亏损。
2、现设置追踪止损功能,要求当价格从最高价开始回落,且回落幅度大于40%时(最少保住60%的利润),触发自动平仓。
3、要求在没有产生大段利润前(初始盈利跳数),不得触发该功能(有时候价格是震荡向上的,如果过早触发会导致错失大段利润,得不偿失)。



策略运行逻辑



参数设置



示例代码

一些常用到的业务对象:
quote.last_price     #最新价
position.pos_long    #多头持仓手数, ==0表示无多头持仓. >0表示多头持仓手数
position.pos_short   #空头持仓手数, ==0表示无空头持仓. >0表示空头持仓手数
position.open_price_long    #多头开仓均价,以开仓价来统计
position.open_price_short   #空头开仓均价,以开仓价来统计
TargetPosTask    #目标持仓工具示例代码:
#以多头为例,提供默认止损和追踪止损两种方式
from tqsdk import TqApi, TqAccount, TqAuth, TargetPosTask

pricelist=[]       #创建一个空的价格列表
take_profit =10    #初始盈利跳数
stop_loss = 15     #默认止损跳数
target_pos_value = position.pos_long - position.pos_short    #净目标持仓数,结合TargetPosTask使用


# 开仓价与当前行情价之差大于止损点则止损    #默认止损
if (target_pos_value > 0 and position.open_price_long - quote.last_price >= stop_loss) or \
        (target_pos_value < 0 and quote.last_price - position.open_price_short >= stop_loss):
    target_pos_value = 0  # 平仓   多头-空头=0,达到平仓
    print("合约:***|止损平仓|开仓价与当前行情价之差大于默认止损跳数: 止损平仓\n最新价:{}".format(quote.last_price))
    #如果你使用了指标线,应该修改各指标线的值, 让指标值=float("nan"),避免平仓后再次触发  
    pricelist.clear()    #清空价格列表


# 当盈利点数大于初始止盈点数,开始追踪    #追踪止损
if target_pos_value > 0: # 多头持仓

    # if 现价 - 多头开仓均价 > 初始盈利点数:
    if quote.last_price - position.open_price_long > take_profit :

    #在列表末尾添加最新价格
    pricelist.append(quote.last_price)

    #开始追踪,开始修改损盈价.多头止盈点=round(((开仓后最高价-多头开仓价)*0.6)+多头开仓价)
    Loss_priceD = round(((max(set(pricelist)) - position.open_price_long)*0.6)+ position.open_price_long)
    print("多头回落止盈平仓价: %f" % Loss_priceD)
  
        if quote.last_price <= Loss_priceD : #价格跌到多头跟踪平仓价
            target_pos_value = 0             # 平仓 多头-空头=0,达到平仓
            pricelist.clear()                #清空价格列表,等待重新开仓
            print("多单持仓中,价格回落触发追踪止盈:平多")以上代码仅供参考,实盘使用应修改参数
默认止损代码可以不用特意修改,里面用到“or”,无论多空都可以在亏损时触发平仓

注意:这个是多头的追踪止损,如果想增加空头的追踪止损,应当使用elif target_pos_value < 0:  续写后面的代码,逻辑与示例代码类似。
代码中出现的业务对象可以在这里查询:tqsdk.objs - 业务对象
分享到 :
0 人收藏

3 个回复

倒序浏览
2#
期权匿名回答  16级独孤 | 2022-5-22 14:04:14 发帖IP地址来自 北京
学习了,多谢。
3#
期权匿名回答  16级独孤 | 2022-5-22 14:05:11 发帖IP地址来自 CNNIC
这个方法好,达到一定利润才开始追踪止损
4#
期权匿名回答  16级独孤 | 2022-5-22 14:05:53 发帖IP地址来自 北京
涨资识了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP