Sistem Pengesanan Trend Pengimbangan Kemudahan Dinamik

Penulis:ChaoZhang, Tarikh: 2024-01-26 14:41:08
Tag:

img

Ringkasan

Strategi ini mengintegrasikan sistem crossover purata bergerak eksponensial dan sistem perdagangan penyu, dua strategi perdagangan sistematik yang popular. Ia direka khas untuk jangka masa harian untuk mengesan trend pasaran dalam masa nyata dengan menguruskan kedudukan secara dinamik.

Logika Strategi

Strategi ini mengandungi dua sub-strategi: strategi trend dan strategi pecah.

Strategi trend menggunakan EMA pantas dan silang EMA perlahan sebagai isyarat perdagangan. Tempoh EMA pantas ditakrifkan oleh pengguna dan tempoh EMA perlahan adalah 5 kali daripada EMA pantas. Isyarat dihasilkan dengan membahagikan perbezaan EMA dengan penyimpangan standard pulangan 252 tempoh, yang disesuaikan dengan turun naik untuk menghasilkan isyarat yang lebih boleh dipercayai. Ia pergi panjang atau pendek apabila mengesan pembentukan trend baru.

Strategi breakout menggunakan purata harga tertinggi dan harga terendah tertinggi dalam tempoh belakang yang tetap sebagai garis asas. Isyarat panjang / pendek dihasilkan apabila harga pecah di atas / di bawah garis asas dengan peratusan tertentu.

Ukuran kedudukan adalah berdasarkan turun naik harga baru-baru ini dan sasaran risiko tahunan yang ditakrifkan oleh pengguna. Saiz yang lebih besar diambil apabila turun naik rendah manakala saiz yang lebih kecil diambil apabila turun naik tinggi. Ini merealisasikan pengurusan kedudukan dinamik dengan penyesuaian risiko.

Hentian keras ditetapkan sebagai kelipatan dari julat sebenar purata. Hentian yang mengikuti harga tertinggi atau terendah terkini.

Analisis Kelebihan

Kelebihan utama strategi ini termasuk:

  1. Menggabungkan pengesanan trend dan sub-strategi breakout menyesuaikan diri dengan persekitaran pasaran yang berbeza dengan ketahanan yang kuat.

  2. Menggunakan ukuran kedudukan dan teknik pengurusan risiko yang maju menguruskan kedudukan secara dinamik dan mengawal risiko dengan berkesan.

  3. Posisi penyesuaian turun naik berdasarkan turun naik baru-baru ini dan sasaran risiko tahunan mengekalkan risiko portfolio yang agak stabil di seluruh rejim turun naik tinggi / rendah.

  4. Menetapkan stop loss berdasarkan turun naik harga sebenar mengelakkan kerugian kecil yang tidak perlu daripada berhenti berjalan.

  5. Penyesuaian hentian di masa nyata dengan fleksibel mengikuti trend untuk mencatat keuntungan dan berhenti tepat pada masanya.

Analisis Risiko

Risiko utama strategi ini ialah:

  1. Kepercayaan pada pengoptimuman parameter. Parameter yang berbeza sangat mempengaruhi prestasi strategi jadi ujian komprehensif diperlukan untuk mencari parameter yang optimum.

  2. Jarak stop loss boleh dikurangkan dan mekanisme berhenti dapat dioptimumkan.

  3. Sensitiviti terhadap modal awal dan kos dagangan. Modal awal yang tidak mencukupi dan kos dagangan yang tinggi memberi kesan negatif kepada keuntungan.

  4. Mengandalkan anggaran turun naik yang tepat untuk saiz kedudukan dan kawalan risiko.

Arahan pengoptimuman

