
Эта стратегия использует методы гипотетических тестов для определения того, отклоняется ли ATR от средней стоимости, в сочетании с прогнозами ценового движения, реализуя стратегию торговли средней стоимостью, основанную на ATR. Когда наблюдается значительное отклонение от ATR, это указывает на то, что рынок может иметь аномальные колебания.
Проверка гипотез
Проведите два t-теста с быстрого ATR-цикла (параметрatr_fast) и медленного ATR-цикла (параметрatr_slow). Не существует существенных различий между средними значениями двух образцов с нулевой гипотезой H0 для гипотетического теста.
Если проверяемая статистика выше порогового значения (уверенного интервала, определенного параметром reliability_factor), первоначальная гипотеза, что быстрый ATR явно отклонился от медленного ATR, отвергается.
Прогноз движения цен
Вычислите движущуюся среднюю по логистической доходности как ожидаемую дрейфную скорость (париметрический дрейф).
Если дрейф повышается, то это означает, что сейчас наблюдается тенденция к повышению цен на золотую рыбу.
Вход и убыточный выход
Если ATR значительно отличается от ATR, и тенденция положительная, то можно делать больше зачетов.
Затем используйте ATR для постоянной корректировки линии стоп-лосса. Стоп-лосса выходит, когда цена подходит к линии стоп-лосса.
Используйте гипотетические тесты для определения ATR отклонений от более научных и адаптированных параметров.
В сочетании с прогнозом ценовых тенденций, избегается совершение ошибочных сделок только из-за отклонения ATR.
Постоянная коррекция стоп-лосса, снижение риска убытков
Если цены падают в обрыв, то не стоит их останавливать.
“Я думаю, что это будет очень важно, потому что мы не можем позволить, чтобы это произошло”, - сказал он.
Неправильно настроенные параметры могут привести к пропуску правильного момента сделки или к добавлению ненужных сделок.
Можно рассмотреть возможность использования многофакторного подтверждения с другими показателями, чтобы избежать ошибочных сделок с одним показателем.
Можно тестировать различные комбинации ATR-параметров, чтобы найти наиболее стабильные.
Повышение оценки прорыва ключевых ценовых рубежей, чтобы избежать покупки ложных прорывов.
Общая концепция этой стратегии ясна, использование гипотетических испытаний для определения аномальных колебаний является предпочтительным. Однако отклонение ATR не может полностью определять тенденцию, необходимо увеличить основы для повышения точности. Правила остановки убытков надежны, но не могут справиться с обрывочным падением. В будущем можно улучшить такие аспекты, как условия входа, выбор параметров, оптимизация остановки убытков.
/*backtest
start: 2022-10-16 00:00:00
end: 2023-10-16 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji
//@version=5
strategy("Mean Reversion (ATR) Strategy v2 [KL] ", overlay=true, pyramiding=1)
var string ENUM_LONG = "Long"
var string GROUP_TEST = "Hypothesis testing"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"
backtest_timeframe_start = input(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true
// TSL: calculate the stop loss price. {
ATR_TSL = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL)) * input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
TSL_source = low
TSL_line_color = color.green
TSL_transp = 100
var stop_loss_price = float(0)
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block
// Entry variables {
// ATR diversion test via Hypothesis testing (2-tailed):
// H0 : atr_fast equals atr_slow
// Ha : reject H0 if z_stat is above critical value, say reliability factor of 1.96 for a 95% confidence interval
len_fast = input(14,title="Length of ATR (fast) for diversion test", group=GROUP_TEST)
atr_fast = ta.atr(len_fast)
std_error = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5) // Standard Error (SE) = std / sq root(sample size)
atr_slow = ta.atr(input(28,title="Length of ATR (slow) for diversion test", group=GROUP_TEST))
test_stat = (atr_fast - atr_slow) / std_error
reject_H0 = math.abs(test_stat) > input.float(1.645,title="Reliability factor", tooltip="Strategy uses 2-tailed test; Confidence Interval = Point Estimate (avg ATR) +/- Reliability Factor x Standard Error; i.e use 1.645 for a 90% confidence interval", group=GROUP_TEST)
// main entry signal, subject to confirmation(s), gets passed onto the next bar
var _signal_diverted_ATR = false
if not _signal_diverted_ATR
_signal_diverted_ATR := reject_H0
// confirmation: trend prediction; based on expected lognormal returns
_prcntge_chng = math.log(close / close[1])
// Expected return (drift) = average percentage change + half variance over the lookback period
len_drift = input(14, title="Length of drift", group=GROUP_TREND)
_drift = ta.sma(_prcntge_chng, len_drift) - math.pow(ta.stdev(_prcntge_chng, len_drift), 2) * 0.5
_signal_uptrend = _drift > _drift[1]
entry_signal_all = _signal_diverted_ATR and _signal_uptrend // main signal + confirmations
// } end of "Entry variables" block
// MAIN {
// Update the stop limit if strategy holds a position
if strategy.position_size > 0 and ta.change(stop_loss_price)
strategy.exit(ENUM_LONG, comment="sl", stop=stop_loss_price)
// Entry
if within_timeframe and entry_signal_all
strategy.entry(ENUM_LONG, strategy.long, comment=strategy.position_size > 0 ? "adding" : "initial")
// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)
if strategy.position_size > 0 and ta.change(strategy.position_size)
if strategy.position_size > strategy.position_size[1]
alert_helper("BUY")
else if strategy.position_size < strategy.position_size[1]
alert_helper("SELL")
// Clean up - set the variables back to default values once no longer in use
if strategy.position_size == 0
stop_loss_price := float(0)
if ta.change(strategy.position_size)
_signal_diverted_ATR := false
// } end of MAIN block