
Die Strategie nutzt einen Vergleich innerhalb und außerhalb des Ball-Band-Kanals, um Trends zu beurteilen, und ist in Kombination mit einem Dynamik-Indikator, der Trends verfolgt. Die Strategie erzeugt ein neues Trendsignal, wenn die Schwankungen innerhalb des Kanals geringer sind als außerhalb des Kanals, und öffnet eine Position. Die Stop-Loss-Position verwendet das ATR-Multiplikator, wobei der Stop-Loss das ATR-Multiplikator-Risiko-Rendite ist.
Die Strategie besteht aus folgenden Teilen:
Boll-Band-Einstellung: umfasst große Boll-Band-Länge 40 Zyklen, kleine Boll-Band-Länge 20 Zyklen, die Durchgangsbreite ist 2 mal die Standardabweichung.
Kanalexplosionsurteil: Wenn der Big-Ball-Band-Aufstieg niedriger als der Little-Ball-Aufstieg ist und der Big-Ball-Band-Abstieg höher als der Little-Ball-Abstieg ist, bedeutet dies, dass die Schwankungen zunehmen und ein neues Trendsignal erzeugen.
Dynamikindikator: 14-Tage-EMA von 240 Zyklen, um die Richtung des Trends zu bestimmen
ATR-Stoppschutz: 14 mal die Stoppschutz-Distanz des ATR und 1,5 mal die Stoppschutz-Stoppschutz-Distanz.
Die Strategie beginnt damit, zu beurteilen, ob ein Kanal explodiert, und wenn ein Kanal explodiert, dann die Richtung der Dynamik zu beurteilen, um zu entscheiden, ob mehr oder weniger gemacht wird. Nach der Einfahrt wird die Stop-Loss-Stop-Management mit ATR-Multiplizierten durchgeführt.
Mit Hilfe der doppelpolischen Bandstruktur können Schwankungen in verschiedenen Zeiträumen verglichen werden, um einen Ausbruch der Tendenz zu bestimmen.
Mit Hilfe von Dynamik-Indikatoren können Sie die Richtung des Trends bestimmen, um nicht von den Whipsaws der Marktschwankungen beeinflusst zu werden.
Mit dem ATR können Sie die Stop-Loss-Distanz an die Marktschwankungen anpassen.
Das Risiko-Rendite-Verhältnis ist angemessen, man sollte nicht übertreiben und nicht zu konservativ sein.
Bei Trends ohne eindeutige Tendenz kann man leicht in Schwierigkeiten geraten. Man kann Fehleinschätzungen reduzieren, indem man die Parameter des Dynamikindikators optimiert.
ATR-Stopps können zu konservativ sein und andere Stopps, wie beispielsweise mobile Stopps, können getestet werden.
Die festgelegte Stop-Loss-Stopp-Multiplikatoren sind möglicherweise nicht für alle Sorten geeignet. Es kann in Betracht gezogen werden, sie anpassbar zu machen.
Die Effektivität der Doppelpol-Band bei der Bestimmung von Trendwendepunkten ist zweifelhaft. Andere Kanal-Indikatoren wie der KD-Kanal können getestet werden.
Verschiedene Parameter des Dynamometers werden getestet, um die optimale Kombination zu finden.
Versuchen Sie verschiedene Stopp-Methoden, wie z. B. mobile Stopps, ATRs und andere.
Die Stop-Loss-Stoppmultiplier sind anpassbar und optimierbar für verschiedene Sorten und Marktbedingungen.
Die Wirksamkeit verschiedener Kanalindikatoren wird getestet und ein stabilerer Kanalindikator wird ausgewählt.
Erwägen Sie die Einbeziehung von Gewinnsteuerung, um die Gewinne besser zu steuern.
Die Gewinnrate kann je nach Bandbreite, Zeit und anderen Filterpunkten erhöht werden.
Die Gesamtkonzeption der Strategie ist klar, die Verwendung von Doppelpolen zur Bestimmung von Trend-Ausbruchpunkten ist das größte Highlight der Strategie. Allerdings müssen Optimierungstests für die Stop-Loss-Methode, die Channel-Indikatoren und das Risiko-Management durchgeführt werden, um die Strategieparameter anpassungsfähiger zu machen und in verschiedenen Marktumgebungen stabil zu arbeiten. Insgesamt hat die Strategie gute Vorteile und Potenzial für die Entwicklung und verdient eine eingehende Untersuchung.
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 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/
// © kasaism
//@version=4
// strategy(title="[EURUSD60] BB Expansion Strategy", shorttitle="[EURUSD60] BBEXP",overlay=true, max_bars_back=5000, max_labels_count=500)
// === INPUTS === //
////BB
largeBbRes = input(title="Large BB Resolution", type=input.resolution, defval="", group="BB")
largeBbLength = input(title="Large BB Length", type=input.integer, defval=40, minval=1, group="BB")
smallBbRes = input(title="Small BB Resolution ", type=input.resolution, defval="", group="BB")
smallBbLength = input(title="Small BB Length", type=input.integer, defval=20, minval=1, group="BB")
multi = input(title="BB StdDev", type=input.float, defval=2.0, maxval=10, minval=0.01, group="BB")
validLen = input(title="BB expand valid length", defval=14, group="BB")
// 3 each EMA settings. EMA directions are as each time frame directions.
resFirstTime = input(title="EMA Trend t/f", type=input.resolution, defval="240", group="SMT")
// resSecondTime = input(title="Second t/f", type=input.resolution, defval="30", group="SMT")
// resThirdTime = input(title="Third t/f", type=input.resolution, defval="", group="SMT")
emaLen = input(14, minval=1, title="Length", group="SMT")
smooth = input(3, minval=1, title="Smooth factor", group="SMT")
//Lisk Management
var riskManagementRule1 = "ATR"
var riskManagementRule2 = "Bracket"
riskManagementRule = input(riskManagementRule1, "Detect Risk Management Based On", options=[riskManagementRule1, riskManagementRule2, "No detection"], group="Trade")
atrMulti = input(3.0, title="ATR Multiple", type=input.float, minval = 1.0, group="ATR")
riskRewardRatio = input(1.5, title="Risk Reward Ratio for ATR", type=input.float, minval = 0.01, group="ATR")
stopLossPoint = input(100, title="Stop Loss Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
takeProfitPoint = input(200, title="Take Profit Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
// === /INPUTS/ === //
// === CONSTANT === //
//For barmerge.lookahead_off
index = barstate.isrealtime ? 1 : 0
//For Entry
NOENTRY=0
LONG=1
SHORT=2
//SMT color
int up=1
int dn=2
int up_HL=3
int dn_HL=4
//label color
color_bearish = color.red
color_bullish = color.blue
C_label_color_bearish = color.red
C_label_color_bullish = color.blue
// === /CONSTANT/ === //
// === FUNCTIONS === //
//BB trade direction
bbTradeDetection(lrgUpper, lrgLower, smlUpper, smlLower) =>
if not(na(lrgUpper) or na(lrgLower) or na(smlUpper) or na(smlLower))
if lrgUpper < smlUpper and lrgLower > smlLower
true
else
false
else
na
// === /FUNCTIONS/ === //
// === CALCURATES === //
////BB
//large BB
lrgBbBasis = security(syminfo.tickerid, largeBbRes, sma(close[index], largeBbLength))
lrgBbDev = multi * security(syminfo.tickerid, largeBbRes, stdev(close[index], largeBbLength))
lrgBbUpper = lrgBbBasis + lrgBbDev
lrgBbLower = lrgBbBasis - lrgBbDev
//small BB
smlBbBasis = security(syminfo.tickerid, smallBbRes, sma(close[index], smallBbLength))
smlBbDev = multi * security(syminfo.tickerid, smallBbRes, stdev(close[index], smallBbLength))
smlBbUpper = smlBbBasis + smlBbDev
smlBbLower = smlBbBasis - smlBbDev
bbTrade = bbTradeDetection(lrgBbUpper, lrgBbLower, smlBbUpper, smlBbLower)
//EMA Trend
base=security(syminfo.tickerid, resFirstTime, ema(close[index],emaLen))
sig=security(syminfo.tickerid, resFirstTime, ema(base[index],smooth))
emaTrend = not(na(base) or na(sig)) ? base < sig ? dn : up : na
////LISK MANAGEMENT
float stopLossLineForLong = na
float stopLossLineForShort = na
float takeProfitLineForLong = na
float takeProfitLineForShort = na
atr_ = atr(14) * atrMulti
if riskManagementRule == riskManagementRule1
stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : round(close[index] - atr_,3) : na
stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : round(close[index] + atr_,3) : na
takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] + atr_*riskRewardRatio : na
takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - atr_*riskRewardRatio : na
if riskManagementRule == riskManagementRule2
stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : close[index] - stopLossPoint * syminfo.mintick : na
stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : close[index] + stopLossPoint * syminfo.mintick : na
takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] +takeProfitPoint * syminfo.mintick : na
takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - takeProfitPoint * syminfo.mintick : na
// === /CALCURATES/ === //
// === CONDITIONS === //
//BB
bool isBbEntry = na
for i=0 to validLen
isBbEntry := bbTrade==true ? true : bbTrade[i]==true ? true : false
//plotshape(isBbEntry, style=shape.circle, location=location.bottom)
isBbLong = isBbEntry and open[index] < smlBbBasis[index] and close[index] > smlBbBasis[index]
isBbShort = isBbEntry and open[index] > smlBbBasis[index] and close[index] < smlBbBasis[index]
//SMT
isEmaLong = emaTrend == up
isEmaShort = emaTrend == dn
//ATR
isAtrLongStop = low[index] <= stopLossLineForLong
isAtrShortStop = high[index] >= stopLossLineForShort
isAtrLongLimit = high[index] >= takeProfitLineForLong
isAtrShortLimit = low[index] <= takeProfitLineForShort
// === /CONDITIONS/ === //
// === TRADE === //
//ENTRY
if (isBbLong and isEmaLong)
strategy.entry("LongEntry", strategy.long, comment="LongEntry")
if riskManagementRule == riskManagementRule2
strategy.exit("LongEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
if (isBbShort and isEmaShort)
strategy.entry("ShortEntry", strategy.short, comment="ShortEntry")
if riskManagementRule == riskManagementRule2
strategy.exit("ShortEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
//EXIT
if riskManagementRule == riskManagementRule1
if(isAtrLongStop)
strategy.close("LongEntry", when=isAtrLongStop, comment="ATR Stop")
if(isAtrShortStop)
strategy.close("ShortEntry", when=isAtrShortStop, comment="ATR Stop")
if(isAtrLongLimit)
strategy.close("LongEntry", when=isAtrLongLimit, comment="ATR Limit")
if(isAtrShortLimit)
strategy.close("ShortEntry", when=isAtrShortLimit, comment="ATR Limit")
// === /TRADE/ === //
// === PLOTS === //
plot(lrgBbBasis, title="Large BB Basis", linewidth=2, color=color.gray)
plot(lrgBbUpper, title="Large BB Upper", linewidth=2, color=color.gray)
plot(lrgBbLower, title="Large BB Lower", linewidth=2, color=color.gray)
plot(smlBbBasis, title="Small BB Basis", color=color.white)
plot(smlBbUpper, title="Small BB Upper", color=color.white)
plot(smlBbLower, title="Small BB Lower", color=color.white)
plot(base, title="EMA Line", color= emaTrend==dn ? color_bearish : emaTrend==up ? color_bullish : color.gray)
plot(stopLossLineForLong ? stopLossLineForLong : na, title="S/L Line For Long", color=color.yellow, style=plot.style_circles)
plot(stopLossLineForShort ? stopLossLineForShort : na, title="S/L Line For Short", color=color.yellow, style=plot.style_circles)
plot(takeProfitLineForLong ? takeProfitLineForLong : na, title="T/P Line For Long", color=color.purple, style=plot.style_circles)
plot(takeProfitLineForShort ? takeProfitLineForShort : na, title="T/P Line For Short", color=color.purple, style=plot.style_circles)
// /=== PLOTS ===/ //