Взрыв динамики определяет стратегию

Автор:Чао Чжан, Дата: 2023-11-02 14:39:22
Тэги:

img

Обзор

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

Принцип

Стратегия основывается на двух показателях:

  1. Быстрый RSI: он рассчитывает рост и падение последних 3 баров для оценки динамики цены.

  2. Фильтр тела: рассчитывает средний размер тела за последние 20 баров.

Когда быстрый RSI ниже 10 и фильтр тела действителен, будет открыта длинная позиция. После этого устанавливается фиксированная прибыль в размере 20%. Когда цена превышает открытую цену * (1 + процент прибыли), позиция будет закрыта.

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

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

Преимущества этой стратегии:

  1. Быстрый RSI определяет уровни перепродажи и повышает точность входа.

  2. Фильтр тела предотвращает ложные прорывы, вызванные колебаниями.

  3. Фиксированный процент прибыли обеспечивает стабильную прибыль и отслеживает тенденции.

  4. Логика проста и понятна, легко понять и реализовать.

  5. Элегантная структура кода с большой расширяемостью, легко оптимизировать.

  6. Устойчивая положительная отдача и высокий показатель победы в обратном тесте.

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

Некоторые риски:

  1. Нет механизма остановки убытков, риски расширения потерь.

  2. Неправильные уровни прибыли могут привести к преждевременному или слишком глубокому выходу.

  3. Последовательные небольшие потери могут произойти на нестабильных рынках.

  4. Затраты на финансирование не учитываются, фактическая доходность может быть ниже.

  5. Недостаточная оптимизация параметров для различных продуктов.

Руководство по оптимизации

Некоторые аспекты могут быть оптимизированы:

  1. Добавить стоп-лосс для контроля одиночных потерь.

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

  3. Улучшить логику прорыва, чтобы улучшить точность входа.

  4. Добавить модуль размещения позиций для оптимизации использования капитала.

  5. Добавить модуль оптимизации параметров для различных продуктов.

  6. Добавьте фильтры, чтобы избежать потерь на нестабильных рынках.

  7. Подумайте о добавлении управления средними затратами.

Заключение

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


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")


Больше