Chiến lược giao dịch đèn giao thông dựa trên EMA

Tác giả:ChaoZhang, Ngày: 2023-11-24 15:46:48
Tags:

img

Tổng quan

Chiến lược này sử dụng 4 đường EMA của các giai đoạn khác nhau để tạo ra các tín hiệu giao dịch dựa trên thứ tự sắp xếp của chúng, tương tự như đèn giao thông màu đỏ, vàng và xanh lá cây.

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

  1. Thiết lập 3 đường EMA nhanh (8 giai đoạn), trung bình (14 giai đoạn) và chậm (16 giai đoạn), cộng với 1 đường EMA dài (100 giai đoạn) làm bộ lọc.

  2. Xác định các cơ hội dài và ngắn dựa trên thứ tự của 3 đường EMA và giao thoa của chúng với bộ lọc:

  • Khi đường nhanh vượt qua đường trung bình hoặc đường trung bình vượt qua đường chậm, nó được xác định là tín hiệu dài.

  • Khi đường trung bình vượt qua dưới đường nhanh, nó được xác định là tín hiệu gần dài.

  • Khi đường nhanh vượt dưới đường trung bình hoặc đường trung bình vượt dưới đường chậm, nó được xác định là tín hiệu ngắn.

  • Khi đường trung gian vượt qua đường nhanh, nó được xác định là tín hiệu ngắn gần.

  1. Đánh giá hướng và sức mạnh xu hướng thông qua thứ tự của 3 đường EMA, kết hợp với sự chéo chéo giữa các đường EMA và bộ lọc để xác định các điểm đảo ngược, kết hợp tự nhiên theo xu hướng và giao dịch đảo ngược.

Phân tích lợi thế

Chiến lược này tích hợp các lợi thế của cả việc theo xu hướng và giao dịch đảo ngược, có thể nắm bắt các cơ hội thị trường tốt.

  1. Sử dụng nhiều đường EMA làm cho phán đoán vững chắc hơn và giảm tín hiệu sai.
  2. Cài đặt linh hoạt cho các điều khoản dài và ngắn tránh bỏ lỡ các cơ hội giao dịch.
  3. Sự kết hợp giữa các đường EMA dài hạn và ngắn hạn tạo ra các đánh giá toàn diện.
  4. Lợi nhuận tùy chỉnh và dừng lỗ cho phép kiểm soát rủi ro tốt hơn.

Thông qua tối ưu hóa tham số, chiến lược này có thể thích nghi với nhiều sản phẩm hơn và đã chứng minh lợi nhuận và sự ổn định mạnh mẽ trong các thử nghiệm hậu quả.

Phân tích rủi ro

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

  1. Khi thứ tự của nhiều đường EMA trở nên lộn xộn, nó làm tăng khó khăn trong phán đoán và gây ngần ngại trong giao dịch.
  2. Nó không thể lọc hiệu quả các tín hiệu sai từ biến động thị trường bất thường, có thể gây ra tổn thất về biến động đáng kể.
  3. Các thiết lập tham số không chính xác có thể dẫn đến các tiêu chí dừng lợi nhuận / lỗ quá nhẹ hoặc quá nghiêm ngặt, dẫn đến việc thiếu lợi nhuận hoặc quá nhiều lỗ.

Nó được đề xuất để tiếp tục cải thiện sự ổn định của chiến lược và kiểm soát rủi ro bằng cách tối ưu hóa các thông số, thiết lập mức dừng lỗ, giao dịch thận trọng v.v.

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

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

  1. Điều chỉnh các thông số chu kỳ của đường EMA để thích nghi với nhiều sản phẩm hơn.
  2. Thêm các chỉ số khác như MACD, Bollinger Bands vv để tăng độ chính xác phán đoán.
  3. Tối ưu hóa tỷ lệ thu lợi nhuận / 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 nghi như ATR Stop Loss để kiểm soát thêm rủi ro giảm.

Tăng cường liên tục tính ổn định và lợi nhuận của chiến lược có thể đạt được bằng cách đưa ra các điều chỉnh tham số và các biện pháp kiểm soát rủi ro trong nhiều khía cạnh.

Kết luận

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


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



Thêm nữa