
Die Grid Trading Risk Hedging Strategy ist eine quantitative Trading-Strategie, die auf der Grid-Trading-Theorie basiert und mit der Idee der Risiko-Hedging kombiniert. Die Strategie profitiert von Preisschwankungen, indem sie mehrere Kauf- und Verkaufsaufordern innerhalb eines vorgegebenen Preisspannes platziert. Die Strategie enthält auch eine Risikobereitschaft, die die Grid-Grenzen dynamisch anpasst, um das Risiko der Strategie zu verringern.
Das Kernprinzip der Strategie ist das Grid-Trading. Zunächst wird die obere und untere Grenze des Grids und die Anzahl der Grid-Linien nach den vom Benutzer festgelegten Parametern festgelegt. Dann werden Kauf- und Verkaufsaufordern auf der Grid-Linie platziert: Wenn der Preis die Grid-Linie berührt, wird eine Position eröffnet, wenn zuvor keine Bestellungen vorhanden waren; wenn zuvor Bestellungen vorhanden waren, wurde eine Platzierung vorgenommen.
Zur Risikominderung wurde auch ein dynamischer Grid-Boundary-Anpassungsmechanismus eingeführt. Je nach Benutzerwahl kann der obere und untere Grenz des Grids auf zwei Arten automatisch angepasst werden: 1) nach den höchsten und niedrigsten Preisen der letzten Zeit und unter Berücksichtigung der von den Benutzern festgelegten Verlagerungen; 2) nach den Moving Averages und unter Berücksichtigung der von den Benutzern festgelegten Verlagerungen. Durch die dynamische Anpassung der Grid-Boundary kann das Grid immer um den aktuellen Preis herum gehalten werden, wodurch das Risiko verringert wird, dass der Preis die Grid-Boundary überschreitet.
Darüber hinaus wird die Strategie beim Positionseröffnen das Gesamtkapital in N-Teile aufgeteilt, wobei bei jedem Positionseröffnung gleich viel Geld verwendet wird, um das Risiko eines einzelnen Handels zu verringern.
Anpassungsfähigkeit: Durch die dynamische Anpassung der Grid-Grenzen kann die Strategie an unterschiedliche Marktumgebungen angepasst werden, sei es Trends oder Erschütterungen, die automatisch angepasst werden können, um bessere Erträge zu erzielen.
Risikokontrolle: Die Strategie nutzt bei der Eröffnung der Position gleich viel Kapital, das Risiko für einen einzelnen Handel ist geringer. Gleichzeitig kann die Dynamische Grid-Border-Adjustment-Mechanismen das Risiko verringern, dass der Preis die Grid-Border durchbricht.
Hohe Handelsfrequenz: Da das Netz normalerweise mehr Aufträge platziert, ist die Handelsfrequenz höher und es ist leichter, bei schwankenden Ereignissen zu profitieren.
Flexible Parameter: Der Benutzer kann die Anzahl der Grids, die Ober- und Untergrenze, die dynamisch angepassten Parameter usw. anpassen, um sich an verschiedene Handelsstile anzupassen, je nach seinen Vorlieben.
Die Strategie kann mit einem hohen Risiko konfrontiert sein, wenn die Preise kontinuierlich einseitig steigen oder fallen, die Grenzen des Grids überschreiten und die dynamische Anpassung nicht mit der Geschwindigkeit der Preisänderungen mithalten kann.
Handhabungsgebühren: Die Handhabungsgebühren können sich auf die Erträge auswirken, da die Strategie häufig gehandelt wird.
Fehlgelegte Parameter: Fehlgelegte Parameter, wie z. B. zu viele Gitter, unzumutbare Gittergrenzen usw., können zu einer schlechten Strategie führen.
Lösungsansätze: 1) In einem Trend kann die Anpassung der Grid-Grenze erhöht werden, oder in Kombination mit einer Trendstrategie; 2) Die Wahl von Exchanges und Währungen mit niedrigeren Gebühren; 3) Vor dem tatsächlichen Betrieb müssen die Parameter ausreichend getestet und optimiert werden.
In Kombination mit anderen Strategien: Es kann in Betracht gezogen werden, die Grid-Handelsstrategie mit anderen Arten von Strategien zu kombinieren, wie z. B. Trendstrategien, Mean Return Strategien, um die Anpassungsfähigkeit und Stabilität der Strategie zu verbessern.
Verbesserte dynamische Anpassungsmechanismen: Die dynamischen Anpassungsmechanismen in der aktuellen Strategie sind relativ einfach und können weiter optimiert werden, z. B. durch Berücksichtigung mehrerer Faktoren (z. B. Verkehrsvolumen, Schwankungen usw.) und die Verwendung von fortgeschritteneren Algorithmen (z. B. Anpassungs-Algorithmen, Machine-Learning-Algorithmen usw.).
Optimierung der Kapitalverwaltung: Die derzeitige Strategie nutzt die gleichwertige Kapitalverwaltung. Es kann in Betracht gezogen werden, die Einführung von höheren Methoden der Kapitalverwaltung, wie z. B. Kelly’s Law, Optimierungsmethoden usw., um die Effizienz der Kapitalnutzung und die Erträge weiter zu verbessern.
Einführung von Stop-Stops: Auf der Grundlage von Grid-Trading können einige Stop-Stops-Logiken, wie beispielsweise Moving Stop-Stops und Volatilitätsstop-Stops, eingeführt werden, um das Strategie-Risiko weiter zu reduzieren.
Die Grid Trading Risk Hedging Strategy ist eine hoch automatisierte, anpassungsfähige und risikokontrollierbare Quantitative Trading Strategie. Durch den Grid Trading und die dynamische Grid-Anpassung kann die Strategie in verschiedenen Situationen profitieren und gleichzeitig die Risiken kontrollieren. Die Strategie kann jedoch in trendigen Situationen schlechte Leistungen erbringen, und die Vergütung kann sich auf die Erträge auswirken. Daher müssen weitere Optimierungen und Verbesserungen in der praktischen Anwendung durchgeführt werden.
/*backtest
start: 2024-03-19 00:00:00
end: 2024-03-23 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)