Ценовая EMA со стохастической оптимизацией на основе машинного обучения

Автор:Чао Чжан, Дата: 2024-01-26 14:57:08
Тэги:

img

Обзор

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

Принцип стратегии

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

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

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

Преимущества стратегии

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

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

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

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

Чтобы уменьшить эти риски, мы могли бы установить стоп-лосс или принять более умеренные параметры MA.

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

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

  1. Испытать различные комбинации параметров MA для поиска оптимального
  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")

Больше