趋势追踪网格策略


创建日期: 2023-12-08 12:05:17 最后修改: 2023-12-08 12:05:17
复制: 0 点击次数: 748
1
关注
1105
关注者

趋势追踪网格策略

概述

该策略是一种只做多不做空,选择大趋势向上时段的趋势追踪网格策略。默认网格大小为1倍ATR,向下追踪建立1、2、3级网格进行追单,第5格止损。当空仓时如果价格突破上一网格,则整个网格向上移动追踪价格。

策略原理

  1. 使用EMA均线判断大趋势方向,EMA12大于EMA144则判断为大趋势向上
  2. 只在大趋势向上时开仓做多
  3. 网格大小默认为1倍ATR,可调整倍数
  4. 向下追踪价格建立1、2、3级网格,分别开仓做多
  5. 第5格设置止损点
  6. 开仓后设置止损点和止盈点
  7. 当价格上涨突破止盈点平仓
  8. 当价格下跌触发止损点平仓
  9. 当仓位全部平仓后,如果价格重新突破最后一个网格,则重新计算网格位置和数量,向上追踪

该策略通过EMA判断大趋势方向,再结合网格策略进行追踪,能够在大趋势向上行情中获得更大收益。网格设置多个价格点,分批建仓,能够降低单仓风险。止盈止损设置让利益能够得到锁定,也控制了最大亏损。当仓位全部平仓后,能够重新计算网格高点,实现再次开仓,从而将利润最大化。

优势分析

  1. 利用EMA判断大趋势方向,避免逆势开仓
  2. 网格策略能够分批建仓,降低单仓风险
  3. 止盈止损设置锁定利润,控制最大亏损
  4. 仓位平仓后可以重新计算网格继续追涨,扩大获利空间

该策略主要优势在于把趋势交易和网格交易结合,既确保了趋势方向的正确性,也实现了网格策略的风险分散。此外,仓位平仓后重新计算网格可以无限追涨,从而在行情出现一波大涨时获得巨大利润。

风险分析

  1. 大趋势判断可能出错,进错方向
  2. 行情出现大幅震荡,网格亏损过重
  3. 亏损达到止损点过快,仓位全部平仓
  4. 反弹后无法重新进入最佳入场点

主要的风险在于大趋势判断错误,这样会导致逆势建仓而大幅亏损。此外,如果行情出现剧烈震荡,多个网格同时被套牢的情况下亏损会加重。另外价格快速下跌触发止损也会导致仓位全部平仓,失去后续获利机会。价格反弹后很难再恰好进入初始最佳网格位置。

可以通过优化EMA参数提高大趋势判断准确性。调整网格间距和首单数量也可以控制总体亏损。止损点位置的设置需要考虑到行情波动频率。此外,也可以考虑部分仓位获利后就止盈了,而不是全部平仓。

优化方向

该策略还可以从以下几个方向进行优化:

  1. 优化EMA参数,提高大趋势判断的准确性
  2. 调整网格间距和数量,优化获利风险比
  3. 改进止盈止损逻辑,如部分仓位止盈、移动止损 等
  4. 增加重新入场条件限制,避免反弹过程中过早重新入场
  5. 结合更多指标判断入场时机,如K线形态、指标灵敏度等
  6. 增加行情异常判断,避免异常行情中巨亏

通过这些优化措施,可以使策略在大行情中获得更大收益,同时可以控制风险,减少平常震荡走势中的损失。

总结

该策略是趋势交易和网格交易的有机结合。它利用EMA判断大方向,再用网格策略分批建仓追涨。风险控制到位,有止盈止损和重新计算网格的追踪机制。总体来说,该策略能够在行情大趋势中获得不错的盈利,同时也控制了风险。如果进一步优化参数,提高判断准确性,收益可以更高。值得在实盘中进行详细测试和优化后投入使用。

