EMA Mengesan Trend Menindas Strategi Osilasi

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

img

Ringkasan

Strategi ini menggabungkan kelebihan tiga penunjuk: EMA, Strategi Pengesanan Trend (TTS) dan Siklus Trend Schaff (STC) untuk membentuk strategi pengesanan trend jangka pendek yang kuat. Khususnya, strategi akan menilai sama ada isyarat beli dan jual ketiga-tiga penunjuk adalah konsisten. Jika mereka konsisten, isyarat perdagangan akan dihasilkan; jika tidak, tidak ada perdagangan akan dibuat. Ini menapis beberapa isyarat palsu dan menjadikan strategi lebih boleh dipercayai.

Prinsip Strategi

Strategi ini terdiri daripada tiga bahagian utama: penunjuk EMA, strategi pengesanan trend TTS dan penunjuk STC.

Pertama, garis purata bergerak eksponensial EMA 200-period dikira. Jika harga berada di bawah garis EMA ini, penunjuk EMA memberikan isyarat jual: -1; jika harga berada di atas garis, penunjuk EMA memberikan isyarat beli: 1.

Kedua, parameter yang berkaitan dengan strategi pengesanan trend TTS dikira. Mengikut penembusan harga rel atas dan bawah, arah trend pasaran ditentukan. Jika harga memecahkan rel atas, isyarat beli 1 dihasilkan; jika harga memecahkan rel bawah, isyarat jual -1 dihasilkan.

Akhirnya, penunjuk Siklus Trend Schaff (STC) dikira, yang mencerminkan trend perubahan penyatuan harga.

Selepas mendapatkan isyarat penilaian dari tiga penunjuk, strategi akan menentukan sama ada mereka konsisten. Hanya apabila ketiga-tiga isyarat penilaian penunjuk konsisten isyarat perdagangan sebenar akan dihasilkan. Ini dapat menapis beberapa isyarat palsu dengan berkesan dan menjadikan strategi lebih boleh dipercayai.

Setelah menentukan untuk menjana isyarat perdagangan, kedudukan panjang atau pendek akan dibuka dan titik berhenti keuntungan/henti kerugian akan ditetapkan.

Kelebihan

  1. Strategi ini menggabungkan tiga jenis penunjuk yang berbeza untuk menentukan arah trend pasaran dengan berkesan.

  2. Menggunakan konsistensi isyarat penilaian dari tiga penunjuk untuk menapis isyarat palsu boleh mengurangkan perdagangan yang tidak perlu dan menjadikan strategi lebih boleh dipercayai.

  3. Menetapkan titik berhenti keuntungan / berhenti kerugian yang munasabah dapat mengunci keuntungan dan mencegah kerugian berkembang.

  4. Parameter yang dioptimumkan sesuai untuk kebanyakan saham dan produk forex.

  5. Logik perdagangan yang mudah dan mudah difahami.

Risiko

  1. Ketidakkonsistenan antara penilaian penunjuk boleh menyebabkan kehilangan peluang perdagangan.

  2. STC indikator sensitif kepada parameter. produk yang berbeza memerlukan parameter tuning.

  3. Dalam trend menurun, stop loss boleh ditembusi, menyebabkan kerugian besar.

  4. Penyatuan sampingan tidak dapat dikenal pasti dengan berkesan, yang membawa kepada kedudukan perangkap.

Peningkatan

  1. Uji lebih banyak kombinasi penunjuk untuk mencari peraturan penilaian yang lebih kukuh, contohnya menambah penunjuk RSI.

  2. Mengoptimumkan parameter STC untuk penyesuaian yang lebih baik di pelbagai produk. Tambah modul pengoptimuman parameter adaptif.

  3. Tingkatkan modul stop loss adaptif untuk mengoptimumkan titik stop loss secara dinamik.

  4. Tingkatkan modul penutupan kedudukan untuk mengenal pasti jarak sisi dan mengelakkan perangkap.

  5. Mengoptimumkan algoritma untuk perdagangan frekuensi tinggi, mengurangkan latensi dan meningkatkan kadar pemenuhan pesanan.

Kesimpulan

Strategi ini menggabungkan penunjuk EMA, TTS dan STC untuk menentukan arah pasaran, dengan penghakiman yang konsisten dari ketiga-tiga perdagangan pencetus, dengan berkesan menapis isyarat palsu. Masih ada ruang yang besar untuk pengoptimuman, misalnya menguji lebih banyak kombinasi penunjuk, menambah algoritma adaptif, mengoptimumkan modul perdagangan frekuensi tinggi, dan lain-lain, untuk lebih mengukuhkan keupayaan penjejakan trend. Berbanding dengan strategi tradisional hanya mengikut purata bergerak, strategi ini dapat menilai pasaran dengan lebih bijak, menangkap trend sambil mengelakkan perangkap.


/*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 lanjut