Chiến lược hấp thụ vàng Ichimoku Kumo Twist là một chiến lược giao dịch định lượng kết hợp chỉ số kỹ thuật thị trường Ichimoku và lọc phạm vi. Nó sử dụng chỉ số Ichimoku để xác định xu hướng thị trường và mức hỗ trợ và kháng cự quan trọng, cùng với các mẫu nến để tạo ra tín hiệu giao dịch. Trong khi đó, lọc phạm vi giúp kiểm soát tần suất giao dịch và rủi ro.
Chiến lược này chủ yếu dựa trên chỉ số Ichimoku và các mô hình nến để đánh giá xu hướng thị trường. Ichimoku chứa đường chuyển đổi, đường cơ sở và đường mây, mối quan hệ chéo chéo của chúng chỉ ra xu hướng thị trường. Các đường mây cũng đóng vai trò là mức hỗ trợ và kháng cự. Chiến lược thiết lập các kết hợp tham số khác nhau để điều chỉnh độ nhạy của các đường Ichimoku. Ngoài ra, chiến lược xác định các mô hình và tạo ra tín hiệu mua khi đường chuyển đổi vượt qua trên đường cơ sở, và bán tín hiệu khi vượt qua bên dưới.
Ngoài ra, chiến lược có bộ lọc phạm vi ngày được thiết lập, do đó nó chỉ giao dịch trong phạm vi ngày được chỉ định. Điều này kiểm soát tần suất giao dịch. Ngoài ra, cài đặt dừng lỗ giúp giảm rủi ro bằng cách dừng lỗ khi giá chạy theo hướng không thuận lợi.
Các phương pháp như điều chỉnh các thông số Ichimoku, tối ưu hóa phạm vi ngày, sửa đổi điểm dừng lỗ có thể cải thiện và kiểm soát rủi ro.
Ichimoku Kumo Twist Gold-Absorbing Strategy tích hợp chỉ số Ichimoku, nhận dạng mô hình nến, lọc phạm vi để xác định xu hướng thị trường. Nó có thể nắm bắt hướng xu hướng khá rõ ràng. Thông qua các phương tiện như điều chỉnh tham số, kiểm soát rủi ro vv, có thể đạt được hiệu suất chiến lược tốt. Nhưng vấn đề tụt lại của Ichimoku nên được lưu ý và điều chỉnh tối ưu hóa liên tục.
/*backtest start: 2023-11-20 00:00:00 end: 2023-11-27 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="Ichimoku Kumo Twist Strategy (Presets)", shorttitle="Kumo Twist Strategy", overlay=true) xlowest_(src, len) => x = src for i = 1 to len - 1 v = src[i] if (na(v)) break x := min(x, v) x xlowest(src, len) => na(src[len]) ? xlowest_(src, len) : lowest(src, len) xhighest_(src, len) => x = src for i = 1 to len - 1 v = src[i] if (na(v)) break x := max(x, v) x xhighest(src, len) => na(src[len]) ? xhighest_(src, len) : highest(src, len) dropn(src, n) => na(src[n]) ? na : src ichiConversionPeriods(presets) => if presets == "Cpt 20 60 120 30" 20 else if presets == "Cpt 10 30 60 30" 10 else if presets == "Std 18 52 104 26" 18 else 9 ichiBasePeriods(presets) => if presets == "Cpt 20 60 120 30" 60 else if presets == "Cpt 10 30 60 30" 30 else if presets == "Std 18 52 104 26" 52 else 26 ichiLaggingSpan2Periods(presets) => if presets == "Cpt 20 60 120 30" 120 else if presets == "Cpt 10 30 60 30" 60 else if presets == "Std 18 52 104 26" 104 else 52 ichiDisplacement(presets) => if presets == "Cpt 20 60 120 30" 30 else if presets == "Cpt 10 30 60 30" 30 else if presets == "Std 18 52 104 26" 26 else 26 scaling = input(title="Scaling", options=["Linear", "Log"], defval="Linear") presets = input(title="Presets", options=["Cpt 20 60 120 30", "Cpt 10 30 60 30", "Std 18 52 104 26", "Std 9 26 52 26"], defval="Cpt 20 60 120 30") dropCandles = input(1, minval=0, title="Drop first N candles") showClouds = input(false, "Show Clouds") stoploss = input(true, title="Stop Loss") conversionPeriods = ichiConversionPeriods(presets) basePeriods = ichiBasePeriods(presets) laggingSpan2Periods = ichiLaggingSpan2Periods(presets) displacement = ichiDisplacement(presets) logScaling = scaling == "Log" lows = dropn(low, dropCandles) highs = dropn(high, dropCandles) lowsp = logScaling ? log(lows) : lows highsp = logScaling ? log(highs) : highs donchian(len) => avg(xlowest(lowsp, len), xhighest(highsp, len)) conversionLine = donchian(conversionPeriods) baseLine = donchian(basePeriods) leadLine1 = avg(conversionLine, baseLine) leadLine2 = donchian(laggingSpan2Periods) // === BACKTEST RANGE === FromMonth = input(defval = 10, title = "From Month", minval = 1) FromDay = input(defval = 3, title = "From Day", minval = 1) FromYear = input(defval = 2017, title = "From Year", minval = 2014) ToMonth = input(defval = 1, title = "To Month", minval = 1) ToDay = input(defval = 1, title = "To Day", minval = 1) ToYear = input(defval = 9999, title = "To Year", minval = 2014) golong = crossover(leadLine1, leadLine2) goshort = crossunder(leadLine1, leadLine2) strategy.entry("Buy", strategy.long, when=(golong and (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59)))) strategy.entry("Sell", strategy.short, when=(goshort and (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59)))) conversionLinep = logScaling ? exp(conversionLine) : conversionLine baseLinep = logScaling ? exp(baseLine) : baseLine leadLine1p = logScaling ? exp(leadLine1) : leadLine1 leadLine2p = logScaling ? exp(leadLine2) : leadLine2 plot(showClouds ? conversionLinep : na, color=#0496ff, title="Conversion Line") plot(showClouds ? baseLinep : na, color=#991515, title="Base Line") p1 = plot(showClouds ? leadLine1p : na, offset = displacement, color=green, title="Lead 1") p2 = plot(showClouds ? leadLine2p : na, offset = displacement, color=red, title="Lead 2") fill(p1, p2, color = showClouds ? (leadLine1p > leadLine2p ? green : red) : na)