Steadfast như một chiến lược Rock Turtle là một chiến lược giao dịch định lượng theo các quy tắc của phương pháp giao dịch rùa Brady. Nó sử dụng đột phá giá để nhập vào các vị trí và ngừng theo dõi dừng để thoát ra. Nó tính toán kích thước vị trí dựa trên biến động thực sự và kiểm soát chặt chẽ lỗ cho mỗi giao dịch. Chiến lược có sự ổn định lâu dài trong hoạt động và dung nạp mạnh mẽ cho các khoản rút, giống như đá steadfast.
Chiến lược Steadfast as a Rock Turtle là một chiến lược tham gia vào việc phá vỡ. Cụ thể, nó tính toán mức cao nhất và thấp nhất trong khoảng thời gian xem lại được chỉ định. Khi giá phá vỡ trên mức cao nhất, nó đi dài. Khi giá phá vỡ dưới mức thấp nhất, nó đi ngắn.
Ví dụ, với khoảng thời gian nhập vào 20 thanh, chiến lược sẽ lấy mức cao nhất và thấp nhất trong 20 thanh qua. Nếu việc đóng của thanh hiện tại vượt quá mức cao nhất trong 20 thanh trước, chiến lược sẽ đặt lệnh dừng dài ở mức giá gần đó để chuẩn bị để phá vỡ trên mức cao nhất.
Chiến lược Steadfast như một Rock Turtle thoát ra với các điểm dừng theo dõi các điểm dừng. Nó tính toán năng động mức cao nhất và thấp nhất trong khoảng thời gian thoát được chỉ định và sử dụng chúng để xác định kênh thoát.
Nếu giữ dài, một khi giá giảm xuống dưới mức thấp nhất của kênh thoát, vị trí sẽ dừng lại.
Ngoài ra, chiến lược tính toán mức dừng lỗ dựa trên biến động thực sự, đóng vai trò là điểm dừng cuối cùng. Miễn là giá vẫn ở trên kênh thoát, điểm dừng sẽ tiếp tục theo dõi và điều chỉnh, đảm bảo điểm dừng được đặt ở khoảng cách thích hợp
Chiến lược Đứng vững như một Rock Turtle kích thước vị trí của nó dựa trên biến động thực sự. Cụ thể, nó đầu tiên ước tính tỷ lệ thua lỗ tiềm năng gần giá nhập cảnh, sau đó ngược lại tính toán kích thước vị trí từ tham số rủi ro dự kiến. Điều này có hiệu quả kiểm soát mức thua lỗ tối đa cho mỗi giao dịch.
Đứng vững như một chiến lược Rùa đá tuân thủ nghiêm ngặt các quy tắc giao dịch rùa cổ điển về các bước vào và bước ra mà không cần sửa đổi tùy ý. Điều này cho phép chiến lược hoạt động ổn định trong thời gian dài mà không có sự cố hệ thống do phán đoán kém tạm thời.
Bằng cách tham gia vào các vụ phá vỡ, chiến lược tránh được các khoản đầu vào được đánh giá quá cao một cách hiệu quả, làm giảm khả năng mất mát của hệ thống. Và bằng cách thoát ra với các điểm dừng theo dõi các điểm dừng, nó đảm bảo mất mát tối đa cho mỗi giao dịch được kiểm soát để ngăn chặn phần lớn các lỗ liên tiếp dẫn đến giảm sâu.
Bằng cách định giá dựa trên biến động thực sự, chiến lược kiểm soát chặt chẽ mức lỗ tối đa cho mỗi giao dịch trong phạm vi dung nạp. Và bằng cách theo dõi khoảng cách dừng, nó có thể cắt giảm lỗ kịp thời để có hiệu quả hạn chế rủi ro.
Nếu giá phá vỡ với động lực thấp, nó có thể là tín hiệu sai gây ra tổn thất nhập khẩu sai. Các thông số sẽ cần phải điều chỉnh với nhiều quy tắc xác nhận nhập khẩu hơn để tránh tiếng ồn phá vỡ không hiệu quả.
Các tham số chiến lược tĩnh như thời gian nhập / ra khỏi thị trường có thể trở nên không hợp lệ nếu chế độ thị trường thay đổi mạnh mẽ.
Các chỉ số được sử dụng như cờ phá vỡ giá có thể thất bại khi xu hướng hoặc biến động thay đổi đáng kể.
Các chỉ số xu hướng phổ biến như MA, MACD có thể được thêm vào. Đi dài chỉ trong xu hướng tăng và ngắn chỉ trong xu hướng giảm để tránh các whipsaws chống xu hướng.
Các chỉ số khung thời gian cao hơn, ví dụ như mức MA hàng ngày, có thể giúp xác nhận hướng tổng thể để bổ sung cho các tín hiệu khung thời gian thấp hơn.
Học máy có thể tự động cập nhật các thông số chiến lược liên tục dựa trên dữ liệu mới nhất để duy trì hiệu quả trong sự thay đổi động lực thị trường.
Steadfast như một chiến lược Rock Turtle theo phương pháp giao dịch rùa cổ điển nghiêm ngặt
/*backtest start: 2024-01-18 00:00:00 end: 2024-02-17 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Real Turtle", shorttitle = "Real Turtle", overlay=true, pyramiding=1, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075) ////////////////////////////////////////////////////////////////////// // Testing Start dates testStartYear = input(2016, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "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) // A switch to control background coloring of the test period // Use if using a specific date range testPeriodBackground = input(title="Color Background?", type=bool, defval=false) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true // Component Code Stop ////////////////////////////////////////////////////////////////////// //How many candles we want to determine our position entry enterTrade = input(20, minval=1, title="Entry Channel Length") //How many candles we want ot determine our position exit exitTrade = input(10, minval=1, title="Exit Channel Length") //True Range EMA Length trLength = input(13, minval=1, title="True Range Length") //Go all in on every trade allIn = input(false, title="Use whole position on every trade") dRisk = input(2, "Use Desired Risk %") //How much of emaTR to use for TS offset multiEmaTR = input(2, "Desired multiple of ema Tr (N)") //absolute value (highest high of of this many candles - lowest high of this many candles) . This is used if we want to change our timeframe to a higher timeframe otherwise just works like grabbing high o r low of a candle //True range is calculated as just high - low. Technically this should be a little more complicated but with 24/7 nature of crypto markets high-low is fine. trueRange = max(high - low, max(high - close[1], close[1] - low)) //Creates an EMA of the true range by our custom length emaTR = ema(trueRange, trLength) //Highest high of how many candles back we want to look as specified in entry channel for long longEntry = highest(enterTrade) //loweest low of how many candles back we want to look as specified in exit channel for long exitLong = lowest(exitTrade) //lowest low of how many candles back want to look as specified in entry channel for short shortEntry = lowest(enterTrade) //lowest low of how many candles back want to look as specified in exit channel for short exitShort = highest(exitTrade) //plots the longEntry as a green line plot(longEntry[1], title="Long Entry",color=green) //plots the short entry as a purple line plot(shortEntry[1], title="Short Entry",color=purple) howFar = barssince(strategy.position_size == 0) actualLExit = strategy.position_size > 0 ? strategy.position_avg_price - (emaTR[howFar] * multiEmaTR) : longEntry - (emaTR * multiEmaTR) actualLExit2 = actualLExit > exitLong ? actualLExit : exitLong actualSExit = strategy.position_size < 0 ? strategy.position_avg_price + (emaTR[howFar] * multiEmaTR) : shortEntry + (emaTR * multiEmaTR) actualSExit2 = actualSExit < exitShort ? actualSExit : exitShort //plots the long exit as a red line plot(actualLExit2[1], title="Long Exit",color=red) //plots the short exit as a blue line plot(actualSExit2[1], title="Short Exit",color=yellow) //Stop loss in ticks SLLong =(emaTR * multiEmaTR)/ syminfo.mintick SLShort = (emaTR * multiEmaTR)/ syminfo.mintick //Calculate our potential loss as a whole percentage number. Example 1 instead of 0.01 for 1% loss. We have to convert back from ticks to whole value, then divided by close PLLong = ((SLLong * syminfo.mintick) * 100) / longEntry PLShort = ((SLShort * syminfo.mintick) * 100) / shortEntry //Calculate our risk by taking our desired risk / potential loss. Then multiple by our equity to get position size. we divide by close because we are using percentage size of equity for quantity in this script as not actual size. //we then floor the value. which is just to say we round down so instead of say 201.54 we would just input 201 as TV only supports whole integers for quantity. qtyLong = floor(((dRisk / PLLong) * strategy.equity) /longEntry ) qtyShort = floor(((dRisk / PLShort) * strategy.equity) /shortEntry ) qtyLong2 = allIn ? 100 : qtyLong qtyShort2 = allIn ? 100 : qtyShort //Only open long or short positions if we are inside the test period specified earlier if testPeriod() //Open a stop market order at our long entry price and keep it there at the quantity specified. This order is updated/changed on each new candlestick until a position is opened strategy.entry("long", strategy.long, stop = longEntry, qty = qtyLong2) //sets up or stop loss order by price specified in our actualLExit2 variable strategy.exit("Stoploss-Long", "long", stop=actualLExit2) //Open a stop market order at our short entry price and keep it there at the quantity specified. This order is updated/changed on each new candlestick until a position is opened strategy.entry("short", strategy.short, stop = shortEntry, qty = qtyShort2) //sets up or stop loss order by price specified in our actualLExit2 variable strategy.exit("Stoploss-Short", "short", stop=actualSExit2)