二重推力指標戦略

作者: リン・ハーンチャオチャン, 日時: 2023-09-25 17:34:46
タグ:

概要

この戦略の主な考え方は,トレンドフォローとトレンド逆転取引を実装するために,デュアルスルーストインジケーターと基本的な移動平均線を組み合わせることです.価格がインジケーターと同じ方向にある場合,トレンドをフォローし,価格がインジケーターの反対方向にある場合,逆転取引を行います.

戦略の論理

この戦略は主に3つのカスタム指標に基づいています.

  1. ダブルスルーストインジケーター (トレンド): 1, 0, -1 の3つの状態を返して,上昇傾向と下落傾向を決定するために,価格と過買い/過売りチャネル間の関係を計算します.

  2. 過剰購入/過剰販売チャネル (Tsl): ATR を参照して上部と下部レールを計算します.上部レールを突破すると過剰購入とみなされ,下部レールを突破すると過剰販売とみなされます.

  3. 基本移動平均線 (MA): 閉場価格の20期間の単純な移動平均を計算する.

戦略は,二重推力指標の値に基づいて価格が上昇,横向,下落状態にあるかどうかを判断する.二重推力指標が1であるとき,それは上昇状態を意味し,二重推力指標が-1であるとき,それは下落状態を意味する.この時点で,価格が指標と同じ方向にある場合,トレンドに従う戦略が採用され,正しい場所にロングまたはショートに行く.価格が指標の反対方向にある場合,例えば価格が下のレールを突破している間,指標が上昇を示している場合,利益を得るためにショートに行くことで逆転戦略が採用される.

さらに,移動平均線上の価格の突破は,取引方向を導く補助信号としても機能します.価格が平均線を上向きに突破したとき,ロングに移動し,価格が平均線を下向きに突破したとき,ショートに行きます.

特定の長期取引戦略は以下のとおりです.

  1. ツープルスルーツインジケーター > 0 価格上昇 トレンドフォローに属する上部レールを突破して,ロングに行く.

  2. 二重推力指標 < 0,価格が下がり,トレンド逆転に属する下鉄を突破し,ショートに行く.

  3. 閉じる価格 > オープニング価格 > ピボットレベル,ピボットを切ってロングに行くと,ロングに行くとされます.

  4. 閉じる価格が上線を突破し,閉じる価格 > 移動平均線,ロング.

ショート・トレード戦略は以下のとおりです.

  1. 価格が下がる. 低レールを突破して,トレンドフォローに属します.

  2. ツープルスルーツインジケーター > 0 価格上昇 トレンド逆転に属する上部レールを突破して,ロングに行く.

  3. 開始価格 > 終了価格 < ピボットレベル,ショートに行くためにピボットを突破すると考えられます.

  4. 閉じる価格が下線を突破し,閉じる価格 < 移動平均線,ショートになります.

脱出戦略は簡単です 価格が再び過買い/過売りチャネルを突破すると損失を止めます

利点分析

この戦略には以下の利点があります.

  1. 双推力指標は市場の動向を正確に決定し,戦略の核心指標です.

  2. 過剰購入/過剰販売のチャネルと指標が組み合わせることで,潜在的逆転の機会が発見できます.

  3. 基本移動平均線は,誤ったブレイクを避けるための補助フィルタリング信号として機能します.

  4. ピボット・ポイントとダブル・スルースト・インジケーターが結合して,高い確率の取引スポットを形成する.

  5. トレンドフォローと逆転のトレードの両方により より多くの利益を得ることができます

  6. 過剰購入/過剰売却チャネルストップロスは単純で明確で,リスク管理に有利です.

リスク分析

この戦略には次のリスクもあります

  1. 二重推力指示器は誤った信号を発し,他の指示器でフィルタリングする必要があります.

  2. ブレイクアウト取引は 罠にかかりやすいので ストップ・ロスは厳格に必要です

  3. 不適切な移動平均期間の設定は,トレンドを見逃したり,誤った信号を生成したりする可能性があります.

  4. 確率の信頼性を確認するために バックテストが必要です

  5. 過剰購入/過剰販売チャネルは,異なる製品に適応するためにパラメータを最適化する必要があります.

  6. 指標パラメータの不一致は,頻繁に取引につながる可能性があります.