Arah pengoptimuman utama termasuk:

  1. Cari set parameter optimum melalui lebih banyak pengujian belakang dengan set data sejarah yang lebih besar.

  2. Meningkatkan mekanisme berhenti dengan menguji pelbagai berhenti seperti berhenti bergerak, berhenti masa, berhenti turun naik dll.

  3. Mengoptimumkan saiz kedudukan dan pengurusan risiko dengan menguji sasaran risiko yang berbeza untuk mencari profil risiko-pengembalian terbaik.

  4. Cuba lebih banyak penunjuk tambahan untuk meningkatkan ketepatan isyarat dan kekuatan strategi.

  5. Uji tempoh penahan yang berbeza dengan membantu keputusan dengan isyarat jangka masa yang lebih tinggi untuk meningkatkan ketepatan peruntukan kedudukan.

Kesimpulan

Strategi ini mengintegrasikan dua kategori utama strategi perdagangan: trend berikut dan breakout. Dengan menggunakan teknik penyesuaian kedudukan dinamik yang maju, ia berkesan mengawal risiko sambil mengesan pergerakan pasaran ke keuntungan. Ia menunjukkan potensi keuntungan yang kuat dan bernilai ujian dan pengoptimuman lanjut.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
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/
// © Crunchster1

//@version=5
strategy(title="Crunchster's Turtle and Trend System", shorttitle="Turtle Trend", overlay=true, slippage=10, pyramiding=1, precision = 4, calc_on_order_fills = false, calc_on_every_tick = false, default_qty_value = 0.1, initial_capital = 1000, commission_value = 0.06, process_orders_on_close = true)

// Inputs and Parameters
src = input(close, 'Source', group='Strategy Settings')
length = input.int(title="Lookback period for fast EMA", defval=10, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the fast exponential moving average. The slow EMA is 5x the fast EMA length')
blength = input.int(title="Lookback period for Breakout", defval=20, minval=5, step=5, group='Strategy Settings')

long = input(true, 'Long', inline='08', group='Strategy toggle')
short = input(true, 'Short', inline='08', group='Strategy toggle', tooltip='Toggle long/short strategy on/off')

EMAwt = input(false, 'Trend', inline='01', group='Strategy toggle')
breakwt = input(true, 'Breakout', inline='01', group='Strategy toggle', tooltip='Toggle trend/breakout strategy on/off')

stopMultiple = input.float(2, 'Stop multiple', step=0.5, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price')
trail = input.int(10, 'Trail lookback', step=5, group='Risk Management Settings', tooltip='Lookback period for the trailing stop')
lev = input.float(1, 'Max Leverage', step=0.5, group='Risk Management Settings', tooltip='Max leverage sets maximum allowable leverage of total capital (initial capital + any net profit), capping maximum volatility adjusted position size')
riskT = input.float(15, maxval=75, title='Annualised Volatility Target %', group='Risk Management Settings', tooltip='Specify annual risk target, used to determine volatility adjusted position size. Annualised daily volatility is referenced to this value and position size adjusted accordingly')
comp = input(true, 'Compounding', inline='09', group='Risk Management Settings')
Comppct = input.float(50, '%', step=5, inline='09', group='Risk Management Settings', tooltip='Toggle compounding of profit, and set % of profit to compound')

// Backtesting period
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, inline='04', group='Backtest range')
FromMonth = input.int(defval=1, title='From Mon', minval=1, maxval=12, inline='04', group='Backtest range')
FromYear = input.int(defval=2018, title='From Yr', minval=1900, inline='04', group='Backtest range', tooltip='Set start of backtesting period')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, inline='05', group='Backtest range')
ToMonth = input.int(defval=1, title='To Mon', minval=1, maxval=12, inline='05', group='Backtest range')
ToYear = input.int(defval=9999, title='To Yr', minval=1900, inline='05', group='Backtest range', tooltip='Set end of backtesting period')

start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window = time >= start and time <= finish

// Breakout strategy
lower = ta.lowest(low[1], blength)
upper = ta.highest(high[1], blength)
basis = math.avg(upper, lower)
signal = 20*(close - basis) / (upper - lower)

