Chiến lược giao dịch dựa trên EMA


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

Chiến lược giao dịch dựa trên EMA

Tổng quan

Chiến lược này sử dụng đường trung bình EMA của 4 chu kỳ khác nhau để tạo ra tín hiệu giao dịch theo thứ tự của nó, giống như đèn giao thông, đèn chỉ báo màu đỏ, vàng và xanh lá cây, vì vậy nó được đặt tên là chiến lược giao dịch đèn giao thông ngọc. Nó đánh giá tổng hợp thị trường từ cả xu hướng và đảo ngược, nhằm nâng cao độ chính xác của quyết định giao dịch.

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

  1. Thiết lập đường trung bình EMA 8 chu kỳ, đường trung bình 14 chu kỳ, đường chậm 16 chu kỳ, sau đó thêm một đường trung bình EMA 100 chu kỳ làm bộ lọc.

  2. Xác định thứ tự sắp xếp của đường trung bình nhanh và chậm 3 và tình trạng giao nhau với bộ lọc, xác định thời gian làm nhiều và làm rỗng:

  • Đánh giá là làm nhiều tín hiệu khi đi qua đường trung bình hoặc đường trung bình trên đường trung bình

  • Đánh giá là tín hiệu đồng vị khi đi qua đường dây nhanh bên dưới đường trung tâm

  • Đường nhanh dưới đường trung hoặc đường trung dưới đường chậm được đánh giá là tín hiệu trống

  • Đánh giá là tín hiệu trống khi đi qua đường trung tâm

  1. Xác định hướng và cường độ của xu hướng thông qua các chuỗi đường trung bình 3 nhanh, trung bình và chậm, kết hợp đường trung bình với các điểm đảo ngược phán đoán chéo của bộ lọc, để thực hiện kết hợp hữu cơ của theo dõi xu hướng và nắm bắt đảo ngược.

Phân tích lợi thế

Chiến lược này kết hợp các ưu điểm của theo dõi xu hướng và đảo ngược giao dịch, giúp nắm bắt tốt hơn các cơ hội thị trường. Những ưu điểm chính là:

  1. Sử dụng nhiều nhóm đường trung bình EMA, có khả năng phán đoán tốt hơn, giảm tín hiệu giả
  2. Cài đặt linh hoạt để tránh bỏ lỡ cơ hội giao dịch
  3. Dòng trung bình chu kỳ dài và ngắn, trí tuệ toàn diện
  4. Khả năng dừng lỗ tùy chỉnh, kiểm soát rủi ro

Bằng cách tối ưu hóa các tham số, chiến lược này có thể thích ứng với nhiều giống hơn, thể hiện khả năng lợi nhuận và ổn định cao hơn trong phản hồi.

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Sự hỗn loạn trong thứ tự xếp hàng trung bình của nhiều nhóm EMA sẽ làm tăng khó khăn trong việc phán đoán và gây ra sự hoài nghi về giao dịch.
  2. Không có khả năng lọc hiệu quả các tín hiệu giả về biến động bất thường của thị trường, gây ra tổn thất trong trường hợp biến động lớn
  3. Các tham số được đặt không đúng lúc, các điều kiện dừng lỗ có thể quá thoải mái hoặc nghiêm ngặt, dẫn đến lợi nhuận bị bỏ lỡ hoặc mất mát quá mức

Cố gắng kiểm soát rủi ro bằng cách tối ưu hóa các tham số, thiết lập mức dừng lỗ và hành động thận trọng.

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

Các hướng tối ưu hóa chính của chiến lược này là:

  1. Điều chỉnh tham số chu kỳ của đường trung bình EMA để phù hợp với nhiều giống hơn
  2. Thêm các bộ lọc cho các chỉ số khác, như MACD, Brinband, để cải thiện tính chính xác của phán đoán
  3. Tối ưu hóa tỷ lệ dừng lỗ để đạt được sự cân bằng tốt nhất giữa rủi ro và lợi nhuận
  4. Thêm các cơ chế dừng lỗ thích ứng, chẳng hạn như dừng ATR, để kiểm soát thêm rủi ro giảm giá

