Chiến lược giao dịch hai chiều đường trung bình động nhân


Ngày tạo: 2024-01-15 14:50:32 sửa đổi lần cuối: 2024-01-15 14:50:32
sao chép: 1 Số nhấp chuột: 607
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch hai chiều đường trung bình động nhân

Tổng quan

Chiến lược này dùng phương pháp giao dịch hai chiều dài dài để đánh giá xu hướng bằng cách tính toán các đường trung bình di chuyển nhân, kết hợp với giá cả và các chỉ số PMax, giao dịch nhiều hơn khi xu hướng đi lên và tháo dỡ khi xu hướng đi xuống, đánh giá rủi ro giữ vị trí trong thời gian thực để rút ra lợi nhuận.

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

Các tham số chỉ số bao gồm: độ dài chu kỳ ATR, ATR nhân, loại và độ dài của trung bình di chuyển. Giá trị ATR đại diện cho sự dao động của khoảng thời gian. Trung bình di chuyển nhân bằng giá trung bình trong khoảng thời gian cộng / trừ ATR nhân với ATR nhân.

Chỉ số PMax đại diện cho giá dừng hoặc giá dừng. Chỉ số được tính toán kết hợp giá trị ATR và hướng xu hướng. Trong thị trường leo thang, PMax bằng số trung bình di chuyển nhân ATR trừ số nhân của ATR và số nhân, làm đường dừng. Trong thị trường giảm giá, PMax bằng số trung bình di chuyển nhân cộng với ATR và số nhân của số nhân, làm đường dừng.

Khi giá và chỉ số PMax xảy ra giao thoa lên, hãy thực hiện nhiều tín hiệu; Khi giá và chỉ số PMax xảy ra giao thoa xuống, hãy thực hiện tín hiệu dừng chân. Chiến lược này được sử dụng để tham gia, thực hiện nhiều trong xu hướng lên, làm trống trong xu hướng xuống, theo dõi động lực dừng lỗ.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Sử dụng phương thức giao dịch hai chiều dài, có thể giao dịch trên toàn thị trường, toàn diện.

  2. Sử dụng chỉ số moving average nhân, tín hiệu giao dịch ổn định và đáng tin cậy.

  3. Kết hợp với chỉ số PMax để dừng lỗ, kiểm soát rủi ro hiệu quả.

  4. Chu kỳ tính toán và tham số nhân có thể điều chỉnh, khả năng thích ứng rộng rãi.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Thiết lập tham số không chính xác có thể dẫn đến tổn thất giao dịch của whipsaw.

  2. Giao dịch không đầu tư cần lưu ý đến rủi ro của giới hạn lợi nhuận.

  3. Những sự kiện bất ngờ gây ra sự biến động mạnh mẽ của thị trường là điều không thể tránh được.

Giải pháp tương ứng:

  1. Tối ưu hóa tham số, giảm tỷ lệ xuất hiện của whipsaw.

  2. Kiểm soát đúng mức độ đòn bẩy và phân tán rủi ro vị trí.

  3. Tăng ATR và mở rộng phạm vi dừng lỗ.

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

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Thử nghiệm sự ổn định của các tham số khác nhau của thị trường và chu kỳ.

  2. Ứng dụng thuật toán học máy để tự động tối ưu hóa tham số.

  3. Xác định cấu trúc thị trường kết hợp với kỹ thuật học sâu.

  4. Tích hợp nhiều nguồn dữ liệu hơn cho hiệu quả quyết định.

Tóm tắt

Chiến lược này hoạt động ổn định và có tính bao quát mạnh mẽ. Sử dụng giao dịch hai chiều dài và cách dừng lỗ động, có thể kiểm soát rủi ro hiệu quả. Bằng cách tối ưu hóa tham số và lặp mô hình, có thể đạt được sự phù hợp và hiệu quả giao dịch tốt hơn.

Mã nguồn chiến lược
/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-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/
// © melihtuna
//developer: @KivancOzbilgic
//author: @KivancOzbilgic
//stretegy converter: @crypto_melih
//@version=4

strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent)

src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"])
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
//showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
//showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
long_short = input(defval = false, title = "Long-Short", type=input.bool)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)
alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")
buySignalk = crossover(MAvg, PMax)
//plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallk = crossunder(MAvg, PMax)
//plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
buySignalc = crossover(src, PMax)
//plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, PMax)
//plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na
fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

if(condition=="Only Crossing Signals")
    strategy.entry("BUY", strategy.long, when = buySignalk)
else
    strategy.entry("BUY", strategy.long, when = buySignalc)

if(long_short)
    if(condition=="Only Crossing Signals")
        strategy.entry("SELL", strategy.short, when = sellSignallk)
    else
        strategy.entry("SELL", strategy.short, when = sellSignallc)
else
    if(condition=="Only Crossing Signals")
        strategy.close("BUY", when = sellSignallk)
    else
        strategy.close("BUY", when = sellSignallc)