Стратегия отмены эльтрутовых черепах

Автор:Чао Чжан, Дата: 2023-09-27 16:30:51
Тэги:

Обзор

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

Логика стратегии

  1. Используйте высоко-низкие прорывы для определения сигналов покупки и продажи.

  2. Индикатор Trendflex определяет направление основного тренда. Этот индикатор сочетает в себе методы двойного сглаживания и может эффективно идентифицировать средние секции тренда. Значение выше 1 указывает на восходящую тенденцию, в то время как значение ниже -1 указывает на нисходящую тенденцию. Здесь нам требуется Trendflex > 1 для длинных и < -1 для коротких, тем самым отфильтровывая состояния консолидации.

  3. Используйте полосы Боллинджера для определения диапазонов колебаний. Избегайте длинных и коротких, когда цена закрытия находится в диапазоне.

  4. Используйте движущиеся стоп-лосс и прибыль для управления позициями.

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

  1. В сочетании с методами двойного сглаживания можно эффективно определить направления тренда и избежать колебаний рынков.

  2. Учитывая как направление тренда, так и волатильность, торговые сигналы становятся более надежными.

  3. Разумные параметры "стоп-лосс" и "приобретение прибыли" блокируют прибыль и предотвращают увеличение потерь.

  4. Стратегия относительно проста и легко внедряется.

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

  1. Сигналы прорыва могут иметь ложные прорывы, что приводит к неправильным сделкам.

  2. Фиксированные параметры цикла не могут адаптироваться к изменениям рынка.

  3. Отсутствие ценовых остановок не может предотвратить огромные потери от экстремальных рыночных условий.

  4. Фиксированные точки получения прибыли и остановки потерь не могут быть разумно скорректированы в соответствии с волатильностью рынка.

Руководство по оптимизации

  1. Подумайте о добавлении дополнительных индикаторов оценки тенденций для формирования комбинации стратегий для улучшения точности оценки.

  2. Добавление модулей идентификации колебаний для приостановки торговли при сильном колебании для снижения риска.

  3. Внедрение алгоритмов машинного обучения для достижения динамической оптимизации параметров.

  4. Добавить модули стоп-лосса цены для стоп-лосса, когда убытки достигают определенного порога.

  5. Расчет коэффициентов получения прибыли и остановки убытков на основе волатильности рынка для достижения разумной корректировки получения прибыли и остановки убытков.

Резюме

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


/*backtest
start: 2023-08-27 00:00:00
end: 2023-09-26 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Eltrut", shorttitle="Eltrut Strat", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075)

testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// R E F L E X / T R E N D F L E X

f_supersmoother(_src,_len)=>
    pi = 2 * asin(1)
    _a = exp(-sqrt(2) * pi / _len)
    _c2 = 2 * _a * cos(sqrt(2) * pi / _len)
    _c3 = -_a * _a
    _c1 = 1 - _c2 - _c3
    _out = 0.0
    _out := _c1 * _src + _c2 * nz(_out[1],nz(_src[1],_src)) + _c3 * nz(_out[2],nz(_src[2],nz(_src[1],_src)))

f_IQIFM(_src1,_max)=>
    _src = _src1 < 0.001 ? _src1 * 10000 : _src1
    _imult = 0.635, _qmult = 0.338 , _inphase = 0.0, _quad = 0.0
    _re = 0.0, _im = 0.0, _deltaphase = 0.0, _instper = 0.0, _per = 0.0, _v4 = 0.0
    _v1 = _src - nz(_src[7])
    _inphase := 1.25 * (nz(_v1[4]) - _imult * _v1[2]) + _imult * nz(_inphase[3])
    _quad := _v1[2] - _qmult * _v1 + _qmult * nz(_quad[2])
    _re := 0.2 * (_inphase * _inphase[1] + _quad * _quad[1]) + 0.8 * nz(_re[1])
    _im := 0.2 * (_inphase * _quad[1] - _inphase[1] * _quad) + 0.8 * nz(_im[1])
    if _re != 0.0
        _deltaphase := atan(_im / _re)
    for i = 0 to _max
        _v4 := _v4 + _deltaphase[i]
        if _v4 > 4 * asin(1) and _instper == 0.0
            _instper := i
    if _instper == 0.0
        _instper := nz(_instper[1])
    _per := 0.25 * _instper + 0.75 * nz(_per[1])
    _per

f_flex(_src1, _fixed_len, _reflex) =>
    _src = _src1
    _len = _fixed_len 
    _ss1 = f_supersmoother(_src, _len)
    _ss = _ss1
    _slope = (_ss[_len] - _ss) / _len
    _sum = 0.0
    for _i = 1 to _len
        _c1 = _reflex ? _ss + _i * _slope - _ss[_i] : _ss - _ss[_i]
        _sum := _sum + _c1
    _sum := _sum / _len
    _ms = 0.0
    _ms := 0.04 * pow(_sum,2) + 0.96 * nz(_ms[1])
    _flex1 = _ms != 0 ? _sum / sqrt(nz(_ms)) : 0.0
    _flex = _flex1
    _flex

rflx = f_flex(close, 20, true)  
trndflx = f_flex(close, 20, false)   

// S I G N A L
hi7 = highest(7)
lo7 = lowest(7)
long_cond = crossunder(close, lo7[1])
short_cond = crossover(close, hi7[1])

// F I L T E R S

long_filter1 = trndflx < 1
short_filter1 = trndflx > -1

basis = sma(close, 35)
dev = 3 * stdev(close, 35)
long_filter2 = close > basis - dev
short_filter2 = close < basis + dev

// S T R A T E G Y

long = long_cond and long_filter1 and long_filter2
short = short_cond and short_filter1 and short_filter2

if( true)
    strategy.entry("Long", strategy.long, when = long)
    strategy.entry("Long", strategy.long, when = short)


// User Options to Change Inputs (%)
stopPer = input(3, title='Stop Loss %', type=input.float) / 100
takePer = input(9, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

if strategy.position_size > 0 
    strategy.exit(id="Exit Long", stop=longStop, limit=longTake)
if strategy.position_size < 0 
    strategy.exit(id="Exit Short", stop=shortStop, limit=shortTake)


// P L O T 

plotshape(long, color = #1e90ff, text = "", style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(short, color = #ff69b4, text = "", style=shape.triangledown, location=location.abovebar, size=size.tiny)

alertcondition(long, "Long", "Enter Long")
alertcondition(short, "Short", "Enter S")

Больше