Động lực kết hợp với phán đoán xu hướng Chiến lược giao dịch định lượng đa yếu tố

Tác giả:ChaoZhang, Ngày: 2023-11-23 14:58:57
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch định lượng được đánh giá nhiều yếu tố kết hợp các chỉ số động lực và các chỉ số xu hướng. Chiến lược đánh giá xu hướng tổng thể và hướng động lực của thị trường bằng cách tính toán các kết hợp toán học của nhiều đường trung bình động, và tạo ra các tín hiệu giao dịch dựa trên điều kiện ngưỡng.

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

  1. Tính toán nhiều đường trung bình động và chỉ số động lượng
    • Tính toán Harmonic Moving Average, Moving Average ngắn hạn, Moving Average trung hạn, Moving Average dài hạn và các moving average đa số khác
    • Tính toán sự khác biệt giữa mỗi đường trung bình động để phản ánh xu hướng thay đổi giá
    • Tính toán phái sinh thứ nhất của mỗi đường trung bình động để phản ánh đà thay đổi giá
    • Tính toán các chỉ số sinus và cosinus để xác định hướng xu hướng
  2. Phán quyết toàn diện các tín hiệu giao dịch
    • Tính toán cân nhắc các chỉ số động lực, chỉ số xu hướng và nhiều yếu tố khác
    • Đánh giá tình trạng thị trường hiện tại theo khoảng cách giữa giá trị kết quả và ngưỡng
    • Phát hành tín hiệu giao dịch dài và ngắn

Phân tích lợi thế

  1. Phân tích nhiều yếu tố cải thiện độ chính xác tín hiệu
    • Xem xét toàn diện giá, xu hướng, động lực và các yếu tố khác
    • Các yếu tố khác nhau có thể được cấu hình với trọng lượng khác nhau
  2. Các tham số có thể điều chỉnh, thích nghi với các thị trường khác nhau
    • Các thông số của trung bình động, ranh giới của phạm vi giao dịch có thể được tùy chỉnh
    • Có thể thích nghi với các chu kỳ và môi trường thị trường khác nhau
  3. Cấu trúc mã rõ ràng, dễ hiểu
    • Thông số kỹ thuật đặt tên, ý kiến đầy đủ
    • Dễ dàng phát triển và tối ưu hóa thứ cấp

Phân tích rủi ro

  1. Khó khăn trong tối ưu hóa tham số là cao
    • Cần rất nhiều dữ liệu lịch sử backtesting để tìm các thông số tối ưu
  2. Tần suất giao dịch có thể quá cao
    • Phán quyết kết hợp nhiều yếu tố có thể dẫn đến quá nhiều giao dịch
  3. Sự tương quan cao với thị trường
    • Các chiến lược đánh giá xu hướng có xu hướng hành vi phi lý

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

  1. Thêm logic stop loss
    • Tránh những tổn thất lớn do hành vi phi lý
  2. Tối ưu hóa cài đặt tham số
    • Tìm kết hợp tham số tối ưu để cải thiện sự ổn định chiến lược
  3. Tăng các yếu tố học máy
    • Sử dụng học tập sâu để đánh giá tình trạng thị trường hiện tại và hỗ trợ các quyết định chiến lược

Tóm lại

Chiến lược này đánh giá tình trạng thị trường thông qua sự kết hợp nhiều yếu tố của các chỉ số động lực và các chỉ số xu hướng, và đưa ra các tín hiệu giao dịch dựa trên các ngưỡng đặt ra. Những lợi thế của chiến lược là khả năng cấu hình mạnh mẽ, khả năng thích nghi với các môi trường thị trường khác nhau và dễ hiểu; những nhược điểm là khó khăn trong tối ưu hóa tham số, có thể tần suất giao dịch quá cao và tương quan cao với thị trường.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 14/03/2017
// This is modified version of Dale Legan's "Confluence" indicator written by Gary Fritz.
// ================================================================
// Here is Gary`s commentary:
// Since the Confluence indicator returned several "states" (bull, bear, grey, and zero), 
// he modified the return value a bit:
// -9 to -1 = Bearish
// -0.9 to 0.9 = "grey" (and zero)
// 1 to 9 = Bullish
// The "grey" range corresponds to the "grey" values plotted by Dale's indicator, but 
// they're divided by 10.
//
// You can change long to short in the Input Settings
// Please, use it only for learning or paper trading. Do not for real trading.
////////////////////////////////////////////////////////////

