Chiến lược dừng lỗ theo MA hai chiều


Ngày tạo: 2023-11-16 17:18:59 sửa đổi lần cuối: 2023-11-16 17:18:59
sao chép: 1 Số nhấp chuột: 590
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ theo MA hai chiều

Tổng quan

Chiến lược này xây dựng tín hiệu nhiều lỗ bằng phương tiện di chuyển hai chiều để thực hiện theo dõi dừng lỗ. Ý tưởng cốt lõi của nó là sử dụng phương tiện di chuyển để xác định hướng xu hướng, làm nhiều lỗ theo hướng xu hướng và sử dụng ATR để tính toán điểm dừng lỗ để thực hiện theo dõi dừng lỗ.

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

Chiến lược này sử dụng hl2 làm giá nguồn, tính ATR cho một chu kỳ nhất định làm mức dừng lỗ. Xét trên đường và dưới đường theo giá trị ATR nhân với một số nhân nhất định.

Sau khi mở vị trí, điều chỉnh điểm dừng theo thay đổi thời gian thực của ATR, để thực hiện theo dõi dừng. Cụ thể, sau khi làm nhiều, đường ray dưới liên tục tăng lên theo mức thấp mới nhất, để thực hiện theo dõi dừng; sau khi làm trống, đường ray trên liên tục giảm xuống theo mức cao mới nhất, để thực hiện theo dõi dừng.

Như vậy, chiến lược này tận dụng đầy đủ các tính năng của trung bình di chuyển để xác định xu hướng, và thêm cơ chế theo dõi lỗ dừng dựa trên ATR, đảm bảo tính chính xác của hướng giao dịch và kiểm soát rủi ro giao dịch.

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

Lợi thế lớn nhất của chiến lược này là kiểm soát rủi ro. Chiến lược trung bình di chuyển truyền thống chỉ xem xét định hướng, dễ dàng phá vỡ vị trí. Trong khi chiến lược này kết hợp với dừng theo dõi tính toán ATR, có thể điều chỉnh mức dừng theo động lực của thị trường biến động, kiểm soát rủi ro giao dịch hiệu quả.

Ngoài ra, chiến lược này kết hợp nhiều giao dịch hai chiều. So với chiến lược đơn phương, nó có thể điều chỉnh hướng vị trí khi xu hướng thay đổi, tránh bị mắc kẹt trong cùng một hướng và tăng lợi nhuận của chiến lược.

Rủi ro chiến lược

Rủi ro chính của chiến lược này nằm ở thiết lập chu kỳ ATR và số nhân. Nếu chu kỳ ATR quá ngắn hoặc số nhân quá lớn, mức dừng sẽ quá nhỏ để kiểm soát rủi ro một cách hiệu quả; Nếu chu kỳ ATR quá dài hoặc số nhân quá nhỏ, dừng quá thoải mái và khó kiếm được lợi nhuận. Ngoài ra, có thể có nguy cơ phá vỡ giả khi giá phá vỡ đường trung bình di chuyển kích hoạt tín hiệu xây dựng vị trí.

Có thể cân bằng lợi nhuận dừng lỗ bằng cách tối ưu hóa chu kỳ tham số và nhân số; kết hợp với các chỉ số khác để lọc phá vỡ giả, nâng cao chất lượng tín hiệu, giảm rủi ro.

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

Chính sách này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Tối ưu hóa chu kỳ trung bình di chuyển, tìm kiếm sự kết hợp tham số tốt nhất

  2. Thêm các bộ lọc cho các chỉ số khác như MACD, KDJ, để cải thiện chất lượng tín hiệu

  3. Tăng các chiến lược quản lý vị thế, như cổ phần cố định, Martingale, và tăng lợi nhuận chiến lược

  4. Có thể nghiên cứu sự khác biệt của các tham số của các giống khác nhau, để tối ưu hóa tham số

  5. Có thể kết hợp các phương pháp học máy như thuật toán di truyền để đào tạo tối ưu hóa tham số

Tóm tắt

Chiến lược này xem xét toàn bộ sự phán đoán xu hướng và kiểm soát rủi ro, tập trung vào việc giảm rút lui trong khi theo đuổi lợi nhuận. Bằng các phương pháp như tối ưu hóa tham số và kết hợp, lợi nhuận của chiến lược có thể được nâng cao hơn nữa. Nói chung, ý tưởng chiến lược này rõ ràng, dễ thực hiện và là một chiến lược giao dịch định lượng đáng tin cậy và ổn định.

Mã nguồn chiến lược
/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 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("Trenbolone Strategy", 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)