Chiến lược giao dịch khi giá phá vỡ đường trung bình động


Ngày tạo: 2023-12-15 16:28:12 sửa đổi lần cuối: 2023-12-15 16:28:12
sao chép: 0 Số nhấp chuột: 575
1
tập trung vào
1621
Người theo dõi

Chiến lược giao dịch khi giá phá vỡ đường trung bình động

Tổng quan

Chiến lược giao dịch chuyển động giá phá vỡ đường trung bình hai chiều (Dual Direction Price Breakthrough Moving Average Timing Trading Strategy) là một chiến lược giao dịch định lượng sử dụng giá phá vỡ đường trung bình để đánh giá thời gian mua và bán. Chiến lược này sử dụng giá so sánh với trung bình di chuyển của một chu kỳ nhất định, để tạo ra giao dịch dựa trên giá vượt lên hoặc vượt xuống đường trung bình.

Nguyên tắc chiến lược

Lập luận cốt lõi của chiến lược này là:

  1. Sử dụng hàm EMA để tính toán trung bình di chuyển cho một khoảng thời gian nhất định (ví dụ: 200 ngày).

  2. So sánh giá đóng cửa với kích thước của EMA, để xác định giá có phá vỡ EMA không. Cụ thể, khi giá đóng cửa lớn hơn EMA trong ngày, giá được coi là trên EMA; khi giá đóng cửa nhỏ hơn EMA trong ngày, giá được coi là dưới EMA.

  3. Đánh giá thời gian mua và bán dựa trên sự thay đổi trên và dưới. Khi giá lên trên EMA, tạo ra tín hiệu mua; Khi giá xuống dưới EMA, tạo ra tín hiệu bán.

  4. Khi phát ra tín hiệu, đặt hàng theo tỷ lệ nhất định (ví dụ như toàn bộ kho) và sau đó đặt giá dừng và dừng.

  5. Khi giá đạt đến mức dừng lỗ hoặc giá dừng lại, hãy xóa vị trí.

  6. Đây là một vòng tròn, lợi dụng thời gian của giá phá vỡ đường trung bình.

Chiến lược này đơn giản, trực tiếp, dễ hiểu và thực hiện. Thời gian tốt hơn được đạt được bằng cách bắt tín hiệu đột phá trên đường ngắn. Nhưng cũng có một số độ trễ và nguy cơ bị rung nhiều lần.

Lợi thế chiến lược

  • Lập luận của chiến lược đơn giản, rõ ràng, dễ hiểu và xác minh.
  • Dùng tính năng đường trung bình, có khả năng theo dõi xu hướng.
  • Có nhiều giao dịch, phù hợp với hoạt động ngắn hạn.
  • Có thể phản ứng nhanh chóng với sự thay đổi giá và nắm bắt thời gian tốt hơn.

Rủi ro chiến lược

  • Có một số sự chậm trễ, có thể bỏ qua đột phá ban đầu của giá.
  • Các nhà giao dịch thường xuyên gặp phải vấn đề khi có nhiều lần đột phá.
  • Trong trường hợp có sự đảo ngược lớn, có thể có lỗ hổng.

Có thể tối ưu hóa thông qua điều chỉnh tham số, chẳng hạn như điều chỉnh tham số đường trung bình, sử dụng phán đoán chỉ số hiệu quả hơn, giảm tần suất giao dịch và các phương pháp khác. Bạn cũng có thể thiết lập dừng lỗ thích ứng hoặc giới thiệu các điều kiện lọc để kiểm soát rủi ro.

Hướng tối ưu hóa chiến lược

  • Thử các chỉ số đường trung bình với các loại và tham số khác nhau để tìm ra giải pháp tốt hơn. Ví dụ: EMA, SMA, LWMA, v.v.
  • Thêm các điều kiện lọc để tránh nhiều giao dịch rung động. Giới thiệu các phán đoán phụ trợ như khối lượng giao dịch, đường Brin, ATR.
  • Tối ưu hóa và thử nghiệm các chiến lược ngăn chặn thiệt hại để giảm nguy cơ.
  • Một hệ thống giao dịch toàn diện, kết hợp nhiều chiến lược như xu hướng và đảo ngược.
  • Thêm cấu hình tham số cho chiến lược phổ biến hơn.

Tóm tắt

Chiến lược này nói chung là đơn giản và trực quan, ý tưởng cốt lõi là theo dõi đường trung bình để nắm bắt giá đột phá ngắn hạn. Ưu điểm là phản ứng nhanh chóng, dễ thực hiện; Nhược điểm là chậm trễ và chậm trễ.

Mã nguồn chiến lược
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// 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=5
strategy(title='Range Filter - B&S Signals', shorttitle='RF - B&S Signals', initial_capital=1000, currency=currency.GBP, default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, overlay=true)


i_startTime = input(defval=timestamp('01 Jan 2020 12:00 +0000'), title='Backtest Start')
i_endTime = input(defval=timestamp('01 Jan 2024 12:00 +0000'), title='Backtest End')

inDateRange     = true
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

    // Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC
    rng_size

//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, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, 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


ema = ta.ema(close,emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

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

if  inDateRange and close>ema
    strategy.entry("Long", strategy.long, when=longCondition)
    
if   inDateRange and close<ema
    strategy.entry("Short", strategy.short, when=shortCondition)


plot(ema)




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

if strategy.position_size > 0
    strategy.exit(id='Long', stop=longStopPrice, limit=longTakePrice)

if strategy.position_size < 0
    strategy.exit(id='Short', stop=shortStopPrice, limit=shortTakePrice)