
Это стратегия для отслеживания трендов, основанная на первичных сбалансированных скользящих средних. Она объединяет в себе сбалансированные скользящие средние, первичные сбалансированные скользящие средние и механизм точного входа и выхода с целью повышения прибыльности.
Эта стратегия основана на вычислении цены закрытия на последний торговый день и определенных пользователем входных параметров, чтобы построить сбалансированную скользящую среднюю. Когда цена поднимается, она превышает среднюю линию; когда цена падает, она превышает среднюю линию.
В то же время, в стратегии добавлен механизм подтверждения облаков, определяющий цвет первичного равновесного движущегося среднего. Только при первичном равновесном движущемся среднем цвете зеленый цвет делает больше, а красный - пустой, что позволяет отфильтровать некоторые неточные сигналы и повышает вероятность получения прибыли в стратегии.
Наибольшее преимущество этой стратегии заключается в том, что она объединяет в себе два показателя - среднюю линию и первично сбалансированную скользящую среднюю, учитывая как общее движение средних цен, так и количественное изменение цены на закрытие в последний торговый день. Кроме того, облачный механизм подтверждения также позволяет избежать ложных сигналов торговли, что повышает стабильность стратегии.
С точки зрения оптимизации параметров, параметры стоп-стоп также позволяют управлять рисками стратегии. Наконец, первичная сбалансированная скользящая средняя, как новый технический показатель, с которым многие люди не знакомы, дает преимущество в применении стратегии.
Наибольший риск этой стратегии заключается в непостоянстве самой первичной сбалансированной скользящей средней. Ее долгосрочная эффективность в качестве нового показателя и пространство для оптимизации параметров остаются под вопросом. Если модель предположит, что она не работает, то будет создано множество ошибочных сигналов.
Кроме того, любая стратегия, которая отслеживает тренд, рискует переломить тренд. Если цена превышает среднюю линию, но быстро поворачивается, стратегия может потерпеть большие потери.
Эта стратегия может быть оптимизирована следующим образом:
Оптимизация параметров длины первичной сбалансированной скользящей средней для поиска оптимальной точки равновесия.
Тестируйте различные параметры стоп-стоп, чтобы определить оптимальное сочетание параметров. Слишком большая стоп-машина ограничивает максимальную прибыль, а слишком маленькая стоп-машина слишком рискованна.
Добавление других технических показателей, таких как MACD, KD и т. д., формирование многоиндикаторного консенсуса, дальнейшее предотвращение ошибочных сигналов.
Проведение обратной проверки различных сортов и циклов для определения наилучших сценариев применения стратегии.
Рассматривается возможность включения модели машинного обучения для динамической оптимизации параметров и адаптивной корректировки стратегии.
Эта стратегия объединяет преимущества средней и первичной равновесной скользящей средней, устанавливает разумные стоп-стопы и добавляет механизм подтверждения облаков, чтобы эффективно отслеживать тенденции и контролировать риски. Эта стратегия может быть широко применена в таких разновидностях, как фондовые индексы, иностранные валюты, товары и криптовалюты, и является рекомендуемой количественной стратегией.
/*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))