Стратегия EMA по перекрестному АРС - многомерный метод торговли на основе технических показателей с строгим управлением рисками

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

img

Обзор

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

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

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

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

  3. Временное окно торговли: стратегия позволяет пользователям устанавливать время начала и окончания ежедневной торговли.

  4. Динамическая стоп-лосс и Take-Profit: Стратегия динамически рассчитывает цены стоп-лосса и take-profits на основе средних самых высоких и самых низких цен последних N свечей, в сочетании с заранее установленным соотношением риск-вознаграждение. Это гарантирует, что риск-вознаграждение каждой сделки контролируется.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Руководство по оптимизации

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

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

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

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

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

Резюме

Стратегия 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)


Больше