Dieser Artikel stellt eine quantitative Handelsstrategie vor, die auf dem Prinzip des gleitenden Durchschnitts-Crossovers basiert. Die Strategie bestimmt die lange/kurze Richtung, indem der Preis mit dem gleitenden Durchschnitt verglichen wird, und setzt Profit- und Stop-Loss-Levels ein, um das Risiko zu kontrollieren.
Der Kern dieser Strategie ist der gleitende Durchschnitt. Er berechnet den einfachen gleitenden Durchschnitt des Schlusskurses über einen bestimmten Zeitraum als Grundlage für die Beurteilung des Trends. Wenn der Preis über den gleitenden Durchschnitt überschreitet, erzeugt er ein langes Signal, und wenn er unterhalb des gleitenden Durchschnitts überschreitet, erzeugt er ein kurzes Signal. Die Exrem-Funktion wird verwendet, um kontinuierliche doppelte Signale auszufiltern und die Signalqualität zu verbessern.
Der gleitende Durchschnitts-Crossover ist eine einfache und einfach zu bedienende Trend-Folge-Methode, die mittelfristige bis langfristige Markttrends effektiv erfassen kann. Mit angemessenen Parameter-Einstellungen kann die Strategie stabile Renditen in Trendmärkten erzielen. Die Einstellung von Take Profit und Stop Loss hilft, Drawdowns zu kontrollieren und das Risiko-Rendite-Verhältnis zu verbessern. Die Strategie-Code-Logik ist klar, mit Funktionsmodularisierung, mit starker Lesbarkeit und Skalierbarkeit. Darüber hinaus integriert die Strategie die Dhan-Plattform-API, um eine automatisierte Auftragsausführung zu realisieren und die Ausführungseffizienz zu verbessern.
Bewegliche Durchschnitte sind von Natur aus Rückstandsindikatoren. Während der Marktwendepunkte können Signale verzögert werden, was zu verpassten optimalen Handelsmöglichkeiten oder falschen Signalen führt. Falsche Parameter-Einstellungen beeinflussen die Strategieleistung und müssen entsprechend verschiedenen Marktmerkmalen und Zeitrahmen optimiert werden. Festes Prozentsatz-Gewinn- und Stop-Loss-Verhalten kann sich nicht an Veränderungen der Marktvolatilität anpassen, und es besteht auch ein Risiko von Verlusten aufgrund unsachgemäßer Parameter-Einstellungen.
Die gleitende Durchschnitts-Crossover-Strategie ist eine einfache und praktische quantitative Handelsstrategie, die durch Trendverfolgung und Stop-Loss-Kontrolle in Trending-Märkten profitieren kann. Die Strategie selbst hat jedoch bestimmte Einschränkungen und muss entsprechend den Merkmalen des Marktes und den Risikopräferenzen optimiert und verbessert werden. In der praktischen Anwendung ist es auch notwendig, auf strenge Disziplin und richtige Risikokontrolle zu achten. Strategieprogrammierung kann professionelle Sprachen wie Pine Script nutzen und Handelsplattform-APIs integrieren, um eine automatisierte Strategieausführung zu realisieren.
/*backtest start: 2024-05-01 00:00:00 end: 2024-05-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © syam-mohan-vs @ T7 - wwww.t7wealth.com www.t7trade.com //This is an educational code done to describe the fundemantals of pine scritpting language and integration with Indian discount broker Dhan. This strategy is not tested or recommended for live trading. //@version=5 strategy("Pine & Dhan - Moving Average Crossover Strategy", overlay=true) //Remove excess signals exrem(condition1, condition2) => temp = false temp := na(temp[1]) ? false : not temp[1] and condition1 ? true : temp[1] and condition2 ? false : temp[1] ta.change(temp) == true ? true : false // Define MA period ma_period = input(20, title = "MA Length") // Define target and stop loss levels target_percentage = input.float(title="Target Profit (%)", defval=2.0) stop_loss_percentage = input.float(title="Stop Loss (%)", defval=1.0) // Calculate the MA ma = ta.sma(close, ma_period) // Entry conditions long_entry = close >= ma short_entry = close < ma // Calculate target and stop loss prices target_price = long_entry ? strategy.position_avg_price + (close * (target_percentage / 100)) : strategy.position_avg_price - (close * (target_percentage / 100)) stop_loss_price = short_entry ? strategy.position_avg_price + (close * (stop_loss_percentage/ 100)) : strategy.position_avg_price - (close * (stop_loss_percentage / 100)) long_entry := exrem(long_entry,short_entry) short_entry := exrem(short_entry,long_entry) // Plot the MA plot(ma, color=color.blue, linewidth=2, title="MA") // Plot the entry and exit signals plotshape(long_entry, style=shape.arrowup, color=color.green, size=size.small,location = location.belowbar) plotshape(short_entry, style=shape.arrowdown, color=color.red, size=size.small,location = location.abovebar) //Find absolute value of positon size to exit position properly size = math.abs(strategy.position_size) //Replace these four JSON strings with those generated from user Dhan account long_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"I","sort_order":"1","price":"0"}]}' long_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' // Submit orders based on signals if(strategy.position_size == 0) if long_entry strategy.order("Long", strategy.long,alert_message=long_msg) if short_entry strategy.order("Short", strategy.short,alert_message=short_msg) if(strategy.position_size > 0) if(short_entry) strategy.order("Short", strategy.short, qty = size, alert_message=short_msg) else strategy.exit("Long Exit", from_entry="Long", qty = size, stop=stop_loss_price, limit= target_price, alert_message=long_exit_msg) if(strategy.position_size < 0) if(long_entry) strategy.order("Long", strategy.long, qty = size, alert_message=long_msg) else strategy.exit("Short Exit", from_entry="Short", qty = size, stop=stop_loss_price, limit= target_price, alert_message=short_exit_msg)