Стратегия следования за трендом с несколькими таймфреймами на основе облака Ишимоку, MACD и стохастика


Дата создания: 2024-02-05 10:30:45 Последнее изменение: 2024-02-05 10:30:45
Копировать: 2 Количество просмотров: 768
1
Подписаться
1617
Подписчики

Стратегия следования за трендом с несколькими таймфреймами на основе облака Ишимоку, MACD и стохастика

Обзор

Эта стратегия объединяет несколько показателей, таких как график облаков Ичимоку, движущиеся средние, MACD, Stochastic и ATR, чтобы идентифицировать и отслеживать тенденции в течение нескольких временных рамок. После получения высоковероятного трендового сигнала для контроля риска используется циклическая остановка убытков ATR.

Стратегический принцип

  1. Ichimoku диаграмма определяет направление тенденции средней длинной линии. Обратная линия и эталонная линия, проходящая через диаграму облаков в верхней части цены CLOSE, являются многоголовыми сигналами, а в нижней части - пустыми сигналами.

  2. MACD определяет тенденцию короткой линии и перепродажи.

  3. Stochastic KD определяет зону перепродажи. На K-линии 20 - это многоголовый сигнал, а на нижней линии 80 - пустой сигнал.

  4. Подвижная средняя определяет среднесрочную тенденцию. Подвижная средняя покрывает цену как многоголовый сигнал, а нижняя - как пустой сигнал.

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

  6. На основе ATR рассчитывается стоп-стоп цена. С определенным ATR-множеством как стоп-стоп и стоп-стоп, реализуется контроль риска.

Стратегические преимущества

  1. Узнать тенденции в нескольких временных рамках, повысить точность сигналов.

  2. Широкое применение технологии фильтрации комбинации показателей, эффективное фильтрация ложных сигналов.

  3. ATR - периодический стоп-стоп для максимального контроля одиночных потерь.

  4. Строгость условий допуска может быть настроена в соответствии с различными предпочтениями в отношении риска.

Стратегический риск

  1. Например, если мы используем тенденции, мы не сможем распознать реверсию, вызванную внезапными событиями.

  2. Циклическая остановка ATR может быть слишком идеализирована и трудно полностью воспроизведена в реальном мире.

  3. Неправильная настройка параметров может привести к слишком высокой частоте сделок или недостаточной точности распознавания сигналов.

  4. Необходимо скорректировать параметры, чтобы найти баланс и адаптироваться к различным видам и рыночной среде.

Направление оптимизации стратегии

  1. Добавление алгоритмов машинного обучения, помогающих определить переломные моменты тренда.

  2. Оптимизация параметров ATR, разные сорта могут иметь разные множители.

  3. В сочетании с другими факторами, такими как изменение объема торгов, повышается точность прорывного сигнала.

  4. В зависимости от результатов обратной проверки параметры постоянно оптимизируются, чтобы найти оптимальную комбинацию параметров.

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

Эта стратегия использует несколько показателей, таких как Ичимоку, MACD и Stochastic, для идентификации тенденций в нескольких временных рамках, чтобы уловить тенденцию и избежать попадания в ловушку внезапных событий. Периодическая остановка убытков ATR является эффективной стратегией отслеживания тенденций, чтобы эффективно контролировать убытки.

Исходный код стратегии
/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 4h
basePeriod: 15m
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/
// © FXFUNDINGMATE

//@version=4
strategy(title="FXFUNDINGMATE TREND INDICATOR", overlay=true)

//Ichimoku Cloud
conversionPeriods = input(9, minval=1, title="Conversion Line Length")
basePeriods = input(26, minval=1, title="Base Line Length")
laggingSpan2Periods = input(52, minval=1, title="Lagging Span 2 Length")
displacement = input(26, minval=1, title="Displacement")
donchian(len) => avg(lowest(len), highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = avg(conversionLine, baseLine)[displacement - 1]
leadLine2 = donchian(laggingSpan2Periods)[displacement - 1]


//macd
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//kd
periodK = input(5, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)


//atr
atrlength = input(title="Atr Length", defval=8, minval=1)
SMulti = input(title="Stop loss multi Atr", defval=1.0)
TMulti = input(title="Take profit multi Atr", defval=1.0)
smoothing = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
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), atrlength)


operation_type = input(defval = "Both", title = "Position side", options = ["Long", "Short", "Both"])
operation = operation_type == "Long" ? 1 : operation_type == "Short" ? 2 : 3
showlines = input(true,  title="Show sl&tp lines")

// MA
sma_len = input(100, title="MA Length", type=input.integer)
sma = sma(close, sma_len)

longCond = crossover(k, 20) and macd > 0 and close > sma and close > leadLine1 and close > leadLine2
shortCond = crossunder(k, 80)  and macd < 0 and close < sma and close < leadLine1 and close < leadLine2

entry_price  = float(0.0) //set float
entry_price := strategy.position_size != 0 or longCond or shortCond ? strategy.position_avg_price : entry_price[1]
entry_atr = valuewhen(longCond or shortCond, atr,0)
short_stop_level     = float(0.0)   //set float
short_profit_level   = float(0.0)   //set float
long_stop_level      = float(0.0)   //set float
long_profit_level    = float(0.0)   //set float
short_stop_level    := entry_price + SMulti * entry_atr
short_profit_level  := entry_price - TMulti * entry_atr
long_stop_level     := entry_price - SMulti * entry_atr
long_profit_level   := entry_price + TMulti * entry_atr


//  Strategy Backtest Limiting Algorithm
i_startTime = input(defval = timestamp("1 Jan 2020 00:00 +0000"), title = "Backtesting Start Time", type = input.time)
i_endTime = input(defval = timestamp("31 Dec 2025 23:59 +0000"), title = "Backtesting End Time", type = input.time)
timeCond = true

if (operation == 1 or operation == 3)
    strategy.entry("long" , strategy.long , when=longCond and timeCond, alert_message = "Long")
    strategy.exit("SL/TP", from_entry = "long" , limit = long_profit_level , stop = long_stop_level , alert_message = "Long exit")

if (operation == 2 or operation == 3)
    strategy.entry("short", strategy.short, when=shortCond and timeCond, alert_message="Short")
    strategy.exit("SL/TP", from_entry = "short", limit = short_profit_level , stop = short_stop_level , alert_message = "Short exit")
    
if time > i_endTime  
    strategy.close_all(comment = "close all", alert_message = "close all")
    
plot(showlines and strategy.position_size <= 0 ? na : long_stop_level,    color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size <= 0 ? na : long_profit_level,  color=color.lime, style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_stop_level,   color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_profit_level, color=color.lime, style=plot.style_linebr, linewidth = 2)

//}