Strategi Crossover Rata-rata Pergerakan Eksponensial Multi-Periode Waktu

EMA SL TP TF
Tanggal Pembuatan: 2024-07-30 12:02:23 Akhirnya memodifikasi: 2024-07-30 12:02:23
menyalin: 3 Jumlah klik: 618
1
fokus pada
1617
Pengikut

Strategi Crossover Rata-rata Pergerakan Eksponensial Multi-Periode Waktu

Ringkasan

Strategi crossover indeks bergerak rata-rata multi-periode ini adalah sistem perdagangan otomatis yang didasarkan pada sinyal crossover EMA. Ini memanfaatkan EMA dari periode waktu yang berbeda untuk menghasilkan sinyal perdagangan, dan menggabungkan mekanisme stop loss dan profit closeout untuk mengelola risiko. Strategi ini terutama bergantung pada EMA cepat dan EMA lambat dan EMA periode waktu yang lebih tinggi untuk mengidentifikasi peluang perdagangan potensial.

Prinsip Strategi

Prinsip inti dari strategi ini adalah menggunakan rata-rata bergerak indeks (EMA) untuk beberapa periode waktu untuk mengidentifikasi tren pasar dan menghasilkan sinyal perdagangan.

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

  2. Kondisi untuk membeli sinyal:

    • EMA cepat di atas EMA lambat dan EMA cepat di atas EMA periode waktu yang lebih tinggi; atau
    • Fast EMA menggunakan periode waktu EMA yang lebih tinggi.
  3. Kondisi penjualan sinyal:

    • EMA cepat di bawah EMA lambat dan EMA cepat di bawah EMA periode waktu yang lebih tinggi; atau
    • Fast EMA melewati periode waktu yang lebih tinggi di bawah EMA.
  4. Manajemen transaksi:

    • Tetapkan target stop loss (SL) dan profit (TP) yang tetap.
    • Ketika harga mencapai target profit pertama (TP1), posisi 25% dihapus dan stop loss akan dipindahkan ke posisi aman.
    • Posisi yang tersisa terus berjalan ke target keuntungan kedua ((TP2) atau stop loss)).
  5. Pengendalian waktu transaksi:

    • Anda dapat mengatur periode dan hari transaksi tertentu.

Keunggulan Strategis

  1. Analisis multi-periode waktu: EMA yang dikombinasikan dengan periode waktu yang berbeda membantu mengurangi sinyal palsu dan meningkatkan kualitas transaksi.

  2. Pelacakan tren: Menggunakan EMA crossover dan hubungan posisi untuk menangkap tren pasar secara efektif.

  3. Manajemen risiko: Menggunakan strategi stop loss tetap dan keuntungan bertahap, yang membatasi potensi kerugian dan memungkinkan keuntungan untuk terus tumbuh.

  4. Fleksibilitas: Parameter EMA, tingkat stop loss dan profit dapat disesuaikan sesuai dengan pasar dan gaya perdagangan yang berbeda.

  5. Otomatisasi: Strategi dapat melakukan perdagangan otomatis sepenuhnya melalui platform TradingView dan PineConnector.

  6. Manajemen waktu: Anda dapat mengatur waktu dan hari perdagangan tertentu untuk menghindari perdagangan di pasar yang tidak menguntungkan.

Risiko Strategis

  1. Lagging: EMA pada dasarnya merupakan indikator yang tertinggal dan mungkin tidak bereaksi dalam pasar yang sangat berfluktuasi.

  2. Sinyal palsu: Dalam pasar horizontal, EMA-cross dapat menghasilkan sinyal palsu yang sering, yang menyebabkan overtrading.

  3. Stop loss tetap: Stop loss yang menggunakan jumlah poin tetap mungkin tidak sesuai untuk semua kondisi pasar, kadang-kadang mungkin terlalu besar atau terlalu kecil.

  4. Bergantung pada data historis: Efektivitas strategi sangat bergantung pada perilaku pasar selama periode pengukuran ulang, dan kinerja masa depan mungkin berbeda.

  5. Adaptasi pasar: Strategi bekerja dengan baik pada beberapa pasangan mata uang, tetapi mungkin tidak bekerja dengan baik pada pasangan mata uang lainnya.

Arah optimasi strategi

  1. Pengaturan parameter dinamis: pertimbangkan untuk menyesuaikan siklus EMA, tingkat stop loss dan profit berdasarkan dinamika volatilitas pasar.

  2. Menambahkan kondisi penyaringan: memperkenalkan indikator teknis tambahan atau indikator sentimen pasar untuk memfilter sinyal perdagangan dan mengurangi sinyal palsu.

  3. Meningkatkan strategi stop loss: implement stop loss tracking atau stop loss dinamis berbasis ATR untuk lebih beradaptasi dengan fluktuasi pasar.

  4. Optimalkan waktu perdagangan: Analisis waktu yang lebih rinci untuk menemukan waktu dan tanggal perdagangan terbaik.

  5. Meningkatkan manajemen volume transaksi: menyesuaikan ukuran posisi sesuai dengan volatilitas pasar dan risiko akun.

  6. Analisis korelasi multi mata uang: mempertimbangkan korelasi antara beberapa pasangan mata uang, menghindari paparan berlebihan terhadap risiko pasar yang serupa.

  7. Integrasi pembelajaran mesin: Mengoptimalkan pilihan parameter dan proses pembuatan sinyal menggunakan algoritma pembelajaran mesin.

Meringkaskan

Strategi crossover indeks bergerak rata-rata multi-periode adalah sistem perdagangan otomatis yang menggabungkan pelacakan tren dan manajemen risiko. Strategi ini bertujuan untuk menangkap tren pasar dan melakukan perdagangan pada waktu yang tepat dengan memanfaatkan sinyal crossover EMA dari periode waktu yang berbeda. Meskipun strategi berkinerja baik dalam kondisi pasar tertentu, masih ada beberapa risiko dan keterbatasan yang melekat.

Kode Sumber Strategi
/*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