
Стратегия использует Stochastic RSI и индикатор скорости изменения цены, чтобы определить направление тенденции в многополярные листы и управлять риском с помощью метода скольжения скольжения.
Во-первых, стратегия использует RSI длиной 5 и Stochastic длиной 7 для вычисления Stochastic RSI. Когда K-значение Stochastic RSI выше D-значения, это является положительным сигналом, а когда K-значение ниже D-значения, это является отрицательным сигналом.
Во-вторых, стратегия рассчитывает показатель динамики цены EMA ROC. При этом считается, что цена активно движется, когда EMA ROC выше половины от отклонения или ниже отрицательной половины от отклонения.
Затем, в сочетании с многополосным сигналом стохастического RSI и показателем скорости изменения цен, можно определить направление тренда. Когда стохастический RSI позитивен и цена активно движется, делайте больше; когда стохастический RSI понижен и цена активно движется, делайте пробел.
Наконец, стратегия использует координатное скольжение для управления рисками. После открытия позиции, продолжайте обновлять максимальную или минимальную цену и используйте ее в качестве стоп-стопа в определенной пропорции от максимальной или минимальной цены.
Эта стратегия имеет следующие преимущества:
Использование Stochastic RSI позволяет эффективно идентифицировать тенденции и перекуп и перепродажу.
Показатели динамики цен могут отфильтровывать рынок от колебаний, чтобы избежать ложных сигналов.
Координатный сдвиг с остановкой позволяет максимально закрепить прибыль и одновременно контролировать риски.
Параметры стратегии оптимизируются, и их можно корректировать в зависимости от разновидности.
Стратегическая концепция проста, ясна и понятна.
Однако эта стратегия также несет в себе некоторые риски:
Стохастический RSI может создавать ложные сигналы, которые необходимо подтвердить в сочетании с другими факторами.
Координатный сдвиг может быть слишком радикальным, чтобы быть забит ночными зазорами.
В краткосрочной перспективе это может привести к возникновению убытков.
Параметры стратегии должны быть оптимизированы для разных сортов, иначе они могут оказаться неэффективными.
Стоимость сделок влияет на прибыльность стратегии, поэтому необходимо учитывать разумную частоту сделок.
Эта стратегия также может быть оптимизирована в следующих аспектах:
Оптимизация параметров Stochastic RSI, снижение частоты ложных сигналов. Можно тестировать различные параметры K-значений и D-значений.
Оптимизация параметров индикатора изменения цены, улучшение эффективности фильтрации. Можно тестировать различные периоды окна и пороги изменения цены.
В сочетании с трендовыми показателями, чтобы избежать обратной остановки. Такие показатели, как добавление скользящих средних.
Оптимизация коэффициента убытков, снижение риска подстрахования. Можно тестировать различные степени убытков.
Добавление управления количеством позиций, контролирующих риски на одну позицию. Например, фиксированный размер стоп-лосса или динамическая корректировка позиций в зависимости от баланса счета.
Тестирование параметров различных сортов, повышение адаптации. Предпочтительно проверка на нескольких рынках в течение нескольких периодов времени.
Общая концепция стратегии ясна и проста. Используя Stochastic RSI для определения направления тенденции, а также в сочетании с индикатором изменения цены, фильтрующими сигналы, можно эффективно захватить средне- и длиннолинейные трендовые возможности. Координационный сдвиг стоп-убыток может блокировать прибыль, одновременно контролируя риск.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Stochastic calc /////////////
smoothK = input(1, minval=1)
smoothD = input(7, minval=1)
lengthRSI = input(5, minval=1)
lengthStoch = input(7, minval=1)
src = input(close, title="RSI Source")
up = sma(max(change(src), 0), lengthRSI)
down = sma(-min(change(src), 0), lengthRSI)
rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
///////////// Rate Of Change /////////////
source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// STRATEGY ///////////////
long = k > d and isMoving()
short = k < d and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(9.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
// Strategy
if testPeriod()
strategy.entry("Long Entry", strategy.long, when=long)
strategy.entry("Short Entry", strategy.short, when=short)
strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
p1 = plot(k, color=color.gray, linewidth=0)
p2 = plot(d, color=color.gray, linewidth=0)
h0 = hline(100)
h1 = hline(50)
h3 = hline(0)
fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)