作者: リン・ハーンチャオチャン,日付: 2024-01-25 12:34:59
タグ:

img

概要

この戦略は,ボリンジャーバンド,KCチャネル,キャンドルスティックカラーなどの複数の指標を使用して,市場の圧縮とリリースを決定し,トレンド逆転が発生した場合の取引を行うために移動平均値に基づく確立トレンド判断を組み合わせます.

戦略原則

  1. ボリンガーバンドを計算する.ボリンガーバンドの中間線は,N日閉店価格の単純な移動平均線,上側の線は,中間線 + M × KCチャネルのN日真の範囲変動,下側の線は,中間線 - M × KCチャネルのN日真の範囲変動である.

  2. 圧縮と放出を判断する.ボリンガー帯上列車はKCチャネル上列車の下にあり,ボリンガー帯下列車はKCチャネル下列車の上にあり,それは圧縮である.ボリンガー帯上列車はKCチャネル上列車の上にあり,ボリンガー帯下列車はKCチャネル下列列車は放出される.

  3. 設立傾向を計算する. N 日間の最高価格と最低価格の N 日間の閉店価格平均を入力として取り, N 日間の線形回帰を計算し,その値が 0 以上の値は設立傾向の上昇を示し,0 未満は設立傾向の低下を示します.

  4. 取引シグナル.エスタブリッシュが上昇しているとき,短いヤン線とリリースが長い信号であり,エスタブリッシュが落ちているとき,短いイン線と圧縮が短い信号です.

戦略 の 利点

  1. 多指標判断は信号の精度を向上させ,ボリンジャー帯,KCチャネル,キャンドルスティックを組み合わせて市場の動向を判断することで,誤った信号を回避できます.

  2. 傾向判断,傾向に従って取引する.主要な傾向を決定し,傾向に反する取引を避けるために,傾向に従って取引する.

  3. リスクを制御する自動ストップ損失.価格がストップ損失ラインに触ると,自動的にストップ損失を閉じます.

戦略リスク

  1. Bollinger Bands と KC チャネルのパラメータの設定が正しくない場合,圧縮と放出の誤った判断につながる可能性があります.

  2. 傾向の転換点を見逃す可能性があります.

  3. 突然の出来事は 莫大な変化を引き起こし 止められない 大量の損失を招きます

最適化方法:ボリンジャーバンドとKCチャネルパラメータを調整し,ADXやその他の指標を使用して判断を助けます.遅延を減らすために時間内に設定移動平均サイクルを更新します.ストップ損失ラインを設定するときにバッファゾーンを追加します.

戦略の最適化方向

  1. より多くの技術指標を組み合わせて ポジション開設シグナルの精度を向上させる.KDJ,MACDなど.

  2. 新しい動向をより良く捉えるように,設定移動平均のサイクルパラメータを最適化する.

  3. 偽のブレイクを避けるために取引量指標を追加します. エネルギー潮流指標,蓄積/分配など.

  4. 複数のタイムフレーム判断は 中期・長期・短期の信号を区別します 罠にはまらないようにしましょう

  5. AIの最適化パラメータ,徹底的な検索,最適パラメータの組み合わせが検索されています. 過適性を減らす.

概要

この戦略の主なアイデアは:ボリンジャー帯を使用して市場の圧縮と解放を決定する; 補助的な使用の確立傾向を主要トレンド方向を決定する; 圧縮と解放のターニングポイントで設立の反対方向で動作する. 戦略の利点は正確な信号,ストップ損失,偽信号を避ける. 戦略を最適化する方向性には: 多指標組み合わせ,トレンド判断パラメータ最適化,モメント指標を追加,多タイムフレーム判断,AI検索最適化などが含まれます. 全体的に,この戦略は,市場の自己類似性と周期的な動作規則に基づいており,市場指標を通じて市場のリズム変化を描写し,市場がエネルギー貯蔵からエネルギーリリースに変化する重要なポイントで取引します. これは典型的な戦略サイクルに属します.


/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2017

//@version=2
strategy(shorttitle = "Squeeze str 1.1", title="Noro's Squeeze Momentum Strategy v1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
lev = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = true
mode2 = input(true, defval = true, title = "Mode 2")
usecolor = input(true, defval = true, title = "Use color of candle")
usebody = input(true, defval = true, title = "Use EMA Body")
needbg = input(false, defval = false, title = "Show trend background")
fromyear = input(2018, defval = 2018, 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")

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray 

trend = val > 0 ? 1 : val < 0 ? -1 : 0

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Body
body = abs(close - open)
abody = sma(body, 10) / 3

//Indicator
bcol = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scol = noSqz ? blue : sqzOn ? black : gray 
plot(val, color=bcol, style=histogram, linewidth=4)
plot(0, color=scol, style=cross, linewidth=2)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up1 = trend == 1 and (bar == -1 or usecolor == false) and (body > abody or usebody == false) and mode2 == false
dn1 = trend == -1 and (bar == 1 or usecolor == false) and (body > abody or usebody == false) and mode2 == false

up2 = trend == 1 and val < val[1] and mode2 
dn2 = trend == -1 and val > val[1] and mode2

exit = (strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price) and mode2

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * lev : lot[1]

if up1 or up2
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dn1 or dn2
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)
    
if exit
    strategy.close_all()

もっと