Từ YouTube: "Chiến lược đường thẳng EMA đôi kỳ diệu"

Tác giả:Giấc mơ nhỏ, Tạo: 2022-10-09 15:56:22, Cập nhật: 2023-09-15 20:50:38

img

Từ YouTube: "Chiến lược đường thẳng EMA đôi kỳ diệu"

Trong bài viết này, chúng ta sẽ khám phá một chiến lược "truyền thẳng đường EMA đôi kỳ diệu" từ YouTube, được gọi là chiến lược giết chết thị trường chứng khoán và tiền điện tử. Tôi đã xem video và biết rằng chiến lược này là một chiến lược ngôn ngữ pine của trading view, sử dụng 2 chỉ số trading view.

Các chỉ số được sử dụng trong chiến lược

Chỉ số EMA 1

Vì sự đơn giản của thiết kế, chúng tôi đã không sử dụng Moving Average Exponential như trong video. Chúng tôi đã sử dụng ta.ema tích hợp trong trading view thay vì (thực tế là tất cả đều giống nhau).

2 VuManChu Swing Free chỉ số

Đây là một chỉ số trên Trading View, chúng ta cần phải truy cập và tải mã nguồn xuống trên Trading View.

img

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

Logic chiến lược

EMA chỉ số: Chiến lược sử dụng hai đường EMA trung bình, một đường nhanh (đối với các tham số chu kỳ nhỏ) và một đường chậm (đối với các tham số chu kỳ lớn).

  • Đặt hàng nhiều đầu Tuyến nhanh nằm phía trên đường chậm.

  • Đặt hàng trống Tuyến nhanh nằm bên dưới đường chậm.

Chỉ số VuManChu Swing Free: Chỉ số VuManChu Swing Free được sử dụng để phát ra tín hiệu, sau đó kết hợp với các điều kiện khác để quyết định liệu có giao dịch đặt hàng hoặc không. Có thể thấy từ mã nguồn của chỉ số VuManChu Swing Free: biến LongCondition đại diện cho tín hiệu mua và biến ShortCondition đại diện cho tín hiệu bán.

Chúng ta sẽ nói về các điều kiện kích hoạt tín hiệu giao dịch cụ thể theo chiến lược:

Một, quy tắc nhập nhiều đầu: Giá đóng của đường dương K sẽ nằm trên đường EMA nhanh, hai đường EMA trung bình sẽ hiển thị nhiều đầu (dòng nhanh nằm trên đường chậm) và chỉ số VuManChu Swing Free sẽ xuất hiện tín hiệu mua (dòng dài là đúng). Ba điều kiện được thực hiện, đường K là đường K quan trọng để nhiều bước vào, và giá đóng của đường K là vị trí bước vào.

2, Quy tắc nhập không (đối ngược với đa đầu): Giá đóng của đường K là bên dưới đường EMA nhanh, hai đường EMA trung bình sẽ hiển thị hàng đầu trống (đường nhanh bên dưới đường chậm) và chỉ số VuManChu Swing Free sẽ xuất hiện tín hiệu bán (đường ngắn là đúng).

Logic giao dịch không phải là rất đơn giản, vì không có lời chỉ dẫn cụ thể về stop loss trong video xuất hiện, bạn có thể tự do chơi ở đây bằng cách sử dụng một phương pháp stop loss so sánh trung tâm, sử dụng số điểm cố định stop loss, theo dõi stop loss.

Thiết kế mã

Trong khi đó, các nhà nghiên cứu đã nghiên cứu và phát triển các phương pháp sử dụng mã của VuManChu Swing Free, và chúng tôi đã đưa chúng trực tiếp vào mã chiến lược của mình.

img

Sau đó, chúng tôi viết một đoạn mã trong ngôn ngữ Pine để thực hiện các chức năng giao dịch:

// 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.可以看到,当buyCondition为真时即:

