Strategie zur Erfassung des doppelt exponentiellen gleitenden Durchschnitts


Erstellungsdatum: 2023-12-13 15:28:50 zuletzt geändert: 2023-12-13 15:28:50
Kopie: 0 Klicks: 618
1
konzentrieren Sie sich auf
1621
Anhänger

Strategie zur Erfassung des doppelt exponentiellen gleitenden Durchschnitts

Überblick

Diese Strategie verwendet die Doppelindex-Durchschnittswerte, um die Richtung des Markttrends zu bestimmen, in Kombination mit dem Bollinger Bands-Indikator, um Überkauf-Überverkauf zu bestimmen, niedrig zu kaufen und hoch zu verkaufen, und profitabel auszusteigen.

Strategieprinzip

Diese Strategie verwendet den Doppelindex-Durchschnitt, um die Gesamtbewegung des Marktes zu beurteilen, und die Brin-Band beurteilt den spezifischen Einstiegszeitpunkt.

Bei einem Doppel-Durchschnittsschnitt wird ein kurzfristiger und ein langfristiger Indikator-Durchschnittsschnitt berechnet, wobei der kurzfristige Schnitt von unten nach oben über den langfristigen Schnitt hinausgeht.

Der Brin-Band-Indikator beurteilt, ob der Preis überkauft oder überverkauft ist. Die Brin-Band-Mitte ist der Moving Average für den n-Tage-Schlusskurs, die Bandbreite ist die Standardabweichung für die n-Tage vor dem Moving Average. Der Preis ist überkauft, wenn er sich der Oberbahn nähert, und überverkauft, wenn er sich der Unterbahn nähert.

Die Regeln dieser Strategie lauten: Wenn die Kurzmittellinie die Langmittellinie von unten nach oben durchbricht und der Schlusskurs die Brin-Band überschreitet, machen Sie einen Plus; wenn die Kurzmittellinie von oben nach unten die Langmittellinie überschreitet und der Schlusskurs die Brin-Band überschreitet, machen Sie einen Minus.

Der Stop-Loss-Punkt nach dem Überschreiten ist der niedrigste Preis in den letzten n Tagen und der Stop-Loss-Punkt ist das 1,6-fache des Eröffnungspreises. Der Stop-Loss-Punkt nach dem Leerlegen ist der höchste Preis in den letzten n Tagen und der Stop-Loss-Punkt ist das 1,6-fache des Eröffnungspreises.

Darüber hinaus berücksichtigt die Strategie auch die EMA-Leerpreisindikatoren, um die Gesamtentwicklung zu beurteilen und eine Gegenposition zu vermeiden.

Analyse der Stärken

  1. Die BIP-Durchschnittswerte werden verwendet, um die Gesamtbewegung zu beurteilen, die Brin-Band beurteilt die spezifischen Kauf- und Verkaufspunkte und die Indikatoren werden vernünftigerweise kombiniert.
  2. Die Verwendung von mehreren Stop-Loss-Punkten als n-Tage-Tiefstpreise und die Verwendung von n-Tage-Höchstpreisen als Short-Stop-Punkte reduzieren die Wahrscheinlichkeit, dass Stop-Losses verfolgt werden.
  3. Die Stop-Off-Punkte sind 1,6 mal so hoch wie die Eröffnungspreise, was zu einem ausreichenden Gewinn führt.
  4. Ein Rückschlag kann durch die Berücksichtigung der EMA-Gesamtindikatoren vermieden werden, um systematische Verluste zu verringern.

Risikoanalyse

  1. Eine unzureichende Optimierung der Brin-Band-Parameter kann zu einer zu hohen Handelsfrequenz oder zu seltenen Signalen führen.
  2. Die Stop-Loss-Punkte sind zu locker, was zu größeren Verlusten führen kann.
  3. Ein zu lockeres Anschlagpunkt könnte einen schmackhafteren Anschlag verpassen.

Optimieren Sie die Kombination von Brin-Band-Parametern für die oben genannten Risiken, testen Sie verschiedene Stop-Loss-Stop-Levels und wählen Sie die optimalsten Parameter aus.

Optimierungsrichtung

  1. Optimierung der Brin-Band-Parameter, um die beste Kombination von Parametern zu finden;
  2. Verschiedene Stop-Loss-Parameter werden getestet, um die Wahrscheinlichkeit zu verringern, dass ein Stop-Loss verfolgt wird.
  3. Versuchen Sie, die verschiedenen Parameter der Stop-Multiplier-Parameter zu testen, um mehr zu erzielen.

Zusammenfassen

Diese Strategie verwendet die Doppelindex-Durchschnittswerte, um die Gesamtentwicklung des Marktes zu bestimmen, und Brin-Bänder, um die Zeit für spezifische Käufe und Verkäufe zu bestimmen. In den Rückmeldedaten ist eine gute Leistung zu erwarten. Durch die Optimierung der Parameter und die Änderung der Regeln können bessere Ergebnisse erzielt werden.

