
動的格子取引戦略 移動平均とその上下線を計算し,格子取引区間を動的に設定する.価格が格子区間を突破すると,固定間隔で設定された格子線に沿って取引信号を発信し,利益を上げる.
この策略は,まず定義期間nの移動平均を計算し,移動平均を上下軌道に並べます.上下軌道は移動平均です.(1 + 入力パラメータstd),下線は移動平均(1 - 入力パラメータstd) 〜 動的に調整された取引区間帯を構成できます.
そして,区間帯内では,m条の等距離の格子線を定義する. 価格が上昇してある格子線を突破すると,その格子線で多信号を発信する. 価格が低下してある格子線を突破すると,その格子線に対応する上部の格子線で平仓信号を発信する. この逆操作により,価格が波動する時に利益を得ることができる.
具体的には,各グリッドラインの取引状態を記録するために,order_arrayのbool型配列を使用します. 一つのグリッドラインが多条件に触発された場合,order_arrayの対応する状態をtrueに設定し,そのグリッドラインが保有していることを示す. 価格が落ちてグリッドラインを突破すると,order_arrayの対応する上のグリッドラインの状態をfalseに設定し,平仓信号を発します.
この戦略の利点は以下の通りです.
移動平均を使って動的に調整された取引区間を構築し,市場の波動性に応じて区間範囲を調整して,戦略をより市場に適応させることができる.
格子設計は,極端な状況による損失の拡大を防ぐために,自動で停止損失を停止することができます.
格子数と資金配分は等間隔と等額配分を採用し,単一ポジションの規模をうまく制御し,単一ポジションのリスクを低減する.
多平仓のシグナルを合理的に設定して,順位取引,時効のストップ・ストップ・損失を行う.
この戦略にはいくつかのリスクがあります.
市場が長期にわたる弱さでグリットラインを突破できない場合,戦略は方向のない振動的な取引に巻き込まれ,多空交替は口座の資金流出を引き起こす可能性があります.
選択されたパラメータstdとグリッドの数は,完全に合理的ではない可能性があり,異なる取引品種の分析によって決定する必要があります.パラメータを正しく設定しなければ,取引区間とグリッドがあまりにも大きくまたは小さすぎて,戦略の効果に影響を及ぼします.
戦略は,価格の飛躍,ショートライン爆発的な上昇または低下などの極端な状況を考慮していない. これらの状況は,戦略が複数の格子を破り,リスク管理を超えた損失を引き起こす可能性があります.
この戦略は,以下の点で最適化できます.
機械学習のアルゴリズムを導入し,移動平均の上昇と下落を予測するモデルを訓練し,取引区間をより賢く動的にすることができます.
異なる取引標識の特性に応じて,格子数,資金分配比率,ポジションサイズなどのパラメータを最適化できる,自己適応パラメータを使用する。
条件の表を設定し,一定の距離の格子線に予備の止損表を設定し,前もって止損の役割を果たし,極端な状況下での損失を制御する.
極端な市場状況に対する異常処理機構の設計,例えば,初開設ポジションの拡大,中間格子からの直接停止のスキップなど,価格の飛躍などの異常状況に対応することができる.
ダイナミックグリッド取引戦略は,全体的に合理的に設計され,グリッドを使用して自動のストップ・ストップ・システムを構築することができ,価格変動がより頻繁な取引品種に適しています.しかし,この戦略には一定の市場リスクがあり,パラメータと異常事態を最適化して処理する必要があるので,戦略をより安定させることができます.
/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('Grid Trading Strategy', overlay=true)
// Input
ma_length = input.int(300, 'Moving Average Length',group = 'Moving Average Conditions', step = 10)
std = input.float(0.03, title='Upper and Lower Grid Deviation', group='Grid Conditions', step = 0.01)
grid = input.int(15, maxval=15, title='Grid Line Quantity', group='Grid Conditions')
// Moving Average
ma = ta.sma(close, ma_length)
upper_bound = ma * (1 + std)
lower_bound = ma * (1 - std)
grid_width = (upper_bound - lower_bound) / (grid - 1)
grid_array = array.new_float(0)
for i = 0 to grid - 1 by 1
array.push(grid_array, lower_bound + grid_width * i)
var order_array = array.new_bool(grid, false)
strategy.initial_capital = 10000
// Entry Conditions
for i = 0 to grid - 1 by 1
if close < array.get(grid_array, i) and not array.get(order_array, i)
buy_id = i
array.set(order_array, buy_id, true)
strategy.entry(id=str.tostring(buy_id), direction=strategy.long, comment='#Long ' + str.tostring(buy_id))
if close > array.get(grid_array, i) and i!=0
if array.get(order_array, i-1)
sell_id = i - 1
array.set(order_array, sell_id, false)
strategy.close(id=str.tostring(sell_id), comment='#Close ' + str.tostring(sell_id))
plot(grid > 0 ? array.get(grid_array,0) : na, color = color.yellow, transp = 10)
plot(grid > 1 ? array.get(grid_array,1) : na, color = color.yellow, transp = 10)
plot(grid > 2 ? array.get(grid_array,2) : na, color = color.yellow, transp = 10)
plot(grid > 3 ? array.get(grid_array,3) : na, color = color.yellow, transp = 10)
plot(grid > 4 ? array.get(grid_array,4) : na, color = color.yellow, transp = 10)
plot(grid > 5 ? array.get(grid_array,5) : na, color = color.yellow, transp = 10)
plot(grid > 6 ? array.get(grid_array,6) : na, color = color.yellow, transp = 10)
plot(grid > 7 ? array.get(grid_array,7) : na, color = color.yellow, transp = 10)
plot(grid > 8 ? array.get(grid_array,8) : na, color = color.yellow, transp = 10)
plot(grid > 9 ? array.get(grid_array,9) : na, color = color.yellow, transp = 10)
plot(grid > 10 ? array.get(grid_array,10) : na, color = color.yellow, transp = 10)
plot(grid > 11 ? array.get(grid_array,11) : na, color = color.yellow, transp = 10)
plot(grid > 12 ? array.get(grid_array,12) : na, color = color.yellow, transp = 10)
plot(grid > 13 ? array.get(grid_array,13) : na, color = color.yellow, transp = 10)
plot(grid > 14 ? array.get(grid_array,14) : na, color = color.yellow, transp = 10)