資源の読み込みに... 荷物...

多期指数関数移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2024-07-30 12:02:23
タグ:エイマSLTPTF

img

概要

このマルチタイムフレーム指数関数移動平均クロスオーバー戦略は,EMAクロスオーバーシグナルに基づいた自動化された取引システムである.これは,異なるタイムフレームからのEMAを利用して取引シグナルを生成し,リスク管理のためのストップ・ロストとテイク・プロフィートメカニズムを組み込む.この戦略は主に,潜在的な取引機会を特定するために,高速なEMAと遅いEMAとの間のクロスオーバー,およびより高いタイムフレームEMAに依存している.

戦略の原則

この戦略の基本原理は,複数のタイムフレームから指数関数移動平均値 (EMA) を利用して市場動向を特定し,取引信号を生成することです.具体的には:

  1. 速線として 9 期間の EMA,スローラインとして 50 期間の EMA,より高い時間枠の参照として 15 分間の時間枠で 100 期間の EMA を使用します.

  2. 購入信号条件:

    • 急速EMAが遅いEMAを横切り,高速EMAがより長いタイムフレームEMAを横切り,または
    • 急速なEMAは,より高い時間枠のEMAを横断します.
  3. 売り信号条件:

    • Fast EMAは slow EMAを下回り,fast EMAは higher timeframe EMAを下回っている場合,または
    • 急速なEMAは,より高いタイムフレームのEMAを下回る.
  4. 貿易管理

    • 固定ストップ・ロスト (SL) とテイク・プロフィート (TP) のレベルを設定します.
    • 価格が最初の取利益レベル (TP1) に達すると,ポジションの25%を閉じてストップ・ロスをブレイク・イブに移動します.
    • 残りのポジションは,第2のテイク・プロフィート (TP2) レベルまたはストップ・ロスを達成するまで実行し続けます.
  5. 取引時間制御:

    • 特定の取引時間と取引日を設定できます.

戦略 の 利点

  1. 複数のタイムフレーム分析:異なるタイムフレームからの EMA を組み合わせることで,誤った信号を減らすことができ,取引の質を向上させます.

  2. トレンドフォロー: EMAのクロスオーバーと相対的なポジションを通じて市場のトレンドを効果的に把握する.

  3. リスクマネジメント: 固定ストップ・ロストと段階的なテイク・プロフィート戦略を採用し,潜在的な損失を制限し,利益を稼働させる.

  4. 柔軟性: EMA パラメータ,ストップ・ロスト,テイク・プロフィートのレベルは,異なる市場や取引スタイルに合わせて調整できます.

  5. 自動化: 戦略は,TradingViewプラットフォームとPineConnectorを使用して完全に自動化できます.

  6. 時間管理: 不利な市場条件での取引を避けるために,特定の取引時間と日を設定する能力.

戦略リスク

  1. 遅延: EMA は本質的に遅延指標であり,不安定な市場では十分に迅速に対応しない可能性があります.

  2. 誤った信号: 変動市場では,EMAクロスオーバーが誤った信号を頻繁に発生させ,過剰取引を引き起こす可能性があります.

  3. 固定ストップ損失: 固定ポイントストップ損失を使用することは,すべての市場条件に適していない場合もあるし,時には大きすぎたり小さすぎたりする.

  4. 歴史的データへの依存:戦略の有効性は,バックテスト期間中の市場行動に大きく依存しており,将来的には異なる可能性があります.

  5. 市場の適応性: 戦略は一部の通貨ペアでうまく機能していますが,他のペアではそれほど効果的ではありません.

戦略の最適化方向

  1. ダイナミックパラメータ調整: EMA 期間,ストップ・ロース,および市場変動に基づいて利益を引き出すレベルをダイナミックに調整することを検討する.

  2. 追加のフィルタリング条件: 貿易信号をフィルタリングし,偽陽性値を減らすために,追加の技術的指標または感情指標を導入します.

  3. ストップ・ロスの改善戦略: トレイリング・ストップやATRベースのダイナミック・ストップ・ロスの導入により市場の変動に適応する.

  4. 取引時間を最適化します. 最適な取引時間と日付を見つけるために,より詳細な時間分析を行います.

  5. ポジションのサイズ調整: 市場の変動と口座リスクに基づいてポジションのサイズを調整する.

  6. 多通貨関連分析: 類似の市場リスクへの過剰な曝露を避けるために,複数の通貨対間の関連を考慮する.

  7. 機械学習統合: パラメータ選択と信号生成プロセスを最適化するために機械学習アルゴリズムを使用する.

結論

マルチタイムフレーム指数関数移動平均クロスオーバー戦略は,トレンドフォローとリスク管理を組み合わせる自動化された取引システムである.異なるタイムフレームからのEMAクロスオーバー信号を利用することで,戦略は市場のトレンドを把握し,適切なタイミングで取引を実行することを目的としている. 戦略は特定の市場条件下でうまく機能しているが,依然として固有のリスクと制限がある. 戦略の強固性と適応性をさらに高めるため,ダイナミックパラメータ調整,追加のフィルタリング条件,およびより洗練されたリスク管理技術を導入することを検討することができる. 全体的に,この戦略は定量トレーダーにとって堅牢な出発点を提供し,個々のニーズと市場特性に合わせてさらに最適化およびカスタマイズすることができます.


/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

関連性

もっと