
Эта стратегия основана на движущихся средних и динамических линиях сдерживания, что позволяет осуществлять многомерную двунаправленную торговлю. Она отслеживает, как цена прорывает верхнюю и нижнюю линии сдерживания, чтобы создать позицию, а когда цена снова падает ниже базовой средней. Эта стратегия применима к акциям и цифровым валютам с более выраженной тенденцией.
Во-первых, эта стратегия рассчитывает базовый средний уровень на основе типа и длины средней линии, выбранной пользователем.
Затем, исходя из процентных параметров, установленных пользователем, вычисляется верхняя и нижняя линия. Например, 5% означает, что цена колеблется ALLOWED_BRACKET105%, когда создается позиция. Количество линии может быть настроено.
В правилах выхода на рынок, если прорвать нижнюю линию, сделать больше; если прорвать верхнюю линию, сделать пустое. Правила очень просты и понятны.
В конце концов, когда цена опять опускается ниже средней отметки, все позиции выровняются. Это является точкой выхода из трендового отслеживания.
Следует отметить, что эта стратегия реализует разделение позиций. Если есть несколько линий, то средства распределяются пропорционально. Это позволяет избежать риска односторонней игры.
Основные преимущества этой стратегии:
Использование средней линии для определения направления тренда очень распространено, поэтому это эффективный способ.
Использование сетевых линий фильтрует часть шума, что позволяет избежать проблем с слишком чувствительной и вызывающей ненужные сделки. Разумная настройка параметров может значительно оптимизировать прибыльность стратегии.
Разделение позиций увеличивает стратегическую устойчивость. Даже если односторонний прорыв провалится, другие направления могут продолжать работать хорошо. Это оптимизирует общую доходность риска.
Разрешается настраивать количество средних и обшитых линий. Это увеличивает гибкость стратегии, и пользователь может настраивать параметры для разных сортов.
Основные риски этой стратегии заключаются в следующем:
Среднелинейная система не чувствительна к сигналам золотого креста. Если нет четкой тенденции, стратегия может пропустить часть возможностей.
Слишком широкая линия может увеличить количество сделок и риск проскальзывания. Слишком узкая линия может пропустить большие события. Чтобы найти равновесную точку, необходимо провести полное тестирование.
В условиях шока эта стратегия может иметь более высокую вероятность подключения. Поэтому выбор сортов предпочтительнее, чем тенденции.
Если вы хотите получить только односторонний риск, вам потребуется дополнительная оптимизация.
Эта стратегия может быть оптимизирована в следующих направлениях:
Замена других показателей для принятия решения о строительстве складов и складов. Например, показатель KDJ и т. Д. Или в сочетании с несколькими показателями для установления фильтрующих условий.
Добавление логики стоп-стоп-лосс. Это позволяет блокировать часть прибыли и активно избегать части риска.
Оптимизируйте параметры, чтобы найти оптимальную комбинацию средней и окружной линий. Для этого требуется полное отслеживание и оптимизация, чтобы найти оптимальную пару параметров.
Оптимизация интеллектуальных параметров в сочетании с такими технологиями, как глубокое обучение. Постоянное изучение и обновление параметров параметров со временем.
Учитывая разновидности и различия рынка, можно установить множество параметров для различных торговых условий. Это значительно повысит стабильность стратегии.
Эта динамическая пакетовая сетевая однородная стратегия в целом очень подходит для трендовых торгов. Она проста и эффективна, ее легко понять и оптимизировать. Как основная стратегия, она очень пластична и масштабируема.
/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Envelope Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, pyramiding = 5, commission_type=strategy.commission.percent, commission_value=0.0)
// CopyRight Crypto Robot
src = input(ohlc4, title="Source", group = "Base MA")
ma_base_window = input.int(5, "Base Mooving Average Window", step = 1, group = "Base MA")
ma_type = input.string(defval='1. SMA', options=['1. SMA', '2. PCMA', '3. EMA', '4. WMA', '5. DEMA', '6. ZLEMA', '7. HMA'], title='MA Type', group = "Base MA")
envelope_1_pct = input.float(0.05, "Envelope 1", step = 0.01, group = "Envelopes")
envelope_2_pct = input.float(0.10, "Envelope 2", step = 0.01, group = "Envelopes")
envelope_3_pct = input.float(0.15, "Envelope 3", step = 0.01, group = "Envelopes")
envelope_4_pct = input.float(0.0, "Envelope 4", step = 0.01, group = "Envelopes")
envelope_5_pct = input.float(0.0, "Envelope 5", step = 0.01, group = "Envelopes")
use_longs = input.bool(true, 'Long Positions')
use_short = input.bool(true, 'Short Positions')
total_envelope = 0
if envelope_1_pct > 0
total_envelope := total_envelope + 1
if envelope_2_pct > 0
total_envelope := total_envelope + 1
if envelope_3_pct > 0
total_envelope := total_envelope + 1
if envelope_4_pct > 0
total_envelope := total_envelope + 1
if envelope_5_pct > 0
total_envelope := total_envelope + 1
// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_function(MA_type, MA_length) =>
zlema_lag = (MA_length - 1) / 2
hma_src = MA_type == '7. HMA' ? 2 * ta.wma(src, math.floor(MA_length / 2)) - ta.wma(src, MA_length) : na
MA_type == '1. SMA' ? ta.sma(src, MA_length) : MA_type == '2. PCMA' ? (ta.highest(high, MA_length) + ta.lowest(low, MA_length)) / 2 : MA_type == '3. EMA' ? ta.ema(src, MA_length) : MA_type == '4. WMA' ? ta.wma(src, MA_length) : MA_type == '5. DEMA' ? 2 * ta.ema(src, MA_length) - ta.ema(ta.ema(src, MA_length), MA_length) : MA_type == '6. ZLEMA' ? ta.ema(src + src - src[zlema_lag], MA_length) : MA_type == '7. HMA' ? ta.wma(hma_src, math.floor(math.sqrt(MA_length))) : na
ma_base = ma_function(ma_type, ma_base_window)
ma_high_1 = envelope_1_pct > 0 ? ma_base * (1 + envelope_1_pct) : na
ma_high_2 = envelope_2_pct > 0 ? ma_base * (1 + envelope_2_pct) : na
ma_high_3 = envelope_3_pct > 0 ? ma_base * (1 + envelope_3_pct) : na
ma_high_4 = envelope_4_pct > 0 ? ma_base * (1 + envelope_4_pct) : na
ma_high_5 = envelope_5_pct > 0 ? ma_base * (1 + envelope_5_pct) : na
ma_low_1 = envelope_1_pct > 0 ? ma_base * (1 - envelope_1_pct) : na
ma_low_2 = envelope_2_pct > 0 ? ma_base * (1 - envelope_2_pct) : na
ma_low_3 = envelope_3_pct > 0 ? ma_base * (1 - envelope_3_pct) : na
ma_low_4 = envelope_4_pct > 0 ? ma_base * (1 - envelope_4_pct) : na
ma_low_5 = envelope_5_pct > 0 ? ma_base * (1 - envelope_5_pct) : na
// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
if envelope_1_pct > 0 and strategy.opentrades < 1
strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / total_envelope))
if envelope_2_pct > 0 and strategy.opentrades < 2
strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / total_envelope))
if envelope_3_pct > 0 and strategy.opentrades < 3
strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / total_envelope))
if envelope_4_pct > 0 and strategy.opentrades < 4
strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / total_envelope))
if envelope_5_pct > 0 and strategy.opentrades < 5
strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / total_envelope))
if use_short
if envelope_1_pct > 0 and strategy.opentrades < 1
strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / total_envelope))
if envelope_2_pct > 0 and strategy.opentrades < 2
strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / total_envelope))
if envelope_3_pct > 0 and strategy.opentrades < 3
strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / total_envelope))
if envelope_4_pct > 0 and strategy.opentrades < 4
strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / total_envelope))
if envelope_5_pct > 0 and strategy.opentrades < 5
strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / total_envelope))
strategy.exit('close', limit=ma_base)
// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)
ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)
ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)
plot(ohlc4, color=color.purple)
// use_period = input.bool(false, "Période spécifique ?", group="periode")
// startDate = input.time(timestamp("01 Jan 2020"), "Date de début", group="periode")
// endDate = input.time(timestamp("01 Jan 2025"), "Date de fin", group="periode")
//------------------------------------------
//-------------Indicateurs------------------
// inDateRange = use_period ? ((time >= startDate) and (time < endDate)) : true
// //--------------Backtest-------------------
// strategy_pnl = strategy.netprofit + strategy.openprofit
// bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100
// float bnh_start_bar = na
// bnh_start_bar := na(bnh_start_bar[1]) or inDateRange != true? close : bnh_start_bar[1]
// float bnl_buy_hold_equity = na
// bnl_buy_hold_equity := inDateRange == true ? ((close - bnh_start_bar)/bnh_start_bar) * 100 : bnl_buy_hold_equity[1]
// bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity
// bnh_diff_color = bnh_vs_diff > 0 ? color.new(color.green, inDateRange ? 60 : 100) : color.new(color.red, inDateRange ? 60 : 100)
// var Table = table.new(position.top_right, columns = 2, rows = 4, border_width = 1, bgcolor = color.black, border_color = color.gray)
// table.cell(table_id = Table, column = 0, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Buy & hold profit")
// table.cell(table_id = Table, column = 1, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnl_buy_hold_equity, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Strategy profit")
// table.cell(table_id = Table, column = 1, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnh_strategy_pnl_pcnt, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 2, text_color=color.yellow, text_size = size.normal, text = "Date de début")
// table.cell(table_id = Table, column = 1, row = 2, text_color=color.yellow, text_size = size.normal, text = str.format("{0,date,dd-MM-YYYY}",strategy.closedtrades.entry_time(1)))