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

Автор:Чао Чжан, Дата: 2024-02-01 11:02:17
Тэги:

img

Обзор

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

Логика стратегии

  1. Вычислить три скользящих средних различных циклов: быстрый скользящий средний период составляет 8 дней, средний скользящий средний период составляет 21 день, и медленный скользящий средний период составляет 55 дней.

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

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

  4. Размер позиции: используйте фиксированный размер позиции, каждый раз открывайте один контракт.

Анализ преимуществ

  1. Использование трех скользящих средних помогает определить направление тренда и избежать ложных прорывов.

  2. Следующая тенденция для потенциальной прибыли.

  3. Использование скользящих средних приводит к стабильной прибыли и относительно небольшим вычетам.

  4. Контролируемая стратегия стоп-лосса снижает вероятность больших потерь.

Анализ рисков

  1. Склонны к многочисленным небольшим потерям, снижая эффективность прибыли.

  2. Движущиеся средние отстают и могут пропустить моменты переворота тренда.

  3. Размер фиксированной позиции не может эффективно контролировать риски, может вызвать маржинальный призыв во время значительных колебаний рынка.

  4. Неправильная оптимизация параметров приводит к чрезмерной торговле, увеличению торговых издержек и сдвигу.

Оптимизация

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

  2. Используйте ATR для динамической корректировки размеров позиций.

  3. Добавьте стратегию стоп-лосса.

  4. Включить показатели объема торговли для определения надежности тенденций.

Резюме

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


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JoshuaMcGowan

//@version=4

// 1. Define strategy settings
strategy(title="Triple Moving Average", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=4, slippage=2)
     
fastMALen = input(title="Fast MA Length", type=input.integer, defval=8)
medMALen  = input(title="Medium MA Length", type=input.integer, defval=21)
slowMALen = input(title="Slow MA Length", type=input.integer, defval=55)

//endMonth = input(title="End Month Backtest", type=input.integer, defval=11)
//endYear  = input(title="End Year Backtest", type=input.integer, defval=2019)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// 2. Calculate strategy values
fastMA = sma(close, fastMALen)
medMA  = sma(close, medMALen)
slowMA = sma(close, slowMALen)

//Position Sizing
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Backtest Window
//tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0))

// 3. Determine long trading conditions
enterLong = crossover(fastMA, medMA) and
     (fastMA > slowMA) and (medMA > slowMA) and
     window() 

exitLong = crossunder(fastMA, medMA)

// 4. Code short trading conditions
enterShort = crossunder(fastMA, medMA) and
     (fastMA < slowMA) and (medMA < slowMA) and
     window() 

exitShort = crossover(fastMA, medMA)

// 5. Output strategy data
plot(series=fastMA, color=color.green, title="Fast MA")
plot(series=medMA, color=color.purple, title="Medium MA")
plot(series=slowMA, color=color.red, title="Slow MA",
     linewidth=2)
     
bgColour =
     enterLong and (strategy.position_size < 1) ? color.green :
     enterShort and (strategy.position_size > -1) ? color.red :
     exitLong and (strategy.position_size > 0) ? color.lime :
     exitShort and (strategy.position_size < 0) ? color.orange :
     na

bgcolor(color=bgColour, transp=85)

// 6. Submit entry orders
if (enterLong)
    strategy.entry(id="EL", long=true, qty=1)

if (enterShort)
    strategy.entry(id="ES", long=false, qty=1)

// 7. Submit exit orders
strategy.close_all(when=exitLong and
     (strategy.position_size > 0))
strategy.close_all(when=exitShort and
     (strategy.position_size < 0))

strategy.close_all(when=not window())

//END

Больше