Стратегия следования за трендом, основанная на скользящей средней


Дата создания: 2023-10-07 15:04:00 Последнее изменение: 2023-10-07 15:04:00
Копировать: 0 Количество просмотров: 626
1
Подписаться
1617
Подписчики

Обзор

Эта стратегия вычисляет движущиеся средние за различные периоды, идентифицирует текущее направление тренда и в сочетании с RSI дает сигнал о покупке и продаже. Когда краткосрочные движущиеся средние пересекают долгосрочные движущиеся средние, считая, что тенденция вверх, совершается покупка.

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

  1. Вычислите простые скользящие средние за 10, 20, 50, 100 и 200 дней.

  2. Рассчитайте 14-дневный RSI.

  3. Покупка совершается, когда 10-дневный SMA имеет 50-дневную SMA и RSI больше 30, а 20-дневная SMA выше или равна 100-дневной SMA или 50-дневная SMA выше или равна 100-дневной SMA.

  4. Установите стоп-цену в качестве точки покупки умножить на 1 минус стоп-процент.

  5. Продажа производится в следующих случаях:

    • 10-дневная SMA прошла через 50-дневную SMA и закрылась ниже 20-дневной SMA: тренд был перевернут и продана
    • Закрытие по цене ниже 95 процентов от цены покупки: стоп-лосс и продажа
    • Закрытие по цене ниже цены остановки: тренд отслеживает остановку убытка

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

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

  • Используйте движущиеся средние, чтобы определить направление тренда, покупайте вверх по тренду и избегайте торговли в рыночной ситуации.
  • Использование многоциклических скользящих средних, чтобы избежать заблуждения от краткосрочных колебаний цен
  • Фильтрация ложных сигналов в сочетании с RSI
  • Устанавливайте линию убытков, чтобы контролировать риск одиночных потерь
  • Тренд-трекер использует стоп-локацию для прибыли

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

  • Движущаяся средняя задерживается и может упустить лучший момент для переворота цены
  • Слишком мягкие настройки стоп-лосса могут привести к большим одиночным потерям
  • Слишком плотная настройка может привести к слишком частому остановке
  • Тренд-трекер может потерять больше денег, если не уйдет раньше срока

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

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

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

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

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

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

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)