Динамическая позиция трейлинг-стоп-лосс стратегия коррекции SMA пересечения

SMA MA RRR TP SL
Дата создания: 2025-02-21 13:51:50 Последнее изменение: 2025-02-21 13:51:50
Копировать: 0 Количество просмотров: 338
2
Подписаться
319
Подписчики

Динамическая позиция трейлинг-стоп-лосс стратегия коррекции SMA пересечения Динамическая позиция трейлинг-стоп-лосс стратегия коррекции SMA пересечения

Обзор

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

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

Стратегия основана на следующих ключевых принципах:

  1. Входные сигналы, основанные на перекрестке цены с 50-дневным средним значением, а также ссылаясь на относительное местоположение 50-дневного среднего значения и 200-дневного среднего значения, определяют большую тенденцию
  2. При прорыве цены в направлении ниже средней линии вызывается сигнал плюс; наоборот, вызывается сигнал пустоты
  3. Управление позициями использует механизм динамической корректировки, увеличивая количество позиций, когда прибыль счета превышает 4000
  4. Стоп-потеря использует механизм отслеживания стоп-потеря, динамически корректирующий стоп-позицию по мере увеличения прибыли
  5. Риск-прибыль соотношение устанавливается на 1: 2,5, гарантируя, что ожидаемая прибыль от каждой сделки превышает риск

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

  1. Ясная логика торговли в сочетании с техническими показателями и ценовым поведением определяет время входа в рынок
  2. Применение динамического управления позициями позволяет увеличить объем торгов и повысить эффективность использования средств при прибыли
  3. Механизмы хранения убытков позволяют эффективно блокировать прибыль и избежать резкого вывода
  4. Установлен фильтр времени торговли, который работает только в основные торговые часы, чтобы избежать риска в периоды низкой ликвидности
  5. Существуют эффективные механизмы управления рисками, включая управление позициями, целями по уменьшению убытков и прибыли

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

  1. Возможность частого запуска ложных сигналов прорыва на колеблющихся рынках, что приводит к последовательным остановкам
  2. Динамическое управление позициями может привести к большим потерям в случае резкого изменения рынка
  3. Система, опирающаяся на равнолинейную систему, может отставать в быстро меняющихся рынках
  4. Фиксированный риск-прибыль может упустить некоторые потенциальные возможности для больших тенденций
  5. Ограничения на время торговли могут упустить некоторые важные рыночные возможности.

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

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

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

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

