Эта стратегия использует классическую двойную систему перекрестного использования EMA для отслеживания тенденций, с дополнительными фильтрами от индикаторов ATR и ADX, для отслеживания сильных тенденций и контроля риска во время консолидации.
Стратегия основывается на следующем:
Используйте более быструю 8-периодную EMA и более медленную 20-периодную EMA для генерации перекрестных сигналов.
Индикатор ATR отражает недавнюю волатильность. Нормализация ATR позволяет динамически корректировать условия фильтра EMA, снижая требования во время сильных тенденций и повышая во время консолидации для контроля риска.
Индикатор ADX определяет силу тренда. Читание ADX выше 30 предполагает сильный тренд, что вызывает своевременную остановку потерь.
Соедините с бычьими/медвежьими тенденциями, чтобы определить длительный/короткий срок входа.
Фильтр объема для ввода при увеличении объема.
Используйте простой индекс доллара США для определения силы доллара США, расширения диапазона остановки и получения прибыли во время сильного доллара США.
Использовать индикатор SuperTrend для определения общего направления рынка для дополнительной долгосрочной/короткосрочной помощи.
Стратегия сочетает в себе индикаторы тренда и колебаний для динамической корректировки параметров, отслеживания тенденций при одновременном контроле риска.
Двойная система EMA обеспечивает определение тренда, при этом плавность EMA фильтрует ложные перерывы.
Нормированные фильтры ATR позволяют гибко работать в различных рыночных условиях.
ADX и объем обеспечивают дополнительные проверки, чтобы избежать сбоев во время консолидации.
Принимая во внимание USD и SuperTrend повышается точность принятия решений по макро-тенденции.
Управление рисками автоматически адаптируется на основе силы доллара США.
Простые золотые / мертвые крестовые сигналы и логика остановки / получения прибыли облегчают реализацию и обратное тестирование.
Двойные EMA отстают в обнаружении поворотных моментов тренда.
Плохой выбор параметров ATR может быть слишком агрессивным или консервативным.
Параметры ADX нуждаются в оптимизации, неправильно установленные высокие точки могут пропустить тренды.
Определение тренда USD и SuperTrend может быть неточным.
Слишком плотный стоп-лосс увеличивает убытки, слишком широкий риск.
Подумайте о добавлении таких индикаторов, как MACD, для лучшего обнаружения точки оборота.
Оптимизируйте параметры ATR по более историческим данным.
Испытать различные параметры ADX и оптимизировать высокие пороговые значения.
Добавьте больше переменных для анализа доллара США и рыночных тенденций.
Вычислить оптимальный процент стоп-лосса по статистике обратного теста.
Экспериментируйте с остановками на задней части или люстры.
Продолжайте оптимизировать размер входа и период хранения.
Эта стратегия интегрирует классическую двойную систему EMA с несколькими вспомогательными показателями, используя параметризированную оптимизацию для довольно надежного подхода к тренду. Она гибко адаптируется к изменяющейся рыночной среде, отслеживая тенденции при одновременном контроле риска. Дальнейшее тестирование и оптимизация остановок и параметров индикатора улучшат результаты.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Refactored Advanced EMA Cross with Normalized ATR Filter, Controlling ADX", shorttitle="ALP V5", overlay=true) // Initialize variables to track if a buy order has been placed and number of periods since the last buy var bool hasBought = false var int barCountSinceBuy = 0 // Define EMA periods emaShort = ta.ema(close, 8) emaLong = ta.ema(close, 20) // Define ATR period and normalization atrLength = 14 atrValue = ta.atr(atrLength) maxHistoricalATR = ta.highest(atrValue, 20) minHistoricalATR = ta.lowest(atrValue, 20) normalizedATR = (atrValue - minHistoricalATR) / (maxHistoricalATR - minHistoricalATR) // Define ADX parameters adxValue = ta.rma(close, 14) adxHighLevel = 30 isADXHigh = adxValue > adxHighLevel // Initialize risk management variables var float stopLossPercent = na var float takeProfitPercent = na var float trailingStop = na // Calculate USD strength (simplified) usd_strength = close / ta.ema(close, 50) - 1 // Adjust risk parameters based on USD strength if (usd_strength > 0) stopLossPercent := 3 takeProfitPercent := 6 else stopLossPercent := 4 takeProfitPercent := 8 // Initialize position variable var float positionPrice = na // Volume filter minVolume = ta.sma(volume, 14) * 1.5 isVolumeHigh = volume > minVolume // Piyasa yönü için süper trend göstergesi [supertrendValue, supertrendDirection] = ta.supertrend(4, 14) // Use a factor of 3 and ATR period of 10 bool isBullMarket = supertrendDirection < 0 bool isBearMarket = supertrendDirection > 0 // Yükselen piyasa için alım koşulu buyConditionBull = isBullMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.2 // Düşen piyasa için alım koşulu buyConditionBear = isBearMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.5 // Genel alım koşulu buyCondition = buyConditionBull or buyConditionBear // Yükselen ve düşen piyasalar için farklı satış koşulları sellConditionBull = isBullMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh) sellConditionBear = isBearMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh) // Genel satış koşulu sellCondition = sellConditionBull or sellConditionBear // Buy condition if (buyCondition) strategy.entry("Buy", strategy.long) positionPrice := close hasBought := true // Set the flag to true when a buy order is placed barCountSinceBuy := 0 // Reset the bar counter when a buy order is placed // Increase the bar counter if a buy has been executed if (hasBought) barCountSinceBuy := barCountSinceBuy + 1 // Calculate stop-loss and take-profit levels longStopLoss = positionPrice * (1 - stopLossPercent / 100) longTakeProfit = positionPrice * (1 + takeProfitPercent / 100) // Final Sell condition, now also checks if a buy has occurred before and if at least 5 periods have passed finalSellCondition = sellCondition and hasBought and barCountSinceBuy >= 3 and isVolumeHigh if (finalSellCondition) strategy.close("Buy") positionPrice := na hasBought := false // Reset the flag when a sell order is placed barCountSinceBuy := 0 // Reset the bar counter when a buy order is closed // Implement stop-loss, take-profit, and trailing stop strategy.exit("Stop Loss", "Buy", stop=longStopLoss) strategy.exit("Take Profit", "Buy", limit=longTakeProfit) //strategy.exit("Trailing Stop", "Buy", trail_price=close, trail_offset=trailingStop * close / 100) var label l = na if (buyCondition) l := label.new(bar_index, high, text="buy triggered " + str.tostring(usd_strength)) label.delete(l[1]) if (finalSellCondition) l := label.new(bar_index, high, text="sell triggered " + str.tostring(usd_strength)) label.delete(l[1]) // Plot signals plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy") plotshape(series=finalSellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")