
この戦略は,超トレンドサポートレジスタンスラインとADX指標を統合して高頻度取引を実現します.超トレンドサポートレジスタンスラインは,最新のサポートレジスタンスポイントを動的に計算して,価格トレンドと取引信号を発信します.ADX指標は,トレンドの強さを判断するために使用され,ADX値をフィルター条件として設定し,トレンドが十分に強い場合にのみ取引信号を発信します.
サポート・レジスタンスラインを計算する. 閉盤価格を基準に,上下それぞれにATR幅を加える. 価格がこれらのラインを突破すると,トレンドの逆転であると判断する.
ADX指標はトレンドの強さを判断する.ADXが設定値より高いときは,トレンドが十分に強いと考えられる.
この2つの組み合わせは取引信号を発する.ただし,サポートレジスタンスラインを突破しADXが十分に大きい場合にのみ,余分な空白を行う.
この戦略の利点は以下の通りです.
超トレンドラインのダイナミック計算により,突破を素早く判断できる.
ADX指標は,非トレンドのシナリオを効果的にフィルターし,無効取引を減らす.
撤収と損失の比率は良好です.
この戦略には以下のリスクもあります.
超トレンドラインが機能しなくなる可能性が高い.
ADX値の設定が不適切であることも,戦略のパフォーマンスに影響を与える.
高周波取引は取引費用が高くなります.
対応方法:
超パラメータを最適化し,突破幅を適切に緩める.
ADXパラメータをテストするより優れている.
取引の頻度を適正に減らす
この戦略は以下の点で最適化できます.
ATR倍数パラメータを最適化して,支柱の抵抗線をより堅牢にします.
ADXのパラメータをテストして,最適値を見つけます.
単発的な損失を抑えるためのストップ・メカニズムに参加する.
この戦略は,超トレンドラインとADX指標の優位性を統合し,動的計算によって抵抗を支え,トレンドの逆転のタイミングを判断し,ADX指標のフィルタリングによる低品質の信号と連携する.パラメータの最適化とメカニズム調整を経て,安定した利潤の高周波戦略になる.
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("STPP20 + ADX", overlay = true)
///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////
src = input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50)
AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1)
AtrPd=input(defval = 20, title = "ATR Period", minval=1)
float ph = na
float pl = na
ph := pivothigh(PPprd, PPprd)
pl := pivotlow(PPprd, PPprd)
float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
if na(center)
center := lastpp
else
center := (center * 2 + lastpp) / 3
Up = center - (AtrFactor * atr(AtrPd))
Dn = center + (AtrFactor * atr(AtrPd))
float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend")
bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl
///////
// ADX
//////
lenADX = 14
th = 25
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, lenADX)
//////
// MA
/////
lenMA = 21
srcMA = input(close, title="Source")
offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
outMA = sma(srcMA, lenMA)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy)
// .order // Tuned version
strategy.entry("Buy", strategy.long)
if (sell) and (strategy.position_size > 0)
strategy.order("Sell", false, when = sell)