Strategiequellcode
/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-06 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This close code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AugustoErni

//@version=5
strategy('Bollinger Bands Modified (Stormer)', overlay=true)

bbL                   = input.int(20, title='BB Length/Comprimento da Banda de Bollinger', minval=1, step=1, tooltip='Calculate the length of bollinger bands./Calcula o comprimento das bandas de bollinger.')
mult                  = input.float(0.38, title='BB Standard Deviation/Desvio Padrão da Banda de Bollinger', minval=0.01, step=0.01, tooltip='Calculate the standard deviation of bollinger bands./Calcula o desvio padrão das bandas de bollinger.')
emaL                  = input.int(80, title='EMA Length/Comprimento da Média Móvel Exponencial', minval=1, step=1, tooltip='Calculate the length of EMA./Calcula o comprimento da EMA.')
highestHighL          = input.int(7, title='Highest High Length/Comprimento da Alta Maior', minval=1, step=1, tooltip='Fetches the highest high candle from length input. Use to set stop loss for short position./Obtém a vela de maior alta com base na medida fornecida. Usa para definir o stop loss para uma posição curta.')
lowestLowL            = input.int(7, title='Lowest Low Length/Comprimento da Baixa Menor', minval=1, step=1, tooltip='Fetches the lowest low candle from length input. Use to set stop loss for long position./Obter a vela de menor baixa com base na medida fornecida. Usa para definir o stop loss para uma posição longa.')
targetFactor          = input.float(1.6, title='Target Take Profit/Objetivo de Lucro Alvo', minval=0.1, step=0.1, tooltip='Calculate the take profit factor when entry position./Calcula o fator do alvo lucro ao entrar na posição.')
emaTrend              = input.bool(true, title='Check Trend EMA/Verificar Tendência da Média Móvel Exponencial', tooltip='Use EMA as trend verify for opening position./Usa a EMA como verificação de tendência para abrir posição.')
crossoverCheck        = input.bool(false, title='Add Another Crossover Check/Adicionar Mais uma Verificação de Cruzamento Superior', tooltip='This option is to add one more veryfication attempt to check if price is crossover upper bollinger band./Esta opção é para adicionar uma verificação adicional para avaliar se o preço cruza a banda superior da banda de bollinger.')
crossunderCheck       = input.bool(false, title='Add Another Crossunder Check/Adicionar Mais uma Verificação de Cruzamento Inferior', tooltip='This option is to add one more veryfication attempt to check if price is crossunder lower bollinger band./Esta opção é para adicionar uma verificação adicional para avaliar se o preço cruza a banda inferior da banda de bollinger.')
insideBarPatternCheck = input.bool(true, title='Show Inside Bar Pattern/Mostrar Padrão de Inside Bar', tooltip='This option is to show possible inside bar pattern./Esta opção é para mostrar um possível padrão de inside bar.')

[middle, upper, lower] = ta.bb(close, bbL, mult)
ema                    = ta.ema(close, emaL)
highestHigh            = ta.highest(high, highestHighL)
lowestLow              = ta.lowest(low, lowestLowL)
isCrossover            = ta.crossover(close, upper) ? 1 : 0
isCrossunder           = ta.crossunder(close, lower) ? 1 : 0

isPrevBarHighGreaterCurBarHigh = high[1] > high ? 1 : 0
isPrevBarLowLesserCurBarLow    = low[1] < low ? 1 : 0
isInsideBar                    = isPrevBarHighGreaterCurBarHigh and isPrevBarLowLesserCurBarLow ? 1 : 0

isBarLong  = ((close - open) > 0) ? 1 : 0
isBarShort = ((close - open) < 0) ? 1 : 0

isLongCross  = crossoverCheck ? ((isBarLong and not isBarShort) and (open < upper and close > upper)) ? 1 : 0 : isCrossover ? 1 : 0
isShortCross = crossunderCheck ? ((isBarShort and not isBarLong) and (close < lower and open > lower)) ? 1 : 0 : isCrossunder ? 1 : 0

isCandleAboveEma = close > ema ? 1 : 0
isCandleBelowEma = close < ema ? 1 : 0

isLongCondition  = emaTrend ? isLongCross and isCandleAboveEma ? 1 : 0 : isLongCross
isShortCondition = emaTrend ? isShortCross and isCandleBelowEma ? 1 : 0 : isShortCross

isPositionNone  = strategy.position_size == 0 ? 1 : 0
isPositionLong  = strategy.position_size > 0 ? 1 : 0
isPositionShort = strategy.position_size < 0 ? 1 : 0

