Двойная тенденция перекрестного использования EMA после стратегии с ATR и ADX фильтрами

Автор:Чао Чжан, Дата: 2023-11-15 15:53:57
Тэги:

img

Обзор

Эта стратегия использует классическую двойную систему перекрестного использования EMA для отслеживания тенденций, с дополнительными фильтрами от индикаторов ATR и ADX, для отслеживания сильных тенденций и контроля риска во время консолидации.

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

Стратегия основывается на следующем:

  1. Используйте более быструю 8-периодную EMA и более медленную 20-периодную EMA для генерации перекрестных сигналов.

  2. Индикатор ATR отражает недавнюю волатильность. Нормализация ATR позволяет динамически корректировать условия фильтра EMA, снижая требования во время сильных тенденций и повышая во время консолидации для контроля риска.

  3. Индикатор ADX определяет силу тренда. Читание ADX выше 30 предполагает сильный тренд, что вызывает своевременную остановку потерь.

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

  5. Фильтр объема для ввода при увеличении объема.

  6. Используйте простой индекс доллара США для определения силы доллара США, расширения диапазона остановки и получения прибыли во время сильного доллара США.

  7. Использовать индикатор SuperTrend для определения общего направления рынка для дополнительной долгосрочной/короткосрочной помощи.

Стратегия сочетает в себе индикаторы тренда и колебаний для динамической корректировки параметров, отслеживания тенденций при одновременном контроле риска.

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

  1. Двойная система EMA обеспечивает определение тренда, при этом плавность EMA фильтрует ложные перерывы.

  2. Нормированные фильтры ATR позволяют гибко работать в различных рыночных условиях.

  3. ADX и объем обеспечивают дополнительные проверки, чтобы избежать сбоев во время консолидации.

  4. Принимая во внимание USD и SuperTrend повышается точность принятия решений по макро-тенденции.

  5. Управление рисками автоматически адаптируется на основе силы доллара США.

  6. Простые золотые / мертвые крестовые сигналы и логика остановки / получения прибыли облегчают реализацию и обратное тестирование.

Риски стратегии

  1. Двойные EMA отстают в обнаружении поворотных моментов тренда.

  2. Плохой выбор параметров ATR может быть слишком агрессивным или консервативным.

  3. Параметры ADX нуждаются в оптимизации, неправильно установленные высокие точки могут пропустить тренды.

  4. Определение тренда USD и SuperTrend может быть неточным.

  5. Слишком плотный стоп-лосс увеличивает убытки, слишком широкий риск.

Идеи улучшения

  1. Подумайте о добавлении таких индикаторов, как MACD, для лучшего обнаружения точки оборота.

  2. Оптимизируйте параметры ATR по более историческим данным.

  3. Испытать различные параметры ADX и оптимизировать высокие пороговые значения.

  4. Добавьте больше переменных для анализа доллара США и рыночных тенденций.

  5. Вычислить оптимальный процент стоп-лосса по статистике обратного теста.

  6. Экспериментируйте с остановками на задней части или люстры.

  7. Продолжайте оптимизировать размер входа и период хранения.

Заключение

Эта стратегия интегрирует классическую двойную систему 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")


Больше