Оптимизация портфеля стратегии сглаженной скользящей средней


Дата создания: 2024-01-26 14:57:08 Последнее изменение: 2024-01-26 14:57:08
Копировать: 1 Количество просмотров: 583
1
Подписаться
1617
Подписчики

Оптимизация портфеля стратегии сглаженной скользящей средней

Обзор

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

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

Эта стратегия использует две плавные движущиеся средние с 12 и 26 периодами. Когда быстрая линия проходит медленную линию снизу, делайте больше; когда быстрая линия проходит медленную линию сверху, делайте пустоту. Чтобы отфильтровать ложные сигналы, она требует, чтобы быстрая линия была сопоставлена с медленной линией, чтобы быстрая линия могла делать больше только над медленной линией, а быстрая линия - только под медленной линией.

Строка K в стохастическом индикаторе пересекается с линией D в качестве входного момента. Когда линия K пересекает линию D в направлении ниже линии сверхпокупа, делается лишний; когда линия K пересекает линию D в направлении ниже линии сверхпродажи, делается пустой.

Гладкая скользящая средняя определяет направление тренда, стохастический индикатор фильтрует шум и выбирает момент входа. Их сочетание позволяет получить больше возможностей для получения прибыли в тренде.

Стратегические преимущества

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

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

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

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

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

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

Эта стратегия может быть улучшена в следующих аспектах:

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

Вы можете найти более сильные параметры, испытывая различные комбинации параметров; в то же время создание стоп-стратегии может эффективно снизить риск и повысить стабильность стратегии.

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

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

Исходный код стратегии
/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")