Эта стратегия открывает и закрывает позиции на основе индикатора Super Trend и отслеживания стоп-лосса. Она использует 4 предупреждения для открытия и закрытия длинных и коротких позиций и принимает стратегию супер-тенденции. Стратегия разработана специально для роботов с функцией отслеживания стоп-лосса.
Стратегия использует индикатор ATR для расчета верхней и нижней полос. Сигнал покупки генерируется, когда цена закрытия проходит через верхнюю полосу, а сигнал продажи генерируется, когда он проходит через нижнюю полосу. Стратегия также использует линию супер-тенденции для определения направления тренда. Когда линия супер-тенденции поднимается, она указывает на начало бычьего рынка. Когда она опускается, она указывает на начало медвежьего рынка. Стратегия открывает позиции, когда генерируется сигнал, и устанавливает начальную цену стоп-лосса. Затем она корректирует цену стоп-лосса на основе изменений цены, чтобы блокировать прибыль и достичь эффекта стоп-лосса.
Стратегия сочетает в себе преимущества индикатора Super Trend для определения направления тренда и индикатора ATR для установки остановок. Она может эффективно отфильтровывать ложные прорывы. Отслеживающие остановки могут очень хорошо блокировать прибыль и снижать снижение. Кроме того, стратегия разработана специально для роботов, позволяя автоматическую торговлю.
Индикатор Super Trend может легко генерировать больше ложных сигналов. Когда диапазон корректировки стоп-лосса большой, вероятность того, что стоп-лосс будет достигнут, увеличивается. Кроме того, торговля роботами также сталкивается с техническими рисками, такими как сбои серверов и перебои в сети.
Для уменьшения вероятности ложных сигналов параметры ATR можно корректировать соответствующим образом или добавить другие показатели для фильтрации. При корректировке диапазона остановки следует сбалансировать прибыль и риск. В то же время необходимо подготовить резервные серверы и сети для защиты от рисков технических сбоев.
Ниже приведены некоторые направления, в которых эта стратегия может быть оптимизирована:
Добавление индикаторов или условий для фильтрации входных сигналов и избегания ложных сигналов.
Испытать различные комбинации параметров ATR для определения оптимальных параметров.
Оптимизируйте диапазон остановки потери, чтобы найти лучшую точку баланса.
Добавьте больше цен на стоп-лосс, чтобы достичь стоп-лосса.
Создайте архитектуру с двумя серверами с основными и резервными серверами, которые могут быстро переключаться при сбое основного сервера.
Эта стратегия объединяет в себе преимущества индикатора Super Trend и отслеживания стоп-лосса для автоматического открытия и остановки потерь. В сочетании с мерами улучшения направлений оптимизации во время торговли в режиме реального времени, она может стать очень практичной количественной торговой стратегией.
/*backtest start: 2023-11-18 00:00:00 end: 2023-12-18 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © arminomid1375 //@version=5 strategy('Mizar_BOT_super trend', overlay=true, default_qty_value=100, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=100, max_bars_back=4000) //===== INPUTS ==========================================================================// factor = input.float(4.5, title='ATR Factor', step=0.1,group = 'ATR') period = input.int(59, minval=1, maxval=100, title='ATR Period',group = 'ATR') up = (high + low) / 2 - factor * ta.atr(period) down = (high + low) / 2 + factor * ta.atr(period) trend_up = 0.0 trend_up := close[1] > trend_up[1] ? math.max(up, trend_up[1]) : up trend_down = 0.0 trend_down := close[1] < trend_down[1] ? math.min(down, trend_down[1]) : down trend = 0.0 trend := close > trend_down[1] ? 1 : close < trend_up[1] ? -1 : nz(trend[1], 1) tsl = trend == 1 ? trend_up : trend_down line_color = trend == 1 ? 'green' : 'red' long_signal = trend == 1 and trend[1] == -1 short_signal = trend == -1 and trend[1] == 1 background = true //ss = input.float(defval=15.0, minval=0.0, title=' stop loss %',group = 'stop loss') use_sl = input(title='trailing stop ?', defval=true,group = 'stop loss') initial_sl_pct = input.float(defval=15.0, minval=0.0, title='trailing stop %',group = 'stop loss') Tpactive1 = input(title='Take profit1 On/Off ?', defval=true, group='take profit') tp1percent = input.float(5.0, title='TP1 %', group='take profit') *100 tp1amt = input.int(10, title='TP1 Amount %', group='take profit') Tpactive2 = input(title='Take profit2 On/Off ?', defval=true, group='take profit') tp2percent = input.float(10, title='TP2 %', group='take profit') *100 tp2amt = input.int(15, title='TP2 Amount %', group='take profit') Tpactive3 = input(title='Take profit3 On/Off ?', defval=true, group='take profit') tp3percent = input.float(15, title='TP3 %', group='take profit')*100 tp3amt = input.int(20, title='TP3 Amount %', group='take profit') //===== TIMEFRAME ==========================================================================// from_month = input.int(defval=1, title='From Month', minval=1, maxval=12) from_day = input.int(defval=1, title='From Day', minval=1, maxval=31) from_year = input.int(defval=2019, title='From Year', minval=2017) to_month = input.int(defval=1, title='To Month', minval=1, maxval=12) to_day = input.int(defval=1, title='To Day', minval=1, maxval=31) to_year = input.int(defval=9999, title='To Year', minval=2017) start = timestamp(from_year, from_month, from_day, 00, 00) finish = timestamp(to_year, to_month, to_day, 23, 59) window() => time >= start and time <= finish ? true : false //===== PLOTS ==========================================================================// // Line line_plot = plot(tsl, color=trend == 1 ? color.green : color.red, linewidth=2, title='Trend Line') // Labels plotshape(long_signal and window() ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.normal, color=color.new(color.green, 0), textcolor=color.new(color.white, 0)) plotshape(short_signal and window() ? down : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.normal, color=color.new(color.red, 0), textcolor=color.new(color.white, 0)) // Circles plotshape(long_signal and window() ? up : na, title='Uptrend starts', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0)) plotshape(short_signal and window() ? down : na, title='Downtrend starts', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0)) // Background long_fill = background ? trend == 1 ? color.green : na : na short_fill = background ? trend == -1 ? color.red : na : na candle_plot = plot(ohlc4, title='Price Line', color=trend == 1 ? long_fill : short_fill, linewidth=2, transp=90) fill(candle_plot, line_plot, title='Long Background', color=long_fill, transp=90) fill(candle_plot, line_plot, title='Short Background', color=short_fill, transp=90) //===== GLOBAL ==========================================================================// var entry_price = 0.0 var updated_entry_price = 0.0 var sl_price = 0.0 longString = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." longclose = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." shortString = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." shortclose = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box." longAlertMessage = input(title="Long Alert Message", defval="long", group="Alert Messages", tooltip=longString) longcloseAlertMessage = input(title="Long close Alert Message", defval="long", group="Alert Messages", tooltip=longclose) shortAlertMessage = input(title="Short Alert Message", defval="short", group="Alert Messages", tooltip=shortString) shortcloseAlertMessage = input(title="Short close Alert Message", defval="short", group="Alert Messages", tooltip=shortclose) has_open_trade() => strategy.position_size != 0 has_no_open_trade() => strategy.position_size == 0 is_long() => strategy.position_size > 0 ? true : false is_short() => strategy.position_size < 0 ? true : false plot(use_sl ? has_no_open_trade() ? close : sl_price : na, color=has_no_open_trade() ? na : color.blue, title='Stop Loss') strategy_close() => if is_long() strategy.close('Long') alert(longcloseAlertMessage) if is_short() strategy.close('Short') alert(shortcloseAlertMessage) strategy_long() => strategy.entry('Long', strategy.long) strategy_short() => strategy.entry('Short', strategy.short) sl_pct = initial_sl_pct if long_signal or is_long() and not(short_signal or is_short()) sl_pct := initial_sl_pct * -1 sl_pct //===== STRATEGY ==========================================================================// crossed_sl = false if is_long() and use_sl crossed_sl := close <= sl_price crossed_sl if is_short() and use_sl crossed_sl := close >= sl_price crossed_sl terminate_operation = window() and has_open_trade() and crossed_sl if terminate_operation and not(long_signal or short_signal) // Do not close position if trend is flipping anyways. entry_price := 0.0 updated_entry_price := entry_price sl_price := 0.0 strategy_close() start_operation = window() and (long_signal or short_signal) if start_operation entry_price := close updated_entry_price := entry_price sl_price := entry_price + entry_price * sl_pct / 100 if long_signal strategy_long() if Tpactive1==true strategy.exit('TPL1','Long', qty_percent=tp1amt,profit =tp1percent) alert(shortcloseAlertMessage) alert(longAlertMessage) if short_signal strategy_short() if Tpactive1==true strategy.exit('TPL1','Short', qty_percent=tp1amt,profit =tp1percent) alert(longcloseAlertMessage) alert(shortAlertMessage) //===== TRAILING ==========================================================================// if is_long() and use_sl strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00 if strategy_pct > 1 sl_pct += strategy_pct - 1.0 new_sl_price = updated_entry_price + updated_entry_price * sl_pct / 100 sl_price := math.max(sl_price, new_sl_price) updated_entry_price := sl_price updated_entry_price if is_short() and use_sl strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00 if strategy_pct < -1 sl_pct += strategy_pct + 1.0 new_sl_price = updated_entry_price + updated_entry_price * sl_pct / 100 sl_price := math.min(sl_price, new_sl_price) updated_entry_price := sl_price updated_entry_price