Стратегия разворота двойной скользящей средней


Дата создания: 2023-12-25 13:24:14 Последнее изменение: 2023-12-25 13:24:14
Копировать: 1 Количество просмотров: 575
1
Подписаться
1621
Подписчики

Стратегия разворота двойной скользящей средней

Обзор

Стратегия двойного движущегося среднего переворота - это количественная торговая стратегия, которая использует двойные движущиеся средние для определения краткосрочных и долгосрочных тенденций. Стратегия сочетает в себе 10-дневную простую движущуюся среднюю и 200-дневную простую движущуюся среднюю, чтобы захватить краткосрочные возможности для покупки при больших тенденциях в долгосрочной позиции. В то же время стратегия имеет определенный механизм отслеживания тенденций и контроля потерь.

Стратегический принцип

Стратегия обратного обращения двойных скользящих средних основана на следующих предположениях:

  1. 200-дневная простая скользящая средняя позволяет определить долгосрочный тренд на рынке. Когда цена выше 200-дневных линий, это означает, что основная позиция находится в долгосрочной позитивной тенденции.

  2. 10-дневная простая скользящая средняя способна идентифицировать краткосрочный рыночный откат. Когда цена ниже 10-дневной линии, она представляет собой откат в краткосрочной перспективе.

  3. При длительной тенденции к повышению цены на биржу, любое краткосрочное отклонение можно рассматривать как низкий шанс на улов, который может быть эффективно пойман.

Основываясь на вышеуказанных предположениях, логика генерации торговых сигналов для этой стратегии выглядит следующим образом:

  1. Когда цены в конце торгового дня пересекают 200-дневную линию и одновременно пересекают 10-дневную линию, это означает, что долгосрочная тенденция является позитивной, и в краткосрочной перспективе возникает обратный отклик, в результате чего создается сигнал к покупке.

  2. При удержании позиции, если цена закрытия снова пересекает 10-дневную линию, что означает краткосрочный тренд, следует немедленно прекратить убытки. Кроме того, если убытки от более значительного падения цены акций приведут к достижению заранее установленной линии стоп-лосса, также будет активирована остановка убытков.

  3. При значительном падении рынка в целом, можно использовать возможность для снижения, чтобы определить время покупки с помощью заранее установленной понижающей отметки.

Такой дизайн позволяет эффективно проводить низкие поглощения и контролировать риск с помощью остановки убытков в случае долгосрочной тенденции к снижению цен на биржевых биржах.

Стратегические преимущества

Двойная стратегия переворачивания скользящих средних имеет следующие преимущества:

  1. Стратегическая концепция ясна, проста, легко понятна и реализуема.
  2. Используя фильтры с двойными подвижными средними, можно эффективно идентифицировать долгосрочные и краткосрочные тенденции как в больших, так и в отдельных акциях.
  3. Лучшая временная эффективность. Высокая эффективность использования средств может быть достигнута путем захвата краткосрочных реверсий.
  4. Встроенный механизм остановки убытков позволяет хорошо контролировать потери отдельных позиций.
  5. Гибкость параметров для индексов и популярных акций.

Стратегический риск

Несмотря на очевидные преимущества обратной стратегии двойных скользящих средних, существуют следующие риски:

  1. При длительном свертывании большого диска может возникнуть ошибочный сигнал, который может повлиять на эффективность стратегии. В этот момент необходимо приостановить стратегию и дождаться, пока не будет установлена явная тенденция.
  2. Опираясь только на движущиеся средние для определения тенденций и получения сигналов, можно упустить другие эффективные признаки. Можно рассмотреть возможность введения большего количества показателей для комбинированной оптимизации.
  3. Одно-единственный способ остановки может быть слишком жестким, можно тестировать различные типы механизмов остановки.
  4. Параметры стратегии требуют корректировки и оптимизации для различных стандартов, иначе это может повлиять на стабильность.

Направление оптимизации стратегии

Также существует несколько вариантов оптимизации стратегии обратного обращения двойных скользящих средних:

  1. Тестирование комбинаций скользящих средних различных длин для поиска оптимальных параметров.
  2. Добавление других вспомогательных показателей, формирующих более устойчивый сигнал. Например, объем перевозок, показатель колебаний и т. д.
  3. Тестирование различных типов остановки. Например, отслеживание остановки, время остановки и т. д.
  4. Оптимизация параметров покупки и остановки убытков, позволяющая адаптироваться к изменяющимся рыночным условиям.
  5. Добавление алгоритмов машинного обучения для оптимизации параметров с использованием большего количества исторических данных.

Подвести итог

Двойная движущаяся средняя стратегия поворота в целом является очень практичной количественной стратегией. Она использует преимущества движущейся средней, чтобы сделать низкий поглощение и остановку потерь в многоголосной ситуации с длинной линией, чтобы получить более высокую одноразовую прибыль.