Исходный код стратегии
/*backtest
start: 2024-02-22 00:00:00
end: 2025-02-19 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("15m - Rebound 50SMA with Dynamic Lots & Trailing Stop, RRR 2:1, Date Filter (Closed Bars Only)", 
     overlay=true, 
     initial_capital=50000, 
     default_qty_type=strategy.fixed, 
     default_qty_value=1, 
     pyramiding=0, 
     calc_on_order_fills=true)

// ===== INPUTS =====
sma50Period  = input.int(50, "50 SMA Period", minval=1)
sma200Period = input.int(200, "200 SMA Period", minval=1)

// ===== CALCULATE SMAs =====
sma50  = ta.sma(close, sma50Period)
sma200 = ta.sma(close, sma200Period)

// ===== PLOT SMAs =====
plot(sma50, color=color.red, title="50 SMA")
plot(sma200, color=color.blue, title="200 SMA")

// ===== DEFINE TRADING SESSIONS =====
// Trading is allowed 15 minutes after market open:
//   - New York: 09:45–16:00 (America/New_York)
//   - London:   08:15–16:00 (Europe/London)
nySession     = not na(time("15", "0945-1600", "America/New_York"))
londonSession = not na(time("15", "0815-1600", "Europe/London"))
inSession     = nySession or londonSession

// ===== DEFINE DATE RANGE =====
// Only allow orders on or after January 1, 2024.
// (We include seconds in the timestamp for proper parsing.)
startDate   = timestamp("UTC", 2024, 1, 1, 0, 0, 0)
inDateRange = time >= startDate

// ===== DEFINE ENTRY CONDITIONS =====
// ----- LONG ENTRY CONDITION -----
// A long entry is triggered when:
//   - The previous candle closed below the 50 SMA and the current candle closes above it,
//   - And the 50 SMA is above the 200 SMA.
longCondition = (close[1] < sma50[1]) and (close > sma50) and (sma50 > sma200)

// ----- SHORT ENTRY CONDITION -----
// A short entry is triggered when:
//   - The previous candle closed above the 50 SMA and the current candle closes below it,
//   - And the 50 SMA is below the 200 SMA.
shortCondition = (close[1] > sma50[1]) and (close < sma50) and (sma50 < sma200)

// ===== DEBUG PLOTS =====
plotshape(longCondition and barstate.isconfirmed, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.tiny)
plotshape(shortCondition and barstate.isconfirmed, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.tiny)

// ===== VARIABLES FOR STOP LOSS MANAGEMENT =====
// For long positions.
var float initialLongStop = na   // Set at entry: low of the rebound candle.
var float trailStopLong   = na   // Updated trailing stop for long.
// For short positions.
var float initialShortStop = na  // Set at entry: high of the rebound candle.
var float trailStopShort   = na  // Updated trailing stop for short.

// ===== DYNAMIC LOT SIZE =====
// If current profit (strategy.equity - 50000) exceeds 4000, lot size becomes 3; otherwise, 2.
lotSize = (strategy.equity - 50000 > 4000) ? 3 : 2

// ===== ENTRY LOGIC (EXECUTED ON CONFIRMED BARS) =====
if barstate.isconfirmed and inSession and inDateRange and longCondition and strategy.position_size <= 0
    initialLongStop := low
    trailStopLong   := initialLongStop
    if strategy.position_size < 0
        strategy.close("Short", comment="Close Short before Long")
    // Submit a market order entry (no offset).
    strategy.entry("Long", strategy.long, qty=lotSize, comment="Enter Long")
    
if barstate.isconfirmed and inSession and inDateRange and shortCondition and strategy.position_size >= 0
    initialShortStop := high
    trailStopShort   := initialShortStop
    if strategy.position_size > 0
        strategy.close("Long", comment="Close Long before Short")
    // Submit a market order entry (no offset).
    strategy.entry("Short", strategy.short, qty=lotSize, comment="Enter Short")
    
// ===== TRAILING STOP LOGIC & EXIT ORDERS (ON CLOSED BARS) =====

if barstate.isconfirmed and strategy.position_size > 0
    // For Long Positions:
    floatingProfitLong = (close - strategy.position_avg_price) / syminfo.mintick
    newTrailLong = trailStopLong  // Default: no change.
    if floatingProfitLong >= 20 and floatingProfitLong < 30
        newTrailLong := initialLongStop + 5 * syminfo.mintick
    else if floatingProfitLong >= 31 and floatingProfitLong < 40
        newTrailLong := initialLongStop + 10 * syminfo.mintick
    else if floatingProfitLong >= 41 and floatingProfitLong < 50
        newTrailLong := initialLongStop + 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopLong := math.max(trailStopLong, newTrailLong)
    
    longRisk = strategy.position_avg_price - trailStopLong
    tpLong   = strategy.position_avg_price + 2.5 * longRisk
    strategy.exit("Exit Long", from_entry="Long", stop=trailStopLong, limit=tpLong)

if barstate.isconfirmed and strategy.position_size < 0
    // For Short Positions:
    floatingProfitShort = (strategy.position_avg_price - close) / syminfo.mintick
    newTrailShort = trailStopShort  // Default: no change.
    if floatingProfitShort >= 20 and floatingProfitShort < 30
        newTrailShort := initialShortStop - 5 * syminfo.mintick
    else if floatingProfitShort >= 31 and floatingProfitShort < 40
        newTrailShort := initialShortStop - 10 * syminfo.mintick
    else if floatingProfitShort >= 41 and floatingProfitShort < 50
        newTrailShort := initialShortStop - 15 * syminfo.mintick
    // Update trailing stop only if the new value is more favorable.
    trailStopShort := math.min(trailStopShort, newTrailShort)
    
    shortRisk = trailStopShort - strategy.position_avg_price
    tpShort = strategy.position_avg_price - 2.5 * shortRisk
    strategy.exit("Exit Short", from_entry="Short", stop=trailStopShort, limit=tpShort)