사용자 정의 가능한 Ichimoku 클라우드 거래 전략

저자:차오장, 날짜: 2023-09-12 16:31:44
태그:

이 전략은 이치모쿠 클라우드의 모든 매개 변수와 조건을 완벽하게 사용자 정의하여 이치모쿠 거래에서 궁극적인 유연성을 제공합니다. 다양한 시장 환경에 맞게 다양한 이치모쿠 방법을 복제 할 수 있습니다.

전략 논리:

  1. 텐칸, 키준, 센코 A, 센코 B, 치코 라인을 계산합니다.

  2. 긴 입력 조건의 커스터마이징 가능한 조합을 정의합니다.

  3. 긴 출구 조건의 커스터마이징 가능한 조합을 정의합니다.

  4. 설정된 조건이 충족되면 시각적으로 표시합니다.

  5. 조건에 기반한 거래 입출입, 선택적 중지/이익 취득

장점:

  1. 완전히 사용자 정의 가능한 매개 변수는 개인 거래 스타일과 일치합니다.

  2. 컨디션 콤보는 잘못된 신호를 필터하고 안정성을 향상시킵니다.

  3. 시각 보조는 직관적으로 시장 상태를 반영합니다.

  4. 유연한 테스트 / 최적화 다양한 시장에 적응합니다.

위험성:

  1. 완전한 커스터마이징은 광범위한 테스트를 필요로 하는 복잡성을 도입합니다.

  2. 나쁜 매개 변수는 손실로 이어질 수 있어 신중한 테스트가 필요합니다.

  3. 너무 복잡한 상태 조합은 좋은 기회를 놓칠 수 있습니다.

요약하자면, 이 전략은 이치모쿠 거래 시스템의 높은 사용자 정의를 가능하게 한다. 사용자는 자신의 선호도와 시장 조건에 맞게 매개 변수와 조건을 조정할 수 있다. 그러나 의도하지 않은 위험을 피하기 위해 신중한 테스트가 필요하다.