1, Long Condition biến là true ((VuManChu Swing Free chỉ số phát ra nhiều tín hiệu hơn) ). 2, emaFast > emaSlow (EMA xếp hạng nhiều tiêu đề) ≠ 3, close > open (định giá hiện tại là đường nắng), close > emaFast (định giá đóng ở trên đường nắng EMA).

Có 3 điều kiện:

B.当sellCondition为真时,则做空的三个条件成立(这里不再赘述)。

Sau đó, trong trường hợp một tín hiệu quyết định điều kiện if được kích hoạt, hãy sử dụng hàm entry.entry để bắt đầu giao dịch, đồng thời thiết lập hàm stop.exit để theo dõi stop.

Mã đầy đủ

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

Kiểm tra lại

Lưu ý: Lưu ý rằng, các thử nghiệm được thực hiện trong khoảng thời gian từ tháng 1 năm 2022 đến tháng 10 năm 2022, với chu kỳ K là 15 phút, sử dụng mô hình giá đóng cửa để kiểm tra lại. Các thị trường chọn Binance's ETH_USDT Forever Contract. Các tham số được thiết lập theo các tham số trong video phát hành là 50 chu kỳ đường nhanh, 200 chu kỳ đường chậm, các tham số khác không thay đổi theo mặc định.

img

img

Kết quả kiểm tra lại Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma Ma, nhiều lần kiểm tra lại cho thấy các tham số này có một số ảnh hưởng đến kết quả kiểm tra lại. Tôi cảm thấy khía cạnh này cũng cần phải tối ưu hóa thiết kế.

Chúng ta hãy thử thay thế một hợp đồng vĩnh cửu BTC_USDT:

img

Kết quả trên BTC cũng bùng nổ:

img

img

Địa chỉ chiến lược:https://www.fmz.com/strategy/385745

Có vẻ như phương pháp giao dịch này cho xu hướng bắt chước vẫn tương đối đáng tin cậy, có thể tiếp tục tối ưu hóa thiết kế dựa trên ý tưởng này. Bài viết này chúng tôi không chỉ hiểu ý tưởng của một chiến lược song tuyến, mà còn hiểu cách sử dụng chiến lược của vị thần thượng đế của đường ống dầu để xử lý và học. OK, mã chiến lược trên chỉ là một số nhỏ mà tôi đã trích dẫn, kết quả kiểm tra lại cũng không đại diện cho hiệu quả thực tế cụ thể, về thiết kế mã chiến lược, chỉ để tham khảo.


Có liên quan

Thêm nữa

fantadongCó phải chiến lược này cũng là một tham số của con số không?

hyc1743Dream Big, tại sao biểu tượng hiển thị tín hiệu nhưng máy tính không mở? /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cae1c5d5b26ec763ea6.jpg /upload/asset/23d49ff4aec3475793e5e.jpg

Những đám mây nhẹMôn Đà, đề nghị tìm hai hoặc ba chiến lược đại diện từ đường ống dầu, viết lại khó khăn hơn, hàm, tham số, phương thức xử lý nhiều hơn để làm một vài phiên bản hướng dẫn văn bản, chẳng hạn như với một loại hình tương tự như line.delete. Tôi đã học được một vài chiến lược kết hợp không quá phức tạp, thay đổi hơn một chục chiến lược kết hợp, một hoặc hai trong số đó thực sự là kết quả truy cập dữ liệu 21 năm 22 năm rất tốt, và đã được thử nghiệm trên ổ đĩa thực, nhưng gặp phải các thao tác tham số hàm phức tạp như: line: 62 Could not find function or function reference 'line.delete', nhưng trong tài liệu FMZ PINE Script không tìm thấy giải thích liên quan đến line.delete, cách sử dụng, vòng tròn, vì vậy hy vọng bạn có thể tìm ra một chút chiến lược phức tạp để viết lại, tất nhiên, chú thích cũng tốt hơn. Xin cảm ơn bạn rất nhiều.

HaykoThời gian chọn: 21 tháng 4 - 10 tháng 10 BTC khá tồi tệ

