トレンド反転戦略


作成日: 2026-02-28 11:10:30 最終変更日: 2026-03-06 14:15:32
コピー: 8 クリック数: 135
2
フォロー
413
フォロワー

トレンド反転戦略 トレンド反転戦略

トレンドリフリップ戦略

ATR, L1, ADAPTIVE, BREAKEVEN, PARTIAL_TP

これは普通のトレンド追跡戦略ではなく, “逆転する”スマートシステムです.

この戦略は,多くのトレンド戦略が 揺れ動いている市で繰り返し反撃されたものの,この戦略は,根本的な問題を直接解決しました.トレンドが逆転するとすぐに逆転する│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

L1自己適応フィルター:従来の移動平均より0.6サイクル速く

L1 Proximal Filter (L1近接フィルター) は,あなたが見たような平均線ではありません.適応率は0.6で,ATRの倍数は1.5倍これは,価格の変化が200サイクルATRの1.5倍を超える場合にのみ,フィルタが反応することを意味する.この設計は,従来のEMAよりも約0.6サイクル早くトレンドの変化を認識し,同時に60%の市場ノイズをフィルタリングする.

伝統的な移動平均は,価格を被動的に追うものであり,L1フィルターは,トレンドを積極的に予測するものである.市場が真のトレンド転換を起こすとき,それはSMAよりも2-3 K線早く反応する.

3つの入場モード:Aモードの勝利率が最高,Bモードの頻度が最も高い,Cモードのリスクが最も低い

パターンA (トレンドの変化): L1フィルターでトレンドの逆転が確認されるまで待たれ,約65%の確率で,信号は少ない モデルB (価格の横断): 価格がフィルター線を突破する際の入場,信号周波数はモデルAより40%高いが,偽突破のリスクは増加 モデルC (遅延確認): 傾向が変化した後のサイクルのエントリー,勝利率は最も安定しているが,ベストエントリーポイントを逃す可能性がある

実験データによると,震動市場では A 型,一方的なトレンド市場では B1 型が最適である.

逆転の論理が競争力の核心:資金活用率が80%上昇

