本策略通过全面自定义一目均衡表(Ichimoku Kinko Hyo)各项参数和条件,实现高度灵活的均衡表交易策略。该策略可完整复制均衡表多种交易方法,适应不同市场环境。
策略原理:
计算转换线、基準线、前导线1、前导线2和延迟线。
根据自定义参数设置多头和空头的入场条件组合。
根据自定义参数设置多头和空头的出场条件组合。
视觉显示配置的条件达成情况。
根据入场和出场条件进行交易,可选择是否使用止损止盈。
该策略的优势:
完全自定义均衡表参数,匹配个人交易方式。
条件组合交易,可过滤假信号,提高稳定性。
视觉辅助判断,直观反映市场情况。
测试优化灵活,可适应多种市场类型。
该策略的风险:
全自定义带来的复杂度,需要花费大量时间测试。
参数不合理可能得到损失,需要谨慎测试。
过于复杂的条件组合可能导致漏失良机。
总之,该策略实现了均衡表交易策略的高度自定义,用户可根据偏好、市场情况调整参数,以达到最佳效果。但也需要谨慎测试,以免增加非系统性风险。
/*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) // }