Xu hướng sau chiến lược dựa trên Stochastic và CCI

Tác giả:ChaoZhang, Ngày: 2023-11-22 16:23:31
Tags:

img

Tổng quan

Chiến lược này kết hợp chỉ số Stochastic và chỉ số CCI để xác định hướng xu hướng, và sử dụng chỉ số Tỷ lệ thay đổi để lọc các xu hướng giới hạn trong phạm vi, để theo dõi xu hướng.

Chiến lược logic

  1. Chỉ số Stochastic đánh giá mô hình tăng/giảm
    Golden Cross của Stochastic là tín hiệu mua, trong khi death cross là tín hiệu bán
  2. Chỉ số CCI xác định hướng xu hướng CCI trên 0 cho thấy thị trường tăng, trong khi dưới 0 thị trường giảm
  3. Chỉ số Tỷ lệ thay đổi lọc xu hướng giới hạn trong phạm vi
    Đặt các tham số của Tỷ lệ thay đổi để đánh giá liệu giá có trong một xu hướng hoạt động
  4. Quy tắc nhập cảnh và xuất cảnh Đăng nhập dài: Stochastic gold cross & CCI > 0 & xu hướng hoạt động Nhận thức ngắn: Stochastic death cross & CCI < 0 & xu hướng hoạt động Lệnh dừng lỗ: 3% dừng lỗ cho cả hai bên dài và ngắn

Phân tích lợi thế

  1. Sự kết hợp của Stochastic và CCI cải thiện độ chính xác của phán đoán xu hướng
  2. Tỷ lệ thay đổi lọc các xu hướng giới hạn trong phạm vi, tránh các giao dịch không hợp lệ
  3. Cả hai giao dịch dài và ngắn, có thể bắt được các loại xu hướng khác nhau
  4. Breakout nhập cảnh kịp thời nắm bắt cơ hội xu hướng
  5. Đặt dừng lỗ nghiêm ngặt ngăn ngừa tổn thất lớn và kiểm soát rủi ro

Phân tích rủi ro

  1. Cài đặt tham số không chính xác có thể dẫn đến chiến lược quá bảo thủ hoặc hung hăng
  2. Hiệu ứng hạn chế của các chỉ số, có thể thất bại trong điều kiện thị trường cực đoan
  3. Sự gia nhập đột phá bỏ giai đoạn đầu của xu hướng, từ bỏ một phần lợi nhuận
  4. Việc kiểm soát rủi ro bị thất bại khi stop loss quá chật hoặc quá rộng

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

  1. Tối ưu hóa tham số để tìm kết hợp tối ưu
  2. Thêm thêm các chỉ số xu hướng để cải thiện hiệu quả
  3. Sử dụng stop loss sau hoặc stop loss dựa trên thời gian để giảm nguy cơ vi phạm stop loss
  4. Thêm các chỉ số rủi ro như rút tiền tối đa để kiểm soát hoàn toàn rủi ro

Tóm lại

Chiến lược này đánh giá hướng xu hướng bằng cách tích hợp các chỉ số Stochastic, CCI và Tỷ lệ thay đổi, và nắm bắt cơ hội xu hướng với theo dõi đột phá. Ưu điểm của nó nằm trong sự đánh giá chính xác được trao quyền bởi sự kết hợp của các chỉ số, lọc thị trường giới hạn phạm vi và dừng lỗ nghiêm ngặt để kiểm soát rủi ro. Bước tiếp theo là cải thiện thêm chiến lược thông qua tối ưu hóa tham số, nhiều chỉ số, chiến lược dừng lỗ để làm cho nó mạnh mẽ và linh hoạt hơn.


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

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(3.0, title='Stop Loss %') / 100 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")

Thêm nữa