Chỉ số Botvenko thích nghi Chiến lược ngắn dài

Tác giả:ChaoZhang, Ngày: 2024-01-04 16:09:30
Tags:

img

Tổng quan

Chiến lược này được phát triển dựa trên chỉ số Botvenko để tự động xác định xu hướng thị trường và thiết lập các vị trí dài / ngắn. Nó tích hợp chỉ số Botvenko, đường trung bình động và đường hỗ trợ ngang để tự động nhận ra các tín hiệu đột phá và thiết lập vị trí.

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

Chỉ số cốt lõi của chiến lược này là chỉ số Botvenko. Bằng cách tính toán sự khác biệt logaritm giữa giá đóng cửa vào các ngày giao dịch khác nhau, nó đánh giá xu hướng thị trường và mức hỗ trợ / kháng cự quan trọng. Nó đi dài khi chỉ số vượt qua một đường mức nhất định và đi ngắn khi nó vượt qua dưới.

Ngoài ra, chiến lược tích hợp một Vành đai bảo vệ EMA bao gồm trung bình động 21 ngày, 55 ngày và các mức trung bình khác. Nó xác định xem tình trạng hiện tại là thị trường tăng, thị trường gấu hoặc thị trường hợp nhất dựa trên mối quan hệ sắp xếp của các mức trung bình động này, và theo đó hạn chế các hoạt động ngắn hoặc dài.

Bằng cách xác định các tín hiệu giao dịch bằng chỉ số Botvenko và đánh giá các giai đoạn thị trường bằng đường trung bình động, việc thiết lập vị trí không phù hợp có thể được tránh khi sử dụng kết hợp.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó có thể tự động xác định xu hướng dài / ngắn của thị trường. Chỉ số Botvenko rất nhạy cảm với sự khác biệt giữa giá trong hai khoảng thời gian và có thể nhanh chóng xác định mức hỗ trợ / kháng cự chính.

Ý tưởng kết hợp các chỉ số nhanh và các chỉ số xu hướng cho phép chiến lược nhanh chóng xác định các điểm vào và ra trong khi ngăn ngừa mua và bán không phù hợp.

Phân tích rủi ro

Nguy cơ của chiến lược này chủ yếu xuất phát từ hai khía cạnh. Thứ nhất, chỉ số Botvenko rất nhạy cảm với sự thay đổi giá, có thể tạo ra nhiều tín hiệu giao dịch không cần thiết. Thứ hai, việc sắp xếp các đường trung bình động có thể trở nên lộn xộn trong khi di chuyển bên cạnh, dẫn đến việc thiết lập vị trí lộn xộn.

Để giải quyết rủi ro đầu tiên, các tham số của chỉ số Botvenko có thể được điều chỉnh để tăng chu kỳ tính toán và giảm các giao dịch không cần thiết. Đối với rủi ro thứ hai, có thể thêm các đường trung bình động để đánh giá xu hướng chính xác hơn.

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

Các hướng tối ưu hóa chính là điều chỉnh tham số và thêm các điều kiện bộ lọc.

Đối với chỉ số Botvenko, các tham số giai đoạn khác nhau có thể được thử để tìm ra sự kết hợp tối ưu. Đối với đường trung bình động, nhiều hơn trong số họ có thể được thêm vào để tạo thành một hệ thống đánh giá xu hướng hoàn chỉnh hơn. Ngoài ra, các chỉ số biến động, chỉ số khối lượng giao dịch vv cũng có thể được giới thiệu để lọc các tín hiệu sai.

Thông qua việc điều chỉnh toàn diện các thông số và điều kiện lọc, sự ổn định và lợi nhuận của chiến lược có thể được tăng thêm.

Tóm lại

Chiến lược dài / ngắn thích nghi Botvenko kết hợp thành công các chỉ số nhanh và xu hướng để tự động xác định các điểm thị trường chính và thiết lập các vị trí chính xác. Ưu điểm của nó nằm ở vị trí nhanh và ngăn ngừa các vị trí không phù hợp.


