Robot White Box Iceberg Chiến lược

Tác giả:ChaoZhang, Ngày: 2023-09-26 21:02:21
Tags:

Tổng quan

Chiến lược này dựa trên giao dịch trung bình động. Nó thiết lập ba cấp của các dòng đầu vào dài và ngắn để thực hiện các vị trí mở hai hướng, thuộc về chiến lược theo xu hướng. Khi giá vượt qua đường trung bình động, chiến lược mở các vị trí dài và ngắn theo lô bằng cách đặt các lệnh đang chờ.

Chiến lược logic

Chiến lược này chủ yếu sử dụng sự đột phá của đường trung bình động để xác định hướng xu hướng. Cụ thể, nó tính toán trung bình số học của giá mở, giá đóng, giá cao nhất, giá thấp nhất và vân vân để có được chỉ số đường trung bình động. Sau đó nó thiết lập các đường nhập dài trên đường trung bình động và các đường nhập ngắn bên dưới. Khi giá vượt qua đường trung bình động từ dưới, các lệnh dài được kích hoạt một lần một. Khi giá vượt qua từ trên, các lệnh ngắn được kích hoạt một lần một.

Số lượng lệnh dài và ngắn tăng dần. Bằng cách thiết lập các lệnh đang chờ, nó thực hiện các vị trí mở hàng loạt. Ví dụ, dòng đầu vào 1 kích hoạt việc mở 1 hợp đồng dài / ngắn, dòng đầu vào 2 kích hoạt thêm 1 hợp đồng và dòng đầu vào 3 thêm 1 hợp đồng khác. Điều này giúp đa dạng hóa chi phí đầu vào và giảm rủi ro của một đơn đặt hàng.

Chiến lược này cũng có một cơ chế phòng ngừa rủi ro. Khi kích thước vị trí không bằng 0, nó sẽ đặt lệnh dừng lỗ theo sau dựa trên giá trung bình động. Nếu giá phá vỡ trung bình động một lần nữa, nó sẽ đóng vị trí để khóa lợi nhuận một phần và bảo vệ vốn.

Tóm lại, chiến lược này sử dụng đầy đủ chỉ số trung bình động để xác định hướng xu hướng, tối đa hóa phạm vi lợi nhuận thông qua nhiều dòng nhập cảnh và kiểm soát rủi ro bằng lệnh dừng lỗ.

Phân tích lợi thế

Những lợi thế của chiến lược này là:

  1. Sử dụng trung bình động để xác định hướng xu hướng là rõ ràng và khả thi.

  2. Với nhiều đường nhập, nó có thể nắm bắt toàn bộ phạm vi chạy của xu hướng càng nhiều càng tốt và mở rộng không gian lợi nhuận.

  3. Mở các vị trí theo lô làm giảm rủi ro đơn đặt hàng. Nhập thị trường nhiều lần đa dạng hóa rủi ro của các lệnh và giảm chi phí nắm giữ trung bình.

  4. Cơ chế phòng ngừa dừng lỗ có hiệu quả kiểm soát rủi ro. Trật tự phòng ngừa dừng lỗ nhận ra lỗ dừng nhanh khi giá phá vỡ đường trung bình động một lần nữa, tránh mất mát lớn.

  5. Logic chiến lược là rõ ràng và dễ hiểu, với các thiết lập tham số linh hoạt có thể được tối ưu hóa cho các thị trường khác nhau.

Phân tích rủi ro

Có một số rủi ro trong chiến lược này:

  1. Khả năng tín hiệu sai từ trung bình động.

  2. Rủi ro đảo ngược xu hướng dẫn đến tổn thất. Chiến lược giả định một xu hướng, vì vậy việc đảo ngược xu hướng có thể dẫn đến tổn thất lớn.

  3. Các dòng nhập quá thường xuyên làm tăng tần suất giao dịch và chi phí trượt.

  4. Các vị trí mở lô làm tăng nguy cơ tập trung khi kích thước vị trí quá lớn.

  5. Cài đặt điểm dừng lỗ không chính xác có thể dẫn đến dừng lỗ sớm hoặc điểm dừng lỗ quá nhỏ.

Các biện pháp quản lý rủi ro tương ứng:

  1. Tối ưu hóa các thông số trung bình động và chọn các khoảng thời gian thích hợp.

  2. Chú ý đến các chỉ số kỹ thuật chính để phát hiện các tín hiệu đảo ngược xu hướng và dừng lỗ kịp thời.

  3. Điều chỉnh khoảng cách giữa các đường nhập để giảm tần suất giao dịch.

  4. Tối ưu hóa kích thước vị trí và tỷ lệ để kiểm soát rủi ro nồng độ.

  5. Kiểm tra lại và tối ưu hóa các điểm dừng lỗ để giảm rủi ro dừng lỗ.

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

Chiến lược có thể được tối ưu hóa từ các khía cạnh sau:

  1. Kiểm tra các tham số và nguồn dữ liệu trung bình động khác nhau để tìm chỉ số trung bình động hiệu suất tốt nhất để xác định xu hướng.

  2. Tối ưu hóa khoảng cách khoảng cách và tỷ lệ kích thước vị trí của các đường nhập dài và ngắn để tìm các thông số tối ưu.

  3. Thêm các chỉ số khác làm điều kiện lọc để tránh các tín hiệu sai từ đường trung bình động, chẳng hạn như MACD, RSI v.v.

  4. Tối ưu hóa vị trí đường stop loss, hoặc thiết lập các điểm stop loss dựa trên ATR.

  5. Thêm phán đoán của xu hướng đảo ngược để thiết lập đóng tất cả các điều kiện vị trí.

  6. Tối ưu hóa các thông số cho các giai đoạn thị trường khác nhau.

  7. Thêm điều chỉnh động kích thước vị trí dựa trên tỷ lệ sử dụng tài khoản.

Tóm lại

Chiến lược này đánh giá hướng xu hướng chủ yếu dựa trên đường trung bình động, và tận dụng xu hướng chạy như là nguồn lợi nhuận. Bằng cách sử dụng nhiều đường nhập và mở các vị trí theo lô, nó có thể nắm bắt hiệu quả xu hướng và mở rộng vùng lợi nhuận. Đồng thời, các cơ chế dừng lỗ được sử dụng để kiểm soát rủi ro. Logic chiến lược đơn giản và rõ ràng, phù hợp cho người mới bắt đầu học, và cũng cho tối ưu hóa sâu.


/*backtest
start: 2022-09-19 00:00:00
end: 2023-09-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox Iceberg", shorttitle = "Robot WhiteBox Iceberg", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
lots = 0.0
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = true

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = 0.0
longline2 = 0.0
longline3 = 0.0
shortline1 = 0.0
shortline2 = 0.0
shortline3 = 0.0
longline1 := long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 := lots[1] == 0 ? long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close : longline2[1]
longline3 := lots[1] == 0 ? long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close : longline3[1]
shortline1 := short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 := lots[1] == 0 ? short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close : shortline2[1]
shortline3 := lots[1] == 0 ? short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close : shortline3[1]

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma, when = needtime)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma, when = needtime)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("L1")
    strategy.cancel("L2")
    strategy.cancel("L3")
    strategy.cancel("S1")
    strategy.cancel("S2")
    strategy.cancel("S3")
    strategy.cancel("TPL")
    strategy.cancel("TPS")

Thêm nữa