Двойное включение и стратегия тренда


Дата создания: 2024-01-30 15:11:48 Последнее изменение: 2024-01-30 15:11:48
Копировать: 1 Количество просмотров: 705
1
Подписаться
1617
Подписчики

Двойное включение и стратегия тренда

Обзор

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

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

  1. Вычислить Hull Moving Average как показатель тенденции.
  2. Когда возникает вторая инклюзивная форма, считается, что это высоковероятный торговый сигнал. Инклюзивная форма - это форма, в которой наивысшая цена первых двух K-линий и наименьшая цена, содержащиеся в третьей K-линии.
  3. Если цена закрытия находится выше движущейся средней и образует многоголовый инвентарь, то вблизи инвентарного максимума устанавливается ордер на остановку покупки; если цена закрытия находится ниже движущегося среднего и образует пустой инвентарь, то вблизи инвентарного минимума устанавливается ордер на остановку продажи.
  4. После того, как приостановка была активирована, приостановка и приостановка были установлены в соответствии с предварительной величиной и пропорцией приостановки.

Анализ преимуществ

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

Анализ рисков

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Kaspricci

//@version=5
strategy(
     title = "Double Inside Bar & Trend Strategy - Kaspricci", 
     shorttitle = "Double Inside Bar & Trend", 
     overlay=true, 
     initial_capital = 100000, 
     currency = currency.USD, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, 
     calc_on_every_tick = true, 
     close_entries_rule = "ANY")

// ================================================ Entry Inputs ======================================================================
headlineEntry   = "Entry Seettings"

maSource        = input.source(defval = close,             group = headlineEntry, title = "MA Source")
maType          = input.string(defval = "HMA",             group = headlineEntry, title = "MA Type", options = ["EMA", "HMA", "SMA", "SWMA", "VWMA", "WMA"])
maLength        = input.int(   defval = 45,    minval = 1, group = headlineEntry, title = "HMA Length")

float ma = switch maType 
    "EMA"  => ta.ema(maSource,  maLength)
    "HMA"  => ta.hma(maSource,  maLength)
    "SMA"  => ta.sma(maSource,  maLength)
    "SWMA" => ta.swma(maSource)
    "VWMA" => ta.vwma(maSource, maLength)
    "WMA"  => ta.wma(maSource,  maLength)

plot(ma, "Trend MA", color.purple)

// ================================================ Trade Inputs ======================================================================
headlineTrade   = "Trade Seettings"

stopLossType    = input.string(defval = "ATR",                         group = headlineTrade,                 title = "Stop Loss Type",            options = ["ATR", "FIX"])
atrLength       = input.int(   defval = 50,   minval = 1,              group = headlineTrade, inline = "ATR", title = "   ATR: Length                 ")
atrFactor       = input.float( defval =  2.5, minval = 0, step = 0.05, group = headlineTrade, inline = "ATR", title = "Factor       ",             tooltip = "multiplier for ATR value")
takeProfitRatio = input.float( defval =  2.0, minval = 0, step = 0.05, group = headlineTrade,                 title = "            TP Ration",     tooltip = "Multiplier for Take Profit calculation")
fixStopLoss     = input.float( defval = 10.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "   FIX: Stop Loss             ") * 10 // need this in ticks
fixTakeProfit   = input.float( defval = 20.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "Take Profit",               tooltip = "in pips") * 10 // need this in ticks
useRiskMagmt    = input.bool(  defval = true,                          group = headlineTrade, inline = "RM",  title = "")
riskPercent     = input.float( defval = 1.0,  minval = 0., step = 0.5, group = headlineTrade, inline = "RM",  title = "Risk in %                ", tooltip = "This will overwrite quantity from startegy settings and calculate the trade size based on stop loss and risk percent") / 100

// ================================================ Filter Inputs =====================================================================
headlineFilter  = "Filter Setings"

// date filter
filterDates     = input.bool(defval = false,                                 group = headlineFilter, title = "Filter trades by dates")
startDateTime   = input(defval = timestamp("2022-01-01T00:00:00+0000"), group = headlineFilter, title = "       Start Date & Time")
endDateTime     = input(defval = timestamp("2099-12-31T23:59:00+0000"), group = headlineFilter, title = "       End Date & Time  ")

dateFilter      = not filterDates or (time >= startDateTime and time <= endDateTime)

// session filter
filterSession   = input.bool(title = "Filter trades by session", defval = false, group = headlineFilter)
session         = input(title = "       Session", defval = "0045-2245", group = headlineFilter)

sessionFilter   = not filterSession or time(timeframe.period, session, timezone = "CET")

// ================================================ Trade Entries and Exits =====================================================================

// calculate stop loss
stopLoss        = switch stopLossType
    "ATR" => nz(math.round(ta.atr(atrLength) * atrFactor / syminfo.mintick, 0), 0)
    "FIX" => fixStopLoss

// calculate take profit
takeProfit      = switch stopLossType
    "ATR" => math.round(stopLoss * takeProfitRatio, 0)
    "FIX" => fixTakeProfit


doubleInsideBar = high[2] > high[1] and high[2] > high[0] and low[2] < low[1] and low[2] < low[0]

// highlight mother candel and inside bar candles
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -1)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -2)

var float buyStopPrice  = na
var float sellStopPrice = na

if (strategy.opentrades == 0 and doubleInsideBar and barstate.isconfirmed)
    buyStopPrice  := high[0] // high of recent candle (second inside bar)
    sellStopPrice := low[0] // low of recent candle (second inside bar)

    tradeID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)

    quantity = useRiskMagmt ? math.round(strategy.equity * riskPercent / stopLoss, 2) / syminfo.mintick : na

    commentTemplate = "{0} QTY: {1,number,#.##} SL: {2} TP: {3}"

    if (close > ma)
        longComment = str.format(commentTemplate, tradeID + "L", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "L", strategy.long, qty = quantity, stop = buyStopPrice, comment = longComment)
        strategy.exit(tradeID + "SL", tradeID + "L", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

    if (close < ma)
        shortComment = str.format(commentTemplate, tradeID + "S", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "S", strategy.short, qty = quantity, stop = sellStopPrice, comment = shortComment)
        strategy.exit(tradeID + "SL", tradeID + "S", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

// as soon as the first pending order has been entered the remaing pending order shall be cancelled 
if strategy.opentrades > 0
    currentTradeID = str.tostring(strategy.closedtrades + strategy.opentrades)
    strategy.cancel(currentTradeID + "S")
    strategy.cancel(currentTradeID + "L")