Strategi Purata Pergerakan Terobosan Ke Atas Lingkaran


Tarikh penciptaan: 2024-01-15 11:45:23 Akhirnya diubah suai: 2024-01-15 11:45:23
Salin: 0 Bilangan klik: 540
1
fokus pada
1617
Pengikut

Strategi Purata Pergerakan Terobosan Ke Atas Lingkaran

Gambaran keseluruhan

Strategi ini menggabungkan indikator spiral dan indikator kadar selisih untuk menghasilkan isyarat beli apabila harga menembusi garis lintasan atas dan garis rata. Begitu juga, apabila harga menembusi garis lintasan bawah dan garis rata, menghasilkan isyarat jual. Strategi ini menggunakan saluran spiral untuk menentukan arah trend harga dan menggunakan indikator kadar selisih untuk mengesan tenaga harga, menghasilkan isyarat perdagangan berdasarkan pengesahan kedua-dua indikator pada masa yang sama, untuk mendapatkan peluang yang lebih baik.

Prinsip Strategi

Strategi ini berdasarkan kepada dua indikator:

  1. Saluran Spiral: mengira garis bawah untuk menentukan arah trend harga. Apabila harga menembusi arah atas, ia naik, dan apabila ia menembusi arah bawah, ia turun.

  2. Penunjuk kadar perbezaan ((ROC): mengesan sama ada harga sedang meningkat, digunakan untuk menilai tenaga harga. Apabila ROC lebih besar daripada nilai positif, harga meningkat pesat, dan jika lebih kecil daripada nilai negatif, harga menurun pesat.

Sinyal beli dihasilkan apabila saluran spiral dan penunjuk kadar selisih menghantar isyarat berbilang arah pada masa yang sama. Iaitu, harga harus meletupkan ke atas dan menunjukkan tanda-tanda percepatan ke atas pada masa yang sama. Logik menghasilkan isyarat jual juga serupa.

Kombinasi ini dapat meningkatkan kebolehpercayaan isyarat dan mengelakkan perdagangan buta tanpa trend yang jelas.

Kelebihan Strategik

  1. Keseluruhan penilaian trend harga dan tenaga, isyarat lebih dipercayai, kadar kemenangan lebih tinggi.

  2. Dengan pengoptimuman parameter, frekuensi perdagangan strategi boleh disesuaikan. Sebagai contoh, menyesuaikan parameter indikator kadar lebihan, untuk mengawal kepekaan pembukaan kedudukan.

  3. Menggunakan stop loss untuk mengawal kerugian tunggal. Parameter boleh disesuaikan.

  4. Mekanisme kemasukan semula dapat menjejaki trend dan meningkatkan keuntungan.

Risiko Strategik

  1. “Saya tidak tahu apa-apa tentang apa yang berlaku di Malaysia, tetapi saya tidak tahu apa-apa tentang apa yang berlaku di Malaysia.

  2. Strategi yang berlainan jenis mudah terjebak. Apabila harga berbalik, ia boleh membawa kepada kerugian yang lebih besar.

  3. Tetapan parameter yang tidak betul boleh menyebabkan isyarat perdagangan terlalu kerap atau jarang.

  4. Stop loss peratusan tetap tidak dapat sepenuhnya mengelakkan kerugian tunggal yang lebih besar.

Arah pengoptimuman strategi

  1. Uji parameter untuk penunjuk kadar perbezaan untuk mencari kombinasi parameter terbaik.

  2. Uji tahap hentian yang berbeza untuk mengimbangi nisbah kemenangan dan kerugian.

  3. Tambah penapis penunjuk lain, seperti penunjuk kapasiti, penunjuk gegaran, dan lain-lain, untuk meningkatkan kualiti isyarat.

  4. Kajian pasaran yang berbeza untuk mencari varieti yang paling sesuai dengan strategi tersebut.

  5. Pengurusan kedudukan yang dioptimumkan dalam strategi, menggunakan kedudukan yang berbeza dalam keadaan pasaran yang berbeza.

ringkaskan

Strategi ini menggabungkan penggunaan saluran spiral dan indikator kadar perbezaan untuk menilai trend dan momentum harga, serta keupayaan untuk mengekalkan keuntungan melalui kemasukan semula dan pengoptimuman parameter, sambil memastikan kualiti isyarat perdagangan. Pengendalian risiko dengan peratusan berhenti tetap boleh dioptimumkan lebih lanjut. Secara keseluruhannya, strategi ini lebih lengkap dan sesuai sebagai rangka kerja asas untuk perdagangan kuantitatif.

Kod sumber strategi
/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SSL Chaikin BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// Chaikin MF /////////////// 
_1 = input(false,  "═══════ Chaikin MF ═══════")
length = input(20, minval=1, title = "Chaikin SMA Length")
upperThreshold = input(0.04, step=0.01, title="Upper Threshold")
lowerThreshold = input(0.02, step=0.01, title="Lower Threshold")
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, length) / sum(volume, length)

/////////////// SSL Channels /////////////// 
_2 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(13, "ROC Length",  minval=1)
pcntChange = input(4, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

///////////////  Strategy  /////////////// 
long = sslUp > sslDown and isMoving() or crossover(mf, upperThreshold)
short = sslUp < sslDown and isMoving() or crossunder(mf, lowerThreshold)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

//////////////// Stop loss /////////////// 
_4 = input(false,  "════════ Stop Loss ═══════")
sl_inp = input(2.0, title='Stop Loss %') / 100

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
p1 = plot(sslDown, linewidth = 1, color=color.red)
p2 = plot(sslUp, linewidth = 1, color=color.lime)
fill(p1, p2,  color = sslDown < sslUp ? color.lime : color.red, transp=80)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(crossover(mf, upperThreshold) ? color.blue : crossunder(mf, lowerThreshold) ? color.orange : na, transp=30)