Торговая стратегия с пересечением двух скользящих средних


Дата создания: 2023-10-13 15:40:49 Последнее изменение: 2023-10-13 15:40:49
Копировать: 0 Количество просмотров: 743
1
Подписаться
1617
Подписчики

Обзор

Двухлинейная перекрестная торговая стратегия - это стратегия, используемая для вычисления средней линии с двумя различными параметрами и совершения операций по покупке и продаже через перекрестку средней линии. Эта стратегия проста и непосредственна и подходит для среднесрочных и краткосрочных торгов.

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

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

Основная логика этой стратегии заключается в следующем:

  1. Ввод параметров: быстрый среднелинейный период maLen1, медленный среднелинейный период maLen2, среднелинейный тип maTypeChoice

  2. Быстрое среднее значение maValue1 и медленное среднее значение maValue2, рассчитанное на основе входных параметров

  3. Сравнение двух равнолинейных отношений, определяющих условия покупки и продажи:

    • Условия покупки: maValue1 на maValue2

    • Условия продажи: maValue1 в maValue2

  4. Соответствующие сделки совершаются при условии покупки и продажи

  5. Визуальное отображение средней линии и разделение ее на разные цвета

  6. Отправка сигналов о покупке и продаже

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

  • Использование принципа двойного равнолинейного пересечения, чтобы избежать заблуждения от одного равнолинейного колебания

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

  • Логика транзакций проста, понятна и понятна

  • Настраиваемые сигналы о покупке и продаже, позволяющие в режиме реального времени контролировать время торгов

  • Визуализация показателей средней линейной динамики, формирование интуитивных торговых показателей

  • Найти оптимальную комбинацию параметров с помощью оптимизации параметров

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

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

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

  • Частые открытия позиций при колебаниях бинарных линий могут привести к потере расходов на торговлю.

  • Неправильные параметры могут привести к слишком частому или нечастому обращению

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

  • Короткоциклические индикаторы могут быть отключены при прорыве большого цикла.

  • Необходимость в постоянном мониторинге не может быть полностью автоматизирована.

Решение риска:

  • Тенденционные индикаторы помогут избежать шокирующих торгов

  • В сочетании с формальными показателями, подтверждение эффективности сигнала

  • Оптимизация параметров для достижения разумного уровня частоты торгов

  • Настройка стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп

  • Проверка стабильности параметров в течение нескольких периодов времени

  • Использование фильтрации времени или сигнала, чтобы избежать ложного проникновения

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

  • Тестирование различных средних параметров для поиска оптимальных

  • Испытание различных типов средних линий для выбора наиболее точного среднего, который будет генерировать сигнал

  • Тенденционные индикаторы, чтобы избежать нетрадиционной торговли

  • В сочетании с волатильными показателями, чтобы определить подходящее время для выхода на поле

  • Добавление фильтра времени или сигнала, уменьшение ошибочного сигнала

  • Настройка управления скользящей точкой для оптимизации эффекта торговли на диске

  • Многовидовые многоциклические проверки стабильности

  • Присоединение к стратегии автоматического остановки убытков

  • Изучение технологий, таких как машинное обучение, для улучшения результатов отслеживания

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

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

Исходный код стратегии
/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)

maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )

maValue1 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen1 )
else
    0
    
maValue2 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen2 )
else
    0

buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )

mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red 

plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )

var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100

barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")

alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")

// Strategy Tester
stratTesterOn    = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime        = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime        = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss     = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize     = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )

tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)

fixedTPSL        = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue     = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue     = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )

fromDay          = input(defval = 1,    title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth        = input(defval = 1,    title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear         = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay          = input(defval = 1,    title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth        = input(defval = 1,    title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear         = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )

isTime(_position) =>
    range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )

if ( stratTesterOn and window() )
    if ( buySignal and isTime( entryTime ) )
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Buy", strategy.long, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0 )
            strategy.entry( "Buy", strategy.long, contractSize )
            strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        
    if ( sellSignal and isTime( entryTime ))
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Sell", strategy.short, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0  )
            strategy.entry( "Sell", strategy.short, contractSize )
            strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
        if ( maValue1 > maValue2 )
            strategy.entry( "Buy", strategy.long, contractSize )
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        else
            strategy.entry( "Sell", strategy.short, contractSize ) 
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    strategy.close_all( when=not isTime( entryTime ) )

plot( strategy.equity )