Strategi Mengikuti Tren Saluran Gaussian


Tanggal Pembuatan: 2024-03-29 16:26:26 Akhirnya memodifikasi: 2024-03-29 16:26:26
menyalin: 2 Jumlah klik: 1133
1
fokus pada
1617
Pengikut

Strategi Mengikuti Tren Saluran Gaussian

Ringkasan

Strategi Gaussian Channel trend tracking adalah strategi perdagangan yang mengikuti tren berdasarkan Gaussian Channel indicator. Strategi ini bertujuan untuk menangkap tren utama di pasar, membeli dan memegang posisi dalam tren naik, dan melakukan eksposur pada tren turun. Strategi ini menggunakan indikator Gaussian Channel untuk mengidentifikasi arah dan kekuatan tren, dan menentukan waktu jual beli dengan menganalisis hubungan antara harga dan tren di bawah saluran.

Prinsip Strategi

Inti dari strategi pelacakan tren Gaussian Channel adalah indikator Gaussian Channel, yang dikemukakan oleh Ehlers, merupakan alat analisis tren yang menggunakan teknik Gaussian Slip and True Range. Instrumen ini pertama-tama menghitung nilai β dan α berdasarkan siklus sampel dan jumlah titik kutub, lalu melakukan pengolahan data dengan filter, mendapatkan kurva yang rata.

Keunggulan Strategis

  1. Pelacakan tren: Strategi ini mampu menangkap tren utama di pasar, dan berinvestasi di arah tren, yang dapat membantu mendapatkan keuntungan stabil jangka panjang.
  2. Kurangi frekuensi perdagangan: Strategi hanya masuk ketika tren dikonfirmasi, dan memegang posisi selama tren berlanjut, sehingga mengurangi jumlah perdagangan yang tidak perlu dan biaya perdagangan.
  3. Mengurangi keterlambatan: Dengan mengurangi mode keterlambatan dan mode reaksi cepat, strategi dapat bereaksi lebih tepat waktu terhadap perubahan pasar.
  4. Fleksibilitas parameter: Pengguna dapat menyesuaikan parameter kebijakan sesuai dengan kebutuhan mereka, seperti siklus sampel, jumlah titik titik, dan real-range multiplier, untuk mengoptimalkan kinerja kebijakan.

Risiko Strategis

  1. Risiko optimasi parameter: pengaturan parameter yang tidak tepat dapat menyebabkan kinerja strategi yang buruk. Disarankan untuk melakukan optimasi dan pengujian parameter dalam berbagai kondisi pasar untuk menemukan kombinasi parameter yang optimal.
  2. Risiko trend reversal: Ketika tren pasar terjadi tiba-tiba, strategi mungkin menghasilkan mundur yang lebih besar. Risiko dapat dikendalikan dengan mengatur stop loss atau memperkenalkan indikator lain.
  3. Risiko pasar bergoyang: Dalam pasar bergoyang, strategi dapat muncul sinyal perdagangan yang sering, yang menyebabkan kerugian keuntungan. Anda dapat memfilter sinyal dengan parameter optimasi atau kombinasi dengan indikator teknis lainnya.

Arah optimasi strategi

  1. Masukkan indikator teknis lainnya: dikombinasikan dengan indikator lain seperti MACD, RSI, dan lain-lain untuk meningkatkan akurasi dan keandalan sinyal.
  2. Optimasi parameter dinamis: menyesuaikan parameter strategi secara dinamis sesuai dengan perubahan kondisi pasar untuk menyesuaikan diri dengan lingkungan pasar yang berbeda.
  3. Tambahkan modul pengendalian risiko: atur aturan stop loss dan stop loss yang masuk akal, kendalikan risiko per transaksi dan tingkat penarikan secara keseluruhan.
  4. Analisis multi-frame: menggabungkan sinyal dari berbagai periode waktu, seperti garis waktu, 4 jam, dan lain-lain, untuk mendapatkan informasi pasar yang lebih komprehensif.

Meringkaskan

Strategi Gaussian Channel Trend Tracking adalah strategi perdagangan trend tracking yang didasarkan pada teknologi Gaussian Wave untuk mendapatkan keuntungan stabil jangka panjang dengan menangkap tren utama di pasar. Strategi menggunakan indikator Gaussian Channel untuk mengidentifikasi arah dan kekuatan tren, sekaligus memberikan fungsi untuk mengurangi keterlambatan dan reaksi cepat. Keunggulan strategi adalah kemampuan pelacakan tren yang baik dan frekuensi perdagangan yang lebih rendah, tetapi juga menghadapi risiko seperti pengoptimalan parameter, pergeseran tren, dan pasar yang bergolak.

