"Magic Double EMA Strategy" dari para Veteran YouTube

Penulis:Lydia, Dibuat: 2022-11-07 12:02:31, Diperbarui: 2023-09-15 20:51:23

img

Magic Double EMA Strategy dari para Veteran YouTube

Dalam edisi ini, kami akan membahas Magic Double EMA Strategy dari YouTube, yang dikenal sebagai the Killer of Stock and Cryptocurrency Market. Saya menonton video dan belajar bahwa strategi ini adalah strategi bahasa trading view Pine yang menggunakan 2 indikator trading view. Efek backtesting dalam video sangat baik, dan FMZ juga mendukung bahasa trading view Pine, jadi saya tidak bisa membantu tetapi ingin backtest dan analisis sendiri. Jadi mari kita mulai bekerja! Mari kita replikasikan strategi dalam video.

Indikator yang digunakan oleh strategi

  1. Indikator EMA

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).

  1. VuManChu Swing Free Indikator

Ini adalah indikator pada Trading View, kita perlu pergi ke Trading View dan mengambil kode sumber.

img

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")

Logika Strategi

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:

  1. 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).

  2. 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.

Desain kode

Kode untuk indikator VuManChu Swing Free, kita masukkan ke kode strategi langsung tanpa perubahan.

img

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:

  1. Variabel longCondition benar (Indikator VuManChu Swing Free mengirimkan sinyal posisi panjang).
  2. EmaFast > emaSlow (EMA posisi panjang selaras).
  3. close > open (berarti BAR saat ini positif), close > emaFast (berarti harga penutupan berada di atas garis cepat EMA).

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.

Kode Lengkap

/*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)

Backtest

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.

img

img

img

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:

img

Hasil backtest pada BTC juga sangat menguntungkan:

img

img

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!


Berkaitan

Lebih banyak