В процессе загрузки ресурсов... загрузка...

Умножающая скользящая средняя двусторонняя стратегия торговли

Автор:Чао Чжан, Дата: 2024-01-15 14:50:32
Тэги:

img

Обзор

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

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

Основным показателем этой стратегии является мультипликативная скользящая средняя линия. Параметры индикатора включают: период ATR, мультипликатор ATR, тип и длина скользящей средней. Значение ATR представляет волатильность за период. Мультипликативная скользящая средняя линия равна средней цене плюс/минус произведение мультипликатора ATR и ATR за период. Когда цена выше линии, есть длинный сигнал. Когда цена ниже линии, есть короткий сигнал.

Индикатор PMax представляет собой стоп-лосс или цену прибыли. Он рассчитывается на основе значения ATR и направления тренда. В восходящем тренде PMax равен скользящей средней минус ATR мультипликатор умноженный на ATR, действующий как линия стоп-лосса. В нисходящем тренде PMax равен скользящей средней плюс ATR мультипликатор умноженный на ATR, действующий как линия прибыли.

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

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

Преимущества этой стратегии:

  1. Принятие двусторонней торговли делает ее в высшей степени инклюзивной для всех рыночных условий.

  2. Применение мультипликативной скользящей средней дает стабильные и надежные торговые сигналы.

  3. С PMax для стоп-лосса/приобретения прибыли, он эффективно контролирует риск.

  4. Регулируемый цикл и множитель параметров делают его очень адаптивным.

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

Существуют также некоторые риски:

  1. Неправильное настройка параметров может привести к потерям винта.

  2. Обращайте внимание на лимиты левериджа при коротких сделках.

  3. Чёрного лебедя трудно избежать.

Решения:

  1. Оптимизируйте параметры, чтобы уменьшить удар.

  2. Осторожно контролируйте рычаги и диверсифицируйте.

  3. Увеличьте мультипликатор ATR, чтобы расширить дальность остановки.

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

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

  1. Испытать стабильность на разных рынках и циклах.

  2. Применять машинное обучение для автоматической оптимизации параметров.

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

  4. Интегрировать больше источников данных для принятия решений.

Резюме

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


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 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/
// © melihtuna
//developer: @KivancOzbilgic
//author: @KivancOzbilgic
//stretegy converter: @crypto_melih
//@version=4

strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent)

src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"])
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
//showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
//showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
long_short = input(defval = false, title = "Long-Short", type=input.bool)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)
alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")
buySignalk = crossover(MAvg, PMax)
//plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallk = crossunder(MAvg, PMax)
//plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
buySignalc = crossover(src, PMax)
//plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, PMax)
//plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na
fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

if(condition=="Only Crossing Signals")
    strategy.entry("BUY", strategy.long, when = buySignalk)
else
    strategy.entry("BUY", strategy.long, when = buySignalc)

if(long_short)
    if(condition=="Only Crossing Signals")
        strategy.entry("SELL", strategy.short, when = sellSignallk)
    else
        strategy.entry("SELL", strategy.short, when = sellSignallc)
else
    if(condition=="Only Crossing Signals")
        strategy.close("BUY", when = sellSignallk)
    else
        strategy.close("BUY", when = sellSignallc)
    

    
    
    
  

Больше