/*backtest
start: 2023-08-12 00:00:00
end: 2023-09-11 00:00:00
period: 2h
basePeriod: 15m
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/
// © antondmt

//@version=5
strategy("Ultimate Ichimoku Cloud Strategy", "UIC Strategy", true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, process_orders_on_close = true)
// Inputs {
// Backtest Range
i_time_start =              input(timestamp("2015-12-12T00:00:00"), "Start Date", group = "Backtest Range")
i_time_finish =             input(timestamp("2022-12-12T00:00:00"), "Finish Date", group = "Backtest Range")

// Ichimoku Lines
i_show_conversion =         input(false, "Show Conversion Line (Tenkan Sen)", group = "Ichimoku Lines")
i_show_base =               input(false, "Show Base Line (Kijun Sen)", group = "Ichimoku Lines")
i_show_lagging =            input(false, "Show Lagging Span (Chikou Span)", group = "Ichimoku Lines")
i_show_span_A =             input(false, "Show Leading Span A (Senkou Span A)", group = "Ichimoku Lines")
i_show_span_B =             input(false, "Show Leading Span B (Senkou Span B)", group = "Ichimoku Lines")
i_show_all =                input(true, "Show All Lines", group = "Ichimoku Lines")

// Ichimoku Periods
i_conversion_line_period =  input(9, "Conversion Period", 1, group = "Ichimoku Periods")
i_base_line_period =        input(26, "Base Line Period", 1, group = "Ichimoku Periods")
i_leading_span_period =     input(52, "Lagging Span Period", 1, group = "Ichimoku Periods")
i_displacement =            input(26, "Displacement", 1, group = "Ichimoku Periods")

// Ichimoku Long Conditions
i_long_cond_1 =             input(true, "Conversion Crosses Base", "Conversion line crosses up on base line.", group = "Ichimoku Long Conditions")
i_long_cond_2 =             input(false, "Conversion Above Base", "Conversion line is above base line", group = "Ichimoku Long Conditions")
i_long_cond_3 =             input(true, "Positive Cloud", "Cloud has to be positive. Span A > Span B.", group = "Ichimoku Long Conditions")
i_long_cond_4 =             input(true, "Price Above Cloud", "Price has to be above the clouds.", group = "Ichimoku Long Conditions")
i_long_cond_5 =             input(true, "Positive Chikou", "Lagging span has to be higher than price at displacement.", group = "Ichimoku Long Conditions")
i_long_cond_6 =             input(true, "Price Above Conversion", "Price has to be higher than conversion line.", group = "Ichimoku Long Conditions")
i_long_cond_show =          input(false, "Show Condititons Visually", "Draws lines when condition is true.", group = "Ichimoku Long Conditions")

// Ichimoku Short Conditions 
i_short_cond_1 =            input(true, "Base Crosses Conversion", "Base line crosses up on conversion line.", group = "Ichimoku Short Conditions")
i_short_cond_2 =            input(false, "Base Above Conversion", "Base line is above conversion line", group = "Ichimoku Short Conditions")
i_short_cond_3 =            input(true, "Negative Cloud", "Cloud has to be negative. Span B > Span A.", group = "Ichimoku Short Conditions")
i_short_cond_4 =            input(true, "Price Below Cloud", "Price has to be below the clouds.", group = "Ichimoku Short Conditions")
i_short_cond_5 =            input(true, "Negative Chikou", "Lagging span has to be lower than price at displacement.", group = "Ichimoku Short Conditions")
i_short_cond_6 =            input(true, "Price Below Base", "Price has to be lower than base line.", group = "Ichimoku Short Conditions")
i_short_cond_show =         input(false, "Show Condititons Visually", "Draws lines when condition is true.", group = "Ichimoku Short Conditions")

// Ichimoku Long Exit Conditions
i_sell_long_cond_1 =        input(true, "Base Crosses Conversion", "Base line crosses up on conversion line.", group = "Ichimoku Long Exit Conditions")
i_sell_long_cond_2 =        input(false, "Negative Chikou", "Lagging span is lower than price at displacement.", group = "Ichimoku Long Exit Conditions")
i_sell_long_cond_show =     input(false, "Show Condititons Visually", "Draws lines when condition is true.", group = "Ichimoku Long Exit Conditions")

// Ichimoku Short Exit Conditions
i_sell_short_cond_1 =       input(true, "Conversion Crosses Base", "Conversion line crosses up on base line.", group = "Ichimoku Short Exit Conditions")
i_sell_short_cond_2 =       input(false, "Positive Chikou", "Lagging span is higher than price at displacement.", group = "Ichimoku Short Exit Conditions")
i_sell_short_cond_show =    input(false, "Show Condititons Visually", "Draws lines when condition is true.", group = "Ichimoku Short Exit Conditions")

// Exits vs TP/SL
i_use_SLTP =                input(false, "Use SL and TP Instead of Exits", group = "Exits vs TP/SL")
i_TP =                      input(2, "Take Profit (%)", group = "Exits vs TP/SL")
i_SL =                      input(1, "Stop Loss (%)", group = "Exits vs TP/SL")
// }

// Ichimoku Calculations {
donchian(len) =>
    math.avg(ta.lowest(len), ta.highest(len))
conversion_line = donchian(i_conversion_line_period)
base_line = donchian(i_base_line_period)
leading_span_A = math.avg(conversion_line, base_line)
leading_span_B = donchian(i_leading_span_period)
// }

// Entries and Exits Logic { 
long_entry = false
if(i_long_cond_1 or i_long_cond_2 or i_long_cond_3 or i_long_cond_4 or i_long_cond_5 or i_long_cond_6)
    long_entry := (i_long_cond_1 ? ta.crossover(conversion_line, base_line) : true) 
         and (i_long_cond_2 ? conversion_line > base_line : true)
         and (i_long_cond_3 ? leading_span_A[i_displacement - 1] > leading_span_B[i_displacement - 1] : true) 
         and (i_long_cond_4 ? close > leading_span_A[i_displacement - 1] and close > leading_span_B[i_displacement - 1] : true) 
         and (i_long_cond_5 ? close > nz(close[i_displacement + 1], close) : true) 
         and (i_long_cond_6 ? close > conversion_line : true)
         
short_entry = false
if(i_short_cond_1 or i_short_cond_2 or i_short_cond_3 or i_short_cond_4 or i_short_cond_5)
    short_entry := (i_short_cond_1 ? ta.crossunder(conversion_line, base_line) : true) 
         and (i_short_cond_2 ? base_line > conversion_line : true)
         and (i_short_cond_3 ? leading_span_A[i_displacement - 1] < leading_span_B[i_displacement - 1] : true) 
         and (i_short_cond_4 ? close < leading_span_A[i_displacement - 1] and close < leading_span_B[i_displacement - 1] : true) 
         and (i_short_cond_5 ? close < nz(close[i_displacement + 1], close) : true) 
         and (i_short_cond_6 ? close < base_line : true)
         
long_exit = false
if(i_sell_long_cond_1 or i_sell_long_cond_2)
    long_exit := (i_sell_long_cond_1 ? ta.crossunder(conversion_line, base_line) : true) 
         and (i_sell_long_cond_2 ? close < nz(close[i_displacement + 1], close) : true) 
         
short_exit = false
if(i_sell_short_cond_1 or i_sell_short_cond_2)
    short_exit := (i_sell_short_cond_1 ? ta.crossover(conversion_line, base_line) : true) 
         and (i_sell_short_cond_2 ? close > nz(close[i_displacement + 1], close) : true) 

dateRange() => 
    true
// }

// Entries and Exits {
if(strategy.position_size <= 0 and long_entry and dateRange())
    strategy.entry("Long", strategy.long)
if(long_exit and not i_use_SLTP)
    strategy.close("Long")
else if(i_use_SLTP)
    strategy.exit("TP/SL", "Long", stop = strategy.position_avg_price * (1 - i_SL / 100), limit = strategy.position_avg_price * (1 + i_TP / 100))


if(strategy.position_size >= 0 and short_entry and dateRange())
    strategy.entry("Short", strategy.short)
if(short_exit and not i_use_SLTP)
    strategy.close("Short")
else if(i_use_SLTP)
    strategy.exit("TP/SL", "Short", stop = strategy.position_avg_price * (1 + i_SL / 100), limit = strategy.position_avg_price * (1 - i_TP / 100))
// }

// Plots { 
plot(i_show_all or i_show_conversion ? conversion_line : na, "Conversion Line (Tenkan Sen)", color.new(#0496ff, 0), 2)
plot(i_show_all or i_show_base ? base_line : na, "Base Line (Kijun Sen)", color.new(#991515, 0), 2)
plot(i_show_all or i_show_lagging ? close : na, "Lagging Span (Chikou Span)", color.new(color.yellow, 0), 2, offset = -i_displacement + 1)
span_A = plot(i_show_all or i_show_span_A ? leading_span_A : na, "Leading Span A (Senkou Span A)", color.new(color.green, 0), offset = i_displacement - 1)
span_B = plot(i_show_all or i_show_span_B ? leading_span_B : na, "Leading Span B (Senkou Span B)", color.new(color.red, 0), offset = i_displacement - 1)
fill(span_A, span_B, leading_span_A > leading_span_B ? color.new(color.green, 90) : color.new(color.red, 90), "Cloud Colors")

bgcolor(i_long_cond_show and long_entry ? color.new(color.green, 40) : na)
bgcolor(i_short_cond_show and short_entry ? color.new(color.red, 40) : na)
bgcolor(i_sell_long_cond_show and long_exit ? color.new(color.purple, 40) : na)
bgcolor(i_sell_short_cond_show and short_exit ? color.new(color.aqua, 40) : na)
// }

더 많은