Стратегия торговли парами скользящей средней полосы Боллинджера


Дата создания: 2023-11-24 15:32:57 Последнее изменение: 2023-11-24 15:32:57
Копировать: 0 Количество просмотров: 706
1
Подписаться
1617
Подписчики

Стратегия торговли парами скользящей средней полосы Боллинджера

Обзор

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

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

Стратегия основана на перекрестных сигналах, основанных на индикаторах пояса Бурин и движущихся средних линий. В частности, она использует одновременно среднюю полосу пояса Бурин, верхнюю полосу пояса Бурин и 7 движущихся средних длиной от 5 до 200 дней.

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

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )