윌리엄스 앨리게이터 스프레드 트레이딩 전략


생성 날짜: 2023-09-25 17:42:27 마지막으로 수정됨: 2023-09-25 17:42:27
복사: 0 클릭수: 1616
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 빌 윌리엄스의 해파리 지표에 기반을 두고 있지만, 다른 가격 입력을 사용하는 하이켄 아시 선을 사용한다. 이것은 1분에서 5분 시간 프레임에 적용되는 짧은 선의 스칼핑 전략이다.

전략 원칙

이 전략의 주요 거래 원칙은 다음과 같습니다.

  1. Heiken Ashi 가닥을 표준 가닥 대신 가격 입력으로 사용한다. Heiken Ashi는 시장 소음을 필터링하여 트렌드를 식별한다.

  2. 빌 윌리엄스 해파리 지표의 세 개의 평균선을 적용하십시오: 하위 해파리 라인, 치아 라인, 입술 라인. 그들은 이동 평균과 비슷하여 트렌드 방향을 판단 할 수 있습니다.

  3. 세 개의 평행선이: 하선 최저, 이빨선 중위, 입선 최상위일 때, 다목적 경향을 나타냅니다. 배열 순서가: 하선 최상위, 이빨선 중위, 입선 최저일 때, 공허 경향을 나타냅니다.

  4. Heiken Ashi 개체 방향과 조어줄 배열 상황에 따라 진입을 판단한다. 개체가 위쪽으로 그리고 조어줄 배열이 더 많이 보인다면, 더 많이 한다. 개체가 아래로 그리고 조어줄 배열이 공허인다면, 공허한다.

  5. 갈매기 선의 배열 순서가 바뀌면, 트렌드가 반전되는 것을 나타내고, 적시에 피해를 막아야 한다.

  6. 고정된 스톱, 스톱로스 포인트를 사용하여 리스크 관리를 한다. 선택 가능한 목표 수익 포인트, 스톱로스 포인트, 추적 스톱로스는 각 손실을 제어한다.

이 전략은 Heiken Ashi를 사용하여 트렌드를 인식하고, 상어선을 사용하여 반향을 판단하는 두 개의 필터를 결합하여 높은 확률의 단선 거래 전략을 형성한다.

우위 분석

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

  1. 이중 지표 필터링은 가짜 신호를 줄여줍니다. 하이켄 아시와 해파리의 조합은 신호 품질을 향상시킵니다.

  2. 명확하고 직관적인 추세 판단 어줄의 배열은 명확하고 신뢰할 수 있으며 모호한 상황을 발생시키지 않습니다

  3. 효율적인 단선 거래 캡처. 1분에서 5분 사이클의 스칼핑 거래에 적합하다.

  4. 간단한 변수 설정. 복잡한 최적화가 필요하지 않고, 소수의 변수만 사용할 수 있습니다.

  5. 엄격한 위험 관리. 스톱 스톱 손실 포인트를 사용하여 각 손실을 제어한다.

  6. 명확한 입출력 메커니즘. 어선 배열의 변화에 따라 평점을 열기.

  7. 이 전략은 초보자도 쉽게 사용할 수 있다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 철회 위험: 고래줄은 거래 빈도와 슬라이드 포인트 비용을 증가시킬 수 있는 빈번한 신호를 생성한다.

  2. 흔들림 현상 위험 ᆞ 재조정 현상 중 고래줄이 자주 교차하여 잘못된 신호를 발생 ᆞ

  3. 오버 최적화 위험. 파라미터를 적절하게 최적화하지 않으면 곡선이 오버 적합해질 수 있다.

  4. 지표 실패의 위험. 시장의 극단적 상황에서는 낚시선이 완전히 실패할 수 있다.

  5. 스톱더는 뚫릴 위험이 있다. 급속한 뚫림으로 스톱더의 손실이 발생할 수 있다.

  6. 거래 빈도가 너무 높은 위험. 거래 빈도가 높은 거래는 거래 비용을 증가시키고 불필요한 슬라이드 포인트를 잃습니다.

