Chiến lược theo dõi xu hướng ngắn hạn và ngăn chặn cú sốc


Ngày tạo: 2023-12-12 15:52:37 sửa đổi lần cuối: 2023-12-12 15:52:37
sao chép: 1 Số nhấp chuột: 657
1
tập trung vào
1621
Người theo dõi

Chiến lược theo dõi xu hướng ngắn hạn và ngăn chặn cú sốc

Tổng quan

Chiến lược tổng hợp này sử dụng lợi thế của chỉ số EMA, chiến lược theo dõi xu hướng TTS và STC của chu kỳ xu hướng Shuffle để tạo ra một chiến lược theo dõi xu hướng ngắn mạnh mẽ hơn. Cụ thể, chiến lược sẽ đồng thời đánh giá liệu các tín hiệu đa khoảng của ba chỉ số có phù hợp hay không, và nếu phù hợp sẽ tạo ra tín hiệu giao dịch; nếu không phù hợp, không mua và bán. Điều này có thể lọc ra một số tín hiệu giả, làm cho chiến lược đáng tin cậy hơn.

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

Chiến lược này bao gồm ba phần chính: chỉ số EMA Smooth, chiến lược theo dõi xu hướng TTS và chỉ số chu kỳ xu hướng STC Shufter.

Đầu tiên, tính toán 200 chu kỳ của chỉ số EMA di chuyển trung bình, đánh giá xem giá thấp hơn hoặc cao hơn đường EMA, nếu giá thấp hơn đường này, chỉ số EMA sẽ cho tín hiệu đầu trống;-1; nếu giá cao hơn đường này, chỉ số EMA sẽ cho tín hiệu đa đầu: 1

Tiếp theo, tính toán các tham số liên quan của chiến lược theo dõi xu hướng TTS để đánh giá hướng xu hướng của thị trường dựa trên giá phá vỡ đường mòn lên xuống. Nếu giá phá vỡ đường mòn lên, tạo ra tín hiệu đa đầu 1; Nếu giá phá vỡ đường mòn xuống, tạo ra tín hiệu không đầu -1.

Cuối cùng, tính toán chu kỳ xu hướng của Shuffle STC, một chỉ số phản ánh xu hướng thay đổi của trung tâm giá. Nếu chỉ số STC tăng lên, tạo ra tín hiệu đa đầu 1; nếu chỉ số STC giảm, tạo ra tín hiệu trống -1.

Sau khi nhận được tín hiệu phán đoán của ba chỉ số, chiến lược sẽ đánh giá xem chúng có phù hợp không. Chỉ khi tất cả ba tín hiệu phán đoán đều phù hợp, tín hiệu giao dịch thực tế sẽ được tạo ra. Điều này có thể lọc một số tín hiệu giả và làm cho chiến lược đáng tin cậy hơn.

Nếu xác định có tín hiệu giao dịch, hãy thực hiện giao dịch mua hoặc bán và đặt điểm dừng lỗ.

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

  1. Chiến lược tổng hợp sử dụng ba loại chỉ số khác nhau để đánh giá hiệu quả xu hướng thị trường.

  2. Sử dụng sự thống nhất của ba tín hiệu đánh giá chỉ số để lọc các tín hiệu giả, có thể làm giảm giao dịch không cần thiết và làm cho chiến lược đáng tin cậy hơn.

  3. Thiết lập điểm dừng lỗ hợp lý, có thể khóa lợi nhuận và tránh tổn thất mở rộng.

  4. Các tham số được chọn đã được tối ưu hóa để phù hợp với hầu hết các loại cổ phiếu và ngoại hối.

  5. Các giao dịch có logic rõ ràng, đơn giản, dễ hiểu và dễ sửa đổi.

Rủi ro chiến lược

  1. Khi có sự không đồng nhất giữa ba chỉ số judgment, sẽ xuất hiện dimers, dễ bị bỏ lỡ cơ hội giao dịch. Bạn có thể xem xét tối ưu hóa quy tắc phán đoán.

  2. Chỉ số STC có độ nhạy cao hơn đối với các tham số, các giống khác nhau cần điều chỉnh tham số.

  3. Trong tình huống suy thoái, dừng lỗ có thể bị phá vỡ, gây ra tổn thất lớn. Bạn có thể cân nhắc tối ưu hóa điểm dừng lỗ trong thời gian thực.

  4. Không có khả năng đánh giá hiệu quả các hoạt động sắp xếp ngang, và việc sắp xếp các bước vào có thể dẫn đến việc giam giữ.

Tối ưu hóa chiến lược

  1. Bạn có thể thử nghiệm nhiều kết hợp của các chỉ số để tìm các quy tắc phán đoán mạnh hơn. Ví dụ như thêm các chỉ số RSI.

  2. Tối ưu hóa các tham số chỉ số của chỉ số STC, làm cho nó phù hợp hơn với các giống khác nhau. Thêm mô-đun tối ưu hóa tham số thích ứng.

  3. Thêm mô-đun dừng lỗ thích ứng, có thể tối ưu hóa điểm dừng lỗ theo thời gian thực.

  4. Tăng cường mô-đun thanh toán, xác định xem có phải vào bảng xếp hạng ngang hay không, tránh bị nhốt.

  5. Tối ưu hóa thuật toán cho giao dịch tần số cao, giảm độ trễ hệ thống, nâng cao tỷ lệ thành công giao dịch.

Tóm tắt

Chiến lược tổng hợp sử dụng ba chỉ số EMA, TTS và STC để đánh giá xu hướng thị trường, và các quy tắc phán đoán được thiết lập để tạo ra tín hiệu giao dịch khi ba người đồng nhất, để có thể lọc hiệu quả các tín hiệu giả. Có rất nhiều không gian để tối ưu hóa chiến lược, bằng cách thử nghiệm nhiều bộ chỉ số hơn, thêm thuật toán thích ứng, tối ưu hóa mô-đun giao dịch tần số cao và các phương tiện khác, để tăng cường hơn nữa hiệu suất của chiến lược trong quá trình theo dõi xu hướng.

Mã nguồn chiến lược
/*backtest
start: 2022-12-05 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/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")