
Dalam isu ini, kita akan membincangkan “strategi purata bergerak EMA berganda ajaib” daripada YouTube, yang dipanggil “pembunuh pasaran saham dan mata wang kripto.” Selepas menonton video, saya mengetahui bahawa strategi ini ialah strategi bahasa pain paparan perdagangan, yang menggunakan 2 penunjuk paparan dagangan. Melihat keputusan ujian belakang dalam video adalah sangat baik, dan FMZ juga menyokong bahasa Pine Trading View, saya tidak dapat membantu tetapi ingin menguji semula dan menguji analisis sendiri. Kemudian mulakan seluruh hidup! Mari kita ulangi strategi dalam video.
Demi kesederhanaan dalam reka bentuk, kami tidak akan menggunakan Purata Pergerakan Eksponen yang disenaraikan dalam video. Kami menggunakan ta.ema terbina dalam dalam paparan dagangan sebaliknya (sebenarnya ia adalah sama).
Ini adalah penunjuk pada Paparan Dagangan Kita perlu pergi ke Paparan Dagangan dan muat turun kod sumber.

Kod Percuma VuManChu Swing:
// 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")
Penunjuk EMA: Strategi menggunakan dua purata bergerak EMA, satu garis pantas (parameter kitaran kecil) dan satu garis perlahan (parameter kitaran besar). Fungsi utama purata bergerak EMA berganda adalah untuk membantu kami menentukan arah aliran pasaran.
Susunan panjang Garisan pantas berada di atas garisan perlahan.
Susunan pendek Garisan pantas berada di bawah garisan perlahan.
Penunjuk VuManChu Swing Free: Penunjuk VuManChu Swing Free digunakan untuk menghantar isyarat, dan kemudian digabungkan dengan syarat lain untuk menentukan sama ada untuk membuat pesanan untuk perdagangan. Daripada kod sumber penunjuk VuManChu Swing Free, kita dapat melihat bahawa pembolehubah longCondition mewakili isyarat beli, dan pembolehubah shortCondition mewakili isyarat jual. Kedua-dua pembolehubah ini akan digunakan semasa menulis syarat pesanan nanti.
Sekarang mari kita bercakap tentang isyarat perdagangan tertentu yang mencetuskan syarat strategi:
Peraturan untuk memasuki kedudukan panjang: Harga penutupan garis K yang positif hendaklah berada di atas garisan pantas EMA, kedua-dua purata bergerak EMA hendaklah dalam susunan menaik (garisan pantas berada di atas garisan perlahan), dan penunjuk VuManChu Swing Free harus menunjukkan isyarat beli (longCondition adalah benar). Jika ketiga-tiga syarat dipenuhi, K-line ini adalah kunci K-line untuk memasuki kedudukan panjang, dan harga penutupan K-line ini adalah kedudukan kemasukan.
Peraturan untuk memasukkan kedudukan pendek (bertentangan dengan kedudukan panjang): Harga penutup batang lilin negatif hendaklah berada di bawah garisan EMA pantas, dua purata bergerak EMA hendaklah berada dalam kedudukan pendek (garisan pantas berada di bawah garisan perlahan), dan penunjuk VuManChu Swing Free harus menunjukkan isyarat jual (shortCondition). adalah benar). Sekiranya ketiga-tiga syarat itu dipenuhi, harga penutupan K-line ini adalah titik masuk untuk jualan pendek.
Bukankah logik dagangan sangat mudah Memandangkan video sumber tidak menyatakan ambil untung dan henti rugi, editor akan menggunakan kaedah ambil untung dan henti rugi yang lebih sederhana, menggunakan henti rugi dan penjejakan mata tetap ambil untung.
Kami meletakkan kod penunjuk VuManChu Swing Free terus ke dalam kod strategi kami secara utuh.

Kemudian kami menulis sekeping kod bahasa Pine untuk melaksanakan fungsi transaksi:
// 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) // 计算快线EMA
emaSlow = ta.ema(close, slowEmaPeriod) // 计算慢线EMA
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)
A. Seperti yang anda boleh lihat, apabila buyCondition adalah benar:
- Pembolehubah longCondition adalah benar (penunjuk VuManChu Swing Free menghantar isyarat untuk pergi long).
- emaFast > emaSlow (aturan kenaikkan EMA).
- tutup > buka (menunjukkan bahawa BAR semasa ialah garisan positif), tutup > emaFast (menunjukkan bahawa harga penutupan berada di atas garisan pantas EMA).
Tiga syarat untuk pergi lama dipenuhi.
B. Apabila sellCondition adalah benar, tiga syarat untuk jualan pendek dipenuhi (tidak dijelaskan di sini).
Kemudian, apabila keadaan if menentukan bahawa isyarat dicetuskan, gunakan fungsi strategi.entry untuk memasuki pasaran dan membuka kedudukan, dan tetapkan fungsi strategi.exit untuk menghentikan kerugian dan mengekori keuntungan.
/*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)
Julat masa ujian belakang dipilih dari Januari 2022 hingga Oktober 2022, tempoh K-line ialah 15 minit dan model harga penutup digunakan untuk ujian balik. Pasaran memilih kontrak kekal ETH_USDT Binance. Tetapan parameter adalah seperti yang dinyatakan dalam video sumber: 50 titik untuk garis cepat dan 200 titik untuk garis perlahan, dan parameter lain kekal tidak berubah secara lalai. Saya agak subjektif dalam menetapkan stop loss dan mengekori mata keuntungan dan hanya menetapkannya pada 30 mata.


Keputusan backtest adalah begitu-begitu Selepas beberapa ujian belakang, nampaknya parameter seperti take-profit dan stop-loss mempunyai beberapa kesan pada keputusan backtest. Saya merasakan bahawa aspek ini memerlukan pengoptimuman selanjutnya. Walau bagaimanapun, kadar kemenangan masih baik selepas isyarat strategi mencetuskan transaksi.
Mari cuba kontrak kekal BTC_USDT:

Keputusan ujian belakang pada BTC juga meletup:


Alamat strategi: https://www.fmz.com/strategy/385745
Nampaknya kaedah dagangan ini agak boleh dipercayai untuk memahami arah aliran, dan reka bentuk boleh dioptimumkan lagi berdasarkan idea ini. Dalam artikel ini, kami bukan sahaja mempelajari idea strategi purata bergerak berganda, tetapi juga mempelajari cara memproses dan mempelajari strategi pakar di YouTube. OK, kod strategi di atas hanyalah cadangan saya Hasil ujian belakang tidak mewakili keputusan sebenar yang khusus Kod dan reka bentuk strategi adalah untuk rujukan sahaja. Terima kasih atas sokongan anda, jumpa lagi di lain kali!