Исходный код стратегии
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
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/
// © Gold_D_Roger
//note: spreading 1 statement over multiple lines needs 1 apce + 1 tab | multi line function is 1 tab
//Recommended tickers: SPY (D), QQQ (D) and big indexes, AAPL (4H)

//@version=5
strategy("Davin's 10/200MA Pullback on SPY Strategy v2.0",
     overlay=true,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10, // 10% of equity on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.1) //Insert your broker's rate, IB is 0.005USD or tiered

//Best parameters
// SPY D
// Stop loss 0.15
// commission of 0.005 USD using Interactive brokers
// Exit on lower close 
// Buy more when x% down --> 14%
// DO NOT include stop condition using MA crossover

// Get User Input
i_ma1           = input.int(title="MA Length 1", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA 200")
i_ma2           = input.int(title="MA Length 2", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA 10")
i_ma3           = input.int(title="MA Length 3", defval=50, step=1, group="Strategy Parameters", tooltip="MA for crossover signals`")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.15, step=0.01, group="Strategy Parameters", tooltip="Hard stop loss of 10%")
i_startTime     = input(title="Start filter", defval=timestamp("01 Jan 2013 13:30 +0000"), group="Time filter", tooltip="Start date and time to begin")
i_endTime       = input(title="End filter", defval=timestamp("01 Jan 2099 19:30 +0000"), group="Time filter", tooltip="End date and time to stop")
i_lowerClose    = input.bool(title="Exit on lower close", defval=true, group="Strategy Parameters", tooltip="Wait for lower close after above 10SMA before exiting") // optimise exit strat, boolean type creates tickbox type inputs
i_contrarianBuyTheDip = input.bool(title="Buy whenever more than x% drawdown", defval=true, group="Strategy Parameters", tooltip="Buy the dip! Whenever x% or more drawdown on SPY")
i_contrarianTrigger = input.int(title="Trigger % drop to buy the dip", defval=14, step=1, group="Strategy Parameters", tooltip="% drop to trigger contrarian Buy the Dip!") 
//14% to be best for SPY 1D
//20% best for AMZN 1D
i_stopByCrossover_MA2_3 = input.bool(title="Include stop condition using MA crossover", defval=false, group="Strategy Parameters", tooltip="Sell when crossover of MA2/1 happens")

// Get indicator values
ma1 = ta.sma(close,i_ma1) //param 1
ma2 = ta.sma(close,i_ma2) //param 2
ma3 = ta.sma(close,i_ma3) //param 3
ma_9 = ta.ema(close,9) //param 2
ma_20 = ta.ema(close,20) //param 3

// Check filter(s)
f_dateFilter = true //make sure date entries are within acceptable range

// Highest price of the prev 52 days: https://www.tradingcode.net/tradingview/largest-maximum-value/#:~:text=()%20versus%20ta.-,highest(),max()%20and%20ta.
highest52 = ta.highest(high,52)
overall_change = ((highest52 - close[0]) / highest52) * 100

// Check buy/sell conditions
var float buyPrice = 0 //intialise buyPrice, this will change when we enter a trade ; float = decimal number data type 0.0
buyCondition  = (close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter) or (strategy.position_size == 0 and i_contrarianBuyTheDip==true and overall_change > i_contrarianTrigger and f_dateFilter) // higher than 200sma, lower than short term ma (pullback) + avoid pyramiding positions
sellCondition = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])  //check if we already in trade + close above 10MA; 
// third condition: EITHER i_lowerClose not turned on OR closing price has to be < previous candle's LOW [1]

stopDistance  = strategy.position_size > 0 ? ((buyPrice - close)/close) : na // check if in trade > calc % drop dist from entry, if not na
stopPrice     = strategy.position_size > 0 ? (buyPrice - (buyPrice * i_stopPercent)) : na // calc SL price if in trade, if not, na
stopCondition = (strategy.position_size > 0 and stopDistance > i_stopPercent) or (strategy.position_size > 0 and (i_stopByCrossover_MA2_3==true and ma3 < ma1))


// Enter positions
if buyCondition 
    strategy.entry(id="Long", direction=strategy.long) //long only

    
if buyCondition[1] // if buyCondition is true prev candle
    buyPrice := open // entry price = current bar opening price

// Exit position
if sellCondition or stopCondition 
    strategy.close(id="Long", comment = "Exit" + (stopCondition ? "Stop loss=true" : "")) // if condition? "Value for true" : "value for false"
    buyPrice := na //reset buyPrice

// Plot
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset = -1)
plot(ma1, color=color.blue) //defval=200
plot(ma2, color=color.white) //defval=10
plot(ma3, color=color.yellow) // defval=50