この戦略は,SoftKill21のAmazing scalper for majors with risk management戦略に基づいて,トリプル指数移動平均を使用して,元のシンプル移動平均を代替して,遅滞を軽減するために修正されています.この戦略は,主要通貨ペアの1分周期に適用され,トレンド追跡方法を使用して,高速EMA,標準EMA,および遅いEMAの黄金のクロスとデッドクロスに基づいて買い出します.同時に,ロンドンとニューヨークの取引時間とリスク管理原則を組み合わせて,ポジションの大きさを決定します.
この戦略は,3つの異なる周期の指数移動平均を使用しています:25周期の急速EMA,50周期の標準EMA,および100周期の遅いEMA. 急速EMAが標準EMAと遅いEMAを横切るとき,買いの信号を生じます. 急速EMAが標準EMAと遅いEMAを横切るとき,売りの信号を生じます. 遅延を軽減するために,二次指数平滑技術を使用してEMAを計算します.
具体的には,戦略はまず3つのEMA線を計算し,その後,急速EMAが標準EMAと遅いEMAと金十字または死叉を形成するかどうかを判断し,ロンドンまたはニューヨーク時間帯の開場時間にマッチする条件が同時に満たされれば,買入または売却のシグナルを生成する.ポジションの大きさを決定する際に,戦略は,まず,リスクの門檻として口座の利便の固定パーセントを計算し,その後,契約数と標準時計に変換し,それによってそれぞれの注文のポジションを動的に調整する.
この戦略の利点は以下の通りです.
三重EMAを使用し,価格データを効率的に平滑化し,トレンドの方向を識別できます. 急速EMAは価格変化に敏感で,標準EMAは安定した追跡,遅いEMAは騒音をフィルターします. 三つを組み合わせて使用し,偽突破をフィルターし,トレンドの方向を決定できます.
二次指数平滑技術を用いてEMAを計算し,遅延を軽減し,信号をより敏感にします.
主要取引時間と組み合わせて,非主要取引時間における誤導信号を回避する.
リスク管理の原則を採用し,口座の権利・利益に応じてポジションを調整する.単一の損失が口座に過剰な衝撃を与えるのを避ける.
戦略の論理はシンプルでわかりやすく,理解しやすい実装で,初心者の学習に適しています.
異なる通貨ペア,時間周期に最適化調整が可能で,広く適用される.
この戦略にはいくつかのリスクがあります.
EMAは,突発的な出来事による短期的な偽突破を効果的にフィルターできず,誤った信号を生じることがあります.フィルタリングを他の指標と組み合わせて分析することをお勧めします.
固定比率のポジションは,市場の変動に動的に調整できない.ポジションが過大または過小の問題がある.波動率などの指標の動的に調整するポジションを導入することを考えることができる.
2つの主要な取引時間を考慮するだけで,他の時間の取引機会を逃す可能性があります.異なる時間の効果をテストすることができます.
止損メカニズムがないため,一方的な損失を効果的に制御することはできません.移動止損または時間止損を設定できます.
EMAクロスには遅滞性があり,最適な入場時間を逃す可能性があります.EMAサイクルを減らし,または他の先行指標と組み合わせることを検討することができます.
効果は取引コストの影響を受けることがあります. 適切な調整を推奨します.
この戦略は以下の点で最適化できます.
異なるEMAサイクルパラメータをテストし,最適のパラメータ組み合わせを探します.自適応EMAなどの技術が導入され,動的にEMAサイクルを最適化できます.
RSI,ブリン帯など,他のフィルタリング指標を追加し,信号の質を向上させる.
市場変動と収益性に応じてポジションを調整するダイナミックポジション管理メカニズムを導入する.
移動ストップ,時間ストップを追加して損失を制限する. ストップポイントを適切に調整する.
異なる取引時間をテストし,最適な取引時間を探します. 波動率などの指標をフィルターする時間を組み合わせることができます.
ストップとストップのレベルを最適化し,勝利の大きさと勝利率をバランスさせる.パラパララインストップなどのスマートストップを導入する.
EMAの計算方法の改変を試み,例えば,線形加重 EMAなどで,遅延を軽減する.
自動機械学習の手法と組み合わせた最適参数を探す.
取引コストをモデル化して, システムの調整により, 純利益を最大化します.
上記の最適化により,システムの収益性を向上させ,撤回を制御し,適用範囲を拡大し,より強力で安定した取引戦略を得ることができる.
この戦略の全体的な考え方は明確で,三重EMAのトレンド識別を使用し,主要取引時間に対応して操作し,アカウントの比率を使用してポジションを決定し,典型的なトレンド追跡型の戦略に属します.戦略の最適化スペースは大きい.パラメータの最適化,メカニズムの改善,技術の導入などの手段によって,戦略の適用性をさらに拡大し,戦略の安定性を向上させることができます.新手学習として,この戦略は良い出発点です.学習と改善により,対量化取引システムの理解を向上させることができます.適切な処理であれば,この戦略は成熟した信頼性の高い量化戦略に変換できます.
/*backtest
start: 2023-09-19 00:00:00
end: 2023-09-26 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// original author SoftKill21
//@version=4
//@capam
strategy(title="Triple EMA Scalper low lag strat", shorttitle="3EMA scalper", overlay=true)
strategy.initial_capital = 50000
len1 = input(25, minval=1, title="Length")
len2 = input(50, minval=1, title="Length")
len3 = input(100, minval=1, title="Length")
src = input(close, title="Source")
tmp1 = ema(src, len1)
tmp2 = ema(src, len2)
tmp3 = ema(src, len3)
fastemaOut = 2*tmp1 - ema(tmp1, len1)
standardemaOut = 2*tmp2 - ema(tmp2, len2)
slowemaOut = 2*tmp3 - ema(tmp3, len3)
//fastemaOut = sma(src, len1)
//standardemaOut = sma(src, len2)
//slowemaOut = sma(src, len3)
plot(fastemaOut, color=color.black, title="First EMA")
plot(standardemaOut, color=color.yellow, title="Second EMA")
plot(slowemaOut, color=color.blue, title="Third EMA")
timeinrange(res, sess) => time(res, sess) != 0
londopen = timeinrange(timeframe.period, "0300-1100")
nyopen = timeinrange(timeframe.period, "0800-1600")
longCondition = crossover(fastemaOut,standardemaOut) and crossover(fastemaOut,slowemaOut) and londopen //or nyopen)
shortCondition = crossunder(fastemaOut,standardemaOut) and crossunder(fastemaOut,slowemaOut) and londopen// or nyopen)
longCondition2 = crossover(fastemaOut,standardemaOut) and crossover(fastemaOut,slowemaOut) and nyopen
shortCondition2 = crossunder(fastemaOut,standardemaOut) and crossunder(fastemaOut,slowemaOut) and nyopen
tp = input(50,title="TP")
sl = input(100, title="SL")
tradeLondon = input(title="Trade london session?", type=input.bool, defval=true)
tradeNewyork = input(title="Trade new york session?", type=input.bool, defval=true)
//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(1,type=input.float,title="Risk % of equity ")/100 //risk % per trade
temp01 = balance * risk //Risk in USD
temp02 = temp01/sl //Risk in lots
temp03 = temp02*100000 //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 1000)
size := 1000
if(tradeLondon==true)
strategy.entry("long",1,when=longCondition)
strategy.exit("tp/sl","long",profit=tp,loss=sl)
strategy.entry("short",0,when=shortCondition)
strategy.exit("tp/sl","short",profit=tp,loss=sl)
if(tradeNewyork==true)
strategy.entry("long",1,when=longCondition2)
strategy.exit("tp/sl","long",profit=tp,loss=sl)
strategy.entry("short",0,when=shortCondition2)
strategy.exit("tp/sl","short",profit=tp,loss=sl)
// strategy.risk.max_intraday_filled_orders(2)