Sự ổn định và lợi nhuận của chiến lược có thể được nâng cao liên tục thông qua việc điều chỉnh tham số đa chiều và giới thiệu các phương tiện kiểm soát rủi ro.

Tóm tắt

Chiến lược giao dịch đèn giao thông này tích hợp theo dõi xu hướng và phán đoán đảo ngược, sử dụng 4 nhóm EMA để tạo ra tín hiệu giao dịch đồng nhất, thích nghi với nhiều giống hơn thông qua tối ưu hóa tham số, thể hiện khả năng lợi nhuận mạnh mẽ trong phản hồi. Tiếp theo, bằng cách kiểm soát rủi ro hơn nữa và giới thiệu các chỉ số đa dạng, nó có khả năng trở thành một chiến lược giao dịch định lượng hiệu quả và ổn định.

Mã nguồn chiến lược
/*backtest
start: 2023-01-01 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
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/
// © maxits

// 4HS Crypto Market Strategy
// This strategy uses 4 ema to get Long or Short Signals
// Length are: 8, 14, 16, 100
// We take long positions when the order of the emas is the following:
// green > yellow > red (As the color of Traffic Lights) and they are above white ema (Used as a filter for long positions)
  
// We take short positions when the order of the emas is the following:
// green < yellow < red (As the color of inverse Traffic Lights) and they are below white ema (Used as a filter for short positions)

//@version=4
strategy(title="Trafic Lights Strategy",
         shorttitle="TLS",
         overlay=true,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0
         )

// User Inputs
// i_time         = input(defval = timestamp("28 May 2017 13:30 +0000"), title = "Start Time", type = input.time) //Starting time for Backtesting

sep1           = input(title="============ System Conditions ============", type=input.bool, defval=false)

enable_Long    = input(true, title="Enable Long Positions")   // Enable long  Positions
enable_Short   = input(true, title="Enable Short Positions") // Enable short Positions

sep2           = input(title="============ Indicator Parameters ============", type=input.bool, defval=false)

f_length       = input(title="Fast EMA Length",   type=input.integer, defval=8,   minval=1) 
m_length       = input(title="Medium EMA Length", type=input.integer, defval=14,   minval=1) 
s_length       = input(title="Slow EMA Length",   type=input.integer, defval=16,  minval=1) 
filter_L       = input(title="EMA Filter",        type=input.integer, defval=100, minval=1) 
filterRes      = input(title="Filter Resolution", type=input.resolution, defval="D")        // ema Filter Time Frame

sep3           = input(title="============LONG Profit-Loss Parameters============", type=input.bool, defval=false)

e_Long_TP      = input(true, title="Enable a Profit Level?")
e_Long_SL      = input(false, title="Enable a S.Loss Level?")
e_Long_TS      = input(true, title="Enable a Trailing Stop?")           
long_TP_Input  = input(40.0,   title='Take Profit %',   type=input.float,   minval=0)/100
long_SL_Input  = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100 
atrLongMultip  = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)   // Parameters to calculate Trailing Stop Loss
atrLongLength  = input(14,    title='ATR Length',      type=input.integer, minval=1)

sep4           = input(title="============SHORT Profit-Loss Parameters============", type=input.bool, defval=false)

e_Short_TP     = input(true, title="Enable a Profit Level?")
e_Short_SL     = input(false, title="Enable a S.Loss Level?")
e_Short_TS     = input(true, title="Enable a Trailing Stop?")
short_TP_Input = input(30.0,   title='Take Profit %',   type=input.float,   minval=0)/100
short_SL_Input = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100
atrShortMultip = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)
atrShortLength = input(14,    title='ATR Length',      type=input.integer, minval=1)

// Indicators

fema   = ema(close, f_length)
mema   = ema(close, m_length)
sema   = ema(close, s_length)
filter = security(syminfo.tickerid, filterRes, ema(close, filter_L))

plot(fema,   title="Fast EMA",   color=color.new(color.green,  0))
plot(mema,   title="Medi EMA",   color=color.new(color.yellow, 0))
plot(sema,   title="Slow EMA",   color=color.new(color.red,    0))
plot(filter, title="EMA Filter", color=color.new(color.white,  0))

// Entry Conditions

longTrade  = strategy.position_size >  0
shortTrade = strategy.position_size <  0
notInTrade = strategy.position_size == 0
inTrade    = strategy.position_size != 0
priceEntry = strategy.position_avg_price

goLong  = fema > mema and mema > sema and fema > filter and  enable_Long  and (crossover (fema, mema) or crossover (mema, sema) or crossover (sema, filter))
goShort = fema < mema and mema < sema and fema < filter and  enable_Short and (crossunder (fema, mema) or crossunder (mema, sema) or crossunder (sema, filter))

close_L = crossunder(fema, mema)
close_S = crossover (fema, mema)

// Profit and Loss conditions

// Long
 
long_TP = priceEntry * (1 + long_TP_Input)  // Long Position Take Profit Calculation
long_SL = priceEntry * (1 - long_SL_Input)  // Long Position Stop Loss Calculation
atrLong = atr(atrLongLength)                // Long Position ATR Calculation
long_TS = low - atrLong * atrLongMultip

long_T_stop  = 0.0                          // Code for calculating Long Positions Trailing Stop Loss/
long_T_stop := if (longTrade)
    longStop = long_TS
    max(long_T_stop[1], longStop)
else 
    0
    
//Short

short_TP = priceEntry * (1 - short_TP_Input) // Long  Position Take Profit Calculation
short_SL = priceEntry * (1 + short_SL_Input) // Short Position Stop Loss Calculation
atrShort = atr(atrShortLength)               // Short Position ATR Calculation
short_TS = high + atrShort * atrShortMultip

short_T_stop   = 0.0                // Code for calculating Short Positions Trailing Stop Loss/
short_T_stop  := if shortTrade
    shortStop  = short_TS
    min(short_T_stop[1], shortStop)
else 
    9999999

// Strategy Long Entry

if goLong and notInTrade 
    strategy.entry("Go Long", long=strategy.long, comment="Go Long", alert_message="Open Long Position")

if longTrade and close_L
    strategy.close("Go Long", when=close_L, comment="Close Long", alert_message="Close Long Position")
    
if e_Long_TP    // Algorithm for Enabled Long Position Profit Loss Parameters
    if (e_Long_TS and not e_Long_SL)
        strategy.exit("Long TP & TS", "Go Long", limit = long_TP, stop = long_T_stop)
    else
        if (e_Long_SL and not e_Long_TS)
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP)
else
    if not e_Long_TP 
        if (e_Long_TS and not e_Long_SL)
            strategy.exit("Long TP & TS", "Go Long", stop = long_T_stop)
        else
            if (e_Long_SL and not e_Long_TS)
                strategy.exit("Long TP & TS", "Go Long",stop = long_SL)
    

// Strategy Short Entry

if goShort and notInTrade 
    strategy.entry("Go Short", long=strategy.short, comment="Go Short", alert_message="Open Short Position")

if shortTrade and close_S
    strategy.close("Go Short", comment="Close Short", alert_message="Close Short Position")

if e_Short_TP   // Algorithm for Enabled Short Position Profit Loss Parameters
    if (e_Short_TS and not e_Short_SL)
        strategy.exit("Short TP & TS", "Go Short", limit = short_TP, stop = short_T_stop)
    else
        if (e_Short_SL and not e_Short_TS)
            strategy.exit("Short TP & SL", "Go Short",limit = short_TP, stop = short_SL)
        else 
            strategy.exit("Short TP & TS", "Go Short",limit = short_TP)
else
    if not e_Short_TP 
        if (e_Short_TS and not e_Short_SL)
            strategy.exit("Short TS", "Go Short", stop = short_T_stop)
        else
            if (e_Short_SL and not e_Short_TS)
                strategy.exit("Short SL", "Go Short",stop = short_SL)

// Long  Position Profit and Loss Plotting

plot(longTrade and e_Long_TP  and long_TP                          ? long_TP      : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_SL  and long_SL and not e_Long_TS        ? long_SL      : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_TS  and long_T_stop and not e_Long_SL    ? long_T_stop  : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)

// Short Position Profit and Loss Plotting

plot(shortTrade and e_Short_TP and short_TP                        ? short_TP     : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_SL and short_SL and not e_Short_TS     ? short_SL     : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_TS and short_T_stop and not e_Short_SL ? short_T_stop : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)