この戦略は,エーラーズエレガントオシレーター,エーラーズデサイクラー,エーラーズインスタントトレンドライン,エーラーズスピーマンのランク相関係数を1つの戦略に組み合わせ,トレンド,振動,モメント,価格&ボリュームの特徴を完全に把握する定量的な取引戦略を形成する.戦略名は"定量的な振動指標組み合わせ戦略"である.
この戦略は4つの重要な指標を用いて判断します
まず,エーラーズエレガントオシレーター (Ehellers Elegant Oscillator) は,指数的な移動平均値で平滑した元の線と信号線の差が現在のトレンド方向と強さを決定できる.次に,エーラーズデサイクラー (Ehellers Decycler) は,サイクル低点を効果的に特定し,主要なトレンドが逆転しているかどうかを決定することができます.次に,エーラーズインスタントトレンドラインは,短期トレンド方向を判断するために高速移動平均値を追跡します.最後に,エーラーズスピーマンのランク相関係数は,誤ったブレイクを効果的にフィルタリングできる価格-ボリューム関係を判断します.
具体的には,戦略の4つのエントリー条件は,エレガントオシレーター信号ラインとデサイクラー信号ラインが同時に0を超えて突破する; 元のラインがデサイクラーラインを超えて突破する; 元のラインが上昇する瞬間のトレンドラインよりも高い; ポジティブなスピーマンのランク相関係数.
アクシートの条件は,よりシンプルです. 当初の線が即時トレンドラインを下回ったときに終了します.
短い条件は長い条件に似ていますが 逆です
この戦略の最大の利点は 適切な指標の組み合わせにあります それぞれの指標の強みを効果的に活用し,相互検証し,偽陽性回避し,多くのノイズをフィルタリングし,より信頼性の高い信号を生成できます
具体的には,エレガントオシレーターはトレンド方向と強さを判断し,デサイクラーはサイクルターニングポイントを判断し,インスタントトレンドラインは短期的なトレンドを判断し,スピーマンのランクは価格・ボリューム関係を判断する.この4つの組み合わせは,トレンド,サイクル,モメント,価格・ボリュームの観点から市場特性を包括的に判断し,非常に信頼性の高い取引信号を生成します.
また,中期価格のみを基準とするため,この戦略は短期的な市場騒音による干渉を避け,不要な逆転取引を減らす.また,稀な信号と簡単な退出規則により,取引頻度が大幅に削減され,過剰な取引の問題を回避することができます.
この戦略の最大のリスクは,ストップ損失メカニズムの欠如である.激しい市場の動きの場合,損失を間に合って停止できないことがより大きな損失につながる可能性がある.また,ドンチアンチャネルやエネルギー指標などの追加のフィルターが欠けているため,何らかの程度に誤ったポジティブな取引につながる可能性があります.
これらのリスクを軽減するために,損失が特定のレベルを超えると自動的に損失を停止するように保護ストップロスを設定できます.また,誤ったブレイクによるリスクを避けるために,MACDのような指標を二次確認のために追加することができます.
戦略は以下の側面で最適化できます.
リスク管理のストップ・ロスのメカニズムを追加します.適切なストップ・ロスのレベルを設定するために最大の歴史的な引き下げを計算します.
MACDやボリンジャー帯のような指標を追加して 誤った信号をさらに減少させるのです
より多くのタイムフレームを組み込む.現在,パラメータの 1 つのセットのみが使用されています.安定性を向上させるために,複数のタイムフレームの検証のためにより多くのタイムフレームを追加できます.
パラメータを動的に調整する. 適応性を向上させるために変化する市場状況に基づいて指標のパラメータを動的に調整するパラメータ最適化を追加する.
クロス・アセット・アービタージ リスクの管理を図るためのアービタージの機会を探し出すために異なる資産に戦略を適用する.
この戦略は,トレンド,サイクル,勢い,価格の量をあらゆる面で判断する戦略を形成するために,4つの主要なエラーズ指標を巧みに組み合わせています. 優れたノイズフィルタリング能力を持ち,高品質の信号を生産することができます. しかし,ストップ損失と補助指標フィルタリングの欠如は,いくつかのリスクにさらしています. ストップ損失,フィルター,より多くのタイムフレームなどを追加することで,より高い安定性と信頼性のために効果的に最適化することができます.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © simwai //@version=5 strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100) // -- Inputs -- inp = input(title='Source', defval=close) res = input.timeframe(title='Resolution', defval='') bar = input(title='Allow Bar Color Change?', defval=true) src = inp length = input.int(title='Length', defval=20, minval=2, maxval=300) rmsLength = input.int(title='Rms Length', defval=50, minval=2) decyclerLength = length // -- Calculation -- // Ehlers Elegant Oscillator a1 = math.exp(-1.414 * math.pi / length) b1 = 2 * a1 * math.cos(1.414 * math.pi / length) c2 = b1 c3 = -a1 * a1 c1 = 1 - c2 - c3 deriv = src - nz(src[2]) rms = math.avg(math.pow(deriv, 2), rmsLength) rms := rms != 0 ? math.sqrt(rms) : 0 nDeriv = rms != 0 ? deriv / rms : 0 iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0 ss = 0.0 ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2])) ssSig = ta.wma(ss, length) slo = ss - ssSig sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0 eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black hline(0) plot(ssSig, title='EO', color=eoColor, linewidth=2) // Ehlers Decycler pi = 2 * math.asin(1) twoPiPrd = 2 * pi / decyclerLength alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd) dec = 0.0 dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1])) decyclerSig = src > dec ? 1 : src < dec ? -1 : 0 decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black plot(dec, title='Decycler', color=decColor, linewidth=2) // Ehlers Instantaneous Trendline getItrend(src, alpha) => Price = src Smooth = 0.0 ITrend = 0.0 Trigger = 0.0 ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2]) if(bar_index < 7) ITrend := (Price + 2 * Price[1] + Price[2]) / 4 Trigger := 2 * ITrend - ITrend[2] [ITrend, Trigger] itrendAlpha = 2 / (length + 1) / 2 [iT, Tr] = getItrend(src, itrendAlpha) iTColor = Tr > iT ? color.aqua : color.maroon plot(iT, 'Instantaneous Trend', iTColor, 2) // Ehlers Spearman Rank priceArray = array.new_float(300, 0.0) rank = array.new_float(300, 0.0) for i = 1 to length array.set(priceArray, i, nz(src[i - 1])) array.set(rank, i, i) for i = 1 to length count = length + 1 - i for j = 1 to length - count if array.get(priceArray, j + 1) < array.get(priceArray, j) tempPrice = array.get(priceArray, j) tempRank = array.get(rank, j) array.set(priceArray, j, array.get(priceArray, j + 1)) array.set(rank, j, array.get(rank, j + 1)) array.set(priceArray, j + 1, tempPrice) array.set(rank, j + 1, tempRank) sum = 0.0 for i = 1 to length sum := sum + math.pow(i - array.get(rank, i), 2) signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1))))) spearmanSlo = signal - nz(signal[1]) spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0 // -- Signals -- bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0 bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0 bool exitLong = ta.crossunder(src[100], iT) bool exitShort = ta.crossover(src[100], iT) barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray) // -- Long Exits -- strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG') // -- Short Exits -- strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT') bool isStrategyEntryEnabled = true // -- Long Entries -- if (isStrategyEntryEnabled) strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG') else strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG') // -- Short Entries -- if (isStrategyEntryEnabled) strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT') else strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')