Стратегия прорыва импульса

Автор:Чао Чжан, Дата: 2023-12-13 17:08:53
Тэги:

img

Обзор

Эта стратегия сочетает в себе скользящую среднюю, индикатор Laguerre RSI и индикатор ADX для осуществления торговли прорывом. Она длинна, когда быстрая скользящая средняя пересекает более медленной скользящей средней, Laguerre RSI больше 80, а ADX больше 20; она коротка, когда быстрая скользящая средняя пересекает ниже медленной скользящей средней, Laguerre RSI меньше 20, а ADX больше 20. Эта стратегия улавливает характеристики импульса рынка и входит на рынок в начале развития тренда.

Принцип

Стратегия в основном использует следующие показатели для определения тенденций и сроков вступления:

  1. Комбинация скользящих средних: 16-дневная EMA, 48-дневная EMA, 200-дневная SMA.

  2. Индикатор Laguerre RSI для определения перекупленных и перепроданных зон. RSI выше 80 - это длинный сигнал, и меньше 20 - короткий сигнал.

  3. Индикатор ADX для определения состояния тренда. ADX больше 20 указывает на тенденцию, подходящую для торговли прорывом.

Сигналы входа определяются направлением движущейся средней комбинации, сроки входа Laguerre RSI, а рынки без тренда отфильтровываются ADX. Сигналы выхода генерируются, когда движущиеся средние пересекаются обратно. Общая структура суждения о стратегии довольно разумна, при этом различные индикаторы работают вместе для определения длинных/коротких входов и выходов.

Сильные стороны

Преимущества этой стратегии включают:

  1. Поймать импульс тренда: стратегия входит на рынок только в начале развития тренда, захватывая экспоненциальную прибыль от трендов.

  2. Ограниченные убытки: Стоп-убытки, установленные надлежащим образом, ограничивают убытки от отдельных сделок.

  3. Точные комбинированные индикаторы: скользящие средние, Laguerre RSI и ADX могут относительно точно определить направление рынка и сроки входа.

  4. Простая реализация: стратегия использует только 3 показателя и легко понимается и реализуется.

Риски

Есть также некоторые риски для стратегии:

  1. Риски отмены тренда: в качестве стратегии, следующей за трендом, могут возникнуть большие убытки, если отмены тренда не будут обнаружены вовремя.

  2. Риски заимствования: на рыночных рынках могут возникать остановки, которые приводят к заимствованию средств счета.

  3. Риски оптимизации параметров: параметры показателей должны быть скорректированы для различных рынков, чтобы избежать сбоев.

Контрмеры:

  1. Строгие стоп-потери для ограничения сумм потерь от одной сделки.

  2. Оптимизировать параметры показателей и пороги прорыва.

  3. Использование фьючерсных хеджировок и т.д. для управления вычетами.

Руководство по оптимизации

Некоторые способы оптимизации стратегии включают:

  1. Оптимизация параметров: тестирование комбинаций скользящих средних периодов, параметров Laguerre RSI, параметров ADX для поиска оптимальных настроек.

  2. Оптимизация прорыва: тестирование различных порогов прорыва скользящей средней, чтобы сбалансировать частоту торговли и прибыльность.

  3. Оптимизация входа: тестирование других индикаторов в сочетании с Laguerre RSI для более точного времени входа.

  4. Оптимизация выхода: исследование других сигналов выхода в сочетании с скользящими средними.

  5. Приобретение прибыли против оптимизации стоп-лосса: тестирование различных стратегий для оптимизации доходности.

Резюме

В целом, эта стратегия эффективно улавливает движения тренда, используя комбинацию скользящих средних, Laguerre RSI и ADX для определения входов и выходов. Вступая рано в развитие тренда и внимательно следя за трендом, можно получать экспоненциальную прибыль, в то время как стоп-потери помогают ограничить убытки. Стратегия подходит для инвесторов, удобных для вынесения рыночных суждений, а также для тех, кто занимается автоматической торговлей после оптимизации параметров. В целом стратегия имеет сильную практическую полезность.


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-12 00:00:00
period: 1m
basePeriod: 1m
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/
// © PtGambler

//@version=5
strategy("3MA + Laguerre RSI + ADX [Pt]", shorttitle = "3MA+LaRSI+ADX[Pt]", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)


// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
use_entry_sess = input.bool(false, 'Use Entry Session Window', group = "Trading Session")
t1_session = input("0930-1555:23456", "Entry Session", group="Trading Session", tooltip = "Entry Signal only generated within this period.") 
t1 = time(timeframe.period, t1_session)
window = true

margin_req = input.float(1, title="Margin Requirement / Leverage", step=0.1, group = "Trading Options")
qty_per_trade = input.float(100, title = "% of initial capital per trade", group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=100, title = "Reinvest percentage", group="Trading Options")

