이 전략은 곱셈 이동 평균 라인을 계산하고 가격과 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)