거래 지향의 이치모쿠 클라우드 9 전략

저자:차오장, 날짜: 2024-02-19 11:35:05
태그:

img

전반적인 설명

이치모쿠 클라우드 9 전략은 윌리엄스 프랙탈의 사용과 결합한 이치모쿠 클라우드 지표 위에 구축되어 있습니다. 이치모쿠 클라우드에서 여러 거래 신호를 활용하는 거래 지향 전략입니다.

전략 논리

이 전략은 주로 다음의 이치모쿠 신호를 사용하여 거래를 합니다.

  1. 쿠모 브레이크오웃: 가격이 클라우드 위 또는 아래로 닫을 때 신호를 생성합니다.
  2. TK 크로스: 텐칸이 키을 통과할 때 신호를 생성합니다.
  3. 쿠모 트위스트: 센코 스판 A가 센코 스판 B를 가로질러 신호를 생성합니다.
  4. 엣지에서 엣지: 가격이 클라우드의 양쪽에 들어가면 신호를 생성합니다.

이 전략은 다음과 같은 상황에서 거래를 종료합니다.

  1. 클라우드 내부에서 가격 폐쇄
  2. TK 반대 방향으로 건너
  3. 반대 방향으로 윌리엄스 프랙탈의 위반

이 전략은 여러 이치모쿠 신호를 결합하여 신뢰성을 높이고 프랙탈을 스톱 로스로 사용하여 위험을 제어합니다.

장점

단일 신호 전략과 비교하면 이 전략은 여러 Ichimoku 신호를 통해 신호를 필터링하여 정확도를 향상시킵니다. 전략 매개 변수는 제품 간 최적화를 위해 유연합니다.

프랙탈을 스톱 로스로 사용하면 위험과 수익을 통제할 수 있습니다.

위험성

주요 위험은 다음과 같습니다.

  1. 이치모쿠 구름의 후진성
  2. 여러 신호가 지나치게 보수적일 수 있습니다. 놓친 기회입니다.
  3. 프랙탈 스톱 손실은 제거 될 수 있습니다

완화: 매개 변수를 조정하거나 신호를 제거합니다.

더 나은 기회

최적화의 주요 분야:

  1. 다른 제품에 Ichimoku 매개 변수를 조정
  2. 몇 가지 신호를 제거하고 핵심 규칙을 유지하십시오.
  3. 더 높은 시간 프레임 또는 일부 정지만 사용 하 여 프랙탈 매개 변수를 조정
  4. 부피와 같은 다른 지표를 추가

결론

이치모쿠 클라우드 네 전략은 정확성과 승률을 높이기 위해 신호를 결합하여 이치모쿠 거래를 향상시킵니다. 프랙탈의 사용은 위험을 관리합니다. 매개 변수와 신호는 다른 제품에서 자동 거래에 최적화 될 수 있습니다.


/*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)


더 많은