Idea utama strategi ini adalah untuk menggabungkan penunjuk dorongan berganda dengan garis purata bergerak asas untuk melaksanakan perdagangan trend berikut dan pembalikan trend. Apabila harga berada dalam arah yang sama dengan penunjuk, ikuti trend; apabila harga berada dalam arah yang bertentangan dengan penunjuk, ambil perdagangan pembalikan.
Strategi ini terutamanya berdasarkan tiga penunjuk khusus:
Penunjuk Dorongan Berganda (Trend): Mengira hubungan antara harga dan saluran overbought / oversold untuk menentukan trend menaik dan menurun, mengembalikan 1, 0, -1 tiga keadaan.
Saluran Overbought/Oversold (Tsl): Mengira landasan atas dan bawah dengan merujuk kepada ATR. Menembusi landasan atas dianggap terlalu banyak, dan menembusi landasan bawah dianggap terlalu banyak.
Garis Purata Bergerak Asas (MA): Mengira purata bergerak mudah 20 tempoh harga penutupan.
Secara khusus, strategi ini menilai sama ada harga berada dalam keadaan bullish, sideways atau bearish mengikut nilai penunjuk dorongan berganda. Apabila penunjuk dorongan berganda adalah 1, ia bermaksud keadaan bullish; apabila penunjuk dorongan berganda adalah -1, ia bermaksud keadaan bearish. Pada ketika ini, jika harga berada dalam arah yang sama dengan penunjuk, strategi trend yang diikuti diadopsi, pergi panjang atau pendek di tempat yang betul. Jika harga berada dalam arah yang bertentangan dengan penunjuk, seperti penunjuk menunjukkan bullish sementara harga memecahkan rel bawah, strategi pembalikan diadopsi dengan pergi pendek untuk menangkap keuntungan.
Di samping itu, penembusan harga pada garis purata bergerak juga berfungsi sebagai isyarat tambahan untuk membimbing arah perdagangan.
Strategi perdagangan panjang khusus adalah seperti berikut:
Indikator dorongan berganda > 0, harga naik untuk memecahkan rel atas, yang tergolong dalam trend berikut, pergi panjang.
Indikator dorongan berganda < 0, harga jatuh untuk memecahkan rel bawah, yang tergolong dalam pembalikan trend, pergi pendek.
Harga penutupan > Harga pembukaan > Tahap pivot, dianggap sebagai memecahkan pivot untuk pergi panjang, pergi panjang.
Harga penutupan memecahkan landasan atas, dan harga penutupan > Garis purata bergerak, pergi panjang.
Strategi perdagangan pendek adalah seperti berikut:
Indikator dorongan berganda < 0, harga jatuh untuk memecahkan rel bawah, yang tergolong dalam trend berikut, pergi pendek.
Indikator dorongan berganda > 0, harga naik untuk memecahkan rel atas, yang tergolong dalam pembalikan trend, pergi panjang.
Harga pembukaan > Harga penutupan < Tahap Pivot, dianggap sebagai mematahkan pivot untuk pergi pendek, pergi pendek.
Harga penutupan pecah melalui rel bawah, dan harga penutupan < Garis purata bergerak, pergi pendek.
Strategi keluar adalah mudah dengan menghentikan kerugian apabila harga memecahkan saluran overbought / oversold lagi.
Strategi ini mempunyai kelebihan berikut:
Penunjuk dorongan berganda dapat menentukan dengan tepat trend pasaran dan merupakan penunjuk teras strategi.
Saluran overbought/oversold digabungkan dengan penunjuk boleh mendedahkan peluang pembalikan yang berpotensi.
Garis purata bergerak asas boleh berfungsi sebagai isyarat penapisan tambahan untuk mengelakkan pecah palsu.
Titik pivot digabungkan dengan penunjuk dorongan berganda membentuk tempat dagangan yang berkemungkinan tinggi.
Ia mempunyai kedua-dua trend berikut dan pembalikan keupayaan perdagangan untuk lebih banyak peluang keuntungan.
Stop loss saluran overbought/oversold adalah mudah dan jelas, yang bermanfaat untuk kawalan risiko.
Strategi ini juga mempunyai risiko berikut:
Indikator dorongan berganda mungkin memberikan isyarat yang salah, dan perlu disaring dengan penunjuk lain.
Perdagangan breakout cenderung terperangkap, jadi pemutusan rugi yang ketat diperlukan.
Penentuan purata bergerak tempoh yang tidak betul boleh terlepas trend atau menghasilkan isyarat palsu.
Titik-titik pivot perlu backtesting untuk mengesahkan kebolehpercayaan kebarangkalian.
Saluran overbought / oversold memerlukan pengoptimuman parameter untuk menyesuaikan diri dengan produk yang berbeza.
Ketidaksesuaian parameter penunjuk boleh membawa kepada perdagangan yang kerap.
Untuk menangani risiko ini, langkah-langkah berikut boleh diambil:
Menggabungkan penunjuk lain seperti K-garis, kelantangan untuk mengesahkan isyarat penunjuk dorongan berganda.
Ikuti dengan ketat strategi stop loss saluran overbought/oversold untuk stop loss pantas.
Uji parameter purata bergerak untuk mencari yang optimum.
Uji semula kebarangkalian strategi titik pusingan.
Mengoptimumkan parameter untuk mencari kombinasi optimum untuk setiap produk.
Sesuaikan parameter penunjuk untuk memastikan keseluruhan sistem berjalan lancar.
Strategi ini juga boleh dioptimumkan dalam aspek berikut:
Meningkatkan algoritma pembelajaran mesin untuk melatih penunjuk dorongan berganda dengan data besar. Ini boleh meningkatkan ketepatan dan mengurangkan isyarat palsu.
Tambah saluran adaptif untuk menyesuaikan parameter saluran secara automatik berdasarkan turun naik pasaran. Ini boleh meningkatkan ketepatan pecah.
Gunakan pembelajaran mendalam untuk mengekstrak penunjuk yang lebih berubah untuk mengoptimumkan strategi kemasukan dan keluar.
Tambah algoritma stop loss maju yang boleh mengesan trend untuk stop loss, mengelakkan berhenti oleh pembalikan.
Melakukan pengoptimuman parameter dan ujian gabungan untuk meningkatkan kestabilan keseluruhan strategi.
Tambah modul pengurusan risiko untuk kawalan risiko yang lebih saintifik.
Strategi ini menggabungkan trend berikut dan pembalikan trend secara organik dengan menilai struktur pasaran dengan penunjuk dorongan berganda dan menjana isyarat perdagangan dengan saluran dan garis purata bergerak. Ia mempunyai kelebihan keberkesanan penunjuk yang baik, peluang perdagangan yang banyak, dan kerugian berhenti yang jelas. Pada masa yang sama, ia juga mempunyai risiko tertentu yang memerlukan pengoptimuman lanjut untuk meningkatkan kestabilan. Secara keseluruhan, strategi sepenuhnya mengintegrasikan idea perdagangan trend dan perdagangan pembalikan, dan bernilai penyelidikan dan penerapan 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)