Diese Strategie basiert auf dem Preiskanal-Indikator. Durch die Festlegung eines Momentumparameters berechnet sie den Durchschnittswert der höchsten und niedrigsten Preise in verschiedenen Zyklen, um die Mittellinie des Preiskanals zu bilden, und setzt darauf basierend lange und kurze Linien fest. Wenn der Preis die lange Linie durchbricht, geht er lang; wenn der Preis die kurze Linie durchbricht, geht er kurz. Die Schlusskondition ist, dass der Preis zur Kanalmittellinie zurückfällt.
Diese Strategie verwendet den Preiskanal-Indikator, um den Mittelwert der höchsten und niedrigsten Preise in verschiedenen Zyklen zu berechnen, um die Kanalmitte zu bilden. Basierend auf der Mittellinie werden lange und kurze Linien über den Shift-Parameter festgelegt. Die Lange-Linie-Rechenformel lautet: Mittellinie + (Mittellinie × Lange-Linie-Parameter%); die Kurzlinie-Rechenformel lautet: Mittellinie + (Mittellinie × Kurzlinie-Parameter%).
Wenn der Preis unter der Long-Linie liegt, öffnen Sie Long-Positionen mit Limit-Orders; wenn der Preis über der Short-Linie liegt, öffnen Sie Short-Positionen mit Limit-Orders.
Die Strategie weist folgende Vorteile auf:
Die Strategie birgt auch einige Risiken:
Die oben genannten Risiken können durch Optimierung von Parametern, Festlegung von Stop-Loss-Orders oder Kombination anderer Indikatoren zur Beurteilung gemildert werden.
Die Strategie kann in folgenden Aspekten optimiert werden:
Die Konstruktionsidee dieser Strategie basierend auf dem Preiskanalindikator ist klar. Durch den Einsatz von Breakouts zur Eröffnung von Positionen können Risiken effektiv kontrolliert werden. Es gibt aber auch große Parameteroptimierungsräume und Stop-Loss-Mechanismen, die verbessert werden müssen. Insgesamt hat die Strategie einen gewissen praktischen Wert und lohnt sich weitere Tests und Optimierungen.
/*backtest start: 2022-11-29 00:00:00 end: 2023-12-05 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 strategy(title = "Noro's PCMA Strategy v1.0", shorttitle = "PCMA 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %") per = input(3, title = "Length") shortlevel = input(10.0, title = "Short line (red)") longlevel = input(-5.0, title = "Long line (lime)") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Price Channel h = highest(high, per) l = lowest(low, per) c = (h + l) / 2 ll = c + ((c / 100) * longlevel) sl = c + ((c / 100) * shortlevel) //Lines shortcolor = needshort ? red : na longcolor = needlong ? lime : na plot(sl, linewidth = 2, color = shortcolor, title = "Short line") plot(c, linewidth = 2, color = blue, title = "SMA line") plot(ll, linewidth = 2, color = longcolor, title = "Long line") //Trading size = strategy.position_size lot = 0.0 lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1] if (not na(close[per])) and size == 0 and needlong strategy.entry("L", strategy.long, lot, limit = ll, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if (not na(close[per])) and size == 0 and needshort strategy.entry("S", strategy.short, lot, limit = sl, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if (not na(close[per])) and size > 0 strategy.entry("Close", strategy.short, 0, limit = c, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if (not na(close[per])) and size < 0 strategy.entry("Close", strategy.long, 0, limit = c, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()