Fibonacci Retracement Chiến lược dừng lỗ động

Tác giả:ChaoZhang, Ngày: 2024-02-06 14:33:06
Tags:

img

Tổng quan

Chiến lược này sử dụng các mức khôi phục Fibonacci để tự động thiết lập dừng lỗ và lấy giá lợi nhuận để quản lý vị trí. Nó cho phép lái xu hướng để có lợi nhuận lớn hơn trong khi giảm thiểu tổn thất trong quá trình hợp nhất.

Chiến lược logic

Cốt lõi của chiến lược này dựa trên chỉ số hồi quy Fibonacci để xác định các mức hỗ trợ và kháng cự chính. Nó theo dõi mức cao và thấp gần đây để vẽ 10 vùng giá Fibonacci. Dựa trên cấu hình, một trong các mức Fibonacci được chọn làm kích hoạt nhập cảnh. Khi giá vượt qua mức đó, một lệnh dài sẽ được đặt dựa trên đòn bẩy được cấu hình. Đồng thời, giá lấy lợi nhuận được đặt ở một tỷ lệ phần trăm nhất định trên giá nhập cảnh.

Sau khi nhập vào, chiến lược tiếp tục theo dõi các mức Fibonacci được cập nhật. Nếu một mức Fib thấp hơn xuất hiện, cho thấy khả năng đảo ngược, chiến lược sẽ hủy các lệnh hiện có và đặt lại các lệnh ở mức giá thấp hơn như một cơ chế dừng lỗ. Khi giá cuối cùng vượt quá giá lấy lợi nhuận, vị trí sẽ được đóng lại để kiếm lợi nhuận.

Ưu điểm

Ưu điểm lớn nhất của chiến lược này là khả năng điều chỉnh stop loss và lấy giá lợi nhuận cho các thị trường xu hướng.

  1. Lấy lợi nhuận lớn hơn trong điều kiện xu hướng bằng cách dừng lại dựa trên giá nhập cảnh.

  2. Giảm thiểu tổn thất trong việc củng cố bằng cách dừng lại ở mức Fib thấp hơn.

  3. Cho phép kim tự tháp bằng cách thêm vào vị trí khi giá giảm một tỷ lệ nhất định từ giá nhập khẩu cuối cùng.

  4. Dễ dàng vận hành với đặt hàng tự động một khi được cấu hình chính xác.

Rủi ro

Vẫn có một số rủi ro cần lưu ý:

  1. Có xu hướng dừng lại lặp đi lặp lại trong các thị trường bên, tăng phí.

  2. Không có cơ chế dừng lỗ cố định, có nguy cơ rút tiền lớn.

  3. Việc xây dựng kim tự tháp không giới hạn có thể làm trầm trọng thêm tổn thất.

Các giải pháp tương ứng:

  1. Ngưng giao dịch khi giá dao động trong phạm vi.

  2. Quản lý thị trường và đóng các vị trí nếu cần thiết.

  3. Đặt giới hạn cho các mệnh lệnh kim tự tháp.

Cơ hội gia tăng

Vẫn còn nhiều chỗ để tối ưu hóa:

  1. Thêm các chỉ số bổ sung như EMA, MACD để xác nhận nhập thêm để tránh đột phá sai.

  2. Kết hợp các cơ chế dừng lỗ cố định / kéo theo để hạn chế tổn thất trong điều kiện cực đoan.

  3. Cải thiện logic kim tự tháp dựa trên các chế độ thị trường để ngăn chặn đòn bẩy quá mức.

  4. Sử dụng các mô hình học máy như LSTM để dự đoán giá và xác định tốt hơn việc nhập / ra.

Kết luận

Tóm lại, chiến lược này phù hợp với các kịch bản xu hướng phai mờ. Bằng cách điều chỉnh liên tục dừng lại nó cho phép đi xe xu hướng hiệu quả. Tối ưu hóa thích hợp và đường ray bảo vệ cần thiết để xử lý các điều kiện thị trường khó khăn hơn.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 00:00:00
period: 1h
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/
// © CryptoRox

//@version=4
//Paste the line below in your alerts to run the built-in commands.
//{{strategy.order.alert_message}}
strategy(title="Fibs limit only", shorttitle="Strategy", overlay=true, precision=8, pyramiding=1000, commission_type=strategy.commission.percent, commission_value=0.04)

