Chiến lược đảo ngược nhiều lần dựa trên xu hướng trung bình


Ngày tạo: 2023-11-21 14:53:48 sửa đổi lần cuối: 2023-11-21 14:53:48
sao chép: 0 Số nhấp chuột: 600
1
tập trung vào
1617
Người theo dõi

Chiến lược đảo ngược nhiều lần dựa trên xu hướng trung bình

Tổng quan

Chiến lược này tính toán nhiều chỉ số xu hướng và thực hiện các hoạt động mua và bán khi chúng đảo ngược. Các chỉ số xu hướng chính là TDI, TCF, TTF và TII. Chiến lược sẽ chọn trong cấu hình để sử dụng chỉ số nào để tạo tín hiệu giao dịch.

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

  • ### Chỉ số TDI

Chỉ số TDI dựa trên động lực thay đổi của giá để tính toán. Nó được xây dựng thông qua các kỹ thuật tổng hợp và làm mịn.

  • ### Chỉ số TCF

Chỉ số TCF tính toán sự thay đổi tích cực và tiêu cực của giá, để đánh giá sức mạnh của đầu nhiều và đầu trống. Khi sức mạnh thay đổi tích cực lớn hơn sức mạnh thay đổi tiêu cực, hãy làm nhiều hơn, nếu không hãy thanh toán.

  • ### Chỉ số TTF

Chỉ số TTF đánh giá xu hướng bằng cách so sánh sức mạnh của điểm cao và điểm thấp.

  • ### Chỉ số TII

Chỉ số TII kết hợp đường trung bình và phạm vi giá để đánh giá xu hướng đảo ngược. Nó xem xét cả xu hướng ngắn hạn và dài hạn.

Lập vào logic của nhiều vị trí hòa bình để chọn tín hiệu giao dịch phù hợp dựa trên các chỉ số được cấu hình.

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

Chiến lược này kết hợp nhiều chỉ số giao dịch xu hướng được sử dụng thường xuyên và có thể thích ứng linh hoạt với môi trường thị trường. Các ưu điểm cụ thể là:

  1. Sử dụng tín hiệu đảo ngược xu hướng để nắm bắt cơ hội thay đổi xu hướng
  2. Thiết lập các chỉ số khác nhau để tối ưu hóa phù hợp
  3. Gói chỉ số phong phú, có thể kết hợp để xác nhận tín hiệu

Rủi ro chiến lược

Chiến lược này có những rủi ro:

  1. Các tín hiệu giao dịch được tạo ra bởi các chỉ số xu hướng có thể bị báo cáo sai dẫn đến tổn thất
  2. Chỉ số đơn lẻ không thể xác định được xu hướng và dễ bị ảnh hưởng bởi tiếng ồn thị trường
  3. Các tham số chỉ số và tham số giao dịch được cấu hình sai có thể gây ra sự méo mó thị trường, dẫn đến giao dịch sai

Các biện pháp sau đây có thể làm giảm nguy cơ:

  1. Tối ưu hóa các tham số chỉ số để tìm các tham số kết hợp tốt nhất
  2. Kết hợp nhiều tín hiệu chỉ số để giao dịch, nâng cao chất lượng tín hiệu
  3. Điều chỉnh chiến lược quản lý vị trí, kiểm soát tổn thất đơn lẻ

Hướng tối ưu hóa chiến lược

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

  1. Kiểm tra các chỉ số và tham số kết hợp tối ưu cho các chu kỳ thị trường khác nhau
  2. Thêm hoặc loại bỏ các chỉ số để tìm ra sự kết hợp tốt nhất
  3. Các tín hiệu giao dịch được lọc để loại bỏ các tín hiệu sai lệch
  4. Tối ưu hóa các chiến lược quản lý vị trí, chẳng hạn như vị trí biến động, theo dõi dừng lỗ
  5. Tăng các chỉ số điểm học máy để hỗ trợ đánh giá chất lượng tín hiệu

Tóm tắt

Chiến lược này kết hợp lợi thế của nhiều chỉ số đảo ngược xu hướng, được tối ưu hóa thông qua các chỉ số và tham số cấu hình, có thể thích ứng với các môi trường thị trường khác nhau, hoạt động tại các điểm đảo ngược xu hướng. Chìa khóa là tìm ra các tham số và kết hợp chỉ số tối ưu nhất, đồng thời kiểm soát rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-15 03:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kruskakli
//
// Here is a collection of Trend Indicators as defined by M.H Pee and presented
// in various articles of the "STOCKS & COMMODITIES Magazine"
//
// The actual implementation of the indicators here are made by: everget
//
// I have gather them here so that they easily can be tested.
//
// My own test was made using 15 companies from the OMXS30 list
// during the time period of 2016-2018, and I only went LONG.
//
// The result was as follows:
//
//        Average    Std.Dev
//        profit
//  TDI    3.04%      5.97
//  TTF    1.22%.     5.73
//  TII    1.07%      6.2
//  TCF    0.32%      2.68
//
strategy("M.H Pee indicators", overlay=true)


