Chiến lược giao dịch chéo đa trung bình động

Tác giả:ChaoZhang, Ngày: 2023-12-06 17:10:00
Tags:

img

Tổng quan chiến lược

Chiến lược này tạo ra các tín hiệu giao dịch dựa trên nhiều chỉ số trung bình động. Nó theo dõi trung bình động ngắn hạn, trung hạn và dài hạn đồng thời và tạo ra các tín hiệu giao dịch theo tình huống chéo của chúng để xác định hướng xu hướng.

Tên chiến lược

Chiến lược chéo đa trung bình động

Chiến lược logic

Chiến lược này sử dụng 3 đường trung bình động với các khoảng thời gian khác nhau, bao gồm các đường 7 ngày, 13 ngày và 21 ngày.

  1. Khi MA ngắn hạn 7 ngày vượt qua MA trung hạn 13 ngày lên, trong khi MA dài hạn 21 ngày có xu hướng tăng, một tín hiệu dài được tạo ra.
  2. Khi MA ngắn hạn 7 ngày vượt qua dưới MA trung hạn 13 ngày xuống, trong khi MA dài hạn 21 ngày có xu hướng giảm, một tín hiệu ngắn được tạo ra.

Bằng cách kết hợp các đường trung bình động trên các khung thời gian khác nhau, chiến lược có thể đánh giá xu hướng thị trường chính xác hơn và tránh giao dịch sai.

Ưu điểm

  1. Sử dụng nhiều đường MA có thể xác định tốt hơn các chuyển động của thị trường và tránh bị sai lệch bởi các sự đột phá sai hoặc biến động ngắn hạn trên thị trường.
  2. Các tín hiệu chỉ được tạo ra khi xu hướng rõ ràng, do đó giảm các giao dịch không cần thiết và giảm chi phí giao dịch.
  3. Cài đặt các tham số linh hoạt - thời gian của MAP có thể được điều chỉnh dựa trên sở thích cá nhân để phù hợp với các sản phẩm và môi trường thị trường khác nhau.

Rủi ro

  1. Các tín hiệu sai thường xuyên có thể xảy ra trong một thị trường biến động.
  2. Các chỉ số thị trường thị trường như các chỉ số theo xu hướng không thể xác định chính xác các điểm chuyển đổi.
  3. Tín hiệu chậm bởi MA crossovers có thể mất một phần lợi nhuận.
  4. Rủi ro có thể được giảm bằng cách giới thiệu các chỉ số kỹ thuật khác để xác nhận tín hiệu và tối ưu hóa các tham số MA.

Hướng dẫn tối ưu hóa

  1. Xem xét việc kết hợp các chỉ số biến động để đánh giá sức mạnh xu hướng và tránh giao dịch trên thị trường hỗn loạn.
  2. Hãy thử áp dụng các mô hình máy học để tự động tối ưu hóa các thông số MA.
  3. Thêm các chiến lược dừng lỗ để cắt giảm lỗ trong thời gian khi rút tiền mở rộng.
  4. Sử dụng lệnh giới hạn khi MA giao nhau để giảm trượt.

Kết luận

Chiến lược này kết hợp các MAs ngắn hạn, trung hạn và dài hạn để xác định xu hướng thị trường dựa trên các mối quan hệ chéo, làm cho nó trở thành một chiến lược theo xu hướng tương đối ổn định và hiệu quả.


/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 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/
// © Crypto-Oli

//@version=4
strategy("CryptOli 3 MAs long/short Backtest", initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, overlay=true)

// this is an educational Script - basicly its very simple - you can see how minimal changes impact results, thats why i posted it
// Credits to Quantnomad to publish tons of free educational script
// this Script is based on https://www.tradingview.com/script/0NgUadGr-Ultimate-MA-Cross-Indicator/ Quantnomads Ultimate MA Indicator 
// HA - Option for calcucaltion based on HA-Candles (very famous recently)
// Source Input - Option (Candletype for calculation, close, ohlc4 ect.) --- there are huge differences --- try it by your own

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2015, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2030, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

////////////////////////////////////////////////////////////////////////////////

h = input(false, title = "Signals from Heikin Ashi Candles")

ma_type      = input(title = "MA Type",         type = input.string,  defval = "SMMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
src = input(ohlc4)

short_ma_len = input(title = "Short MA Length", type = input.integer, defval = 7,     minval = 1)
short_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
middle_ma_len  = input(title = "Middle MA Length",  type = input.integer, defval = 13,    minval = 2)
middle_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
long_ma_len  = input(title = "Long MA Length",  type = input.integer, defval = 21,    minval = 2)
long_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close


tick_round(x) => 
    round(x / syminfo.mintick) * syminfo.mintick

// Set initial values to 0
short_ma = 0.0
middle_ma = 0.0
long_ma  = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_ma_len)
    middle_ma := sma(middle_ma_src, middle_ma_len)
    long_ma  := sma(long_ma_src,  long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma := ema(short_ma_src, short_ma_len)
    middle_ma := ema(middle_ma_src, middle_ma_len)
    long_ma  := ema(long_ma_src,  long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma := wma(short_ma_src, short_ma_len)
    middle_ma := wma(middle_ma_src, middle_ma_len)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
    middle_ma := wma(2*wma(middle_ma_src, middle_ma_len/2)-wma(middle_ma_src, middle_ma_len), round(sqrt(middle_ma_len)))
    long_ma  := wma(2*wma(long_ma_src,  long_ma_len /2)-wma(long_ma_src,  long_ma_len),  round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma := vwma(short_ma_src, short_ma_len)
    middle_ma := vwma(middle_ma_src, middle_ma_len)
    long_ma  := vwma(long_ma_src,  long_ma_len)


// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
    middle_ma := na(middle_ma[1]) ? sma(middle_ma_src, middle_ma_len) : (middle_ma[1] * (middle_ma_len - 1) + middle_ma_src) / middle_ma_len
    long_ma  := na(long_ma[1])  ? sma(long_ma_src,  long_ma_len)  : (long_ma[1]  * (long_ma_len  - 1) + long_ma_src)  / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short = ema(short_ma_src, short_ma_len)
    e1_middle = ema(middle_ma_src, middle_ma_len)
    e1_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    middle_ma := 2 * e1_middle - ema(e1_middle, middle_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

// Plot MAs
plot(short_ma, color = color.green,   linewidth = 1)
plot(middle_ma, color = color.yellow,   linewidth = 1)
plot(long_ma,  color = color.red, linewidth = 1)

if close>long_ma and short_ma>middle_ma and time_cond
    strategy.entry("Long", strategy.long)


if close<long_ma and short_ma<middle_ma and time_cond
    strategy.entry("Short", strategy.short)


Thêm nữa