Тенденция ИРС в соответствии со стратегией

Автор:Чао Чжан, Дата: 2023-11-16 15:33:40
Тэги:

Обзор

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

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

Стратегия сначала рассчитывает RSI и взвешенную скользящую среднюю. Длина RSI составляет 20 периодов, а длина взвешенной MA - 20 с более высокими весами, которые уменьшают влияние краткосрочной волатильности. Она длится, когда RSI выше 60, а взвешенная MA-скорость изменения ниже -1%. Она становится короткой, когда RSI ниже 40 и взвешенная MA-скорость изменения выше 1%.

После открытия длинного или короткого ордера, стоп-лосс и следствие принимать прибыль заказы размещаются одновременно. Стоп-лосс устанавливается на 3 ATR от текущей цены. Первоначальная последующая прибыльная активация находится на расстоянии 4 ATR, и следы в 3-процентных ступенях. Когда цена достигает либо стоп-лосса или последующей прибыльной активации, позиция будет закрыта.

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

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

  • Показатель RSI может эффективно отслеживать тенденции
  • Взвешенный MA уменьшает влияние краткосрочных колебаний, избегая сбоев
  • Отслеживание прибыли позволяет максимизировать прибыль
  • Контроль размеров фиксированных фракций эффективно контролирует риск

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

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

  • Ложные сигналы от RSI могут привести к ненужным сделкам
  • Вынуждены прекращать продажи, когда ценовые нарушения прекращаются или снижают уровень прибыли, неспособны следовать тенденциям
  • Агрессивные правила управления деньгами могут привести к большим потерям

Основные риски возникают из-за надежности сигналов RSI и настройки стоп-лосса/последующего сбора прибыли. Неправильные параметры могут привести к ненужному закрытию сделок или потерям, превышающим аппетит к риску. Перерыв стоп-лосса/сбора прибыли также может привести к необоснованным стоп-аутам, что приведет к потере возможности продолжить трендовую торговлю.

Решение включает в себя оптимизацию параметров RSI или добавление других индикаторов для подтверждения сигнала.

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

  • Проверить другие индикаторы вместе с RSI для подтверждения сигнала, например, KD, MACD и т.д.
  • Оптимизировать параметры стоп-лосса и отслеживания прибыли на основе характеристик продукта и диапазона волатильности
  • Попробуйте другие методы управления деньгами, такие как фиксированный размер торговли, формула Келли и т.д.
  • Добавьте условия входа, такие как прорывы Боллинджера, дивергенции RSI и т.д.
  • Подумайте о добавлении позиций по сильным тенденциям

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

Резюме

RSI имеет четкую логику, используя RSI для направления тренда и взвешенный MA для подтверждения. Его сила заключается в торговле трендом, максимизации прибыли с остановками / управлением деньгами, контролирующими риски. Но надежность RSI и оптимизация параметров нуждаются в улучшении. Мы можем рассмотреть улучшение индикаторов сигналов, параметров остановки / отслеживания, методов управления деньгами и т. Д., Чтобы сделать стратегию более надежной для разных продуктов.

