Rùa thật Ứng Dụng như một con rùa đá

Tác giả:ChaoZhang, Ngày: 2024-02-18 14:34:40
Tags:

img

Tổng quan

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.

Nguyên tắc

Quy tắc nhập cảnh

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.

Quy tắc thoá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ợpkhông quá chặt chẽ cho các điểm dừng không cần thiết, không quá lỏng lẻo để kiểm soát rủi ro.

Định kích thước vị trí

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.

Phân tích lợi thế

Hoạt động ổn định

Đứ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.

Khả năng phục hồi giảm

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.

Khả năng kiểm soát rủi ro

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.

Phân tích rủi ro

Nguy cơ thất bại

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ả.

Rủi ro tối ưu hóa tham số

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ẽ.

Rủi ro thất bại chỉ số kỹ thuật

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ể.

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

Thêm bộ lọc xu hướng

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.

Tổng hợp khung thời gian

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.

Chế độ điều chỉnh tham số động

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.

Tóm lại

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 tham gia đột phá và theo dõi dừng ra ngoài với kiểm soát rủi ro nghiêm ngặt. Điều này cho phép các hoạt động ổn định dài hạn với khả năng phục hồi giảm mạnh. Mặc dù có rủi ro như đột phá sai, thất bại tham số vv, chúng có thể được giảm thiểu hiệu quả thông qua các bổ sung như bộ lọc xu hướng, tổng hợp khung thời gian, điều chỉnh năng động vv để cải thiện đáng kể sự ổn định của chiến lược.


/*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)



Thêm nữa