ロングとショートの指標戦略


作成日: 2023-09-25 17:34:46 最終変更日: 2023-09-25 17:34:46
コピー: 5 クリック数: 909
1
フォロー
1617
フォロワー

概要

この戦略の核心思想は,多空指標と基本移動平均を組み合わせて,トレンド追跡とトレンド反転取引を実現することです.価格と指標が同方向であれば,トレンド追跡を行います.価格と指標が異方向であれば,反転取引を行います.

戦略原則

この戦略は主に以下の3つのカスタマイズされた指標に基づいています.

  1. 多空指標 ((Trend):価格と超買超売チャネルの関係を計算し,多頭と空頭トレンドを判断し,1、0、-1 三つの状態を返します。

  2. 超買超売チャネル ((Tsl):ATRを参考に上線と下線を計算し,上線を突破すると超買,下線を突破すると超売とみなす.

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

具体的には,多空指標値に基づいて価格が多頭,振動または空頭状態にあることを判断する戦略である.多空指標が1であるときは,多頭状態にあることを代表する;多空指標が-1であるときは,空頭状態を代表する.このとき,価格が指標の方向と一致している場合は,トレンド追跡戦略を採用し,点合致の場合で多空を行う.指標の方向と価格が反対である場合,指標が多頭を示し,価格が下落して下線を突破する場合は,逆転戦略を採用し,空空を切り取る.

さらに,価格が移動平均を突破することは,取引の方向を導く補助的な信号としても使用されます.価格が平均を上から突破すると上昇し,平均を下から突破すると空になります.

具体的には,以下のような多頭取引戦略があります.

  1. 多空指標 > 0,価格上昇が軌道に突破し,トレンド追跡状況に属し,多を行う.

  2. 多空指数 < 0,価格下落はトレンドの逆転に属し,空白する.

  3. 閉盤価格 > 開盤価格 > 中盤点位は,中盤を突破するチャンスとして多めにやって,多めにやって。

  4. 閉盤価格が上位に突破し,閉盤価格 > 移動平均で,さらに進みます.

空頭取引の戦略は以下の通りです.

  1. 多空指数 < 0,価格下落 突破 下軌道,トレンド追跡状況,空白.

  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)