Торговая стратегия JMA по пересечению RSI

Автор:Чао Чжан, Дата: 2023-09-18 21:42:50
Тэги:

Обзор

Эта стратегия генерирует торговые сигналы путем скрещивания Jurik Moving Average (JMA) и индикатора RSI. Она длится, когда JMA пересекает выше RSI, и становится короткой, когда пересекает ниже. Стратегия пытается отфильтровать ложные сигналы путем сочетания двух индикаторов и торговать, когда тенденция более очевидна.

Принципы

Стратегия в основном использует два типа показателей:

  1. Индикатор JMA: сглаженная скользящая средняя с использованием мощных мультипликаторов, с меньшим отставанием и более быстрым отслеживанием изменений цен.

  2. Индикатор RSI: общий индикатор силы, отражающий импульс покупки/продажи.

Когда JMA пересекает RSI, это указывает на более сильный краткосрочный восходящий тренд по сравнению с долгосрочным трендом и генерирует сигнал покупки.

После сигнала стратегия вступает в торговлю в соответствующем направлении. Выходит, когда цена достигает заранее определенного коэффициента прибыли или индикаторы пересекают обратное направление.

Преимущества

  1. Параметры JMA, поддающиеся регулированию и адаптируемые к различным периодам.

  2. РСИ отфильтровывает ложные прорывы.

  3. Сочетание двойных индикаторов уменьшает ложные сигналы.

  4. Встроенное управление потерями.

  5. Устройство коэффициента прибыли для целенаправленного использования прибыли.

Риски и способы их смягчения

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

  2. JMA все еще имеет отставание, может пропустить переломные моменты.

  3. Неправильное размещение стоп-лосса может привести к большим потерям.

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

Возможности для расширения

  1. Проверьте параметры JMA для поиска оптимальных настроек.

  2. Попробуйте разные параметры RSI для лучшей производительности.

  3. Добавить механизм задержки для адаптивных остановок.

  4. Оптимизируйте размер входных позиций, как добавление к выигрышным сделкам.

  5. Исследуйте дополнительные фильтры, такие как KD, MACD.

Резюме

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


/*backtest
start: 2023-01-01 00:00:00
end: 2023-03-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Stratégie marche le mieux sur du 2 jours
strategy("JMA(7,50,RSI) crossing RSI(14,close)", overlay=false, currency=currency.EUR, default_qty_type=strategy.cash, default_qty_value=5000)

// Strategy Tester Start Time
sYear = input(2019, title = "Start Year")
sMonth = input(06, title = "Start Month", minval = 01, maxval = 12)
sDay = input(01, title = "Start Day", minval = 01, maxval = 31)
sHour = input(00, title = "Start Hour", minval = 00, maxval = 23)
sMinute = input(00, title = "Start Minute", minval = 00, maxval = 59)
startTime = true

// Strategy Tester End Time
eYear = input(2019, title = "End Year")
eMonth = input(12, title = "End Month", minval = 01, maxval = 12)
eDay = input(01, title = "End Day", minval = 01, maxval = 31)
eHour = input(00, title = "End Hour", minval = 00, maxval = 23)
eMinute = input(00, title = "End Minute", minval = 00, maxval = 59)
endTime = true

// === RSI ===
src = close, len = input(14, minval=1, title="Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
plot(rsi, color=color.purple)
band1 = hline(70)
band0 = hline(30)

// === JMA ===
_length = input(7, title="Length")
_phase = input(50, title="Phase")
_power = input(2, title="Power")
highlightMovements = input(true, title="Highlight Movements ?")

// srcJMA = input(rsi, title="Source")
srcJMA = rsi

phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
alpha = pow(beta, _power)
jma = 0.0
e0 = 0.0
e0 := (1 - alpha) * srcJMA + alpha * nz(e0[1])
e1 = 0.0
e1 := (srcJMA - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
jma := e2 + nz(jma[1])
// === End of JMA def ===

jmaColor = highlightMovements ? (jma > jma[1] ? color.green : color.red) : #6d1e7f
plot(jma, title="JMA switch", linewidth=2, color=jmaColor, transp=0)

// === Inputs ===
// risk management
useStop = input(true, title = "Use Initial Stop Loss?")

goLong() => crossover(rsi, jma)
killLong() => crossunder(rsi, jma)

// ======= DEBUGGGGGGGG ============
long_price = 0.0
short_price = 0.0

if(startTime and endTime)
    if(goLong())
        long_price := close
    strategy.entry("Buy", strategy.long, when = goLong())
    strategy.close("Buy", when = killLong() and close > long_price)

// Shorting if using
goShort() => killLong()
killShort() => goLong()

if(startTime and endTime)
    if(goShort())
        short_price := close
    strategy.entry("Sell", strategy.short, when = goShort() and close < short_price)
    strategy.close("Sell", when = killShort())
// =========================

if (useStop)
    strategy.exit("XLS", from_entry ="Buy", stop = strategy.position_avg_price / 1.08)
    strategy.exit("XSS", from_entry ="Sell", stop = strategy.position_avg_price * 1.08)



Больше