Strategi pembalikan tren berdasarkan beberapa rata-rata bergerak

Penulis:ChaoZhang, Tanggal: 2023-11-21 14:53:48
Tag:

img

Gambaran umum

Strategi ini menghasilkan sinyal beli dan jual berdasarkan pembalikan dari beberapa indikator tren termasuk TDI, TCF, TTF dan TII. Strategi ini memungkinkan untuk memilih sinyal indikator mana yang akan digunakan untuk masuk dan keluar.

Logika Strategi

  • Indikator TDI

    Indikator TDI dibangun dengan menggunakan momentum harga dengan teknik penjumlahan dan pelunturan.

  • Indikator TCF

    Indikator TCF mengukur perubahan harga positif dan negatif untuk mengukur kekuatan bullish dan bearish.

  • Indikator TTF

    Indikator TTF membandingkan kekuatan harga tertinggi dan terendah untuk menentukan tren.

  • TII Indikator

    TII menggabungkan rata-rata bergerak dan band harga untuk mengidentifikasi pembalikan tren. Ini mempertimbangkan tren jangka pendek dan jangka panjang.

Logika entri panjang dan dekat memilih sinyal yang tepat berdasarkan indikator yang dikonfigurasi.

Keuntungan

Strategi ini menggabungkan beberapa indikator perdagangan tren yang umum digunakan, yang memungkinkan fleksibilitas untuk beradaptasi dengan perubahan kondisi pasar.

  1. Menangkap peluang pembalikan tren secara tepat waktu menggunakan sinyal pembalikan
  2. Dapat dioptimalkan melalui konfigurasi indikator yang berbeda
  3. Kombinasi indikator yang kaya dapat digunakan untuk mengkonfirmasi sinyal

Risiko

Risiko utama yang dihadapi strategi ini:

  1. Sinyal indikator mungkin memiliki sinyal palsu yang mengakibatkan kerugian.
  2. Indikator individu tidak dapat sepenuhnya menilai tren dan rentan terhadap kebisingan pasar
  3. Konfigurasi indikator dan parameter perdagangan yang salah dapat salah menafsirkan pasar dan menghasilkan perdagangan yang salah

Risiko dapat dikurangi dengan:

  1. Mengoptimalkan parameter indikator untuk menemukan kombinasi terbaik
  2. Memerlukan konfirmasi sinyal indikator ganda untuk meningkatkan kualitas
  3. Penyesuaian ukuran posisi untuk mengendalikan kerugian perdagangan tunggal

Peluang Peningkatan

Strategi ini dapat ditingkatkan di beberapa bidang:

  1. Uji indikator dan parameter optimal di berbagai siklus pasar
  2. Tambahkan atau kurangi indikator untuk menemukan kombinasi terbaik
  3. Menyaring sinyal palsu
  4. Mengoptimalkan strategi ukuran posisi misalnya ukuran variabel, stop loss trailing
  5. Masukkan penilaian pembelajaran mesin untuk membantu dengan kualitas sinyal

Kesimpulan

Dengan menggabungkan beberapa indikator pembalikan tren dan mengoptimalkan konfigurasi, strategi ini dapat beradaptasi dengan lingkungan pasar yang berbeda untuk beroperasi pada titik perubahan tren. Kuncinya adalah menemukan parameter dan indikator yang optimal sambil mengendalikan risiko. Optimasi dan validasi berkelanjutan dapat membangun strategi alfa yang stabil.


/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-15 03:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kruskakli
//
// Here is a collection of Trend Indicators as defined by M.H Pee and presented
// in various articles of the "STOCKS & COMMODITIES Magazine"
//
// The actual implementation of the indicators here are made by: everget
//
// I have gather them here so that they easily can be tested.
//
// My own test was made using 15 companies from the OMXS30 list
// during the time period of 2016-2018, and I only went LONG.
//
// The result was as follows:
//
//        Average    Std.Dev
//        profit
//  TDI    3.04%      5.97
//  TTF    1.22%.     5.73
//  TII    1.07%      6.2
//  TCF    0.32%      2.68
//
strategy("M.H Pee indicators", overlay=true)


use = input(defval="TDI", title="Use Indicator", type=input.string,
             options=["TDI","TCF","TTF","TII"])

src = close


//
// TDI
//
length = input(title="Length", type=input.integer, defval=20)
mom = change(close, length)
tdi = abs(sum(mom, length)) - sum(abs(mom), length * 2) + sum(abs(mom), length)
// Direction Indicator
tdiDirection = sum(mom, length)
tdiLong = crossover(tdiDirection, tdi)
tdiXLong = crossunder(tdiDirection, tdi)

