
この戦略は,エンレス・エレガント・シェイク,エンレス・サイクル,エンレス・インスタント・トレンド・ライン,エンレス・スピルマン等級の関連系数指標を組み合わせて,トレンド,シェイク,モナミクス,価格特性を全方位に捉える量化取引戦略を形成する.この戦略は,量化シェイク・シェイク・インディケーター・ポーチ・戦略と呼ばれる.
この戦略は4つの重要な指標を用いて評価されています.
まず,エンレス優雅な振動指標は,指数平均線を平らげた後に信号線を得て,原線との差値から現在のトレンドの方向と強さを判断できる.次いで,エンレス循環指標は,循環周期の低点を効果的に識別して,主トレンドが逆転しているかどうかを判断できる.また,エンレス瞬時のトレンドラインは,短期的なトレンドの方向を判断するために,急速な移動平均を追跡する.最後に,エンレス・スピルマン等級系に関連する指数は,価格関係を判断し,偽突破を効果的にフィルターできる.
具体的には,戦略の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')