Ide inti dari strategi ini adalah untuk menggabungkan indikator dorongan ganda dengan garis rata-rata bergerak dasar untuk menerapkan tren berikut dan perdagangan pembalikan tren.
Strategi ini terutama didasarkan pada tiga indikator khusus:
Indikator Dorongan Dual (Trend): Menghitung hubungan antara harga dan saluran overbought/oversold untuk menentukan tren bullish dan bearish, mengembalikan 1, 0, -1 tiga keadaan.
Saluran Overbought/Oversold (Tsl): Menghitung rel atas dan bawah dengan mengacu pada ATR. Menembus rel atas dianggap terlalu banyak dibeli, dan menembus rel bawah dianggap terlalu banyak dijual.
Garis Rata-rata Bergerak Dasar (MA): Menghitung rata-rata bergerak sederhana 20 periode dari harga penutupan.
Secara khusus, strategi menilai apakah harga berada dalam keadaan bullish, sideways atau bearish sesuai dengan nilai indikator dorongan ganda. Ketika indikator dorongan ganda adalah 1, itu berarti keadaan bullish; ketika indikator dorongan ganda adalah -1, itu berarti keadaan bearish. Pada titik ini, jika harga berada di arah yang sama dengan indikator, strategi mengikuti tren diadopsi, pergi panjang atau pendek di tempat yang tepat. Jika harga berada di arah yang berlawanan dari indikator, seperti indikator yang menunjukkan bullish sementara harga menerobos rel bawah, strategi pembalikan diadopsi dengan pergi pendek untuk menangkap keuntungan.
Selain itu, penembusan harga pada garis rata-rata bergerak juga berfungsi sebagai sinyal tambahan untuk membimbing arah perdagangan.
Strategi perdagangan jangka panjang yang spesifik adalah sebagai berikut:
Indikator dorongan ganda > 0, harga naik untuk menembus rel atas, yang termasuk tren mengikuti, pergi panjang.
Indikator dorongan ganda < 0, harga jatuh untuk menembus rel bawah, yang termasuk dalam pembalikan tren, pergi pendek.
Harga penutupan > Harga pembukaan > Tingkat pivot, dianggap sebagai pemecahan pivot untuk pergi panjang, pergi panjang.
Harga penutupan melewati rel atas, dan harga penutupan > Garis rata-rata bergerak, pergi panjang.
Strategi perdagangan pendek adalah sebagai berikut:
Indikator dorongan ganda < 0, harga turun untuk menembus rel bawah, yang termasuk tren mengikuti, pergi pendek.
Indikator dorongan ganda > 0, harga naik untuk menembus rel atas, yang termasuk dalam pembalikan tren, pergi panjang.
Harga pembukaan > Harga penutupan < Tingkat pivot, dianggap sebagai pemecahan pivot untuk pergi pendek, pergi pendek.
Harga penutupan pecah melalui rel bawah, dan harga penutupan < Garis rata-rata bergerak, pergi pendek.
Strategi keluar sederhana dengan menghentikan kerugian ketika harga menembus saluran overbought / oversold lagi.
Strategi ini memiliki keuntungan berikut:
Indikator dorongan ganda dapat menentukan tren pasar dengan akurat dan merupakan indikator inti dari strategi.
Saluran overbought/oversold dikombinasikan dengan indikator dapat menemukan potensi peluang pembalikan.
Garis rata-rata bergerak dasar dapat berfungsi sebagai sinyal penyaringan tambahan untuk menghindari kebocoran palsu.
Titik pivot dikombinasikan dengan indikator dorongan ganda membentuk titik perdagangan kemungkinan tinggi.
Ini memiliki kedua tren mengikuti dan reversal trading kemampuan untuk lebih banyak peluang keuntungan.
Stop loss saluran overbought/oversold sederhana dan jelas, yang bermanfaat untuk pengendalian risiko.
Strategi ini juga memiliki risiko berikut:
Indikator dorongan ganda dapat memberikan sinyal yang salah, dan perlu disaring dengan indikator lain.
Perdagangan breakout cenderung terjebak, sehingga diperlukan stop loss yang ketat.
Pengaturan periode rata-rata bergerak yang tidak benar dapat melewatkan tren atau menghasilkan sinyal palsu.
Titik pivot perlu backtesting untuk memverifikasi keandalan probabilitas.
Saluran overbought/oversold membutuhkan optimalisasi parameter untuk beradaptasi dengan produk yang berbeda.
Ketidakcocokan parameter indikator dapat menyebabkan perdagangan yang sering.
Untuk mengatasi risiko ini, langkah-langkah berikut dapat diambil:
Gabungkan indikator lain seperti K-line, volume untuk memverifikasi sinyal indikator dorongan ganda.
Ikuti secara ketat strategi stop loss saluran overbought/oversold untuk stop loss cepat.
Uji parameter periode rata-rata bergerak yang berbeda untuk menemukan yang optimal.
Uji kembali kemungkinan strategi pivot point.
Optimalkan parameter untuk menemukan kombinasi optimal untuk setiap produk.
Sesuaikan parameter indikator untuk menjaga keseluruhan sistem berjalan lancar.
Strategi ini juga dapat dioptimalkan dalam aspek berikut:
Meningkatkan algoritma pembelajaran mesin untuk melatih indikator dorongan ganda dengan data besar. Ini dapat meningkatkan akurasi dan mengurangi sinyal palsu.
Tambahkan saluran adaptif untuk menyesuaikan parameter saluran secara otomatis berdasarkan volatilitas pasar.
Gunakan pembelajaran mendalam untuk mengekstrak indikator yang lebih berubah untuk mengoptimalkan strategi masuk dan keluar.
Tambahkan algoritma stop loss canggih yang dapat melacak tren untuk stop loss, menghindari dihentikan oleh pembalikan.
Melakukan optimasi parameter dan tes kombinasi untuk meningkatkan stabilitas strategi secara keseluruhan.
Tambahkan modul manajemen risiko untuk kontrol risiko yang lebih ilmiah.
Strategi ini menggabungkan trend following dan trend reversal secara organik dengan menilai struktur pasar dengan indikator dorongan ganda dan menghasilkan sinyal perdagangan dengan saluran dan garis rata-rata bergerak. Strategi ini memiliki keuntungan efektivitas indikator yang baik, peluang perdagangan yang melimpah, dan stop loss yang jelas. Pada saat yang sama, strategi ini juga memiliki risiko tertentu yang perlu dioptimalkan lebih lanjut untuk meningkatkan stabilitas. Secara keseluruhan, strategi ini sepenuhnya mengintegrasikan ide-ide perdagangan tren dan reversal, dan layak penelitian dan penerapan lebih lanjut.
/*backtest start: 2023-08-25 00:00:00 end: 2023-09-24 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © amysojexson //@version=3 strategy(title="Pivots strategy", overlay=true) // Input settings // Create a pull-down menu for the pivot type pivotType = input(title="Pivot Type", options=["Daily", "Intraday", "Weekly"], defval="Daily") // Make toggles for pivot level options plotPP = input(title="Plot PP", type=bool, defval=true) plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true) plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true) plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true) plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true) // Configure session options sessRange = input(title="Trading Session", defval="0800-1600") showSess = input(title="Highlight Session?", type=bool, defval=false) // Enable or disable pivot labels showLabels = input(title="Show Labels?", type=bool, defval=false) // Step 2. Calculate indicator values // Create a function to fetch daily and weekly data GetData(res, data) => security(syminfo.tickerid, res, data[1], lookahead=barmerge.lookahead_on) // Fetch daily and weekly price data dailyHigh = GetData("D", high) dailyLow = GetData("D", low) dailyClose = GetData("D", close) weeklyHigh = GetData("W", high) weeklyLow = GetData("W", low) weeklyClose = GetData("W", close) // Determine session pivot data // First see how the price bar relates to // the session time range inSession = not na(time(timeframe.period, sessRange)[1]) sessStart = inSession and not inSession[1] sessEnd = not inSession and inSession[1] // Determine session price data sessHigh = 0.0 sessLow = 0.0 sessClose = 0.0 sessHigh := sessStart ? high : inSession ? max(high, sessHigh[1]) : na sessLow := sessStart ? low : inSession ? min(low, sessLow[1]) : na sessClose := sessEnd ? close[1] : na // Compute high, low, close from previous intra-day session highPrevSess = 0.0 lowPrevSess = 0.0 closePrevSess = 0.0 highPrevSess := sessEnd ? fixnan(sessHigh) : highPrevSess[1] lowPrevSess := sessEnd ? fixnan(sessLow) : lowPrevSess[1] closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1] // Now figure out which kind of price data // to use for the pivot calculation theHigh = if (pivotType == "Daily") dailyHigh else if (pivotType == "Intraday") highPrevSess else weeklyHigh theLow = if (pivotType == "Daily") dailyLow else if (pivotType == "Intraday") lowPrevSess else weeklyLow theClose = if (pivotType == "Daily") dailyClose else if (pivotType == "Intraday") closePrevSess else weeklyClose // Finally calculate the pivot levels pp = (theHigh + theLow + theClose) / 3 bc= (theHigh + theLow)/2 tc= (pp-bc)+pp r1 = pp+(.382*(theHigh-theLow)) s1 = pp-(.382*(theHigh-theLow)) r2 = pp +(.618*(theHigh-theLow)) s2 = pp -(.618*(theHigh-theLow)) r3 = pp +(1*(theHigh-theLow)) s3 = pp -(1*(theHigh-theLow)) // Step 3. Output indicator data // Plot the various pivot levels plot(series=plotS3R3 ? r3 : na, title="R3", style=circles, linewidth=1, color=#0023FF) plot(series=plotS2R2 ? r2 : na, title="R2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS1R1 ? r1 : na, title="R1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotTCBC ? tc : na, title="TC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotPP ? pp : na, title="PP", style=circles, linewidth=1, color=#000000) plot(series=plotTCBC ? bc : na, title="BC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotS1R1 ? s1 : na, title="S1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotS2R2 ? s2 : na, title="S2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS3R3 ? s3 : na, title="S3", style=circles, linewidth=1, color=#0023FF) // Display the pivot names on the chart, if applicable newPivots = (showLabels == false) ? false : (pivotType == "Intraday") ? sessEnd : (pivotType == "Daily") ? dayofmonth != dayofmonth[1] : dayofweek == monday and dayofmonth != dayofmonth[1] plotchar(series=newPivots and plotS3R3 ? r3 : na, char='', text="R3", offset=1, location=location.absolute, color=#0023FF, title="R3 label") plotchar(series=newPivots and plotS2R2 ? r2 : na, char='', text="R2", offset=1, location=location.absolute, color=#1E90FF, title="R2 label") plotchar(series=newPivots and plotS1R1 ? r1 : na, char='', text="R1", offset=1, location=location.absolute, color=#09E0F3, title="R1 label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="TC", offset=1, location=location.absolute, color=#FF00D1, title="TC label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="BC", offset=1, location=location.absolute, color=#FF00D1, title="BC label") plotchar(series=newPivots and plotS1R1 ? s1 : na, char='', text="S1", offset=1, location=location.absolute, color=#09E0F3, title="S1 label") plotchar(series=newPivots and plotS2R2 ? s2 : na, char='', text="S2", offset=1, location=location.absolute, color=#1E90FF, title="S2 label") plotchar(series=newPivots and plotS3R3 ? s3 : na, char='', text="S3", offset=1, location=location.absolute, color=#0023FF, title="S3 label") // Highlight the intra-day price data session on the chart bgcolor(color=showSess and inSession and (pivotType == "Intraday") ? orange : na, transp=95) // Step 4. Create indicator alerts alertcondition(condition=cross(close, s3), title="Pivot S3 Cross", message="Prices crossed Pivot S3 level") alertcondition(condition=cross(close, s2), title="Pivot S2 Cross", message="Prices crossed Pivot S2 level") alertcondition(condition=cross(close, s1), title="Pivot S1 Cross", message="Prices crossed Pivot S1 level") alertcondition(condition=cross(close, tc), title="Pivot TC Cross", message="Prices crossed Pivot TC level") alertcondition(condition=cross(close, pp), title="Pivot PP Cross", message="Prices crossed the main Pivot Point level") alertcondition(condition=cross(close, bc), title="Pivot BC Cross", message="Prices crossed Pivot BC level") alertcondition(condition=cross(close, r1), title="Pivot R1 Cross", message="Prices crossed Pivot R1 level") alertcondition(condition=cross(close, r2), title="Pivot R2 Cross", message="Prices crossed Pivot R2 level") alertcondition(condition=cross(close, r3), title="Pivot R3 Cross", message="Prices crossed Pivot R3 level") MA = sma(close, 20) plot(MA, color=red) Factor = input(2, type=float) Pd = input(10, minval=1,maxval = 100) Up = hl2-(Factor*atr(Pd)) Dn = hl2+(Factor*atr(Pd)) TrendUp = 0.0 TrendUp := close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown = 0.0 TrendDown := close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn Trend = 0.0 Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) Tsl = Trend==1? TrendUp: TrendDown plot(Tsl, color=blue) if close>open if open<pp if close>pp if close>MA strategy.entry("long", true) if close<open if open>pp if close<pp if close<MA strategy.entry("short", false) strategy.close("long", when = open<Tsl) strategy.close("short", when = open>Tsl)