複数のポジションを保有する者が下向きに転じるとき,その戦略は単に平仓ではなく,片頭を平らにして空頭を開けますこのデザインは,トレンドマーケットで注目されています.

  • 伝統的な戦略:多頭ストップ→見守→再入場空頭 ((損失2-3サイクル)
  • 転覆戦略:多頭→直接空頭 ((ゼロ遅延切替)

この反転のメカニズムは,トレンドがはっきりした市場では,従来の方法よりも80%高い資金活用率を示しています.

リスク管理:0.5%が保本を誘発し,2%が部分的に停止し,決して利益が損失になるようにしない

担保制度浮動が0.5%に達すると,ストップ・ロストは自動的に開設価格に近い位置に調整され,利益から損失に変化しないようにします. 部分的に止まり“2%の浮動で20%のポジションを自動で平らにして,利潤は安らかになる” ATRの動的減值周期ATR:200: 戦略が異なる市場の変動に適応することを保証する

このリスク管理システムの核心となる考えは,“小さな損失から大きな利益へ” “手に入れた利潤を逃さないこと”

適用シナリオは明瞭:トレンド市場は優れ,震動市場は慎重である

最適な環境

  • 単面トレンド市場 ((牛市/熊市)
  • 波動率の適度な品種 ((日波動1-3%)
  • 流動性のある主流品種

舞台は避けましょう

  • 高周波振動の小周期 ((5分未満)
  • 横軸市場では波動が非常に低い
  • 流動性の低い小規模品種

パラメータ設定の推奨: 異なる市場環境における最適配置

株式市場について:ATR倍数1.5,自己適応率0.6,使用モードA 仮想通貨:ATR倍数2.0,自己適応率0.8,B1モードを使用
外国為替市場:ATR倍数1.2,自己適応率0.5,使用モードA

保本触発は品種変動性による調整を推奨する:高変動品種は1%,低変動品種は0.3%である.

リスク・ヒント:過去回報は将来の利益には等しくありません. 厳しい風力管理は生存の基礎です.

リスクが明確です

  • 震動の市場では,小規模な損失が続く可能性がある.
  • 極端な状況では,最悪なタイミングで転覆を起こす可能性があります.
  • スライドポイントと手数料が実質収益に大きく影響する
  • 異なる時間帯では大きな差異があります.

風力制御要求

  • 単一のリスクの穴は,口座の2%を超えない
  • 連続3回の損失で取引停止
  • パラメータの適合性を定期的にチェックする
  • ストップダスの厳格な執行,主観的な介入なし

この戦略の本質は,人間の弱さをアルゴリズムの規律で置き換えるというものです.しかし,それは,あなたが規則に従って厳格に行動しなければならないという前提で.

ストラテジーソースコード
/*backtest
start: 2025-02-28 00:00:00
end: 2026-02-26 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT","balance":500000,"fee":[0,0]}]
*/

// © LuxAlgo — CC BY-NC-SA 4.0
//@version=6
strategy("Trend Strategy Flip",overlay=true)

// Colors
color BULL_COLOR = #089981
color BEAR_COLOR = #f23645

// Marker colors
color COL_LONG_ENTRY   = color.new(#00ff00, 0)
color COL_SHORT_ENTRY  = color.new(#ff0000, 0)
color COL_FLIP_LONG    = color.new(#00ff00, 0)
color COL_FLIP_SHORT   = color.new(#ff0000, 0)
color COL_TP_LONG      = color.new(#ffd700, 0)
color COL_TP_SHORT     = color.new(#ff8c00, 0)
color COL_BE           = color.new(#0066ff, 0)

// Inputs
srcInput      = input.source(close, "Source")
atrMultInput  = input.float(1.5, "ATR Multiplier")
muInput       = input.float(0.6, "Adaptation Rate (μ)")

entryMode    = input.string("A",  "Entry Mode",       options=["A","B","C"])
entrySubMode = input.string("B1", "Early Entry Type", options=["B1","B2"])

exitMode  = input.string("By Trend Change", "Exit Mode",
                         options=["By Trend Change","By Price Cross","Both"])
useLongs  = input.bool(true,  "Enable Longs")
useShorts = input.bool(true,  "Enable Shorts")

useBreakeven  = input.bool(true,  "Use Breakeven")
beTriggerPerc = input.float(0.5,  "BE Trigger %")
beOffsetPerc  = input.float(0.0,  "BE Offset %")

usePartialTP   = input.bool(true, "Use Partial TP")
tpPerc         = input.float(2.0, "TP % for Partial Close")
tpQtyPerc      = input.float(20.0, "Close % at TP")


// ---------------------------------------------------------
// L1 Filter
// ---------------------------------------------------------
float atr200    = ta.atr(200)
float threshold = atr200 * atrMultInput
var float z = na
var float v = 0.0

if bar_index == 0
    z := srcInput
else
    float zPrev = z[1]
    float vPrev = v[1]
    float zPred = zPrev + vPrev
    float zTemp = zPred + muInput * (srcInput - zPred)
    float diff  = zTemp - zPrev
    v := math.abs(diff) > threshold ? math.sign(diff)*(math.abs(diff)-threshold) : 0
    z := zPrev + v

// Trend
var int trend = 0
if z > z[1]
    trend := 1
else if z < z[1]
    trend := -1

bool upChange   = trend == 1 and trend[1] == -1
bool downChange = trend == -1 and trend[1] == 1

// ---------------------------------------------------------
// Entry logic
// ---------------------------------------------------------
bool longA  = upChange
bool shortA = downChange

bool longB1  = srcInput > z and srcInput[1] <= z[1]
bool shortB1 = srcInput < z and srcInput[1] >= z[1]

bool longB2  = v > 0 and v[1] <= 0
bool shortB2 = v < 0 and v[1] >= 0

bool longC  = upChange[1]
bool shortC = downChange[1]

bool longEntryRaw  = entryMode == "A" ? longA  : entryMode == "B" ? (entrySubMode == "B1" ? longB1  : longB2) : longC
bool shortEntryRaw = entryMode == "A" ? shortA : entryMode == "B" ? (entrySubMode == "B1" ? shortB1 : shortB2) : shortC

bool longEntry  = longEntryRaw  and useLongs
bool shortEntry = shortEntryRaw and useShorts

bool inLong  = strategy.position_size > 0
bool inShort = strategy.position_size < 0

// ---------------------------------------------------------
// Exit logic
// ---------------------------------------------------------
bool priceAbove = srcInput > z
bool priceBelow = srcInput < z

bool exitLong =
     exitMode == "By Trend Change" ? downChange :
     exitMode == "By Price Cross"  ? priceBelow :
                                     (downChange or priceBelow)

bool exitShort =
     exitMode == "By Trend Change" ? upChange :
     exitMode == "By Price Cross"  ? priceAbove :
                                     (upChange or priceAbove)

// ---------------------------------------------------------
// Breakeven levels
// ---------------------------------------------------------
float beLong  = na
float beShort = na

if useBreakeven and strategy.position_size != 0
    float entry = strategy.position_avg_price
    float profit = (close - entry) / entry * 100 * (inLong ? 1 : -1)

    if inLong and profit >= beTriggerPerc
        beLong := entry * (1 + beOffsetPerc / 100)

    if inShort and profit >= beTriggerPerc
        beShort := entry * (1 - beOffsetPerc / 100)

// ---------------------------------------------------------
// Flip logic (fixed HUD update)
// ---------------------------------------------------------
bool flipLongToShort = inLong and downChange
bool flipShortToLong = inShort and upChange

if flipLongToShort
    strategy.close("Long")
    strategy.entry("Short", strategy.short)


if flipShortToLong
    strategy.close("Short")
    strategy.entry("Long", strategy.long)


// ---------------------------------------------------------
// Entry tracking
// ---------------------------------------------------------
bool newLongEntry  = longEntry  and not inLong  and not inShort
bool newShortEntry = shortEntry and not inShort and not inLong

if newLongEntry
    strategy.entry("Long", strategy.long)


if newShortEntry
    strategy.entry("Short", strategy.short)


// ---------------------------------------------------------
// Breakeven exits
// ---------------------------------------------------------
if inLong and not na(beLong)
    strategy.exit("Long BE", from_entry="Long", stop=beLong)

if inShort and not na(beShort)
    strategy.exit("Short BE", from_entry="Short", stop=beShort)

// ---------------------------------------------------------
// Partial TP logic
// ---------------------------------------------------------
float tpLong  = na
float tpShort = na

if usePartialTP and strategy.position_size != 0
    float entry = strategy.position_avg_price
    if inLong
        tpLong := entry * (1 + tpPerc / 100)
    if inShort
        tpShort := entry * (1 - tpPerc / 100)

if usePartialTP
    if inLong and not na(tpLong)
        strategy.exit("Long TP Partial", from_entry="Long", limit=tpLong, qty_percent=tpQtyPerc)
    if inShort and not na(tpShort)
        strategy.exit("Short TP Partial", from_entry="Short", limit=tpShort, qty_percent=tpQtyPerc)

// ---------------------------------------------------------
// Previous position state
// ---------------------------------------------------------
bool wasLong  = strategy.position_size[1] > 0
bool wasShort = strategy.position_size[1] < 0

// ---------------------------------------------------------
// LuxAlgo Trend Visuals
// ---------------------------------------------------------
color zColor = trend == 1 ? BULL_COLOR : BEAR_COLOR

zPlot   = plot(z, "L1 Proximal Filter", color=zColor, linewidth=3)
srcPlot = plot(srcInput, "Source Plot", color=na)

bool showFill = (trend == 1 and srcInput > z) or (trend == -1 and srcInput < z)

color fillTopColor    = showFill ? color.new(zColor, 50)  : na
color fillBottomColor = showFill ? color.new(zColor, 100) : na

fill(srcPlot, zPlot, srcInput, z, fillTopColor, fillBottomColor, "Trend Fill")

float switchVal   = (upChange or downChange) ? z[1] : na
color switchColor = upChange ? BULL_COLOR : BEAR_COLOR

plot(switchVal, "Trend Switch Dot", color=switchColor, style=plot.style_circles, linewidth=4, offset=-1)

// ---------------------------------------------------------
// TP & BE lines (transparent, disappear when inactive)
// ---------------------------------------------------------
float tpLine = inLong ? tpLong : inShort ? tpShort : na
plot(tpLine, "TP Line", color=color.new(color.yellow, 60), style=plot.style_linebr, linewidth=2)

float beLine = inLong ? beLong : inShort ? beShort : na
plot(beLine, "BE Line", color=color.new(COL_BE, 60), style=plot.style_linebr, linewidth=2)

// ---------------------------------------------------------
// BE marker (simple & perfect)
// ---------------------------------------------------------
float beLinePrev = beLine[1]

bool beLongHit  = not na(beLinePrev) and na(beLine) and wasLong
bool beShortHit = not na(beLinePrev) and na(beLine) and wasShort

plotshape(beLongHit,  "Long BE Hit",  shape.square, location.belowbar, COL_BE, size=size.small)
plotshape(beShortHit, "Short BE Hit", shape.square, location.abovebar, COL_BE, size=size.small)

// ---------------------------------------------------------
// TP markers (only real partial exits)
// ---------------------------------------------------------
bool sizeReducedLong  = wasLong  and strategy.position_size < strategy.position_size[1] and strategy.position_size > 0
bool sizeReducedShort = wasShort and strategy.position_size > strategy.position_size[1] and strategy.position_size < 0

bool tpLongHit  = sizeReducedLong  and not na(tpLong)
bool tpShortHit = sizeReducedShort and not na(tpShort)

plotshape(tpLongHit,  "Long TP Partial Hit",  shape.circle, location.abovebar, COL_TP_LONG, size=size.small)
plotshape(tpShortHit, "Short TP Partial Hit", shape.circle, location.belowbar, COL_TP_SHORT, size=size.small)

// ---------------------------------------------------------
// Entry markers
// ---------------------------------------------------------
plotshape(longEntry,  "Long Entry",  shape.triangleup,   location.belowbar, COL_LONG_ENTRY,  size=size.small)
plotshape(shortEntry, "Short Entry", shape.triangledown, location.abovebar, COL_SHORT_ENTRY, size=size.small)

// ---------------------------------------------------------
// Flip markers
// ---------------------------------------------------------
plotshape(flipLongToShort, "Flip L→S", shape.diamond, location.abovebar, COL_FLIP_SHORT, size=size.small)
plotshape(flipShortToLong, "Flip S→L", shape.diamond, location.belowbar, COL_FLIP_LONG, size=size.small)

// ---------------------------------------------------------
// Alerts
// ---------------------------------------------------------
alertcondition(longEntry,        "Long Entry",        "TSF LONG ENTRY")
alertcondition(shortEntry,       "Short Entry",       "TSF SHORT ENTRY")
alertcondition(flipLongToShort,  "Flip Long→Short",   "TSF FLIP SHORT")
alertcondition(flipShortToLong,  "Flip Short→Long",   "TSF FLIP LONG")
alertcondition(tpLongHit,        "Long TP Partial",   "TSF LONG TP PARTIAL")
alertcondition(tpShortHit,       "Short TP Partial",  "TSF SHORT TP PARTIAL")
alertcondition(beLongHit,        "Long BE",           "TSF LONG BE")
alertcondition(beShortHit,       "Short BE",          "TSF SHORT BE")