マルチタイムフレーム適応型トレーリングストップ戦略


作成日: 2023-11-21 11:07:44 最終変更日: 2023-11-21 11:07:44
コピー: 0 クリック数: 640
1
フォロー
1621
フォロワー

マルチタイムフレーム適応型トレーリングストップ戦略

概要

この戦略は,複数の技術指標の統合信号を計算して,現在の時間枠の下のトレンド方向を判断する.上昇傾向であると判断された場合,高い点でストップラインを設定し,下降傾向であると判断された場合,低い点でストップラインを設定する.戦略は,異なる品種と異なる時間枠に自律的に適応し,ストップラインを動的に調整することで,リスク制御を実現する.

原則

この戦略は,平均線,ATR,KD,変動率などの複数の指標を組み合わせて,現在のタイムフレーム内の全体的なトレンドの方向を判断する.具体的には,以下のいくつかのサブシグナルの総合値を計算する.

  1. 均線方向の信号
  2. KD指数は,超買い超売りシグナルを示している.
  3. 価格が信号から外れている
  4. 突破信号
  5. 多時間枠総合試行錯誤信号
  6. %R信号
  7. 均線回帰信号
  8. ATR通路の突破信号

上記の各サブシグナルは,平滑処理を受け,異なる値判断で買い/売る.各サブシグナルに重み付けられ,現在の時間枠の下の総信号を計算する.信号が0より大きい場合は,上昇傾向として判断し,信号が0より小さい場合は,下降傾向として判断する.

上向きのトレンドであると判断された場合,戦略は,以前の高点の近くで追跡ストップラインを設定します. 下向きのトレンドであると判断された場合,戦略は,以前の低点の近くで追跡ストップラインを設定します. これにより,実際の価格動向に基づいてストップロスを動的に調整し,リスク管理の目的を達成することができます.

利点

この戦略は,複数の指標を統合して,現在のトレンドの方向を判断し,判断の正確性を高めます.同時に,戦略は,異なる品種と時間枠に自律的に適応し,強い適応性を持っています.

最も重要なことは,この戦略は,ストップラインを動的に調整し,実際の動きに応じてリスク管理レベルを調整することができ,システムリスクをカバーすることが最大の利点であることです.

リスク

この戦略は,トレンド信号の質を判断し,ストップラインの設定に直接影響し,判断が誤りであれば,ストップラインがあまりにも緩やかまたはあまりにも厳格に設定される可能性がある.さらに,ストップラインは,トレンドの突発を完全に回避できないリスクがある.

この戦略はまた,利得レベルと止損距離のバランスを必要とする.止損距離があまりにも近い場合,止損があまりにも頻繁になる可能性がある.止損距離があまりにも長い場合,リスクを効果的に制御することはできません.これは,異なる品種の異なる周期に応じてパラメータの最適化を必要とする.

最適化の方向

機械学習アルゴリズムを導入し,過去データを使ってトレンドの方向を判断するモデルを訓練することで判断の正確性を向上させることが考えられます.

異なるパラメータの組み合わせをテストし,ストップラインの距離を最適化できます.例えば,ATR周期パラメータを動的に調整し,市場の変動率の変化に対応します.

また,取引量エネルギー指数と組み合わせて,実際のトレンドを判断し,量価の偏差によるシグナルエラーを防ぐこともできます.

要約する

この戦略は,複数の技術指標を統合して,現在のトレンドの方向性を判断し,それに従って動的に調整してストップラインを追跡し,ストップの実効性を高め,取引リスクを制御することを目的としています.この戦略の理念は先進的で,さらなる最適化と検証に値し,参照可能な多時間枠である.自主リスク管理戦略.

ストラテジーソースコード
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © jigneshjc

//@version=5
strategy("Jigga - Survival Level", shorttitle='Jigga - Survival Level', overlay=true)

doBackTesting = input(true, 'Run Back Testing')

entryCondition = false
exitCondition = false


ab21 =  14,  gh41 = ab21
gh42 = ab21, ju51 = 14
ki61 = ju51
lkolkp = true ,ab22 = 58
cd31 = 5 , ab23 = 42
aa12 = 29, cd32 = 26
op71 = 5,  aa11 = 12
aa13 = 9, op72 = 2.0
movnwx = false


kahachale(byju, h, l) =>
    mika = ta.change(h)
    awer = -ta.change(l)
    uikmhDM = na(mika) ? na : mika > awer and mika > 0 ? mika : 0
    wrtdfcDM = na(awer) ? na : awer > mika and awer > 0 ? awer : 0
    bbct = ta.rma(ta.tr, byju)
    uikmh = fixnan(100 * ta.rma(uikmhDM, byju) / bbct)
    wrtdfc = fixnan(100 * ta.rma(wrtdfcDM, byju) / bbct)
    [uikmh, wrtdfc]

trial(gh42, gh41, h, l) =>
    [uikmh, wrtdfc] = kahachale(gh42, h, l)
    uuolop = uikmh + wrtdfc
    trial = 100 * ta.rma(math.abs(uikmh - wrtdfc) / (uuolop == 0 ? 1 : uuolop), gh41)
    trial

_pr(src, byjugth) =>
    max = ta.highest(byjugth)
    min = ta.lowest(byjugth)
    100 * (src - max) / (max - min)


