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


Дата создания: 2024-02-19 15:32:17 Последнее изменение: 2024-02-19 15:32:17
Копировать: 1 Количество просмотров: 577
1
Подписаться
1617
Подписчики

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

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

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

Основным принципом этой стратегии является моделирование образования кирпича путем расчета ATR и отношения к цене закрытия. В частности, определяется два переменных Brick1 и Brick2.

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

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

Таким образом, имитируется формирование кристалла. Когда Brick1 поднимается выше одного ATR, образуется вверх кристалл; когда Brick1 падает выше одного ATR, образуется вниз кристалл. Brick2 - это запись положения кристалла.

Когда Brick1 и Brick2 пересекаются вверх, это означает, что колонна расширяется вверх и считается многоглавой; когда Brick1 и Brick2 пересекаются вниз, это означает, что колонна сжимается вниз и считается пустой.

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

  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 ////