//
// TCF
//
tcflength = input(title="Length", type=input.integer, defval=35)

plusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? change_1 : 0.0
minusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? 0.0 : -change_1

plusCF = 0.0
plusChange__1 = plusChange(src)
plusCF := plusChange(src) == 0 ? 0.0 : plusChange__1 + nz(plusCF[1])

minusCF = 0.0
minusChange__1 = minusChange(src)
minusCF := minusChange(src) == 0 ? 0.0 : minusChange__1 + nz(minusCF[1])

plusTCF = sum(plusChange(src) - minusCF, tcflength)
minusTCF = sum(minusChange(src) - plusCF, tcflength)

tcfLong = plusTCF > 0 
tcfXLong = plusTCF < 0

//
// TTF
//
ttflength = input(title="Lookback Length", type=input.integer, defval=15)

hh = highest(length)
ll = lowest(length)

buyPower = hh - nz(ll[length])
sellPower = nz(hh[length]) - ll

ttf = 200 * (buyPower - sellPower) / (buyPower + sellPower)

ttfLong = crossover(ttf, 100)
ttfXLong = crossunder(ttf, -100)

//
// TII
//
majorLength = input(title="Major Length", type=input.integer, defval=60)
minorLength = input(title="Minor Length", type=input.integer, defval=30)
upperLevel = input(title="Upper Level", type=input.integer, defval=80)
lowerLevel = input(title="Lower Level", type=input.integer, defval=20)

sma = sma(src, majorLength)

positiveSum = 0.0
negativeSum = 0.0

for i = 0 to minorLength - 1 by 1
    price = nz(src[i])
    avg = nz(sma[i])
    positiveSum := positiveSum + (price > avg ? price - avg : 0)
    negativeSum := negativeSum + (price > avg ? 0 : avg - price)
    negativeSum

tii = 100 * positiveSum / (positiveSum + negativeSum)

tiiLong = crossover(tii, 80)
tiiXLong = crossunder(tii,80)

//
// LOGIC 
//
enterLong = (use == "TDI" and tdiLong) or (use == "TCF" and tcfLong) or (use == "TTF" and ttfLong) or (use == "TII" and tiiLong)
exitLong = (use == "TDI" and tdiXLong) or (use == "TCF" and tcfXLong) or (use == "TTF" and ttfXLong) or (use == "TII" and tiiXLong)


// Time range for Back Testing
btStartYear  = input(title="Back Testing Start Year",  type=input.integer, defval=2016)
btStartMonth = input(title="Back Testing Start Month", type=input.integer, defval=1)
btStartDay   = input(title="Back Testing Start Day",   type=input.integer, defval=1)
startTime = timestamp(btStartYear, btStartMonth, btStartDay, 0, 0)

btStopYear  = input(title="Back Testing Stop Year",  type=input.integer, defval=2028)
btStopMonth = input(title="Back Testing Stop Month", type=input.integer, defval=12)
btStopDay   = input(title="Back Testing Stop Day",   type=input.integer, defval=31)
stopTime  = timestamp(btStopYear, btStopMonth, btStopDay, 0, 0)

window() => time >= startTime and time <= stopTime ? true : false


riskPerc     = input(title="Max Position  %", type=input.float, defval=20, step=0.5)
maxLossPerc  = input(title="Max Loss Risk %", type=input.float, defval=5, step=0.25)

// Average True Range (ATR) measures market volatility.
// We use it for calculating position sizes.
atrLen   = input(title="ATR Length", type=input.integer, defval=14)
stopOffset = input(title="Stop Offset", type=input.float, defval=1.5, step=0.25)
limitOffset = input(title="Limit Offset", type=input.float, defval=1.0, step=0.25)
atrValue = atr(atrLen)


// Calculate position size
maxPos = floor((strategy.equity * (riskPerc/100)) / src)
// The position sizing algorithm is based on two parts:
// a certain percentage of the strategy's equity and
// the ATR in currency value.
riskEquity  = (riskPerc / 100) * strategy.equity
// Translate the ATR into the instrument's currency value.
atrCurrency = (atrValue * syminfo.pointvalue)
posSize0    = min(floor(riskEquity / atrCurrency), maxPos)
posSize     = posSize0 < 1 ? 1 : posSize0

if (window())
    strategy.entry("Long", long=true, qty=posSize0, when=enterLong)
    strategy.close_all(when=exitLong)

Lebih banyak