Эта стратегия представляет собой длинно-короткую торговую систему, которая сочетает в себе перекрестные сигналы простой скользящей средней (SMA) с контролем пикового снижения. Она использует перекрестный сход 14-периодных и 28-периодных SMA для генерации длинных и коротких торговых сигналов при одновременном мониторинге пикового снижения стратегии. Когда снижение превышает заданный порог, стратегия автоматически прекращает торговлю. Кроме того, стратегия включает в себя подробную функцию анализа цикла от пика до минимума, чтобы помочь трейдерам лучше понять характеристики риска стратегии.
Производство торговых сигналов:
Контроль пикового снижения:
Анализ цикла от пика до конца:
Сочетает в себе наблюдение за тенденциями и контроль рисков: Стратегия перекрестного использования SMA является классическим методом следования трендам, в то время как контроль пикового снижения обеспечивает дополнительный уровень управления рисками.
Высокая адаптивность: Благодаря параметризации максимальных и минимальных порогов привлечения, стратегия может быть гибко адаптирована к различным рыночным условиям и личным предпочтениям риска.
Прозрачные показатели риска: Анализ цикла от пика до минимума предоставляет подробную историческую информацию о снижении, что позволяет трейдерам интуитивно понять рисковые характеристики стратегии, что помогает принимать более обоснованные торговые решения.
Автоматизированный контроль рисков: При превышении установленного порогового значения, стратегия автоматически прекращает торговлю.
Всеобъемлющий анализ производительности: В дополнение к традиционным показателям обратного тестирования, стратегия предоставляет подробные данные о цикле от пика до минимума, включая проценты запуска, проценты снижения и информацию о времени, что облегчает углубленный анализ эффективности стратегии.
Чрезмерное упование на исторические данные: Стратегия перекрестного использования SMA основана на исторических данных о ценах и может медленно реагировать на быстро меняющиеся рынки, что приводит к ложным сигналам.
Частые сделки: На колеблющихся рынках SMA могут часто пересекаться, что приводит к чрезмерной торговле и высоким затратам на транзакции.
Потенциал больших вычетов: Несмотря на максимальное ограничение привлечения, одно крупное падение во время сильной волатильности рынка все равно может привести к значительным потерям.
Чувствительность параметров: Результативность стратегии сильно зависит от выбора периодов SMA и порогов привлечения. Неправильное настройка параметров может привести к не оптимальным результатам.
Пропущенные возможности для перемен: Когда торговля прекращается после достижения максимального порогового уровня, стратегия может упустить возможности, предоставленные рыночными переломами.
Введите динамическое регулирование параметров: Рассмотреть возможность динамической корректировки периодов SMA и порогов привлечения на основе волатильности рынка для адаптации к различным рыночным условиям.
Дополнительные рыночные фильтры: Включить другие технические показатели или фундаментальные факторы, такие как RSI или объем, для фильтрации потенциальных ложных сигналов.
Внедрить поэтапный въезд и выезд: Вместо операций "все или ничего", внедряйте поэтапное формирование позиций и закрытие, чтобы уменьшить риск единых решений.
Добавить механизм получения прибыли: В дополнение к контролю за вычетом, добавьте динамическую функцию получения прибыли, чтобы зафиксировать прибыль и улучшить общую доходность.
Оптимизируйте управление деньгами: Внедрение динамического размещения позиций на основе размера счета и волатильности рынка для лучшего контроля рисков.
Введение алгоритмов машинного обучения: Использование методов машинного обучения для оптимизации процессов выбора параметров и генерации сигналов, повышения адаптивности и точности стратегии.
Кроссоверная длинно-короткая стратегия SMA в сочетании с контролем пикового снижения и автоматическим прекращением является количественной торговой системой, которая балансирует тренд и управление рисками. Она улавливает рыночные тенденции с помощью простых перекрестных перемещений скользящих средних при одновременном управлении риском снижения с помощью контроля пикового снижения. Уникальная особенность стратегии заключается в ее подробном анализе цикла от пика до минимума, предоставляя трейдерам инструмент для глубокого понимания характеристик риска стратегии.
В то время как стратегия несет в себе некоторые риски, такие как чрезмерная зависимость от исторических данных и чувствительности параметров, она может значительно улучшить свою надежность и рентабельность посредством соответствующей оптимизации и улучшений.
В целом, эта стратегия предоставляет трейдерам хорошую отправной точку, которую можно дополнительно настроить и оптимизировать для достижения индивидуальных торговых целей и предпочтений риска.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 00:00:00 period: 1d basePeriod: 1h 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/ capital = 10000 //@version=5 strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100) // The code below is from Tradingwhale LLC /// ============================================================================== // Peak-Trough Cycles with Date and Prev. RunUp // Initialize variables showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?") min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.") maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.") var float equityPeak = na var float equityTrough = na var int cycleCount = 0 var bool inDrawdown = false var float initialCapital = capital var float prevTrough = initialCapital var float prevRunUp = na var bool useLighterGray = true var int lastYear = na // Variable to indicate whether the strategy should end var bool end_strategy = false // Table to display data var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1) // Function to convert float to percentage string f_to_percent(value) => str.tostring(value, "#.##") + "%" // Function to get month/year string without commas get_month_year_string() => str.tostring(year) + "/" + str.tostring(month) // Update the table headers if (bar_index == 0 and showTable) table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal) // Track peaks and troughs in equity if (na(equityPeak) or strategy.equity > equityPeak) if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage > min_trough cycleCount += 1 prevRunUp := (equityPeak - prevTrough) / prevTrough * 100 if cycleCount <= 20 and showTable currentYear = year if na(lastYear) or currentYear != lastYear useLighterGray := not useLighterGray lastYear := currentYear rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50) table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal) prevTrough := equityTrough equityPeak := strategy.equity equityTrough := na inDrawdown := false else if (strategy.equity < equityPeak) equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity) inDrawdown := true // Calculate if the strategy should end if not na(equityPeak) and not na(equityTrough) drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage >= maxdraw end_strategy := true // This code below is from Tradingview, but with additions where commented (see below) longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Long Entry Id", strategy.long) shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Short Entry Id", strategy.short)