strategy(title="Confluence", shorttitle="Confluence")
Harmonic = input(10, minval=1)
BuyBand = input(9)
SellBand = input(-9)
reverse = input(false, title="Trade reverse")
hline(SellBand, color=red, linestyle=line)
hline(BuyBand, color=green, linestyle=line)

Price = close

STL = round((Harmonic * 2) - 1 - 0.5)
ITL = round((STL * 2) - 1 - 0.5)
LTL = round((ITL * 2) - 1 - 0.5)
HOFF = round(Harmonic / 2 - 0.5)
SOFF = round(STL / 2 - 0.5)
IOFF = round(ITL / 2 - 0.5)

xHavg = sma(Price, Harmonic)
xSavg = sma(Price, STL)
xIavg = sma(Price, ITL)
xLavg = sma(Price, LTL)

xvalue2 = xSavg - xHavg[HOFF]
xvalue3 = xIavg - xSavg[SOFF]
xvalue12 = xLavg - xIavg[IOFF]

xmomsig = xvalue2 + xvalue3 + xvalue12

xLavgOHLC = sma(ohlc4, LTL - 1)

xH2 = sma(Price, Harmonic - 1)
xS2 = sma(Price, STL - 1)
xI2 = sma(Price, ITL - 1)
xL2 = sma(Price, LTL - 1)

DerivH = (xHavg * 2) - xHavg[1]
DerivS = (xSavg * 2) - xSavg[1]
DerivI = (xIavg * 2) - xIavg[1]
DerivL = (xLavg * 2) - xLavg[1]
SumDH = Harmonic * DerivH
SumDS = STL * DerivS
SumDI = ITL * DerivI
SumDL = LTL * DerivL

LengH = Harmonic - 1
LengS = STL - 1
LengI = ITL - 1
LengL = LTL - 1

N1H = xH2 * LengH
N1S = xS2 * LengS
N1I = xI2 * LengI
N1L = xL2 * LengL

DRH = SumDH - N1H
DRS = SumDS - N1S
DRI = SumDI - N1I
DRL = SumDL - N1L

SumH = xH2 * (Harmonic - 1)
SumS = xS2 * (STL - 1)
SumI = xI2 * (ITL - 1)
SumL = xLavgOHLC * (LTL - 1)

xvalue5 = (SumH + DRH) / Harmonic
xvalue6 = (SumS + DRS) / STL
xvalue7 = (SumI + DRI) / ITL
xvalue13 = (SumL + DRL) / LTL

value9 = xvalue6 - xvalue5[HOFF]
value10 = xvalue7 - xvalue6[SOFF]
value14 = xvalue13 - xvalue7[IOFF]
xmom = value9 + value10 + value14

HT = sin(xvalue5 * 2 * 3.14 / 360) + cos(xvalue5 * 2 * 3.14 / 360)
HTA = sin(xHavg * 2 * 3.14 / 360) + cos(xHavg * 2 * 3.14 / 360)
ST = sin(xvalue6 * 2 * 3.14 / 360) + cos(xvalue6 * 2 * 3.14 / 360)
STA = sin(xSavg * 2 * 3.14 / 360) + cos(xSavg * 2 * 3.14 / 360)
IT = sin(xvalue7 * 2 * 3.14 / 360) + cos(xvalue7 * 2 * 3.14 / 360)
ITA = sin(xIavg * 2 * 3.14 / 360) + cos(xIavg * 2 * 3.14 / 360)

xSum = HT + ST + IT
xErr = HTA + STA + ITA

Condition2 = (((xSum > xSum[SOFF]) and (xHavg < xHavg[SOFF])) or ((xSum < xSum[SOFF]) and (xHavg > xHavg[SOFF])))
Phase = iff(Condition2 , -1 , 1)
xErrSum = (xSum - xErr) * Phase
xErrSig = sma(xErrSum, SOFF)

