Chiến lược Crossover chỉ số cơ thể tương đối

Tác giả:ChaoZhang, Ngày: 2023-10-18 11:16:53
Tags:

img

Tổng quan

Chiến lược này chủ yếu sử dụng các tín hiệu chéo trung bình động của tỷ lệ cơ thể tương đối (RB) của nến hàng ngày để xác định xu hướng, cùng với dừng lỗ và lấy lợi nhuận cho giao dịch tự động.

Chiến lược logic

Chiến lược này dựa trên chỉ số RBI của Vitelot, tính toán trung bình động của tỷ lệ cơ thể tương đối (RB) của các cây nến hàng ngày.

Công thức tính toán tỷ lệ cơ thể thực với toàn bộ chiều dài của ngọn nến cho nến tăng, lấy giá trị dương; và giá trị âm cho nến giảm.

Chỉ số RBI sử dụng đường trung bình động của RB để lọc ra tiếng ồn và nắm bắt bản chất của xu hướng thị trường.

Để tránh các tín hiệu sai trong các giai đoạn tăng không chắc chắn, chiến lược cũng kiểm tra xem giá đóng là trên EMA 13 giai đoạn trước khi tạo ra một tín hiệu mua thực sự cho vị trí dài.

Sau khi mở vị trí, lợi nhuận sẽ được theo dõi dựa trên các điểm đặt, với một điểm dừng lỗ cố định.

Phân tích lợi thế

  • RBI lọc ra tiếng ồn đáng kể và nắm bắt các đặc điểm xu hướng thị trường, tránh các tín hiệu sai từ các thị trường khác nhau.

  • Sử dụng bộ lọc trung bình động tránh các tín hiệu sai hiệu quả trong các giai đoạn tăng không chắc chắn, giảm lỗ từ bán.

  • Dừng lỗ và lấy lợi nhuận giúp giảm rủi ro mất mát trên các vị trí riêng lẻ và khóa lợi nhuận, cải thiện lợi nhuận tổng thể.

  • Chiến lược có ít thông số và dễ hiểu, phù hợp với giao dịch tự động.

Phân tích rủi ro

  • Chiến lược chỉ dựa vào RBI, bất kỳ tín hiệu sai nào từ chỉ số có thể dẫn đến thất bại.

  • Việc điều chỉnh tham số kém của chỉ số cũng có thể làm giảm chất lượng của tín hiệu giao dịch.

  • Không chỉ số kỹ thuật nào có thể tránh hoàn toàn tổn thất trong điều kiện thị trường nhất định.

  • Đặt stop loss quá chật có thể dẫn đến stop out quá thường xuyên; quá rộng có thể dẫn đến lỗ lớn trên các vị trí đơn.

  • Kiểm soát rút tiền không đủ có thể dẫn đến rủi ro xóa sổ tài khoản.

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

  • Các kết hợp tham số khác nhau có thể được thử nghiệm để tối ưu hóa các tham số RBI.

  • Các chỉ số bổ sung có thể được thêm vào để lọc tín hiệu và cải thiện chất lượng.

  • Học máy có thể được sử dụng để đào tạo và tối ưu hóa các thông số dừng lỗ và lấy lợi nhuận.

  • Các chiến lược quản lý rủi ro có thể được thêm vào để kiểm soát quy mô tổng thể của vị trí và rủi ro.

  • Các giai đoạn nắm giữ khác nhau như nắm giữ qua đêm hoặc đầu tư ngắn hạn có thể được khám phá.

Kết luận

RBI là một công ty giao dịch giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp, có các công ty giao dịch trực tiếp.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("RBI Backtest /w TSSL", shorttitle="RBI Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
// RBI:
//  The EMA of the relative body (RB) of Japanese candles is evaluated.
//  The RB of a candle (my definition) is simply the ratio of the body with respect to its full length
//  and taken positive for bull candles and negative for bear candles:
//      e.g. a bull "marubozo" has RB=1 a bear "marubozo" has RB=-1;
//      a "doji" has RB=0.
//  This simple indicator grasps the essence of the market by filtering out a great deal of noise.
//
//  A flag can be selected to calculate its very basic binary version, where a bull candle counts as a one
//  and a bear candle counts as a minus one.
//
//  Enter (or exit) the market when the signal line crosses the base line.
//  When the market is choppy we have a kind of alternating bear and bull candles so that
//  RBI is FLAT and usually close to zero. 
//  Therefore avoid entering the market when RBI is FLAT and INSIDE the Exclusion level.
//  The exclusion level is to be set by hand: go back in history and check when market was choppy; a good
//  way to set it is to frame the oscillations of RBI whe price was choppy.
//
//  RBI is more effective when an EMA of price is used as filtering. I found EMA(13) to be
//  a decent filter: go long when base crosses signal upwards AND closing price is above EMA(13);
//  same concept for going short.
//
//  As any other indicator, use it with responsibility: THERE CAN'T BE A SINGLE MAGIC INDICATOR winning
//  all trades.
//
//  Above all, have fun.
//
// Vitelot/Yanez/Vts March 31, 2019

par1 = input(5, title="MA1 Period")
par2 = input(5, title="Signal Period")
exclusion = input(0.2, title="Exclusion level")

useBin = input(false, title="Calculate the binary version")

treshold_long = input(0, title="Treshold Long")
treshold_short = input(0, title="Treshold Short")

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=120)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true

ynSimple(t) =>
    s = (close>open)? 1: -1
    ema(sum(s,t),t)

ynRel(t) =>
    s = (close-open)/(high-low)
    ema(sum(s,t),t)

yn = useBin? ynSimple(par1): ynRel(par1) 
sig = ema(yn,par2)


plot(yn, color=aqua, title="RBI", linewidth=3, transp=0)
plot(sig, color=orange, title="Signal", linewidth=2, transp=0)

hline(0, color=white, title="Zero level", editable=false)
hline(exclusion, color=yellow, title="Exclusion level +", editable=true, linestyle=line)
hline( 0-exclusion, color=yellow, title="Exclusion level -", editable=true, linestyle=line)

long = crossover(yn,sig) and yn < treshold_long
short = crossover(sig,yn)  and yn > treshold_short

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)


Thêm nữa