트레이딩을 위한 Ichimoku Cloud Nine 전략


생성 날짜: 2024-02-19 11:35:05 마지막으로 수정됨: 2024-02-19 11:35:05
복사: 0 클릭수: 551
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

트레이딩을 위한 Ichimoku Cloud Nine 전략

개요

이치모쿠 클라우드 9 전략은 이치모쿠 클라우드 지표에 기반하여 윌리엄스 계열과 결합된 거래 전략이다. 이 전략은 이치모쿠 클라우드 지표에서 제공하는 여러 거래 신호를 사용하여 거래 신호를 생성한다. 이것은 실제 거래에 대한 전략이다.

전략 원칙

이 전략은 주로 다음과 같은 몇 가지 이치모쿠 신호를 기반으로 진행됩니다.

  1. 클라우드 브레이크: 클라우드의 상단 또는 하단 가장자리를 뚫고 가격이 닫히면 신호가 발생합니다.
  2. TK 교차: 회전선 ((Tenkan) 과 기준선 ((Kijun) 이 교차할 때 발생하는 신호
  3. 구름 회전: Senkou Span A 선과 Senkou Span B 선이 교차할 때 신호가 발생
  4. 경계교차: 가격이 한쪽 구름에서 다른 쪽 구름으로 들어가면 신호가 발생한다

이 전략은 다음과 같은 경우에도 적용됩니다:

  1. 가격 마감과 함께 평준화
  2. TK 역 교차 시 평점
  3. 윌리엄스 종류가 돌파할 때 부분 평지

이 전략은 이치모쿠 클라우드 그래프의 여러 거래 신호를 통합하여 거래 신호의 신뢰성을 높이는 동시에 스포트라인을 사용하여 스톱로스를 설정하고 위험을 제어하는 것을 목표로합니다.

전략적 이점

단일 신호의 전략에 비해 이 전략은 Ichimoku Cloud Graph의 여러 신호를 종합적으로 활용하여 일부 잘못된 신호를 필터링하여 신호의 정확도를 향상시킬 수 있다. 또한, 정책의 매개 변수는 다양한 품종과 매개 변수 최적화에 적합하도록 유연하게 구성될 수 있다.

또한, 전략에 Williams 계열의 브레이크를 도입하여 스톱로드를 설정하여 위험을 더 적극적으로 제어하고 수익을 잠금화하여 큰 손실을 피할 수 있습니다.

전략적 위험

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

  1. 클라우드 그래프 지표의 지연성으로 인해 가격 변화가 적시에 반영되지 않습니다.
  2. 다중 신호는 너무 보수적이어서 일부 기회를 놓칠 수 있습니다.
  3. 분형 정지 손실은 돌파구로 인해 발생할 수 있습니다.

지연성에 대한 문제를 위해, 적절히 파라미터를 조정하거나, 부분 필터링 신호를 종료할 수 있다. 분형 중단 위험에 대해, 분형의 시간 주기를 조정할 수 있다, 또는 부분만 중단한다.

전략 최적화 방향

이 전략은 다음의 몇 가지 측면에서 최적화될 수 있습니다.

  1. 이치모쿠 변수를 다른 주기 및 품종에 맞게 조정
  2. 부분 필터링 신호를 조정하거나 종료하고 핵심 신호를 유지합니다.
  3. 더 큰 시간 주기의 분형 또는 부분 손실만을 사용하는 분형의 변수를 조정합니다.
  4. 다른 지표들을 필터링하는 것, 예를 들어 양력 지표들

요약하다

이치모쿠 클라우드 9 전략은 이치모쿠 클라우드 그래프의 여러 거래 신호를 통합하여 클라우드 그래프 지표의 장점을 발휘하면서 신호의 정확도와 승률을 높인다. 이 전략은 또한 스포트라스트로써의 분류를 사용하여 위험을 통제한다. 이 전략은 파라미터와 신호를 통해 최적화되어 여러 종류의 알고리즘 거래에 적용될 수 있다.

전략 소스 코드
/*backtest
start: 2024-01-19 00:00:00
end: 2024-02-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Ichimoku Cloud Nine", shorttitle="Ichimoku Cloud Nine", overlay=true, calc_on_every_tick = true, calc_on_order_fills = false, initial_capital = 5000, currency = "USD", default_qty_type = "percent_of_equity", default_qty_value = 10, pyramiding = 3, process_orders_on_close = true)

color green = #459915
color red = #991515

// --------
// Fractals
// --------

// Define "n" as the number of periods and keep a minimum value of 2 for error handling.
close_on_fractal = input.bool(false, title="Use William Fractals for SL?", group = "Fractals")
n = input.int(title="Periods", defval=2, minval=2, group = "Fractals")
fractal_close_percentage = input.int(100, minval=1, maxval=100, title="Position % to close on fractal breach", group = "Fractals")
selected_fractals_timeframe = input.timeframe('Current', "Timeframe", options=["Current", "1D", "12H", "8H", "4H", "1H"], group = "Fractals", tooltip = "Timeframe to use to look for fractals. Example: if 12H is selected, it will close positions when the last 12H fractal is breached.")

string fractals_timeframe = switch selected_fractals_timeframe
    "1D" => "1D"
    "12H" => "720"
    "8H" => "480"
    "4H" => "240"
    "1H" => "60"
    // Default used when the three first cases do not match.
    => ""

prev_high = request.security(syminfo.tickerid, fractals_timeframe, high)
prev_low = request.security(syminfo.tickerid, fractals_timeframe, low)

period_high=prev_high
period_low=prev_low

// UpFractal
bool upflagDownFrontier = true
bool upflagUpFrontier0 = true
bool upflagUpFrontier1 = true
bool upflagUpFrontier2 = true
bool upflagUpFrontier3 = true
bool upflagUpFrontier4 = true

for i = 1 to n
    upflagDownFrontier := upflagDownFrontier and (period_high[n-i] < period_high[n])
    upflagUpFrontier0 := upflagUpFrontier0 and (period_high[n+i] < period_high[n])
    upflagUpFrontier1 := upflagUpFrontier1 and (period_high[n+1] <= period_high[n] and period_high[n+i + 1] < period_high[n])
    upflagUpFrontier2 := upflagUpFrontier2 and (period_high[n+1] <= period_high[n] and period_high[n+2] <= period_high[n] and period_high[n+i + 2] < period_high[n])
    upflagUpFrontier3 := upflagUpFrontier3 and (period_high[n+1] <= period_high[n] and period_high[n+2] <= period_high[n] and period_high[n+3] <= period_high[n] and period_high[n+i + 3] < period_high[n])
    upflagUpFrontier4 := upflagUpFrontier4 and (period_high[n+1] <= period_high[n] and period_high[n+2] <= period_high[n] and period_high[n+3] <= period_high[n] and period_high[n+4] <= period_high[n] and period_high[n+i + 4] < period_high[n])
flagUpFrontier = upflagUpFrontier0 or upflagUpFrontier1 or upflagUpFrontier2 or upflagUpFrontier3 or upflagUpFrontier4

upFractal = (upflagDownFrontier and flagUpFrontier)

var float upFractalPrice = 0

if (upFractal)
    upFractalPrice := period_high[n]

// downFractal
bool downflagDownFrontier = true
bool downflagUpFrontier0 = true
bool downflagUpFrontier1 = true
bool downflagUpFrontier2 = true
bool downflagUpFrontier3 = true
bool downflagUpFrontier4 = true

for i = 1 to n
    downflagDownFrontier := downflagDownFrontier and (period_low[n-i] > period_low[n])
    downflagUpFrontier0 := downflagUpFrontier0 and (period_low[n+i] > period_low[n])
    downflagUpFrontier1 := downflagUpFrontier1 and (period_low[n+1] >= period_low[n] and period_low[n+i + 1] > period_low[n])
    downflagUpFrontier2 := downflagUpFrontier2 and (period_low[n+1] >= period_low[n] and period_low[n+2] >= period_low[n] and period_low[n+i + 2] > period_low[n])
    downflagUpFrontier3 := downflagUpFrontier3 and (period_low[n+1] >= period_low[n] and period_low[n+2] >= period_low[n] and period_low[n+3] >= period_low[n] and period_low[n+i + 3] > period_low[n])
    downflagUpFrontier4 := downflagUpFrontier4 and (period_low[n+1] >= period_low[n] and period_low[n+2] >= period_low[n] and period_low[n+3] >= period_low[n] and period_low[n+4] >= period_low[n] and period_low[n+i + 4] > period_low[n])
flagDownFrontier = downflagUpFrontier0 or downflagUpFrontier1 or downflagUpFrontier2 or downflagUpFrontier3 or downflagUpFrontier4

downFractal = (downflagDownFrontier and flagDownFrontier)

var float downFractalPrice = 0

if (downFractal)
    downFractalPrice := period_low[n]

plotshape(downFractal, style=shape.triangledown, location=location.belowbar, offset=-n, color=#F44336, size = size.auto)
plotshape(upFractal, style=shape.triangleup,   location=location.abovebar, offset=-n, color=#009688, size = size.auto)

// --------
// Ichimoku
// --------

previous_close = close[1]

conversionPeriods = input.int(20, minval=1, title="Conversion Line Periods", group = "Cloud Settings"),
basePeriods = input.int(60, minval=1, title="Base Line Periods", group = "Cloud Settings")
laggingSpan2Periods = input.int(120, minval=1, title="Lagging Span 2 Periods", group = "Cloud Settings"),
displacement = input.int(30, minval=1, title="Displacement", group = "Cloud Settings")


long_entry = input.bool(true, title="Longs", group = "Entries", tooltip = "Will look for longs")
short_entry = input.bool(true, title="Shorts", group = "Entries", tooltip = "Will look for shorts")
wait_for_twist = input.bool(true, title="Wait for kumo twist?", group = "Entries", tooltip = "Will wait for the Kumo to turn green (longs) or red (shorts)")
ignore_lagging_span = input.bool(true, title="Ignore Lagging Span Signal?", group = "Entries", tooltip = "Will not wait for lagging span to be above/below price and cloud")
bounce_entry = input.bool(true, title="Kijun Bounce", group = "Entries", tooltip = "Will enter position on a Kijun bounce")

e2e_entry = input.bool(true, title="Enable", group = "Edge 2 Edge", tooltip = "Will look for edge-to-edge trades")
e2e_entry_tk_confluence = input.bool(true, title="Require TK Confluence?", group = "Edge 2 Edge", tooltip = "Require confluent TK cross in order to enter an e2e trade")
min_cloud_thickness = input.float(10, minval=1, title="Minimun Cloud Thickness (%)", group = "Edge 2 Edge", tooltip = "Minimum cloud thickness for entering e2e trades")

donchian(len) => math.avg(ta.lowest(len), ta.highest(len))

tenkan = donchian(conversionPeriods)
kijun = donchian(basePeriods)
spanA = math.avg(tenkan, kijun)
spanB = donchian(laggingSpan2Periods)

plot(tenkan, color=#0496ff, title="Tenkan-Sen", linewidth = 2)
plot(kijun, color=red, title="Kijun-Sen", linewidth = 2)
plot(close, offset = -displacement, color=color.gray, title="Chikou Span")

p1 = plot(spanA, offset = displacement, color=green, title="Senkou Span A")
p2 = plot(spanB, offset = displacement, color=red, title="Senkou Span B")
fill(p1, p2, color = spanA > spanB ? color.new(green, 50) : color.new(red, 50))

cloud_high = math.max(spanA[displacement], spanB[displacement])
cloud_low = math.min(spanA[displacement], spanB[displacement])

lagging_span_above_price_and_cloud = (close > close[displacement] and close > cloud_high[displacement]) or ignore_lagging_span
lagging_span_below_price_and_cloud = (close < close[displacement] and close < cloud_low[displacement]) or ignore_lagging_span

step1=cloud_high-cloud_low
step2=(cloud_high+cloud_low)/2
cloud_thickness = (step1/step2)*100

// --------
// Trades
// --------

// LONGS
// kumo breakout
if (long_entry and ta.crossover(close, cloud_high) and tenkan > kijun and close > kijun and lagging_span_above_price_and_cloud and (not wait_for_twist or spanA > spanB))
    comment = "Long - Kumo Breakout"
    strategy.entry("Long", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

// tk cross above cloud
if (long_entry and close > cloud_high and ta.crossover(tenkan, kijun) and lagging_span_above_price_and_cloud and (not wait_for_twist or spanA > spanB))
    comment = "Long - TK Cross"
    strategy.entry("Long", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

// kumo twist
if (long_entry and close > cloud_high and tenkan > kijun and ta.crossover(spanA, spanB) and lagging_span_above_price_and_cloud)
    comment = "Long - Kumo Twist"
    strategy.entry("Long", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

// close inside cloud
if (ta.crossunder(close, cloud_high))
    comment = "Close Long - Close inside cloud"
    strategy.close("Long", comment = comment)
    alert(comment, alert.freq_once_per_bar)

// bearish tk cross
if (ta.crossunder(tenkan, kijun))
    comment = "Close Long - TK Cross"
    strategy.close("Long", comment = comment)
    alert(comment, alert.freq_once_per_bar)


if (close_on_fractal and ta.crossunder(low, downFractalPrice))
    comment = "Close Long - Fractal"
    strategy.close("Long", comment = comment, qty_percent = fractal_close_percentage)
    alert(comment, alert.freq_once_per_bar)


// SHORTS
// kumo breakout
if (short_entry and ta.crossunder(close, cloud_low) and tenkan < kijun and close < kijun and lagging_span_below_price_and_cloud and (not wait_for_twist or spanA < spanB))
    comment = "Short - Kumo Breakout"
    strategy.entry("Short", strategy.short, comment = comment)
    alert(comment, alert.freq_once_per_bar)

// tk cross below cloud
if (short_entry and close < cloud_low and ta.crossunder(tenkan, kijun) and lagging_span_below_price_and_cloud and (not wait_for_twist or spanA < spanB))
    comment = "Short - TK Cross"
    strategy.entry("Short", strategy.short, comment = comment)
    alert(comment, alert.freq_once_per_bar)

// kumo twist
if (short_entry and close < cloud_low and tenkan < kijun and lagging_span_below_price_and_cloud and ta.crossunder(spanA, spanB))
    comment = "Short - Kumo Twist"
    strategy.entry("Short", strategy.short, comment = comment)
    alert(comment, alert.freq_once_per_bar)

// close inside cloud
if (ta.crossover(close, cloud_low))
    comment = "Close Short - Close inside cloud"
    strategy.close("Short", comment = comment)
    alert(comment, alert.freq_once_per_bar)

// bullish tk cross
if (ta.crossover(tenkan, kijun))
    comment = "Close Short - TK Cross"
    strategy.close("Short", comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (close_on_fractal and ta.crossover(high, upFractalPrice))
    comment = "Close Short - Fractal"
    strategy.close("Short", comment = comment, qty_percent = fractal_close_percentage)
    alert(comment, alert.freq_once_per_bar)


// BULL EDGE TO EDGE
if (e2e_entry and e2e_entry_tk_confluence and ta.crossover(close, cloud_low) and tenkan > kijun and open > kijun and cloud_thickness > min_cloud_thickness)
    comment = "Long e2e"
    strategy.entry("Long e2e", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (e2e_entry and not e2e_entry_tk_confluence and ta.crossover(close, cloud_low) and open > kijun and cloud_thickness > min_cloud_thickness)
    comment = "Long e2e"
    strategy.entry("Long e2e", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (ta.cross(high, cloud_high))
    comment = "Close Long e2e - Target Hit"
    strategy.close("Long e2e", comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (ta.crossunder(close, cloud_low))
    comment = "Close Long e2e - Close below cloud"
    strategy.close("Long e2e", comment = comment)
    alert(comment, alert.freq_once_per_bar)
 
if (close_on_fractal and ta.crossunder(low, downFractalPrice))
    comment = "Close Long e2e - Fractal"
    strategy.close("Long e2e", comment = comment, qty_percent = fractal_close_percentage)
    alert(comment, alert.freq_once_per_bar)

// BEAR EDGE TO EDGE
if (e2e_entry and e2e_entry_tk_confluence and ta.crossunder(close, cloud_high) and tenkan < kijun and open < kijun and cloud_thickness > min_cloud_thickness)
    comment = "Short e2e"
    strategy.entry("Short e2e", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (e2e_entry and not e2e_entry_tk_confluence and ta.crossunder(close, cloud_high) and open < kijun and cloud_thickness > min_cloud_thickness)
    comment = "Short e2e"
    strategy.entry("Short e2e", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (ta.cross(low, cloud_low))
    comment = "Close Short e2e - Target Hit"
    strategy.close("Short e2e", comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (ta.crossover(close, cloud_high))
    comment = "Close Short e2e - Close below cloud"
    strategy.close("Short e2e", comment = comment)
    alert(comment, alert.freq_once_per_bar)
 
if (close_on_fractal and ta.crossover(high, upFractalPrice))
    comment = "Close Short e2e - Fractal"
    strategy.close("Short e2e", comment = comment, qty_percent = fractal_close_percentage)
    alert(comment, alert.freq_once_per_bar)

// Kijun Bounce
if (bounce_entry and long_entry and open > cloud_high and open > kijun and ta.crossunder(low, kijun) and close > kijun and tenkan > kijun and kijun > cloud_high and lagging_span_above_price_and_cloud)
    comment = "Long - Kijun Bounce"
    strategy.entry("Long", strategy.long, comment = comment)
    alert(comment, alert.freq_once_per_bar)

if (bounce_entry and short_entry and open < cloud_low and open < kijun and ta.crossover(high, kijun) and close < kijun and tenkan < kijun and kijun < cloud_low and lagging_span_below_price_and_cloud)
    comment = "Short - Kijun Bounce"
    strategy.entry("Short", strategy.short, comment = comment)
    alert(comment, alert.freq_once_per_bar)