Strategi ini mewujudkan perdagangan dua hala dengan mengira indeks pergerakan komoditi ((DI) dan menggabungkan parameter sekatan. Buat lebih banyak apabila DI + lebih besar daripada DI - satu parameter sekatan dan kosong apabila DI - lebih besar daripada DI + satu parameter sekatan.
Penunjuk teras strategi ini adalah indeks pergerakan ((DI) ≠ DI dikira dengan formula berikut:
DI+ = (DM+ / Julat sebenar) × 100 DI- = (DM- / julat sebenar) × 100
Di mana DM+ mewakili pergerakan multihead, DM- mewakili pergerakan kosong. Julat sebenar mewakili kadar turun naik baru-baru ini dengan mengira nilai maksimum untuk tiga hari harga tertinggi, harga rendah dan harga penutupan semalam.
Berdasarkan definisi DI, apabila DI+ > DI- , menunjukkan kekuatan kepala kosong yang lebih besar daripada kekuatan kepala kosong, termasuk dalam pasaran kepala kosong; apabila DI- > DI+ , menunjukkan kekuatan kepala kosong yang lebih kuat daripada kekuatan kepala kosong, termasuk dalam pasaran kepala kosong.
Strategi ini menggunakan ciri ini untuk menetapkan parameter had. Apabila DI+ lebih besar daripada DI-satu parameter had, maka ia dianggap sebagai pasaran bertopeng, dan melakukan lebih banyak; apabila DI-lebih besar daripada DI+ satu parameter had, ia dianggap sebagai pasaran kosong, dan melakukan kosong.
Sebagai contoh, jika parameter had ditetapkan kepada 3, maka peraturan dagangan tertentu adalah:
Oleh kerana terdapat sedikit perubahan nilai perbezaan antara DI + dan DI - , penyetempatan parameter sekatan dapat menyaring beberapa isyarat perdagangan yang tidak mempunyai arah yang jelas, mengurangkan perdagangan yang tidak perlu, yang merupakan kelebihan strategi tersebut.
Strategi ini mempunyai kelebihan utama:
DI menilai pergerakan pasaran secara langsung dengan mengira kekuatan kedua-dua belah pihak, tanpa algoritma rumit seperti penyesuaian kurva, teori yang mudah dan boleh dipercayai.
Dengan mengehadkan parameter penapisan tanpa turun naik kecil yang jelas arah, hanya pilih segmen yang jelas arah yang lebih kuat untuk berdagang, untuk mengelakkan terikat.
Kedudukan kosong berbilang boleh ditukar secara automatik mengikut petunjuk DI, tanpa penilaian manual, mengurangkan kesukaran perdagangan.
Tetapan sokongan untuk berdagang hanya dalam julat tarikh yang disesuaikan, penutupan automatik selepas tamat, fleksibiliti dan kemudahan.
Dengan suis pelbagai ruang hanya boleh memilih isyarat satu arah, mewujudkan hanya melakukan lebih banyak atau hanya kosong, menyesuaikan diri dengan keadaan pasaran yang berbeza.
Strategi ini mempunyai beberapa risiko:
Apabila pasaran mengalami turun naik yang teruk, DI mungkin menghantar isyarat yang salah dalam jangka pendek, menyebabkan perdagangan gagal. Ia perlu digabungkan dengan petunjuk lain untuk pemeriksaan.
Tetapan parameter yang terlalu besar atau terlalu kecil boleh menyebabkan kurang atau terlalu banyak isyarat perdagangan, perlu menyesuaikan parameter mengikut pasaran.
DI hanya dapat menentukan arah trend semasa, tidak dapat menentukan sama ada trend berakhir atau berbalik, memerlukan kombinasi indikator lain.
Penyelesaian untuk menghadapi risiko termasuk:
Penapisan isyarat DI dengan penunjuk seperti purata bergerak
Menyesuaikan parameter sekatan mengikut hasil pengukuran semula
Mengambil keputusan sama ada trend akan berbalik atau tidak, dengan menggabungkan Volumes, MACD dan sebagainya.
Strategi ini boleh terus dioptimumkan dengan:
Di samping itu, pengkajian yang lebih intuitif seperti carta hujan rakyat (CPP) dan penunjuk kuasa udara (CFO) digabungkan dengan ID, dapat meningkatkan ketepatan penilaian.
Tetapkan Hentian Bergerak, Hentian Waktu atau Hentian Kadar untuk mengunci keuntungan dan mengurangkan kerugian.
Menyesuaikan parameter had dan masa dagangan mengikut ciri-ciri dagangan yang berbeza dapat meningkatkan keberkesanan strategi.
Menggunakan teknik seperti pembelajaran penguatan untuk menetapkan parameter pengoptimuman isyarat pada cakera.
Strategi ini secara keseluruhannya agak mudah dan praktikal. Ia menggunakan kaedah pengiraan DI untuk menentukan arah trend; dengan mengehadkan parameter penapisan isyarat; boleh berdagang dua hala, atau hanya boleh melakukan lebih atau kosong; menyokong tempoh masa perdagangan yang ditetapkan. Kelebihan utama adalah kebolehpercayaan yang tinggi, isyarat penapisan yang berkesan.
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Noro's DI Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
len = input(title="Length", defval=14)
limit = input(3, title = "limit, %")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
//DI
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementMinus = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
//Trend
trend = 0
trend := DIPlus > DIMinus + limit ? 1 : DIPlus < DIMinus - limit ? -1 : trend[1]
//Background
col = trend == 1 ? lime : red
bgcolor(col, transp = 80)
//Lines
plot(DIPlus, color=lime, title="DI+", linewidth = 3)
plot(DIMinus, color=red, title="DI-", linewidth = 3)
//Trading
size = strategy.position_size
lot = 0.0
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]
if trend == 1
strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if trend == -1
strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if time > timestamp(toyear, tomonth, today, 23, 59)
strategy.close_all()