短期トレンド追跡とショック抑制戦略


作成日: 2023-12-12 15:52:37 最終変更日: 2023-12-12 15:52:37
コピー: 1 クリック数: 657
1
フォロー
1621
フォロワー

短期トレンド追跡とショック抑制戦略

概要

この戦略は,指標EMA,トレンドフォロー戦略TTS,シュフトのトレンドサイクルSTCの3つの指標の優位性を利用して,より強いショートラインフォロートレンドの戦略を形成する.具体的には,戦略は,3つの指標の多空信号が一致しているかどうかを同時に判断し,一致すれば取引信号を生成する.一致しない場合は,買い出さない.このようにして,いくつかの偽信号をフィルターして,戦略をより信頼性のあるものにする.

戦略原則

この戦略は主に3つの部分で構成されています:EMA平滑指標,TTSトレンド追跡戦略,STCシュフトトレンドサイクル指標.

まず,200周期のEMA指数移動平均を計算し,価格がEMA線より低いか高いか判断します.価格がEMA線より低ければ,EMA指数は空頭シグナルを与えます;-1;価格がEMA線より高ければ,EMA指数は多頭シグナルを与えます:1。

次に,TTSトレンド追跡戦略の関連するパラメータを計算し,価格が上下軌道に突破したときにトレンドの方向を判断します.価格が上下軌道に突破した場合,多頭信号1を生成し,価格が下下軌道に突破した場合,空頭信号-1を生成します.

最後に,シューフトトレンドサイクルSTC指数を計算し,この指数は価格の中央の変化の傾向を反映します. STC指数が上昇すると,多頭シグナル1が生じ,STC指数が低下すると,空頭シグナル-1が生じます.

3つの指標の判断信号が得られた後,戦略はそれらの一致かどうかを判断する. 3つの指標の判断信号がすべて一致するときにのみ,実際の取引信号が生成される. これは,いくつかの偽信号を効果的にフィルターして,戦略をより信頼できるようにする.

取引シグナルが生成されたことが確認された場合,多引または空調の委託を行い,ストップ・ストップ・ストップポイントを設定します.

戦略的優位性

  1. この戦略は,3つの異なるタイプの指標を組み合わせて,市場のトレンドの方向を効果的に判断します.

  2. 3つの指標の判断信号の一致性を判断して偽信号をフィルターすることで,不必要な取引を減らすことができ,戦略をより信頼できます.

  3. 合理的なストップ・ストップ・ポイントを設定することで,利益を固定し,損失の拡大を防ぐことができます.

  4. 選択されたパラメータは,ほとんどの株式と外貨品種に対応するために最適化されています.

  5. 取引の論理は明確で簡潔で,理解し,修正しやすい.

戦略リスク

  1. 3つの指標の判断が一致しない場合,ダイマーが発生し,取引機会が逃れやすい.判断ルールを最適化することを考えることができます.

  2. STC指標はパラメータに対して高い感度があり,異なる品種はパラメータを調整する必要がある.

  3. 景気後退の状況では,ストロップが突破され,大きな損失を招く可能性があります. リアルタイム最適化ストロップポイントを考慮することができます.

  4. 横横整理の状況を判断できず,区間整理の入場は牢屋に繋がる可能性がある.

戦略の最適化

  1. より多くの指標の組み合わせをテストし,より強力な判断ルールを探すことができます.例えば,RSI指標を追加します.

  2. STC指標の指標パラメータを最適化して,異なる品種に適したものにする.自己適応パラメータ最適化モジュールを追加する.

  3. 自動停止モジュールを追加し,現実状況に応じてリアルタイムで停止点を最適化できます.

  4. 平仓モジュールを強化し,横盤整理を判断し,封鎖を回避する.

  5. 高周波取引に対するアルゴリズム最適化,システムの遅延を軽減し,委託成功率を向上させる.

要約する

この戦略は,EMA,TTS,STCの3つの指標を総合的に使用して,市場トレンドの方向を判断し,判断ルールを3つが一致すると取引信号を生成します.これにより,偽の信号を効果的にフィルターできます.戦略の最適化スペースは広く,より多くの指標の組み合わせをテストし,自己適応アルゴリズムを追加し,高周波取引モジュールを最適化などの手段を使用して,トレンドを追跡する過程で戦略のパフォーマンスをさらに強化できます.単純に平均線をフォローするなどの従来的な戦略と比較して,この戦略は,市場をより賢く判断し,トレンドを把握しながら,できるだけ被套を避けることができます.

ストラテジーソースコード
/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 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/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")