Strategi Crossover Purata Bergerak Eksponen Multi-Timeframe ini adalah sistem perdagangan automatik berdasarkan isyarat crossover EMA. Ia menggunakan EMA dari jangka masa yang berbeza untuk menghasilkan isyarat perdagangan dan menggabungkan mekanisme stop-loss dan mengambil keuntungan untuk pengurusan risiko. Strategi ini terutamanya bergantung pada persilangan antara EMA yang cepat dan perlahan, serta EMA jangka masa yang lebih tinggi, untuk mengenal pasti peluang perdagangan yang berpotensi.
Prinsip utama strategi ini adalah menggunakan Purata Bergerak Eksponensial (EMA) dari pelbagai jangka masa untuk mengenal pasti trend pasaran dan menjana isyarat perdagangan.
Ia menggunakan EMA 9 tempoh sebagai garis pantas, EMA 50 tempoh sebagai garis perlahan, dan EMA 100 tempoh pada jangka masa 15 minit sebagai rujukan jangka masa yang lebih tinggi.
Syarat isyarat beli:
Syarat isyarat jual:
Pengurusan Perdagangan:
Kawalan masa dagangan:
Analisis pelbagai jangka masa: Menggabungkan EMA dari jangka masa yang berbeza membantu mengurangkan isyarat palsu dan meningkatkan kualiti perdagangan.
trend berikut: berkesan menangkap trend pasaran melalui EMA crossovers dan kedudukan relatif.
Pengurusan risiko: Menggunakan strategi stop-loss tetap dan mengambil keuntungan bertahap, mengehadkan potensi kerugian sambil membolehkan keuntungan berjalan.
Fleksibiliti: Parameter EMA, tahap stop-loss, dan mengambil keuntungan boleh diselaraskan untuk pasaran dan gaya perdagangan yang berbeza.
Automasi: Strategi boleh sepenuhnya automatik menggunakan platform TradingView dan PineConnector.
Pengurusan masa: Keupayaan untuk menetapkan jam dan hari dagangan tertentu untuk mengelakkan dagangan dalam keadaan pasaran yang tidak baik.
Lag: EMA secara semula jadi merupakan penunjuk yang tertinggal dan mungkin tidak bertindak balas dengan cepat dalam pasaran yang tidak menentu.
Isyarat palsu: Dalam pasaran yang berbeza, persilangan EMA boleh menghasilkan isyarat palsu yang kerap, yang membawa kepada overtrading.
Stop-loss tetap: Menggunakan stop-loss titik tetap mungkin tidak sesuai untuk semua keadaan pasaran, kadangkala terlalu besar atau terlalu kecil.
Ketergantungan pada data sejarah: Keberkesanan strategi sangat bergantung kepada tingkah laku pasaran semasa tempoh backtesting, yang mungkin berbeza pada masa akan datang.
Kemudahan penyesuaian pasaran: Walaupun strategi ini berfungsi dengan baik pada beberapa pasangan mata wang, ia mungkin tidak berkesan pada yang lain.
Penyesuaian parameter dinamik: Pertimbangkan penyesuaian dinamik tempoh EMA, tahap stop-loss, dan mengambil keuntungan berdasarkan turun naik pasaran.
Syarat penapisan tambahan: Memperkenalkan penunjuk teknikal atau sentimen tambahan untuk menapis isyarat perdagangan dan mengurangkan positif palsu.
Strategi stop-loss yang lebih baik: Melaksanakan stop trailing atau stop-loss dinamik berasaskan ATR untuk menyesuaikan diri dengan lebih baik dengan turun naik pasaran.
Mengoptimumkan masa dagangan: Melakukan analisis masa yang lebih terperinci untuk mencari waktu dan tarikh dagangan yang terbaik.
Pengukuran kedudukan yang lebih baik: Sesuaikan saiz kedudukan berdasarkan turun naik pasaran dan risiko akaun.
Analisis korelasi pelbagai mata wang: Pertimbangkan korelasi antara beberapa pasangan mata wang untuk mengelakkan pendedahan berlebihan kepada risiko pasaran yang sama.
Integrasi pembelajaran mesin: Gunakan algoritma pembelajaran mesin untuk mengoptimumkan pemilihan parameter dan proses penjanaan isyarat.
Strategi Crossover Purata Bergerak Eksponen Multi-Timeframe adalah sistem perdagangan automatik yang menggabungkan trend berikut dengan pengurusan risiko. Dengan memanfaatkan isyarat crossover EMA dari jangka masa yang berbeza, strategi ini bertujuan untuk menangkap trend pasaran dan melaksanakan perdagangan pada masa yang sesuai. Walaupun strategi ini berfungsi dengan baik di bawah keadaan pasaran tertentu, ia masih mempunyai risiko dan batasan yang melekat. Untuk meningkatkan lagi kekuatan dan kesesuaian strategi, pertimbangan boleh dibuat untuk memperkenalkan penyesuaian parameter dinamik, keadaan penapisan tambahan, dan teknik pengurusan risiko yang lebih canggih. Secara keseluruhan, strategi ini menyediakan titik permulaan yang kukuh untuk peniaga kuantitatif, yang boleh dioptimumkan dan disesuaikan dengan lebih lanjut mengikut keperluan individu dan ciri pasaran.
/*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