Стратегия пересечения скользящих средних ADR — торговый метод, сочетающий многомерные технические индикаторы и строгие стоп-профит и стоп-лосс.


Дата создания: 2024-03-28 16:46:29 Последнее изменение: 2024-03-28 16:46:29
Копировать: 0 Количество просмотров: 352
1
Подписаться
1166
Подписчики

Стратегия пересечения скользящих средних ADR — торговый метод, сочетающий многомерные технические индикаторы и строгие стоп-профит и стоп-лосс.

Обзор

ADR - это количественная торговая стратегия, основанная на платформе TradingView, которая объединяет несколько технических показателей для определения тенденции, фильтрации сигналов и установки стоп-лосса. Эта стратегия использует индикаторные движущиеся средние (EMA) для определения основных тенденций в течение двух различных периодов, использует среднюю реальную волновую величину (ATR) в качестве фильтра волатильности и устанавливает стоп-лосса в зависимости от динамики риска и отдачи. Кроме того, эта стратегия вводит такие меры контроля риска, как торговые окна, балансировка убытков и максимальные потери, чтобы попытаться уловить тенденционные возможности, но при этом строго контролировать нисходящий риск.

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

  1. Двухлинейный пересечение: стратегия использует две линии EMA с разными периодами для определения тенденции. Когда краткосрочная EMA пересекает долгосрочную EMA, считается, что тенденция вверх, создавая многосигналы; наоборот, когда краткосрочная EMA пересекает долгосрочную EMA, считается, что тенденция вниз, создавая сигналы заикания.

  2. Фильтрация волатильности ADR: чтобы избежать появления торговых сигналов в условиях низкой волатильности, в стратегию вводятся индикаторы ADR в качестве фильтра волатильности. Открытие позиции разрешается только в том случае, если значение ADR выше заданного минимального порога.

  3. Временное окно торговли: эта стратегия позволяет пользователям устанавливать время начала и окончания ежедневных сделок. Сделки будут выполняться только в течение указанного временного окна. Это помогает избежать периодов низкой ликвидности или повышенной волатильности.

  4. Динамический стоп-стоп: стратегия основана на средних максимальных и минимальных ценах на последних N-корневых K-линиях, и в сочетании с заданным риском-возвратом, динамически рассчитывается стоп-стоп и стоп-убыток. Это гарантирует, что риск-возврат на каждую сделку является контролируемым.

  5. Уровень убытков: после достижения определенного уровня прибыли от размещения позиции (пользователь может установить рискованный коэффициент возврата), стратегия переносит остановку на цену открытия позиции, то есть уровень убытков. Это помогает защитить полученную прибыль.

  6. Ограничение максимального убытка в день: чтобы контролировать максимальный убыток в день, стратегия устанавливает ежедневный лимит убытка. Как только убыток в день достигает этого лимита, стратегия прекращает торговлю до следующего дня.

  7. Закрытие и ликвидация позиций: независимо от того, касается ли позиция стоп-линий или стоп-убытков, стратегия будет ликвидировать все позиции в фиксированное время каждого торгового дня (например, в 16:00), чтобы избежать риска на ночь.

Анализ преимуществ

  1. Сильная способность отслеживать тенденции: с помощью двойного скрещивания равномерных линий можно судить о тенденциях, эффективно улавливая основные тенденции рынка, что повышает победоспособность стратегии и потенциал прибыли.

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

  3. Строгость управления рисками: стратегия устанавливает меры управления рисками с нескольких измерений, включая динамические стоп-стоп, убыточный баланс, максимальный лимит убытков в день и т. Д., Эффективно контролирует понижающий риск стратегии и повышает прибыль после корректировки риска.

  4. Гибкость параметров: различные параметры стратегии, такие как среднелинейный цикл, длина ADR, коэффициент возврата риска, окно времени торговли и т. д., могут быть гибко настроены в соответствии с предпочтениями пользователей и особенностями рынка, что позволяет оптимизировать эффективность стратегии.

  5. Высокая степень автоматизации: стратегия основана на платформе TradingView, логика торговли полностью выполняется программой автоматически, что уменьшает вмешательство в человеческие эмоции и субъективные суждения, что способствует долгосрочной стабильной работе стратегии.

Анализ рисков

  1. Риск оптимизации параметров: хотя параметры стратегии могут быть гибко скорректированы, чрезмерная оптимизация может привести к чрезмерной совместимости и плохой внешней производительности образца. Таким образом, при установке параметров требуется адекватная обратная связь и анализ, чтобы обеспечить устойчивость стратегии.

  2. Риск неожиданных событий: стратегия основана на торговле техническими показателями и может не реагировать на некоторые неожиданные основные события, такие как изменения в политике, значительные колебания экономических данных и т. Д., что может привести к значительному отступлению.

  3. Риск поворота тренда: во время критических периодов поворота тренда может возникнуть задержка в сигнале перекрёстка, что может привести к тому, что стратегия упустит оптимальный момент для создания позиции или потеряет ее в начале поворота тренда.

  4. Риск ликвидности: несмотря на то, что стратегия устанавливает окно времени для торговли, риски, связанные со скольжениями, задержками торгов и другими рисками, могут повлиять на эффективность стратегии, если показатель ликвидности сделки является плохим.

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

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

  1. Введение более масштабных индикаторов: на основе существующих двойных средних линий и ADR можно рассмотреть возможность введения более эффективных технических индикаторов, таких как MACD, RSI и т. Д., Чтобы повысить надежность и устойчивость сигнала.

  2. Динамические параметры оптимизации: можно создать механизм оптимизации параметров, в зависимости от различных состояний рынка (например, трендового, шокирующего и т. Д.), Динамически корректируйте ключевые параметры стратегии, чтобы адаптироваться к изменениям рынка.

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

  4. Улучшение механизма остановки убытков: на основе существующих динамических остановок убытков можно дополнительно оптимизировать логику остановки убытков, например, ввести методы отслеживания убытков, частичного остановки и т. Д., Чтобы лучше защитить прибыль и контролировать риск.

  5. Многоцелевые, многовременные циклы: расширяет стратегию на несколько торговых целей и на несколько временных циклов, повышает адаптивность и стабильность стратегии за счет распределения инвестиций и оптимизации временных циклов.

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

