
Эта стратегия представляет собой усовершенствованную торговую систему, основанную на индикаторе KDJ, который фиксирует рыночные тенденции путем проведения глубокого анализа моделей пересечения линий K, D и J. Стратегия интегрирует специальный алгоритм сглаживания 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