クロスサイクル指向戦略


作成日: 2023-09-27 16:30:51 最終変更日: 2023-09-27 16:30:51
コピー: 0 クリック数: 684
1
フォロー
1617
フォロワー

概要

この戦略は,トレンドの方向性を識別するためにクロンサイクル技術指標を使用し,トレンドフィルタリングと波動フィルタリングを組み合わせて,低リスクのトレンド追跡取引を実現します.

戦略原則

  1. 高低点の突破を用い,買入シグナルを判断する.価格が7周期高点の突破時に空を見,7周期低点の突破時に多見する.

  2. トレンドフレックス指数は主トレンドの方向を判断する.この指数は,二重平滑技術を組み合わせて,トレンドの中段を効果的に識別することができる.値が1以上であれば上昇傾向にあることを示し,値が-1以下であれば下降傾向にあることを示している.ここでは,トレンドフレックス > 1時間長くなり,< -1時間短くなり,盘整合状態をフィルタリングすることを要求している.

  3. Bollinger Bandsの波動は,震動区間を識別するためにもたらされます. 価格が帯域の近くにあるとき,空きをするのを避ける.

  4. モバイル・ストップとモバイル・ストップを使ってポジションを管理する.

優位分析

  1. 交期指数は,二重平滑技術と組み合わせて,トレンドの方向を効果的に識別し,波動的な市場から悩まされないようにします.

  2. トレンドの方向と波動の法則を考慮すると,取引信号がより信頼性が高くなります.

  3. ストップ・ストップの設定は合理的で,利益をロックし,損失の拡大を防ぐことができます.

  4. 戦略は単純で理解しやすく,実行しやすい.

リスク分析

  1. 突破シグナルに偽突破が発生し,誤った取引が生じることがあります.さらに多くの波条件を追加することを検討することができます.

  2. 固定サイクルパラメータは市場の変化に適応できないので,動的最適化パラメータを考慮することができる.

  3. 価格停止の欠如は,極端な状況から生じる莫大な損失を防ぐことができない.

  4. ストップ・ストラストポイントは固定であり,市場の変動に合わせてインテリジェントに調整することはできません.

最適化の方向

  1. さらに多くのトレンド判断指標を追加し,戦略の組み合わせを形成し,判断の正確性を向上させることも考えられます.

  2. 震災認識モジュールを追加し,震災が激しいときに取引を一時停止し,リスクを軽減します.

  3. 機械学習アルゴリズムを導入し,パラメータの動的最適化を実現する.

  4. 価格停止モジュールに追加し,損失が一定値下げに達したときに損失を止めて退出することができる.

  5. 市場変動に基づくストップ・ストップ・損失比率を計算し,ストップ・ストップ・損失のスマート調整を実現する.

要約する

この戦略は,全体的に比較して安定し,信頼性があり,改善の余地もある.核心的な考え方は,周期間トレンドの方向を判断し,トレンドの強度指標と波動指標を組み合わせてフィルタリングすることで,高品質の信号を発信する.この戦略は,シンプルで実用的で,中長期トレンドを追跡するのに適しています.より多くの条件判断と動態パラメータの最適化を導入することにより,戦略の効果をさらに向上させることができます.

ストラテジーソースコード
/*backtest
start: 2023-08-27 00:00:00
end: 2023-09-26 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Eltrut", shorttitle="Eltrut Strat", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075)

testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// R E F L E X / T R E N D F L E X

f_supersmoother(_src,_len)=>
    pi = 2 * asin(1)
    _a = exp(-sqrt(2) * pi / _len)
    _c2 = 2 * _a * cos(sqrt(2) * pi / _len)
    _c3 = -_a * _a
    _c1 = 1 - _c2 - _c3
    _out = 0.0
    _out := _c1 * _src + _c2 * nz(_out[1],nz(_src[1],_src)) + _c3 * nz(_out[2],nz(_src[2],nz(_src[1],_src)))

f_IQIFM(_src1,_max)=>
    _src = _src1 < 0.001 ? _src1 * 10000 : _src1
    _imult = 0.635, _qmult = 0.338 , _inphase = 0.0, _quad = 0.0
    _re = 0.0, _im = 0.0, _deltaphase = 0.0, _instper = 0.0, _per = 0.0, _v4 = 0.0
    _v1 = _src - nz(_src[7])
    _inphase := 1.25 * (nz(_v1[4]) - _imult * _v1[2]) + _imult * nz(_inphase[3])
    _quad := _v1[2] - _qmult * _v1 + _qmult * nz(_quad[2])
    _re := 0.2 * (_inphase * _inphase[1] + _quad * _quad[1]) + 0.8 * nz(_re[1])
    _im := 0.2 * (_inphase * _quad[1] - _inphase[1] * _quad) + 0.8 * nz(_im[1])
    if _re != 0.0
        _deltaphase := atan(_im / _re)
    for i = 0 to _max
        _v4 := _v4 + _deltaphase[i]
        if _v4 > 4 * asin(1) and _instper == 0.0
            _instper := i
    if _instper == 0.0
        _instper := nz(_instper[1])
    _per := 0.25 * _instper + 0.75 * nz(_per[1])
    _per

f_flex(_src1, _fixed_len, _reflex) =>
    _src = _src1
    _len = _fixed_len 
    _ss1 = f_supersmoother(_src, _len)
    _ss = _ss1
    _slope = (_ss[_len] - _ss) / _len
    _sum = 0.0
    for _i = 1 to _len
        _c1 = _reflex ? _ss + _i * _slope - _ss[_i] : _ss - _ss[_i]
        _sum := _sum + _c1
    _sum := _sum / _len
    _ms = 0.0
    _ms := 0.04 * pow(_sum,2) + 0.96 * nz(_ms[1])
    _flex1 = _ms != 0 ? _sum / sqrt(nz(_ms)) : 0.0
    _flex = _flex1
    _flex

rflx = f_flex(close, 20, true)  
trndflx = f_flex(close, 20, false)   

// S I G N A L
hi7 = highest(7)
lo7 = lowest(7)
long_cond = crossunder(close, lo7[1])
short_cond = crossover(close, hi7[1])

// F I L T E R S

long_filter1 = trndflx < 1
short_filter1 = trndflx > -1

basis = sma(close, 35)
dev = 3 * stdev(close, 35)
long_filter2 = close > basis - dev
short_filter2 = close < basis + dev

// S T R A T E G Y

long = long_cond and long_filter1 and long_filter2
short = short_cond and short_filter1 and short_filter2

if( true)
    strategy.entry("Long", strategy.long, when = long)
    strategy.entry("Long", strategy.long, when = short)


// User Options to Change Inputs (%)
stopPer = input(3, title='Stop Loss %', type=input.float) / 100
takePer = input(9, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

if strategy.position_size > 0 
    strategy.exit(id="Exit Long", stop=longStop, limit=longTake)
if strategy.position_size < 0 
    strategy.exit(id="Exit Short", stop=shortStop, limit=shortTake)


// P L O T 

plotshape(long, color = #1e90ff, text = "", style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(short, color = #ff69b4, text = "", style=shape.triangledown, location=location.abovebar, size=size.tiny)

alertcondition(long, "Long", "Enter Long")
alertcondition(short, "Short", "Enter S")