Sumber daya yang dimuat... Pemuatan...

Strategi Crossover Rata-rata Bergerak Eksponensial Multi-Timeframe

Penulis:ChaoZhangTanggal: 2024-07-30 12:02:23
Tag:EMASLTPTF

img

Gambaran umum

Strategi Crossover Rata-rata Bergerak Eksponensial Multi-Timeframe ini adalah sistem perdagangan otomatis yang didasarkan pada sinyal crossover EMA. Ini memanfaatkan EMA dari jangka waktu yang berbeda untuk menghasilkan sinyal perdagangan dan menggabungkan mekanisme stop-loss dan take-profit untuk manajemen risiko. Strategi ini terutama mengandalkan crossover antara EMA cepat dan lambat, serta EMA jangka waktu yang lebih tinggi, untuk mengidentifikasi peluang perdagangan potensial.

Prinsip Strategi

Prinsip inti dari strategi ini adalah menggunakan EMA (Exponential Moving Averages) dari beberapa kerangka waktu untuk mengidentifikasi tren pasar dan menghasilkan sinyal perdagangan.

  1. Ini menggunakan EMA 9 periode sebagai garis cepat, EMA 50 periode sebagai garis lambat, dan EMA 100 periode pada kerangka waktu 15 menit sebagai referensi kerangka waktu yang lebih tinggi.

  2. Kondisi sinyal beli:

    • EMA cepat melintasi di atas EMA lambat, dan EMA cepat berada di atas EMA jangka waktu yang lebih tinggi; atau
    • EMA cepat melintasi di atas EMA jangka waktu yang lebih tinggi.
  3. Kondisi sinyal jual:

    • EMA cepat melintasi di bawah EMA lambat, dan EMA cepat berada di bawah EMA jangka waktu yang lebih tinggi; atau
    • EMA cepat melintasi di bawah EMA jangka waktu yang lebih tinggi.
  4. Manajemen Perdagangan:

    • Tentukan tingkat stop-loss (SL) dan take-profit (TP) yang tetap.
    • Ketika harga mencapai level take profit pertama (TP1), ia menutup 25% dari posisi dan memindahkan stop-loss ke titik impas.
    • Posisi yang tersisa terus berjalan sampai level take profit kedua (TP2) atau stop-loss tercapai.
  5. Kontrol waktu perdagangan:

    • Memungkinkan pengaturan jam perdagangan dan hari perdagangan tertentu.

Keuntungan Strategi

  1. Analisis multi-frame waktu: Menggabungkan EMA dari jangka waktu yang berbeda membantu mengurangi sinyal palsu dan meningkatkan kualitas perdagangan.

  2. Trend Following: Menerima tren pasar secara efektif melalui crossover EMA dan posisi relatif.

  3. Manajemen risiko: Menggunakan strategi stop-loss tetap dan mengambil keuntungan bertahap, membatasi potensi kerugian sambil memungkinkan keuntungan berjalan.

  4. Fleksibilitas: Parameter EMA, level stop-loss, dan take-profit dapat disesuaikan untuk berbagai pasar dan gaya trading.

  5. Otomasi: Strategi dapat sepenuhnya otomatis menggunakan platform TradingView dan PineConnector.

  6. Manajemen waktu: Kemampuan untuk menetapkan jam dan hari perdagangan tertentu untuk menghindari perdagangan dalam kondisi pasar yang tidak menguntungkan.

Risiko Strategi

  1. Lag: EMA secara inheren merupakan indikator yang tertinggal dan mungkin tidak bereaksi dengan cukup cepat di pasar yang tidak stabil.

  2. Sinyal yang salah: Di pasar yang berkisar, penyeberangan EMA dapat menghasilkan sinyal palsu yang sering, yang mengarah pada overtrading.

  3. Stop loss tetap: Menggunakan stop loss titik tetap mungkin tidak cocok untuk semua kondisi pasar, kadang-kadang terlalu besar atau terlalu kecil.

  4. Ketergantungan pada data historis: Efektivitas strategi sangat tergantung pada perilaku pasar selama periode backtesting, yang mungkin berbeda di masa depan.

  5. Kemampuan adaptasi pasar: Meskipun strategi ini bekerja dengan baik pada beberapa pasangan mata uang, mungkin tidak efektif pada yang lain.

Arah Optimasi Strategi

  1. Penyesuaian parameter dinamis: Pertimbangkan penyesuaian periode EMA, stop-loss, dan level take profit secara dinamis berdasarkan volatilitas pasar.

  2. Kondisi penyaringan tambahan: Memperkenalkan indikator teknis atau sentimen tambahan untuk menyaring sinyal perdagangan dan mengurangi positif palsu.

  3. Strategi stop-loss yang lebih baik: Mengimplementasikan trailing stop atau stop-loss dinamis berbasis ATR untuk lebih beradaptasi dengan volatilitas pasar.

  4. Mengoptimalkan waktu perdagangan: Melakukan analisis waktu yang lebih rinci untuk menemukan jam dan tanggal perdagangan terbaik.

  5. Peningkatan ukuran posisi: Mengatur ukuran posisi berdasarkan volatilitas pasar dan risiko akun.

  6. Analisis korelasi multi-mata uang: Pertimbangkan korelasi antara beberapa pasangan mata uang untuk menghindari keterpaparan berlebihan terhadap risiko pasar yang sama.

  7. Integrasi pembelajaran mesin: Menggunakan algoritma pembelajaran mesin untuk mengoptimalkan proses pemilihan parameter dan generasi sinyal.

Kesimpulan

Multi-Timeframe Exponential Moving Average Crossover Strategy adalah sistem perdagangan otomatis yang menggabungkan trend berikut dengan manajemen risiko. Dengan memanfaatkan sinyal EMA crossover dari jangka waktu yang berbeda, strategi ini bertujuan untuk menangkap tren pasar dan mengeksekusi perdagangan pada waktu yang tepat. Sementara strategi ini berkinerja baik dalam kondisi pasar tertentu, strategi ini masih memiliki risiko dan keterbatasan yang melekat. Untuk lebih meningkatkan ketahanan dan kemampuan beradaptasi strategi, pertimbangan dapat dibuat untuk memperkenalkan penyesuaian parameter dinamis, kondisi penyaringan tambahan, dan teknik manajemen risiko yang lebih canggih. Secara keseluruhan, strategi ini memberikan titik awal yang solid bagi pedagang kuantitatif, yang dapat lebih dioptimalkan dan disesuaikan sesuai dengan kebutuhan individu dan karakteristik pasar.


/*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

Berkaitan

Lebih banyak