Chiến lược đường trung bình động kép


Ngày tạo: 2023-10-07 15:18:44 sửa đổi lần cuối: 2023-10-07 15:18:44
sao chép: 0 Số nhấp chuột: 641
1
tập trung vào
1617
Người theo dõi

Tổng quan

Đây là một chiến lược giao dịch dựa trên hai đường trung bình di chuyển. Nó sẽ phán đoán xu hướng thị trường và tạo ra tín hiệu giao dịch dựa trên mối quan hệ chéo giữa đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm.

Nguyên tắc

Chiến lược này chủ yếu sử dụng tính năng theo dõi xu hướng của đường trung bình di chuyển. đường trung bình di chuyển là giá trung bình được tính dựa trên giá đóng cửa lịch sử trong một chu kỳ nhất định, nó có thể biến động nhỏ trong ngày và phản ánh xu hướng giá trong chu kỳ thời gian lớn hơn. đường trung bình nhanh sử dụng chu kỳ ngắn hơn, có thể phản ứng nhanh hơn với sự thay đổi giá; đường trung bình chậm sử dụng chu kỳ dài hơn, đại diện cho xu hướng dài.

Chiến lược này tạo ra tín hiệu giao dịch bằng cách thiết lập đường trung bình di chuyển với độ dài chu kỳ khác nhau, sử dụng các đường trung bình giữa các đường trung bình. Khi đường trung bình chu kỳ ngắn đi qua đường trung bình chu kỳ dài, nó cho thấy tình hình ngắn hạn tốt, tạo ra tín hiệu mua; khi đường trung bình chu kỳ ngắn đi qua đường trung bình chu kỳ dài, nó cho thấy tình hình ngắn hạn yếu đi, tạo ra tín hiệu bán. Mã chiến lược vẽ đường trung bình thông qua hàm plot, biến xu hướng đánh giá mối quan hệ chéo của đường trung bình, và nhập tín hiệu mua và bán khi xảy ra chéo.

Ưu điểm

  • Sử dụng đường chéo hai chiều là một chỉ số kỹ thuật đơn giản và hiệu quả để đánh giá sự thay đổi xu hướng
  • Đường đồng đều có thể lọc tiếng ồn thị trường một cách hiệu quả, tránh bị chặn
  • Chuyển đổi tham số chu kỳ trung bình từ từ có thể phù hợp với các trường hợp khác nhau
  • Hiển thị các tín hiệu xu hướng và điểm thay đổi
  • Dễ hiểu, linh hoạt điều chỉnh tham số

Rủi ro

  • Chiến lược giao chéo hai đường đều bị trì trệ, có thể bỏ lỡ điểm biến đổi giá
  • Không áp dụng cho chấn động, sẽ tạo ra nhiều tín hiệu sai
  • Các tham số thời gian trung bình không đúng có thể dẫn đến quá nhạy cảm hoặc chậm chạp
  • Cần kết hợp với các chỉ số khác để xác định xu hướng cơ bản và thời gian hành động

Hướng tối ưu hóa

  • Đánh giá hiệu quả thu nhập của các tham số chu kỳ trung bình khác nhau, chọn tham số tối ưu
  • Thêm các chỉ số khác để lọc tín hiệu, chẳng hạn như chỉ số đường dẫn, hình dạng đường K, v.v.
  • Chiến lược dừng lỗ tối ưu hóa kết hợp với chỉ số biến động
  • Các tham số và quy tắc giao dịch được tự động tối ưu hóa dựa trên thuật toán học máy
  • Thêm mô-đun giao dịch thuật toán để thực hiện đặt hàng tự động

Tóm tắt

Chiến lược giao chéo hai đường trung bình sử dụng tính năng theo dõi xu hướng của đường trung bình di chuyển để đánh giá hướng thị trường và tạo tín hiệu giao dịch bằng cách giao chéo đường trung bình nhanh và chậm. Chiến lược này đơn giản và dễ dàng, nhưng cũng có một số vấn đề. Bằng cách điều chỉnh tham số, kết hợp với các chỉ số khác và tối ưu hóa thuật toán, bạn có thể bù đắp những thiếu sót đó để trở thành một hệ thống giao dịch ổn định và đáng tin cậy.

Mã nguồn chiến lược
/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-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/
// © KivancOzbilgic


//@version=4
strategy("pomila", overlay=true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1= barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)