
Idea teras strategi ini adalah untuk menghasilkan isyarat perdagangan berdasarkan silang beberapa purata bergerak indeks (EMA). Apabila EMA jangka pendek memakai EMA jangka panjang, lakukan lebih banyak; apabila EMA jangka pendek memakai EMA jangka panjang, kosong. Strategi ini membolehkan konfigurasi beberapa kitaran EMA, setiap EMA boleh diaktifkan secara berasingan, strategi ini akan melakukan perdagangan silang pada semua EMA yang diaktifkan.
Strategi ini menetapkan lapan kitaran EMA, iaitu 8th line, 13th line, 21st line, 34th line, 55th line, 89th line, 144th line, dan 233th line. EMA ini dikonfigurasi untuk diaktifkan atau dimatikan secara berasingan.
Apabila EMA yang lebih pendek dari bawah menembusi EMA yang lebih lama, ia menghasilkan isyarat beli; apabila EMA yang lebih pendek dari atas menembusi EMA yang lebih lama dari bawah, ia menghasilkan isyarat jual. Jika kedua-dua EMA diaktifkan, shorterEMA > longerEMA adalah isyarat ganda, dan shorterEMA < longerEMA adalah isyarat kosong.
Sebagai contoh, jika EMA 55 hari dan EMA 89 hari diaktifkan, lakukan lebih banyak apabila EMA 55 hari di atas memakai EMA 89 hari; apabila EMA 55 hari di bawah memakai EMA 89 hari. Ini membolehkan strategi ini secara dinamik menyesuaikan kombinasi EMA yang digunakan, beralih dari kitaran yang lebih lama ke kitaran yang lebih pendek, atau sebaliknya.
Jumlah pegangan yang ditetapkan sebagai hak dan faedah akaun yang dibahagikan dengan menutup dan dibahagikan dengan jumlah kumpulan EMA yang diaktifkan. Ini memastikan bahawa saiz kedudukan pada setiap EMA adalah sama.
Anda boleh mempertimbangkan untuk menggunakan EMA dalam kombinasi dengan indikator lain, seperti indikator corong atau indikator goyah untuk memfilter isyarat, atau menggabungkan trend dan indikator pembalikan. Selain itu, pengoptimuman parameter EMA sangat penting dan perlu disesuaikan dengan pasaran yang berbeza.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Pengoptimuman parameter EMA. Kombinasi parameter EMA yang terbaik boleh didapati melalui pengimbas parameter dan kaedah Analisis Walk Forward.
Menambah syarat penapisan. Anda boleh menambah syarat penapisan tambahan untuk mengelakkan isyarat salah semasa EMA bersilang, seperti penapisan jumlah transaksi, penapisan kadar turun naik, dan sebagainya.
Ia boleh digabungkan dengan MACD, KDJ, Burin dan lain-lain untuk memanfaatkan keserasian mereka.
Kedudukan yang disesuaikan secara dinamik. Kedudukan pada setiap EMA boleh disesuaikan secara dinamik mengikut turun naik pasaran atau kekuatan trend.
Pengoptimuman nisbah keuntungan dan kerugian: mengoptimumkan tahap stop loss, mencari nisbah risiko dan ganjaran yang terbaik.
Strategi ini secara keseluruhannya sangat mudah dan langsung, menangkap trend jangka pendek dan jangka menengah melalui penyambungan EMA. Kelebihannya terletak pada kemampuan dan fleksibiliti yang tinggi, yang membolehkan peniaga memilih kombinasi EMA yang paling sesuai untuknya. Tetapi EMA sebagai satu indikator mudah menghasilkan isyarat yang salah, yang merupakan risiko terbesar strategi ini.
/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("EMA Fan", shorttitle = "EMA Fan", overlay=true)
// Revision: 1
// Author: @ToS_MavericK
buyprice = 0.0
buyprice := buyprice[1]
// === INPUT SMA ===
EMA1 = input(8)
EMA2 = input(13)
EMA3 = input(21)
EMA4 = input(34)
EMA5 = input(55)
EMA6 = input(89)
EMA7 = input(144)
EMA8 = input(233)
EnableEMA1 = input(true)
EnableEMA2 = input(true)
EnableEMA3 = input(true)
EnableEMA4 = input(true)
EnableEMA5 = input(true)
EnableEMA6 = input(true)
EnableEMA7 = input(true)
EnableEMA8 = input(true)
//Profit = input(defval = 5, type = integer, title = "Profit", minval = 1, step = 1)
//StopLoss = input(defval = 15, type = integer, title = "StopLoss", minval = 1, step = 1)
// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2018, title = "From Year", minval = 2012)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 2020, title = "To Year", minval = 2012)
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => true // create function "within window of time"
// === SERIES SETUP ===
vEMA1 = ema(close, EMA1)
vEMA2 = ema(close, EMA2)
vEMA3 = ema(close, EMA3)
vEMA4 = ema(close, EMA4)
vEMA5 = ema(close, EMA5)
vEMA6 = ema(close, EMA6)
vEMA7 = ema(close, EMA7)
vEMA8 = ema(close, EMA8)
count = -1
if (EnableEMA1 == true)
count := count + 1
if (EnableEMA2 == true)
count := count + 1
if (EnableEMA3 == true)
count := count + 1
if (EnableEMA4 == true)
count := count + 1
if (EnableEMA5 == true)
count := count + 1
if (EnableEMA6 == true)
count := count + 1
if (EnableEMA7 == true)
count := count + 1
if (EnableEMA8 == true)
count := count + 1
// set position size
Amount = 1 / (close * count)
// === EXECUTION ===
strategy.entry("EMA1", strategy.long, qty = Amount, when = window() and crossover(vEMA1,vEMA2) and EnableEMA1 and EnableEMA2)
strategy.close("EMA1", time > finish or crossunder(vEMA1,vEMA2))
strategy.entry("EMA2", strategy.long, qty = Amount, when = window() and crossover(vEMA2,vEMA3) and EnableEMA2 and EnableEMA3)
strategy.close("EMA2", time > finish or crossunder(vEMA2,vEMA3))
strategy.entry("EMA3", strategy.long, qty = Amount, when = window() and crossover(vEMA3,vEMA4) and EnableEMA3 and EnableEMA4)
strategy.close("EMA3", time > finish or crossunder(vEMA3,vEMA4))
strategy.entry("EMA4", strategy.long, qty = Amount, when = window() and crossover(vEMA4,vEMA5) and EnableEMA4 and EnableEMA5)
strategy.close("EMA4", time > finish or crossunder(vEMA4,vEMA5))
strategy.entry("EMA5", strategy.long, qty = Amount, when = window() and crossover(vEMA5,vEMA6) and EnableEMA5 and EnableEMA6)
strategy.close("EMA5", time > finish or crossunder(vEMA5,vEMA6))
strategy.entry("EMA6", strategy.long, qty = Amount, when = window() and crossover(vEMA6,vEMA7) and EnableEMA6 and EnableEMA7)
strategy.close("EMA6", time > finish or crossunder(vEMA6,vEMA7))
strategy.entry("EMA7", strategy.long, qty = Amount, when = window() and crossover(vEMA7,vEMA8) and EnableEMA7 and EnableEMA8)
strategy.close("EMA7", time > finish or crossunder(vEMA7,vEMA8))
plot(vEMA1, title = 'EMA1', color = red, linewidth = 2, style = line) // plot FastMA
plot(vEMA2, title = 'EMA2', color = orange, linewidth = 2, style = line) // plot SlowMA
plot(vEMA3, title = 'EMA3', color = yellow, linewidth = 2, style = line) // plot SlowMA
plot(vEMA4, title = 'EMA4', color = green, linewidth = 2, style = line) // plot SlowMA
plot(vEMA5, title = 'EMA5', color = teal, linewidth = 2, style = line) // plot SlowMA
plot(vEMA6, title = 'EMA6', color = blue, linewidth = 2, style = line) // plot SlowMA
plot(vEMA7, title = 'EMA7', color = maroon, linewidth = 2, style = line) // plot SlowMA
plot(vEMA8, title = 'EMA8', color = white, linewidth = 2, style = line) // plot SlowMA
//plot(long_stop, title = 'High-ATR', color = red, linewidth = 2, style = line) // plot SlowMA
//plot(short_stop, title = 'Low+ATR', color = green, linewidth = 2, style = line) // plot SlowMA