DCA-Gitterstrategie mit doppeltem Bodenumkehr-Mittelumkehr

Schriftsteller:ChaoZhang, Datum: 2024-02-20 11:09:33
Tags:

img

Übersicht

Die Double Bottom Reversal Mean Reversion DCA Grid-Strategie wendet hauptsächlich den mittleren Reversionspreis und die DCA-Strategie an, um den allmählichen Positionsbau umzusetzen.

Strategie Logik

Die Strategie prüft zunächst, ob es zwei aufeinanderfolgende Schlusskurse gibt, die dem Boden des Kerzendiagramms entsprechen, was als double bottom bezeichnet wird. Wenn ein doppelter Boden erkannt wird, wird davon ausgegangen, dass es eine Preisumkehrmöglichkeit geben kann. Zu diesem Zeitpunkt wird die Strategie mehrere Limitorders um den Bodenpreis herum setzen. Die Preise dieser Aufträge werden basierend auf ATR und Volatilität berechnet und bilden eine Gitterzone. Dies erreicht den DCA-Effekt und ermöglicht es den Händlern, nach der Umkehrung allmählich Positionen zu verschiedenen Preisen aufzubauen.

Der ATR-Indikator über die letzten 14 Kerzen wird zunächst durch ta.atr ermittelt. Anschließend wird die Preisvolatilität über die letzten 5 Kerzen berechnet. Sie sind die wichtigsten Parameter, die zur Bestimmung der Gitterzone verwendet werden. Das Gitter enthält 4 Preisstufen - Bodenpreis + Volatilität, Bodenpreis + 0,75 * Volatilität und so weiter. Sobald die doppelte Bodenbedingung ausgelöst wird, werden 4 Limitorders mit gleicher Größe nach dieser Formel platziert. Die nicht ausgeführten Aufträge werden nach mehreren Kerzen storniert.

Darüber hinaus legt die Strategie auch einen Stop-Loss-Preis und einen Take-Profit-Preis fest. Der Stop-Loss-Preis wird auf den niedrigsten Preis des doppelten Bodens abzüglich einer Tickgröße festgelegt, während der Take-Profit-Preis auf den Einstiegspreis plus 5 mal den ATR festgelegt wird. Diese beiden Preise werden in Echtzeit aktualisiert, wenn die Positionsgröße größer als 0 ist.

Stärken

Die wichtigsten Vorteile dieser Strategie sind:

  1. Die Verwendung eines doppelten Bodenes zur Bestimmung der Umkehrung verbessert die Genauigkeit und verhindert Fehlbrüche.
  2. Das DCA-Gitter ermöglicht es Händlern, Positionen schrittweise zu unterschiedlichen Preisen aufzubauen und so die Kostenbasis zu senken.
  3. Dynamische ATR- und Volatilitätsparameter werden anhand von Marktveränderungen angepasst.
  4. Der automatische Stop-Loss kontrolliert effektiv den Verlust pro Handel.

Risikoanalyse

Hauptrisiken:

  1. Der Preis kann ohne Umkehrung durch die Unterstützung durchbrechen, wodurch Stop-Loss und Verluste ausgelöst werden.
  2. Eine unsachgemäße Einstellung des DCA-Gitternetzes kann zu einer geringen Füllgeschwindigkeit führen.
  3. Sie können auch eine größere Anzahl von Profitmultiplanten in Anspruch nehmen.

Verbesserungsbereiche

Einige Bereiche, die verbessert werden können:

  1. Fügen Sie das Trendbeurteilungsverfahren hinzu, handeln Sie nur um Umkehrungen entlang des Haupttrends, um Verluste zu vermeiden.
  2. Für den ersten Eintrag sollten größere Größen und für die Netzeintragungen kleinere Größen berücksichtigt werden, um die Effizienz der Kapitalnutzung zu optimieren.
  3. Testen Sie verschiedene Parameterkombinationen, um optimale Parameter zu finden, oder entwerfen Sie dynamische Anpassungslogiken.
  4. Integrieren Sie maschinelles Lernen in eine erweiterte Plattform, um automatische Parameteroptimierung zu erreichen.

