Strategi Pelarian Mengekori


Tarikh penciptaan: 2023-10-17 16:36:49 Akhirnya diubah suai: 2023-10-17 16:36:49
Salin: 0 Bilangan klik: 690
1
fokus pada
1617
Pengikut

Strategi Pelarian Mengekori

Gambaran keseluruhan

Strategi ini digunakan untuk mencapai strategi pelacakan pelacakan yang disokong oleh indikator penghalang saluran Yangtze An. Strategi ini menggabungkan trend dan dua jenis pemikiran perdagangan yang melanggar, berdasarkan penghakiman trend garis panjang, mencari titik pecah yang lebih pendek untuk membuat entri, dan mencapai perdagangan yang lancar dalam keadaan trend. Selain itu, strategi ini juga menetapkan tahap stop loss dan berhenti untuk mengawal nisbah risiko dan keuntungan setiap perdagangan.

Prinsip Strategi

  1. Tetapkan parameter untuk penunjuk saluran saluran Deng Dongqian, kitaran lalai 20;

  2. Tetapkan EMA rata-rata bergerak yang lancar, kitaran lalai 200;

  3. Tetapkan nisbah risiko-kebajikan, secara lalai 1.5;

  4. Tetapkan parameter penembusan dan langkah balik, masing-masing untuk multihead dan kosong;

  5. Mencatat apakah satu penembusan adalah satu titik tinggi atau satu titik rendah;

  6. Isyarat multi-head: menghasilkan isyarat multi-head jika penembusan sebelumnya adalah titik rendah dan harga lebih tinggi daripada tren atas Dongguan dan lebih tinggi daripada garis rata-rata EMA;

  7. Isyarat kosong: menghasilkan isyarat kosong jika penembusan sebelumnya adalah titik tinggi dan harga berada di bawah tren bawah Dongguan dan di bawah garis rata-rata EMA;

  8. Setelah memasuki kedudukan berbilang mata, set stop loss untuk mundur 5 mata ke bawah rel Dongjian, dan stop loss untuk perbandingan risiko-keuntungan kali jarak stop loss;

  9. Selepas memasuki kedudukan kosong, set stop loss untuk Tang Chian naik ke rel mundur 5 mata, stop stop untuk risiko keuntungan berbanding kali jarak stop loss.

Dengan cara ini, strategi yang digabungkan dengan penghakiman trend dan operasi penembusan, dapat secara beransur-ansur, menangkap peluang untuk tempoh yang lebih pendek dalam trend garis panjang. Pada masa yang sama, penyetempatan Stop Loss Stop Stop boleh mengawal risiko keuntungan perdagangan tunggal.

Analisis kelebihan

  1. Mengikuti trend garis panjang, mengikut trend, dan mengelakkan perdagangan berlawanan arah.

  2. Laluan Dongxian digunakan sebagai penunjuk garis panjang, yang digabungkan dengan penapis garis seragam EMA, untuk menentukan arah trend.

  3. Mekanisme penangguhan kerugian mengawal setiap risiko, yang boleh mengehadkan kemungkinan kerugian.

  4. Mengoptimumkan nisbah risiko dan keuntungan, anda boleh meningkatkan nisbah kerugian dan mengejar keuntungan tambahan.

  5. Tetapan parameter pengesan adalah fleksibel, yang membolehkan anda menyesuaikan kombinasi parameter terbaik untuk pasaran yang berbeza.

Analisis risiko

  1. Laluan Dongxian dan EMA sebagai penapis, mungkin memberi isyarat yang salah.

  2. “Pengurusan terobosan mudah ditiru dan memerlukan latar belakang trend yang jelas untuk dikenal pasti.

  3. Jarak stop loss tetap dan tidak boleh disesuaikan dengan turun naik pasaran.

  4. Parameters Optimisasi ruang yang terhad, kesan cakera keras sukar dijamin.

  5. Sistem perdagangan tidak boleh diuji dengan terlalu banyak peristiwa rawak, dan peristiwa Black Swan boleh menyebabkan kerugian yang besar.

Arah pengoptimuman

  1. Anda boleh pertimbangkan untuk menambahkan lebih banyak penapis, seperti penapis getaran, untuk meningkatkan kualiti isyarat.

  2. Anda boleh menetapkan Hentian Kerugian Pintar untuk menyesuaikan kedudukan kerugian dan kerugian anda mengikut turun naik pasaran dan pergerakan indikator ATR.

  3. Kaedah seperti pembelajaran mesin boleh digunakan untuk menguji dan mengoptimumkan parameter, menjadikannya lebih dekat dengan pasaran sebenar.

  4. Logik kemasukan boleh dioptimumkan dengan menetapkan VOLUME atau indikator kadar turun naik sebagai syarat tambahan untuk mengelakkan perangkap.

  5. Ia boleh dipertimbangkan untuk digabungkan dengan strategi trend-following atau pembelajaran mesin untuk membentuk strategi campuran dan meningkatkan kestabilan.

ringkaskan

Strategi ini sebagai strategi penembusan jenis pengesanan, idea utamanya adalah untuk menilai trend garis panjang, untuk melakukan operasi melintang sebagai isyarat, dan menetapkan stop loss untuk mengawal risiko perdagangan tunggal. Strategi ini mempunyai kelebihan tertentu, tetapi ada juga ruang untuk pengoptimuman. Secara keseluruhan, jika dapat menangani parameter yang baik, penetapan pilihan masa masuk, dan ditambah dengan teknologi lain, strategi ini boleh menjadi strategi pengesanan trend yang praktikal.