策略源码
                
                    /*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zxcvbnm3260

//@version=5
strategy("grid strategy long", overlay=true)


// 版本更新记录:
// v1.0 2021/11/09 只做多、不做空,选择大趋势向上的时间段。网格大小默认为1倍ATR,往下1、2、3个网格吃单,第5个网格止损。空仓时到达往上一个网格则网格整体抬升。(Only go long, not short, choose a time period when the general trend is up. The default grid size is 1x ATR, the next one, two, and three grids will take orders, and the fifth grid will stop loss. When the empty position reaches the upper grid, the grid as a whole rises.)


X_ATR = input.float(title='网格大小是多少倍ATR?', defval = 1)


// 1.基础变量
ema169 = ta.ema(close, 169)
ema144 = ta.ema(close, 144)
ema12 = ta.ema(close, 12)

ema576 = ta.ema(close, 576)
ema676 = ta.ema(close, 676)

plot(ema169, color=color.new(color.orange, 0), linewidth=2)
// plot(ema144, color=color.orange)
plot(ema12,  color=color.blue)
// plot(ema676, color=color.orange, linewidth=1)

mtr = math.max(high - low, math.abs(close[1] - high), math.abs(close[1] - low))
atr = ta.ema(mtr, 30)

is_0930 = hour(time, 'GMT-4') == 9  and minute(time, 'GMT-4') == 30
is_1500 = hour(time, 'GMT-4') == 15 and minute(time, 'GMT-4') == 00
is_1530 = hour(time, 'GMT-4') == 15 and minute(time, 'GMT-4') == 30

is_yangxian = close>open
is_yinxian = close<open

// 2.基本趋势标记

big_trend  = ema12 >= ema169 ? 1 : 0
big_trend2 = ema12 <= ema169 ? 1 : 0

// 背景的变色处理:
bgcolor(big_trend == 1 ? color.new(color.green, 90) : color.new(color.red, 90) )

// 3.网格点位初始化

grid_size = atr * X_ATR // 网格大小
        
price_entry1 = open - grid_size*1
price_entry2 = open - grid_size*2
price_entry3 = open - grid_size*3
price_stop_loss = open - grid_size*5

price_exit1 = price_entry1 + grid_size*1
price_exit2 = price_entry2 + grid_size*1
price_exit3 = price_entry3 + grid_size*1

qty1 = int(1000/price_entry1)
qty2 = int(1000/price_entry2)
qty3 = int(1000/price_entry3)


// 标出各种点位
slm_lines_time(time, price_entry1, price_entry2, price_entry3, price_stop_loss, price_exit1)=>
    time2 = time + 1000*3600*24*5
    line.new(time, price_stop_loss, time2, price_stop_loss, color=color.red, xloc = xloc.bar_time, width=2)  // 止损位
    line.new(time, price_entry1, time2, price_entry1, color=color.green, xloc = xloc.bar_time)  // 
    line.new(time, price_entry2, time2, price_entry2, color=color.green, xloc = xloc.bar_time)  // 
    line.new(time, price_entry3, time2, price_entry3, color=color.green, xloc = xloc.bar_time)  // 
    line.new(time, price_exit1,  time2, price_exit1,  color=color.green, xloc = xloc.bar_time, width=2)  // 

slm_lines(time, price_entry1, price_entry2, price_entry3, price_stop_loss, price_exit1)=>
    line.new(bar_index, price_stop_loss, bar_index[5], price_stop_loss, color=color.red, xloc = xloc.bar_index, width=2)  // 止损位
    line.new(bar_index, price_entry1, bar_index[5], price_entry1, color=color.green, xloc = xloc.bar_index)  // 
    line.new(bar_index, price_entry2, bar_index[5], price_entry2, color=color.green, xloc = xloc.bar_index)  // 
    line.new(bar_index, price_entry3, bar_index[5], price_entry3, color=color.green, xloc = xloc.bar_index)  // 
    line.new(bar_index, price_exit1,  bar_index[5], price_exit1,  color=color.green, xloc = xloc.bar_index, width=2)  // 


// 4.网格点位更新和下单

is_entry0 = big_trend==1 and year>=2020

var is_entry = false

// 未进场时:
if is_entry0 and not is_entry
    is_entry := true
    
    grid_size := atr * X_ATR // 网格大小
    
    price_entry1 := close - grid_size*1
    price_entry2 := close - grid_size*2
    price_entry3 := close - grid_size*3
    price_stop_loss := close - grid_size*5
    
    price_exit1 := price_entry1 + grid_size*1
    price_exit2 := price_entry2 + grid_size*1
    price_exit3 := price_entry3 + grid_size*1
    
    qty1 := int(1000/price_entry1)
    qty2 := int(1000/price_entry2)
    qty3 := int(1000/price_entry3)
    
    // slm_lines(time, price_entry1, price_entry2, price_entry3, price_stop_loss, price_exit1)
    
    strategy.entry("open1", strategy.long, qty1, limit = price_entry1)
    strategy.entry("open2", strategy.long, qty2, limit = price_entry2)
    strategy.entry("open3", strategy.long, qty3, limit = price_entry3)
    
    strategy.exit("close1", qty = qty1, limit = price_exit1, stop = price_stop_loss)
    strategy.exit("close2", qty = qty2, limit = price_exit2, stop = price_stop_loss)
    strategy.exit("close3", qty = qty3, limit = price_exit3, stop = price_stop_loss)

// 已进场的各类情况

// 1.止损
if is_entry and close <= price_stop_loss
    strategy.close_all()
    is_entry := false

// 2.网格抬升
if is_entry and close >= price_exit1
    is_entry := false
        



                
            
更多内容