Strategi pembalikan ganda berdasarkan rata-rata tren


Tanggal Pembuatan: 2023-11-21 14:53:48 Akhirnya memodifikasi: 2023-11-21 14:53:48
menyalin: 0 Jumlah klik: 601
1
fokus pada
1621
Pengikut

Strategi pembalikan ganda berdasarkan rata-rata tren

Ringkasan

Strategi ini melakukan pembelian dan penjualan dengan menghitung beberapa indikator tren ketika mereka berbalik. Indikator tren utama adalah TDI, TCF, TTF, dan TII. Strategi ini akan memilih indikator mana yang akan digunakan dalam konfigurasi untuk menghasilkan sinyal perdagangan.

Prinsip Strategi

  • ### Indikator TDI

Indikator TDI didasarkan pada perubahan momentum harga untuk menghitung. Dibangun dengan teknik summing dan smoothing. Ketika indikator arah TDI melakukan lebih banyak saat melintasi kurva TDI, dan membersihkan ketika melintasi.

  • ### Indikator TCF

Indikator TCF menghitung perubahan positif dan negatif dari harga, untuk menilai kekuatan head dan head kosong. Jika perubahan positif lebih besar dari perubahan negatif, maka Anda harus melakukan lebih banyak, jika tidak, Anda harus melakukan likuidasi.

  • ### Indikator TTF

Indikator TTF menilai tren dengan membandingkan kekuatan titik tinggi dan titik rendah. Untuk melakukan lebih banyak sinyal, indikator TTF melewati 100 dan sebaliknya melakukan likuidasi.

  • ### Indikator TII

Indeks TII menggabungkan garis rata-rata dan kisaran harga untuk menilai pembalikan tren. Ini mempertimbangkan tren jangka pendek dan jangka panjang sekaligus.

Logika untuk masuk ke posisi yang lebih aman Memilih sinyal perdagangan yang tepat berdasarkan indikator yang dikonfigurasi.

Keunggulan Strategis

Strategi ini menggabungkan beberapa indikator perdagangan tren yang umum digunakan, yang dapat secara fleksibel beradaptasi dengan kondisi pasar.

  1. Menggunakan sinyal pembalikan tren untuk menangkap peluang perubahan tren tepat waktu
  2. Mengkonfigurasi berbagai metrik yang dapat dioptimalkan
  3. Kombinasi indikator yang kaya yang dapat digunakan dalam kombinasi untuk mengkonfirmasi sinyal

Risiko Strategis

Strategi ini menghadapi risiko utama sebagai berikut:

  1. Sinyal perdagangan yang dihasilkan oleh indikator tren dapat menyebabkan kerugian akibat kesalahan laporan
  2. Indikator tunggal tidak dapat sepenuhnya menilai tren dan mudah terpengaruh oleh kebisingan pasar
  3. Konfigurasi parameter indikator dan parameter perdagangan yang salah dapat menyebabkan distorsi pasar dan menghasilkan perdagangan yang salah

Hal-hal berikut dapat dilakukan untuk mengurangi risiko:

  1. Optimalkan parameter indikator untuk menemukan kombinasi parameter yang optimal
  2. Kombinasi beberapa sinyal indikator untuk perdagangan, meningkatkan kualitas sinyal
  3. Menyesuaikan strategi manajemen posisi untuk mengendalikan kerugian tunggal

Arah optimasi strategi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Uji kombinasi indikator dan parameter optimal untuk berbagai siklus pasar
  2. Menambahkan atau menghapus indikator untuk menemukan kombinasi indikator yang optimal
  3. Menyaring sinyal perdagangan untuk menghilangkan sinyal palsu
  4. Optimalkan strategi manajemen posisi, seperti posisi variabel, tracking stop loss, dan sebagainya
  5. Menambahkan indikator penilaian pembelajaran mesin untuk membantu menilai kualitas sinyal

Meringkaskan

Strategi ini menggabungkan keunggulan dari berbagai indikator trend reversal, dioptimalkan dengan mengkonfigurasi indikator dan parameter, dapat disesuaikan dengan berbagai kondisi pasar, beroperasi di titik-titik trend reversal. Kuncinya adalah menemukan kombinasi parameter dan indikator yang optimal, sambil mengendalikan risiko. Dengan optimasi dan verifikasi berkelanjutan, strategi dapat dibangun dengan stabil dengan alpha.

Kode Sumber Strategi
/*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)