ロボット ホワイトボックス アイスバーグ戦略

作者: リン・ハーンチャオチャン開催日:2023年9月26日 21:02:21
タグ:

概要

この戦略は移動平均取引に基づいている.トレンドフォロー戦略に属する双方向開口ポジションを実装するために,3つのレベルの長と短エントリーラインを設定する.価格が移動平均を突破すると,戦略は待機中の注文を入れることで長と短ポジションをバッチで開く.

戦略の論理

この戦略は,主に移動平均の突破を使用してトレンド方向を決定する.具体的には,開業価格,閉店価格,最高価格,最低価格の算術平均を計算し,移動平均の指標を取得する.その後,移動平均の上の長いエントリーラインと,その下の短いエントリーラインを設定する.価格が移動平均を下から突破すると,ロングオーダーはひとつずつ起動する.価格が上から突破すると,ショートオーダーはひとつずつ起動する.

ロングとショートオーダーの数は徐々に増加する.待機中のオーダーを設定することで,バッチオープニングポジションを実装する.例えば,エントリーライン1は1つの契約をロング/ショートに開く,エントリーライン2は1つの契約を追加する,エントリーライン3は1つの契約を追加する.これはエントリーコストを多様化し,単一のオーダーのリスクを減らすのに役立ちます.

この戦略にはヘッジメカニズムもあります. ポジションサイズが0でない場合,移動平均価格に基づいてトライリングストップ損失オーダーを設定します. もし価格が再び移動平均を突破した場合,部分的な利益をロックし,資本を保護するためにポジションを閉じる.

概要すると,この戦略は,トレンド方向を決定するために移動平均指標を完全に利用し,複数のエントリーラインを通じて利益範囲を最大化し,ストップ損失オーダーでリスクを制御します.これは典型的なトレンドフォロー戦略です.

利点分析

この戦略の利点は次のとおりです.

  1. 移動平均を用いることでトレンド方向を決定することは明確で実行可能である.移動平均は市場のノイズを効果的にフィルタリングし,主要なトレンド方向を決定することができる.

  2. 複数のエントリーラインはトレンドランの利用を最大化します.複数のエントリーラインで,トレンドの全走行範囲をできるだけ捉え,利益空間を拡大することができます.

  3. 批量でのポジション開設は,単一のオーダーリスクを軽減し,複数のオーダーで市場に参入すると,オーダーのリスクが多様化し,平均保有コストが低下します.

  4. ヘージングストップ損失メカニズムはリスクを効果的に制御する.ヘージングストップ損失オーダーは,価格が再び移動平均を突破したときの迅速なストップ損失を実現し,巨大な損失を回避する.

  5. 戦略の論理は明確で分かりやすく,異なる市場のために最適化できる柔軟なパラメータ設定があります.

リスク分析

この戦略にはいくつかのリスクがあります:

  1. 移動平均から誤ったシグナルが出る確率.移動平均は遅延があり,誤ったシグナルを与える可能性があります.

  2. トレンド逆転リスクは損失につながる. 戦略はトレンドを想定しているため,トレンド逆転は大きな損失をもたらす可能性があります.

  3. 頻繁すぎるエントリーラインは 取引頻度とスライプコストを増加させる

  4. バッチを開くポジションは,ポジションサイズが大きすぎると集中リスクが増加します.

  5. 誤ったストップ損失点設定は,早期ストップ損失またはストップ損失点が小さすぎる可能性があります.

対応するリスク管理措置:

  1. 移動平均のパラメータを最適化し 適切な期間を選択します

  2. 重要な技術指標に注意して 傾向の逆転の信号を検出し タイミングでストップ・ロスをします

  3. 取引頻度を下げるためにエントリーライン間の距離を調整します.

  4. 位置のサイズと比率を最適化して 集中リスクを制御する.

  5. ストップ・ロスのリスクを減らすためにストップ・ロスのポイントをバックテストし最適化します

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

戦略は以下の側面から最適化できます.

  1. 動向平均の指標をテストし,動向の傾向を決定するために最も効率的な動向平均を測定する.

  2. 最適なパラメータを見つけるために,長距離と短いエントリーラインの間隔距離と位置サイズ比率を最適化します.

  3. 移動平均から誤った信号を避けるために,MACD,RSIなどフィルター条件として他の指標を追加します.

  4. ストップ損失ラインの位置を最適化するか,ATRに基づいて停止損失点を動的に設定します.

  5. すべてのポジションを閉じる条件を設定する傾向逆転の判断を追加します.

  6. 異なる市場期間のパラメータを最適化します

  7. ポジションのサイズを動的に調整する アカウント利用率をベースに追加します

概要

この戦略は,主に移動平均値に基づいてトレンド方向を判断し,トレンドランスを利益源として利用する.複数のエントリーラインを使用し,バッチでポジションを開くことで,トレンドを効果的に捉え,利益ゾーンを拡大することができる.同時に,ストップ損失メカニズムを使用してリスクを制御する.戦略論理はシンプルで明確で,初心者が学ぶのに適し,また深い最適化にも適しています.これは典型的なトレンドフォロー戦略です.


/*backtest
start: 2022-09-19 00:00:00
end: 2023-09-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox Iceberg", shorttitle = "Robot WhiteBox Iceberg", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
lots = 0.0
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = true

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = 0.0
longline2 = 0.0
longline3 = 0.0
shortline1 = 0.0
shortline2 = 0.0
shortline3 = 0.0
longline1 := long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 := lots[1] == 0 ? long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close : longline2[1]
longline3 := lots[1] == 0 ? long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close : longline3[1]
shortline1 := short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 := lots[1] == 0 ? short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close : shortline2[1]
shortline3 := lots[1] == 0 ? short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close : shortline3[1]

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma, when = needtime)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma, when = needtime)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("L1")
    strategy.cancel("L2")
    strategy.cancel("L3")
    strategy.cancel("S1")
    strategy.cancel("S2")
    strategy.cancel("S3")
    strategy.cancel("TPL")
    strategy.cancel("TPS")

もっと