Strategi purata bergerak adaptif gabungan pelbagai faktor


Tarikh penciptaan: 2023-12-15 11:30:09 Akhirnya diubah suai: 2023-12-15 11:30:09
Salin: 0 Bilangan klik: 622
1
fokus pada
1621
Pengikut

Strategi purata bergerak adaptif gabungan pelbagai faktor

I. Gambaran Strategik

Strategi bergerak rata-rata beradaptasi dengan pelbagai faktor adalah strategi gabungan yang menggabungkan penggunaan garis dalaman, purata bergerak, persilangan pengumpul dan garis rata-rata HA. Strategi ini bertujuan untuk mencari lebih banyak peluang perdagangan dan memperoleh keuntungan terkumpul yang lebih tinggi dalam pasaran lembu.

2. Prinsip Strategi

Logik utama strategi ini adalah untuk memberi isyarat dagangan dengan kekuatan yang berbeza berdasarkan hasil yang dipadankan dengan faktor yang berbeza, dengan menggunakan pelbagai petunjuk teknikal untuk menilai isyarat beli dan jual.

Khususnya, empat petanda teknikal utama yang digunakan dalam strategi ini ialah:

  1. Garis dalam. Strategi menggunakan warna garis dalam untuk menentukan trend harga, dua entiti hijau berturut-turut HA rata-rata adalah isyarat beli, dua garis merah berturut-turut kosong HA rata-rata adalah isyarat kosong.

  2. Rata-rata bergerak. Strategi menggunakan tiga set parameter yang berbeza, cepat, lambat, dan penapisan pada masa yang sama. Rata-rata bergerak memberi isyarat untuk membeli apabila garis pantas melintasi garis perlahan, dan garis perlahan melintasi garis geser; sebaliknya, memberi isyarat untuk menjual.

  3. Penunjuk Stochastic. Penunjuk ini menentukan masa persilangan polygon. Apabila % K garis menembusi % D garis dari arah bawah, untuk membeli isyarat; apabila ia menembusi dari arah atas, untuk menjual isyarat.

  4. Mekanisme penilaian sepadan. Strategi menggunakan mekanisme penilaian berdasarkan kes sepadan faktor-faktor yang disebutkan di atas. Semakin banyak faktor sepadan, semakin kuat isyarat yang sesuai.

Melalui penilaian pelbagai faktor, strategi dapat menangkap lebih banyak peluang perdagangan kecil dalam jangka masa sederhana dan pendek, yang menghasilkan keuntungan tambahan dalam pasaran lembu.

Ketiga, kelebihan strategi

Kelebihan terbesar strategi bergerak rata-rata beradaptasi dengan pelbagai faktor adalah meningkatkan kebolehpercayaan isyarat. Indikator teknikal tunggal mudah menjadi isyarat yang salah, dan strategi ini digunakan bersama-sama dengan pelbagai indikator untuk berpasangan, yang dapat mengurangkan gangguan isyarat palsu.

Selain itu, kombinasi pelbagai faktor dapat meningkatkan peluang perdagangan berbanding hanya mengikuti satu indikator. Dalam pasaran lembu, strategi dapat memperoleh keuntungan akumulatif yang lebih tinggi.

Risiko Strategik

Risiko utama strategi ini adalah bahawa kombinasi pelbagai faktor itu sendiri akan meningkatkan kerumitan strategi. Ia memerlukan pengaturan parameter untuk beberapa indikator, penyesuaian yang kerap, dan sebagainya.

Di samping itu, dalam pasaran beruang, tempoh memegang strategi mungkin terlalu lama. Walaupun dengan menetapkan hentian kerugian, sukar untuk mengelakkan kerugian yang lebih besar.

Selain itu, petunjuk teknikal seperti penunjuk Stochastic dan garis rata-rata HA mudah terjejas oleh kejadian yang tidak dijangka, mudah menghasilkan isyarat yang salah, yang menyebabkan kerugian yang tidak perlu.

Lima, Strategi Untuk Mengoptimumkan

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Optimumkan tetapan setiap parameter penunjuk untuk mencari kombinasi parameter yang optimum.

  2. Tambah modul latihan model dan penyesuaian parameter, parameter pengoptimuman masa nyata.

  3. Tambah strategi stop loss dan kurangkan strategi maksimum pulangan balik.

  4. Tambah modul kawalan kedudukan untuk menyesuaikan kedudukan secara dinamik mengikut keadaan pasaran.

  5. Model rangkaian saraf yang digabungkan dengan algoritma pembelajaran mesin untuk menilai pelbagai faktor.

