Длинная краткосрочная стратегия торговли на основе MACD и RSI

Автор:Чао Чжан, Дата: 2023-10-09 15:33:17
Тэги:

Обзор

Эта стратегия сочетает в себе индикаторы MACD и RSI для одновременной реализации длинной и короткой торговли с целью получения избыточной доходности в неясных ситуациях тренда.

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

  1. Расчет быстрой EMA (12 дней) и медленной EMA (26 дней)
  2. Расчет дивергенции конвергенции MACD (быстрая EMA минус медленная EMA)
  3. Вычислить 9-дневную скользящую среднюю величину MACD как линию сигнала
  4. Вычислить 14-дневный RSI
  5. Пройти длинный курс, когда MACD<-0,1, RSI<27 и быстрая EMA ниже медленной EMA
  6. Пройти короткий курс, когда MACD>0,125, RSI>81 и быстрая EMA выше медленной EMA
  7. Использовать прибыль, остановку потери, остановку потери для управления позициями

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

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

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

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

Решения рисков:

  1. Достаточный капитал для поддержки размещения позиций
  2. Разумное расстояние потери при остановке для предотвращения переполненных остановок
  3. Оптимизировать параметры для сокращения частоты торговли

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

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

Резюме

Эта стратегия реализует двунаправленную торговлю с комбинацией MACD и RSI. Использование стоп-лосса для блокировки прибыли может генерировать избыточную доходность на не трендовых рынках. Стратегия может быть дополнительно оптимизирована по параметрам, стратегиям стоп-лосса и т. Д.


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

//@version=3
// Revision:        290
// Author:          @Hugo_Moriceau
//study("Moriceau_Crypto_strategies_Long_short_indicator_thesis",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Moriceau_Crypto_strategies_Long_short_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)

dataB = macd < -0.1  and rsi<27 and fastMA < slowMA
// data1 = macd > 0.125  and rsi>81 and fastMA> slowMA
dataS = macd > 0.125 and rsi > 81 and fastMA > slowMA

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
Achat = macd < -0.1  and rsi < 27 and fastMA < slowMA ? true : false
vente = macd > 0.125 and rsi > 81 and fastMA > slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = vente ? Achat ? false : true : Achat ? true : false

// === Plot Setting ===

plot(fastMA,color=red)
plot(slowMA,color=blue)
barcolor(color=iff(fastMA > slowMA, yellow, na))
barcolor(color=iff(fastMA < slowMA, black, na))
//barcolor(color=iff(macd > 0.12*close , fuchsia, na))
//barcolor(color=iff(macd < -0.1*close , lime, na))
plotchar(dataB, char='B',color=black,size = size.auto,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.auto,location = location.abovebar,transp= 0)

//fast = plot(maFast, title = "FastMA", color = yellow, linewidth = 2, style = line, transp = 50)
//slow = plot(maSlow, title = "SlowMA", color = black, linewidth = 2, style = line, transp = 50)

// === BACKTEST RANGE ===
FromMonth = input(defval = 05, title = "From Month", minval = 1)
FromDay   = input(defval = 23, title = "From Day", minval = 1)
FromYear  = input(defval = 2021, title = "From Year", minval = 2017)
ToMonth   = input(defval = 5, title = "To Month", minval = 1)
ToDay     = input(defval = 25, title = "To Day", minval = 1)
ToYear    = input(defval = 2021, title = "To Year", minval = 2017)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 2500, title = "Take Profit", minval = 28)
inpStopLoss     = input(defval = 600, title = "Stop Loss", minval = 15)
inpTrailStop    = input(defval = 300, title = "Trailing Stop Loss", minval = 5)
inpTrailOffset  = input(defval = 50, title = "Trailing Stop Loss Offset", minval = 1)

// === RISK MANAGEMENT VALUE PREP ===

// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Achat", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "TP 50% Sell", when = exitLong()) // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===

enterShort() => tradeDirection[1] and not tradeDirection
exitShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Vente", long = false, when = enterShort())
strategy.close(id = "Vente", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===

// finally, make use of all the earlier values we got prepped
strategy.exit("Vente", from_entry = "Vente", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Short", from_entry = "Achat", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

Больше