var float enterLong     = 0.0
var float stopLossLong  = 0.0
var float targetLong    = 0.0
var float enterShort    = 0.0
var float stopLossShort = 0.0
var float targetShort   = 0.0
var bool isLongEntry    = false
var bool isShortEntry   = false

if (isPositionNone)
    isLongEntry   := false
    isShortEntry  := false
    enterLong     := 0.0
    stopLossLong  := 0.0
    targetLong    := 0.0
    enterShort    := 0.0
    stopLossShort := 0.0
    targetShort   := 0.0
if (isPositionShort or isPositionNone)
    isLongEntry  := false
    enterLong    := 0.0
    stopLossLong := 0.0
    targetLong   := 0.0
if (isPositionLong or isPositionNone)
    isShortEntry  := false
    enterShort    := 0.0
    stopLossShort := 0.0
    targetShort   := 0.0
if (isPositionLong and isLongEntry)
    isLongEntry   := true
    isShortEntry  := false
    enterShort    := 0.0
    stopLossShort := 0.0
    targetShort   := 0.0
if (isPositionShort and isShortEntry)
    isShortEntry := true
    isLongEntry  := false
    enterLong    := 0.0
    stopLossLong := 0.0
    targetLong   := 0.0

if (isLongCondition and not isLongEntry)
    isLongEntry  := true
    enterLong    := close
    stopLossLong := lowestLow
    targetLong   := (enterLong + (math.abs(enterLong - stopLossLong) * targetFactor))
    alertMessage = '{ "side/lado": "buy", "entry/entrada": ' + str.tostring(enterLong) + ', "stop": ' + str.tostring(stopLossLong) + ', "target/alvo": ' + str.tostring(targetLong) + ' }'
    alert(alertMessage)
    strategy.entry('Long', strategy.long)
    strategy.exit('Exit Long', 'Long', stop=stopLossLong, limit=targetLong)

if (isShortCondition and not isShortEntry)
    isShortEntry  := true
    enterShort    := close
    stopLossShort := highestHigh
    targetShort   := (enterShort - (math.abs(enterShort - stopLossShort) * targetFactor))
    alertMessage = '{ "side/lado": "sell", "entry/entrada": ' + str.tostring(enterShort) + ', "stop": ' + str.tostring(stopLossShort) + ', "target/alvo": ' + str.tostring(targetShort) + ' }'
    alert(alertMessage)
    strategy.entry('Short', strategy.short)
    strategy.exit('Exit Short', 'Short', stop=stopLossShort, limit=targetShort)

plot(upper, title='Upper Band', color=color.blue)
plot(middle, title='Middle Band', color=color.gray)
plot(lower, title='Lower Band', color=color.blue)
plot(ema, title='EMA', color=color.white)

barcolor(insideBarPatternCheck and isInsideBar and isBarLong ? color.lime : insideBarPatternCheck and isInsideBar and isBarShort ? color.maroon : na, title='Inside Bar Color in Long Bar Long and in Short Bar Short/Cor do Inside Bar em Barra Longa Longa e em Barra Curta Curta')

tablePosition    = position.bottom_right
tableColumns     = 2
tableRows        = 5
tableFrameWidth  = 1
tableBorderColor = color.gray
tableBorderWidth = 1

tableInfoTrade = table.new(position=tablePosition, columns=tableColumns, rows=tableRows, frame_width=tableFrameWidth, border_color=tableBorderColor, border_width=tableBorderWidth)

table.cell(table_id=tableInfoTrade, column=0, row=0)
table.cell(table_id=tableInfoTrade, column=1, row=0)

table.cell(table_id=tableInfoTrade, column=0, row=1, text='Entry Side/Lado da Entrada', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=0, row=2, text=isLongEntry ? 'LONG' : isShortEntry ? 'SHORT' : 'NONE/NENHUM', text_color=color.yellow)

table.cell(table_id=tableInfoTrade, column=1, row=1, text='Entry Price/Preço da Entrada', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=1, row=2, text=isLongEntry ? str.tostring(enterLong) : isShortEntry ? str.tostring(enterShort) : 'NONE/NENHUM', text_color=color.blue)

table.cell(table_id=tableInfoTrade, column=0, row=3, text='Take Profit Price/Preço Alvo Lucro', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=0, row=4, text=isLongEntry ? str.tostring(targetLong) : isShortEntry ? str.tostring(targetShort) : 'NONE/NENHUM', text_color=color.green)

table.cell(table_id=tableInfoTrade, column=1, row=3, text='Stop Loss Price/Preço Stop Loss', text_color=color.white)
table.cell(table_id=tableInfoTrade, column=1, row=4, text=isLongEntry ? str.tostring(stopLossLong) : isShortEntry ? str.tostring(stopLossShort) : 'NONE/NENHUM', text_color=color.red)