Adaptive Smart Grid-Handelsstrategie


Erstellungsdatum: 2024-01-16 14:51:48 zuletzt geändert: 2024-01-16 14:51:48
Kopie: 1 Klicks: 985
1
konzentrieren Sie sich auf
1617
Anhänger

Adaptive Smart Grid-Handelsstrategie

Überblick

Die Strategie ist eine auf der TradingView-Plattform basierende, adaptive, intelligente Grid-Tradingstrategie, die mit Pine Script v4 geschrieben wurde. Sie wird auf der Preistabelle überzogen und erzeugt ein Grid innerhalb des angegebenen Bereichs, um Kauf- und Verkaufssignale zu erzeugen.

Strategieprinzip

Wichtige Funktionen

  1. Die Pyramiden und das Geldmanagement:

    • Das ist die einzige Möglichkeit, wie man sich die Pyramide anschauen kann.
    • Die Größe der Positionen wird mit einer cashbasierten Strategie verwaltet.
    • Für die Simulation wurde ein Startkapital von 100 US-Dollar festgelegt.
    • Für jede Transaktion wird eine Provision von 0,1% erhoben.
  2. Größenordnung:

    • Der Benutzer hat die Wahl zwischen einer automatisch berechneten Reichweite oder einer manuell eingestellten Gridobergrenze.
    • Der automatische Bereich kann aus den jüngsten Preishöhen und -tiefpunkten oder aus einem einfachen gleitenden Durchschnitt (SMA) extrahiert werden.
    • Der Benutzer kann die Rückblickphase für die Berechnung des Bereichs definieren und die Abweichung anpassen, um den Bereich zu erweitern oder zu verkleinern.
  3. Grid-Linie:

    • Die Strategie erlaubt eine anpassbare Anzahl von Gitterlinien innerhalb des Bereichs, empfohlen zwischen 3 und 15, und es wird empfohlen, dass die Grilllinien in der Größenordnung zwischen 3 und 15 angepasst werden.
    • Die Gitterlinie ist gleichmäßig zwischen der oberen und unteren Grenze verteilt.

Strategielogik

  • Eintritt in eine Position:

    • Wenn der Preis unter der Gitterlinie fällt und die Gitterlinie keine entsprechenden ungeklärten Orders hat, wird das Skript gebucht, um die Gitterlinie zu überschreiten.
    • Die Anzahl der Bestellungen wird berechnet durch die Anzahl der Netzleitungen, die durch das Anfangskapital geteilt werden, und wird an den aktuellen Preisen angepasst.
  • Die Position wird von der Bank zurückgezogen.

    • Ein Verkaufssignal wird ausgelöst, wenn der Preis über die höhere Gridlinie steigt und eine noch offene Position besteht, die mit der nächsten niedrigeren Gridlinie verbunden ist.
  • Das Netzwerk für Anpassung:

    • Wenn ein automatischer Bereich verwendet wird, wird das Gitter an veränderte Marktbedingungen angepasst, indem die obere und obere Grenze neu berechnet und entsprechend angepasst wird.

Analyse der Stärken

Die Strategie integriert die Vorteile der systematischen und effizienten Ausführung von Grid-Transactions. Sie erlaubt die Erweiterung und Verwendung von Kapitalverwaltung, um das Risiko effektiv zu kontrollieren. Die Grid passt sich automatisch an den Markt an und ist für verschiedene Situationen geeignet. Die Parameter sind anpassbar und passen sich an verschiedene Handelsstile an.

Risikoanalyse

Wenn der Preis die untere Grenze des Netzes überschreitet, kann dies zu erheblichen Verlusten führen. Die Parameter sollten entsprechend angepasst werden, um das Risiko zu kontrollieren, oder in Verbindung mit Stop-Losses. Außerdem erhöhen zu häufige Geschäfte die Transaktionsgebühren.

Optimierungsrichtung

Es kann in Kombination mit Trendindikator-Filtersignalen oder optimierten Grid-Parametern in Betracht gezogen werden, um das Risiko von Extremsituationen durch Stop-Loss zu vermeiden.

Zusammenfassen

Die Strategie erzeugt systematisch Kauf- und Verkaufspunkte und verwaltet Positionen, die sich an unterschiedliche Präferenzen anpassen können. Sie kombiniert die Regelmäßigkeit des Grid-Handels mit der Flexibilität des Trend-Handels, wodurch die Betriebsschwierigkeit verringert wird und eine gewisse Fehleranfälligkeit besteht.

Strategiequellcode
/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds    = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool)                             // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc      = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"])     // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev      = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1)  // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound    = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float)                      // for manual grid bounds only. The upperbound price of your grid
i_lowerBound    = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float)                      // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty       = input(group="Grid Lines",  title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer)       // how many grid lines are in your grid

f_getGridBounds(_bs, _bl, _bd, _up) =>
    if _bs == "Hi & Low"
        _up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl)  * (1 - _bd)
    else
        avg = sma(close, _bl)
        _up ? avg * (1 + _bd) : avg * (1 - _bd)

f_buildGrid(_lb, _gw, _gq) =>
    gridArr = array.new_float(0)
    for i=0 to _gq-1
        array.push(gridArr, _lb+(_gw*i))
    gridArr

f_getNearGridLines(_gridArr, _price) =>
    arr = array.new_int(3)
    for i = 0 to array.size(_gridArr)-1
        if array.get(_gridArr, i) > _price
            array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
            array.set(arr, 1, i == 0 ? i : i-1)
            break
    arr

var upperBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound  // upperbound of our grid
var lowerBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth       = (upperBound - lowerBound)/(i_gridQty-1)                                                       // space between lines in our grid
var gridLineArr     = f_buildGrid(lowerBound, gridWidth, i_gridQty)                                                 // an array of prices that correspond to our grid lines
var orderArr        = array.new_bool(i_gridQty, false)                                                              // a boolean array that indicates if there is an open order corresponding to each grid line

var closeLineArr    = f_getNearGridLines(gridLineArr, close)                                                        // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
    if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
        buyId = i
        array.set(orderArr, buyId, true)
        strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
    if close > array.get(gridLineArr, i) and i != 0
        if array.get(orderArr, i-1)
            sellId = i-1
            array.set(orderArr, sellId, false)
            strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))

if i_autoBounds
    upperBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
    lowerBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
    gridWidth   := (upperBound - lowerBound)/(i_gridQty-1)
    gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)

closeLineArr    := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)