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

Автор:Чао Чжан, Дата: 2023-11-13 10:47:48
Тэги:

img

Обзор

Это торговая стратегия, которая использует движущиеся средние кроссоверы вместе с постоянным восходящим трендом для входа в сделки. Когда быстрый MA пересекает медленный MA, генерируется золотой кроссоверный сигнал. Если восходящий тренд сохраняется после кроссовера, можно открыть длинную позицию. Когда цена поднимается до уровня стоп-лосса или прибыли, позиция может быть закрыта для стоп-лосса или прибыли.

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

Стратегия основана в основном на перекрестном перемещении скользящей средней для входных сигналов. В частности, определяются быстрый MA (MA1) и медленный MA (MA2).

Чтобы избежать ложных сигналов от краткосрочных кроссоверов, добавляется порог угла, так что сигнал покупки запускается только тогда, когда угол MA2 превышает установленный порог.

Стоп-лосс позволяет избежать потерь в случае резкого переворота на рынке, в то время как замок прибыли устанавливается в процентном диапазоне от цены входа.

Когда цена поднимается до точки прибыли, стратегия закрывается длинной для получения прибыли.

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

Это простая и интуитивно понятная стратегия.

  1. Комбинация MA отфильтровывает шум рынка и блокируется в направлении тренда
  2. Угловой порог избегает введения в заблуждение краткосрочными колебаниями
  3. Двусторонняя торговля позволяет извлекать выгоду из рынков с ограниченным диапазоном
  4. Стойкость потери и контроль прибыли

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

Следует отметить некоторые риски:

  1. У МА есть задержка и они могут пропустить поворотные моменты
  2. Стоп-лосс не гарантирован, может быть пробел на быстрых рынках
  3. Двойная торговля удваивает риск, время короткого входа является ключевым
  4. Плохая настройка параметров, таких как периоды MA, может повлиять на результаты

Области улучшения

Некоторые способы дальнейшей оптимизации стратегии:

  1. Добавьте фильтры тренда, такие как MACD, Bollinger, чтобы улучшить точность
  2. Использование машинного обучения для динамической оптимизации периодов MA
  3. Оптимизировать установку стоп-лосса и прибыли, например, остановки.
  4. Добавить размеры позиций для ограничения потерь
  5. Измеряйте силу тренда с ADX до средней величины позиции реверсии

Заключение

В целом, это простая и практичная тенденция, следующая за стратегией. У нее есть плюсы, но и риски. Дальнейшие уточнения, такие как настройка параметров, оптимальные индикаторы, настройки стоп-лосса и т. Д., Могут улучшить ее. Но ни одна стратегия не полностью устраняет системный риск. Управление рисками является ключом к разумной торговле.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

Больше