基于随机入场的复合止损止盈策略

Author: ChaoZhang, Date: 2024-01-24 15:38:49
Tags:

基于随机入场的复合止损止盈策略

概述

本策略的主要思想是通过随机数来决定入场点,设置了三个止盈点和一个止损点来管理风险,以控制每次交易的盈亏。

策略原理

该策略使用随机数rd_number_entry在11到13之间来决定做多入场点,使用rd_number_exit在20到22之间来决定平仓。做多后设置stop loss为入场价减去atr(14)* slx。同时设置了三个止盈点,第一个止盈点为入场价加上atr(14)* tpx,第二个止盈点为入场价加上2* tpx,第三个止盈点为入场价加上3* tpx。做空的原理类似,区别在于入场决定在rd_number_entry取值不同,止盈止损方向相反。

该策略可以通过调整tpx(止盈系数)和slx(止损系数)来控制风险。

优势分析

该策略具有以下优势:

  1. 使用随机入场可以减少曲拟合的概率
  2. 设置多个止盈止损点,可以控制单笔交易的风险
  3. 利用atr来设置止盈止损,可以基于市场波动来设置盈亏点
  4. 可以通过调整系数来控制交易风险

风险分析

该策略也存在以下风险:

  1. 随机入场可能错过行情
  2. 止损点过小容易被止损
  3. 止盈空间过大,可能获利不足
  4. 参数不当可能导致亏损加大

可以通过调整止盈止损系数,优化随机入场逻辑来降低风险。

优化方向

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

  1. 改进随机入场逻辑,结合趋势指标判断
  2. 优化止盈止损系数,使盈亏比更合理
  3. 增加仓位控制,不同阶段采用不同的止盈空间
  4. 结合机器学习算法优化参数

总结

本策略以随机入场为基础,设置多个止盈止损点控制单笔交易风险,由于随机性强可以减少曲拟合概率,通过参数优化可以降低交易风险。后续优化空间还很大,值得进一步研究。


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Random Strategy with 3 TP levels and SL", overlay=true,max_bars_back = 50)

tpx = input(defval = 0.8, title = 'Atr multiplication for TPs?')
slx = input(defval = 1.2, title = 'Atr multiplication for SL?')
isLong = false
isLong := nz(isLong[1])

isShort = false
isShort := nz(isShort[1])

entryPrice = 0.0
entryPrice := nz(entryPrice[1])
tp1 = true
tp1 := nz(tp1[1])
tp2 = true
tp2 := nz(tp2[1])

sl_price = 3213.0
sl_price := nz(sl_price[1])

sl_atr = atr(14)*slx
tp_atr = atr(14)*tpx

rd_number_entry = 1.0
rd_number_entry := (16708 * nz(rd_number_entry[1], 1) % 2147483647)%17

rd_number_exit = 1.0
rd_number_exit := ((16708 * time % 2147483647) %17)


//plot(rd_number_entry)

shortCondition = (rd_number_entry == 13? true:false) and (year >= 2017) and not isLong and not isShort
longCondition = (rd_number_entry == 11 ? true:false) and (year >= 2017) and not isShort and not isShort
//Never exits a trade:
exitLong = (rd_number_exit == 22?true:false) and (year >= 2018) and not isShort
exitShort = (rd_number_exit ==  22?true:false) and (year >= 2018) and not isLong


//shortCondition = crossunder(sma(close, 14), sma(close, 28)) and year >= 2017
//longCondition = crossover(sma(close, 14), sma(close, 28)) and year >= 2017

//exitLong = crossunder(ema(close, 14), ema(close, 28)) and year >= 2017
//exitShort = crossover(ema(close, 14), ema(close, 28)) and year >= 2017

if (longCondition and not isLong)
    strategy.entry('Long1', strategy.long)
    strategy.entry('Long2', strategy.long)
    strategy.entry('Long3', strategy.long)
    isLong := true
    entryPrice := close
    isShort := false
    tp1 := false
    tp2 := false
    sl_price := close-sl_atr

if (shortCondition and not isShort)
    strategy.entry('Short1', strategy.short)
    strategy.entry('Short2', strategy.short)
    strategy.entry('Short3', strategy.short)
    isShort := true
    entryPrice := close
    isLong := false
    tp1 := false
    tp2 := false
    sl_price := close+sl_atr
    
if (exitShort and isShort)
    strategy.close('Short1')
    strategy.close('Short2')
    strategy.close('Short3')
    isShort :=  false

if (exitLong and isLong)
    strategy.close('Long1')
    strategy.close('Long2')
    strategy.close('Long3')
    isLong :=  false

if isLong
    if (close > entryPrice + tp_atr) and not tp1
        strategy.close('Long1')
        tp1 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 2*tp_atr) and not tp2
        strategy.close('Long2')
        tp2 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 3*tp_atr)
        strategy.close('Long3')
        isLong := false
    if (close < sl_price)
        strategy.close('Long1')
        strategy.close('Long2')
        strategy.close('Long3')
        isLong := false

if isShort
    if (close < entryPrice - tp_atr) and not tp1
        strategy.close('Short1')
        sl_price := close + tp_atr
        tp1 := true
    if (close < entryPrice - 2*tp_atr) and not tp2
        strategy.close('Short2')
        sl_price := close + tp_atr
        tp2 := true
    if (close < entryPrice - 3*tp_atr)
        strategy.close('Short3')
        isShort := false
    if (close > sl_price)
        strategy.close('Short1')
        strategy.close('Short2')
        strategy.close('Short3')
        isShort := false
plot(atr(14)*slx)
plot(sl_price)

更多内容