[/trans]


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This code is based on RSI and a backed weighted MA
//@version=5
strategy("RSI + MA BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//------------------------FUNCTIONS---------------------------//

//@function which calculate a retro weighted moving average to minimize the impact of short term reversal
rwma(source, length) =>
    sum = 0.0
    denominator = 0.0
    weight = 0.0
    weight_x = 100/(4+(length-4)*1.30)
    weight_y = 1.30*weight_x
    for i=0 to length - 1
        if i <= 3
            weight := weight_x
        else
            weight := weight_y
        sum := sum + source[i] * weight
        denominator := denominator + weight
    rwma = sum/denominator

//@function which permits the user to choose a moving average type
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "RWMA" => rwma(source, length)

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS-------------------------------//

//Technical parameters
rsiLengthInput = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
maTypeInput = input.string("RWMA", title="MA Type", options=["SMA", "RWMA"], group="MA Settings", inline="1")
maLenghtInput = input.int(20, minval=1, title="MA Length", group="MA Settings", inline="1")
rsiLongSignalValue = input.int(60, minval=1, maxval=99, title="RSI Long Signal", group="Strategy parameters", inline="3")
rsiShortSignalValue = input.int(40, minval=1, maxval=99, title="RSI Short Signal", group="Strategy parameters", inline="3")
rocMovAverLongSignalValue = input.float(-1, maxval=0, title="ROC MA Long Signal", group="Strategy parameters", inline="4")
rocMovAverShortSignalValue = input.float(1, minval=0, title="ROC MA Short Signal", group="Strategy parameters", inline="4")
//TP Activation and Trailing TP
takeProfitActivationInput = input.float(4, minval=1.0, title="TP activation in multiple of ATR", group="Strategy parameters")
trailingStopInput = input.float(3, minval=0, title="Trailing TP in percentage", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2018 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")

strategy.initial_capital = 50000

//------------------------------VARIABLES INITIALISATION-----------------------------//

float rsi = ta.rsi(close, rsiLengthInput)
float ma = ma(close, maLenghtInput, maTypeInput)
float roc_ma = ((ma/ma[maLenghtInput]) - 1)*100
float atr = ta.atr(20)
var float trailingStopOffset = na
var float trailingStopActivation = na
var float trailingStop = na
var float stopLoss = na
var bool long = na
var bool short = na
var bool bufferTrailingStopDrawing = na
float theoreticalStopPrice = na
bool inRange = na
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    bufferTrailingStopDrawing := false
    stopLoss := na
    trailingStopActivation := na
    trailingStop := na
    short := false
    long := false


//------------------------------STOP LOSS AND TRAILING STOP ACTIVATION----------------------------//

// We handle the stop loss and trailing stop activation 
if (low <= stopLoss or high >= trailingStopActivation) and long
    if high >= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if low <= stopLoss
        long := false
    stopLoss := na
    trailingStopActivation := na
if (low <= trailingStopActivation or high >= stopLoss) and short
    if low <= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if high >= stopLoss
        short := false
    stopLoss := na
    trailingStopActivation := na


//-------------------------------------TRAILING STOP--------------------------------------//

// If the traling stop is activated, we manage its plotting with the bufferTrailingStopDrawing
if bufferTrailingStopDrawing and long
    theoreticalStopPrice := high - trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice > trailingStop
        trailingStop := theoreticalStopPrice
    else if low <= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        long := false
if bufferTrailingStopDrawing and short
    theoreticalStopPrice := low + trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice < trailingStop
        trailingStop := theoreticalStopPrice
    else if high >= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        short := false


//---------------------------------LONG CONDITION--------------------------//

if rsi >= 60 and roc_ma <= rocMovAverLongSignalValue and inRange and not long
    if short
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        short := false
    trailingStopActivation := close + takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close - 3*atr
    long := true
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------SHORT CONDITION-------------------------------//

if rsi <= 40 and roc_ma >= rocMovAverShortSignalValue and inRange and not short
    if long
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        long := false
    trailingStopActivation := close - takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close + 3*atr
    short := true
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    strategy.exit("Exit Short", "Short", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------PLOTTING ELEMENT---------------------------------//

// Plotting of element in the graph
plotchar(rsi, "RSI", "", location.top, color.rgb(0, 214, 243))
plot(ma, "MA", color.rgb(219, 219, 18))
plotchar(roc_ma, "ROC MA", "", location.top, color=color.orange)
// Visualizer trailing stop and stop loss movement
plot(stopLoss, "SL", color.red, 3, plot.style_linebr)
plot(trailingStopActivation, "Trigger Trail", color.green, 3, plot.style_linebr)
plot(trailingStop, "Trailing Stop",  color.blue, 3, plot.style_linebr)


Больше