Kode Sumber Strategi
/*backtest
start: 2023-03-23 00:00:00
end: 2024-03-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Gaussian Channel Strategy v2.0", overlay=true, calc_on_every_tick=false, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Gaussian Channel Indicaor - courtesy of @DonovanWall
//----------------------------------------------------------------------------------------------------------------------------------------------------------------- 

// Date condition inputs
startDate = input(timestamp("1 January 2018 00:00 +0000"), "Date Start", group="Main Algo Settings")
endDate = input(timestamp("1 January 2060 00:00 +0000"), "Date Start", group="Main Algo Settings")
timeCondition = true

// This study is an experiment utilizing the Ehlers Gaussian Filter technique combined with lag reduction techniques and true range to analyze trend activity.
// Gaussian filters, as Ehlers explains it, are simply exponential moving averages applied multiple times.
// First, beta and alpha are calculated based on the sampling period and number of poles specified. The maximum number of poles available in this script is 9.
// Next, the data being analyzed is given a truncation option for reduced lag, which can be enabled with "Reduced Lag Mode".
// Then the alpha and source values are used to calculate the filter and filtered true range of the dataset.
// Filtered true range with a specified multiplier is then added to and subtracted from the filter, generating a channel.
// Lastly, a one pole filter with a N pole alpha is averaged with the filter to generate a faster filter, which can be enabled with "Fast Response Mode". 

// Custom bar colors are included.

// Note: Both the sampling period and number of poles directly affect how much lag the indicator has, and how smooth the output is.
//      Larger inputs will result in smoother outputs with increased lag, and smaller inputs will have noisier outputs with reduced lag.
//      For the best results, I recommend not setting the sampling period any lower than the number of poles + 1. Going lower truncates the equation.

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Updates:
// Huge shoutout to @e2e4mfck for taking the time to improve the calculation method!
// -> migrated to v4
// -> pi is now calculated using trig identities rather than being explicitly defined.
// -> The filter calculations are now organized into functions rather than being individually defined.
// -> Revamped color scheme.

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Functions - courtesy of @e2e4mfck
//----------------------------------------------------------------------------------------------------------------------------------------------------------------- 

// Filter function 
f_filt9x (_a, _s, _i) => 
    int _m2 = 0, int _m3 = 0, int _m4 = 0, int _m5 = 0, int _m6 = 0, 
    int _m7 = 0, int _m8 = 0, int _m9 = 0, float _f = .0, _x = (1 - _a)
    // Weights. 
    // Initial weight _m1 is a pole number and equal to _i
    _m2 := _i == 9 ? 36  : _i == 8 ? 28 : _i == 7 ? 21 : _i == 6 ? 15 : _i == 5 ? 10 : _i == 4 ? 6 : _i == 3 ? 3 : _i == 2 ? 1 : 0
    _m3 := _i == 9 ? 84  : _i == 8 ? 56 : _i == 7 ? 35 : _i == 6 ? 20 : _i == 5 ? 10 : _i == 4 ? 4 : _i == 3 ? 1 : 0
    _m4 := _i == 9 ? 126 : _i == 8 ? 70 : _i == 7 ? 35 : _i == 6 ? 15 : _i == 5 ? 5  : _i == 4 ? 1 : 0
    _m5 := _i == 9 ? 126 : _i == 8 ? 56 : _i == 7 ? 21 : _i == 6 ? 6  : _i == 5 ? 1  : 0 
    _m6 := _i == 9 ? 84  : _i == 8 ? 28 : _i == 7 ? 7  : _i == 6 ? 1  : 0 
    _m7 := _i == 9 ? 36  : _i == 8 ? 8  : _i == 7 ? 1  : 0 
    _m8 := _i == 9 ? 9   : _i == 8 ? 1  : 0 
    _m9 := _i == 9 ? 1   : 0
    // filter
    _f :=   math.pow(_a, _i) * nz(_s) + 
      _i  *     _x      * nz(_f[1])      - (_i >= 2 ? 
      _m2 * math.pow(_x, 2)  * nz(_f[2]) : 0) + (_i >= 3 ? 
      _m3 * math.pow(_x, 3)  * nz(_f[3]) : 0) - (_i >= 4 ? 
      _m4 * math.pow(_x, 4)  * nz(_f[4]) : 0) + (_i >= 5 ? 
      _m5 * math.pow(_x, 5)  * nz(_f[5]) : 0) - (_i >= 6 ? 
      _m6 * math.pow(_x, 6)  * nz(_f[6]) : 0) + (_i >= 7 ? 
      _m7 * math.pow(_x, 7)  * nz(_f[7]) : 0) - (_i >= 8 ? 
      _m8 * math.pow(_x, 8)  * nz(_f[8]) : 0) + (_i == 9 ? 
      _m9 * math.pow(_x, 9)  * nz(_f[9]) : 0)

// 9 var declaration fun
f_pole (_a, _s, _i) =>
    _f1 =            f_filt9x(_a, _s, 1),      _f2 = (_i >= 2 ? f_filt9x(_a, _s, 2) : 0), _f3 = (_i >= 3 ? f_filt9x(_a, _s, 3) : 0)
    _f4 = (_i >= 4 ? f_filt9x(_a, _s, 4) : 0), _f5 = (_i >= 5 ? f_filt9x(_a, _s, 5) : 0), _f6 = (_i >= 6 ? f_filt9x(_a, _s, 6) : 0)
    _f7 = (_i >= 2 ? f_filt9x(_a, _s, 7) : 0), _f8 = (_i >= 8 ? f_filt9x(_a, _s, 8) : 0), _f9 = (_i == 9 ? f_filt9x(_a, _s, 9) : 0)
    _fn = _i == 1 ? _f1 : _i == 2 ? _f2 : _i == 3 ? _f3 :
      _i == 4     ? _f4 : _i == 5 ? _f5 : _i == 6 ? _f6 :
      _i == 7     ? _f7 : _i == 8 ? _f8 : _i == 9 ? _f9 : na
    [_fn, _f1]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

// Source
src = input(defval=hlc3, title="Source")

// Poles
int N = input.int(defval=4, title="Poles", minval=1, maxval=9)

// Period
int per = input.int(defval=144, title="Sampling Period", minval=2)

// True Range Multiplier
float mult = input.float(defval=1.414, title="Filtered True Range Multiplier", minval=0)

// Lag Reduction
bool modeLag  = input.bool(defval=false, title="Reduced Lag Mode")
bool modeFast = input.bool(defval=false, title="Fast Response Mode")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

// Beta and Alpha Components
beta  = (1 - math.cos(4*math.asin(1)/per)) / (math.pow(1.414, 2/N) - 1)
alpha = - beta + math.sqrt(math.pow(beta, 2) + 2*beta)

// Lag
lag = (per - 1)/(2*N)

// Data
srcdata = modeLag ? src + (src - src[lag]) : src
trdata  = modeLag ? ta.tr(true) + (ta.tr(true) - ta.tr(true)[lag]) : ta.tr(true)

// Filtered Values
[filtn, filt1]     = f_pole(alpha, srcdata, N)
[filtntr, filt1tr] = f_pole(alpha, trdata,  N)

// Lag Reduction
filt   = modeFast ? (filtn + filt1)/2 : filtn
filttr = modeFast ? (filtntr + filt1tr)/2 : filtntr

// Bands
hband = filt + filttr*mult
lband = filt - filttr*mult

// Colors
color1   = #0aff68
color2   = #00752d
color3   = #ff0a5a
color4   = #990032
fcolor   = filt > filt[1] ? #0aff68 : filt < filt[1] ? #ff0a5a : #cccccc
barcolor = (src > src[1]) and (src > filt) and (src < hband) ? #0aff68 : (src > src[1]) and (src >= hband) ? #0aff1b : (src <= src[1]) and (src > filt) ? #00752d : 
           (src < src[1]) and (src < filt) and (src > lband) ? #ff0a5a : (src < src[1]) and (src <= lband) ? #ff0a11 : (src >= src[1]) and (src < filt) ? #990032 : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

// Filter Plot
filtplot = plot(filt, title="Filter", color=fcolor, linewidth=3)

// Band Plots
hbandplot = plot(hband, title="Filtered True Range High Band", color=fcolor)
lbandplot = plot(lband, title="Filtered True Range Low Band", color=fcolor)

// Channel Fill
fill(hbandplot, lbandplot, title="Channel Fill", color=color.new(fcolor, 80))

// Bar Color
barcolor(barcolor)

longCondition = ta.crossover(close, hband) and timeCondition
closeAllCondition = ta.crossunder(close, hband) and timeCondition

if longCondition
    strategy.entry("long", strategy.long)

if closeAllCondition
    strategy.close("long")