VI

Kombinasi multi-faktor yang menyesuaikan diri dengan strategi purata bergerak menggabungkan kelebihan pelbagai petunjuk teknikal. Strategi ini dapat meningkatkan kualiti isyarat dengan berkesan dan memperoleh keuntungan tambahan dalam pasaran lembu. Tetapi ia juga meningkatkan kerumitan strategi yang memerlukan ujian dan pengoptimuman lebih lanjut.

Kod sumber strategi
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-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/
// © cyrule
//@version=4
strategy("2nd Grade Strategy", overlay=true, shorttitle="2GTS", max_lines_count = 500, max_labels_count = 500, calc_on_every_tick = true, calc_on_order_fills = true, pyramiding = 1, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

source = input(close, title = "Source")

// **********************
// * Heikin-Ahshi       *
// * kudos to garethyeo *
// **********************
showHA   = input(true, title = "Show Heikin Ashi?", group = "Heikin Ashi")
ha_open  = security(heikinashi(syminfo.tickerid), timeframe.period, open)
ha_high  = security(heikinashi(syminfo.tickerid), timeframe.period, high)
ha_low   = security(heikinashi(syminfo.tickerid), timeframe.period, low)
ha_close = security(heikinashi(syminfo.tickerid), timeframe.period, close)

bgcolor(iff(showHA and ha_open < ha_close , color.new(#53b987, transp = 92.5), na), title = 'Green HA')
bgcolor(iff(showHA and ha_open >= ha_close, color.new(#eb4d5c, transp = 92.5), na), title = 'Red HA'  )


// ******************
// * Moving Average *
// ******************
// MA Settings
showMA         = input(true, title = "Show Moving Averages?", group = "Moving Averages")
fastMALength   = input(title = "Fast MA Length", minval = 1, step = 1, defval = 20, group = "Moving Averages")
slowMALength   = input(title = "Slow MA Length", minval = 1, step = 1, defval = 50, group = "Moving Averages")
maType         = input(title = "Moving Average Type", defval = "SMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages")
filterMALength = input(title = "Filter MA Length", minval = 1, step = 1, defval = 200, group = "Moving Averages")
filterMAType   = input(title = "Filter MA Type", defval = "EMA", options = ["SMA", "EMA", "RMA", "WMA", "VWMA"], group = "Moving Averages")

// Calculate MA
var float maFast   = na
var float maSlow   = na
var float maFilter = na

if (maType   == "SMA")
    maFast   := sma(source, fastMALength)
    maSlow   := sma(source, slowMALength)
if (maType   == "EMA")
    maFast   := ema(source, fastMALength)
    maSlow   := ema(source, slowMALength)
if (maType   == "RMA")
    maFast   := rma(source, fastMALength)
    maSlow   := rma(source, slowMALength)
    maFilter := rma(source, filterMALength)
if (maType   == "WMA")
    maFast   := wma(source, fastMALength)
    maSlow   := wma(source, slowMALength)
if (maType   == "VWMA")
    maFast   := vwma(source, fastMALength)
    maSlow   := vwma(source, slowMALength)

if (filterMAType == "SMA")
    maFilter     := sma(source, filterMALength)
if (filterMAType == "EMA")
    maFilter     := ema(source, filterMALength)
if (filterMAType == "RMA")
    maFilter     := rma(source, filterMALength)
if (filterMAType == "WMA")
    maFilter     := wma(source, filterMALength)
if (filterMAType == "VWMA")
    maFilter     := vwma(source, filterMALength)

BiruAtasMerah = (maFast >= maSlow) and (maSlow >= maFilter)
MerahAtasBiru = (maFast <= maSlow) and (maSlow <= maFilter)

// Lukis MA
plot(series = showMA ? maFast   : na, color = color.blue, title = "MA Fast")
plot(series = showMA ? maSlow   : na, color = color.red,  title = "MA Slow")
plot(series = showMA ? maFilter : na, color = #FFCC00,    title = "MA Filter")


// **************
// * Stochastic *
// **************
// Stochastic Settings
showSSC = input(true, title = "Show Stochastic Crossovers?", group = "Stochastic")
Length = input (10, minval = 1, title = "%K Length", group = "Stochastic")
SmoothK = input (3, minval = 1, title = "%K Smoothing", group = "Stochastic")
SmoothD = input (3, minval = 1, title = "%D Smoothing", group = "Stochastic")

// Calculate Stochastic
var float K = na
var float D = na

if (maType ==  "SMA")
	K      := sma(stoch(source, high, low, Length), SmoothK)
	D      := sma(K, SmoothD)
if (maType ==  "EMA")
	K      := ema(stoch(source, high, low, Length), SmoothK)
	D      := ema(K, SmoothD)
if (maType ==  "RMA")
	K      := rma(stoch(source, high, low, Length), SmoothK)
	D      := rma(K, SmoothD)
if (maType ==  "WMA")
	K      := wma(stoch(source, high, low, Length), SmoothK)
	D      := wma(K, SmoothD)
if (maType ==  "VWMA")
	K      := vwma(stoch(source, high, low, Length), SmoothK)
	D      := vwma(K, SmoothD)

StochasticCrossOver  = crossover(K, D)
StochasticCrossUnder = crossunder(K, D)

// Lukis SS
plotshape(showSSC and StochasticCrossOver  and K <=  20            ? K : na, text = "Golden\nCrossover",  color = color.new(color.green, transp = 25), location = location.belowbar, size = size.tiny, title = "Golden Crossover" )
plotshape(showSSC and StochasticCrossUnder and K >=  80            ? D : na, text = "Deadly\nCrossover",  color = color.new(color.red, transp = 25),   location = location.belowbar, size = size.tiny, title = "Deadly Crossover" )
plotshape(showSSC and StochasticCrossOver  and K <=  80 and K > 20 ? K : na, text = "Bullish\nCrossover", color = color.new(color.green, transp = 50), location = location.belowbar, size = size.tiny, title = "Bullish Crossover")
plotshape(showSSC and StochasticCrossUnder and K >=  20 and K < 80 ? D : na, text = "Bearish\nCrossover", color = color.new(color.red, transp = 50),   location = location.belowbar, size = size.tiny, title = "Bearish Crossover")

showBull = input(true, title = "Show Bullish Signal?", group = "Signal")
showBear = input(false, title = "Show Bearish Signal?", group = "Signal")

bullishCriteria = 0
if (ha_open < ha_close) and (ha_open[1] < ha_close[1]) and (ha_open[2] >= ha_close[2])
    bullishCriteria := bullishCriteria + 1
if (maFast > maSlow) and (maSlow > maFilter)
    bullishCriteria := bullishCriteria + 1
if (K > D) and (K > K[1]) and (D > D[1])
    bullishCriteria := bullishCriteria + 1

bearishCriteria = 0
if (ha_open >= ha_close) and (ha_open[1] >= ha_close[1]) and (ha_open[2] < ha_close[2])
    bearishCriteria := bearishCriteria + 1
if (maFast < maSlow) and (maSlow < maFilter)
    bearishCriteria := bearishCriteria + 1
if (K < D) and (K < K[1]) and (D < D[1])
    bearishCriteria := bearishCriteria + 1

signal = color.new(color.white, transp = 0)
if bearishCriteria == 2
    signal := color.new(color.orange, transp = 50)
if bearishCriteria == 3
    signal := color.new(color.red, transp = 50)
if bullishCriteria == 2
    signal := color.new(color.aqua, transp = 50)
if bullishCriteria == 3
    signal := color.new(color.green, transp = 50)

bullishCriteria := showBull ? bullishCriteria : 0
bearishCriteria := showBear ? bearishCriteria : 0

bgcolor(iff(bullishCriteria > 1, signal, na), title = 'Bullish Signal')
bgcolor(iff(bearishCriteria > 1, signal, na), title = 'Bearish Signal')

longTPPerc  = input(title = "Take Profit Threshold (%)"            , minval = 0.0, step = 0.5, defval = 2.5, group = "Trading") / 100
profitRatio = input(title = "Profit-to-Loss ratio (risk tolerance)", minval = 1.0, step = 0.1, defval = 1.4, group = "Trading")
longSLPerc  = longTPPerc / profitRatio
takeProfit  = strategy.position_avg_price * (1 + longTPPerc)
stopLoss    = strategy.position_avg_price * (1 - longSLPerc)
strategy.initial_capital = 50000
strategy.entry("Long" , strategy.long , floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bullishCriteria > 1)
strategy.entry("Short", strategy.short, floor(strategy.initial_capital*.1/close), stop = strategy.position_avg_price * 1.25, when = bearishCriteria > 1)
strategy.close("Long" , when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss))
strategy.close("Short", when = (open >= takeProfit) or (open <= stopLoss) or (high >= takeProfit) or (low <= stopLoss))

plotshape(bullishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))
plotshape(bearishCriteria, location = location.belowbar, color = color.new(color.black, transp = 100))