
Strategi ini berdasarkan pada indikator saluran harga, menetapkan parameter momentum, membentuk garis tengah saluran harga dengan mengira nilai purata harga tertinggi dan terendah untuk kitaran yang berbeza, dan menetapkan garis panjang dan pendek sebagai asas. Apabila harga menembusi garis panjang, lakukan lebih banyak; apabila harga menembusi garis pendek, lakukan kosong.
Strategi ini menggunakan indikator saluran harga untuk mengira purata harga tertinggi dan terendah dalam tempoh yang berbeza, membentuk garis tengah saluran harga. Dengan garis tengah sebagai asas, garis panjang dan garis pendek ditetapkan melalui parameter pergeseran. Secara khusus, formula untuk mengira garis panjang adalah: garis tengah + ((( garis tengah × parameter garis panjang%); formula untuk mengira garis pendek adalah: garis tengah + ((( garis tengah × parameter garis pendek%).
Apabila harga lebih rendah daripada garis panjang, gunakan satu-satunya harga terhad untuk membuat banyak pesanan; apabila harga lebih tinggi daripada garis pendek, gunakan satu-satunya harga terhad untuk membuka tiket kosong.
Strategi ini mempunyai kelebihan berikut:
Strategi ini mempunyai beberapa risiko:
Risiko boleh dikurangkan dengan mengoptimumkan parameter, menetapkan stop loss, atau menggabungkan penilaian indikator lain.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Strategi ini adalah berdasarkan kepada reka bentuk indikator saluran harga yang jelas, menggunakan penembusan membuka kedudukan boleh mengawal risiko dengan berkesan. Tetapi juga terdapat ruang untuk pengoptimuman parameter yang lebih besar, mekanisme hentikan kerosakan masih perlu disempurnakan dan sebagainya. Secara keseluruhan, strategi ini mempunyai nilai praktikal yang tertentu, layak untuk diuji dan dioptimumkan lebih lanjut.
/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=3
strategy(title = "Noro's PCMA Strategy v1.0", shorttitle = "PCMA 1.0", overlay = true, 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 = "Lot, %")
per = input(3, title = "Length")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
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")
//Price Channel
h = highest(high, per)
l = lowest(low, per)
c = (h + l) / 2
ll = c + ((c / 100) * longlevel)
sl = c + ((c / 100) * shortlevel)
//Lines
shortcolor = needshort ? red : na
longcolor = needlong ? lime : na
plot(sl, linewidth = 2, color = shortcolor, title = "Short line")
plot(c, linewidth = 2, color = blue, title = "SMA line")
plot(ll, linewidth = 2, color = longcolor, title = "Long line")
//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if (not na(close[per])) and size == 0 and needlong
strategy.entry("L", strategy.long, lot, limit = ll, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if (not na(close[per])) and size == 0 and needshort
strategy.entry("S", strategy.short, lot, limit = sl, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if (not na(close[per])) and size > 0
strategy.entry("Close", strategy.short, 0, limit = c, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if (not na(close[per])) and size < 0
strategy.entry("Close", strategy.long, 0, limit = c, 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()