kyukarna(khulmkhula, mikaarwala, nichewala, bandhwala, partiwala) =>

    sig = trial(gh42, gh41, mikaarwala, nichewala)
    trialIncreasing = sig > ta.ema(sig, 5) ? lkolkp : movnwx

    rolkmn = ta.ema(bandhwala, aa11)
    psolkmn = ta.ema(bandhwala, aa12)
    ujghd = rolkmn - psolkmn
    wrtycv = ta.ema(ujghd, aa13)
    kimnjg = ujghd - wrtycv


    mikalilo = ta.rma(math.max(ta.change(bandhwala), 0), ab21)
    awerlilo = ta.rma(-math.min(ta.change(bandhwala), 0), ab21)
    lilo = awerlilo == 0 ? 100 : mikalilo == 0 ? 0 : 100 - 100 / (1 + mikalilo / awerlilo)
    juylknlilo = ta.ema(lilo, 3)


    rjuylkn = ta.ema(bandhwala, cd31)
    psjuylkn = ta.ema(bandhwala, cd32)

    percentR = _pr(bandhwala, ju51)
    juylknpercentR = ta.ema(percentR, 3)


    ad = bandhwala == mikaarwala and bandhwala == nichewala or mikaarwala == nichewala ? 0 : (2 * bandhwala - nichewala - mikaarwala) / (mikaarwala - nichewala) * partiwala
    kiloValue = math.sum(ad, ki61) / math.sum(partiwala, ki61)



    liiopn = ta.atr(op71)
    mikaliiopn = (mikaarwala + nichewala) / 2 - op72 * liiopn
    mika1liiopn = nz(mikaliiopn[1], mikaliiopn)
    mikaliiopn := bandhwala[1] > mika1liiopn ? math.max(mikaliiopn, mika1liiopn) : mikaliiopn
    dnliiopn = (mikaarwala + nichewala) / 2 + op72 * liiopn
    dn1liiopn = nz(dnliiopn[1], dnliiopn)
    dnliiopn := bandhwala[1] < dn1liiopn ? math.min(dnliiopn, dn1liiopn) : dnliiopn
    omnerliiopn = 1
    omnerliiopn := nz(omnerliiopn[1], omnerliiopn)
    omnerliiopn := omnerliiopn == -1 and bandhwala > dn1liiopn ? 1 : omnerliiopn == 1 and bandhwala < mika1liiopn ? -1 : omnerliiopn

    fitur = ujghd > 0 ? ujghd > wrtycv ? 1 : 0 : ujghd > wrtycv ? 0 : -1
    mitur = kimnjg >= 0 ? kimnjg > kimnjg[1] ? 1 : 0 : kimnjg > kimnjg[1] ? 0 : -1
    ritur = juylknlilo > ab22 ? 1 : juylknlilo < ab23 ? -1 : 0
    circuits = rjuylkn > psjuylkn ? 1 : -1
    trialPoints = trialIncreasing ? close > ta.ema(close, 3) ? 1 : -1 : 0
    virar = juylknpercentR > -ab23 ? 1 : juylknpercentR < -ab22 ? -1 : 0
    chikar = kiloValue > 0.1 ? 1 : kiloValue < -0.1 ? -1 : 0
    sitar = omnerliiopn


    p = fitur + mitur + ritur + circuits + trialPoints + virar + chikar + sitar

    p

currentP = kyukarna(open, high, low, close, volume)
currentPNew = currentP >= 0 and currentP[1] <= 0 ? 0 : currentP <= 0 and currentP[1] >= 0 ? 0 : currentP
colorPNew = currentPNew == 0 ? color.black : currentPNew >= 0 ? color.green : color.red
//plot(currentPNew, color=colorPNew, title='CurrentTimeFrame')

LTN = 0.0
LTN := nz(LTN) ? 0.0 : (currentPNew[1] < 0 and currentPNew >= 0) ? high * 1.005 : (currentPNew[1] > 0 and currentPNew <= 0) ? low * 0.995 : LTN[1]

LClr = color.green
LClr :=  (currentPNew[1] < 0 and currentPNew >= 0) ? color.green : (currentPNew[1] > 0 and currentPNew <= 0) ? color.red : LClr[1]

plot(LTN,color=LClr,title="Level", style=plot.style_circles)


entryCondition:= high > LTN and LClr == color.green ? lkolkp : movnwx
exitCondition:= low < LTN and LClr == color.red ? lkolkp : movnwx

tradeRunning = movnwx
tradeRunning := nz(tradeRunning) ? movnwx :  (not tradeRunning[1]) and entryCondition ? lkolkp : tradeRunning[1] and exitCondition ? movnwx : tradeRunning[1]


plotshape(tradeRunning and (not tradeRunning[1]) and (not doBackTesting), style=shape.labelup, location=location.belowbar, color=color.new(#00FF00, 50), size=size.tiny, title='Buy wrtycv', text='➹', textcolor=color.new(color.black,0))
plotshape((not tradeRunning) and tradeRunning[1] and (not doBackTesting), style=shape.labeldown, location=location.abovebar, color=color.new(#FF0000, 50), size=size.tiny, title='Sell wrtycv', text='➷', textcolor=color.new(color.white, 0))


if  entryCondition  and doBackTesting
    strategy.entry(id="Buy",direction=strategy.long)

if exitCondition and doBackTesting
    strategy.close(id="Buy")