Эта стратегия рассчитывает мультипликативную скользящую среднюю линию и объединяет пересечения цены и индикатора PMax для определения направления тренда.
Основным показателем этой стратегии является мультипликативная скользящая средняя линия. Параметры индикатора включают: период ATR, мультипликатор ATR, тип и длина скользящей средней. Значение ATR представляет волатильность за период. Мультипликативная скользящая средняя линия равна средней цене плюс/минус произведение мультипликатора ATR и ATR за период. Когда цена выше линии, есть длинный сигнал. Когда цена ниже линии, есть короткий сигнал.
Индикатор PMax представляет собой стоп-лосс или цену прибыли. Он рассчитывается на основе значения ATR и направления тренда. В восходящем тренде PMax равен скользящей средней минус ATR мультипликатор умноженный на ATR, действующий как линия стоп-лосса. В нисходящем тренде PMax равен скользящей средней плюс ATR мультипликатор умноженный на ATR, действующий как линия прибыли.
Когда цена пересекает индикатор PMax вверх, есть длинный сигнал. Когда цена пересекает индикатор PMax вниз, есть короткий сигнал. Стратегия входит и выходит на основе сигналов, идя длинным в восходящем тренде и коротким в нисходящем тренде, с динамическим последующим стоп-лосом и получением прибыли.
Преимущества этой стратегии:
Принятие двусторонней торговли делает ее в высшей степени инклюзивной для всех рыночных условий.
Применение мультипликативной скользящей средней дает стабильные и надежные торговые сигналы.
С PMax для стоп-лосса/приобретения прибыли, он эффективно контролирует риск.
Регулируемый цикл и множитель параметров делают его очень адаптивным.
Существуют также некоторые риски:
Неправильное настройка параметров может привести к потерям винта.
Обращайте внимание на лимиты левериджа при коротких сделках.
Чёрного лебедя трудно избежать.
Решения:
Оптимизируйте параметры, чтобы уменьшить удар.
Осторожно контролируйте рычаги и диверсифицируйте.
Увеличьте мультипликатор ATR, чтобы расширить дальность остановки.
Стратегия может быть улучшена следующими способами:
Испытать стабильность на разных рынках и циклах.
Применять машинное обучение для автоматической оптимизации параметров.
Судите о рыночных режимах с помощью методов глубокого обучения.
Интегрировать больше источников данных для принятия решений.
Общая производительность этой стратегии стабильна с сильной инклюзивностью. Приняв двунаправленную торговлю и динамическую стоп-лосс/прием прибыли, она эффективно контролирует риски. Благодаря настройке параметров и итерации модели, пригодность и эффективность стратегии могут быть еще улучшены.
/*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)