Многофакторная комбинация стратегии с адаптивной скользящей средней - это сложная стратегия, которая сочетает в себе использование линий HA, скользящих средних, стохастических кроссоверов и внутридневных баров.
Основная логика этой стратегии заключается в объединении нескольких технических индикаторов для оценки сигналов купли и продажи и создании торговых сигналов с различными сильными сторонами на основе результатов совпадения.
В частности, к четырем основным техническим показателям, используемым в стратегии, относятся:
Внутреннедневные панели. Стратегия использует цвет внутридневных панелей для определения ценовых тенденций. Два последовательных зеленых реальных панелей HA дают сигналы покупки, в то время как два последовательных красных полых панелей HA дают сигналы продажи.
Движущиеся средние. Стратегия использует быстрые, медленные и фильтрующие движущиеся средние с различными параметрами настройки одновременно. Когда быстрая линия пересекает над медленной линией, и медленная линия пересекает над линией фильтра, это дает сигналы покупки. И наоборот. Движущиеся средние хороши в определении среднесрочных и долгосрочных тенденций.
Стохастический индикатор. Этот индикатор определяет время бычьего и медвежьего перекрестков. Когда линия %K проходит через линию %D снизу, она дает сигналы покупки. А когда %K проходит через %D сверху, она дает сигналы продажи.
Механизм сопоставления баллов. Согласно сопоставлению вышеуказанных факторов стратегия принимает механизм оценки. Чем больше сопоставляющих факторов, тем сильнее соответствующий торговый сигнал.
Благодаря всеобъемлющему оценке множества факторов стратегия может использовать более тонкие торговые возможности в среднесрочной и краткосрочной перспективе, тем самым достигая чрезмерной доходности во время бычьих рынков.
Наибольшее преимущество этой многофакторной стратегии заключается в том, что она повышает надежность торговых сигналов. Один технический индикатор подвержен генерированию ложных сигналов. Объединяя несколько индикаторов, эта стратегия может эффективно уменьшить помехи от ложных сигналов.
Кроме того, в сравнении с простой последовательностью одного индикатора, комбинация из нескольких факторов может улучшить уровень выигрыша сделок.
Основной риск этой стратегии заключается в том, что сама по себе комбинация многофакторных факторов увеличивает сложность стратегии.
Кроме того, во время медвежьих рынков время хранения может быть слишком длинным.
Кроме того, на такие технические индикаторы, как стохастические и HA-линии, могут влиять события черного лебедя, которые, как правило, генерируют ложные сигналы и вызывают ненужные потери.
Стратегия может быть оптимизирована в следующих аспектах:
Оптимизируйте параметры каждого показателя, чтобы найти оптимальную комбинацию.
Добавить обучение модели и адаптивные модули параметров для оптимизации параметров в реальном времени.
Добавьте стратегии стоп-лосса, чтобы уменьшить максимальное снижение.
Добавление модулей управления позицией для динамической корректировки позиций на основе рыночных условий.
Включить алгоритмы машинного обучения для построения модели нейронной сети для многофакторной системы оценки.
Многофакторная комбинация стратегии с адаптивной скользящей средней объединяет сильные стороны нескольких технических индикаторов. Она может эффективно улучшить качество сигнала и достичь избыточной доходности во время бычьих рынков. Но в то же время она также увеличивает сложность стратегии, требуя дальнейшего тестирования и оптимизации.
/*backtest start: 2022-12-08 00:00:00 end: 2023-12-14 00:00:00 period: 1d basePeriod: 1h 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/ // © cyrule //@version=4 strategy("2nd Grade Strategy", overlay=true, shorttitle="2GTS", max_lines_count = 500, max_labels_count = 500, calc_on_every_tick = true, calc_on_order_fills = true, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 10) source = input(close, title = "Source") // ********************** // * Heikin-Ahshi * // * kudos to garethyeo * // ********************** showHA = input(true, title = "Show Heikin Ashi?", group = "Heikin Ashi") ha_open = security(heikinashi(syminfo.tickerid), timeframe.period, open) ha_high = security(heikinashi(syminfo.tickerid), timeframe.period, high) ha_low = security(heikinashi(syminfo.tickerid), timeframe.period, low) ha_close = security(heikinashi(syminfo.tickerid), timeframe.period, close) bgcolor(iff(showHA and ha_open < ha_close , color.new(#53b987, transp = 92.5), na), title = 'Green HA') bgcolor(iff(showHA and ha_open >= ha_close, color.new(#eb4d5c, transp = 92.5), na), title = 'Red HA' ) // ****************** // * Moving Average * // ****************** // MA Settings showMA = input(true, title = "Show Moving Averages?", group = "Moving Averages") fastMALength = input(title = "Fast MA Length", minval = 1, step = 1, defval = 20, group = "Moving Averages") slowMALength = input(title = "Slow MA Length", minval = 1, step = 1, defval = 50, group = "Moving Averages") maType = input(title = "Moving Average Type", defval = "SMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages") filterMALength = input(title = "Filter MA Length", minval = 1, step = 1, defval = 200, group = "Moving Averages") filterMAType = input(title = "Filter MA Type", defval = "EMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages") // Calculate MA var float maFast = na var float maSlow = na var float maFilter = na if (maType == "SMA") maFast := sma(source, fastMALength) maSlow := sma(source, slowMALength) if (maType == "EMA") maFast := ema(source, fastMALength) maSlow := ema(source, slowMALength) if (maType == "RMA") maFast := rma(source, fastMALength) maSlow := rma(source, slowMALength) maFilter := rma(source, filterMALength) if (maType == "WMA") maFast := wma(source, fastMALength) maSlow := wma(source, slowMALength) if (maType == "VWMA") maFast := vwma(source, fastMALength) maSlow := vwma(source, slowMALength) if (filterMAType == "SMA") maFilter := sma(source, filterMALength) if (filterMAType == "EMA") maFilter := ema(source, filterMALength) if (filterMAType == "RMA") maFilter := rma(source, filterMALength) if (filterMAType == "WMA") maFilter := wma(source, filterMALength) if (filterMAType == "VWMA") maFilter := vwma(source, filterMALength) BiruAtasMerah = (maFast >= maSlow) and (maSlow >= maFilter) MerahAtasBiru = (maFast <= maSlow) and (maSlow <= maFilter) // Lukis MA plot(series = showMA ? maFast : na, color = color.blue, title = "MA Fast") plot(series = showMA ? maSlow : na, color = color.red, title = "MA Slow") plot(series = showMA ? maFilter : na, color = #FFCC00, title = "MA Filter") // ************** // * Stochastic * // ************** // Stochastic Settings showSSC = input(true, title = "Show Stochastic Crossovers?", group = "Stochastic") Length = input (10, minval = 1, title = "%K Length", group = "Stochastic") SmoothK = input (3, minval = 1, title = "%K Smoothing", group = "Stochastic") SmoothD = input (3, minval = 1, title = "%D Smoothing", group = "Stochastic") // Calculate Stochastic var float K = na var float D = na if (maType == "SMA") K := sma(stoch(source, high, low, Length), SmoothK) D := sma(K, SmoothD) if (maType == "EMA") K := ema(stoch(source, high, low, Length), SmoothK) D := ema(K, SmoothD) if (maType == "RMA") K := rma(stoch(source, high, low, Length), SmoothK) D := rma(K, SmoothD) if (maType == "WMA") K := wma(stoch(source, high, low, Length), SmoothK) D := wma(K, SmoothD) if (maType == "VWMA") K := vwma(stoch(source, high, low, Length), SmoothK) D := vwma(K, SmoothD) StochasticCrossOver = crossover(K, D) StochasticCrossUnder = crossunder(K, D) // Lukis SS plotshape(showSSC and StochasticCrossOver and K <= 20 ? K : na, text = "Golden\nCrossover", color = color.new(color.green, transp = 25), location = location.belowbar, size = size.tiny, title = "Golden Crossover" ) plotshape(showSSC and StochasticCrossUnder and K >= 80 ? D : na, text = "Deadly\nCrossover", color = color.new(color.red, transp = 25), location = location.belowbar, size = size.tiny, title = "Deadly Crossover" ) plotshape(showSSC and StochasticCrossOver and K <= 80 and K > 20 ? K : na, text = "Bullish\nCrossover", color = color.new(color.green, transp = 50), location = location.belowbar, size = size.tiny, title = "Bullish Crossover") plotshape(showSSC and StochasticCrossUnder and K >= 20 and K < 80 ? D : na, text = "Bearish\nCrossover", color = color.new(color.red, transp = 50), location = location.belowbar, size = size.tiny, title = "Bearish Crossover") showBull = input(true, title = "Show Bullish Signal?", group = "Signal") showBear = input(false, title = "Show Bearish Signal?", group = "Signal") bullishCriteria = 0 if (ha_open < ha_close) and (ha_open[1] < ha_close[1]) and (ha_open[2] >= ha_close[2]) bullishCriteria := bullishCriteria + 1 if (maFast > maSlow) and (maSlow > maFilter) bullishCriteria := bullishCriteria + 1 if (K > D) and (K > K[1]) and (D > D[1]) bullishCriteria := bullishCriteria + 1 bearishCriteria = 0 if (ha_open >= ha_close) and (ha_open[1] >= ha_close[1]) and (ha_open[2] < ha_close[2]) bearishCriteria := bearishCriteria + 1 if (maFast < maSlow) and (maSlow < maFilter) bearishCriteria := bearishCriteria + 1 if (K < D) and (K < K[1]) and (D < D[1]) bearishCriteria := bearishCriteria + 1 signal = color.new(color.white, transp = 0) if bearishCriteria == 2 signal := color.new(color.orange, transp = 50) if bearishCriteria == 3 signal := color.new(color.red, transp = 50) if bullishCriteria == 2 signal := color.new(color.aqua, transp = 50) if bullishCriteria == 3 signal := color.new(color.green, transp = 50) bullishCriteria := showBull ? bullishCriteria : 0 bearishCriteria := showBear ? bearishCriteria : 0 bgcolor(iff(bullishCriteria > 1, signal, na), title = 'Bullish Signal') bgcolor(iff(bearishCriteria > 1, signal, na), title = 'Bearish Signal') longTPPerc = input(title = "Take Profit Threshold (%)" , minval = 0.0, step = 0.5, defval = 2.5, group = "Trading") / 100 profitRatio = input(title = "Profit-to-Loss ratio (risk tolerance)", minval = 1.0, step = 0.1, defval = 1.4, group = "Trading") longSLPerc = longTPPerc / profitRatio takeProfit = strategy.position_avg_price * (1 + longTPPerc) stopLoss = strategy.position_avg_price * (1 - longSLPerc) strategy.initial_capital = 50000 strategy.entry("Long" , strategy.long , floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bullishCriteria > 1) strategy.entry("Short", strategy.short, floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bearishCriteria > 1) strategy.close("Long" , when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss)) strategy.close("Short", when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss)) plotshape(bullishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100)) plotshape(bearishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))