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


Дата создания: 2023-11-13 10:47:48 Последнее изменение: 2023-11-13 10:47:48
Копировать: 0 Количество просмотров: 382
1
Подписаться
1166
Подписчики

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

Обзор

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

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

Эта стратегия основана на том, что движущаяся средняя имеет форму золотого форка, чтобы определить время входа. В частности, определяется быстрое движущееся среднее MA1 и медленное движущееся среднее MA2. Когда MA1 прорывается вниз от MA2, то это сигнал для увеличения.

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

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

Когда цены достигают точки остановки, стратегия выбирает остановку и уходит. В то же время, если в этом туре повышение будет сильным, стратегия снова сделает обратную операцию.

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

Это довольно простая и интуитивно понятная стратегия отслеживания трендов. Она имеет следующие преимущества:

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

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

В этой стратегии также есть некоторые риски, о которых следует помнить:

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

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

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

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

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

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

Исходный код стратегии
/*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")