В процессе загрузки ресурсов... загрузка...

Кроссоверная длиннокороткая стратегия SMA с контролем пикового забора и автоматическим завершением

Автор:Чао Чжан, Дата: 2024-07-29 14:16:58
Тэги:SMA

img

Обзор

Эта стратегия представляет собой длинно-короткую торговую систему, которая сочетает в себе перекрестные сигналы простой скользящей средней (SMA) с контролем пикового снижения. Она использует перекрестный сход 14-периодных и 28-периодных SMA для генерации длинных и коротких торговых сигналов при одновременном мониторинге пикового снижения стратегии. Когда снижение превышает заданный порог, стратегия автоматически прекращает торговлю. Кроме того, стратегия включает в себя подробную функцию анализа цикла от пика до минимума, чтобы помочь трейдерам лучше понять характеристики риска стратегии.

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

  1. Производство торговых сигналов:

    • Длинный сигнал генерируется, когда 14-периодная SMA пересекает 28-периодную SMA.
    • Короткий сигнал генерируется, когда 14-периодная SMA пересекает 28-периодную SMA.
  2. Контроль пикового снижения:

    • Отслеживание кривой собственного капитала стратегии в режиме реального времени с учетом исторических максимумов (пиков).
    • Когда текущий капитал опускается ниже пика, он вступает в состояние снижения, регистрируя самую низкую точку.
    • Процент привлечения рассчитывается как: (пик - порог) / пик * 100%.
    • Если процент привлечения превышает заранее установленный максимальный порог привлечения, стратегия прекращает открывать новые позиции.
  3. Анализ цикла от пика до конца:

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

Преимущества стратегии

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

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

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

  4. Автоматизированный контроль рисков: При превышении установленного порогового значения, стратегия автоматически прекращает торговлю.

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

Стратегические риски

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

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

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

  4. Чувствительность параметров: Результативность стратегии сильно зависит от выбора периодов SMA и порогов привлечения. Неправильное настройка параметров может привести к не оптимальным результатам.

  5. Пропущенные возможности для перемен: Когда торговля прекращается после достижения максимального порогового уровня, стратегия может упустить возможности, предоставленные рыночными переломами.

Направления оптимизации стратегии

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

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

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

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

  5. Оптимизируйте управление деньгами: Внедрение динамического размещения позиций на основе размера счета и волатильности рынка для лучшего контроля рисков.

  6. Введение алгоритмов машинного обучения: Использование методов машинного обучения для оптимизации процессов выбора параметров и генерации сигналов, повышения адаптивности и точности стратегии.

Заключение

Кроссоверная длинно-короткая стратегия 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)



Связанные

Больше