// Trend strategy
fEMA = ta.ema(close[1], length)
sEMA = ta.ema(close[1], length*5)
emadiff = fEMA - sEMA
nemadiff = 5*emadiff/(ta.stdev(close - close[1], 252))

//Risk Management formulae
strategy.initial_capital = 50000
tr = math.max(high - low, math.abs(high - close), math.abs(low - close)) //True range
stopL = ta.sma(tr, 14) //Average true range
stdev = ta.stdev(close-close[1], 14) //volatility of recent returns
maxcapital = strategy.initial_capital+strategy.netprofit //Maximum capital available to invest - initial capital net of profit
annvol = 100*math.sqrt(365)*stdev/close //converts recent volatility of returns into annualised volatility of returns - assumes daily timeframe

risk = 1.1
if comp
    risk := (strategy.initial_capital+(Comppct*strategy.netprofit/100))//adjust investment capital to include compounding
else
    risk := strategy.initial_capital

shares = (risk * (riskT/annvol)) / close //calculates volatility adjusted position size, dependent on user specified annualised risk target
if ((shares*close) > lev*maxcapital) //ensures position size does not exceed available capital multiplied by user specified maximum leverage
    shares := lev*maxcapital/close

//To set the price at the entry point of trade
Posopen() =>
    math.abs(strategy.position_size[1]) <= 0 and math.abs(strategy.position_size) > 0

var float openN = na
if Posopen()
    openN := stopL

// Trailing stop
tlower = ta.lowest(low[1], trail)
tupper = ta.highest(high[1], trail)
tbasis = math.avg(tupper, tlower)
tsignal = 20*(close - tbasis) / (tupper - tlower)

// Strategy Rules
if EMAwt
    if long
        longCondition2 = (nemadiff >2 and nemadiff[1] <2) and window
        exitlong = tsignal <= -10
        if (longCondition2)
            strategy.entry('Trend Long!', strategy.long, qty=shares)
        if strategy.position_size > 0    
            strategy.exit('Stop Long', from_entry = 'Trend Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
        if (exitlong)
            strategy.close('Trend Long!', immediately = true)

    if short
        shortCondition2 = (nemadiff <-1 and nemadiff[1] >-1) and window
        exitshort = tsignal >= 10
        if (shortCondition2)
            strategy.entry('Trend Short!', strategy.short, qty=shares)
        if strategy.position_size < 0   
            strategy.exit('Stop Short', from_entry = 'Trend Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
        if (exitshort)
            strategy.close('Trend Short!', immediately = true)

if breakwt
    if long
        longCondition1 = (signal >= 10) and window
        exitlong = tsignal <= -10
        if (longCondition1)
            strategy.entry('Break Long!', strategy.long, qty=shares)
        if strategy.position_size > 0    
            strategy.exit('Stop Long', from_entry = 'Break Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
        if (exitlong)
            strategy.close('Break Long!', immediately = true)

    if short
        shortCondition1 = (signal <= -10) and window
        exitshort = tsignal >= 10
        if (shortCondition1)
            strategy.entry('Break Short!', strategy.short, qty=shares)
        if strategy.position_size < 0   
            strategy.exit('Stop Short', from_entry = 'Break Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
        if (exitshort)
            strategy.close('Break Short!', immediately = true)

// Visuals of trend and direction
plot(nemadiff, title='EMA Forecast', color=color.black, display=display.none)
plot(ta.sma(ta.median(math.sqrt(math.pow(nemadiff,2)), 700), 350), 'Forecast mean', color=color.rgb(245, 0, 0), display=display.none)

MAColor = fEMA > sEMA ? #00ff00 : #ff0000
MA1 = plot(fEMA, title='Fast EMA', color=MAColor)
MA2 = plot(sEMA, title='Slow EMA', color=MAColor)
fill(MA1, MA2, title='Band Filler', color=MAColor)

Lebih lanjut