Оптимизированная для нескольких индикаторов торговая система стратегии пересечения тренда KDJ, основанная на динамических случайных моделях

KDJ RSV SL TP ATR
Дата создания: 2025-01-06 16:23:38 Последнее изменение: 2025-01-06 16:23:38
Копировать: 1 Количество просмотров: 500
1
Подписаться
1617
Подписчики

Оптимизированная для нескольких индикаторов торговая система стратегии пересечения тренда KDJ, основанная на динамических случайных моделях

Обзор

Эта стратегия представляет собой усовершенствованную торговую систему, основанную на индикаторе KDJ, который фиксирует рыночные тенденции путем проведения глубокого анализа моделей пересечения линий K, D и J. Стратегия интегрирует специальный алгоритм сглаживания BCWSMA и повышает надежность сигналов за счет оптимизации расчета стохастических индикаторов. Система использует строгие механизмы контроля рисков, включая функции стоп-лосса и скользящего стоп-лосса, для достижения надежного управления фондами.

Стратегический принцип

Основная логика стратегии основана на следующих ключевых элементах:

  1. Индикатор KDJ рассчитывается с использованием специального алгоритма BCWSMA (взвешенная скользящая средняя), что повышает плавность и стабильность индикатора.
  2. При расчете RSV (неспелого случайного значения) цена преобразуется в значение в диапазоне от 0 до 100, чтобы лучше отразить положение цены между максимальной и минимальной точками.
  3. Разработан уникальный механизм перекрестной проверки J-линии и J5-линии (производный индикатор) для повышения точности торговых сигналов за счет множественных подтверждений.
  4. Был создан механизм подтверждения тренда, основанный на непрерывности, согласно которому для подтверждения обоснованности тренда линия J должна оставаться выше линии D в течение трех последовательных дней.
  5. Комплексная система контроля рисков, которая объединяет процентный стоп-лосс и скользящий стоп-лосс

Стратегические преимущества

  1. Расширенный механизм генерации сигналов: благодаря перекрестной проверке нескольких технических индикаторов влияние ложных сигналов значительно снижается.
  2. Идеальный контроль риска: внедрение многоуровневого механизма контроля риска, включая фиксированный стоп-лосс и подвижный стоп-лосс, для эффективного контроля риска убытков
  3. Широкие возможности настройки параметров: ключевые параметры, такие как цикл KDJ, коэффициент сглаживания сигнала и т. д., можно гибко настраивать в соответствии с рыночными условиями.
  4. Высокая вычислительная эффективность: использование оптимизированного алгоритма BCWSMA снижает вычислительную сложность и повышает эффективность выполнения стратегии.
  5. Хорошая адаптивность: может адаптироваться к различным рыночным условиям и оптимизировать эффективность стратегии за счет корректировки параметров

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

  1. Риск нестабильного рынка: на нестабильном рынке могут возникать частые ложные сигналы прорыва, что увеличивает транзакционные издержки.
  2. Риск запаздывания: из-за использования сглаживания скользящей средней сигнал может запаздывать в определенной степени.
  3. Чувствительность параметра: Эффект стратегии чувствителен к настройке параметра. Неправильная настройка параметра может значительно снизить эффект стратегии.
  4. Зависимость от рыночной среды: в определенных рыночных условиях эффективность стратегии может быть неидеальной.

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

  1. Оптимизация механизма фильтрации сигналов: для повышения надежности сигналов можно ввести вспомогательные индикаторы, такие как объем торгов и волатильность.
  2. Динамическая настройка параметров: динамическая настройка параметров KDJ и параметров стоп-лосса в соответствии с колебаниями рынка.
  3. Определение рыночной среды: добавьте модуль оценки рыночной среды, чтобы применять различные торговые стратегии в различных рыночных средах.
  4. Улучшенный контроль рисков: могут быть добавлены дополнительные меры контроля рисков, такие как контроль максимальной просадки и ограничение времени удержания позиции.
  5. Оптимизация производительности: дальнейшая оптимизация алгоритма BCWSMA для повышения эффективности вычислений.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2024-01-06 00:00:00
end: 2025-01-05 00:00:00
period: 4h
basePeriod: 4h
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/
// © hexu90

