Стратегия отслеживания трендов на основе облака Ichimoku, MACD и стохастической стратегии

Автор:Чао Чжан, Дата: 2024-02-05 10:30:45
Тэги:

img

Обзор

Эта стратегия интегрирует индикаторы Ichimoku Cloud, скользящей средней, MACD, Stochastic и ATR для выявления и отслеживания тенденций в нескольких временных рамках.

Логика стратегии

  1. Ichimoku Cloud оценивает среднесрочные и долгосрочные направления тренда.

  2. MACD оценивает краткосрочные тенденции и ситуации перекупки/перепродажи.

  3. Стохастический KD оценивает зоны перекупленности/перепроданности. Пересечение линии K выше 20 - это бычий сигнал, а пересечение ниже 80 - медвежий сигнал.

  4. Кочевая средняя оценивает среднесрочные тенденции.

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

  6. Используйте ATR для расчета стоп-лосса и цены прибыли. Используйте определенное кратное ATR как стоп-лосс и бит прибыли для контроля рисков.

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

  1. Выявление тенденций в течение нескольких временных рамок для улучшения точности сигнала.

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

  3. Стоп-лосс и прибыль на основе ATR существенно ограничивают по торговым потерям.

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

Риски

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

  2. Идеализированный ATR стоп-лосс трудно полностью воспроизвести в режиме реального времени.

  3. Неправильные параметры могут привести к переоценке или недостаточной точности сигнала.

  4. Изменение параметров необходимо для адаптации к различным продуктам и рыночным условиям.

Области улучшения

  1. Внедрить машинное обучение, чтобы помочь оценить точки переворота тренда.

  2. Оптимизировать значения параметров мультипликатора ATR для различных продуктов.

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

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

Резюме

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


/*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)

//}



Больше