Эта стратегия основана на скользящей средней, может автоматически корректировать параметры и подходит для волнистых рынков в большие временные рамки.
Эта стратегия использует адаптивную скользящую среднюю в качестве торгового сигнала. Сначала она вычисляет простую скользящую среднюю (CMA) указанного периода (начало). Затем она тестирует параметры CMA вокруг периода, оценивая, какая комбинация имеет наименьшее количество касаний по телу свечи и фитилю. Наконец, она использует CMA с наименьшим количеством касаний в качестве линии сигнала.
В частности, стратегия тестирует CMA с периодом плюс 1 (CMA_P1) и минус 1 (CMA_M1), подсчитывает количество касаний по телу и фитилю. Если CMA имеет меньше касаний, чем CMA_P1 и CMA_M1, то сохраните текущий период; если CMA_P1 имеет меньше касаний, то увеличьте период на 1; если CMA_M1 имеет меньше касаний, то уменьшите период на 1. Это находит относительно гладкую CMA как линию сигнала.
Когда цена проходит через CMA вверх, генерируется сигнал покупки; когда цена проходит через CMA вниз, генерируется сигнал продажи.
Эта адаптивная стратегия скользящей средней имеет следующие преимущества:
Автоматически находить оптимальные параметры. Нет необходимости вручную выбирать скользящий средний период, стратегия будет тестировать различные периоды и находить оптимальный.
По сравнению с фиксированным периодом MA, адаптивный MA может фильтровать больше шума и уменьшать многие ложные сигналы.
Приспособиться к изменениям рынка. Когда рынок переходит от диапазона к тренду, период MA автоматически увеличивается для генерации сигналов; когда рынок переходит от тренда к диапазону, период MA автоматически уменьшается. Таким образом, стратегия может динамически адаптироваться к изменениям рынка.
Этот адаптивный метод может упростить всю торговую систему без ручной оптимизации параметров.
Концепция может быть применена к другим показателям, таким как адаптивные полосы Боллинджера, адаптивные KD и т.д.
Для этой стратегии также существуют некоторые риски:
Риск покупки опциона. Когда рынок имеет модель покупки опциона, тело свечи может не преодолеть линию MA, что приводит к неправильным сигналам. Для снижения такого риска необходимо добавить условия фильтрации.
Риск неудачного прорыва. Прорыв MA не всегда продолжается, могут возникнуть некоторые неудачные прорывы. Для обеспечения высокого уровня успеха необходима валидация прорыва.
Риск обратного тренда. Обратный тренд после входа в тренд необходимо своевременно переключить, иначе он может привести к потерям. Стоп-лосс следует установить для контроля потери.
Риск оптимизации параметров. Адаптивные скорректированные параметры могут попасть в локальную оптимизацию, что приводит к избыточным МА. Для избежания этой проблемы необходимо внедрить методы оценки модели.
Риск перенастройки. Чрезмерная настройка параметров может привести к перенастройке и потере способности модели к обобщению. Необходима длительная проверка в различных рыночных средах, а не просто полагаться на результаты обратных тестов.
Некоторые направления для улучшения этой адаптивной стратегии МС:
Добавить проверку прорыва тренда через последовательные прорывы для фильтрации ложных прорывов.
Увеличьте стратегию стоп-лосса, стоп-лосса, когда цена перемещается обратно на другую сторону MA.
Добавьте фильтр опций, чтобы избежать неправильных сигналов при появлении опции вызова.
Внедрять такие метрики оценки, как IC, LIC, SIC и т. д., чтобы ограничить настройку параметров и предотвратить перегрузку.
Расширить на другие показатели, такие как адаптивная стратегия золотого креста, адаптивные полосы Боллинджера и т.д.
Оптимизируйте расчет MA с использованием взвешенной MA, экспоненциальной MA и т. д. для получения более плавного MA.
Эта стратегия генерирует торговые сигналы путем адаптивной корректировки периода MA для поиска оптимальных параметров. По сравнению с фиксированными параметрами, она может уменьшить многие ложные сигналы и адаптироваться к изменениям рынка. Но мы также должны следить за потенциальными рисками и проводить проверку и оптимизацию перед тем, как применять ее в живой торговле для стабильной прибыли.
[/trans]
/*backtest start: 2022-11-10 00:00:00 end: 2023-11-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/ // © fondDealer96636 //@version=5 strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) // input start = 20 lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.") smoothing = input(3, "Smoothing") source = input(close, "Source") startYear = input(2020, "Start year") resp = 1 in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0) // global var ix = -1 var mal = array.new_int(0) // functions avg(source, len) => sum = 0.0 for i = 0 to len-1 sum += source[i] sum/len bull = close > open wick_touch(x) => bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close)) body_touch(x) => bull ? (open < x and x < close) : (close < x and x < open) touches(t) => touches = 0 for i = 0 to lookback-1 touches += t[i] ? 1 : 0 touches // local ix := ix+1 prev_mal = ix >= 1 ? array.get(mal, ix-1) : start cma = avg(source, prev_mal) cma_p1 = avg(source, prev_mal+1) cma_m1 = avg(source, prev_mal-1) d = touches(wick_touch(cma)) d_p1 = touches(wick_touch(cma_p1)) d_m1 = touches(wick_touch(cma_m1)) d_b = touches(body_touch(cma)) d_p1_b = touches(body_touch(cma_p1)) d_m1_b = touches(body_touch(cma_m1)) any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0 no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0 wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na)) up = cma > cma[1] down = cma < cma[1] against_trend = (up and close < cma) or (down and close > cma) new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized) next_mal = na(new_mal) ? prev_mal : new_mal array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal)) // graph scma = ta.ema(cma, smoothing) uptrend = scma > scma[1] downtrend = scma < scma[1] plot(scma, "Automatic MA", color=uptrend ? color.green : color.red) uptrending = close > scma and uptrend downtrending = close < scma and downtrend defy = not uptrending and not downtrending defy_cross = defy and body_touch(scma) barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white))) // strategy change_to_uptrend = uptrending and downtrend[1] change_to_downtrend = downtrending and uptrend[1] long = in_date_range and change_to_uptrend short = in_date_range and change_to_downtrend if long strategy.entry("Long", strategy.long) if short strategy.entry("Short", strategy.short)