//Settings 
testing = input(false, "Live")
//Use epochconverter or something similar to get the current timestamp.
starttime = input(1600976975, "Start Timestamp") * 1000
//Wait XX seconds from that timestamp before the strategy starts looking for an entry.
seconds = input(60, "Start Delay") * 1000
testPeriod = true


leverage = input(1, "Leverage")
tp = input(1.0, "Take Profit %") / leverage
dca = input(-1.0, "DCA when < %") / leverage *-1
fibEntry = input("1", "Entry Level", options=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"])

//Strategy Calls
equity = strategy.equity
avg = strategy.position_avg_price
symbol = syminfo.tickerid
openTrades = strategy.opentrades
closedTrades = strategy.closedtrades
size = strategy.position_size

//Fibs
lentt = input(60, "Pivot Length")
h = highest(lentt)
h1 = dev(h, lentt) ? na : h
hpivot = fixnan(h1)
l = lowest(lentt)
l1 = dev(l, lentt) ? na : l
lpivot = fixnan(l1)
z = 400
p_offset= 2
transp = 60
a=(lowest(z)+highest(z))/2
b=lowest(z)
c=highest(z)

fib0 = (((hpivot - lpivot)) + lpivot)
fib1 = (((hpivot - lpivot)*.21) + lpivot)
fib2 = (((hpivot - lpivot)*.3) + lpivot)
fib3 = (((hpivot - lpivot)*.5) + lpivot)
fib4 = (((hpivot - lpivot)*.62) + lpivot)
fib5 = (((hpivot - lpivot)*.7) + lpivot)
fib6 = (((hpivot - lpivot)* 1.00) + lpivot)
fib7 = (((hpivot - lpivot)* 1.27) + lpivot)
fib8 = (((hpivot - lpivot)* 2) + lpivot)
fib9 = (((hpivot - lpivot)* -.27) + lpivot)
fib10 = (((hpivot - lpivot)* -1) + lpivot)

notna = nz(fib10[60])
entry = 0.0
if fibEntry == "1"
    entry := fib10
if fibEntry == "2"
    entry := fib9
if fibEntry == "3"
    entry := fib0
if fibEntry == "4"
    entry := fib1
if fibEntry == "5"
    entry := fib2
if fibEntry == "6"
    entry := fib3
if fibEntry == "7"
    entry := fib4
if fibEntry == "8"
    entry := fib5
if fibEntry == "9"
    entry := fib6
if fibEntry == "10"
    entry := fib7
profit = avg+avg*(tp/100)
pause = 0
pause := nz(pause[1])
paused = time < pause

fill = 0.0
fill := nz(fill[1])
count = 0.0
count := nz(fill[1])

filled = count > 0 ? entry > fill-fill/100*dca : 0
signal = testPeriod and notna and not paused and not filled ? 1 : 0

neworder = crossover(signal, signal[1])
moveorder = entry != entry[1] and signal and not neworder ? true : false
cancelorder = crossunder(signal, signal[1]) and not paused
filledorder = crossunder(low[1], entry[1]) and signal[1]

last_profit = 0.0
last_profit := nz(last_profit[1])

if neworder and signal
    strategy.order("New", 1, 0.0001, alert_message='New Order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry)) 
if moveorder
    strategy.order("Move", 1, 0.0001, alert_message='Move Order|e=binancefuturestestnet s=btcusdt b=long c=order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry))
if filledorder and size < 1
    fill := entry
    count := count+1 
    pause := time + 60000
    p = close+close*(tp/100)
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(p))
if filledorder and size >= 1
    fill := entry
    count := count+1 
    pause := time + 60000
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(profit))

if cancelorder and not filledorder
    pause := time + 60000
    strategy.order("Cancel", 1, 0.0001,  alert_message='Cancel Order|e=binancefuturestestnet s=btcusdt b=long c=order')

if filledorder
    last_profit := profit

closeit = crossover(high, profit) and size >= 1
if closeit
    strategy.entry("Close ALL", 0, 0, alert_message='Profit')
    count := 0
    fill := 0.0
    last_profit := 0.0
    
//Plots
bottom = signal ? color.green : filled ? color.red : color.white
plot(entry, "Entry", bottom)

Thêm nữa