Dalam edisi ini, kami akan membahas
Demi kesederhanaan desain, kita tidak akan menggunakan Eksponensial Moving Average yang tercantum dalam video, kita akan menggunakan built-in ta.ema dari tampilan trading sebagai gantinya (itu sebenarnya sama).
Ini adalah indikator pada Trading View, kita perlu pergi ke Trading View dan mengambil kode sumber.
Kode VuManChu Swing Free:
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with
//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Size Function
rng_size(x, qty, n)=>
// AC = Cond_EMA(abs(x - x[1]), 1, n)
wper = (n*2) - 1
avrng = ema(abs(x - x[1]), n)
AC = ema(avrng, wper)*qty
rng_size = AC
//Range Filter Function
rng_filt(x, rng_, n)=>
r = rng_
var rfilt = array.new_float(2, x)
array.set(rfilt, 1, array.get(rfilt, 0))
if x - r > array.get(rfilt, 1)
array.set(rfilt, 0, x - r)
if x + r < array.get(rfilt, 1)
array.set(rfilt, 0, x + r)
rng_filt1 = array.get(rfilt, 0)
hi_band = rng_filt1 + r
lo_band = rng_filt1 - r
rng_filt = rng_filt1
[hi_band, lo_band, rng_filt]
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")
//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")
//Range Size Inputs
rng_qty = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")
//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)
//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0
//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0
CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1
//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")
//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")
//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")
//Bar Color
barcolor(use_barcolor ? bar_color : na)
//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))
//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")
Indikator EMA: strategi menggunakan dua EMA, satu adalah garis cepat (parameter periode kecil) dan yang lain adalah garis lambat (parameter periode besar).
pengaturan posisi panjang Jalur cepat berada di atas garis lambat.
pengaturan posisi pendek Jalur cepat berada di bawah garis lambat.
Indikator VuManChu Swing Free: Indikator VuManChu Swing Free digunakan untuk mengirim sinyal dan menilai apakah akan menempatkan pesanan dalam kombinasi dengan kondisi lain.
Sekarang mari kita bicara tentang kondisi pemicu khusus dari sinyal perdagangan:
Aturan untuk masuk posisi panjang: Harga penutupan garis K positif harus berada di atas garis cepat EMA, kedua EMA harus menjadi posisi panjang (garis cepat di atas garis lambat), dan indikator VuManChu Swing Free harus menunjukkan sinyal beli (longCondition true).
Aturan untuk masuk posisi pendek (berbeda dengan posisi panjang): Harga penutupan garis K negatif harus berada di bawah garis cepat EMA, kedua EMA harus menjadi posisi pendek (garis cepat di bawah garis lambat), dan indikator VuManChu Swing Free harus menunjukkan sinyal jual (shortCondition true).
Apakah logika trading sangat sederhana? Karena video sumber tidak menentukan profit stop dan loss stop, saya akan menggunakan moderat profit stop dan loss stop metode bebas, menggunakan titik tetap untuk stop loss, dan melacak profit stop.
Kode untuk indikator VuManChu Swing Free, kita masukkan ke kode strategi langsung tanpa perubahan.
Kemudian segera setelah itu, kita menulis sepotong kode bahasa Pine yang mengimplementasikan fungsi perdagangan:
// extend
fastEmaPeriod = input(50, "fastEmaPeriod") // fast line period
slowEmaPeriod = input(200, "slowEmaPeriod") // slow line period
loss = input(30, "loss") // stop loss points
trailPoints = input(30, "trailPoints") // number of trigger points for moving stop loss
trailOffset = input(30, "trailOffset") // moving stop profit offset (points)
amount = input(1, "amount") // order amount
emaFast = ta.ema(close, fastEmaPeriod) // calculate the fast line EMA
emaSlow = ta.ema(close, slowEmaPeriod) // calculate the slow line EMA
buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast // entry conditions for long positions
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast // entry conditions for short positions
if buyCondition and strategy.position_size == 0
strategy.entry("long", strategy.long, amount)
strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
strategy.entry("short", strategy.short, amount)
strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
A.Itdapat dilihat bahwa ketika buyCondition adalah benar, yaitu:
Ketiga kondisi untuk bertahan lama.
B.Ketika sellCondition benar, tiga kondisi untuk membuat posisi pendek berlaku (tidak diulang di sini).
Kemudian kita menggunakan fungsi strategi.entry untuk masuk dan membuka posisi dalam kasus jika kondisi penilaian sinyal pemicu, dan mengaturstrategy.exitfungsi untuk menghentikan kerugian dan jejak keuntungan pada saat yang sama.
/*backtest
start: 2022-01-01 00:00:00
end: 2022-10-08 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with
//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Size Function
rng_size(x, qty, n)=>
// AC = Cond_EMA(abs(x - x[1]), 1, n)
wper = (n*2) - 1
avrng = ema(abs(x - x[1]), n)
AC = ema(avrng, wper)*qty
rng_size = AC
//Range Filter Function
rng_filt(x, rng_, n)=>
r = rng_
var rfilt = array.new_float(2, x)
array.set(rfilt, 1, array.get(rfilt, 0))
if x - r > array.get(rfilt, 1)
array.set(rfilt, 0, x - r)
if x + r < array.get(rfilt, 1)
array.set(rfilt, 0, x + r)
rng_filt1 = array.get(rfilt, 0)
hi_band = rng_filt1 + r
lo_band = rng_filt1 - r
rng_filt = rng_filt1
[hi_band, lo_band, rng_filt]
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")
//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")
//Range Size Inputs
rng_qty = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")
//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)
//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0
//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0
CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1
//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")
//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")
//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")
//Bar Color
barcolor(use_barcolor ? bar_color : na)
//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))
//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")
// extend
fastEmaPeriod = input(50, "fastEmaPeriod")
slowEmaPeriod = input(200, "slowEmaPeriod")
loss = input(30, "loss")
trailPoints = input(30, "trailPoints")
trailOffset = input(30, "trailOffset")
amount = input(1, "amount")
emaFast = ta.ema(close, fastEmaPeriod)
emaSlow = ta.ema(close, slowEmaPeriod)
buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast
if buyCondition and strategy.position_size == 0
strategy.entry("long", strategy.long, amount)
strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
strategy.entry("short", strategy.short, amount)
strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
Jangka waktu backtest adalah dari Januari 2022 hingga Oktober 2022. Periode K-line adalah 15 menit dan model harga penutupan digunakan untuk backtest. Pasar memilih kontrak abadi Binance ETH_USDT. Parameter ditetapkan sesuai dengan 50 periode jalur cepat dan 200 periode jalur lambat dalam video sumber. Parameter lainnya tetap tidak berubah secara default. Saya mengatur stop loss dan tracking stop profit point menjadi 30 poin secara subjektif.
Hasil dari backtesting adalah biasa, dan tampaknya parameter stop-loss memiliki beberapa pengaruh pada hasil backtesting. Saya merasa bahwa aspek ini masih perlu dioptimalkan dan dirancang. Namun, setelah sinyal strategis memicu perdagangan, tingkat kemenangan masih OK.
Mari kita coba kontrak abadi BTC_USDT yang berbeda:
Hasil backtest pada BTC juga sangat menguntungkan:
Strategi dari:https://www.fmz.com/strategy/385745
Tampaknya metode trading ini relatif dapat diandalkan untuk memahami tren, Anda dapat terus mengoptimalkan desain sesuai dengan ide ini. Dalam artikel ini, kita tidak hanya belajar tentang ide strategi rata-rata bergerak ganda, tetapi juga belajar bagaimana memproses dan mempelajari strategi para veteran di YouTube. OK, kode strategi di atas hanya batu bata dan mortir saya, hasil backtest tidak mewakili hasil real-bot tertentu, kode strategi, desain hanya untuk referensi. Terima kasih atas dukungan Anda, kami akan melihat Anda lain kali!