Chiến lược giao dịch dải biến động đột phá


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

Tổng quan

Chiến lược này dựa trên nguyên tắc phá vỡ của Brin, khi giá hoàn toàn phá vỡ đường lên hoặc đường xuống, nó sẽ hoạt động ngược lại. Nó có thể nắm bắt chuyển động quay trở lại đồng bằng sau khi biến động bất thường, phù hợp với các nhà giao dịch tích cực theo đuổi lợi nhuận hiệu quả.

Nguyên tắc

Chiến lược này sử dụng các dải Brin để xác định phạm vi biến động của thị trường hiện tại. Khi giá tạo thành một cột nến hoặc cột nến hoàn chỉnh và phá vỡ hoàn toàn các dải Brin lên hoặc xuống đường, thị trường sẽ quay trở lại hướng đồng bằng khi đạt đến trạng thái biến động cao.

Cụ thể, chiến lược tính toán giá đóng cửa của 20 đường K trên đường giữa, đường trên và đường dưới của đường Brin. Khi giá thấp hơn đường dưới và giá đóng cửa thấp hơn giá mở cửa, tạo ra tín hiệu nhiều. Khi giá cao hơn đường trên và giá đóng cửa cao hơn giá mở cửa, tạo ra tín hiệu thiếu hụt.

Ưu điểm

Những ưu điểm chính của chiến lược này là:

  1. Sử dụng dải Brin để đánh giá mức độ biến động của thị trường và xác định hiệu quả tình trạng bất thường.

  2. Điểm phá vỡ là điểm dừng lỗ, có thể kiểm soát rủi ro hiệu quả.

  3. Quay trở lại quỹ đạo trung tâm đặt vị trí mục tiêu hợp lý, tránh quá cố gắng và rơi.

  4. Bộ lọc dây K hoàn chỉnh phá vỡ giả, cải thiện chất lượng tín hiệu.

  5. Các tham số đơn giản, dễ thực hiện và tối ưu hóa.

  6. Nó có thể được sử dụng để tạo ra các từ khóa và các phần mềm khác.

Rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. Không đúng tham số Brin có thể dẫn đến thất bại.

  2. Một bước đột phá có thể là sự khởi đầu của một xu hướng mới, và có nguy cơ ra đi sớm.

  3. Mục tiêu của quỹ đạo trung tâm có thể quá bảo thủ và không thể mang lại lợi nhuận lâu dài.

  4. Các nhà khoa học đã nghiên cứu và phát hiện ra rằng các lỗ hổng lớn không thể được lấp đầy hoàn toàn và có nguy cơ bị trượt.

  5. Trong một xu hướng bất ổn, các giao dịch không cần thiết có thể xảy ra thường xuyên.

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

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Đánh giá sức mạnh của xu hướng, điều chỉnh tham số hoặc tần suất giao dịch.

  2. Kết hợp với các chỉ số khác để xác định thời điểm tốt nhất để nhập học.

  3. Điều chỉnh mức độ dừng lỗ theo mức độ biến động.

  4. Tối ưu hóa mục tiêu đầu tiên để tạo ra lợi nhuận.

  5. Tham gia vào cơ chế tái nhập học để tối ưu hóa lợi nhuận

  6. Đánh giá sự tin cậy đột phá và tránh sai lầm thương mại.

Tóm tắt

Chiến lược này dựa trên nguyên tắc đột phá của Brin, phù hợp với các nhà giao dịch tích cực theo đuổi lợi nhuận ngắn hạn. Ưu điểm là kiểm soát rủi ro rõ ràng, nhược điểm là có thể thoát khỏi sân sớm và hạn chế không gian lợi nhuận. Có thể nâng cao hiệu quả thông qua các phương pháp như tối ưu hóa tham số, chỉ số hỗ trợ.

Mã nguồn chiến lược
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 3h
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/
// © Bishnu103