close_eod = input.bool(false, "All trades will close at the close of trading window", group = "Trading Options")
close_b4_open = input.bool(false, "Position must hit either SL/PT before entering new trade", group = "Trading Options")

profit = strategy.netprofit 
strategy.initial_capital = 50000
float trade_amount = math.floor(strategy.initial_capital*margin_req / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital* (qty_per_trade/100)+(profit*reinvest_percent*0.01))*margin_req/ close) 
else
    trade_amount := math.floor(strategy.initial_capital* (qty_per_trade/100)*margin_req / close)  

// ******************************************************************************************

group_ma = "Moving Average Ribbon"
group_larsi = "Laguerre RSI"
group_adx = "ADX"
group_SL = "Stop Loss / Profit Target"

// ----------------------------------------- MA Ribbon -------------------------------------

ema1_len = input.int(16, "Fast EMA Length", group = group_ma)
ema2_len = input.int(48, "Slow EMA Length ", group = group_ma)
sma1_len = input.int(200, "Slow SMA Length", group = group_ma)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)
sma1 = ta.sma(close, sma1_len)

plot(ema1, "EMA 1", color.white, linewidth = 2)
plot(ema2, "EMA 2", color.yellow, linewidth = 2)
plot(sma1, "SMA 1", color.purple, linewidth = 2)

ma_bull = ema1 > ema2 and ema2 > sma1   
ma_bear = ema1 < ema2 and ema2 < sma1

// ------------------------------------------ Laguerre RSI ---------------------------------------

alpha = input.float(0.2, title='Alpha', minval=0, maxval=1, step=0.1, group = group_larsi)

gamma = 1 - alpha
L0 = 0.0
L0 := (1 - gamma) * close + gamma * nz(L0[1])
L1 = 0.0
L1 := -gamma * L0 + nz(L0[1]) + gamma * nz(L1[1])

L2 = 0.0
L2 := -gamma * L1 + nz(L1[1]) + gamma * nz(L2[1])

L3 = 0.0
L3 := -gamma * L2 + nz(L2[1]) + gamma * nz(L3[1])

cu = (L0 > L1 ? L0 - L1 : 0) + (L1 > L2 ? L1 - L2 : 0) + (L2 > L3 ? L2 - L3 : 0)

cd = (L0 < L1 ? L1 - L0 : 0) + (L1 < L2 ? L2 - L1 : 0) + (L2 < L3 ? L3 - L2 : 0)

temp = cu + cd == 0 ? -1 : cu + cd
LaRSI = temp == -1 ? 0 : cu / temp
LaRSI := LaRSI * 100

bull_LaRSI = LaRSI > 80
bear_LaRSI = LaRSI < 20

// --------------------------------------- ADX  ------------------------

adxlen = input(14, title="ADX Smoothing", group = group_adx)
dilen = input(14, title="DI Length", group = group_adx)
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)

active_adx = sig > 20 //and sig > sig[1]

// ******************************* Profit Target / Stop Loss *********************************************

use_SLPT = input.bool(false, 'Use Fixed SL / PT', group = group_SL)
SL = input.float(50, 'Stop loss in ticks', step = 1, group = group_SL) * syminfo.mintick
PT = input.float(100, "Profit target in ticks", step = 1, group = group_SL) * syminfo.mintick

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

if strategy.position_size > 0
    L_SL := L_SL[1]
    L_PT := L_PT[1]
else if strategy.position_size < 0
    S_SL := S_SL[1]
    S_PT := S_PT[1]
else
    L_SL := close - SL
    L_PT := close + PT
    S_SL := close + SL
    S_PT := close - PT

entry_line = plot(use_SLPT and strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(use_SLPT and strategy.position_size > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(use_SLPT and strategy.position_size < 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(use_SLPT and strategy.position_size > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(use_SLPT and strategy.position_size < 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- Strategy setup ------------------------------------------------------

L_entry1 = ma_bull and bull_LaRSI and active_adx
S_entry1 = ma_bear and bear_LaRSI and active_adx

L_exit1 = ta.crossunder(ema1, ema2)
S_exit1 = ta.crossover(ema1, ema2)

// Trigger zones
bgcolor(ma_bull ? color.new(color.green ,90) : na)
bgcolor(ma_bear ? color.new(color.red,90) : na)

if L_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Short", strategy.short, trade_amount)

if use_SLPT
    strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
    strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")
else
    if L_exit1
        strategy.close("Long", comment = "Exit Long")

    if S_exit1
        strategy.close("Short", comment = "Exit Short")

if use_entry_sess and not window and close_eod
    strategy.close_all(comment = "EOD close")


Больше