
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 teras strategi ini adalah menggunakan purata bergerak indeks ((EMA) untuk beberapa tempoh masa untuk mengenal pasti trend pasaran dan menghasilkan isyarat perdagangan. Secara khusus:
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.
Syarat untuk membeli isyarat:
Syarat untuk menjual isyarat:
Pengurusan urus niaga:
Pengendalian masa transaksi:
Analisis tempoh masa berbilang: EMA yang digabungkan dengan tempoh masa yang berbeza membantu mengurangkan isyarat palsu dan meningkatkan kualiti perdagangan.
Pengesanan Trend: Menggunakan EMA Crossover dan Hubungan Lokasi untuk menangkap trend pasaran secara berkesan.
Pengurusan risiko: Menggunakan strategi stop loss tetap dan keuntungan beransur-ansur, yang mengehadkan potensi kerugian dan membenarkan keuntungan terus berkembang.
Fleksibiliti: Parameter EMA, tahap stop loss dan keuntungan boleh disesuaikan mengikut pasaran dan gaya dagangan yang berbeza.
Automasi: Strategi boleh melakukan perdagangan automatik sepenuhnya melalui platform TradingView dan PineConnector.
Pengurusan masa: anda boleh menetapkan masa dan hari perdagangan tertentu untuk mengelakkan perdagangan dalam keadaan pasaran yang tidak menguntungkan.
Keterlambatan: EMA pada dasarnya merupakan penunjuk keterlambatan yang mungkin tidak bertindak balas dalam pasaran yang bergolak.
Isyarat palsu: Dalam pasaran setapak, persilangan EMA boleh menghasilkan isyarat palsu yang kerap, yang menyebabkan perdagangan berlebihan.
Hentian tetap: Hentian yang menggunakan nombor titik tetap mungkin tidak sesuai untuk semua keadaan pasaran, kadang-kadang mungkin terlalu besar atau terlalu kecil.
Bergantung kepada data sejarah: Keberkesanan strategi sangat bergantung kepada tingkah laku pasaran semasa pengkajian semula, dan prestasi masa depan mungkin berbeza.
Kebolehan beradaptasi pasaran: Strategi ini berfungsi dengan baik untuk beberapa pasangan mata wang, tetapi mungkin tidak berfungsi dengan baik untuk pasangan mata wang lain.
Penyesuaian parameter dinamik: pertimbangkan untuk menyesuaikan kitaran EMA, tahap stop loss dan keuntungan mengikut dinamik turun naik pasaran.
Menambah syarat penapisan: pengenalan penunjuk teknikal tambahan atau penunjuk sentimen pasaran untuk menapis isyarat perdagangan dan mengurangkan isyarat palsu.
Meningkatkan strategi hentikan kerugian: mewujudkan hentikan yang dijejaki atau hentikan dinamik berdasarkan ATR untuk menyesuaikan diri dengan lebih baik dengan turun naik pasaran.
Mengoptimumkan masa dagangan: melakukan analisis masa yang lebih terperinci untuk mencari masa dan tarikh dagangan terbaik.
Meningkatkan pengurusan jumlah dagangan: menyesuaikan saiz kedudukan mengikut turun naik pasaran dan risiko akaun.
Analisis korelasi pelbagai mata wang: mempertimbangkan korelasi antara beberapa pasangan mata wang untuk mengelakkan pendedahan berlebihan kepada risiko pasaran yang serupa.
Integrasi pembelajaran mesin: Mengoptimumkan pemilihan parameter dan proses penjanaan isyarat menggunakan algoritma pembelajaran mesin.
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.
/*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