Zusammenfassung

Die Double Bottom Reversal Mean Reversion DCA Grid Strategy konsolidiert Preismuster, Indikatortechniken und Gitterhandel. Sie verfügt über präzise Timing, kontrollierbare Kostenbasis und Drawdown-Schutz. Es gibt immer noch Raum für Optimierung und es lohnt sich zu recherchieren. Richtig konfiguriert, können gute Ergebnisse in Bereichsgebundenen Märkten erzielt werden.


/*backtest
start: 2024-02-12 00:00:00
end: 2024-02-19 00:00:00
period: 3m
basePeriod: 1m
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/
// © cherepanovvsb

//@version=5
strategy("Reversal (only long)", overlay=true, margin_long=1, margin_short=1,initial_capital=1000,commission_type = strategy.commission.percent,commission_value =0.1,currency='USD', process_orders_on_close=true)
plotshape(low == low[1], style=shape.triangleup, location=location.belowbar, color=color.blue, title="1 Setup")
plotshape(low == low[1] and low[1]==low[2], style=shape.triangleup, location=location.belowbar, color=color.red, title="Triple Setup")

ATRlenght   = input.int(title="ATR length for taking profit", defval=14, group="Strategy Settings")
rewardMultiplier= input.int(title="ATR multiplier", defval=5, group="Strategy Settings")
Volatility_length=input.int(title='Volatility length',defval=5,group="Strategy Settings")
Volatility_multiplier=input.float(title='Volatility multiplier',defval=0.5,step=0.1, group="Strategy Settings")
Candles_to_wait=input.int(title='How many candles to wait after placing orders grid?',defval=4,group="Strategy Settings")

// Get ATR
atr1 = ta.atr(ATRlenght)

//Get volatility values (not ATR) 
float result = 0
for i = 0 to Volatility_length
	result+=high[i]-low[i]
volatility=result*Volatility_multiplier/Volatility_length

//Validate entrance points
validlow =  low [2]== low[1] and not na(atr1) 
validlong = validlow and strategy.position_size == 0  and low[1]<low


// Calculate SL/TP
longStopPrice = low[1]-syminfo.mintick
longStopDistance = close - longStopPrice
longTargetPrice = close + (longStopDistance * rewardMultiplier)
strategy.initial_capital = 50000
//Assign all variables
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0
var point1=0.0
var point2=0.0
var point3=0.0
var point4=0.0
var contracts = int(strategy.initial_capital/close)/4
if validlong 
    tradeStopPrice := longStopPrice
    tradeTargetPrice := longTargetPrice
    point1:=low[1]+volatility
    point2:=low[1]+volatility*0.75
    point3:=low[1]+volatility*0.5
    point4:=low[1]+volatility*0.25

strategy.entry ("Long1", strategy.long,limit=point1,qty=contracts, when=validlong)
strategy.entry ("Long2", strategy.long,limit=point2,qty=contracts, when=validlong)
strategy.entry ("Long3", strategy.long,limit=point3,qty=contracts, when=validlong)
strategy.entry ("Long4", strategy.long,limit=point4,qty=contracts, when=validlong)

stopcondition = ta.barssince(validlong) == Candles_to_wait

strategy.cancel("Long1",when=stopcondition)
strategy.cancel("Long2",when=stopcondition)
strategy.cancel("Long3",when=stopcondition)
strategy.cancel("Long4",when=stopcondition)
    
strategy.exit(id="Long Exit", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0)

plot(strategy.position_size != 0 or validlong ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, linewidth=3)
plot(strategy.position_size != 0 or validlong ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, linewidth=3)

plot(strategy.position_size != 0? point1 : na, title="Long1", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point2 : na, title="Long2", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point3 : na, title="Long3", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0? point4 : na, title="Long4", color=color.green, style=plot.style_linebr, transp=0)



Mehr