Strategi pembalikan trend berdasarkan purata bergerak berganda

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

img

Ringkasan

Strategi ini menghasilkan isyarat beli dan jual berdasarkan pembalikan beberapa penunjuk trend termasuk TDI, TCF, TTF dan TII. Strategi ini membolehkan memilih isyarat penunjuk yang akan digunakan untuk masuk dan keluar.

Logika Strategi

  • Penunjuk TDI

    Indikator TDI dibina menggunakan momentum harga dengan teknik penjumlahan dan pelunturan. Ia menjadi panjang apabila arah TDI melintasi di atas garis TDI dan keluar apabila melintasi di bawah.

  • Penunjuk TCF

    Penunjuk TCF mengukur perubahan harga positif dan negatif untuk mengukur kekuatan kenaikan dan penurunan. Ia menjadi panjang apabila perubahan positif lebih besar daripada perubahan negatif, jika tidak, ia keluar.

  • Penunjuk TTF

    Indikator TTF membandingkan kuasa harga tertinggi dan terendah untuk menentukan trend. Isyarat panjang adalah apabila TTF melintasi di atas 100 dan keluar adalah apabila melintasi di bawah -100.

  • TII Indikator

    TII menggabungkan purata bergerak dan jalur harga untuk mengenal pasti pembalikan trend. Ia mempertimbangkan kedua-dua trend jangka pendek dan jangka panjang. Isyarat panjang adalah di atas 80 dan keluar adalah di bawah 80.

Logik entri panjang dan dekat memilih isyarat yang sesuai berdasarkan penunjuk yang dikonfigurasikan.

Kelebihan

Strategi ini menggabungkan beberapa penunjuk perdagangan trend yang biasa digunakan, yang membolehkan fleksibiliti untuk menyesuaikan diri dengan keadaan pasaran yang berubah.

  1. Mengambil peluang pembalikan trend dengan tepat pada masanya menggunakan isyarat pembalikan
  2. Dapat dioptimumkan melalui konfigurasi penunjuk yang berbeza
  3. Gabungan penunjuk yang kaya boleh digunakan untuk mengesahkan isyarat

Risiko

Risiko utama yang dihadapi oleh strategi ini:

  1. Isyarat penunjuk mungkin mempunyai isyarat palsu yang mengakibatkan kerugian
  2. Indikator individu tidak dapat menilai sepenuhnya trend dan terdedah kepada bunyi pasaran
  3. Konfigurasi indikator dan parameter dagangan yang salah boleh salah tafsir pasaran dan menghasilkan perdagangan yang salah

Risiko boleh dikurangkan dengan:

  1. Mengoptimumkan parameter penunjuk untuk mencari kombinasi terbaik
  2. Memerlukan pengesahan isyarat penunjuk berbilang untuk meningkatkan kualiti
  3. Penyesuaian saiz kedudukan untuk mengawal kerugian perdagangan tunggal

Peluang Peningkatan

Strategi ini boleh ditingkatkan dalam beberapa bidang:

  1. Uji penunjuk dan parameter yang optimum dalam kitaran pasaran yang berbeza
  2. Tambah atau kurangkan penunjuk untuk mencari kombinasi terbaik
  3. Menapis isyarat palsu
  4. Mengoptimumkan strategi saiz kedudukan e.g. saiz berubah, stop loss yang berturut-turut
  5. Menggabungkan penilaian pembelajaran mesin untuk membantu kualiti isyarat

Kesimpulan

Dengan menggabungkan beberapa penunjuk pembalikan trend dan konfigurasi pengoptimuman, strategi ini dapat disesuaikan dengan persekitaran pasaran yang berbeza untuk beroperasi pada titik perubahan trend. Kuncinya adalah mencari parameter dan penunjuk yang optimum sambil mengawal risiko. Pengoptimuman dan pengesahan berterusan dapat membina strategi alpha 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 lanjut