Стратегия ADR с равными линейными перекрестками - это количественная торговая стратегия, основанная на техническом анализе, которая определяет тенденции с помощью двойных равномерных перекрестков и фильтрует волатильность с помощью показателей ADR. Эта стратегия также устанавливает строгие меры по контролю риска, включая динамические стоп-лоры, балансировку потерь и ограничение максимальных потерь в день, чтобы контролировать нисходящий риск. Преимущества стратегии заключаются в сильной способности отслеживать тенденции, хорошей адаптивности волатильности, строгом контроле риска, гибкости параметров и высокой степени автоматизации. Но в то же время существуют некоторые риски, такие как риск оптимизации параметров, риск внезапных событий, риск переключения тенденций, риск ликвидности и риск неэффективности технических показателей.

Исходный код стратегии
/*backtest
start: 2024-02-26 00:00:00
end: 2024-03-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Sameh_Hussein

//@version=5
strategy('EMA Cross ADR Strategy with Stats', overlay=true)

// Adjustable Parameters
shortEmaLength = input(10, title='Short EMA Length')
longEmaLength = input(50, title='Long EMA Length')
adrLength = input(14, title='ADR Length')
riskRewardRatio = input(2.0, title='Risk/Reward Ratio')
lookbackCandles = input(10, title='Lookback Candles for Stop Loss')
startTime = input(0900, title='Start Time')
endTime = input(1600, title='End Time')
minAdrValue = input(10, title='Minimum ADR Value for Entry')
breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0)
breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0)
dailyLossLimit = input(-2000.0, title='Daily Loss Limit')

// Exponential Moving Averages
shortEma = ta.ema(close, shortEmaLength)
longEma = ta.ema(close, longEmaLength)

// Average Daily Range
adr = ta.sma(ta.tr, adrLength)

// Time Filter Function
timeFilter() => true

// Entry Conditions with ADR filter
longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue
shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue

// Calculate the average low and average high of the previous 'lookbackCandles' candles
averageLow = ta.sma(low, lookbackCandles)
averageHigh = ta.sma(high, lookbackCandles)

// Risk and Reward Calculation
stopLossLong = averageLow
takeProfitLong = close + (close - averageLow) * riskRewardRatio
stopLossShort = averageHigh
takeProfitShort = close - (averageHigh - close) * riskRewardRatio

// Entry Control Variables
var longEntryAllowed = true
var shortEntryAllowed = true

// Update entry price on trade execution
var float entryPriceLong = na
var float entryPriceShort = na

if (strategy.position_size > 0)
    if (strategy.position_size[1] <= 0)
        entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1)
    else
        entryPriceLong := entryPriceLong
else
    entryPriceLong := na

if (strategy.position_size < 0)
    if (strategy.position_size[1] >= 0)
        entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1)
    else
        entryPriceShort := entryPriceShort
else
    entryPriceShort := na

// Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached
breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR
breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR

if (longEntryAllowed and close >= breakEvenTriggerLong)
    stopLossLong := entryPriceLong + breakEvenProfit

if (shortEntryAllowed and close <= breakEvenTriggerShort)
    stopLossShort := entryPriceShort - breakEvenProfit

// Close all trades at 1600
if (hour == 15 and minute == 59)
    strategy.close_all(comment='Close at 1600')

// Define the daily loss variable and last trade day
var float[] dailyLossArray = array.new_float(1, 0.0)
var int[] lastTradeDayArray = array.new_int(1, na)

// Function to update the daily loss
updateDailyLoss() =>
    _dailyLoss = array.get(dailyLossArray, 0)
    _lastTradeDay = array.get(lastTradeDayArray, 0)
    if na(_lastTradeDay) or dayofmonth != _lastTradeDay
        _dailyLoss := 0.0
        array.set(lastTradeDayArray, 0, dayofmonth)
    if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1))
        _dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1)
    array.set(dailyLossArray, 0, _dailyLoss)

// Call the function to update the daily loss
updateDailyLoss()

// Execute Strategy
if longCondition and longEntryAllowed
    strategy.entry('Long', strategy.long)
    strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong)
    longEntryAllowed := false

if shortCondition and shortEntryAllowed
    strategy.entry('Short', strategy.short)
    strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort)
    shortEntryAllowed := false

// Reset entry control variables on position close
if strategy.position_size == 0
    longEntryAllowed := true
    shortEntryAllowed := true

// // Statistics
// winRate = strategy.wintrades / strategy.closedtrades * 100
// totalTrades = strategy.closedtrades
// averageProfit = strategy.grossprofit / strategy.wintrades
// averageLoss = strategy.grossloss / strategy.losstrades

// // Plotting
// plot(shortEma, color=color.new(color.red, 0), title='Short EMA')
// plot(longEma, color=color.new(color.blue, 0), title='Long EMA')

// // Display Table
// table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1)
// table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)