기대치 (expectancy) 관리를 통해, 손실을 막는 전략을 최적화하고, 거래 빈도를 제어하는 방법 등으로 위와 같은 위험을 완화할 수 있다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다른 지표들을 통합하여 신호를 필터링하여 승률을 높인다. 예를 들어 RSI와 같은 강한 지표들을 결합한다.

  2. ATR 다이내믹 스톱을 설정하여 단편 손실 위험을 제어합니다.

  3. 포지션 관리 모듈을 추가하여 포지션 개설마다 포지션 규모를 최적화할 수 있습니다.

  4. 그래픽 형태와 같은 기술 분석 방법과 결합하여 입시의 정확성을 향상시킵니다.

  5. 시장 유형에 따라 ((주식, 외환 등) 파라미터를 최적화하여 그 품종에 더 적합하게 만듭니다.

  6. 기계 학습 모듈을 추가하여 파라미터의 적응적 최적화를 구현한다.

  7. Expectancy 승률을 계산하고, 스톱 스톱 손실 비율을 최적화한다.

이 전략은 지속적으로 개선하면 안정적인 단선 거래 전략이 될 수 있다.

요약하다

이 전략은 Heiken Ashi와 빌 윌리엄스 해킹 지표를 사용하여 높은 확률의 단선 거래 전략을 형성한다. 그것은 지표 듀얼 필터링, 간단한 매개 변수 설정, 명확한 입출력 메커니즘과 같은 장점을 가지고 있으며, 트렌드 변화를 효과적으로 캡처하여 스칼핑 거래를 할 수 있다. 그러나 또한 시장에서 발생하는 휘파람 시장의 whipsaws 거래 오류를 경계하고, 손실 위험을 제어해야합니다.

전략 소스 코드
/*backtest
start: 2022-09-18 00:00:00
end: 2023-09-24 00:00:00
period: 4d
basePeriod: 1d
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/
// © 03.freeman
//Scalping strategy based on Bill Williams Alligator technique but applied to heikin ashi candles
//This strategy has to be applied to standard candles and low time frames (1min to 5min)
//@version=4
strategy("Bill Williams Alligator improved", shorttitle="Scalping alligator",overlay=true)
//source = input(close)
useHA = input (true,"Use heikin ashi candle?")

// ----------MA calculation - ChartArt-------------
smoothinput = input(1, minval=1, maxval=5, title='Moving Average Calculation: (1=SMA), (2=EMA), (3=WMA), (4=Linear), (5=VWMA)')

calc_ma(src,l) => 
    smoothinput == 1 ? sma(src, l):smoothinput == 2 ? ema(src, l):smoothinput == 3 ? wma(src, l):smoothinput == 4 ? linreg(src, l,0):smoothinput == 5 ? vwma(src,l):na
//----------------------------------------------

heikinashi_close = security(heikinashi(syminfo.tickerid), timeframe.period, close)
heikinashi_open = security(heikinashi(syminfo.tickerid), timeframe.period, open)
heikinashi_hl2 = security(heikinashi(syminfo.tickerid), timeframe.period, hl2)

direzione=heikinashi_close>heikinashi_open and heikinashi_close[1]>heikinashi_open[1]? 1 : heikinashi_close<heikinashi_open and heikinashi_close[1]<heikinashi_open[1]? -1 : 0

jawLength = input(13, minval=1, title="Jaw Length")
teethLength = input(8, minval=1, title="Teeth Length")
lipsLength = input(5, minval=1, title="Lips Length")
jawOffset = input(8, title="Jaw Offset")
teethOffset = input(5, title="Teeth Offset")
lipsOffset = input(3, title="Lips Offset")
jaw = calc_ma(heikinashi_hl2, jawLength)
teeth = calc_ma(heikinashi_hl2, teethLength)
lips = calc_ma(heikinashi_hl2, lipsLength)
plot(jaw, title="jaw",offset = jawOffset, color=#3BB3E4)
plot(teeth, title="teeth",offset = teethOffset, color=#FF006E)
plot(lips, title="lips",offset = lipsOffset, color=#36C711)

longCondition = direzione[0]==1 and jaw<teeth and jaw<lips and teeth<lips 
shortCondition = direzione[0]==-1 and jaw>teeth and jaw>lips and teeth>lips


//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => direzione[0]==1 and jaw<teeth and jaw<lips and teeth<lips // functions can be used to wrap up and work out complex conditions
exitLong() => jaw>teeth or jaw>lips or teeth>lips
strategy.entry(id = "Buy", long = true, when = enterLong() )    // use function or simple condition to decide when to get in
strategy.close(id = "Buy", when = exitLong() )                  // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort() => direzione[0]==-1 and jaw>teeth and jaw>lips and teeth>lips
exitShort() => jaw<teeth or jaw<lips or teeth<lips
strategy.entry(id = "Sell", long = false, when = enterShort())
strategy.close(id = "Sell", when = exitShort() )

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testStopHour = input(23, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()