EMA Melacak Tren Menekan Strategi Osilasi

Penulis:ChaoZhang, Tanggal: 2023-12-12 15:52:37
Tag:

img

Gambaran umum

Strategi ini menggabungkan keuntungan dari tiga indikator: EMA, Strategi Pelacakan Tren (TTS) dan Siklus Tren Schaff (STC) untuk membentuk strategi pelacakan tren jangka pendek yang kuat. Secara khusus, strategi akan menilai apakah sinyal beli dan jual dari tiga indikator konsisten. Jika konsisten, sinyal perdagangan akan dihasilkan; jika tidak, tidak akan ada perdagangan yang dilakukan. Ini menyaring beberapa sinyal palsu dan membuat strategi lebih dapat diandalkan.

Prinsip Strategi

Strategi ini terdiri dari tiga bagian utama: indikator EMA, strategi pelacakan tren TTS dan indikator STC.

Pertama, garis rata-rata bergerak EMA eksponensial 200 periode dihitung. Jika harga di bawah garis EMA ini, indikator EMA memberikan sinyal jual: -1; jika harga di atas garis, indikator EMA memberikan sinyal beli: 1.

Kedua, parameter yang relevan dari strategi pelacakan tren TTS dihitung. Menurut price breakout dari rel atas dan bawah, arah tren pasar ditentukan. Jika harga menembus rel atas, sinyal beli 1 dihasilkan; jika harga menembus rel bawah, sinyal jual -1 dihasilkan.

Akhirnya, indikator Siklus Tren Schaff (STC) dihitung, yang mencerminkan tren perubahan konsolidasi harga. Jika indikator STC naik, itu menghasilkan sinyal beli 1; jika indikator STC turun, itu menghasilkan sinyal jual -1.

Setelah mendapatkan sinyal penilaian dari ketiga indikator, strategi akan menentukan apakah mereka konsisten. Hanya ketika ketiga indikator sinyal penilaian konsisten sinyal perdagangan yang sebenarnya akan dihasilkan. Ini dapat secara efektif menyaring beberapa sinyal palsu dan membuat strategi lebih dapat diandalkan.

Setelah ditentukan untuk menghasilkan sinyal perdagangan, posisi panjang atau pendek akan dibuka dan titik stop-profit/stop-loss akan ditetapkan.

Keuntungan

  1. Strategi ini menggabungkan tiga jenis indikator yang berbeda untuk secara efektif menentukan arah tren pasar.

  2. Menggunakan konsistensi sinyal penilaian dari tiga indikator untuk menyaring sinyal palsu dapat mengurangi perdagangan yang tidak perlu dan membuat strategi lebih andal.

  3. Menetapkan titik stop-profit/stop-loss yang wajar dapat mengunci keuntungan dan mencegah kerugian berkembang.

  4. Parameter yang dioptimalkan cocok untuk sebagian besar saham dan produk forex.

  5. Logika perdagangan yang sederhana dan mudah dipahami.

Risiko

  1. Ketidakkonsistenan antara penilaian indikator dapat menyebabkan hilangnya peluang perdagangan.

  2. Indikator STC sensitif terhadap parameter. produk yang berbeda membutuhkan pengaturan parameter.

  3. Dalam downtrends, stop loss dapat ditembus, menyebabkan kerugian besar. Stop loss adaptif dapat dipertimbangkan.

  4. Konsolidasi samping tidak dapat diidentifikasi secara efektif, yang mengarah pada posisi perangkap.

Peningkatan

  1. Uji lebih banyak kombinasi indikator untuk menemukan aturan penilaian yang lebih kuat, misalnya menambahkan indikator RSI.

  2. Optimalkan parameter STC untuk adaptasi yang lebih baik di berbagai produk. Tambahkan modul optimasi parameter adaptif.

  3. Tingkatkan modul stop loss adaptif untuk mengoptimalkan titik stop loss secara dinamis.

  4. Tingkatkan modul penutupan posisi untuk mengidentifikasi jarak sisi dan menghindari perangkap.

  5. Mengoptimalkan algoritma untuk perdagangan frekuensi tinggi, mengurangi latensi dan meningkatkan tingkat pemenuhan pesanan.

Kesimpulan

Strategi ini menggabungkan indikator EMA, TTS dan STC untuk menentukan arah pasar, dengan penilaian yang konsisten dari ketiga perdagangan pemicu, secara efektif menyaring sinyal palsu. Masih ada ruang besar untuk optimasi, misalnya menguji lebih banyak kombinasi indikator, menambahkan algoritma adaptif, mengoptimalkan modul perdagangan frekuensi tinggi, dll, untuk lebih memperkuat kemampuan pelacakan tren. Dibandingkan dengan strategi tradisional yang hanya mengikuti moving average, strategi ini dapat menilai pasar dengan lebih cerdas, menangkap tren sambil menghindari jebakan.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")


Lebih banyak