アダプティブ・ゼロ・レイグ・EMA戦略

作者: リン・ハーンチャオチャン, 日付: 2023-09-08 16:24:02
タグ:

あなたが提供したスクリプトは,アダプティブゼロレイグ EMA (AZLEMA) 戦略に基づいています.このスクリプトは,ジョン・エラーズ・シグナル処理研究の原則と,支配的なサイクルの期間,すなわち,取引データにおける連続サイクルの2つの同一点間の時間の長さを決定するために,コシヌス瞬時周波数測定 (IFM) と呼ばれる方法を使用しています.

取引シグナルの機能の概要は以下です.

  1. 初期には,期間,適応モード,利益制限,値,ストップ損失ポイント,利益ポイントなどのデフォルト入力の構成を使用して戦略を設定します. 通貨はUSDと初期資本は1000に設定されています.

  2. その後,微分方程式とEhlers方法 (Adaptive?設定が true に設定されたときに使用される) の組み合わせを使用して,適応モードの計算を設定します.

  3. 選択されたデータソースの平均値 (EMA) を,選択された期間で計算します.

  4. 絶対エラーを最小限に抑えるゲインとエラー相関値 (EC) を探すためにループ操作を行います.

  5. これらの値を使用して,最終CE値を計算し,ECとEMAの値をグラフにグラフ化します.

  6. これは,ECとEMAのクロスオーバーとクロスアンダーに基づいて,ある定義された値を超えた潜在的な買い物・売却条件を作り出します.

  7. ロング・ショート・ポジションの入口と出口のルールは,以前に決定された購入・販売条件に基づいて設定される.各ポジションでは,ロットサイズを計算し,それぞれの条件 (購入/販売) が正しいときにポジションを入力する.各ポジションにはストップ・ロストとトライリング・テイク・プロフィートを設定する.

このスクリプトは,さまざまな取引スタイルと市場状況に適応するために複数のパラメータを変更できるようにして,かなり包括的で汎用的に見えます. いつものように,ライブ取引で使用する前に,この戦略を歴史的なデータを使用してバックテストすることをお勧めします.


/*backtest
start: 2023-08-08 00:00:00
end: 2023-09-07 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Adaptive Zero Lag EMA", shorttitle="AZLEMA", overlay = true, initial_capital=1000, currency="USD", commission_type=strategy.commission.cash_per_contract, commission_value=0.000005, slippage = 5, pyramiding=1, calc_on_every_tick=true)

src = input(title="Source",  defval=close)
Period = input(title="Period", defval = 20)
adaptive = input(title="Adaptive?", defval=true)
GainLimit = input(title="Gain Limit",  defval = 15)
Threshold = input(title="Threshold",  defval=0.03, step=0.01)
fixedSL = input(title="SL Points", defval=50)
fixedTP = input(title="TP Points", defval=10)
risk = input(title='Risk', defval=0.01, step=0.01)

PI = 3.14159265359
s2 = 0.0
s3 = 0.0
delta = 0.0
inst = 0.0
len = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0

//IF adaptive is true, use the Cosine IFM strategy for determining the dominant
//cycle period
if(adaptive)
    v1 := src - src[7]
    s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
    s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
    if (s2 != 0)
        v2 := sqrt(s3/s2)
    if (s3 != 0)
        delta := 2*atan(v2)
    for i = 0 to 100
        v4 := v4 + delta[i]
        if (v4 > 2*PI and inst == 0.0)
            inst := i - 1
    if (inst == 0.0)
        inst := inst[1]
    len := 0.25*inst + 0.75*nz(len[1])
    Period := round(len)

LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0

alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])

for i = -GainLimit to GainLimit
    Gain := i/10
    EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
    Error := src - EC
    if(abs(Error)<LeastError)
        LeastError := abs(Error)
        BestGain := Gain

EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])

plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)

buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold

if buy
    strategy.entry("Enter Long", strategy.long)
else if sell
    strategy.entry("Enter Short", strategy.short)

もっと