これらのリスクに対処するために,次の措置が講じられます.

  1. K線,音量などの他の指標を組み合わせ 双方向推力指示信号を検証します

  2. 超買い/超売りチャネルストップロスの戦略を厳格に実行して 迅速なストップロスを得ます

  3. 移動平均周期のパラメータをテストして最適のパラメータを見つけます

  4. ターンポイント戦略の 確率を完全にテストする

  5. 各製品に最適な組み合わせを見つけるためにパラメータを最適化します

  6. システム全体の動作を保つために指標パラメータを調整します.

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

戦略は,次の側面でも最適化できます.

  1. マシン学習アルゴリズムを拡張して 双方向推力指標をビッグデータで訓練する.これは正確性を向上させ 誤った信号を減らすことができます.

  2. 適応チャネルを追加して,市場の変動に基づいてチャネルパラメータを自動的に調整します.これはブレイクアウト精度を向上させることができます.

  3. ディープラーニングを使って 変化可能な指標を抽出して 進出戦略を最適化します

  4. ストップ・ロスのトレンドを追跡し 逆転によって停止されないようにする 高度なストップ・ロスのアルゴリズムを追加します

  5. パラメータ最適化と組み合わせテストを実施し,戦略の全体的な安定性を向上させる.

  6. リスク管理モジュールを追加して 科学的なリスク管理をします

概要

この戦略は,トレンドフォローとトレンド逆転を有機的に組み合わせ,ダブルスルースト指標で市場構造を判断し,チャネルと移動平均線で取引信号を生成する.良い指標効果,豊富な取引機会,明確なストップロスの利点があります.同時に,安定性を向上させるためにさらなる最適化が必要な特定のリスクもあります.全体として,戦略はトレンド取引と逆転取引のアイデアを完全に統合し,さらなる研究と適用に値します.