yingjunBạn có thể giải thích cho tôi điều đó không? ví dụ, mặc định 30 có nghĩa là BTC giảm 30 đồng? dừng lỗ?

Những đám mây nhẹXin vui lòng, liệu PINE có thể viết một cách ngăn ngừa ngứa hơi phức tạp không? Ví dụ như ngăn ngừa ngứa cấp độ như vậy? Nếu Pine có thể được kết hợp với JS, ví dụ như viết chỉ số bằng Pine, viết phần giao dịch trong JS sẽ thuận tiện hơn................................................................................................................................................................................................................................

yingjunCác đĩa thực sẽ có lỗi vào năm 2022

fmzeroChiến lược lưu trữ gợi ý trò chơi này. REST: sql: no rows in result set Không có hàng trong result set

fmzeroMơ là một kẻ bạo lực.

Giấc mơ nhỏTrong khi đó, các nhà đầu tư cũng đã đưa ra các chiến lược để tạo ra xu hướng trong thị trường này.

Giấc mơ nhỏKhông lịch sự.

hyc1743Cảm ơn bạn.

Giấc mơ nhỏXin chào, điều này là bởi vì dấu BUY trên biểu đồ chỉ là một dấu hiệu cho thấy các chỉ số trong bài viết, sau đó là một đường thẳng. `` //Plot mua và bán nhãn 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)) `` plotshape ((longCondition, title = "Buy Signal", text ="BUY Khi biểu đồ hiển thị, chỉ có các điều kiện longCondition phù hợp. Các điều kiện sau đây được đặt trong phần này: `` if buyChế độ và chiến lược.position_size == 0 strategy.entry (("long", strategy.long, amount) strategy.exit (("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) if sellChế độ và chiến lược.position_size == 0 Strategy.entry (("short", strategy.short, amount) là một tên gọi của một tên gọi khác. strategy.exit (("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) ``

Những đám mây nhẹKhông có gì ngạc nhiên, tôi hiểu, cảm ơn.

Giấc mơ nhỏline đối tượng này chưa được hỗ trợ trên FMZ, vì vậy một số đường dây như vậy có thể không thay đổi. Một số chính sách đã sử dụng đối tượng này để tham gia tính toán.

Giấc mơ nhỏCó lẽ là do quá nhiều thời gian và quá nhiều dữ liệu.

Giấc mơ nhỏCác bài học ngôn ngữ Pine có các chương có mô tả, bạn có thể xem tại: https://www.fmz.com/bbs-topic/9390#%E5%B8%A6%E8%B7%F%E8%B8%AA%E6%AD%A2%E6%8D%9F%E6%AD%A2%E7%9B%88%E7%9A%84%E8%B6%85%E7%BA%A7%E8%B6%8B%E5%8A%BF%E7%AD%96%E7%95%A5

Những đám mây nhẹỒ, tôi đặt 1 năm hoặc 10 tháng, về cơ bản tôi sẽ hoàn thành, và sau một năm tôi sẽ có lời khuyên này hoặc một loạt các lời khuyên khác.

Giấc mơ nhỏKhông có giới hạn, thông báo lỗi này có lẽ là phạm vi thời gian kiểm tra quá lớn.

Những đám mây nhẹTôi chọn ngày 1 tháng 1 năm 2021 đến ngày 11 tháng 10 năm 2022, chỉ ra lỗi: RuntimeError: abort(undefined) at Error at jsStackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096171) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096345) at abort (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :192x:1408) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :2096171) at stackTrace (eval at self.onmessage (https://www.fmz.fmz Tuy nhiên, nếu không thay đổi khoảng thời gian, nó sẽ được kiểm tra lại một cách bình thường.....

Giấc mơ nhỏPine nên có thể thiết kế các nút ngắt phức tạp hơn, nhưng chưa được tích hợp trong mã JS.

Giấc mơ nhỏBạn có thể gửi ảnh chụp để xem thông tin cụ thể về lỗi.

Giấc mơ nhỏỒ, xin lỗi, tôi đã thay đổi chính sách địa chỉ.