Стратегия торговли на основе тройной экспоненциальной скользящей средней и стохастической экспоненциальной скользящей средней


Дата создания: 2024-01-30 16:52:48 Последнее изменение: 2024-01-30 16:52:48
Копировать: 3 Количество просмотров: 777
1
Подписаться
1617
Подписчики

Стратегия торговли на основе тройной экспоненциальной скользящей средней и стохастической экспоненциальной скользящей средней

Обзор

Эта стратегия представляет собой стратегию отслеживания тенденций, которая сочетает в себе индикаторы тройных скользящих средних индексов и случайных скользящих средних индексов для получения торговых сигналов. Когда скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользящие средние скользя

Принципы

  1. При использовании трёхкратного скользящего среднего числа на 8, 14 и 50 дней. При прохождении 14-дневного скользящего среднего числа через 8-дневную скользящую среднюю на 14-дневную скользящую среднюю на 50-дневную скользящую среднюю на 14-дневную скользящую среднюю образуется сигнал просмотра; наоборот, сигнал просмотра.

  2. Используйте скользящий скользящий средний индикатор {Stochastic RSI} в качестве вспомогательного индикатора. В частности, сначала вычислите 14-дневный RSI, затем вычислите стохастический индикатор на основе RSI, и, наконец, вычислите 3-дневную простой скользящую среднюю для вычисления K-линии и 3-дневную простой скользящую среднюю для D-линии.

  3. При появлении торгового сигнала, если цена выше 8-дневного индекса, то вход сделан вверх; если цена ниже 8-дневного индекса, то вход сделан вниз.

  4. Стоп-страх находится ниже / выше 1x АТР. Стоп-страх находится выше / ниже 4x АТР.

Преимущества

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

  2. Добавление Stochastic RSI в качестве вспомогательного индикатора суждения, который может отфильтровывать ложные сигналы и повышать точность входа.

  3. В зависимости от ATR можно установить позицию стоп-стоп, чтобы динамически отслеживать уровень колебаний рынка и избегать слишком больших или слишком маленьких стоп-стоп-стоп.

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

Риск

  1. Многоиндикаторная комбинационная стратегия увеличивает риск обратного хода. Когда движущиеся средние и стохастические RSI посылают противоположные сигналы, может возникнуть ошибка торгового сигнала. В этом случае следует обратить внимание на тенденцию цены.

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

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

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

Оптимизация

  1. Можно рассмотреть возможность добавления других показателей, таких как MACD, для дальнейшей оптимизации времени входа. Также можно проверить комбинацию подвижных средних различных параметров.

  2. Можно оптимизировать параметры ATR, например, с 1 ATR до 1.5 ATR, с 4 ATR до 3 ATR, чтобы получить лучшую прибыль.

  3. Можно проверить только с помощью движущихся средних, исключив стохастический RSI, чтобы увидеть, можно ли отфильтровать больше шума и получить более стабильную прибыль.

  4. Можно рассмотреть возможность добавления дополнительных условий для определения тенденции, например, увеличение показателя объема сделок, чтобы гарантировать, что они работают в тенденциях большого масштаба.

Подвести итог

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

Исходный код стратегии
/*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"}]
*/

//              3ESRA
//              v0.2a

// Coded by Vaida Bogdan

// 3ESRA consists of a 3 EMA cross + a close above (for longs) the quickest EMA
// or below (for shorts). Note that I've deactivated the RSI Cross Over/Under
// (you can modify the code and activate it). The strategy also uses a stop loss
// that's at 1 ATR distance from the entry price and a take profit that's at
// 4 times the ATR distance from the entry price.

// Feedback:
// Tested BTCUSDT Daily
// 1. Stoch-RSI makes you miss opportunities.
// 2. Changing RR to 4:1 times ATR works better.

//@version=4
strategy(title="3 EMA + Stochastic RSI + ATR", shorttitle="3ESRA", overlay=true, pyramiding=1,
     process_orders_on_close=true, calc_on_every_tick=true,
     initial_capital=1000, currency = currency.USD, default_qty_value=10, 
     default_qty_type=strategy.percent_of_equity,
     commission_type=strategy.commission.percent, commission_value=0.1, slippage=2)

startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group="Backtesting range")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group="Backtesting range")
startYear = input(title="Start Year", type=input.integer,
     defval=1900, minval=1800, maxval=2100, group="Backtesting range")
endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31, group="Backtesting range")
endMonth = input(title="End Month", type=input.integer,
     defval=1, minval=1, maxval=12, group="Backtesting range")
endYear = input(title="End Year", type=input.integer,
     defval=2040, minval=1800, maxval=2100, group="Backtesting range")

// Date range filtering
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and
     (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 23, 59))
     
fast = input(8, minval=8, title="Fast EMA", group="EMAs")
medium = input(14, minval=8, title="Medium EMA", group="EMAs")
slow = input(50, minval=8, title="Slow EMA", group="EMAs")
src = input(close, title="Source")

smoothK = input(3, "K", minval=1, group="Stoch-RSI", inline="K&D")
smoothD = input(3, "D", minval=1, group="Stoch-RSI", inline="K&D")
lengthRSI = input(14, "RSI Length", minval=1, group="Stoch-RSI", inline="length")
lengthStoch = input(14, "Stochastic Length", minval=1, group="Stoch-RSI", inline="length")
rsiSrc = input(close, title="RSI Source", group="Stoch-RSI")

length = input(title="Length", defval=14, minval=1, group="ATR")
smoothing = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"], group="ATR")

// EMAs
fastema = ema(src, fast)
mediumema = ema(src, medium)
slowema = ema(src, slow)

// S-RSI
rsi1 = rsi(rsiSrc, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
sRsiCrossOver = k[1] < d[1] and k > d
sRsiCrossUnder = k[1] > d[1] and k < d

// ATR
ma_function(source, length) =>
	if smoothing == "RMA"
		rma(source, length)
	else
		if smoothing == "SMA"
			sma(source, length)
		else
			if smoothing == "EMA"
				ema(source, length)
			else
				wma(source, length)
atr = ma_function(tr(true), length)

// Trading Logic
longCond1 = (fastema > mediumema) and (mediumema > slowema)
longCond2 = true
// longCond2 = sRsiCrossOver
longCond3 = close > fastema
longCond4 = strategy.position_size <= 0
longCond = longCond1 and longCond2 and longCond3 and longCond4 and inDateRange

shortCond1 = (fastema < mediumema) and (mediumema < slowema)
shortCond2 = true 
// shortCond2 = sRsiCrossUnder
shortCond3 = close < fastema
shortCond4 = strategy.position_size >= 0
shortCond = shortCond1 and shortCond2 and shortCond3 and shortCond4 and inDateRange

var takeProfit = float(na), var stopLoss = float(na)
if longCond and strategy.position_size <= 0
    takeProfit := close + 4*atr
    stopLoss := close - 1*atr
    // takeProfit := close + 2*atr
    // stopLoss := close - 3*atr

else if shortCond and strategy.position_size >= 0
    takeProfit := close - 4*atr
    stopLoss := close + 1*atr
    // takeProfit := close - 2*atr
    // stopLoss := close + 3*atr
    
// Strategy calls
strategy.entry("3ESRA", strategy.long, comment="Long", when=longCond and strategy.position_size <= 0)
strategy.entry("3ESRA", strategy.short, comment="Short", when=shortCond and strategy.position_size >= 0)
strategy.exit(id="TP-SL", from_entry="3ESRA", limit=takeProfit, stop=stopLoss)
if (not inDateRange)
    strategy.close_all()
    
// Plot EMAs
plot(fastema, color=color.purple, linewidth=2, title="Fast EMA")
plot(mediumema, color=color.teal, linewidth=2, title="Medium EMA")
plot(slowema, color=color.yellow, linewidth=2, title="Slow EMA")
// Plot S-RSI
// plotshape((strategy.position_size > 0) ? na : sRsiCrossOver, title="StochRSI Cross Over", style=shape.triangleup, location=location.belowbar, color=color.teal, text="SRSI", size=size.small)
// Plot trade
bgcolor(strategy.position_size > 0 ? color.new(color.green, 75) : strategy.position_size < 0 ? color.new(color.red,75) : color(na))
// Plot Strategy
plot((strategy.position_size != 0) ? takeProfit : na, style=plot.style_linebr, color=color.green, title="TP")
plot((strategy.position_size != 0) ? stopLoss : na, style=plot.style_linebr, color=color.red, title="SL")