Количественная стратегия свинг-трейдинга, основанная на нескольких таймфреймах


Дата создания: 2023-12-01 13:50:02 Последнее изменение: 2023-12-01 13:50:02
Копировать: 0 Количество просмотров: 767
1
Подписаться
1619
Подписчики

Количественная стратегия свинг-трейдинга, основанная на нескольких таймфреймах

Обзор

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

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

  1. Показатель RSI, основанный на расчетах по часовой шкале, с использованием торговой величины для взвешенного расчета, фильтрации ложных прорывов.
  2. Процесс плавной обработки EMA для солнечного RSI, чтобы построить индикатор количественного диапазона.
  3. 5-минутная временная рамка использует индикаторы линейной регрессии и HMA для построения торговых сигналов.
  4. Стратегия позволяет идентифицировать длинные промежуточные полосы цены, объединяя их между различными временными рамками, путем комбинирования количественных полос и торговых сигналов.

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

  1. Использование RSI, взвешенного по количеству сделок, позволяет эффективно идентифицировать истинные диапазоны и отфильтровывать ложные прорывы.
  2. Индекс HMA более чувствителен к ценовым изменениям и может вовремя улавливать перемены.
  3. В сочетании с многократными временными рамками, более точная идентификация средних и длинных диапазонов.
  4. 5 минут для торговли, более высокая частота операций.
  5. Стратегия отслеживания диапазона, без необходимости точно выбирать точку, более длительный срок хранения.

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

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

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

  1. Тестирование эффективности RSI по различным параметрам.
  2. Попробуйте ввести другие вспомогательные диапазоны.
  3. Оптимизация параметров длины HMA.
  4. Добавление стратегий стоп-лосс и стоп-стоп.
  5. Корректировка цикла владения диапазоном транзакций.

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

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

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

//@version=4

strategy(title='Pyramiding BTC 5 min', overlay=true, pyramiding=5, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.075)
//the pyramide based on this script  https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
//
fastLength = input(250, title="Fast filter length ", minval=1)
slowLength = input(500,title="Slow filter length",  minval=1)
source=close
v1=ema(source,fastLength)
v2=ema(source,slowLength)
//
//Backtest dates
fromMonth = input(defval=1, title="From Month")
fromDay = input(defval=10, title="From Day")
fromYear = input(defval=2020, title="From Year")
thruMonth = input(defval=1, title="Thru Month")
thruDay = input(defval=1, title="Thru Day")
thruYear = input(defval=2112, title="Thru Year")

showDate = input(defval=true, title="Show Date Range")

start = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= start and time <= finish ? true : false


leng=1
p1=close[1]

len55 = 10
//taken from https://www.tradingview.com/script/Ql1FjjfX-security-free-MTF-example-JD/
HTF = input("1D", type=input.resolution)
ti = change( time(HTF) ) != 0
T_c = fixnan( ti ? close : na )

vrsi = rsi(cum(change(T_c) * volume), leng)
pp=wma(vrsi,len55)

d=(vrsi[1]-pp[1])
len100 = 10
x=ema(d,len100)
//
zx=x/-1
col=zx > 0? color.lime : color.orange

//

tf10 = input("1", title = "Timeframe", type = input.resolution, options = ["1", "5", "15", "30", "60","120", "240","360","720", "D", "W"])

length = input(50, title = "Period", type = input.integer)
shift = input(1, title = "Shift", type = input.integer)

hma(_src, _length)=>
    wma((2 * wma(_src, _length / 2)) - wma(_src, _length), round(sqrt(_length)))
    
hma3(_src, _length)=>
    p = length/2
    wma(wma(close,p/3)*3 - wma(close,p/2) - wma(close,p),p)

b =security(syminfo.tickerid, tf10, hma3(close[1], length)[shift])
//plot(a,color=color.gray)
//plot(b,color=color.yellow)
close_price = close[0]
len = input(25)

linear_reg = linreg(close_price, len, 0)


filter=input(true)

buy=crossover(linear_reg, b)

longsignal = (v1 > v2 or filter == false ) and buy and window()

//set take profit

ProfitTarget_Percent = input(3)
Profit_Ticks = close * (ProfitTarget_Percent / 100) / syminfo.mintick

//set take profit

LossTarget_Percent = input(10)
Loss_Ticks = close * (LossTarget_Percent / 100) / syminfo.mintick


//Order Placing

strategy.entry("Entry 1", strategy.long, when=strategy.opentrades == 0 and longsignal)

strategy.entry("Entry 2", strategy.long, when=strategy.opentrades == 1 and longsignal)

strategy.entry("Entry 3", strategy.long, when=strategy.opentrades == 2 and longsignal)

strategy.entry("Entry 4", strategy.long, when=strategy.opentrades == 3 and longsignal)

strategy.entry("Entry 5", strategy.long, when=strategy.opentrades == 4 and longsignal)





if strategy.position_size > 0
    strategy.exit(id="Exit 1", from_entry="Entry 1", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 2", from_entry="Entry 2", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 3", from_entry="Entry 3", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 4", from_entry="Entry 4", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 5", from_entry="Entry 5", profit=Profit_Ticks, loss=Loss_Ticks)