В процессе загрузки ресурсов... загрузка...

Интеллектуальная стратегия остановки движения на основе SMA с распознаванием внутридневных моделей

Автор:Чао Чжан, Дата: 2025-01-17 16:04:09
Тэги:SMAMA18ATR

 SMA-Based Intelligent Trailing Stop Strategy with Intraday Pattern Recognition

Обзор

Это стратегия, основанная на 18-дневной простой скользящей средней (SMA18), сочетающей в себе распознавание внутридневных моделей и интеллектуальные механизмы остановки. Стратегия в первую очередь наблюдает ценовое отношение с SMA18, наряду с внутридневными высокими и низкими позициями, для выполнения длинных записей в оптимальное время.

Принципы стратегии

Основная логика включает в себя несколько ключевых элементов: Условия входа на основе ценовой позиции по отношению к 18-дневной скользящей средней, с опционами на вырыв или вышелинейные входы Анализ внутридневных моделей свечей, особенно сосредоточенный на моделях Inside Bar для улучшения точности входа Выборочная торговля на основе характеристик дня недели Установка входной цены с использованием лимитных ордеров с небольшим увеличением отклонения от минимумов для улучшения вероятности заполнения Двойные механизмы стоп-лосса: фиксированные стопы, основанные на цене входа или последующие стопы, основанные на двухдневных минимумах

Преимущества стратегии

  1. Комбинирует технические показатели и ценовые модели для более надежных сигналов входа
  2. Гибкий механизм выбора времени торговли для оптимизации специфики рынка
  3. Интеллектуальная система стоп-лосса, которая одновременно защищает прибыль и обеспечивает адекватные движения цен
  4. Высоко регулируемые параметры для различных рыночных условий
  5. Эффективное уменьшение ложного сигнала посредством фильтрации шаблона Inside Bar

Стратегические риски

  1. Фиксированные остановки могут привести к раннему выходу на волатильных рынках
  2. Задержка может привести к минимальной прибыли при быстром переходе
  3. Частые внутренние перебои во время консолидации могут привести к переоценке Меры смягчения последствий:
  • Динамическая корректировка стоп-лосса на основе волатильности рынка
  • Добавление показателей подтверждения тенденции
  • Внедрение минимальных целей прибыли для фильтрации низкокачественных сделок

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

  1. Включить индикаторы волатильности (например, ATR) для динамической корректировки стоп-лосса
  2. Добавление измерения анализа объема для улучшения надежности сигнала
  3. Разработка более умных алгоритмов выбора даты на основе исторической производительности
  4. Внедрять фильтры силы тренда, чтобы избежать торговли в слабых тенденциях
  5. Улучшить алгоритмы распознавания внутренней строки для улучшения идентификации шаблонов

Резюме

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


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent

strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')


insideBar() =>  //and high <= high[1] and low >= low[1] ? 1 : 0
    open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0

inside() =>
    high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]

inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
    enterIndex := bar_index
    enterIndex



//if strategy.position_size <= 0 

//    strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")


//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0 

//    strategy.exit("Long", stop=low[0]-belowlow,comment="exit")

//    enterIndex := na

T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])

W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])

//longStopPrice  = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)

//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)

showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')

isMon() =>
    dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
    dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
    dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
    dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
    dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
    dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
    dayofweek(time('D')) == dayofweek.sunday and showSun


clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or  isWed() 
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]

if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1])  //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
    if tradeabove == false
        strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
    if tradeabove == true and (xing == false or clprior < entryline)  // and high<high[1] 
        strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')


//if time>timestamp(2020,12,0,0,0) and isSat()  
//    strategy.entry("Long", strategy.long, limit=0, comment="long")


//strategy.exit("Long", stop=low-400*syminfo.mintick)

//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")

if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
    strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
    strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo
    strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')




Связанные

Больше