Diese Strategie eröffnet und schließt Positionen basierend auf dem Super Trend-Indikator und dem Trailing Stop Loss. Sie verwendet 4 Warnungen zur Eröffnung und Schließung von Long- und Short-Positionen und übernimmt eine Super Trend-Strategie.
Die Strategie verwendet den ATR-Indikator, um die oberen und unteren Bands zu berechnen. Ein Kaufsignal wird erzeugt, wenn der Schlusskurs durch das obere Band bricht, und ein Verkaufssignal wird erzeugt, wenn er durch das untere Band bricht. Die Strategie verwendet auch eine Supertrendlinie, um die Trendrichtung zu bestimmen. Wenn die Supertrendlinie nach oben geht, zeigt sie den Beginn eines Bullenmarktes an. Wenn sie nach unten geht, zeigt sie den Beginn eines Bärenmarktes an. Die Strategie eröffnet Positionen, wenn ein Signal erzeugt wird, und setzt den anfänglichen Stop-Loss-Preis fest. Sie passt dann den Stop-Loss-Preis an, basierend auf Preisänderungen, um Gewinne zu erzielen und einen nachfolgenden Stop-Loss-Effekt zu erzielen.
Die Strategie kombiniert die Vorteile des Super Trend-Indikators zur Bestimmung der Trendrichtung und des ATR-Indikators zur Einstellung von Stops. Sie kann falsche Ausbrüche effektiv filtern. Trailing Stops können sehr gut Gewinne erzielen und Drawdowns reduzieren. Darüber hinaus ist die Strategie speziell für Roboter konzipiert und ermöglicht automatisierten Handel.
Der Super Trend-Indikator kann leicht mehr falsche Signale erzeugen. Wenn der Stop-Loss-Anpassungsbereich groß ist, steigt die Wahrscheinlichkeit, dass der Stop-Loss getroffen wird. Darüber hinaus ist der Robotertrading auch mit technischen Risiken wie Serverabstürzen und Netzwerkunterbrechungen konfrontiert.
Um die Wahrscheinlichkeit falscher Signale zu verringern, können die ATR-Parameter angemessen angepasst oder andere Indikatoren zur Filtration hinzugefügt werden. Bei der Anpassung des Trailing-Stop-Bereichs müssen Gewinn und Risiko ausgeglichen werden. Gleichzeitig müssen Backup-Server und Netzwerke vorbereitet werden, um sich vor technischen Ausfallrisiken zu schützen.
Hier sind einige Richtungen, in denen diese Strategie optimiert werden kann:
Hinzufügen von Indikatoren oder Bedingungen, um Eingangssignale zu filtern und falsche Signale zu vermeiden.
Versuche verschiedene Kombinationen von ATR-Parametern, um die optimalen Parameter zu finden.
Optimieren Sie den Trailing-Stop-Loss-Bereich, um den besten Balance-Punkt zu finden.
Um eine Reihe von Stop-Loss-Preisen zu erreichen, werden weitere Stop-Loss-Preise hinzugefügt.
Erstellen Sie eine Dual-Server-Architektur mit Primär- und Standby-Servern, die bei Ausfall des Hauptservers schnell wechseln können.
Diese Strategie integriert die Vorteile des Super Trend Indikators und des Trailing Stop Loss für die automatisierte Eröffnung und Stoppung von Verlusten. Kombiniert mit den Verbesserungsmaßnahmen in den Optimierungsrichtungen während des Live-Handels kann sie eine sehr praktische quantitative Handelsstrategie werden.
/*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