多時間フレーム適応追跡ストップ損失戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月21日 11:07:44
タグ:

img

概要

この戦略は,現在のタイムフレーム内のトレンド方向を決定するために,複数の技術指標の包括的な信号を計算する.上向きトレンドとして判断された場合,追跡ストップ損失線は比較的高い点に設定され,下向きトレンドとして判断された場合,追跡ストップ損失線は比較的低い点に設定される.戦略はリスク管理を達成するためにストップ損失ラインを適応的に調整することができます.

原則

この戦略は,移動平均値,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")



もっと