EMA theo dõi xu hướng ngăn chặn chiến lược dao động

Tác giả:ChaoZhang, Ngày: 2023-12-12 15:52:37
Tags:

img

Tổng quan

Chiến lược này kết hợp các lợi thế của ba chỉ số: EMA, Chiến lược theo dõi xu hướng (TTS) và Chu kỳ xu hướng Schaff (STC) để tạo thành một chiến lược theo dõi xu hướng ngắn hạn mạnh mẽ. Cụ thể, chiến lược sẽ đánh giá xem các tín hiệu mua và bán của ba chỉ số có phù hợp hay không. Nếu chúng phù hợp, các tín hiệu giao dịch sẽ được tạo ra; nếu không sẽ không có giao dịch. Điều này lọc ra một số tín hiệu sai và 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 bao gồm ba phần chính: chỉ số EMA, chiến lược theo dõi xu hướng TTS và chỉ số STC.

Đầu tiên, đường trung bình di chuyển biểu thức EMA 200 giai đoạn được tính toán. Nếu giá dưới đường EMA này, chỉ số EMA sẽ cung cấp tín hiệu bán: -1; nếu giá trên đường, chỉ số EMA sẽ cung cấp tín hiệu mua: 1.

Thứ hai, các thông số có liên quan của chiến lược theo dõi xu hướng TTS được tính toán. Theo sự đột phá giá của đường ray trên và dưới, hướng xu hướng thị trường được xác định. Nếu giá vượt qua đường ray trên, tín hiệu mua 1 được tạo ra; nếu giá vượt qua đường ray dưới, tín hiệu bán -1 được tạo ra.

Cuối cùng, chỉ số chu kỳ xu hướng Schaff (STC) được tính toán, phản ánh xu hướng thay đổi của việc củng cố giá. Nếu chỉ số STC tăng, nó tạo ra tín hiệu mua 1; nếu chỉ số STC giảm, nó tạo ra tín hiệu bán -1.

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

Một khi quyết định tạo ra tín hiệu giao dịch, các vị trí dài hoặc ngắn sẽ được mở và các điểm dừng lợi nhuận / dừng lỗ sẽ được thiết lập.

Ưu điểm

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

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

  3. Đặt điểm dừng lợi nhuận/dừng lỗ hợp lý có thể khóa lợi nhuận và ngăn chặn tổn thất mở rộng.

  4. Các thông số tối ưu phù hợp với hầu hết các cổ phiếu và các sản phẩm ngoại hối.

  5. Logic giao dịch đơn giản và dễ hiểu.

Rủi ro

  1. Sự không nhất quán giữa các đánh giá chỉ số có thể dẫn đến mất cơ hội giao dịch.

  2. Chỉ số STC nhạy cảm với các tham số. Các sản phẩm khác nhau cần điều chỉnh tham số.

  3. Trong xu hướng giảm, stop loss có thể bị xâm nhập, gây ra tổn thất lớn.

  4. Sự củng cố bên không thể được xác định hiệu quả, dẫn đến các vị trí bẫy.

Những cải tiến

  1. Kiểm tra nhiều kết hợp chỉ số hơn để tìm các quy tắc phán đoán mạnh hơn, ví dụ: thêm chỉ số RSI.

  2. Tối ưu hóa các tham số STC để thích nghi tốt hơn trên các sản phẩm khác nhau. Thêm mô-đun tối ưu hóa tham số thích nghi.

  3. Tăng module stop loss thích nghi để tối ưu hóa các điểm stop loss một cách năng động.

  4. Tăng cường vị trí module đóng để xác định phạm vi bên và tránh bẫy.

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

Kết luận

Chiến lược này kết hợp các chỉ số EMA, TTS và STC để xác định hướng thị trường, với các phán đoán nhất quán từ cả ba giao dịch kích hoạt, lọc hiệu quả các tín hiệu sai. Vẫn còn nhiều chỗ để tối ưu hóa, ví dụ như thử nghiệm nhiều kết hợp chỉ số hơn, thêm các thuật toán thích nghi, tối ưu hóa các mô-đun giao dịch tần số cao, v.v., để tăng cường khả năng theo dõi xu hướng. So với các chiến lược truyền thống chỉ đơn giản theo dõi đường trung bình động, chiến lược này có thể đánh giá thị trường thông minh hơn, nắm bắt xu hướng trong khi tránh bẫy.


/*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")


Thêm nữa