Chiến lược này xác định các đường K tăng bất thường để đánh giá liệu có một thị trường một chiều có biến động bùng nổ hay không. Khi một đường K tăng bất thường được xác định, nó sẽ đặt lệnh giới hạn lợi nhuận gần mức cao nhất của đường K đó, đồng thời đặt lệnh dừng lỗ gần mức thấp nhất của đường K trước đó, tạo thành một vị trí dài với kiểm soát rủi ro đòn bẩy cao. Chiến lược liên tục theo dõi đường dừng lỗ và sẽ ngay lập tức hủy lệnh dừng lỗ nếu giá phá vỡ dưới đường dừng lỗ.
Chiến lược này chủ yếu đánh giá sự hình thành của các đường K tăng bất thường. Khi một đường K với đóng> mở và cao
Lợi thế lớn nhất của chiến lược này là nó có thể nắm bắt sự biến động bùng nổ ngắn hạn trên thị trường để đạt được giao dịch tần số cực cao. Đồng thời, bằng cách đặt phạm vi dừng lỗ lớn hơn, đòn bẩy cao có thể được sử dụng cho giao dịch kiểm soát rủi ro để có được lợi nhuận lớn hơn. Ngoài ra, chiến lược nhận ra việc theo dõi tự động đường dừng lỗ. Khi giá vượt qua đường dừng lỗ xuống, nó có thể nhanh chóng dừng lỗ để kiểm soát hiệu quả rủi ro giao dịch.
Rủi ro chính của chiến lược này là việc đánh giá sự gia tăng bất thường là không chính xác, và nó không thể nắm bắt hiệu quả sự biến động bùng nổ của thị trường, dẫn đến khả năng đánh giá sai các tín hiệu giao dịch cao hơn. Ngoài ra, việc thiết lập các vị trí dừng lỗ cũng sẽ có tác động lớn đến rủi ro giao dịch và lợi nhuận. Nếu dừng lỗ quá lỏng lẻo, rủi ro mất giao dịch sẽ tăng lên. Nếu dừng lỗ quá chặt chẽ, nó có thể không có khả năng theo dõi hiệu quả lợi nhuận trên thị trường.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Các tiêu chí để đánh giá sự gia tăng bất thường có thể giới thiệu thêm các chỉ số hoặc mô hình học sâu để hỗ trợ các phán quyết để cải thiện độ chính xác của các phán quyết tín hiệu giao dịch trong chiến lược.
Việc thiết lập các vị trí dừng lỗ có thể trải qua một lượng lớn phân tích thống kê và tối ưu hóa để tìm các vị trí dừng lỗ tốt hơn để cân bằng rủi ro giao dịch và mức lợi nhuận.
Các cơ chế kiểm soát rủi ro giao dịch tần suất cao hơn có thể được đưa ra, chẳng hạn như lọc khối lượng giao dịch, xác minh đột phá phạm vi, vv, để tránh khả năng bị mắc kẹt.
Các tiêu chí nhập cảnh của chiến lược có thể được điều chỉnh và không cần phải giới hạn trong các đường K tăng bất thường.
Chiến lược này là một chiến lược giao dịch tần số cao điển hình, thuộc về một chiến lược đột phá ngắn hạn. Nó nắm bắt sự biến động bùng nổ trong các chuyển động thị trường để đạt được giao dịch tần số cực cao. Đồng thời, nó sử dụng kiểm soát rủi ro dừng lỗ và cơ chế đòn bẩy cao để kiểm soát rủi ro. Chiến lược có không gian tối ưu hóa lớn và có thể được điều chỉnh và tối ưu hóa từ nhiều góc độ. Mục tiêu cuối cùng là đạt được lợi nhuận cao hơn từ giao dịch tần số cực cao trong khi kiểm soát rủi ro.
/*backtest start: 2023-11-15 00:00:00 end: 2023-11-22 08:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JoshuaMcGowan // I needed to test/verify the functionality for canceling an open limit order in a strategy and also work thru the pieces needed to set the position sizing so each loss is a set amount. // This is not meant to be dropped into a chart but rather gives the code/logic in order to use in your own script w/alerts or strategy. Hope it helps. //@version=4 strategy("Strategy Test - Cancel Limit Order and Position Sizing", overlay=true, precision=4) ///////////////// // Backtest Period Selection testStartYear = input(2020, "Backtest Start Year",minval=1980) testStartMonth = input(2, "Backtest Start Month",minval=1,maxval=12) testStartDay = input(1, "Backtest Start Day",minval=1,maxval=31) testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2020, "Backtest Stop Year",minval=1980) testStopMonth = input(12, "Backtest Stop Month",minval=1,maxval=12) testStopDay = input(31, "Backtest Stop Day",minval=1,maxval=31) testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => time >= true ////////////// // Inside Bar bull_inside_bar = close>open and high<high[1] and low>low[1] // Set Levels bull_inside_bar_sl = valuewhen(bull_inside_bar, low[1], 0) - (1*syminfo.mintick) bull_breakout_price = valuewhen(bull_inside_bar, high, 0) + (1*syminfo.mintick) entry_buy = high inside_bar_dist = entry_buy - bull_inside_bar_sl inside_bar_be = entry_buy + (inside_bar_dist * 1) inside_bar_tgt = entry_buy + (inside_bar_dist * 2) /////////////////// // Position Sizing ////////////////// // For each trade setup that fires in this scenario we want to set our total loss amount in USD, so every trade that loses is lets say $1 and the 2:1 target would be $2 in this example. // The math logic for this take the risk amount and divide by the stop percentage, take that number and divide by leverage amount chosen. Stop percentage is a variable below if questions on that. // // Taken from @JoshuaMorris (shout out to the UK peeps) position sizing google doc so thank you sir. // Would be used if risking based on percentage of a portfolio. Leaving code snippets here in case that's the direction someone wants to go. // xbt_price = security("BITMEX:XBTUSD", "D", close) // account_size_xbt = input(1, "Account Size (XBT)", type=input.float) // account_size_usd = (account_size_xbt * xbt_price) // percentage_risk = input(0.01, "Personal Risk Percent - Default is 1%", type=input.float) // personal_risk = (account_size_usd * percentage_risk) // position_size_usd = (personal_risk) / risk_percent // leverage_req = position_size_usd / account_size_usd // Will want to hard code leverage as 1x, 5x, 10x etc and dont need it to automagically be set as is above. If you're doing 100x you are gnarly haha. leverage_amount = input(title="Leverage Amount Desired", type=input.integer, defval=10, options=[1, 2, 3, 5, 10, 25, 50, 100]) risk_amount = input(title="Risk Total Per Trade in USD", type=input.integer, defval=1, minval=1, step=1) // Reminder this is for Longs. Math needs to be changed a bit for Shorts. This is the information using the long/short tool would give us if doing manually. stop_percent = inside_bar_dist / (entry_buy) pos_size_no_lev = risk_amount / stop_percent pos_size_with_lev = pos_size_no_lev / leverage_amount ////////////// // Strategy Section if testPeriod() strategy.entry(id="Long", long=true, qty=1, limit=9320.00, when=bull_inside_bar) strategy.cancel(id="Long", when = low < 9310) // as a test swap the price to be above the limit or below to see the cancel in play. ////////////// // Plot Section plotchar(bull_inside_bar, title="bull_inside_bar", char="🐂", location=location.belowbar, offset=-0, color=color.green, transp=25) plot(bull_inside_bar_sl, title="bull_inside_bar_sl", transp=100) plot(entry_buy, title="entry_buy", transp=100) plot(inside_bar_dist, title="inside_bar_dist", transp=100) plot(stop_percent, title="stop_percent", transp=100) plot(pos_size_no_lev, title="pos_size_no_lev", transp=100) plot(pos_size_with_lev, title="pos_size_with_lev", transp=100) // Hidden Plots // For Data Window Eyes Only // // plot(longCondition==true?1:0, title="Long Condition", transp=100) // plot(xbt_price, title="XBT Price", transp=100) // plot(account_size_usd, title="Account Size USD", transp=100) // plot(risk_percent, title="risk_percent", transp=100) // plot(position_size_usd, title="position_size_usd", transp=100) // plot(leverage_req, title="leverage_req", transp=100) // END //