//@version=4
strategy(title="Full Candle Outside BB [v1.0][Bishnu103]",shorttitle="OUTSIDE BB",overlay=true,calc_on_every_tick=true,backtest_fill_limits_assumption=2)

// ***********************************************************************************************************************
// input variables
buy_session         = input(title="Buy Session", type=input.session, defval="0915-1430")
exit_inraday        = input(title="Exit Intraday?", type=input.bool, defval=true)
entry_distance      = input(title="Entry distance from alert", minval=1, maxval=10, defval=3)
show_bb_switch      = input(title="Show BB", type=input.bool, defval=true)
//
bbLength            = input(title="BB Length", minval=1, defval=20)
bbStdDev            = input(title="BB StdDev", minval=1, defval=2)

// ***********************************************************************************************************************
// global variables
long_entry          = false
short_entry         = false
long_exit           = false
short_exit          = false

// variable values available across candles
var entry_price     = 0.0  
var sl_price        = 0.0
var exit_price      = 0.0
var candle_count    = 0

// ***********************************************************************************************************************
// function to return bollinger band values based on candle poition passed 
getBB(pos) => [mBB, uBB, lBB] = bb(close[pos], bbLength, bbStdDev)

// function returns true if current time is within intraday byuing session set in input
BarInSession(sess) => time(timeframe.period, sess) != 0

// ***********************************************************************************************************************
// strategy
//
// get current bb value
[mBB_0,uBB_0,lBB_0] = getBB(0)

// check if full candle outside upper BB
outside_uBB = low > uBB_0 and close <= open
outside_lBB = high < lBB_0 and close >= open

// ***********************************************************************************************************************
// entry conditions 
long_entry   := outside_lBB
short_entry  := outside_uBB

// keep candle count since the alert generated so that order can be cancelled after N number of candle calling it out as invalid alert
candle_count := candle_count + 1
if long_entry or short_entry
    candle_count    := 0

// ***********************************************************************************************************************
// risk management
//
// decide entry and sl price
if long_entry
    entry_price := high
    
if short_entry
    entry_price := low
    
if long_entry
    sl_price    := low
    
if short_entry
    sl_price    := high

// first exit is when price hits middle BB, gets updated for each candle based on it's middle BB value
exit_price  := mBB_0

// ***********************************************************************************************************************
// position sizing
price = if close[0] > 25000
    25000
else
    price = close[0]

qty = 25000/price

// ***********************************************************************************************************************
// entry
//if long_entry and strategy.position_size == 0
//    strategy.entry("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price)) 
if long_entry and strategy.position_size == 0
    strategy.order("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price))

//if short_entry and strategy.position_size == 0
//    strategy.entry("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))
if short_entry and strategy.position_size == 0
    strategy.order("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))

// cancel an order if N number of candles are completed after alert candle
strategy.cancel_all(candle_count > entry_distance)

// if current time is outside byuing session then do not enter intraday trade
strategy.cancel_all(timeframe.isintraday and not BarInSession(buy_session))

// ***********************************************************************************************************************
// exit
if strategy.position_size > 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.short, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

if strategy.position_size < 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.long, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

// if intraday trade, close the trade at open of 15:15 candle //!!!!!!!!!!!!!!!!!!!!! TO BE CORRECTED !!!!!!!!!!!!!!!!!!!!!!!
if timeframe.isintraday and exit_inraday and hour == 15 and minute == 00
    strategy.close("BUY",  when=strategy.position_size > 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))
    strategy.close("SELL", when=strategy.position_size < 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))

// ***********************************************************************************************************************
// plots    
//
// plot BB
[mBBp,uBBp,lBBp] = getBB(0)
p_mBB = plot(show_bb_switch ? mBBp : na, color=color.teal)
p_uBB = plot(show_bb_switch ? uBBp : na, color=color.teal)
p_lBB = plot(show_bb_switch ? lBBp : na, color=color.teal)
fill(p_uBB,p_lBB,color=color.teal,transp=95)