Chiến lược Rùa vững chắc


Ngày tạo: 2024-02-18 14:34:40 sửa đổi lần cuối: 2024-02-18 14:34:40
sao chép: 0 Số nhấp chuột: 747
1
tập trung vào
1617
Người theo dõi

Chiến lược Rùa vững chắc

Tổng quan

Chiến lược Bảng đá cứng như đá là một chiến lược giao dịch định lượng theo luật giao dịch Bảng đá Brady. Nó sử dụng cách phá vỡ giá vào, dừng lỗ theo dõi dừng lỗ, tính toán quy mô vị trí dựa trên sóng thực, kiểm soát chặt chẽ tổn thất đơn. Chiến lược này hoạt động ổn định trong thời gian dài, chống lại sự sụt giảm mạnh mẽ như đá cứng.

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

Quy tắc nhập cảnh

Chiến lược Seahorse cứng như đá trong đợt phá vỡ. Cụ thể, nó sẽ tính toán giá cao nhất và giá thấp nhất trong một chu kỳ, dựa trên các tham số chu kỳ phá vỡ được nhập.

Ví dụ, nếu tham số chu kỳ đầu vào được đặt là 20 đường K, thì chiến lược sẽ lấy giá cao nhất và giá thấp nhất của 20 đường K gần đây nhất. Nếu giá đóng cửa của đường K hiện tại cao hơn giá cao nhất của 20 đường K trước đó, chiến lược sẽ gửi nhiều lệnh dừng ở vị trí giá đóng cửa đó, chờ đợi giá đóng cửa vượt qua giá cao nhất.

Quy tắc chơi

Chiến lược Bão cứng như đá theo dõi lệnh dừng lỗ. Nó sẽ tính toán động giá cao nhất và giá thấp nhất trong một chu kỳ nhất định dựa trên các tham số chu kỳ ra lệnh đầu vào. Đây là lối thoát của chiến lược.

Khi giữ nhiều vị trí, nếu giá giảm xuống mức giá thấp nhất để thoát ra khỏi kênh, vị trí sẽ bị dừng. Ngược lại, khi giữ vị trí trống, nếu giá vượt qua mức giá cao nhất để thoát ra khỏi kênh, vị trí sẽ bị dừng.

Ngoài ra, chiến lược cũng sẽ tính toán mức dừng lỗ dựa trên sóng thực, làm đường dừng cuối cùng. Chừng nào giá không phá vỡ lối thoát, mức dừng lỗ sẽ theo dõi các sửa đổi để đảm bảo khoảng cách dừng lỗ là tốt nhất, không quá quyết liệt dẫn đến tổn thất không cần thiết và không quá xa để kiểm soát thiệt hại một cách hiệu quả.

Kích thước vị thế

Chiến lược Tết cứng như đá sẽ tính toán quy mô một lệnh dựa trên sóng thực. Cụ thể, nó sẽ tính toán phần trăm tổn thất tiềm năng gần giá vào đầu tiên và sau đó đưa ra quy mô lệnh dựa trên các tham số rủi ro mong đợi. Điều này có thể kiểm soát hiệu quả mức tổn thất tối đa cho mỗi giao dịch.

Phân tích lợi thế

Hoạt động ổn định

Chiến lược Bạch Dương cứng như đá tuân theo luật giao dịch Bạch Dương Brady, thực thi nghiêm ngặt các quy tắc nhập cảnh và xuất cảnh, không thay đổi tùy tiện. Điều này làm cho chiến lược có thể hoạt động ổn định trong thời gian dài, không gây ra sự cố hệ thống do sai sót phán đoán tạm thời.

Chống sự suy thoái

Chiến lược sử dụng lối vào phá vỡ giá có thể tránh được rủi ro của lối vào lỗi ở mức cao, do đó làm giảm khả năng mất mát hệ thống. Đồng thời, sử dụng phương pháp theo dõi dừng lỗ để đảm bảo kiểm soát tổn thất đơn lẻ, hạn chế tối đa sự sụt giảm do mất mát liên tục.

Những rủi ro có thể kiểm soát được

Chiến lược tính toán vị thế bằng sóng thực, kiểm soát chặt chẽ mức lỗ tối đa cho mỗi giao dịch trong phạm vi cho phép, tránh rủi ro vượt quá do mất mát lớn một lần. Đồng thời áp dụng phương thức theo dõi dừng lỗ để đảm bảo khoảng cách dừng lỗ phù hợp, có thể dừng lỗ kịp thời và kiểm soát rủi ro hiệu quả.

Phân tích rủi ro

Rủi ro đột phá thất bại

Nếu không có sự đột phá xung đột, có thể tạo ra tín hiệu sai dẫn đến tổn thất khi hệ thống nhập vào sai. Trong trường hợp này, cần điều chỉnh tham số, tăng điều kiện xác nhận nhập vào để tránh nhiễu tiếng ồn của đột phá không hiệu quả.

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

Các tham số của chiến lược như chu kỳ đầu vào, chu kỳ ra khỏi, v.v. đều được thiết lập tĩnh. Nếu môi trường thị trường thay đổi lớn, các thiết lập tham số này có thể sẽ không có hiệu lực. Khi đó, cần phải đánh giá lại các thiết lập tham số và tối ưu hóa các tham số để thích ứng với tình trạng thị trường mới.

Nguy cơ thất bại của chỉ số kỹ thuật

Các chỉ số kỹ thuật như flags được sử dụng trong chiến lược để xác định giá phá vỡ. Những chỉ số kỹ thuật này có thể không có hiệu lực khi xu hướng thị trường và mô hình biến động thay đổi đáng kể.

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

Tăng khả năng đánh giá xu hướng

Bạn có thể thêm các chỉ số đánh giá xu hướng thường được sử dụng trong chiến lược, chẳng hạn như MA, MACD, v.v.

Phân tích nhiều khung thời gian

Các chỉ số kỹ thuật của khung thời gian cấp cao có thể được đưa vào để đưa ra phán đoán tổng hợp. Ví dụ: vị trí đường MA ở cấp 86400 có thể xác định hướng đi tổng thể, xác nhận thêm tín hiệu hoạt động trên biểu đồ theo giờ.

Tối ưu hóa tham số động

Các tham số có thể được tự động tối ưu hóa dựa trên dữ liệu lịch sử thông qua các phương tiện như học máy và điều chỉnh các tham số theo thời gian thực để thích ứng với sự thay đổi của môi trường thị trường. Điều này có thể làm cho chiến lược trở nên thích ứng và ổn định hơn.

Tóm tắt

Chiến lược phá vỡ đá như đá tuân theo luật giao dịch phá vỡ đá cổ điển, với giá phá vỡ đầu vào và dừng lỗ theo dõi dừng lỗ, kiểm soát nghiêm ngặt rủi ro, có thể hoạt động ổn định lâu dài và có khả năng chống giảm giá xuất sắc. Mặc dù vẫn cần phải cảnh giác với một số rủi ro như phá vỡ thất bại, tham số thất bại, nhưng bằng cách đưa ra phán đoán xu hướng, phán đoán khung thời gian, tối ưu hóa tham số động, các phương tiện có thể làm giảm hiệu quả những rủi ro này, tăng đáng kể khả năng hoạt động ổn định của chiến lược. Nói chung, chiến lược có tính ổn định và khả năng chống giảm giá xuất sắc, đáng tin cậy và đáng tin cậy.

Mã nguồn 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)