
Strategi ini merupakan strategi pelacakan tren yang menggabungkan konfigurasi indikator Ichimoku Cloud untuk menilai kekuatan multi-area pasar untuk menemukan peluang terobosan potensial. Komponen kunci termasuk kerangka penilaian berbasis Ichimoku Cloud, ATR stop loss, persentase stop loss, dan mekanisme stop loss yang dapat dipilih.
Strategi penilaian inti terdiri dari dua bagian, satu adalah sinyal tren dari kekuatan overhead pasar berdasarkan indikator awan Ichimoku, dan satu adalah sinyal kekuatan berdasarkan potensi terobosan.
Untuk menilai tren, kita harus memenuhi persyaratan seperti: Conversion Line yang melewati Base Line yang menunjukkan pembentukan tren multihead, Lagging Span yang lebih tinggi dari entitas K-line yang menunjukkan kekuatan multihead saat ini, harga yang lebih tinggi dari harga tertinggi di awan yang menunjukkan terobosan di atas rel.
Untuk sinyal yang kuat, harus memenuhi persyaratan yang sama seperti harga yang lebih tinggi dari harga tertinggi terendah di awan yang menunjukkan kekuatan super kuat, Conversion Line dan Base Line yang sama dengan multihead yang menunjukkan kekuatan penuh.
Ketika kondisi dari kedua jenis ini terjadi, maka Anda dapat melakukan trading dengan harga pasar saja. Setelah itu, Anda dapat mengatur stop loss tracking berdasarkan ATR, persentase, atau Ichimoku Cloud Indicator untuk lebih mengunci keuntungan.
Keuntungan terbesar dari strategi ini adalah bahwa pada saat yang sama memanfaatkan Ichimoku Cloud untuk menilai tren dan kekuatan multi-lapangan. Dibandingkan dengan indikator seperti rata-rata bergerak tunggal, Ichimoku Cloud lebih dapat mencerminkan kekuatan yang berbeda dari situasi saat ini, sehingga meningkatkan akurasi sinyal.
Selain itu, kombinasi ATR dan persentase stop loss untuk mengelola risiko, dapat mengontrol kerugian perorangan dengan baik. Selain itu, mekanisme stop loss yang dapat dipilih juga membuat keuntungan strategi lebih stabil.
Risiko utama dari strategi ini adalah bahwa Ichimoku Cloud sendiri memiliki keterbelakangan. Selain itu, sinyal yang kuat sebagai ciri dari pengejaran, juga dapat meningkatkan probabilitas dari strategi yang terpaku.
Untuk mengurangi risiko yang disebabkan oleh masalah lag, siklus parameter dari Awan Ichimoku dapat dipersingkat secara tepat; Untuk risiko yang disebabkan oleh sinyal kuat, perlu meningkatkan pengaturan pengintaian kerusakan untuk mengatasinya.
Strategi ini dapat dioptimalkan lebih lanjut dengan cara berikut:
Uji coba data dari berbagai pasar untuk menilai kekuatan dan adaptasi strategi
Mengoptimalkan parameter Ichimoku Cloud agar lebih sesuai dengan situasi pasar tertentu
Cobalah algoritma pembelajaran mendalam seperti LSTM untuk membantu menentukan kekuatan sinyal penembusan
Menambahkan Indikator Tenaga Kuantitatif untuk Menghindari Probabilitas Penembakan
Strategi ini mengintegrasikan kekuatan pasar yang lebih luas dengan menggunakan konfigurasi dari Ichimoku Cloud, dan juga mempertimbangkan manajemen risiko sambil menangkap tren potensial. Strategi ini secara efektif menyeimbangkan keuntungan dan kontrol yang dapat dikendalikan.
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 3h
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/
// © mikul_se
//@version=5
strategy("mikul's Ichimoku Cloud Strategy v 2.0", shorttitle="mikul's Ichi strat", overlay=true, margin_long=100, margin_short=100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
// Strategy settings
strategySettingsGroup = "Strategy settings"
trailSource = input.string(title="Trail Source", defval="Lows/Highs", options=["Lows/Highs", "Close", "Open"], confirm=true, group=strategySettingsGroup)
trailMethod = input.string(title="Trail Method", defval="ATR", options=["ATR", "Percent", "Ichi exit"], confirm=true, tooltip="Ichi rules means it follows the rules of the Ichimoku cloud for exiting the trade.", group=strategySettingsGroup)
trailPercent = input.float(title="Trail Percent", defval=10, minval=0.1, confirm=true, group=strategySettingsGroup)
swingLookback = input.int(title="Lookback", defval=7, confirm=true, group=strategySettingsGroup)
atrPeriod = input.int(title="ATR Period", defval=14, confirm=true, group=strategySettingsGroup)
atrMultiplier = input.float(title="ATR Multiplier", defval=1.0, confirm=true, group=strategySettingsGroup)
addIchiExit = input.bool(false, "Add Ichimoku exit", "You can use this to add Ichimoku cloud exit signals on top of Percent or ATR", group=strategySettingsGroup)
useTakeProfit = input.bool(false, "Use Take Profit", confirm=true, group=strategySettingsGroup)
takeProfitPercent = input.float(title="Take Profit Percentage", defval=5, minval=0.1, confirm=true, group=strategySettingsGroup)
// Ichimoku settings
ichimokuSettingsGroup = "Ichimoku settings"
conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group=ichimokuSettingsGroup)
basePeriods = input.int(26, minval=1, title="Base Line Length", group=ichimokuSettingsGroup)
laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group=ichimokuSettingsGroup)
displacement = input.int(26, minval=1, title="Lagging Span", group=ichimokuSettingsGroup)
delta = input.int(26, minval=1, title="Delta", group=ichimokuSettingsGroup)
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = math.avg(conversionLine, baseLine)
leadLine2 = donchian(laggingSpan2Periods)
uppercloud = leadLine1[displacement-1]
bottomcloud = leadLine2[displacement-1]
// Ichi exit variables and calculations
delta2 = delta-3
average(len) => math.avg(ta.lowest(len), ta.highest(len))
conversion_line = average(conversionPeriods)
base_line = average(basePeriods)
lead_line_a = math.avg(conversion_line, base_line)
lead_line_b = average(laggingSpan2Periods)
lagging_span = close
lead_line_a_delta = lead_line_a[delta]
lead_line_b_delta = lead_line_b[delta]
lagging_span_delta = lagging_span[delta]
prisgris = hlc3[delta]
prisgris2 = hlc3[delta2]
// Declare trailing price variable (stores our trail stop value)
var float trailPrice = na
float next_trailPrice = na
// Get required trailing stop variables
atrValue = ta.atr(atrPeriod) * atrMultiplier
swingLow = ta.lowest(low, swingLookback)
swingHigh = ta.highest(high, swingLookback)
// Ichi plotting
plot(conversionLine, color=#2962FF, title="Conversion Line")
plot(baseLine, color=#B71C1C, title="Base Line")
plot(close, offset=-displacement + 1, color=#43A047, title="Lagging Span")
p1 = plot(leadLine1, offset=displacement - 1, color=#A5D6A7, title="Leading Span A")
p2 = plot(leadLine2, offset=displacement - 1, color=#EF9A9A, title="Leading Span B")
fill(p1, p2, color=leadLine1 > leadLine2 ? color.rgb(67, 160, 71, 90) : color.rgb(244, 67, 54, 90))
// Plotting ichi crossover signals
ichiup = ta.crossover(conversionLine, baseLine)
ichidown = ta.crossover(baseLine, conversionLine)
plotshape(ichiup ? conversionLine : na, 'Ichi long 1', style=shape.circle, location=location.absolute, offset=0, color=#00ff00b0, size=size.tiny)
plotshape(ichidown ? conversionLine : na, 'Ichi short 1', style=shape.circle, location=location.absolute, offset=0, color=#ff1100c7, size=size.tiny)
// Pamp signal
signal5 = close > bottomcloud[displacement] and close > uppercloud[displacement] and close > high[displacement]
signal5b = close[1] <= bottomcloud[displacement+1] or close[1] <= uppercloud[displacement+1] or close <= high[displacement+1]
signal6 = close > bottomcloud and close > uppercloud and close > open
signal6b = close[1] <= bottomcloud[1] or close[1] <= uppercloud[1]
signal7 = leadLine1 > leadLine2
signal7b = leadLine1[1] <= leadLine2[1]
signal8 = conversionLine > baseLine
pamp = signal5 and signal6 and signal7 and signal8 and strategy.position_size == 0 and (signal5b or signal6b or signal7b)
// Trend signal
nsignal5 = close > close[displacement]
nsignal6 = close > bottomcloud and close > uppercloud and close > open
nsignal8 = ta.crossover(conversionLine, baseLine) and conversionLine > bottomcloud and conversionLine > uppercloud and baseLine > bottomcloud and baseLine > uppercloud
trend = nsignal5 and nsignal6 and nsignal8 and strategy.position_size == 0
plotshape(trend, style=shape.triangleup, location=location.belowbar, color=color.green)
if (trend or pamp)
trailPrice := na
strategy.entry(trend ? "Trend" : "Pamp", direction = strategy.long)
// Get trailing stop price
if trailMethod == "ATR"
next_trailPrice := switch trailSource
"Close" => strategy.position_size > 0 ? close - atrValue : close + atrValue
"Open" => strategy.position_size > 0 ? open - atrValue : open + atrValue
=> strategy.position_size > 0 ? swingLow - atrValue : swingHigh + atrValue
else if trailMethod == "Percent"
float percentMulti = strategy.position_size > 0 ? (100 - trailPercent) / 100 : (100 + trailPercent) / 100
next_trailPrice := switch trailSource
"Close" => close * percentMulti
"Open" => open * percentMulti
=> strategy.position_size > 0 ? swingLow * percentMulti : swingHigh * percentMulti
else
short_signal = (ta.crossunder(lagging_span, prisgris)) or ta.crossover(base_line, conversion_line) and ((close)) < ((lead_line_a)) or ta.crossunder(lagging_span, prisgris) or (ta.crossover(base_line, conversion_line) and ((lagging_span) < (lead_line_a)) and ((lagging_span) < (lead_line_b)))
if short_signal
strategy.close("Trend", "Ichi trend over")
strategy.close("Pamp", "Ichi pamp over")
alert("Sell")
if (addIchiExit)
short_signal = (ta.crossunder(lagging_span, prisgris)) or ta.crossover(base_line, conversion_line) and ((close)) < ((lead_line_a)) or ta.crossunder(lagging_span, prisgris) or (ta.crossover(base_line, conversion_line) and ((lagging_span) < (lead_line_a)) and ((lagging_span) < (lead_line_b)))
if short_signal
strategy.close("Trend", "Ichi trend over")
strategy.close("Pamp", "Ichi pamp over")
alert("Sell")
// Check for trailing stop update
if strategy.position_size != 0 and barstate.isconfirmed
if (next_trailPrice > trailPrice or na(trailPrice)) and strategy.position_size > 0
trailPrice := next_trailPrice
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)
if (next_trailPrice < trailPrice or na(trailPrice)) and strategy.position_size < 0
trailPrice := next_trailPrice
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)
// Draw data to chart
plot(strategy.position_size != 0 ? trailPrice : na, color=color.red, title="Trailing Stop")
// Take Profit
float profitTarget = strategy.position_avg_price * (1 + takeProfitPercent / 100)
// Exit trade if stop is hit
strategy.exit(id="trend Exit", from_entry="Trend", stop=trailPrice, limit=useTakeProfit ? profitTarget : na)
strategy.exit(id="pamp Exit", from_entry="Pamp", stop=trailPrice, limit=useTakeProfit ? profitTarget : na)
if strategy.position_size == 0
trailPrice = 0