//@version=6

// Date Range
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
     group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2020"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
backtestEndDate = input(timestamp("15 Dec 2024"),
     title="End Date", group="Backtest Time Period",
     tooltip="This end date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true

//KDJ strategy
// indicator("My Customized KDJ", shorttitle="KDJ")
strategy("My KDJ Strategy", overlay = false)

// Input parameters
ilong = input(90, title="Period")
k_isig = input(3, title="K Signal")
d_isig = input(30, title="D Signal")

// Custom BCWSMA calculation outside the function
bcwsma(source, length, weight) =>
    var float prev = na  // Persistent variable to store the previous value
    if na(prev)
        prev := source  // Initialize on the first run
    prev := (weight * source + (length - weight) * prev) / length
    prev

// Calculate KDJ
c = close
h = ta.highest(high, ilong)
l = ta.lowest(low, ilong)
RSV = 100 * ((c - l) / (h - l))
pK = bcwsma(RSV, k_isig, 1)
pD = bcwsma(pK, d_isig, 1)
pJ = 3 * pK - 2 * pD

pJ1 = 0
pJ2 = 80
pJ5 = (pJ-pK)-(pK-pD)

// Plot the K, D, J lines with colors
plot(pK, color=color.rgb(251, 121, 8), title="K Line")  // Orange
plot(pD, color=color.rgb(30, 0, 255), title="D Line")  // Blue
plot(pJ, color=color.new(color.rgb(251, 0, 255), 10), title="J Line")  // Pink with transparency
plot(pJ5, color=#6f03f3e6, title="J Line")  // Pink with transparency

// Background color and reference lines
// bgcolor(pJ > pD ? color.new(color.green, 75) : color.new(color.red, 75))
// hline(80, "Upper Band", color=color.gray)
// hline(20, "Lower Band", color=color.gray)

// Variables to track the conditions
var bool condition1_met = false
var int condition2_met = 0

// Condition 1: pJ drops below pJ5
if ta.crossunder(pJ, pJ5)
    condition1_met := true
    condition2_met := 0  // Reset condition 2 if pJ drops below pJ5 again

if ta.crossover(pJ, pD)
    condition2_met += 1

to_long = ta.crossover(pJ, pD)


var int consecutiveDays = 0
// Update the count of consecutive days
if pJ > pD
    consecutiveDays += 1
else
    consecutiveDays := 0

// Check if pJ has been above pD for more than 3 days
consPJacrossPD = false
if consecutiveDays > 3
    consPJacrossPD := true

// Entry condition: After condition 2, pJ crosses above pD a second time
// if condition1_met and condition2_met > 1
//     strategy.entry("golden", strategy.long, qty=1000)
//     condition1_met := false  // Reset the conditions for a new cycle
//     condition2_met = 0
// 
if ta.crossover(pJ, pD) 
    // and pD < 40 and consPJacrossPD
    // consecutiveDays == 1
    //  consecutiveDays == 3 and
    strategy.entry("golden", strategy.long, qty=1)

// to_short = 
// or ta.crossunder(pJ, 100)

// Exit condition
if ta.crossover(pD, pJ)
    strategy.close("golden", qty = 1)

// Stop loss and trailing profit
trail_stop_pct = input.float(0.5, title="Trailing Stop activation (%)", group="Exit Lonng", inline="LTS", tooltip="Trailing Treshold %")
trail_offset_pct = input.float(0.5, title="Trailing Offset (%)", group="Exit Lonng", inline="LTS", tooltip="Trailing Offset %")
trail_stop_tick = trail_stop_pct * close/100
trail_offset_tick = trail_offset_pct * close/100

sl_pct = input.float(5, title="Stop Loss", group="SL and TP", inline="LSLTP")
// tp_pct = input.float(9, title="Take Profit", group="SL and TP", inline="LSLTP")

long_sl_price = strategy.position_avg_price * (1 - sl_pct/100)
// long_tp_price = strategy.position_avg_price * (1 + tp_pct/100)

strategy.exit('golden Exit', 'golden', stop = long_sl_price)
// trail_points = trail_stop_tick, trail_offset=trail_offset_tick