Kod sumber strategi
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Welcome to my second script on Tradingview with Pinescript
// First of, I'm sorry for the amount of comments on this script, this script was a challenge for me, fun one for sure, but I wanted to thoroughly go through every step before making the script public
// Glad I did so because I fixed some weird things and I ended up forgetting to add the EMA into the equation so our entry signals were a mess
// This one was a lot tougher to complete compared to my MACD crossover trend strategy but I learned a ton from it, which is always good and fun
// Also I'll explain the strategy and how I got there through some creative coding(I'm saying creative because I had to figure this stuff out by myself as I couldn't find any reference codes)
// First things first. This is a Donchian Channel Breakout strategy which follows the following rules
// If the price hits the upperband of the Donchian Channel + price is above EMA and the price previously hit the lowerband of the Donchian Channel it's a buy signal
// If the price hits the lowerband of the Donchian Channel + price is below EMA and the price prevbiously hit the upper band of the Donchian Channel it's a sell signal
// Stop losses are set at the lower or upper band with a 0.5% deviation because we are acting as if those two bands are the resistance in this case
// Last but not least(yes, this gave BY FAR the most trouble to code), the profit target is set with a 1.5 risk to reward ratio
// If you have any suggestions to make my code more efficient, I'll be happy to hear so from you
// So without further ado, let's walk through the code

// The first line is basically standard because it makes backtesting so much more easy, commission value is based on Binance futures fees when you're using BNB to pay those fees in the futures market
// strategy(title="Donchian Channels", shorttitle="DC", overlay=true, default_qty_type = strategy.cash, default_qty_value = 150, initial_capital = 1000, currency = currency.USD, commission_type = "percent", commission_value = 0.036)
// The built-in Donchian Channels + an added EMA input which I grouped with the historical bars from the Donchian Channels
length          = input(20, minval=1, group = "Indicators")
lower           = lowest(length)
upper           = highest(length)
basis           = avg(upper, lower)
emaInput        = input(title = "EMA Input", type = input.integer, defval = 200, minval = 10, maxval = 400, step = 1, group = "Indicators")
// I've made three new inputs, for risk/reward ratio and for the standard pullback deviation. My advise is to not use the pullback inputs as I'm not 100% sure if they work as intended or not
riskreward      = input(title = "Risk/Reward Ratio", type = input.float, defval = 1.50, minval = 0.01, maxval = 100, step = 0.01, group = "Risk/Reward")
pullbackLong    = input(title = "Distance from Long pullback %", type = input.float, defval = 0.995, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")
pullbackShort   = input(title = "Distance from Short pullback %", type = input.float, defval = 1.005, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")

// Input backtest range, you can adjust these in the input options, just standard stuff
fromMonth       = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay         = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear        = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970,           group = "Backtest Date Range")
thruMonth       = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay         = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear        = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970,           group = "Backtest Date Range")
// Date variable also standard stuff
inDataRange     = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))

// I had to makes these variables because the system has to remember whether the previous 'breakout' was a high or a low
// Also, because I based my stoploss on the upper/lower band of the indicator I had to find a way to change this value just once without losing the value, that was added, on the next bar
var previousishigh = false
var previousislow = false
var longprofit = 0.0
var shortprofit = 0.0
var stoplossLong = 0.0
var stoplossShort = 0.0
// These are used as our entry variables
emaCheck = ema(close, emaInput)
longcond = high >= upper and close > emaCheck
shortcond = low <= lower and close < emaCheck

// With these two if statements I'm changing the boolean variable above to true, we need this to decide out entry position
if high >= upper
    previousishigh := true
if low <= lower
    previousislow := true

// Made a last minute change on this part. To clean up our entry signals we don't want our breakouts, while IN a position, to change. This way we do not instantly open a new position, almost always in the opposite direction, upon exiting one
if strategy.position_size > 0 or strategy.position_size < 0 
    previousishigh := false
    previousislow := false

// Strategy inputs
// Long - previous 'breakout' has to be a low, the current price has to be a new high and above the EMA, we're not allowed to be in a position and ofcourse it has to be within our given data for backtesting purposes
if previousislow == true and longcond and strategy.position_size == 0 and inDataRange
    strategy.entry("Long Entry", strategy.long, comment = "Entry Long")
    stoplossLong := lower * pullbackLong
    longprofit := ((((1 - stoplossLong / close) * riskreward) + 1) * close)
    strategy.exit("Long Exit", "Long Entry", limit = longprofit, stop = stoplossLong, comment = "Long Exit")

// Short - Previous 'breakout' has to be a high, current price has to be a new low and lowe than the 200EMA, we're not allowed to trade when we're in a position and it has to be within our given data for backtesting purposes
if previousishigh == true and shortcond and strategy.position_size == 0 and inDataRange
    strategy.entry("Short Entry", strategy.short, comment = "Entry Short")
    stoplossShort := upper * pullbackShort
    shortprofit := (close - ((((1 - close / stoplossShort) * riskreward) * close)))
    strategy.exit("Short Exit", "Short Entry", limit = shortprofit, stop = stoplossShort, comment = "Short Exit")
    
// This plots the Donchian Channels on the chart which is just using the built-in Donchian Channels
plot(basis, "Basis", color=color.blue)
u = plot(upper, "Upper", color=color.green)
l = plot(lower, "Lower", color=color.red)
fill(u, l, color=#0094FF, transp=95, title="Background")

// These plots are to show if the variables are working as intended, it's a mess I know but I didn't have any better ideas, they work well enough for me
// plot(previousislow ? close * 0.95 : na, color=color.red, linewidth=2, style=plot.style_linebr)
// plot(previousishigh ? close * 1.05 : na, color=color.green, style=plot.style_linebr)
// plot(longprofit, color=color.purple)
// plot(shortprofit, color=color.silver)
// plot(stoplossLong)
// plot(stoplossShort)
// plot(strategy.position_size)