이중 이동 평균 교차 전략과 함께 Schaff 트렌드 사이클

저자:차오장, 날짜: 2023-12-12 17:43:19
태그:

img

전반적인 설명

이 전략은 Schaff 트렌드 사이클과 더블 이동 평균 크로스오버 전략 (Schaff Trend Cycle with Double Moving Average Crossover Strategy) 이라고 불린다. 주요 아이디어는 Schaff 트렌드 사이클 (STC) 지표와 더블 이동 평균 크로스오버를 기반으로 긴 포지션과 짧은 포지션을 결정하는 것입니다. 구체적으로, STC가 과소매 또는 과소매 영역에서 벗어날 때 가격은 빠른 기하수수 이동 평균보다 높고 빠른 EMA는 느린 EMA보다 높으면 긴 포지션이 열립니다. 반대로, 짧은 포지션은 열립니다.

전략 논리

이 전략은 주로 두 가지 기술적 지표에 의존합니다.

  1. 트렌드 지표: 트렌드 방향을 결정하는 STC 지표. STC에는 MACD, 스토카스틱 및 STC 지표 라인이 포함되어 있습니다. 0-25 영역에서 상승하는 브레이크오프는 상승 추세를 나타냅니다. 75-100 영역에서 하락하는 브레이크오프는 하락 추세를 나타냅니다.

  2. 이동 평균 크로스오버: 빠른 단순한 이동 평균 (디폴트 기간 35) 은 느린 SMA (디폴트 기간 200) 위/아래를 넘는다. 빠른 SMA가 느린 SMA를 넘을 때 상승 신호가 발생한다. 반대 크로스오버에서 하락 신호가 발생한다.

거래 신호 논리는 다음과 같이 정의됩니다.

  1. 긴 신호: STC가 25 라인 이상, 빠른 SMA가 느린 SMA 위에 있고, 닫는 가격은 빠른 SMA 위에 있습니다.

  2. 짧은 신호: STC는 75 라인 아래로 넘어갑니다. 빠른 SMA는 느린 SMA 아래로 넘어갑니다. 그리고 닫는 가격은 빠른 SMA 아래로 넘어갑니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 트렌드 및 이동 평균 지표를 결합하여 신뢰할 수있는 거래 신호. STC는 전체 트렌드를 결정하고, 이중 MAs는 특정 입시 신호를 생성합니다.

  2. 사용자 정의 가능한 이동 평균 기간. MA 기간은 다른 시장 조건에 최적화 될 수 있습니다.

  3. 통제 가능한 위험. STC는 상위 구매와 하위 판매를 피하기 위해 과소 구매/ 과소 판매 수준을 식별합니다. 목표 정지는 400 포인트 이익/손실 범위를 설정합니다.

위험 분석

고려해야 할 몇 가지 위험 요소가 있습니다.

  1. STC에서 가짜 파업이 가능해 가격동동에 의해 확인되어야 합니다.

  2. MA 교차선에서 더 많은 잘못된 신호가 나오고 MA 기간 조정이 필요합니다.

  3. 한 번에 한 방향으로만 거래합니다. 오픈 포지션의 공간을 제한합니다.

  4. 마진 외환 거래에서 스프레드 리스크는 다루지 않습니다. 스프레드는 라이브 거래에서 상당할 수 있습니다.

최적화

가능한 최적화 경로는 다음과 같습니다.

  1. STC 과잉 구매/ 과잉 판매 매개 변수를 조정합니다.

  2. 크로스오버 신호 신뢰성을 높이기 위해 MA 기간을 최적화합니다.

  3. 가짜 브레이크아웃 거래를 줄이기 위해 볼링거 밴드 같은 추가 필터를 추가합니다.

  4. 양방향 거래 논리를 적용해서 생산량을 늘려야 합니다.

  5. 트레이드당 손실을 제어하기 위해 스톱 로스 로직을 추가합니다.

결론

요약하자면, 이 전략은 트렌드 방향과 엔트리의 타이밍을 결정하기 위해 트렌드 및 이동 평균 크로스오버 지표를 결합합니다. 적절한 리스크 제어로 좋은 수익을 얻을 수 있습니다. 직선적인 논리는 다양한 시장 조건에서 쉽게 이해하고 최적화 할 수 있으며 초보자에게 적합합니다.


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Shaff Trend Cycle coded by Alex Orekhov (everget)
// Strategy and its additional conditions provided by greenmask
// Schaff Trend Cycle script may be freely distributed under the MIT license.
strategy("STC", shorttitle="STC")

fastLength = input(title="MACD Fast Length", type=input.integer, defval=23)
slowLength = input(title="MACD Slow Length", type=input.integer, defval=50)
cycleLength = input(title="Cycle Length", type=input.integer, defval=10)
d1Length = input(title="1st %D Length", type=input.integer, defval=3)
d2Length = input(title="2nd %D Length", type=input.integer, defval=3)
src = close
highlightBreakouts = input(title="Highlight Breakouts ?", type=input.bool, defval=true)

macd = ema(src, fastLength) - ema(src, slowLength)
k = nz(fixnan(stoch(macd, macd, macd, cycleLength)))
d = ema(k, d1Length)
kd = nz(fixnan(stoch(d, d, d, cycleLength)))
stc = ema(kd, d2Length)
stc := 	stc > 100 ? 100 : stc < 0 ? 0 : stc
stcColor = not highlightBreakouts ? (stc > stc[1] ? color.green : color.red) : #ff3013
stcPlot = plot(stc, title="STC", color=stcColor, transp=0)
upper = 75
lower = 25
transparent = color.new(color.white, 100)
upperLevel = plot(upper, title="Upper", color=color.gray)
hline(50, title="Middle", linestyle=hline.style_dotted)
lowerLevel = plot(lower, title="Lower", color=color.gray)

fill(upperLevel, lowerLevel, color=#f9cb9c, transp=90)

upperFillColor = stc > upper and highlightBreakouts ? color.green : transparent
lowerFillColor = stc < lower and highlightBreakouts ? color.red : transparent

fill(upperLevel, stcPlot, color=upperFillColor, transp=80)
fill(lowerLevel, stcPlot, color=lowerFillColor, transp=80)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
targetvalue = input(title="Target/stop", type=input.integer, defval=400)

ma1length = input(title="SMA1", type=input.integer, defval=35)
ma2length = input(title="SMA2", type=input.integer, defval=200)
ma1 = ema(close,ma1length)
ma2 = ema(close,ma2length)

bullbuy = crossover(stc, lower) and ma1>ma2 and close>ma1
bearsell = crossunder(stc, upper) and ma1<ma2 and close<ma1

if (bullbuy)
    strategy.entry("Riposte", strategy.long, ordersize)
    strategy.exit( "Riposte close", from_entry="Riposte", qty_percent=100, profit=targetvalue,loss=targetvalue)

if (bearsell)
    strategy.entry("Riposte", strategy.short, ordersize)
    strategy.exit( "Riposte close", from_entry="Riposte", qty_percent=100, profit=targetvalue,loss=targetvalue)

//plotshape(bullbuy,  title= "Purple", location=location.belowbar, color=#006600, transp=0, style=shape.circle, size=size.tiny, text="Riposte")
//plotshape(bearsell,  title= "Purple", location=location.abovebar, color=#006600, transp=0, style=shape.circle, size=size.tiny, text="Riposte")
















더 많은