곱셈 이동 평균 양방향 거래 전략


생성 날짜: 2024-01-15 14:50:32 마지막으로 수정됨: 2024-01-15 14:50:32
복사: 1 클릭수: 607
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

곱셈 이동 평균 양방향 거래 전략

개요

이 전략은 가격과 PMax 지표의 교차와 결합한 곱셈 이동 평균을 계산하여 트렌드 방향을 판단합니다. 장거리 쌍방향 거래 방식을 채택하고, 트렌드가 상승하면 더 많이하고, 추세가 하향하면 공백을하고, 실시간으로 포지션 위험을 평가하여 수익을 내기 위해 퇴출합니다.

전략 원칙

이 전략의 핵심 지표는 곱셈 이동 평균이다. 지표 파라미터는 다음과 같다: ATR 주기 길이는, ATR 곱하기, 이동 평균의 종류와 길이는. ATR 값은 기간 동안의 변동의 폭을 나타냅니다. 곱셈 이동 평균은 기간 가격 평균 더하기 / ATR 곱하기 ATR의 곱셈과 같습니다. 가격이 곱셈 이동 평균보다 높을 때 부진 신호; 가격이 곱셈 이동 평균보다 낮을 때 부진 신호.

PMax 지표는 스톱 또는 스톱 가격을 나타냅니다. PMax 지표는 ATR 값과 트렌드 방향을 결합하여 계산됩니다. 보이스 시장에서 PMax은 ATR 값과 배수의 곱셈을 빼면 이동 평균을 곱하는 것과 같습니다.

가격과 PMax 지표가 상향으로 교차 할 때 더 많은 신호; 가격과 PMax 지표가 하향으로 교차 할 때 더 많은 신호. 전략은 여기에 출전하여 트렌드 상향에서 더 많은 것을하고, 트렌드 하향에서 더 많은 것을하고, 동적 추적 스톱 손실 .

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 장거리 쌍방향 거래 방식을 채택하여 전체 시장 거래가 가능하며 포괄성이 강하다.

  2. 곱셈 이동 평균 지표가 적용되어 거래 신호가 안정적이고 신뢰할 수 있습니다.

  3. PMax 지표와 결합하여 스톱 스톱 손실을 수행하여 위험을 효과적으로 제어합니다.

  4. 계산 주기 및 곱셈 변수는 조정할 수 있으며, 적응성이 넓다.

위험 분석

이 전략에는 위험도 있습니다.

  1. Whipsaw의 거래 손실을 초래할 수 있습니다.

  2. 허공 거래는 리버리지 제한의 위험을 고려해야 합니다.

  3. 시장의 급격한 변동으로 인한 갑작스러운 사건의 위험은 피할 수 없습니다.

대응방법:

  1. 이 경우, whipsaw의 출현 확률을 줄일 수 있는 최적화 매개 변수를 사용한다.

  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)