Strategi pembalikan berbilang berdasarkan purata aliran


Tarikh penciptaan: 2023-11-21 14:53:48 Akhirnya diubah suai: 2023-11-21 14:53:48
Salin: 0 Bilangan klik: 603
1
fokus pada
1621
Pengikut

Strategi pembalikan berbilang berdasarkan purata aliran

Gambaran keseluruhan

Strategi ini melakukan pembelian dan penjualan dengan mengira pelbagai indikator trend apabila mereka berbalik. Indikator trend utama adalah TDI, TCF, TTF, dan TII. Strategi ini akan memilih dalam konfigurasi mana indikator yang digunakan untuk menghasilkan isyarat perdagangan.

Prinsip Strategi

  • ### TDI

Indeks TDI berdasarkan momentum perubahan harga untuk mengira. Dibina dengan teknik penjumlahan dan penyejukan. Apabila indikator arah TDI melakukan lebih banyak ketika melintasi kurva TDI, dan membersihkan ketika melintasi.

  • ### Indeks TCF

TCF mengukur perubahan positif dan negatif dalam harga untuk menilai kekuatan mata wang dan mata wang kosong. Apabila perubahan positif lebih besar daripada perubahan negatif, anda harus melakukan lebih banyak, jika tidak, anda harus membersihkan.

  • ### Indeks TTF

Indeks TTF menilai trend dengan membandingkan kekuatan titik tinggi dan rendah. Isyarat untuk melakukan lebih banyak adalah 100 pada indikator TTF, sebaliknya adalah bersih.

  • ### Indeks TII

Indeks TII menggabungkan garis rata-rata dan julat harga untuk menilai pembalikan trend. Ia mengambil kira trend jangka pendek dan jangka panjang pada masa yang sama.

Logik masuk ke dalam kedudukan yang lebih aman Pilih isyarat dagangan yang sesuai berdasarkan petunjuk konfigurasi.

Kelebihan Strategik

Strategi ini menggabungkan pelbagai indikator perdagangan trend yang biasa digunakan, yang dapat menyesuaikan diri dengan keadaan pasaran. Kelebihan khusus adalah:

  1. Menggunakan isyarat pembalikan trend untuk menangkap peluang perubahan trend tepat pada masanya
  2. Mengatur pelbagai penunjuk yang boleh dioptimumkan
  3. Kombinasi indikator yang kaya yang boleh digunakan untuk mengesahkan isyarat

Risiko Strategik

Strategi ini mempunyai risiko utama:

  1. Isyarat perdagangan yang dihasilkan oleh penunjuk trend boleh menyebabkan kerugian
  2. Indeks tunggal tidak dapat menentukan trend sepenuhnya dan mudah terjejas oleh bunyi pasaran
  3. Konfigurasi parameter penunjuk dan parameter perdagangan yang salah boleh menyebabkan pasaran tertekan dan menghasilkan perdagangan yang salah

Langkah-langkah berikut boleh diambil untuk mengurangkan risiko:

  1. Mengoptimumkan parameter penunjuk untuk mencari kombinasi parameter terbaik
  2. Menggabungkan beberapa isyarat penunjuk untuk berdagang dan meningkatkan kualiti isyarat
  3. Menyesuaikan strategi pengurusan kedudukan untuk mengawal kerugian tunggal

Arah pengoptimuman strategi

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Uji kombinasi indikator dan parameter yang optimum untuk kitaran pasaran yang berbeza
  2. Menambah atau mengurangkan metrik untuk mencari kombinasi metrik yang optimum
  3. Menapis isyarat perdagangan untuk menghapuskan isyarat palsu
  4. Mengoptimumkan strategi pengurusan kedudukan, seperti kedudukan yang boleh berubah, dan menjejaki hentian kerugian
  5. Menambah penarafan pembelajaran mesin untuk menilai kualiti isyarat

ringkaskan

Strategi ini menggabungkan kelebihan pelbagai indikator pembalikan trend, dengan mengoptimumkan dengan mengkonfigurasi indikator dan parameter, dapat menyesuaikan diri dengan keadaan pasaran yang berbeza, untuk beroperasi pada titik pembalikan trend. Kuncinya adalah untuk mencari kombinasi parameter dan indikator terbaik, sambil mengawal risiko. Dengan pengoptimuman dan pengesahan yang berterusan, anda boleh membina strategi yang stabil dengan alpha.

Kod 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)