Средняя стратегия реверсии основана на отклонении цены от скользящей средней для принятия торговых решений. Она использует краткосрочное отклонение и долгосрочную модель реверсии цен к средней, устанавливая позиции, когда цены значительно ниже или выше скользящей средней и закрывая позиции, когда цены возвращаются обратно.
Стратегия сначала рассчитывает скользящую среднюю за определенный период, чтобы представить долгосрочную ценовую тенденцию. Затем она определяет время и размер позиций на основе отклонения цены от скользящей средней.
Когда цена падает ниже скользящей средней на определенный процент, это сигнализирует о том, что цена отклоняется от долгосрочной тенденции. В этом случае длинные позиции постепенно формируются с увеличением размера по мере расширения отклонения. Когда цена отскакивает обратно выше скользящей средней, предполагая реверсию к средней, длинные позиции закрываются для получения прибыли.
Аналогичным образом, когда цена поднимается выше скользящей средней на порог, короткие позиции строятся. Когда цена опускается обратно к скользящей средней, короткие позиции закрываются с прибылью.
Использовать способность скользящих средних определять тенденции для отслеживания долгосрочной тенденции равновесия цен на акции и определения основного направления тренда.
Снизить среднюю стоимость путем масштабирования позиций, получив лучшие входные цены.
Принять поэтапную получение прибыли для обеспечения прибыли на разных уровнях среднего возврата, снижая риски.
Контрольное распределение позиций по фиксированному проценту для ограничения размера потерь в одной сделке.
Гибкие параметры, такие как скользящий средний период и размещение позиций в зависимости от различных продуктов.
Частые стоп-лосы при колебаниях цен.
Сильный тренд может прорваться через скользящую среднюю, не способный закрыться при среднем реверсии.
Неправильное настройка параметров может привести к чрезмерно агрессивным входам или остановкам. Необходимо тщательное обратное тестирование и корректировка на основе рыночных условий.
Высокая частота торговли приводит к значительным торговым затратам.
Оптимизировать скользящий средний период для адаптации к характеристикам продукта.
Оптимизируйте размер позиций, чтобы сбалансировать риск и доходность.
Добавьте другие технические фильтры, чтобы избежать ненужных сделок.
Включить меры волатильности для корректировки размера позиции на основе уровня колебаний рынка.
Внедрить масштабирование целевой прибыли для снижения риска и увеличения доходности.
Средняя стратегия реверсии использует тенденцию реверсии равновесия акций, входя в отклонение от скользящей средней и получая прибыль при реверсии. При правильном настройке параметров и фильтрах она может адаптироваться к изменениям рынка и достигать хорошей доходности при контроле рисков. Стратегия включает в себя как следование тенденциям, так и управление рисками, что делает ее полезной для исследования и применения для инвесторов.
/*backtest start: 2022-10-19 00:00:00 end: 2023-10-25 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("YJ Mean Reversion", overlay=true) //Was designed firstly to work on an index like the S&P 500 , which over time tends to go up in value. //Avoid trading too frequently (e.g. Daily, Weekly), to avoid getting eaten by fees. //If you change the underlying asset, or time frame, tweaking the moving average may be necessary. //Can work with a starting capital of just $1000, optimise the settings as necessary. //Accepts floating point values for the amount of units to purchase (e.g. Bitcoin ). //If price of units exceeds available capital, script will cancel the buy. //Adjusted the input parameters to be more intuitive. //input variables movingAverage = input(title="Moving Average (bars)", type=input.integer, defval=28, minval=1, maxval=1000) //riskPercentage = input(title="Amount to Risk (%)", type=input.integer, defval=1, minval=1, maxval=50) deviation = input(title="Deviation Increment (%)", type=input.float, defval=5, minval=0.01, maxval=100) / 100 unitsLevel1 = input(title="Level 1 (units)", type=input.float, defval=1, minval=0.0001, maxval=10000) unitsLevel2 = input(title="Level 2 (units)", type=input.float, defval=2, minval=0.0001, maxval=10000) unitsLevel3 = input(title="Level 3 (units)", type=input.float, defval=4, minval=0.0001, maxval=10000) unitsLevel4 = input(title="Level 4 (units)", type=input.float, defval=8, minval=0.0001, maxval=10000) unitsLevel5 = input(title="Level 5 (units)", type=input.float, defval=16, minval=0.0001, maxval=10000) //moving average and ma slope (use on weekly chart) ma = sma(close, movingAverage) //sl = ma > ma[4] //units to buy //amount = riskPercentage / 100 * (strategy.initial_capital + strategy.netprofit) //units = floor(amount / close) //mode 1 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (strategy.position_size < 10)) //strategy.order("sell", false, strategy.position_size, when = (close > 1.05 * ma) and (strategy.position_size > 0)) //mode 2 //strategy.order("buy", true, 1, when = close < 0.8 * ma) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 3 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("buy", true, 2, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("buy", true, 4, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("buy", true, 8, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("buy", true, 16, when = (close < 0.75 * ma)) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 4 //strategy.order("buy", true, 1, when = (close < 0.98 * ma) and (close > 0.96 * ma) and (sl)) //strategy.order("buy", true, 2, when = (close < 0.96 * ma) and (close > 0.94 * ma) and (sl)) //strategy.order("buy", true, 4, when = (close < 0.94 * ma) and (close > 0.92 * ma) and (sl)) //strategy.order("buy", true, 8, when = (close < 0.92 * ma) and (close > 0.90 * ma) and (sl)) //strategy.order("buy", true, 16, when = (close < 0.90 * ma) and (sl)) //strategy.order("sell", false, strategy.position_size, when = (close > 310) and (strategy.position_size > 0)) //mode 5 //strategy.order("buy", true, 1, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("buy", true, 2, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("buy", true, 4, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("buy", true, 8, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("buy", true, 16, when = (close < 0.75 * ma)) //strategy.order("sell", false, 1, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 2, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 4, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 8, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("sell", false, 16, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //mode 6 //strategy.order("B1", true, unitsLevel1 * units, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("B2", true, unitsLevel2 * units, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("B3", true, unitsLevel3 * units, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("B4", true, unitsLevel4 * units, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("B5", true, unitsLevel5 * units, when = (close < 0.75 * ma)) //strategy.order("S1", false, unitsLevel1 * units, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("S2", false, unitsLevel2 * units, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("S3", false, unitsLevel3 * units, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("S4", false, unitsLevel4 * units, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("S5", false, unitsLevel5 * units, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //mode 7 //strategy.order("B1", true, units, when = (close < 0.95 * ma) and (close > 0.9 * ma)) //strategy.order("B2", true, units, when = (close < 0.9 * ma) and (close > 0.85 * ma)) //strategy.order("B3", true, units, when = (close < 0.85 * ma) and (close > 0.8 * ma)) //strategy.order("B4", true, units, when = (close < 0.8 * ma) and (close > 0.75 * ma)) //strategy.order("B5", true, units, when = (close < 0.75 * ma)) //strategy.order("S1", false, units, when = (close > 1.05 * ma) and (close < 1.1 * ma) and (strategy.position_size > 0)) //strategy.order("S2", false, units, when = (close > 1.1 * ma) and (close < 1.15 * ma) and (strategy.position_size > 0)) //strategy.order("S3", false, units, when = (close > 1.15 * ma) and (close < 1.2 * ma) and (strategy.position_size > 0)) //strategy.order("S4", false, units, when = (close > 1.2 * ma) and (close < 1.25 * ma) and (strategy.position_size > 0)) //strategy.order("S5", false, units, when = (close > 1.25 * ma) and (close < 1.3 * ma) and (strategy.position_size > 0)) //banding calculations aH = 1.0 - deviation aL = aH - deviation bH = aL bL = bH - deviation cH = bL cL = cH - deviation dH = cL dL = dH - deviation eH = dL strategy.initial_capital = 50000 //mode 8 strategy.order("B1", true, unitsLevel1, when = (close < aH * ma) and (close > aL * ma) and (unitsLevel1 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B2", true, unitsLevel2, when = (close < bH * ma) and (close > bL * ma) and (unitsLevel2 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B3", true, unitsLevel3, when = (close < cH * ma) and (close > cL * ma) and (unitsLevel3 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B4", true, unitsLevel4, when = (close < dH * ma) and (close > dL * ma) and (unitsLevel4 * close < (strategy.initial_capital + strategy.netprofit))) strategy.order("B5", true, unitsLevel5, when = (close < eH * ma) and (unitsLevel5 * close < (strategy.initial_capital + strategy.netprofit))) //banding calculations fL = 1.0 + deviation fH = fL + deviation gL = fH gH = gL + deviation hL = gH hH = hL + deviation iL = hH iH = iL + deviation jL = iH strategy.order("S1", false, unitsLevel1, when = (close > fL * ma) and (close < fH * ma) and (strategy.position_size > 0)) strategy.order("S2", false, unitsLevel2, when = (close > gL * ma) and (close < gH * ma) and (strategy.position_size > 0)) strategy.order("S3", false, unitsLevel3, when = (close > hL * ma) and (close < hH * ma) and (strategy.position_size > 0)) strategy.order("S4", false, unitsLevel4, when = (close > iL * ma) and (close < iH * ma) and (strategy.position_size > 0)) strategy.order("S5", false, unitsLevel5, when = (close > jL * ma) and (strategy.position_size > 0)) plot(ma, color=#666666, linewidth=5)