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