/*backtest
start: 2023-12-27 00:00:00
end: 2024-01-03 00:00:00
period: 1m
basePeriod: 1m
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/
// © boftei

//@version=5

strategy("Boftei's Strategy", overlay=false, pyramiding=1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, margin_long = 100, margin_short = 100, slippage=0, commission_type=strategy.commission.percent, commission_value = 0, initial_capital = 40, precision = 6)
strat_dir_input = input.string("all", "strategy direction", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
//DATA
testStartYear = input(2005, "Backtest Start Year")
testStartMonth = input(7, "Backtest Start Month")
testStartDay = input(16, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
//////////////////////////////////////////////////////////////////////
sell = input.float(0.0065, "sell level")
buy = input.float(0, "buy level")
long1 = input.float(-0.493, "long retry - too low")
long2 = input.float(2, "long close up")
long3 = input.float(-1.5, "long close down")
short1 = input.float(1.26, "short retry - too high")
short2 = input.float(-5, "dead - close the short")
///< botvenko script
nn = input(60, "Histogram Period")
float x = 0
float z = 0
float k = 0



y = math.log(close[0]) - math.log(close[nn])
if y>0
    x := y
else
    k := y
//---------------------------------------------
        
plot(y > 0 ? x: 0, color = color.green, linewidth = 4)
plot(y <= 0 ? k: 0, color = color.maroon, linewidth = 4)
plot(y, color = color.yellow, linewidth = 1)

co = ta.crossover(y, buy)
cu = ta.crossunder(y, sell)
retry_long = ta.crossunder(y, long1)
deadline_long_up = ta.crossover(y, long2)
deadline_long_down = ta.crossunder(y, long3)
retry_short = ta.crossover(y, short1)
deadline_short = ta.crossunder(y, short2)


hline(buy, title='buy', color=color.green, linestyle=hline.style_dotted, linewidth=2)
hline(0, title='zero', color=color.white, linestyle=hline.style_dotted, linewidth=1)
hline(sell, title='sell', color=color.red, linestyle=hline.style_dotted, linewidth=2)
hline(long1, title='long retry', color=color.blue, linestyle=hline.style_dotted, linewidth=2)
hline(long2, title='overbought', color=color.teal, linestyle=hline.style_dotted, linewidth=2)
hline(long3, title='oversold', color=color.maroon, linestyle=hline.style_dotted, linewidth=2)
hline(short1, title='short retry', color=color.purple, linestyle=hline.style_dotted, linewidth=2)
hline(short2, title='too low to short - an asset may die', color=color.navy, linestyle=hline.style_dotted, linewidth=2)


////////////////////////////////////////////////////////////EMAprotectionBLOCK
ema_21 = ta.ema(close, 21)
ema_55 = ta.ema(close, 55)
ema_89 = ta.ema(close, 89)
ema_144 = ta.ema(close, 144)
//ema_233 = ta.ema(close, 233)
// ema_377 = ta.ema(close, 377)

long_st = ema_21>ema_55 and ema_55>ema_89 and ema_89>ema_144 //and ema_144>ema_233 and ema_233>ema_377
short_st = ema_21<ema_55 and ema_55<ema_89 and ema_89<ema_144 //and ema_144<ema_233 and ema_233<ema_377 

g_v = long_st == true?3:0
r_v = short_st == true?-2:0
y_v = long_st != true and short_st != true?2:0

plot(math.log(ema_21), color = color.new(#ffaf5e, 50))
plot(math.log(ema_55), color = color.new(#b9ff5e, 50))
plot(math.log(ema_89), color = color.new(#5eff81, 50))
plot(math.log(ema_144), color = color.new(#5effe4, 50))
//plot(math.log(ema_233), color = color.new(#5e9fff, 50))
//plot(math.log(ema_377), color = color.new(#af5eff, 50))

plot(long_st == true?3:0, color = color.new(color.green, 65), linewidth = 5)
plot(short_st == true?-2:0, color = color.new(color.red, 65), linewidth = 5)
plot(long_st != true and short_st != true?2:0, color = color.new(color.yellow, 65), linewidth = 5)
////////////////////////////////////////////////////////////EMAprotectionBLOCK




if (co and testPeriod() and (g_v == 3 or y_v == 2))
    strategy.close("OH BRO", comment = "EXIT-SHORT")
    strategy.close("OH DUDE", comment = "EXIT-SHORT")
	strategy.entry("OH DAMN", strategy.long, comment="ENTER-LONG 'co'")
if (retry_long and testPeriod() and (g_v == 3 or y_v == 2))
    strategy.close("OH DAMN", comment = "EXIT-LONG")
    strategy.entry("OH BRUH", strategy.long, comment="ENTER-LONG 'retry_long'")
	
if (cu and testPeriod() and (r_v == -2 or y_v == 2))
    strategy.close("OH DAMN", comment = "EXIT-LONG")
    strategy.close("OH BRUH", comment = "EXIT-LONG")
	strategy.entry("OH BRO", strategy.short, comment="ENTER-SHORT 'cu'")
if (retry_short and testPeriod() and (r_v == -2 or y_v == 2))
    strategy.close("OH BRO", comment = "EXIT-SHORT")
    strategy.entry("OH DUDE", strategy.short, comment="ENTER-SHORT 'retry_short'")
	
    
if (deadline_long_up and testPeriod() or r_v == -2 and testPeriod())
    strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_up'")
if (deadline_long_down and testPeriod())
    strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_down'")
if (deadline_short and testPeriod() or g_v == 3 and testPeriod())
    strategy.close("OH BRO", comment = "EXIT-SHORT 'deadline_short'")
    // (you can use strategy.close_all(comment = "close all entries") here)



Thêm nữa