Это стратегия обратного тестирования Ichimoku с получением прибыли, остановкой потери и облачным подтверждением.
Ядром этой стратегии является построение компонентов Ichimoku на основе параметров ввода пользователя - Тенкан-Сен, Киджун-Сен, Сенку Спан А & Б и Чику Спан. Он определяет бычьи (длинные) и медвежие (короткие) сигналы, когда цена пересекает эти линии равновесия.
Кроме того, он реализует стоп-лосс и прибыль на основе входной цены для управления риском и вознаграждением. Существует также возможность ждать подтверждения облака, т.е. Senkou Span A > B для длинных и Senkou Span A < B для коротких. Это помогает избежать ложных прорывов.
Основные преимущества этой стратегии состоят из трех частей:
Ичимоку хорошо распознает тенденции и импульс.
Функции стоп-лосса и прибыли максимизируют прибыль, минимизируя риск.
Облачное подтверждение отфильтровывает ложные сигналы, обеспечивая высокую вероятность записи.
Однако есть также несколько ключевых рисков, которые следует учитывать:
Ичимоку склонна к падениям на рынках с ограниченным диапазоном, без четкой тенденции.
Облако - это индикатор отставания.
Оптимизация уровней стоп-лосса и прибыли является сложной и чувствительной задачей. Неоптимальные параметры могут привести к увеличению потерь.
Некоторые способы улучшения этой стратегии:
Объедините Ичимоку с ведущими индикаторами, такими как RSI, для дополнительного подтверждения и раннего входа.
адаптивно корректировать стоп-лосс и получать прибыль на основе волатильности вместо использования фиксированных процентов.
Испытать оптимальные параметры в различных активах и временных рамках, чтобы определить лучшие настройки для стратегии.
Включить машинное обучение для непрерывной оптимизации параметров и правил стратегии на основе обновленных данных.
Это прочная система Ichimoku с хорошими функциями улавливания трендов и управления рисками.
/*backtest start: 2022-11-17 00:00:00 end: 2023-11-23 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ strategy("Ichimoku Backtester with TP and SL", overlay=true, currency = currency.USD, default_qty_type = strategy.percent_of_equity, default_qty_value = 95) //@version=4 //Inputs ts_bars = input(9, minval=1, title="Tenkan-Sen Bars") ks_bars = input(26, minval=1, title="Kijun-Sen Bars") ssb_bars = input(52, minval=1, title="Senkou-Span B Bars") cs_offset = input(26, minval=1, title="Chikou-Span Offset") ss_offset = input(26, minval=1, title="Senkou-Span Offset") long_entry = input(true, title="Long Entry") short_entry = input(true, title="Short Entry") wait_for_cloud = input(true, title="Wait for Cloud Confirmation") use_short_stop_loss = input(true, title="Use Short Stop Loss") short_stop_loss = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=5) * 0.01 use_long_stop_loss = input(true, title="Use Long Stop Loss") long_stop_loss = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=5) * 0.01 use_short_take_profit = input(true, title="Use Short Take Profit") short_take_profit = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval = 20) * .01 use_long_take_profit = input(true, title="Use Long Take Profit") long_take_profit = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval = 20) * .01 // === INPUT SHOW PLOT === showDate = input(defval = false, title = "Show Date Range", type = input.bool) // === INPUT BACKTEST RANGE === fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970) thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12) thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31) thruYear = input(defval = 2112, title = "Thru Year", type = input.integer, minval = 1970) // === FUNCTION EXAMPLE === start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" middle(len) => avg(lowest(len), highest(len)) // Ichimoku Components tenkan = middle(ts_bars) kijun = middle(ks_bars) senkouA = avg(tenkan, kijun) senkouB = middle(ssb_bars) bgcolor(color = showDate and window() ? color.gray : na, transp = 90) // plot within time window // Plot Ichimoku Kinko Hyo plot(tenkan, color=#0496ff, title="Tenkan-Sen") plot(kijun, color=#991515, title="Kijun-Sen") plot(close, offset=-cs_offset+1, color=#459915, title="Chikou-Span") sa=plot(senkouA, offset=ss_offset-1, color=color.green, title="Senkou-Span A") sb=plot(senkouB, offset=ss_offset-1, color=color.red, title="Senkou-Span B") fill(sa, sb, color = senkouA > senkouB ? color.green : color.red, title="Cloud color") ss_high = max(senkouA[ss_offset-1], senkouB[ss_offset-1]) ss_low = min(senkouA[ss_offset-1], senkouB[ss_offset-1]) // Entry/Exit Signals tk_cross_bull = tenkan > kijun tk_cross_bear = tenkan < kijun cs_cross_bull = mom(close, cs_offset-1) > 0 cs_cross_bear = mom(close, cs_offset-1) < 0 price_above_kumo = close > ss_high price_below_kumo = close < ss_low senkou_green = senkouA > senkouB ? true : false bullish = tk_cross_bull and cs_cross_bull and price_above_kumo bearish = tk_cross_bear and cs_cross_bear and price_below_kumo if (wait_for_cloud) bullish := bullish and senkou_green bearish := bearish and not senkou_green longStopPrice = strategy.position_avg_price * (1 - long_stop_loss) shortStopPrice = strategy.position_avg_price * (1 + short_stop_loss) longLimitPrice = strategy.position_avg_price * (1 + long_take_profit) shortLimitPrice = strategy.position_avg_price * (1 - short_take_profit) in_long = false in_long := in_long[1] open_long = bullish and not in_long open_short = bearish and in_long if (open_long) in_long := true if (open_short) in_long := false strategy.entry("Long", strategy.long, when=open_long and long_entry and (showDate ? window() : true)) strategy.entry("Short", strategy.short ,when=open_short and short_entry and (showDate ? window() : true)) if (strategy.position_size > 0.0) if (use_long_stop_loss and not use_long_take_profit) strategy.exit("Long", stop = longStopPrice) if (use_long_take_profit and not use_long_stop_loss) strategy.exit("Long", limit = longLimitPrice) if (use_long_take_profit and use_long_stop_loss) strategy.exit("Long", stop = longStopPrice, limit=longLimitPrice) if (strategy.position_size < 0.0) if (use_short_stop_loss and not use_short_take_profit) strategy.exit("Short", stop = shortStopPrice) if (use_short_take_profit and not use_short_stop_loss) strategy.exit("Short", limit = shortLimitPrice) if (use_short_take_profit and use_short_stop_loss) strategy.exit("Short", stop = shortStopPrice, limit = shortLimitPrice) strategy.close("Long", when=bearish and not short_entry and (showDate ? window() : true)) strategy.close("Short", when=bullish and not long_entry and (showDate ? window() : true))