ダイナミック・グリッド・トレーディング・戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-23 10:53:05
タグ:

img

概要

この戦略は,複数の並行購入・販売注文を価格範囲内に置き換え,グリッド取引を実施する.市場変動に基づいてグリッド範囲とラインを調整して利益を得る.

戦略の論理

  1. ネットワークの上限と下限を設定し,手動で設定したり,最近の高値と低値に基づいて自動的に計算することができます.
  2. 指定された数のグリッドラインに従ってグリッド間隔の幅を計算する.
  3. 配線値配列を生成する.
  4. 価格がグリッドラインを下回ると,その下にロングオーダーを開く.価格がグリッドライン上回ると,その上でのショートオーダーを閉じる.
  5. 市場変化に戦略を調整するために,限界,間隔幅,グリッドライン価格を動的に調整します.

利点分析

  1. 市場動向の方向性に関係なく 範囲限定で安定した利益を得ることができます
  2. 手動と自動パラメータ設定の両方をサポートします.
  3. 格子量,間隔幅,オーダーサイズなどのパラメータを最適化して より良い報酬を得ることができます
  4. 位置制御を組み込み リスクが低くなる
  5. ダイナミック・グリッドの範囲調整により 適応性が向上します

リスク分析

  1. 市場傾向が強い場合 深刻な損失が発生する可能性があります
  2. 格子量と位置の設定が正しくない場合 リスクが増加する可能性があります
  3. 価格変動が激しくなる場合 自動計算されたグリッド範囲は失敗する可能性があります

リスク管理

  1. グリッドのパラメータを最適化して 総位置を厳格に制御する
  2. 重要な価格動きの前に戦略を閉じる.
  3. 市場情勢を動向指標で判断し 必要に応じて戦略を練る

オプティマイゼーションの方向性

  1. 市場の性質と資本規模に基づいて最適なグリッド量を選択する.
  2. 自動パラメータを最適化するために 異なる期間をテストします
  3. オーダーサイズ計算を最適化して より安定した報酬を得ます
  4. 傾向の特定と戦略の接近条件のための指標を追加する.

概要

ダイナミック・グリッド・トレーディング戦略は,グリッドのパラメータを調整することによって市場に適応する.範囲限定および不安定な市場で利益を得る.適切なポジション制御によりリスクは軽減される.グリッド設定を最適化し,トレンド判断指標を組み込むことで,戦略の安定性をさらに改善することができる.


/*backtest
start: 2023-12-23 00:00:00
end: 2024-01-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("sarasa srinivasa kumar", 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="(Auto) 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="(Auto) 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)



もっと