振動抑制戦略のEMA追跡傾向

作者: リン・ハーンチャオチャン, 日付: 2023-12-12 15:52:37
タグ:

img

概要

この戦略は,EMA,トレンドトラッキング戦略 (TTS) とシャフトレンドサイクル (STC) の3つの指標の利点を組み合わせて,強力な短期トレンドトラッキング戦略を形成する.具体的には,戦略は3つの指標の買いと売りの信号が一貫しているかどうかを判断する.それが一貫している場合は,取引信号が生成される.そうでなければ取引は行われない.これはいくつかの偽信号をフィルターし,戦略をより信頼性のあるものにする.

戦略原則

この戦略は,EMA指標,TTS傾向追跡戦略,STC指標の3つの主要部分で構成されています.

まず,200期 EMA 指数関数移動平均線が計算されます.価格がこの EMA 線以下であれば,EMA インディケーターは売り信号を表示します: -1;価格が線上であれば,EMA インディケーターは買い信号を表示します: 1.

2つ目は,TTSトレンド追跡戦略の関連パラメータを計算する.上下レールの価格ブレイクに応じて,市場のトレンド方向が決定される.価格が上下レールを突破した場合,購入信号1が生成され,価格が下下レールを突破した場合,販売信号-1が生成される.

最後に,価格統合の変化傾向を反映するシャフトレンドサイクル (STC) 指標が計算されます.STC指標が上昇した場合,1の購入信号を生成します.STC指標が低下した場合,1の販売信号を生成します.

3つの指標から判断信号を取得した後,戦略はそれらの一致性を決定する.すべての3つの指標判断信号が一貫している場合にのみ,実際の取引信号が生成される.これはいくつかの誤った信号を効果的にフィルタリングし,戦略をより信頼性のあるものにすることができます.

取引シグナルが生成されると,ロングまたはショートポジションが開かれ,ストップ・プロフィット/ストップ・ロスト・ポイントが設定されます.

利点

  1. この戦略は,3つの異なるタイプの指標を組み合わせて 市場の動向方向性を効果的に決定します

  2. 誤った信号をフィルタリングするために3つの指標からの判断信号の一貫性を利用することで,不必要な取引を削減し,戦略をより信頼性のあるものにすることができます.

  3. 合理的なストップ・プロフィート/ストップ・ロストポイントを設定することで 利益を固定し 損失を拡大させることができません

  4. 最適化されたパラメータは,ほとんどの株式やフォックス製品に適しています.

  5. シンプルで分かりやすい取引の論理です

リスク

  1. インディケーター判断の不一致は,取引機会の損失を引き起こす可能性があります.判断規則はさらに最適化できます.

  2. STCインジケーターはパラメータに敏感です 異なる製品にはパラメータ調整が必要です

  3. ダウントレンドでは,ストップロスは突入し,大きな損失を引き起こす可能性があります.適応ストップロスは検討できます.

  4. 横の整合は効果的に特定できないので,罠の位置になります.

改良

  1. より強い判断のルールを見つけるために,より多くの指標組み合わせをテストします.例えば,RSI指標を追加します.

  2. STC パラメータを最適化して,異なる製品に適応できるようにします.適応パラメータ最適化モジュールを追加します.

  3. 適応型ストップ損失モジュールを増やして ストップ損失ポイントを動的に最適化します

  4. 位置閉じるモジュールを強化して 横の範囲を特定し 罠を避ける

  5. 高周波取引のためのアルゴリズムを最適化し,遅延を削減し,注文履行率を向上させる.

結論

この戦略は,EMA,TTSおよびSTCインジケーターを組み合わせて市場方向性を決定し,すべての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")


もっと