Стратегия торговли на фоне колебаний SMA

Автор:Чао Чжан, Дата: 2023-12-19 10:52:10
Тэги:

img

Обзор стратегии

Эта стратегия использует простые скользящие средние (SMA) и некоторые математические вычисления для определения точек покупки/продажи. Мы держим 100-дневную линию SMA в качестве основы. Если цена закрытия ниже этой линии, мы определяем открывающую позицию на основе процента, который цена находится ниже линии (низкий оффсет), который конфигурируем. Аналогично, мы устанавливаем высокий процент оффсета выше 100-дневной SMA перед закрытием длинных позиций. Если мы попытаемся закрыть слишком рано, пока цена все еще растет, будет задействован последующий стоп-лосс.

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

Стратегия использует три линии SMA: быструю линию (по умолчанию 14 дней), медленную линию (по умолчанию 100 дней) и базовую линию (по умолчанию 30 дней).

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

Он закрывается длинным, когда цена закрытия выше базовой линии, процент над медленной линией (высокий оффсет) больше, чем конфигурированное значение, цена закрытия поднялась на 3 последовательных свечи, у нас есть открытые прибыли, и быстрая линия выше медленной линии.

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

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

  1. Использовать преимущество SMA в том, что он способен сглаживать колебания цен и фильтровать рыночный шум.
  2. Кроссоверы SMA обладают некоторой способностью предсказывать изменения тренда.
  3. Установка смещений позволяет избежать ложных прорывов линий SMA.
  4. Сочетание индикаторов тренда и перекрестного действия повышает точность торговых сигналов.
  5. Следующая остановка потери блокирует прибыль и предотвращает снижение.

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

  1. Сама SMA имеет задержку и может пропустить переломные моменты цены.
  2. Неправильное смещение может сделать стратегию слишком агрессивной или слишком консервативной.
  3. Неправильный параметр стоп-потери может привести к слишком ранней остановке или слишком большому проценту стоп-потери.
  4. Не в состоянии справиться с сильными колебаниями цен.

Соответствующие улучшения:

  1. Добавить другие ведущие показатели в фильтрующие записи.
  2. Проверьте и оптимизируйте смещения.
  3. Проверьте и найдите оптимальные параметры стоп-лосса.
  4. Сократить размер позиции в периоды высокой волатильности.

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

  1. Проверьте SMA различных периодов, чтобы найти оптимальные параметры.
  2. Добавьте другие показатели для определения структуры и тенденции рынка.
  3. Оптимизируйте параметры остановки потери, чтобы получить больше прибыли.
  4. Корректировка размеров позиций на основе волатильности рынка.
  5. Применение стратегии на несколько продуктов одновременно для диверсификации.

Заключение

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


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

// @version=4
// Author: Sonny Parlin (highschool dropout)
strategy(shorttitle="SMA+Strategy", title="SMA Offset Strategy",
                                      overlay=true,  currency=currency.USD,
                                      initial_capital=10000)

// Inputs and variables
ss = input(14, minval=10, maxval=50, title="SMA Fast (days)")
ff = input(100, minval=55, maxval=200, title="SMA Slow (days)")
ref = input(30, minval=20, maxval=50, title="SMA Reference (days)")
lowOffset = input(0.001, "Low Offset (%)", minval=0, step=0.001)
highOffset = input(0.0164, "High Offset (%)", minval=0, step=0.0001)
orderStake = input(0.96, "Order Stake (%)", minval=0, step=0.01)

// SMA
smaFast = sma(close, ss)
smaSlow = sma(close, ff)
smaRef = sma(close, ref)
distanceLow = (close - smaSlow) / close
distanceHigh = (close - smaSlow) / close

// Set up SMA plot but don't show by default
plot(smaFast, "smaFast", color=#00ff00, display = 0)
plot(smaSlow, "smaSlow", color=#ff0000, display = 0)
plot(smaRef, "smaRef", color=#ffffff, display = 0)

// The buy stratey:
// guard that the low is under our sma low reference line by our lowOffset %, 
// default is 0.001. (low < smaRef) and (distanceLow > lowOffset)
// SMA fast is on the rise and SMA slow is falling and they are very likely
// to cross. (rising(smaFast,1)) and (falling(smaSlow, 1)) 
enterLong = (low < smaRef) and (distanceLow > lowOffset) and (rising(smaFast,1)) and (falling(smaSlow, 1)) 

// The sell Strategy:
// Guard that close is higher than our sma high reference line by our 
// highOffset %, default is 0.0164. (close > smaRef) and (distanceHigh > highOffset)
// Guard that close has risen by 3 candles in a row (rising(close,3)) 
// Guard that we currently have profit (strategy.openprofit > 0)
// Guard that SMA fast is higher than smaSlow (smaFast > smaSlow)
// If it keeps going up past our close position the trailing stoploss will kick in!
enterShort = (close > smaRef) and (distanceHigh > highOffset) and (rising(close,3)) and (strategy.openprofit > 0) and (smaFast > smaSlow)

// Order size is based on total equity
// Example 1:
// startingEquity = 2000
// close = 47434.93
// orderStake = 0.45
// (2,000 × orderStake) / close = orderSize = 0.0189733599 = approx $900

// Example 2:
// startingEquity = 2000
// close = 1.272
// orderStake = 0.45
// (startingEquity × orderStake) / close = orderSize = 707.5471698113 = approx $900
orderSize = (strategy.equity * orderStake) / close

// Trailing Stoploss
// I'm using 1.35 as my default value, play with this for different results.
longTrailPerc = input(title="Trailing Stoploss (%)",
     type=input.float, minval=0.0, step=0.1, defval=1.35) * 0.01
     
longStopPrice = 0.0

longStopPrice := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

if (enterLong)
    strategy.entry("Open Long Position", strategy.long, orderSize, when=strategy.position_size <= 0)
    
if (enterShort)
    strategy.exit(id="Close Long Position", stop=longStopPrice)


//plot(strategy.equity)

Больше