Строго линейная стратегия ADR - сочетание многомерных технических показателей и строгих методов сдерживания потерь

Автор:Чао Чжан, Дата: 2024-03-28 16:46:29
Тэги:

ADR均线交叉策略 - 融合多维度技术指标和严格止盈止损的交易方法

Обзор

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

Принципы стратегии

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

  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. Многобазовый, многочасовой: расширение стратегии на несколько баз и на несколько временных циклов, повышение адаптивности и стабильности стратегии путем дифференцированного инвестирования и оптимизации временных циклов.

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

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


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


Больше информации