Двойная стратегия перекрестной торговли скользящей средней генерирует торговые сигналы путем вычисления двух скользящих средних с различными параметрами и торговли, когда скользящие средние пересекаются.
Основная логика этой стратегии заключается в следующем:
Входные параметры: более быстрый период MA maLen1, более медленный период MA maLen2, тип MA maTypeChoice
Вычислить более быстрое MA maValue1 и более медленное MA maValue2 на основе входных параметров
Определить условия покупки и продажи путем сравнения двух МА:
Купить, когда maValue1 пересекает maValue2
Продать, когда maValue1 переходит ниже maValue2
Исполнение сделок по сигналам покупки и продажи
Визуализируйте МА в разных цветах в зависимости от их отношений
Отправка сигналов о покупке и продаже
Использует двойную систему перекрестки MA, избегает ложных сигналов от одной MA
Периоды MA, поддающиеся настройке, подходят для различных горизонтов торговли
Простая и понятная логика, легкая для понимания и реализации
Настраиваемые сигналы оповещения для своевременного исполнения
Визуализированные тенденции MA формируют интуитивный торговый индикатор
Оптимизируемые параметры для поиска наилучшей комбинации
Применяется для обратного тестирования и торговли в режиме реального времени
Пересечения MA могут генерировать ложные сигналы, требуют дополнительного подтверждения тренда и модели
Необходимые торговые издержки возникают из-за пересечения MA
Неправильные параметры приводят к чрезмерной или скудной торговле
Экстремальные события вызывают огромные колебания цен, не способные ограничить потери
Долгосрочные сбои в тренде отменяют краткосрочные показатели
Требует частого мониторинга, не полностью автоматизированного
Управление рисками:
Добавить фильтр тренда, чтобы избежать торговли против тренда
Добавить шаблонный фильтр для подтверждения действительности сигнала
Оптимизировать параметры для разумной частоты торговли
Установка стоп-лосса/прибыли для ограничения потерь
Испытание прочности в течение длительных временных рамок
Фильтры цены и времени для предотвращения ложных взломов
Испытать различные параметры MA для определения оптимального
Испытать различные типы MA для наиболее точных сигналов
Добавление фильтра тренда для предотвращения контратендных сделок
Добавить фильтр волатильности для определения правильных точек выхода
Добавление фильтра цена/время для уменьшения ложных сигналов
Внедрить контроль скольжения для реальной торговли
Испытание надежности на различных приборах и в различных периодах времени
Интегрировать автоматическую остановку потери/прибыль
Исследуйте машинное обучение для улучшения стратегии
Двойной скользящий средний кроссовер является классической стратегией технического индикатора. Он генерирует сигналы от пересечений MA и может производить хорошие результаты обратных тестов посредством оптимизации. Однако остаются риски, такие как ложные сигналы, требующие дополнительных фильтров. Реальной торговле также нужны детали исполнения, такие как контроль скольжения. В целом стратегия подходит для среднесрочной торговли как простой и интуитивно понятный выбор. Благодаря постоянным улучшениям и проверке надежности эта стратегия может достигать стабильной доходности в живой торговле.
/*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 )