この戦略は,EMA指標を使用して価格動向を特定し,標準偏差を組み合わせて,取引後のトレンドの購入・販売シグナルを計算する.主なアイデアは,閉値とEMAの違いを計算し,注文を誘発する
ストラテジーはまず,長さのema_lengthの閉じる価格とEMAの間の差 vを計算する.その後,ema_length期間のvの標準偏差devを計算する.次に,長さのk=1と短さのk=-1で方向系数kを決定する.購入信号の限界dev_limitは,k * dev *因数制限で計算される.vがdev_limitを横切ると,購入信号が起動する.出口信号は,vが0を横切るときである.
戦略は2つの方法を用意しています.
負のデブ・リミットを下回る時に,ダウントレンドをフォローします.
値上がり傾向を追うために,vが正のdev_limitを超えると,
要するに,戦略は,価格とEMAの間の差の標準偏差を動的に計算し,
この戦略の利点は以下の通りです.
EMAは価格を平滑させることで 傾向の方向性をよく特定します
標準偏差に基づく動的限界値は 固定的な限界値よりも 適性があります
2つの購入モードで 上昇傾向や下落傾向を追うことができます
このファクタは,購入感度を調整する柔軟性を提供します. ema_lengthは,EMA期間最適化を可能にします.
論理はシンプルで 分かりやすく 修正できます
ポジションサイズ設定は,積極的なトレンドフォローのために柔軟に設定できます.
戦略のリスク
EMAは遅れており 傾向の転換点を見逃す可能性があります
パラメータの最適化に依存します.不適切な設定は,過敏度や過敏度に繋がります.
トレンドが逆転すると大きな損失を伴う.
頻繁に長/短スイッチをすると 取引頻度は増加します
市場での頻度の高い信号がコストを上げます
リスクに対処するために,ストップ・ロスを追加したり,パラメータを最適化したり,過剰取引を避けるためのフィルターを追加したりなどを検討してください.
戦略を最適化するには
適正な長さを見つけるために 異なるEMA期間をテストします
最適な感度を見つけるために 異なる因子値をテストする.
位置のサイズを最適化する戦略,例えばピラミッド型
不安定な市場での不正取引を避けるためにフィルターを追加します
ストップ・ロスを組み込み,シングル・トレード・ロスを制御する.
2つの購入モードのパラメータを別々に最適化する
トレンドが逆転する信号を調査して トレンドを止めます
この戦略は,EMAでトレンドを特定し,トレンドをフォローするためのダイナミックなしきい値オーダーを生成する.論理はシンプルで明確である.ポジションサイジングはトレンドを追いかけるために攻撃的になることがあります.パラメータ最適化とストップロスの ಮೂಲಕ対処する必要があるリスクがあります.指標の組み合わせとパラメータチューニングを学ぶのに良い例です.
/*backtest start: 2023-10-06 00:00:00 end: 2023-11-05 00:00:00 period: 1h basePeriod: 15m 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/ // © Azzrael // Based on EMA and EMA Oscilator https://www.tradingview.com/script/qM9wm0PW-EMA-Oscilator-Azzrael/ // (EMA - close) + Std Dev + Factor = detecting oversell/overbuy // Long only! // Pyramiding - sometimes, depends on ... // There 2 enter strategies in one script // 1 - Classic, buy on entering to OverSell zone (more profitable ~> 70%) // 2 - Crazy, buy on entering to OverBuy zone (catching trend and pyramiding, more net profit) // Exit - crossing zero of (EMA - close) //@version=5 strategy("STR:EMA Oscilator [Azzrael]", overlay=false, margin_long=100, margin_short=100, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=30, pyramiding=3) entry_name="Buy" ema_length = input.int(200, "Period", minval=2, step=10) limit = input.float(1.7, "Factor", minval=1, step=0.1, maxval=10) dno = input.string(defval="Buy on enter to OverSell", title="Model", options=["Buy on enter to OverSell", "Buy on enter to OverBuy"]) == "Buy on enter to OverSell" v = close - ta.ema(close, ema_length) dev = ta.stdev(v, ema_length) k = dno ? -1 : 1 dev_limit = k*dev*limit cond_long = dno ? ta.crossunder(v, dev_limit) : ta.crossover(v, dev_limit) cond_close = ta.cross(v, 0) // dev visualization sig_col = (dno and v <= dev_limit) or (not dno and v >= dev_limit) ? color.green : color.new(color.blue, 80) plot(dev_limit, color=color.green) plot(k*dev, color=color.new(color.blue, 60)) plot(v, color=sig_col ) hline(0) // Make love not war strategy.entry(entry_name, strategy.long, when=cond_long) strategy.close(entry_name, when=cond_close)