Idea teras strategi ini adalah menggabungkan penunjuk pelbagai ruang dengan purata bergerak asas, untuk mencapai trend mengikuti dan perdagangan berbalik arah. Apabila harga dan penunjuk selaras, ikuti trend; Apabila harga dan penunjuk berlawanan arah, ambil perdagangan berbalik arah.
Strategi ini adalah berdasarkan kepada tiga penunjuk yang boleh disesuaikan:
Indikator Trending: mengira hubungan antara harga dan saluran overbought dan oversold, menilai trend overhead dan overhead, mengembalikan tiga keadaan 1, 0, -1.
Overbuy oversell channel ((Tsl): merujuk ATR mengira atas dan bawah, harga menembusi atas dianggap sebagai overbuy, menembusi bawah dianggap sebagai oversell.
Rata-rata Bergerak Asas ((MA): Pengiraan purata bergerak sederhana harga penutupan 20 kitaran.
Khususnya, strategi berdasarkan nilai indikator kosong menilai harga dalam keadaan bermulut, goyah atau kosong. Apabila indikator kosong adalah 1, mewakili keadaan bermulut; Apabila indikator kosong adalah -1, mewakili keadaan kosong. Apabila harga selaras dengan arah indikator, maka ambil strategi mengikuti trend, melakukan lebih banyak kosong pada titik yang sesuai.
Di samping itu, harga menembusi purata bergerak juga berfungsi sebagai isyarat tambahan untuk membimbing arah perdagangan. Harga naik ketika melintasi purata di atas dan turun ketika melintasi purata di bawah.
Strategi perdagangan berbilang hala adalah seperti berikut:
Indikator overhead > 0, kenaikan harga menembusi landasan, termasuk dalam keadaan trend track, lakukan lebih banyak.
Indeks kosong < 0, harga turun menembusi bawah landasan, tergolong dalam keadaan pembalikan trend, kosong.
Harga penutupan > harga pembukaan > titik pusat, dilihat sebagai peluang untuk melakukan lebih banyak, melakukan lebih banyak untuk menembusi pusat.
Harga penutupan telah melangkaui landasan, dan harga penutupan > purata bergerak, lakukan lebih banyak.
Strategi perdagangan kosong adalah seperti berikut:
Indikator plurality < 0, harga turun menembusi kebawah, tergolong dalam keadaan trend mengikuti, membuat kosong.
Indikator lebihan > 0, kenaikan harga menembusi landasan, tergolong dalam keadaan pembalikan trend, lakukan lebih banyak.
Harga pembukaan > harga penutupan < titik pusat, dianggap sebagai peluang penembusan pusat untuk melakukan shorting, melakukan shorting.
Harga penutupan menembusi ke bawah, dan harga penutupan < purata bergerak, kosong.
Strategi kedudukan sejajar adalah lebih mudah, menghentikan kerugian melalui penembusan semula harga.
Strategi ini mempunyai kelebihan berikut:
Indikator multispace dapat menilai pergerakan pasaran dengan tepat dan merupakan indikator utama strategi.
Kaedah overbought dan oversold yang digabungkan dengan penunjuk ini dapat menunjukkan peluang untuk membalikkan keadaan.
Rata-rata bergerak asas boleh digunakan sebagai penapis tambahan untuk mengelakkan penembusan palsu.
Titik pusat digabungkan dengan indikator polygonal, membentuk titik perdagangan berkemungkinan tinggi.
Dengan keupayaan untuk menjejaki trend dan membalikkan perdagangan, peluang keuntungan lebih banyak.
Terlalu banyak membeli dan terlalu banyak menjual saluran stop loss jelas dan ringkas, yang membantu mengawal risiko.
Strategi ini juga mempunyai risiko:
Indikator multifungsi mungkin memberi isyarat yang salah dan memerlukan penapisan gabungan dengan indikator lain.
Ia adalah satu-satunya cara untuk menembusi pasaran yang tidak boleh dijumpai.
Pengaturan purata bergerak yang tidak betul boleh menyebabkan kehilangan trend atau menghasilkan isyarat palsu.
Titik pusat memerlukan pengesahan semula kebolehpercayaan kebarangkalian.
Saluran overbuy oversell memerlukan parameter yang dioptimumkan untuk menyesuaikan diri dengan pelbagai jenis.
Parameter penunjuk tidak sepadan, yang boleh menyebabkan perdagangan yang kerap.
Langkah-langkah berikut boleh diambil untuk menangani risiko ini:
Bersama-sama dengan petunjuk lain seperti garis K, buktikan jumlah pertukaran tanda petunjuk polygon.
Berpegang teguh pada strategi hentian kerugian saluran overbought dan oversold, hentikan kerugian dengan cepat.
Uji pelbagai parameter purata bergerak untuk mencari parameter terbaik.
Mengkaji semula kebarangkalian strategi titik pusat yang disahkan.
Mengoptimumkan parameter saluran untuk mencari kombinasi parameter terbaik untuk pelbagai jenis.
Menyesuaikan parameter penunjuk supaya sistem keseluruhan berjalan dengan stabil.
Strategi ini juga boleh dioptimumkan dalam beberapa aspek:
Menambah algoritma pembelajaran mesin, menggunakan data besar untuk melatih penunjuk kosong. Ia dapat meningkatkan ketepatan penunjuk dan mengurangkan isyarat yang salah.
Menambah saluran penyesuaian, menyesuaikan parameter saluran secara automatik mengikut turun naik pasaran. Dapat meningkatkan ketepatan penembusan.
Menggunakan pembelajaran mendalam untuk mengekstrak lebih banyak metrik perubahan dan membentuk set metrik untuk mengoptimumkan strategi kemasukan dan keluar.
Menambah algoritma berhenti-rugi yang lebih maju untuk menjejaki trend berhenti-rugi dan mengelakkan terbalik berhenti-rugi.
Mengoptimumkan parameter dan ujian gabungan untuk meningkatkan kestabilan strategi keseluruhan.
Menambah modul pengurusan wang untuk menjadikan kawalan risiko lebih saintifik.
Strategi ini mewujudkan gabungan organik trend track dan trend reversal dengan menentukan struktur pasaran melalui indikator multifungsi, dan saluran, menghasilkan isyarat perdagangan rata-rata bergerak. Ia mempunyai kelebihan prestasi indikator yang baik, peluang perdagangan yang banyak, dan penghentian kerugian yang jelas.
/*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)