АДР - это квантовая стратегия торговли, основанная на платформе TradingView, которая сочетает в себе несколько технических индикаторов для определения тренда, фильтрации сигналов и установки стоп-лосса. Стратегия использует движущиеся средние индикаторов (EMA) двух различных циклов для выявления основных тенденций, использует средний реальный диапазон (ATR) в качестве фильтра волатильности и устанавливает стоп-лосс в зависимости от риска. Кроме того, стратегия также вводит такие меры контроля, как торговое время окна, баланс прибыли и убытка, максимальный суточный убыток, чтобы строго контролировать снижающийся риск, одновременно захватывая тенденционные возможности.
Двойная сходная линия пересечения: стратегия использует две различные циклические линии ЭМА для определения тенденции. Когда короткая ЭМА пересекает длинную ЭМА, это означает, что тенденция растет, что дает больше сигналов; наоборот, когда короткая ЭМА пересекает длинную ЭМА, это означает, что тенденция снижается, что дает больше сигналов.
ADR-фильтр волатильности: для того, чтобы избежать создания торговых сигналов в условиях низкой волатильности, стратегия вводит индикаторы ADR в качестве фильтров волатильности. Открытие позиций разрешается только тогда, когда ADR выше установленного минимального порога.
Трейдинговое время окна: эта политика позволяет пользователю установить время начала и окончания ежедневных сделок. Торговля будет выполняться только в течение указанного времени окна. Это помогает избежать периодов с низкой или более высокой волатильностью.
Динамическая стоп-стоп-потеря: стратегия динамически рассчитывает стоп-стоп и стоп-потерю на основе среднего максимума и минимума на последней линии N-корень K и в сочетании с предопределенным рисковым коэффициентом возврата. Это гарантирует, что риск возврата на каждую сделку контролируемый.
Прибыльно-убыточный баланс: после достижения определенного уровня прибыли (пользователь может настроить рисковое-возвратное соотношение), стратегия переносит стоп-потери на цену открытия, т.е. на прибыльно-убыточный баланс. Это помогает защитить уже полученную прибыль.
Максимальный дневный лимит потери: для контроля за максимальным дневным лимитом потери стратегия устанавливает лимит потери в день. Как только этот лимит достигается, стратегия прекращает торговлю до следующего дня.
Закрытие ликвидации: независимо от того, касается ли позиция линии остановки или остановки, стратегия будет ликвидировать все позиции в фиксированное время каждого торгового дня (например, 16:00), избегая риска ночи.
Сильная способность отслеживать тенденции: с помощью перекрестных двойных уравнительных линий можно определить тенденции, эффективно улавливая основные тенденции на рынке, что повышает шансы на победу и потенциал прибыли стратегии.
Хорошая адаптивность волатильности: внедрение показателей ADR в качестве фильтра волатильности позволяет избежать частых сделок в условиях низкой волатильности и уменьшить потери, связанные с недействительными сигналами и ложными прорывами.
Строгий контроль рисков: стратегия устанавливает меры контроля рисков из нескольких измерений, включая динамические остановки, баланс прибыли и убытков, максимальные суточные ограничения на убытки и т. д., которые эффективно контролируют снижающийся риск стратегии и повышают риск-адаптированную прибыль.
Параметры гибко настраиваются: параметры стратегии, такие как средний цикл, длина ADR, риск-реванш, торговое время окна и т. д., могут быть гибко настроены в соответствии с предпочтениями пользователей и характеристиками рынка, что оптимизирует эффективность стратегии.
Высокая степень автоматизации: стратегия основана на платформе TradingView, логика торговли выполняется полностью автоматически программой, уменьшая вмешательство человеческих эмоций и субъективных суждений, что способствует долгосрочному стабильному функционированию стратегии.
Риск оптимизации параметров: хотя параметры стратегии могут быть гибко изменены, если они будут переоптимизированы, это может привести к чрезмерному приспособлению и плохому результату вне выборки. Поэтому, когда параметры устанавливаются, необходимо провести достаточное повторное тестирование и анализ, чтобы обеспечить надежность стратегии.
Риск внезапных событий: стратегия основана на торговле техническими показателями, которые могут быть недостаточно реагирующими на некоторые внезапные важные фундаментальные события, такие как изменения в политике, значительные колебания в экономических данных и т. д., что может привести к более крупным отступлениям.
Риск перелома тренда: в критические периоды перелома тренда могут возникнуть задержки в сигнале двустороннего скрещивания, что может привести к тому, что стратегия пропустит оптимальное время размещения позиций или понесет убытки в начале перелома тренда.
Риск ликвидности: несмотря на то, что стратегия устанавливает окно времени торговли, если индикатор торговли имеет плохую ликвидность, может возникнуть риск скольжения, задержки торговли и т. д., что может повлиять на эффективность стратегии.
Риск неэффективности технических показателей: стратегия сильно зависит от технических показателей, эффективность стратегии может снизиться, если произойдет значительное изменение рыночной среды, которое приведет к тому, что показатели потеряют свое первоначальное индикативное значение.
Внедрение более многомерных индикаторов: на основе существующих двойных габаритов и ADR можно рассмотреть возможность внедрения более эффективных технических индикаторов, таких как MACD, RSI и т.д., для повышения надежности и стабильности сигналов.
Параметры динамической оптимизации: может быть создан набор механизмов оптимизации параметров, которые в зависимости от различных состояний рынка (например, трендовых, бурностей и т. д.) динамически корректируют ключевые параметры стратегии, чтобы адаптироваться к изменениям рынка.
Включение фундаментальных факторов: надлежащее рассмотрение некоторых важных фундаментальных показателей, таких как экономические данные, политические тенденции и т. д., помогает стратегии лучше понять рыночные тенденции и своевременно избежать системных рисков.
Улучшенные механизмы сдерживания потерь: на основе существующих динамических сдерживаний потерь логику сдерживания потерь можно еще больше оптимизировать, например, путем внедрения методов отслеживания сдерживания потерь, частичного сдерживания потерь и т. д. для лучшей защиты прибыли и контроля риска.
Многобазовый, многочасовой: расширение стратегии на несколько баз и на несколько временных циклов, повышение адаптивности и стабильности стратегии путем дифференцированного инвестирования и оптимизации временных циклов.
Стратегия АДР - это количественная стратегия торговли, основанная на техническом анализе, которая определяет тенденции с помощью двойного горизонтального пересечения и использует индикаторы АДР для фильтрации волатильности. Стратегия также предусматривает строгие меры риска, включая динамические стоп-потери, балансирование прибыли и максимальные суточные потери, чтобы контролировать снижающиеся риски. Стратегия обладает преимуществами в сильной способности отслеживать тенденции, хорошей гибкости волатильности, строгому гибкому контролю риска, гибкости параметров, высокой степени автоматизации.
/*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)