この戦略は,スーパートレンド指標と価格チャネル指標を組み合わせて,取引のための移動平均シグナルに基づいています.その基本的なアイデアは,現在の価格が異常状態にあるかどうかを判断するために価格チャネルを使用し,現在のトレンド方向を決定するためにスーパートレンドを使用し,移動平均シグナルと組み合わせて取引シグナルを生成することです.
スーパートレンドインジケーターを計算する.上線と下線は,現在の価格プラス/マイナスN×ATRインジケーターである. 上線よりも高い価格であれば,上昇傾向にある.下線よりも低い価格であれば,下線傾向にある.
価格チャネル指標を計算する. 価格チャネルラインは,価格のN日標準偏差のM倍である. チャネルラインよりも高い/低い価格は異常状態とみなされる.
移動平均を計算します. オープン価格,閉鎖価格,そしてスーパートレンドの平均線をそれぞれ取ります.
取引信号を生成する:
購入信号: 閉じる価格がスーパートレンドラインを横切って開く価格移動平均より高い.
セールシグナル: 閉じる価格がスーパートレンドラインを下回り,開く価格移動平均を下回る.
ストップ・ロスを設定して 利益価格チャネルを設定します
複数の指標を組み合わせることで 誤った信号が 避けられます
異常な価格状態を判断するために価格チャネルを使用すると,望ましくないエントリーポイントをフィルタリングすることができます.
移動平均値とトレンドの方向性を判断することで,トレンドに反する取引を避けます.
ストップ・ロスの設定と 利益範囲の設定は リスクを制御します
パラメータ設定は主観的で最適化が必要です
ストップ・ロスの範囲と 利益の範囲は 幅が大きすぎたり 狭すぎたりする.
価格チャネルのパラメータはすべての製品に適合しない可能性があるため,別々のテストが必要です.
劇的な傾向の変化で大きな損失が発生する可能性があります.
最適な組み合わせを見つけるために パラメータをテストして最適化します
適正なパラメータを選択するために,異なる周期で移動平均をテストする.
複数の製品でバックテストし,それぞれ性能に応じてパラメータを選択します.
ストップ・ロスの戦略を最適化して,過度に大きなシングル・ロスを避ける.
この戦略は,価格異常とトレンド方向を判断するために複数の指標を組み合わせ,理論的にはいくつかの誤った信号をフィルタリングすることができます. しかし,パラメータ設定は依然として最適化のための余地を持つ比較的主観的です. さらに,実際の取引では,佣金やスリップなどの取引コストも考慮する必要があります. 全体的に,この戦略はトレンドフォロー戦略としてより適しています. しかし,パラメータはさまざまな製品のために最適化し調整する必要があります.
/*backtest start: 2023-12-10 00:00:00 end: 2023-12-11 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Vol ST VM", overlay=true) source = close hilow = ((high - low)*100) openclose = ((close - open)*100) vol = (volume / hilow) spreadvol = (openclose * vol) VPT = spreadvol + cum(spreadvol) window_len = 28 v_len = 14 price_spread = stdev(high-low, window_len) v = spreadvol + cum(spreadvol) smooth = sma(v, v_len) v_spread = stdev(v - smooth, window_len) shadow = (v - smooth) / v_spread * price_spread out = shadow > 0 ? high + shadow : low + shadow // src = out src1=open src2=low src3=high tf =input(720) len = timeframe.isintraday and timeframe.multiplier >= 1 ? tf / timeframe.multiplier * 7 : timeframe.isintraday and timeframe.multiplier < 60 ? 60 / timeframe.multiplier * 24 * 7 : 7 c = ema(src, len) plot(c,color=color.red) o = ema(src1,len) plot(o,color=color.blue) //h = ema(src3,len) //l=ema(src2,len) // col=c > o? color.lime : color.orange vis = true vl = c ll = o m1 = plot(vl, color=col, linewidth=1, transp=60) m2 = plot(vis ? ll : na, color=col, linewidth=2, transp=80) fill(m1, m2, color=col, transp=70) // vpt=ema(out,len) // INPUTS // st_mult = input(1, title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01) st_period = input(10, title = 'SuperTrend Period', minval = 1) // CALCULATIONS // up_lev = vpt - (st_mult * atr(st_period)) dn_lev = vpt + (st_mult * atr(st_period)) up_trend = 0.0 up_trend := close[1] > up_trend[1] ? max(up_lev, up_trend[1]) : up_lev down_trend = 0.0 down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev // Calculate trend var trend = 0 trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1) // Calculate SuperTrend Line st_line = trend ==1 ? up_trend : down_trend // Plotting plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend") buy=crossover( close, st_line) and close>o sell=crossunder(close, st_line) and close<o //plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny) //plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny) plotshape(buy, title="buy", color=color.green, style=shape.arrowup, location=location.belowbar, size=size.normal, textcolor=color.white, transp=0) //plot for buy icon plotshape(sell, title="sell", color=color.red, style=shape.arrowdown, location=location.abovebar, size=size.normal, textcolor=color.white, transp=0) //plot for sell icon // multiplier = input(title="TP", type=input.float, defval=2, minval=1) src5 = close len5 = input(title="TP length", defval=150, minval=1) offset = 0 calcSlope(src5, len5) => sumX = 0.0 sumY = 0.0 sumXSqr = 0.0 sumXY = 0.0 for i = 1 to len5 val = src5[len5-i] per = i + 1.0 sumX := sumX + per sumY := sumY + val sumXSqr := sumXSqr + per * per sumXY := sumXY + val * per slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX) average = sumY / len5 intercept = average - slope * sumX / len5 + slope [slope, average, intercept] var float tmp = na [s, a, i] = calcSlope(src5, len5) vwap1=(i + s * (len5 - offset)) sdev = stdev(close, len5) dev = multiplier * sdev top=vwap1+dev bott=vwap1-dev // z1 = vwap1 + dev x1 = vwap1 - dev low1 = crossover(close, x1) high1 = crossunder(close, z1) plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0) //plot for buy icon plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0) //plot for sell icon strategy.entry(id="Enter Long MA", long=true, comment="Buy", when=high1) strategy.entry(id="Short Entry MA", long=false, comment="Sell", when=low1) /////// Alerts ///// alertcondition(buy,title="buy") alertcondition(sell,title="sell") alertcondition(low1,title="sell tp") alertcondition(high1,title="buy tp")