xvalue70 = xvalue5 - xvalue13
xvalue71 = sma(xvalue70, Harmonic)


ErrNum = iff (xErrSum > 0 and xErrSum < xErrSum[1] and xErrSum < xErrSig, 1,
          iff (xErrSum > 0 and xErrSum < xErrSum[1] and xErrSum > xErrSig, 2, 
           iff (xErrSum > 0 and xErrSum > xErrSum[1] and xErrSum < xErrSig, 2,
             iff (xErrSum > 0 and xErrSum > xErrSum[1] and xErrSum > xErrSig, 3,
              iff (xErrSum < 0 and xErrSum > xErrSum[1] and xErrSum > xErrSig, -1,
               iff (xErrSum < 0 and xErrSum < xErrSum[1] and xErrSum > xErrSig, -2,
                 iff (xErrSum < 0 and xErrSum > xErrSum[1] and xErrSum < xErrSig, -2,
                  iff (xErrSum < 0 and xErrSum < xErrSum[1] and xErrSum < xErrSig, -3, 0))))))))


momNum = iff (xmom > 0 and xmom < xmom[1] and xmom < xmomsig , 1,
          iff (xmom > 0 and xmom < xmom[1] and xmom > xmomsig, 2,
           iff (xmom > 0 and xmom > xmom[1] and xmom < xmomsig, 2,
             iff (xmom > 0 and xmom > xmom[1] and xmom > xmomsig, 3,
              iff (xmom < 0 and xmom > xmom[1] and xmom > xmomsig, -1,
               iff (xmom < 0 and xmom < xmom[1] and xmom > xmomsig, -2,
                 iff (xmom < 0 and xmom > xmom[1] and xmom < xmomsig, -2,
                  iff (xmom < 0 and xmom < xmom[1] and xmom < xmomsig, -3, 0))))))))

TCNum =  iff (xvalue70 > 0 and xvalue70 < xvalue70[1] and xvalue70 < xvalue71, 1,
          iff (xvalue70 > 0 and xvalue70 < xvalue70[1] and xvalue70 > xvalue71, 2,
           iff (xvalue70 > 0 and xvalue70 > xvalue70[1] and xvalue70 < xvalue71, 2,
             iff (xvalue70 > 0 and xvalue70 > xvalue70[1] and xvalue70 > xvalue71, 3,
              iff (xvalue70 < 0 and xvalue70 > xvalue70[1] and xvalue70 > xvalue71, -1,
               iff (xvalue70 < 0 and xvalue70 < xvalue70[1] and xvalue70 > xvalue71, -2,
                 iff (xvalue70 < 0 and xvalue70 > xvalue70[1] and xvalue70 < xvalue71, -2,
                  iff (xvalue70 < 0 and xvalue70 < xvalue70[1] and xvalue70 < xvalue71, -3,0))))))))

value42 = ErrNum + momNum + TCNum
Confluence = iff (value42 > 0 and xvalue70 > 0, value42,
              iff (value42 < 0 and xvalue70 < 0, value42,
               iff ((value42 > 0 and xvalue70 < 0) or (value42 < 0 and xvalue70 > 0), value42 / 10, 0)))
Res1 = iff (Confluence >= 1, Confluence, 0)
Res2 = iff (Confluence <= -1, Confluence, 0)
Res3 = iff (Confluence == 0, 0, iff (Confluence > -1 and Confluence < 1, 10 * Confluence, 0))
pos = iff(Res2 >= SellBand and Res2 != 0, -1,
	     iff(Res1 <= BuyBand and Res1 != 0, 1, 
	       iff(Res3 != 0, 0, nz(pos[1], 0))))
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	   	 
if (possig == 0)
    strategy.close("Long", when = possig == 0)	 
    strategy.close("Short", when = possig == 0)	 
barcolor(possig == -1 ? red: possig == 1 ? green : blue )
plot(Res1, color=green, title="Confluence", linewidth=3, style = histogram)
plot(Res2, color=red, title="Confluence", linewidth=3, style = histogram)
plot(Res3, color=gray, title="Confluence",  linewidth=3, style = histogram)



Thêm nữa