Strategi Persilangan Purata Pergerakan Eksponen Tempoh Berbilang Masa

EMA SL TP TF
Tarikh penciptaan: 2024-07-30 12:02:23 Akhirnya diubah suai: 2024-07-30 12:02:23
Salin: 3 Bilangan klik: 618
1
fokus pada
1617
Pengikut

Strategi Persilangan Purata Pergerakan Eksponen Tempoh Berbilang Masa

Gambaran keseluruhan

Strategi crossover rata-rata bergerak indeks pelbagai tempoh adalah sistem perdagangan automatik berdasarkan tanda-tanda persilangan EMA. Ia menggunakan EMA dalam tempoh masa yang berbeza untuk menghasilkan isyarat perdagangan dan menggabungkan mekanisme hentian kerugian dan keuntungan untuk menguruskan risiko. Strategi ini bergantung kepada peluang perdagangan yang berpotensi untuk mengenal pasti persilangan antara EMA cepat dan EMA perlahan dan EMA tempoh masa yang lebih tinggi.

Prinsip Strategi

Prinsip teras strategi ini adalah menggunakan purata bergerak indeks ((EMA) untuk beberapa tempoh masa untuk mengenal pasti trend pasaran dan menghasilkan isyarat perdagangan. Secara khusus:

  1. Menggunakan 9 kitaran EMA sebagai garis pantas, 50 kitaran EMA sebagai garis perlahan, dan 100 kitaran EMA pada kitaran masa 15 minit sebagai garis rujukan kitaran masa yang lebih tinggi.

  2. Syarat untuk membeli isyarat:

    • EMA yang cepat melintasi EMA yang perlahan, dan EMA yang cepat terletak di atas EMA tempoh masa yang lebih tinggi; atau
    • Tempoh EMA lebih cepat daripada EMA yang lebih tinggi.
  3. Syarat untuk menjual isyarat:

    • EMA pantas di bawah EMA perlahan, dan EMA pantas berada di bawah EMA tempoh masa yang lebih tinggi; atau
    • EMA pantas melalui tempoh masa yang lebih tinggi di bawah EMA.
  4. Pengurusan urus niaga:

    • Tetapkan sasaran berhenti rugi (SL) dan keuntungan (TP) tetap.
    • Apabila harga mencapai sasaran keuntungan pertama (TP1), posisi 25% ditukar dan stop loss akan dipindahkan ke kedudukan perlindungan.
    • Kedudukan yang tersisa terus berjalan ke sasaran keuntungan kedua ((TP2) atau stop loss)).
  5. Pengendalian masa transaksi:

    • Anda boleh menetapkan tempoh dagangan dan hari dagangan tertentu.

Kelebihan Strategik

  1. Analisis tempoh masa berbilang: EMA yang digabungkan dengan tempoh masa yang berbeza membantu mengurangkan isyarat palsu dan meningkatkan kualiti perdagangan.

  2. Pengesanan Trend: Menggunakan EMA Crossover dan Hubungan Lokasi untuk menangkap trend pasaran secara berkesan.

  3. Pengurusan risiko: Menggunakan strategi stop loss tetap dan keuntungan beransur-ansur, yang mengehadkan potensi kerugian dan membenarkan keuntungan terus berkembang.

  4. Fleksibiliti: Parameter EMA, tahap stop loss dan keuntungan boleh disesuaikan mengikut pasaran dan gaya dagangan yang berbeza.

  5. Automasi: Strategi boleh melakukan perdagangan automatik sepenuhnya melalui platform TradingView dan PineConnector.

  6. Pengurusan masa: anda boleh menetapkan masa dan hari perdagangan tertentu untuk mengelakkan perdagangan dalam keadaan pasaran yang tidak menguntungkan.

Risiko Strategik

  1. Keterlambatan: EMA pada dasarnya merupakan penunjuk keterlambatan yang mungkin tidak bertindak balas dalam pasaran yang bergolak.

  2. Isyarat palsu: Dalam pasaran setapak, persilangan EMA boleh menghasilkan isyarat palsu yang kerap, yang menyebabkan perdagangan berlebihan.

  3. Hentian tetap: Hentian yang menggunakan nombor titik tetap mungkin tidak sesuai untuk semua keadaan pasaran, kadang-kadang mungkin terlalu besar atau terlalu kecil.

  4. Bergantung kepada data sejarah: Keberkesanan strategi sangat bergantung kepada tingkah laku pasaran semasa pengkajian semula, dan prestasi masa depan mungkin berbeza.

  5. Kebolehan beradaptasi pasaran: Strategi ini berfungsi dengan baik untuk beberapa pasangan mata wang, tetapi mungkin tidak berfungsi dengan baik untuk pasangan mata wang lain.

Arah pengoptimuman strategi

  1. Penyesuaian parameter dinamik: pertimbangkan untuk menyesuaikan kitaran EMA, tahap stop loss dan keuntungan mengikut dinamik turun naik pasaran.

  2. Menambah syarat penapisan: pengenalan penunjuk teknikal tambahan atau penunjuk sentimen pasaran untuk menapis isyarat perdagangan dan mengurangkan isyarat palsu.

  3. Meningkatkan strategi hentikan kerugian: mewujudkan hentikan yang dijejaki atau hentikan dinamik berdasarkan ATR untuk menyesuaikan diri dengan lebih baik dengan turun naik pasaran.

  4. Mengoptimumkan masa dagangan: melakukan analisis masa yang lebih terperinci untuk mencari masa dan tarikh dagangan terbaik.

  5. Meningkatkan pengurusan jumlah dagangan: menyesuaikan saiz kedudukan mengikut turun naik pasaran dan risiko akaun.

  6. Analisis korelasi pelbagai mata wang: mempertimbangkan korelasi antara beberapa pasangan mata wang untuk mengelakkan pendedahan berlebihan kepada risiko pasaran yang serupa.

  7. Integrasi pembelajaran mesin: Mengoptimumkan pemilihan parameter dan proses penjanaan isyarat menggunakan algoritma pembelajaran mesin.

ringkaskan

Strategi crossover rata-rata bergerak indeks pelbagai tempoh masa adalah sistem perdagangan automatik yang menggabungkan trend pemantauan dan pengurusan risiko. Strategi ini bertujuan untuk menangkap trend pasaran dan melakukan perdagangan pada masa yang sesuai dengan memanfaatkan isyarat EMA yang berlainan tempoh masa. Walaupun strategi ini berkinerja baik dalam keadaan pasaran tertentu, terdapat beberapa risiko dan batasan yang wujud.

Kod 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