Triangular Moving Average (TMA) Crossover trading strategy adalah strategi analisis teknikal yang tipikal. Ia menggunakan tiga garis purata bergerak dengan panjang masa yang berbeza untuk menangkap trend dan melaksanakan perdagangan berisiko rendah. Apabila purata bergerak jangka pendek melintasi purata bergerak jangka sederhana ke atas, dan purata bergerak jangka sederhana berada di atas purata bergerak jangka panjang, isyarat beli dihasilkan. Apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka sederhana ke bawah, dan purata bergerak jangka sederhana berada di bawah purata bergerak jangka panjang, isyarat jual dihasilkan.
Strategi TMA terutamanya bergantung pada tiga garis purata bergerak untuk menentukan arah trend. purata bergerak jangka pendek bertindak balas dengan sensitif terhadap perubahan harga; purata bergerak jangka sederhana memberikan penilaian yang lebih jelas mengenai trend; purata bergerak jangka panjang menapis bunyi pasaran dan menentukan arah trend jangka panjang.
Apabila purata bergerak jangka pendek melintasi purata bergerak jangka sederhana ke atas, ia menunjukkan harga telah mula pecah ke atas. Pada masa ini, jika purata bergerak jangka sederhana di atas purata bergerak jangka panjang, ini bermakna pasaran semasa berada dalam trend menaik. Oleh itu, isyarat beli dihasilkan di sini.
Sebaliknya, apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka sederhana ke bawah, ia menunjukkan harga telah mula pecah ke bawah. Pada masa ini, jika purata bergerak jangka sederhana di bawah purata bergerak jangka panjang, ini bermakna pasaran semasa berada dalam trend menurun. Akibatnya, isyarat jual dihasilkan.
Strategi ini juga menetapkan garis stop-loss dan take-profit. Selepas memasuki perdagangan, harga stop-loss dan take-profit akan dikira berdasarkan tetapan peratusan. Jika harga menyentuh mana-mana garis, kedudukan akan ditutup.
Isyarat yang salah apabila tiga MA mengumpul
Penyelesaian: Sesuaikan parameter MA dengan betul untuk mengelakkan isyarat yang salah
Peratusan Stop Loss/Take Profit yang terlalu agresif
Penyelesaian: Peratusan yang halus; tidak boleh terlalu besar atau terlalu kecil
Tetapan parameter yang tidak betul yang membawa kepada terlalu banyak atau terlalu sedikit perdagangan
Penyelesaian: Uji kombinasi parameter yang berbeza untuk mencari optimum
Strategi TMA boleh dioptimumkan dari aspek berikut:
Uji kombinasi jenis dan panjang yang berbeza untuk mencari optimum
Uji kombinasi panjang atau jenis MA yang berbeza untuk hasil terbaik
Tambah penunjuk teknikal lain sebagai penapis isyarat
Tambah penunjuk seperti KDJ, MACD dll untuk pengesahan pelbagai faktor
Pilih parameter berdasarkan ciri produk
Memendekkan tempoh MA untuk produk mudah menguap; Memperpanjang tempoh untuk produk stabil
Menggunakan pembelajaran mesin untuk mencari parameter optimum
Parameter automatik menyapu untuk dengan cepat mencari optimum
Strategi TMA Crossover adalah strategi trend berikut yang mudah digunakan secara keseluruhan. Ia menggunakan tiga MA bersama-sama untuk menangkap trend dan menetapkan stop-loss / mengambil keuntungan untuk mengawal risiko, membolehkan keuntungan yang stabil. Penambahbaikan lanjut dapat dicapai melalui pengoptimuman parameter dan mengintegrasikan penunjuk teknikal tambahan.
/*backtest start: 2024-01-08 00:00:00 end: 2024-01-15 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5) // // author: Kozlod // date: 2018-03-25 // //////////// // INPUTS // //////////// ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA']) short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1) short_ma_src = input(title = "Short MA Source", defval = close) medium_ma_len = input(title = "Medium MA Length", defval = 20, minval = 2) medium_ma_src = input(title = "Medium MA Source", defval = close) long_ma_len = input(title = "Long MA Length", defval = 100, minval = 3) long_ma_src = input(title = "Long MA Source", defval = close) sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) // Set initial values to 0 short_ma = 0.0 long_ma = 0.0 medium_ma = 0.0 // Simple Moving Average (SMA) if ma_type == 'SMA' short_ma := sma(short_ma_src, short_ma_len) medium_ma := sma(medium_ma_src, medium_ma_len) long_ma := sma(long_ma_src, long_ma_len) // Exponential Moving Average (EMA) if ma_type == 'EMA' short_ma := ema(short_ma_src, short_ma_len) medium_ma := ema(medium_ma_src, medium_ma_len) long_ma := ema(long_ma_src, long_ma_len) // Weighted Moving Average (WMA) if ma_type == 'WMA' short_ma := wma(short_ma_src, short_ma_len) medium_ma := wma(medium_ma_src, medium_ma_len) long_ma := wma(long_ma_src, long_ma_len) // Hull Moving Average (HMA) if ma_type == 'HMA' short_ma := wma(2*wma(short_ma_src, short_ma_len / 2) - wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len))) medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len))) long_ma := wma(2*wma(long_ma_src, long_ma_len / 2) - wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len))) // Volume-weighted Moving Average (VWMA) if ma_type == 'VWMA' short_ma := vwma(short_ma_src, short_ma_len) medium_ma := vwma(medium_ma_src, medium_ma_len) long_ma := vwma(long_ma_src, long_ma_len) // Smoothed Moving Average (SMMA) if ma_type == 'SMMA' short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len // Double Exponential Moving Average (DEMA) if ma_type == 'DEMA' e1_short = ema(short_ma_src , short_ma_len) e1_medium = ema(medium_ma_src, medium_ma_len) e1_long = ema(long_ma_src, long_ma_len) short_ma := 2 * e1_short - ema(e1_short, short_ma_len) medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len) long_ma := 2 * e1_long - ema(e1_long, long_ma_len) ///////////// // SIGNALS // ///////////// long_signal = crossover( short_ma, medium_ma) and medium_ma > long_ma short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma // Calculate PT/SL levels // Initial values last_signal = 0 prev_tr_price = 0.0 pt_level = 0.0 sl_level = 0.0 // Calculate previous trade price prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na // Calculate SL/PT levels pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na // Calculate if price hit sl/pt long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level // What is last active trade? last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1]) ////////////// // PLOTTING // ////////////// // Plot MAs plot(short_ma, color = red, linewidth = 2) plot(medium_ma, color = green, linewidth = 2) plot(long_ma, color = yellow, linewidth = 2) // Plot Levels plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small) plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small) plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small) ////////////// // STRATEGY // ////////////// strategy.entry("long", true, when = long_signal) strategy.entry("short", false, when = short_signal) strategy.close("long", when = long_hit_pt or long_hit_sl) strategy.close("short", when = short_hit_pt or short_hit_sl)