use = input(defval="TDI", title="Use Indicator", type=input.string,
             options=["TDI","TCF","TTF","TII"])

src = close


//
// TDI
//
length = input(title="Length", type=input.integer, defval=20)
mom = change(close, length)
tdi = abs(sum(mom, length)) - sum(abs(mom), length * 2) + sum(abs(mom), length)
// Direction Indicator
tdiDirection = sum(mom, length)
tdiLong = crossover(tdiDirection, tdi)
tdiXLong = crossunder(tdiDirection, tdi)

//
// TCF
//
tcflength = input(title="Length", type=input.integer, defval=35)

plusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? change_1 : 0.0
minusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? 0.0 : -change_1

plusCF = 0.0
plusChange__1 = plusChange(src)
plusCF := plusChange(src) == 0 ? 0.0 : plusChange__1 + nz(plusCF[1])

minusCF = 0.0
minusChange__1 = minusChange(src)
minusCF := minusChange(src) == 0 ? 0.0 : minusChange__1 + nz(minusCF[1])

plusTCF = sum(plusChange(src) - minusCF, tcflength)
minusTCF = sum(minusChange(src) - plusCF, tcflength)

tcfLong = plusTCF > 0 
tcfXLong = plusTCF < 0

//
// TTF
//
ttflength = input(title="Lookback Length", type=input.integer, defval=15)

hh = highest(length)
ll = lowest(length)

buyPower = hh - nz(ll[length])
sellPower = nz(hh[length]) - ll

ttf = 200 * (buyPower - sellPower) / (buyPower + sellPower)

ttfLong = crossover(ttf, 100)
ttfXLong = crossunder(ttf, -100)

//
// TII
//
majorLength = input(title="Major Length", type=input.integer, defval=60)
minorLength = input(title="Minor Length", type=input.integer, defval=30)
upperLevel = input(title="Upper Level", type=input.integer, defval=80)
lowerLevel = input(title="Lower Level", type=input.integer, defval=20)

sma = sma(src, majorLength)

positiveSum = 0.0
negativeSum = 0.0

for i = 0 to minorLength - 1 by 1
    price = nz(src[i])
    avg = nz(sma[i])
    positiveSum := positiveSum + (price > avg ? price - avg : 0)
    negativeSum := negativeSum + (price > avg ? 0 : avg - price)
    negativeSum

tii = 100 * positiveSum / (positiveSum + negativeSum)

tiiLong = crossover(tii, 80)
tiiXLong = crossunder(tii,80)

//
// LOGIC 
//
enterLong = (use == "TDI" and tdiLong) or (use == "TCF" and tcfLong) or (use == "TTF" and ttfLong) or (use == "TII" and tiiLong)
exitLong = (use == "TDI" and tdiXLong) or (use == "TCF" and tcfXLong) or (use == "TTF" and ttfXLong) or (use == "TII" and tiiXLong)


// Time range for Back Testing
btStartYear  = input(title="Back Testing Start Year",  type=input.integer, defval=2016)
btStartMonth = input(title="Back Testing Start Month", type=input.integer, defval=1)
btStartDay   = input(title="Back Testing Start Day",   type=input.integer, defval=1)
startTime = timestamp(btStartYear, btStartMonth, btStartDay, 0, 0)

btStopYear  = input(title="Back Testing Stop Year",  type=input.integer, defval=2028)
btStopMonth = input(title="Back Testing Stop Month", type=input.integer, defval=12)
btStopDay   = input(title="Back Testing Stop Day",   type=input.integer, defval=31)
stopTime  = timestamp(btStopYear, btStopMonth, btStopDay, 0, 0)

window() => time >= startTime and time <= stopTime ? true : false


riskPerc     = input(title="Max Position  %", type=input.float, defval=20, step=0.5)
maxLossPerc  = input(title="Max Loss Risk %", type=input.float, defval=5, step=0.25)

// Average True Range (ATR) measures market volatility.
// We use it for calculating position sizes.
atrLen   = input(title="ATR Length", type=input.integer, defval=14)
stopOffset = input(title="Stop Offset", type=input.float, defval=1.5, step=0.25)
limitOffset = input(title="Limit Offset", type=input.float, defval=1.0, step=0.25)
atrValue = atr(atrLen)


// Calculate position size
maxPos = floor((strategy.equity * (riskPerc/100)) / src)
// The position sizing algorithm is based on two parts:
// a certain percentage of the strategy's equity and
// the ATR in currency value.
riskEquity  = (riskPerc / 100) * strategy.equity
// Translate the ATR into the instrument's currency value.
atrCurrency = (atrValue * syminfo.pointvalue)
posSize0    = min(floor(riskEquity / atrCurrency), maxPos)
posSize     = posSize0 < 1 ? 1 : posSize0

if (window())
    strategy.entry("Long", long=true, qty=posSize0, when=enterLong)
    strategy.close_all(when=exitLong)