/*backtest
start: 2023-08-25 00:00:00
end: 2023-09-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © amysojexson

//@version=3
strategy(title="Pivots strategy", overlay=true)

// Input settings
// Create a pull-down menu for the pivot type
pivotType = input(title="Pivot Type",
     options=["Daily", "Intraday", "Weekly"], defval="Daily")

// Make toggles for pivot level options
plotPP   = input(title="Plot PP", type=bool, defval=true)
plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true)
plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true)
plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true)
plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true)
// Configure session options
sessRange = input(title="Trading Session",  defval="0800-1600")
showSess  = input(title="Highlight Session?", type=bool, defval=false)

// Enable or disable pivot labels
showLabels = input(title="Show Labels?", type=bool, defval=false)

// Step 2. Calculate indicator values
// Create a function to fetch daily and weekly data
GetData(res, data) =>
    security(syminfo.tickerid, res, data[1],
         lookahead=barmerge.lookahead_on)

// Fetch daily and weekly price data
dailyHigh  = GetData("D", high)
dailyLow   = GetData("D", low)
dailyClose = GetData("D", close)

weeklyHigh  = GetData("W", high)
weeklyLow   = GetData("W", low)
weeklyClose = GetData("W", close)

// Determine session pivot data
// First see how the price bar relates to
// the session time range
inSession = not na(time(timeframe.period, sessRange)[1])
sessStart = inSession and not inSession[1]
sessEnd   = not inSession and inSession[1]

// Determine session price data
sessHigh  = 0.0
sessLow   = 0.0
sessClose = 0.0

sessHigh := sessStart ? high :
     inSession ? max(high, sessHigh[1]) : na
sessLow := sessStart ? low :
     inSession ? min(low, sessLow[1]) : na
sessClose := sessEnd ? close[1] : na

// Compute high, low, close from previous intra-day session
highPrevSess  = 0.0
lowPrevSess   = 0.0
closePrevSess = 0.0

highPrevSess  := sessEnd ? fixnan(sessHigh) : highPrevSess[1]
lowPrevSess   := sessEnd ? fixnan(sessLow) : lowPrevSess[1]
closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1]

// Now figure out which kind of price data
// to use for the pivot calculation
theHigh = if (pivotType == "Daily")
    dailyHigh
else
    if (pivotType == "Intraday")
        highPrevSess
    else
        weeklyHigh

theLow = if (pivotType == "Daily")
    dailyLow
else
    if (pivotType == "Intraday")
        lowPrevSess
    else
        weeklyLow

theClose = if (pivotType == "Daily")
    dailyClose
else
    if (pivotType == "Intraday")
        closePrevSess
    else
        weeklyClose

// Finally calculate the pivot levels
pp = (theHigh + theLow + theClose) / 3
bc= (theHigh + theLow)/2
tc= (pp-bc)+pp

r1 = pp+(.382*(theHigh-theLow))
s1 = pp-(.382*(theHigh-theLow))
r2 = pp +(.618*(theHigh-theLow))
s2 = pp -(.618*(theHigh-theLow))
r3 = pp +(1*(theHigh-theLow))
s3 = pp -(1*(theHigh-theLow))

// Step 3. Output indicator data
// Plot the various pivot levels
plot(series=plotS3R3 ? r3 : na, title="R3",
     style=circles, linewidth=1, color=#0023FF)
plot(series=plotS2R2 ? r2 : na, title="R2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS1R1 ? r1 : na, title="R1",
     style=circles, linewidth=1, color=#09E0F3)

plot(series=plotTCBC ? tc : na, title="TC",
     style=circles, linewidth=.75, color=#FF00D1)
plot(series=plotPP ? pp : na, title="PP",
     style=circles, linewidth=1, color=#000000)
plot(series=plotTCBC ? bc : na, title="BC",
     style=circles, linewidth=.75, color=#FF00D1)

plot(series=plotS1R1 ? s1 : na, title="S1",
     style=circles, linewidth=1, color=#09E0F3)
plot(series=plotS2R2 ? s2 : na, title="S2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS3R3 ? s3 : na, title="S3",
     style=circles, linewidth=1, color=#0023FF)

// Display the pivot names on the chart, if applicable
newPivots = (showLabels == false) ? false :
     (pivotType == "Intraday") ? sessEnd :
     (pivotType == "Daily") ? dayofmonth != dayofmonth[1] :
     dayofweek == monday and dayofmonth != dayofmonth[1]

plotchar(series=newPivots and plotS3R3 ? r3 : na,
     char='', text="R3", offset=1,
     location=location.absolute,
     color=#0023FF, title="R3 label")

plotchar(series=newPivots and plotS2R2 ? r2 : na,
     char='', text="R2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="R2 label")

plotchar(series=newPivots and plotS1R1 ? r1 : na,
     char='', text="R1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="R1 label")

plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="TC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="TC label")
     
plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="BC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="BC label")

plotchar(series=newPivots and plotS1R1 ? s1 : na,
     char='', text="S1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="S1 label")

plotchar(series=newPivots and plotS2R2 ? s2 : na,
     char='', text="S2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="S2 label")

plotchar(series=newPivots and plotS3R3 ? s3 : na,
     char='', text="S3", offset=1,
     location=location.absolute,
     color=#0023FF, title="S3 label")

// Highlight the intra-day price data session on the chart
bgcolor(color=showSess and inSession and (pivotType == "Intraday") ?
     orange : na, transp=95)

// Step 4. Create indicator alerts
alertcondition(condition=cross(close, s3),
     title="Pivot S3 Cross",
     message="Prices crossed Pivot S3 level")

alertcondition(condition=cross(close, s2),
     title="Pivot S2 Cross",
     message="Prices crossed Pivot S2 level")

alertcondition(condition=cross(close, s1),
     title="Pivot S1 Cross",
     message="Prices crossed Pivot S1 level")
     
alertcondition(condition=cross(close, tc),
     title="Pivot TC Cross",
     message="Prices crossed Pivot TC level")

alertcondition(condition=cross(close, pp),
     title="Pivot PP Cross",
     message="Prices crossed the main Pivot Point level")
     
alertcondition(condition=cross(close, bc),
     title="Pivot BC Cross",
     message="Prices crossed Pivot BC level")

alertcondition(condition=cross(close, r1),
     title="Pivot R1 Cross",
     message="Prices crossed Pivot R1 level")

alertcondition(condition=cross(close, r2),
     title="Pivot R2 Cross",
     message="Prices crossed Pivot R2 level")

alertcondition(condition=cross(close, r3),
     title="Pivot R3 Cross",
     message="Prices crossed Pivot R3 level")
    
MA = sma(close, 20)
plot(MA, color=red)

Factor				= input(2, type=float)
Pd					= input(10, minval=1,maxval = 100)
Up					= hl2-(Factor*atr(Pd))
Dn					= hl2+(Factor*atr(Pd))
TrendUp				= 0.0
TrendUp				:= close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown			= 0.0
TrendDown			:= close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend				= 0.0
Trend 				:= close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl 				= Trend==1? TrendUp: TrendDown

plot(Tsl, color=blue)

if close>open
    if open<pp
        if close>pp
            if close>MA
                strategy.entry("long", true) 
if close<open
    if open>pp
        if close<pp
            if close<MA
                strategy.entry("short", false) 
                
strategy.close("long", when = open<Tsl)
strategy.close("short", when = open>Tsl)

もっと