Стратегия импульсных кирпичей

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

img

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

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

Основная логика заключается в моделировании формирования кирпича путем расчета отношения ATR и ценовой зависимости.

Brick1 рассчитывается следующим образом: если цена закрытия превышает предыдущее значение Brick1 + ATR, Brick1 = предыдущее значение Brick1 + ATR; если цена закрытия ниже предыдущего значения Brick1 - ATR, Brick1 является предыдущим значением Brick1 - ATR; в противном случае Brick1 наследует предыдущее значение Brick1.

Brick2 рассчитывается следующим образом: если Brick1 не равен предыдущему значению Brick1, то Brick2 = предыдущее значение Brick1; в противном случае наследуйте предыдущее значение Brick2.

Это моделирует образование кирпича. Когда кирпич 1 поднимается больше, чем ATR, образуется кирпич вверх; когда кирпич 1 падает больше, чем ATR, образуется кирпич вниз.

Когда кирпич 1 и кирпич 2 пересекаются, это означает, что кирпич расширяется вверх, рассматривается как длинный.

Преимущество

  1. Использовать ATR для определения образования кирпича, избегать фиксированного размера кирпича, может динамически адаптироваться к колебаниям рынка
  2. Определить изменения импульса через перекресток кирпичей
  3. Чувствительность к оценке рыночной динамики может регулироваться различными циклами ATR
  4. Визуализируйте формирование и перекресток кирпичей для интуитивного определения рыночных тенденций

Риск

  1. Выбор размера ATR повлияет на прибыль стратегии. Слишком маленький ATR приводит к слишком большому количеству недействительных сигналов. Слишком большой ATR приводит к слишком малому количеству кирпичей и потенциальной потере возможности.
  2. Фактическая тенденция может не следовать шаблону кирпича.
  3. Необходимо быть очень чувствительным к затратам на транзакции.

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

Оптимизация

  1. Комбинировать с другими показателями для фильтрации сигналов, чтобы избежать недействительных сигналов, например, показателями объема и волатильности
  2. Добавьте фильтрацию тренда, выдавайте сигналы только в направлении тренда, чтобы избежать потерь от обратного движения
  3. Принять полную оптимизацию параметров выборки в течение периода испытаний для автоматического поиска оптимальных параметров

Резюме

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


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4


///Component Code Start
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2025, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)



/// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? 
   #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/// Component Code Stop


//Zack_the_Lego (original AUTHOR) made into strategy by mkonsap
strategy("Flex Renko Emulator", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
res = input(type=input.resolution, defval="D", title="Resolution of ATR")
xATR = atr(14)
//TF = x78tf ? "78" : "39"
BrickSize = security(syminfo.tickerid, res, xATR)

//Brick1 =  close >  nz(Brick1[1]) + BrickSize ? nz(Brick1[1]) + BrickSize : close <
                    //nz(Brick1[1]) - BrickSize ?
                        //nz(Brick1[1]) - BrickSize
                            //: nz(Brick1[1]))


Brick1() =>
    s1 = 0.0
    s1 := close > nz(s1[1]) + BrickSize ? nz(s1[1]) + BrickSize : 
       close < nz(s1[1]) - BrickSize ? nz(s1[1]) - BrickSize : nz(s1[1])
    s1


Brick2() =>
    s2 = 0.0
    Brick1_1 = Brick1()
    s2 := Brick1() != Brick1()[1] ? Brick1_1[1] : nz(s2[1])
    s2

colorer = Brick1() > Brick2() ? color.green : color.red
p1 = plot(Brick1(), color=colorer, linewidth=4, title="Renko")
p2 = plot(Brick2(), color=colorer, linewidth=4, title="Renko")
fill(p1, p2, color=color.purple, transp=50)




mylong = crossover(Brick1(), Brick2())
myshort = crossunder(Brick1(), Brick2())

last_long = float(na)
last_short = float(na)
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(Brick1(), Brick2())
myshort2 = crossunder(Brick1(), Brick2())

last_long2 = float(na)
last_short2 = float(na)
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0


condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossunder(condshortx, 1.9)


// === STRATEGY - LONG POSITION EXECUTION WITH CLOSE ORDERS ===
//enterLong() => crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
//exitLong()  => crossunder(condlongx, 1.9) and testPeriod() and strategy.position_size > 0
//strategy.entry(id = "Long", long = true, when = enterLong())
//strategy.close(id = "Long", when = exitLong())
// === STRATEGY - SHORT POSITION EXECUTION WITH CLOSE ORDER===
//enterShort() => crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 and Margin
//exitShort() => crossunder(condshortx, 1.9)  and testPeriod() and strategy.position_size < 0
//strategy.entry(id = "Short", long = false, when = enterShort())
//strategy.close(id = "Short", when = exitShort())   
//END


///STRATEGY ONLY LONG AND SHORT/////
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.close("Long", when=not Margin)

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when=Margin)

/////// END ////


Больше